stm32bt6702.lss 3.2 MB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457945894599460946194629463946494659466946794689469947094719472947394749475947694779478947994809481948294839484948594869487948894899490949194929493949494959496949794989499950095019502950395049505950695079508950995109511951295139514951595169517951895199520952195229523952495259526952795289529953095319532953395349535953695379538953995409541954295439544954595469547954895499550955195529553955495559556955795589559956095619562956395649565956695679568956995709571957295739574957595769577957895799580958195829583958495859586958795889589959095919592959395949595959695979598959996009601960296039604960596069607960896099610961196129613961496159616961796189619962096219622962396249625962696279628962996309631963296339634963596369637963896399640964196429643964496459646964796489649965096519652965396549655965696579658965996609661966296639664966596669667966896699670967196729673967496759676967796789679968096819682968396849685968696879688968996909691969296939694969596969697969896999700970197029703970497059706970797089709971097119712971397149715971697179718971997209721972297239724972597269727972897299730973197329733973497359736973797389739974097419742974397449745974697479748974997509751975297539754975597569757975897599760976197629763976497659766976797689769977097719772977397749775977697779778977997809781978297839784978597869787978897899790979197929793979497959796979797989799980098019802980398049805980698079808980998109811981298139814981598169817981898199820982198229823982498259826982798289829983098319832983398349835983698379838983998409841984298439844984598469847984898499850985198529853985498559856985798589859986098619862986398649865986698679868986998709871987298739874987598769877987898799880988198829883988498859886988798889889989098919892989398949895989698979898989999009901990299039904990599069907990899099910991199129913991499159916991799189919992099219922992399249925992699279928992999309931993299339934993599369937993899399940994199429943994499459946994799489949995099519952995399549955995699579958995999609961996299639964996599669967996899699970997199729973997499759976997799789979998099819982998399849985998699879988998999909991999299939994999599969997999899991000010001100021000310004100051000610007100081000910010100111001210013100141001510016100171001810019100201002110022100231002410025100261002710028100291003010031100321003310034100351003610037100381003910040100411004210043100441004510046100471004810049100501005110052100531005410055100561005710058100591006010061100621006310064100651006610067100681006910070100711007210073100741007510076100771007810079100801008110082100831008410085100861008710088100891009010091100921009310094100951009610097100981009910100101011010210103101041010510106101071010810109101101011110112101131011410115101161011710118101191012010121101221012310124101251012610127101281012910130101311013210133101341013510136101371013810139101401014110142101431014410145101461014710148101491015010151101521015310154101551015610157101581015910160101611016210163101641016510166101671016810169101701017110172101731017410175101761017710178101791018010181101821018310184101851018610187101881018910190101911019210193101941019510196101971019810199102001020110202102031020410205102061020710208102091021010211102121021310214102151021610217102181021910220102211022210223102241022510226102271022810229102301023110232102331023410235102361023710238102391024010241102421024310244102451024610247102481024910250102511025210253102541025510256102571025810259102601026110262102631026410265102661026710268102691027010271102721027310274102751027610277102781027910280102811028210283102841028510286102871028810289102901029110292102931029410295102961029710298102991030010301103021030310304103051030610307103081030910310103111031210313103141031510316103171031810319103201032110322103231032410325103261032710328103291033010331103321033310334103351033610337103381033910340103411034210343103441034510346103471034810349103501035110352103531035410355103561035710358103591036010361103621036310364103651036610367103681036910370103711037210373103741037510376103771037810379103801038110382103831038410385103861038710388103891039010391103921039310394103951039610397103981039910400104011040210403104041040510406104071040810409104101041110412104131041410415104161041710418104191042010421104221042310424104251042610427104281042910430104311043210433104341043510436104371043810439104401044110442104431044410445104461044710448104491045010451104521045310454104551045610457104581045910460104611046210463104641046510466104671046810469104701047110472104731047410475104761047710478104791048010481104821048310484104851048610487104881048910490104911049210493104941049510496104971049810499105001050110502105031050410505105061050710508105091051010511105121051310514105151051610517105181051910520105211052210523105241052510526105271052810529105301053110532105331053410535105361053710538105391054010541105421054310544105451054610547105481054910550105511055210553105541055510556105571055810559105601056110562105631056410565105661056710568105691057010571105721057310574105751057610577105781057910580105811058210583105841058510586105871058810589105901059110592105931059410595105961059710598105991060010601106021060310604106051060610607106081060910610106111061210613106141061510616106171061810619106201062110622106231062410625106261062710628106291063010631106321063310634106351063610637106381063910640106411064210643106441064510646106471064810649106501065110652106531065410655106561065710658106591066010661106621066310664106651066610667106681066910670106711067210673106741067510676106771067810679106801068110682106831068410685106861068710688106891069010691106921069310694106951069610697106981069910700107011070210703107041070510706107071070810709107101071110712107131071410715107161071710718107191072010721107221072310724107251072610727107281072910730107311073210733107341073510736107371073810739107401074110742107431074410745107461074710748107491075010751107521075310754107551075610757107581075910760107611076210763107641076510766107671076810769107701077110772107731077410775107761077710778107791078010781107821078310784107851078610787107881078910790107911079210793107941079510796107971079810799108001080110802108031080410805108061080710808108091081010811108121081310814108151081610817108181081910820108211082210823108241082510826108271082810829108301083110832108331083410835108361083710838108391084010841108421084310844108451084610847108481084910850108511085210853108541085510856108571085810859108601086110862108631086410865108661086710868108691087010871108721087310874108751087610877108781087910880108811088210883108841088510886108871088810889108901089110892108931089410895108961089710898108991090010901109021090310904109051090610907109081090910910109111091210913109141091510916109171091810919109201092110922109231092410925109261092710928109291093010931109321093310934109351093610937109381093910940109411094210943109441094510946109471094810949109501095110952109531095410955109561095710958109591096010961109621096310964109651096610967109681096910970109711097210973109741097510976109771097810979109801098110982109831098410985109861098710988109891099010991109921099310994109951099610997109981099911000110011100211003110041100511006110071100811009110101101111012110131101411015110161101711018110191102011021110221102311024110251102611027110281102911030110311103211033110341103511036110371103811039110401104111042110431104411045110461104711048110491105011051110521105311054110551105611057110581105911060110611106211063110641106511066110671106811069110701107111072110731107411075110761107711078110791108011081110821108311084110851108611087110881108911090110911109211093110941109511096110971109811099111001110111102111031110411105111061110711108111091111011111111121111311114111151111611117111181111911120111211112211123111241112511126111271112811129111301113111132111331113411135111361113711138111391114011141111421114311144111451114611147111481114911150111511115211153111541115511156111571115811159111601116111162111631116411165111661116711168111691117011171111721117311174111751117611177111781117911180111811118211183111841118511186111871118811189111901119111192111931119411195111961119711198111991120011201112021120311204112051120611207112081120911210112111121211213112141121511216112171121811219112201122111222112231122411225112261122711228112291123011231112321123311234112351123611237112381123911240112411124211243112441124511246112471124811249112501125111252112531125411255112561125711258112591126011261112621126311264112651126611267112681126911270112711127211273112741127511276112771127811279112801128111282112831128411285112861128711288112891129011291112921129311294112951129611297112981129911300113011130211303113041130511306113071130811309113101131111312113131131411315113161131711318113191132011321113221132311324113251132611327113281132911330113311133211333113341133511336113371133811339113401134111342113431134411345113461134711348113491135011351113521135311354113551135611357113581135911360113611136211363113641136511366113671136811369113701137111372113731137411375113761137711378113791138011381113821138311384113851138611387113881138911390113911139211393113941139511396113971139811399114001140111402114031140411405114061140711408114091141011411114121141311414114151141611417114181141911420114211142211423114241142511426114271142811429114301143111432114331143411435114361143711438114391144011441114421144311444114451144611447114481144911450114511145211453114541145511456114571145811459114601146111462114631146411465114661146711468114691147011471114721147311474114751147611477114781147911480114811148211483114841148511486114871148811489114901149111492114931149411495114961149711498114991150011501115021150311504115051150611507115081150911510115111151211513115141151511516115171151811519115201152111522115231152411525115261152711528115291153011531115321153311534115351153611537115381153911540115411154211543115441154511546115471154811549115501155111552115531155411555115561155711558115591156011561115621156311564115651156611567115681156911570115711157211573115741157511576115771157811579115801158111582115831158411585115861158711588115891159011591115921159311594115951159611597115981159911600116011160211603116041160511606116071160811609116101161111612116131161411615116161161711618116191162011621116221162311624116251162611627116281162911630116311163211633116341163511636116371163811639116401164111642116431164411645116461164711648116491165011651116521165311654116551165611657116581165911660116611166211663116641166511666116671166811669116701167111672116731167411675116761167711678116791168011681116821168311684116851168611687116881168911690116911169211693116941169511696116971169811699117001170111702117031170411705117061170711708117091171011711117121171311714117151171611717117181171911720117211172211723117241172511726117271172811729117301173111732117331173411735117361173711738117391174011741117421174311744117451174611747117481174911750117511175211753117541175511756117571175811759117601176111762117631176411765117661176711768117691177011771117721177311774117751177611777117781177911780117811178211783117841178511786117871178811789117901179111792117931179411795117961179711798117991180011801118021180311804118051180611807118081180911810118111181211813118141181511816118171181811819118201182111822118231182411825118261182711828118291183011831118321183311834118351183611837118381183911840118411184211843118441184511846118471184811849118501185111852118531185411855118561185711858118591186011861118621186311864118651186611867118681186911870118711187211873118741187511876118771187811879118801188111882118831188411885118861188711888118891189011891118921189311894118951189611897118981189911900119011190211903119041190511906119071190811909119101191111912119131191411915119161191711918119191192011921119221192311924119251192611927119281192911930119311193211933119341193511936119371193811939119401194111942119431194411945119461194711948119491195011951119521195311954119551195611957119581195911960119611196211963119641196511966119671196811969119701197111972119731197411975119761197711978119791198011981119821198311984119851198611987119881198911990119911199211993119941199511996119971199811999120001200112002120031200412005120061200712008120091201012011120121201312014120151201612017120181201912020120211202212023120241202512026120271202812029120301203112032120331203412035120361203712038120391204012041120421204312044120451204612047120481204912050120511205212053120541205512056120571205812059120601206112062120631206412065120661206712068120691207012071120721207312074120751207612077120781207912080120811208212083120841208512086120871208812089120901209112092120931209412095120961209712098120991210012101121021210312104121051210612107121081210912110121111211212113121141211512116121171211812119121201212112122121231212412125121261212712128121291213012131121321213312134121351213612137121381213912140121411214212143121441214512146121471214812149121501215112152121531215412155121561215712158121591216012161121621216312164121651216612167121681216912170121711217212173121741217512176121771217812179121801218112182121831218412185121861218712188121891219012191121921219312194121951219612197121981219912200122011220212203122041220512206122071220812209122101221112212122131221412215122161221712218122191222012221122221222312224122251222612227122281222912230122311223212233122341223512236122371223812239122401224112242122431224412245122461224712248122491225012251122521225312254122551225612257122581225912260122611226212263122641226512266122671226812269122701227112272122731227412275122761227712278122791228012281122821228312284122851228612287122881228912290122911229212293122941229512296122971229812299123001230112302123031230412305123061230712308123091231012311123121231312314123151231612317123181231912320123211232212323123241232512326123271232812329123301233112332123331233412335123361233712338123391234012341123421234312344123451234612347123481234912350123511235212353123541235512356123571235812359123601236112362123631236412365123661236712368123691237012371123721237312374123751237612377123781237912380123811238212383123841238512386123871238812389123901239112392123931239412395123961239712398123991240012401124021240312404124051240612407124081240912410124111241212413124141241512416124171241812419124201242112422124231242412425124261242712428124291243012431124321243312434124351243612437124381243912440124411244212443124441244512446124471244812449124501245112452124531245412455124561245712458124591246012461124621246312464124651246612467124681246912470124711247212473124741247512476124771247812479124801248112482124831248412485124861248712488124891249012491124921249312494124951249612497124981249912500125011250212503125041250512506125071250812509125101251112512125131251412515125161251712518125191252012521125221252312524125251252612527125281252912530125311253212533125341253512536125371253812539125401254112542125431254412545125461254712548125491255012551125521255312554125551255612557125581255912560125611256212563125641256512566125671256812569125701257112572125731257412575125761257712578125791258012581125821258312584125851258612587125881258912590125911259212593125941259512596125971259812599126001260112602126031260412605126061260712608126091261012611126121261312614126151261612617126181261912620126211262212623126241262512626126271262812629126301263112632126331263412635126361263712638126391264012641126421264312644126451264612647126481264912650126511265212653126541265512656126571265812659126601266112662126631266412665126661266712668126691267012671126721267312674126751267612677126781267912680126811268212683126841268512686126871268812689126901269112692126931269412695126961269712698126991270012701127021270312704127051270612707127081270912710127111271212713127141271512716127171271812719127201272112722127231272412725127261272712728127291273012731127321273312734127351273612737127381273912740127411274212743127441274512746127471274812749127501275112752127531275412755127561275712758127591276012761127621276312764127651276612767127681276912770127711277212773127741277512776127771277812779127801278112782127831278412785127861278712788127891279012791127921279312794127951279612797127981279912800128011280212803128041280512806128071280812809128101281112812128131281412815128161281712818128191282012821128221282312824128251282612827128281282912830128311283212833128341283512836128371283812839128401284112842128431284412845128461284712848128491285012851128521285312854128551285612857128581285912860128611286212863128641286512866128671286812869128701287112872128731287412875128761287712878128791288012881128821288312884128851288612887128881288912890128911289212893128941289512896128971289812899129001290112902129031290412905129061290712908129091291012911129121291312914129151291612917129181291912920129211292212923129241292512926129271292812929129301293112932129331293412935129361293712938129391294012941129421294312944129451294612947129481294912950129511295212953129541295512956129571295812959129601296112962129631296412965129661296712968129691297012971129721297312974129751297612977129781297912980129811298212983129841298512986129871298812989129901299112992129931299412995129961299712998129991300013001130021300313004130051300613007130081300913010130111301213013130141301513016130171301813019130201302113022130231302413025130261302713028130291303013031130321303313034130351303613037130381303913040130411304213043130441304513046130471304813049130501305113052130531305413055130561305713058130591306013061130621306313064130651306613067130681306913070130711307213073130741307513076130771307813079130801308113082130831308413085130861308713088130891309013091130921309313094130951309613097130981309913100131011310213103131041310513106131071310813109131101311113112131131311413115131161311713118131191312013121131221312313124131251312613127131281312913130131311313213133131341313513136131371313813139131401314113142131431314413145131461314713148131491315013151131521315313154131551315613157131581315913160131611316213163131641316513166131671316813169131701317113172131731317413175131761317713178131791318013181131821318313184131851318613187131881318913190131911319213193131941319513196131971319813199132001320113202132031320413205132061320713208132091321013211132121321313214132151321613217132181321913220132211322213223132241322513226132271322813229132301323113232132331323413235132361323713238132391324013241132421324313244132451324613247132481324913250132511325213253132541325513256132571325813259132601326113262132631326413265132661326713268132691327013271132721327313274132751327613277132781327913280132811328213283132841328513286132871328813289132901329113292132931329413295132961329713298132991330013301133021330313304133051330613307133081330913310133111331213313133141331513316133171331813319133201332113322133231332413325133261332713328133291333013331133321333313334133351333613337133381333913340133411334213343133441334513346133471334813349133501335113352133531335413355133561335713358133591336013361133621336313364133651336613367133681336913370133711337213373133741337513376133771337813379133801338113382133831338413385133861338713388133891339013391133921339313394133951339613397133981339913400134011340213403134041340513406134071340813409134101341113412134131341413415134161341713418134191342013421134221342313424134251342613427134281342913430134311343213433134341343513436134371343813439134401344113442134431344413445134461344713448134491345013451134521345313454134551345613457134581345913460134611346213463134641346513466134671346813469134701347113472134731347413475134761347713478134791348013481134821348313484134851348613487134881348913490134911349213493134941349513496134971349813499135001350113502135031350413505135061350713508135091351013511135121351313514135151351613517135181351913520135211352213523135241352513526135271352813529135301353113532135331353413535135361353713538135391354013541135421354313544135451354613547135481354913550135511355213553135541355513556135571355813559135601356113562135631356413565135661356713568135691357013571135721357313574135751357613577135781357913580135811358213583135841358513586135871358813589135901359113592135931359413595135961359713598135991360013601136021360313604136051360613607136081360913610136111361213613136141361513616136171361813619136201362113622136231362413625136261362713628136291363013631136321363313634136351363613637136381363913640136411364213643136441364513646136471364813649136501365113652136531365413655136561365713658136591366013661136621366313664136651366613667136681366913670136711367213673136741367513676136771367813679136801368113682136831368413685136861368713688136891369013691136921369313694136951369613697136981369913700137011370213703137041370513706137071370813709137101371113712137131371413715137161371713718137191372013721137221372313724137251372613727137281372913730137311373213733137341373513736137371373813739137401374113742137431374413745137461374713748137491375013751137521375313754137551375613757137581375913760137611376213763137641376513766137671376813769137701377113772137731377413775137761377713778137791378013781137821378313784137851378613787137881378913790137911379213793137941379513796137971379813799138001380113802138031380413805138061380713808138091381013811138121381313814138151381613817138181381913820138211382213823138241382513826138271382813829138301383113832138331383413835138361383713838138391384013841138421384313844138451384613847138481384913850138511385213853138541385513856138571385813859138601386113862138631386413865138661386713868138691387013871138721387313874138751387613877138781387913880138811388213883138841388513886138871388813889138901389113892138931389413895138961389713898138991390013901139021390313904139051390613907139081390913910139111391213913139141391513916139171391813919139201392113922139231392413925139261392713928139291393013931139321393313934139351393613937139381393913940139411394213943139441394513946139471394813949139501395113952139531395413955139561395713958139591396013961139621396313964139651396613967139681396913970139711397213973139741397513976139771397813979139801398113982139831398413985139861398713988139891399013991139921399313994139951399613997139981399914000140011400214003140041400514006140071400814009140101401114012140131401414015140161401714018140191402014021140221402314024140251402614027140281402914030140311403214033140341403514036140371403814039140401404114042140431404414045140461404714048140491405014051140521405314054140551405614057140581405914060140611406214063140641406514066140671406814069140701407114072140731407414075140761407714078140791408014081140821408314084140851408614087140881408914090140911409214093140941409514096140971409814099141001410114102141031410414105141061410714108141091411014111141121411314114141151411614117141181411914120141211412214123141241412514126141271412814129141301413114132141331413414135141361413714138141391414014141141421414314144141451414614147141481414914150141511415214153141541415514156141571415814159141601416114162141631416414165141661416714168141691417014171141721417314174141751417614177141781417914180141811418214183141841418514186141871418814189141901419114192141931419414195141961419714198141991420014201142021420314204142051420614207142081420914210142111421214213142141421514216142171421814219142201422114222142231422414225142261422714228142291423014231142321423314234142351423614237142381423914240142411424214243142441424514246142471424814249142501425114252142531425414255142561425714258142591426014261142621426314264142651426614267142681426914270142711427214273142741427514276142771427814279142801428114282142831428414285142861428714288142891429014291142921429314294142951429614297142981429914300143011430214303143041430514306143071430814309143101431114312143131431414315143161431714318143191432014321143221432314324143251432614327143281432914330143311433214333143341433514336143371433814339143401434114342143431434414345143461434714348143491435014351143521435314354143551435614357143581435914360143611436214363143641436514366143671436814369143701437114372143731437414375143761437714378143791438014381143821438314384143851438614387143881438914390143911439214393143941439514396143971439814399144001440114402144031440414405144061440714408144091441014411144121441314414144151441614417144181441914420144211442214423144241442514426144271442814429144301443114432144331443414435144361443714438144391444014441144421444314444144451444614447144481444914450144511445214453144541445514456144571445814459144601446114462144631446414465144661446714468144691447014471144721447314474144751447614477144781447914480144811448214483144841448514486144871448814489144901449114492144931449414495144961449714498144991450014501145021450314504145051450614507145081450914510145111451214513145141451514516145171451814519145201452114522145231452414525145261452714528145291453014531145321453314534145351453614537145381453914540145411454214543145441454514546145471454814549145501455114552145531455414555145561455714558145591456014561145621456314564145651456614567145681456914570145711457214573145741457514576145771457814579145801458114582145831458414585145861458714588145891459014591145921459314594145951459614597145981459914600146011460214603146041460514606146071460814609146101461114612146131461414615146161461714618146191462014621146221462314624146251462614627146281462914630146311463214633146341463514636146371463814639146401464114642146431464414645146461464714648146491465014651146521465314654146551465614657146581465914660146611466214663146641466514666146671466814669146701467114672146731467414675146761467714678146791468014681146821468314684146851468614687146881468914690146911469214693146941469514696146971469814699147001470114702147031470414705147061470714708147091471014711147121471314714147151471614717147181471914720147211472214723147241472514726147271472814729147301473114732147331473414735147361473714738147391474014741147421474314744147451474614747147481474914750147511475214753147541475514756147571475814759147601476114762147631476414765147661476714768147691477014771147721477314774147751477614777147781477914780147811478214783147841478514786147871478814789147901479114792147931479414795147961479714798147991480014801148021480314804148051480614807148081480914810148111481214813148141481514816148171481814819148201482114822148231482414825148261482714828148291483014831148321483314834148351483614837148381483914840148411484214843148441484514846148471484814849148501485114852148531485414855148561485714858148591486014861148621486314864148651486614867148681486914870148711487214873148741487514876148771487814879148801488114882148831488414885148861488714888148891489014891148921489314894148951489614897148981489914900149011490214903149041490514906149071490814909149101491114912149131491414915149161491714918149191492014921149221492314924149251492614927149281492914930149311493214933149341493514936149371493814939149401494114942149431494414945149461494714948149491495014951149521495314954149551495614957149581495914960149611496214963149641496514966149671496814969149701497114972149731497414975149761497714978149791498014981149821498314984149851498614987149881498914990149911499214993149941499514996149971499814999150001500115002150031500415005150061500715008150091501015011150121501315014150151501615017150181501915020150211502215023150241502515026150271502815029150301503115032150331503415035150361503715038150391504015041150421504315044150451504615047150481504915050150511505215053150541505515056150571505815059150601506115062150631506415065150661506715068150691507015071150721507315074150751507615077150781507915080150811508215083150841508515086150871508815089150901509115092150931509415095150961509715098150991510015101151021510315104151051510615107151081510915110151111511215113151141511515116151171511815119151201512115122151231512415125151261512715128151291513015131151321513315134151351513615137151381513915140151411514215143151441514515146151471514815149151501515115152151531515415155151561515715158151591516015161151621516315164151651516615167151681516915170151711517215173151741517515176151771517815179151801518115182151831518415185151861518715188151891519015191151921519315194151951519615197151981519915200152011520215203152041520515206152071520815209152101521115212152131521415215152161521715218152191522015221152221522315224152251522615227152281522915230152311523215233152341523515236152371523815239152401524115242152431524415245152461524715248152491525015251152521525315254152551525615257152581525915260152611526215263152641526515266152671526815269152701527115272152731527415275152761527715278152791528015281152821528315284152851528615287152881528915290152911529215293152941529515296152971529815299153001530115302153031530415305153061530715308153091531015311153121531315314153151531615317153181531915320153211532215323153241532515326153271532815329153301533115332153331533415335153361533715338153391534015341153421534315344153451534615347153481534915350153511535215353153541535515356153571535815359153601536115362153631536415365153661536715368153691537015371153721537315374153751537615377153781537915380153811538215383153841538515386153871538815389153901539115392153931539415395153961539715398153991540015401154021540315404154051540615407154081540915410154111541215413154141541515416154171541815419154201542115422154231542415425154261542715428154291543015431154321543315434154351543615437154381543915440154411544215443154441544515446154471544815449154501545115452154531545415455154561545715458154591546015461154621546315464154651546615467154681546915470154711547215473154741547515476154771547815479154801548115482154831548415485154861548715488154891549015491154921549315494154951549615497154981549915500155011550215503155041550515506155071550815509155101551115512155131551415515155161551715518155191552015521155221552315524155251552615527155281552915530155311553215533155341553515536155371553815539155401554115542155431554415545155461554715548155491555015551155521555315554155551555615557155581555915560155611556215563155641556515566155671556815569155701557115572155731557415575155761557715578155791558015581155821558315584155851558615587155881558915590155911559215593155941559515596155971559815599156001560115602156031560415605156061560715608156091561015611156121561315614156151561615617156181561915620156211562215623156241562515626156271562815629156301563115632156331563415635156361563715638156391564015641156421564315644156451564615647156481564915650156511565215653156541565515656156571565815659156601566115662156631566415665156661566715668156691567015671156721567315674156751567615677156781567915680156811568215683156841568515686156871568815689156901569115692156931569415695156961569715698156991570015701157021570315704157051570615707157081570915710157111571215713157141571515716157171571815719157201572115722157231572415725157261572715728157291573015731157321573315734157351573615737157381573915740157411574215743157441574515746157471574815749157501575115752157531575415755157561575715758157591576015761157621576315764157651576615767157681576915770157711577215773157741577515776157771577815779157801578115782157831578415785157861578715788157891579015791157921579315794157951579615797157981579915800158011580215803158041580515806158071580815809158101581115812158131581415815158161581715818158191582015821158221582315824158251582615827158281582915830158311583215833158341583515836158371583815839158401584115842158431584415845158461584715848158491585015851158521585315854158551585615857158581585915860158611586215863158641586515866158671586815869158701587115872158731587415875158761587715878158791588015881158821588315884158851588615887158881588915890158911589215893158941589515896158971589815899159001590115902159031590415905159061590715908159091591015911159121591315914159151591615917159181591915920159211592215923159241592515926159271592815929159301593115932159331593415935159361593715938159391594015941159421594315944159451594615947159481594915950159511595215953159541595515956159571595815959159601596115962159631596415965159661596715968159691597015971159721597315974159751597615977159781597915980159811598215983159841598515986159871598815989159901599115992159931599415995159961599715998159991600016001160021600316004160051600616007160081600916010160111601216013160141601516016160171601816019160201602116022160231602416025160261602716028160291603016031160321603316034160351603616037160381603916040160411604216043160441604516046160471604816049160501605116052160531605416055160561605716058160591606016061160621606316064160651606616067160681606916070160711607216073160741607516076160771607816079160801608116082160831608416085160861608716088160891609016091160921609316094160951609616097160981609916100161011610216103161041610516106161071610816109161101611116112161131611416115161161611716118161191612016121161221612316124161251612616127161281612916130161311613216133161341613516136161371613816139161401614116142161431614416145161461614716148161491615016151161521615316154161551615616157161581615916160161611616216163161641616516166161671616816169161701617116172161731617416175161761617716178161791618016181161821618316184161851618616187161881618916190161911619216193161941619516196161971619816199162001620116202162031620416205162061620716208162091621016211162121621316214162151621616217162181621916220162211622216223162241622516226162271622816229162301623116232162331623416235162361623716238162391624016241162421624316244162451624616247162481624916250162511625216253162541625516256162571625816259162601626116262162631626416265162661626716268162691627016271162721627316274162751627616277162781627916280162811628216283162841628516286162871628816289162901629116292162931629416295162961629716298162991630016301163021630316304163051630616307163081630916310163111631216313163141631516316163171631816319163201632116322163231632416325163261632716328163291633016331163321633316334163351633616337163381633916340163411634216343163441634516346163471634816349163501635116352163531635416355163561635716358163591636016361163621636316364163651636616367163681636916370163711637216373163741637516376163771637816379163801638116382163831638416385163861638716388163891639016391163921639316394163951639616397163981639916400164011640216403164041640516406164071640816409164101641116412164131641416415164161641716418164191642016421164221642316424164251642616427164281642916430164311643216433164341643516436164371643816439164401644116442164431644416445164461644716448164491645016451164521645316454164551645616457164581645916460164611646216463164641646516466164671646816469164701647116472164731647416475164761647716478164791648016481164821648316484164851648616487164881648916490164911649216493164941649516496164971649816499165001650116502165031650416505165061650716508165091651016511165121651316514165151651616517165181651916520165211652216523165241652516526165271652816529165301653116532165331653416535165361653716538165391654016541165421654316544165451654616547165481654916550165511655216553165541655516556165571655816559165601656116562165631656416565165661656716568165691657016571165721657316574165751657616577165781657916580165811658216583165841658516586165871658816589165901659116592165931659416595165961659716598165991660016601166021660316604166051660616607166081660916610166111661216613166141661516616166171661816619166201662116622166231662416625166261662716628166291663016631166321663316634166351663616637166381663916640166411664216643166441664516646166471664816649166501665116652166531665416655166561665716658166591666016661166621666316664166651666616667166681666916670166711667216673166741667516676166771667816679166801668116682166831668416685166861668716688166891669016691166921669316694166951669616697166981669916700167011670216703167041670516706167071670816709167101671116712167131671416715167161671716718167191672016721167221672316724167251672616727167281672916730167311673216733167341673516736167371673816739167401674116742167431674416745167461674716748167491675016751167521675316754167551675616757167581675916760167611676216763167641676516766167671676816769167701677116772167731677416775167761677716778167791678016781167821678316784167851678616787167881678916790167911679216793167941679516796167971679816799168001680116802168031680416805168061680716808168091681016811168121681316814168151681616817168181681916820168211682216823168241682516826168271682816829168301683116832168331683416835168361683716838168391684016841168421684316844168451684616847168481684916850168511685216853168541685516856168571685816859168601686116862168631686416865168661686716868168691687016871168721687316874168751687616877168781687916880168811688216883168841688516886168871688816889168901689116892168931689416895168961689716898168991690016901169021690316904169051690616907169081690916910169111691216913169141691516916169171691816919169201692116922169231692416925169261692716928169291693016931169321693316934169351693616937169381693916940169411694216943169441694516946169471694816949169501695116952169531695416955169561695716958169591696016961169621696316964169651696616967169681696916970169711697216973169741697516976169771697816979169801698116982169831698416985169861698716988169891699016991169921699316994169951699616997169981699917000170011700217003170041700517006170071700817009170101701117012170131701417015170161701717018170191702017021170221702317024170251702617027170281702917030170311703217033170341703517036170371703817039170401704117042170431704417045170461704717048170491705017051170521705317054170551705617057170581705917060170611706217063170641706517066170671706817069170701707117072170731707417075170761707717078170791708017081170821708317084170851708617087170881708917090170911709217093170941709517096170971709817099171001710117102171031710417105171061710717108171091711017111171121711317114171151711617117171181711917120171211712217123171241712517126171271712817129171301713117132171331713417135171361713717138171391714017141171421714317144171451714617147171481714917150171511715217153171541715517156171571715817159171601716117162171631716417165171661716717168171691717017171171721717317174171751717617177171781717917180171811718217183171841718517186171871718817189171901719117192171931719417195171961719717198171991720017201172021720317204172051720617207172081720917210172111721217213172141721517216172171721817219172201722117222172231722417225172261722717228172291723017231172321723317234172351723617237172381723917240172411724217243172441724517246172471724817249172501725117252172531725417255172561725717258172591726017261172621726317264172651726617267172681726917270172711727217273172741727517276172771727817279172801728117282172831728417285172861728717288172891729017291172921729317294172951729617297172981729917300173011730217303173041730517306173071730817309173101731117312173131731417315173161731717318173191732017321173221732317324173251732617327173281732917330173311733217333173341733517336173371733817339173401734117342173431734417345173461734717348173491735017351173521735317354173551735617357173581735917360173611736217363173641736517366173671736817369173701737117372173731737417375173761737717378173791738017381173821738317384173851738617387173881738917390173911739217393173941739517396173971739817399174001740117402174031740417405174061740717408174091741017411174121741317414174151741617417174181741917420174211742217423174241742517426174271742817429174301743117432174331743417435174361743717438174391744017441174421744317444174451744617447174481744917450174511745217453174541745517456174571745817459174601746117462174631746417465174661746717468174691747017471174721747317474174751747617477174781747917480174811748217483174841748517486174871748817489174901749117492174931749417495174961749717498174991750017501175021750317504175051750617507175081750917510175111751217513175141751517516175171751817519175201752117522175231752417525175261752717528175291753017531175321753317534175351753617537175381753917540175411754217543175441754517546175471754817549175501755117552175531755417555175561755717558175591756017561175621756317564175651756617567175681756917570175711757217573175741757517576175771757817579175801758117582175831758417585175861758717588175891759017591175921759317594175951759617597175981759917600176011760217603176041760517606176071760817609176101761117612176131761417615176161761717618176191762017621176221762317624176251762617627176281762917630176311763217633176341763517636176371763817639176401764117642176431764417645176461764717648176491765017651176521765317654176551765617657176581765917660176611766217663176641766517666176671766817669176701767117672176731767417675176761767717678176791768017681176821768317684176851768617687176881768917690176911769217693176941769517696176971769817699177001770117702177031770417705177061770717708177091771017711177121771317714177151771617717177181771917720177211772217723177241772517726177271772817729177301773117732177331773417735177361773717738177391774017741177421774317744177451774617747177481774917750177511775217753177541775517756177571775817759177601776117762177631776417765177661776717768177691777017771177721777317774177751777617777177781777917780177811778217783177841778517786177871778817789177901779117792177931779417795177961779717798177991780017801178021780317804178051780617807178081780917810178111781217813178141781517816178171781817819178201782117822178231782417825178261782717828178291783017831178321783317834178351783617837178381783917840178411784217843178441784517846178471784817849178501785117852178531785417855178561785717858178591786017861178621786317864178651786617867178681786917870178711787217873178741787517876178771787817879178801788117882178831788417885178861788717888178891789017891178921789317894178951789617897178981789917900179011790217903179041790517906179071790817909179101791117912179131791417915179161791717918179191792017921179221792317924179251792617927179281792917930179311793217933179341793517936179371793817939179401794117942179431794417945179461794717948179491795017951179521795317954179551795617957179581795917960179611796217963179641796517966179671796817969179701797117972179731797417975179761797717978179791798017981179821798317984179851798617987179881798917990179911799217993179941799517996179971799817999180001800118002180031800418005180061800718008180091801018011180121801318014180151801618017180181801918020180211802218023180241802518026180271802818029180301803118032180331803418035180361803718038180391804018041180421804318044180451804618047180481804918050180511805218053180541805518056180571805818059180601806118062180631806418065180661806718068180691807018071180721807318074180751807618077180781807918080180811808218083180841808518086180871808818089180901809118092180931809418095180961809718098180991810018101181021810318104181051810618107181081810918110181111811218113181141811518116181171811818119181201812118122181231812418125181261812718128181291813018131181321813318134181351813618137181381813918140181411814218143181441814518146181471814818149181501815118152181531815418155181561815718158181591816018161181621816318164181651816618167181681816918170181711817218173181741817518176181771817818179181801818118182181831818418185181861818718188181891819018191181921819318194181951819618197181981819918200182011820218203182041820518206182071820818209182101821118212182131821418215182161821718218182191822018221182221822318224182251822618227182281822918230182311823218233182341823518236182371823818239182401824118242182431824418245182461824718248182491825018251182521825318254182551825618257182581825918260182611826218263182641826518266182671826818269182701827118272182731827418275182761827718278182791828018281182821828318284182851828618287182881828918290182911829218293182941829518296182971829818299183001830118302183031830418305183061830718308183091831018311183121831318314183151831618317183181831918320183211832218323183241832518326183271832818329183301833118332183331833418335183361833718338183391834018341183421834318344183451834618347183481834918350183511835218353183541835518356183571835818359183601836118362183631836418365183661836718368183691837018371183721837318374183751837618377183781837918380183811838218383183841838518386183871838818389183901839118392183931839418395183961839718398183991840018401184021840318404184051840618407184081840918410184111841218413184141841518416184171841818419184201842118422184231842418425184261842718428184291843018431184321843318434184351843618437184381843918440184411844218443184441844518446184471844818449184501845118452184531845418455184561845718458184591846018461184621846318464184651846618467184681846918470184711847218473184741847518476184771847818479184801848118482184831848418485184861848718488184891849018491184921849318494184951849618497184981849918500185011850218503185041850518506185071850818509185101851118512185131851418515185161851718518185191852018521185221852318524185251852618527185281852918530185311853218533185341853518536185371853818539185401854118542185431854418545185461854718548185491855018551185521855318554185551855618557185581855918560185611856218563185641856518566185671856818569185701857118572185731857418575185761857718578185791858018581185821858318584185851858618587185881858918590185911859218593185941859518596185971859818599186001860118602186031860418605186061860718608186091861018611186121861318614186151861618617186181861918620186211862218623186241862518626186271862818629186301863118632186331863418635186361863718638186391864018641186421864318644186451864618647186481864918650186511865218653186541865518656186571865818659186601866118662186631866418665186661866718668186691867018671186721867318674186751867618677186781867918680186811868218683186841868518686186871868818689186901869118692186931869418695186961869718698186991870018701187021870318704187051870618707187081870918710187111871218713187141871518716187171871818719187201872118722187231872418725187261872718728187291873018731187321873318734187351873618737187381873918740187411874218743187441874518746187471874818749187501875118752187531875418755187561875718758187591876018761187621876318764187651876618767187681876918770187711877218773187741877518776187771877818779187801878118782187831878418785187861878718788187891879018791187921879318794187951879618797187981879918800188011880218803188041880518806188071880818809188101881118812188131881418815188161881718818188191882018821188221882318824188251882618827188281882918830188311883218833188341883518836188371883818839188401884118842188431884418845188461884718848188491885018851188521885318854188551885618857188581885918860188611886218863188641886518866188671886818869188701887118872188731887418875188761887718878188791888018881188821888318884188851888618887188881888918890188911889218893188941889518896188971889818899189001890118902189031890418905189061890718908189091891018911189121891318914189151891618917189181891918920189211892218923189241892518926189271892818929189301893118932189331893418935189361893718938189391894018941189421894318944189451894618947189481894918950189511895218953189541895518956189571895818959189601896118962189631896418965189661896718968189691897018971189721897318974189751897618977189781897918980189811898218983189841898518986189871898818989189901899118992189931899418995189961899718998189991900019001190021900319004190051900619007190081900919010190111901219013190141901519016190171901819019190201902119022190231902419025190261902719028190291903019031190321903319034190351903619037190381903919040190411904219043190441904519046190471904819049190501905119052190531905419055190561905719058190591906019061190621906319064190651906619067190681906919070190711907219073190741907519076190771907819079190801908119082190831908419085190861908719088190891909019091190921909319094190951909619097190981909919100191011910219103191041910519106191071910819109191101911119112191131911419115191161911719118191191912019121191221912319124191251912619127191281912919130191311913219133191341913519136191371913819139191401914119142191431914419145191461914719148191491915019151191521915319154191551915619157191581915919160191611916219163191641916519166191671916819169191701917119172191731917419175191761917719178191791918019181191821918319184191851918619187191881918919190191911919219193191941919519196191971919819199192001920119202192031920419205192061920719208192091921019211192121921319214192151921619217192181921919220192211922219223192241922519226192271922819229192301923119232192331923419235192361923719238192391924019241192421924319244192451924619247192481924919250192511925219253192541925519256192571925819259192601926119262192631926419265192661926719268192691927019271192721927319274192751927619277192781927919280192811928219283192841928519286192871928819289192901929119292192931929419295192961929719298192991930019301193021930319304193051930619307193081930919310193111931219313193141931519316193171931819319193201932119322193231932419325193261932719328193291933019331193321933319334193351933619337193381933919340193411934219343193441934519346193471934819349193501935119352193531935419355193561935719358193591936019361193621936319364193651936619367193681936919370193711937219373193741937519376193771937819379193801938119382193831938419385193861938719388193891939019391193921939319394193951939619397193981939919400194011940219403194041940519406194071940819409194101941119412194131941419415194161941719418194191942019421194221942319424194251942619427194281942919430194311943219433194341943519436194371943819439194401944119442194431944419445194461944719448194491945019451194521945319454194551945619457194581945919460194611946219463194641946519466194671946819469194701947119472194731947419475194761947719478194791948019481194821948319484194851948619487194881948919490194911949219493194941949519496194971949819499195001950119502195031950419505195061950719508195091951019511195121951319514195151951619517195181951919520195211952219523195241952519526195271952819529195301953119532195331953419535195361953719538195391954019541195421954319544195451954619547195481954919550195511955219553195541955519556195571955819559195601956119562195631956419565195661956719568195691957019571195721957319574195751957619577195781957919580195811958219583195841958519586195871958819589195901959119592195931959419595195961959719598195991960019601196021960319604196051960619607196081960919610196111961219613196141961519616196171961819619196201962119622196231962419625196261962719628196291963019631196321963319634196351963619637196381963919640196411964219643196441964519646196471964819649196501965119652196531965419655196561965719658196591966019661196621966319664196651966619667196681966919670196711967219673196741967519676196771967819679196801968119682196831968419685196861968719688196891969019691196921969319694196951969619697196981969919700197011970219703197041970519706197071970819709197101971119712197131971419715197161971719718197191972019721197221972319724197251972619727197281972919730197311973219733197341973519736197371973819739197401974119742197431974419745197461974719748197491975019751197521975319754197551975619757197581975919760197611976219763197641976519766197671976819769197701977119772197731977419775197761977719778197791978019781197821978319784197851978619787197881978919790197911979219793197941979519796197971979819799198001980119802198031980419805198061980719808198091981019811198121981319814198151981619817198181981919820198211982219823198241982519826198271982819829198301983119832198331983419835198361983719838198391984019841198421984319844198451984619847198481984919850198511985219853198541985519856198571985819859198601986119862198631986419865198661986719868198691987019871198721987319874198751987619877198781987919880198811988219883198841988519886198871988819889198901989119892198931989419895198961989719898198991990019901199021990319904199051990619907199081990919910199111991219913199141991519916199171991819919199201992119922199231992419925199261992719928199291993019931199321993319934199351993619937199381993919940199411994219943199441994519946199471994819949199501995119952199531995419955199561995719958199591996019961199621996319964199651996619967199681996919970199711997219973199741997519976199771997819979199801998119982199831998419985199861998719988199891999019991199921999319994199951999619997199981999920000200012000220003200042000520006200072000820009200102001120012200132001420015200162001720018200192002020021200222002320024200252002620027200282002920030200312003220033200342003520036200372003820039200402004120042200432004420045200462004720048200492005020051200522005320054200552005620057200582005920060200612006220063200642006520066200672006820069200702007120072200732007420075200762007720078200792008020081200822008320084200852008620087200882008920090200912009220093200942009520096200972009820099201002010120102201032010420105201062010720108201092011020111201122011320114201152011620117201182011920120201212012220123201242012520126201272012820129201302013120132201332013420135201362013720138201392014020141201422014320144201452014620147201482014920150201512015220153201542015520156201572015820159201602016120162201632016420165201662016720168201692017020171201722017320174201752017620177201782017920180201812018220183201842018520186201872018820189201902019120192201932019420195201962019720198201992020020201202022020320204202052020620207202082020920210202112021220213202142021520216202172021820219202202022120222202232022420225202262022720228202292023020231202322023320234202352023620237202382023920240202412024220243202442024520246202472024820249202502025120252202532025420255202562025720258202592026020261202622026320264202652026620267202682026920270202712027220273202742027520276202772027820279202802028120282202832028420285202862028720288202892029020291202922029320294202952029620297202982029920300203012030220303203042030520306203072030820309203102031120312203132031420315203162031720318203192032020321203222032320324203252032620327203282032920330203312033220333203342033520336203372033820339203402034120342203432034420345203462034720348203492035020351203522035320354203552035620357203582035920360203612036220363203642036520366203672036820369203702037120372203732037420375203762037720378203792038020381203822038320384203852038620387203882038920390203912039220393203942039520396203972039820399204002040120402204032040420405204062040720408204092041020411204122041320414204152041620417204182041920420204212042220423204242042520426204272042820429204302043120432204332043420435204362043720438204392044020441204422044320444204452044620447204482044920450204512045220453204542045520456204572045820459204602046120462204632046420465204662046720468204692047020471204722047320474204752047620477204782047920480204812048220483204842048520486204872048820489204902049120492204932049420495204962049720498204992050020501205022050320504205052050620507205082050920510205112051220513205142051520516205172051820519205202052120522205232052420525205262052720528205292053020531205322053320534205352053620537205382053920540205412054220543205442054520546205472054820549205502055120552205532055420555205562055720558205592056020561205622056320564205652056620567205682056920570205712057220573205742057520576205772057820579205802058120582205832058420585205862058720588205892059020591205922059320594205952059620597205982059920600206012060220603206042060520606206072060820609206102061120612206132061420615206162061720618206192062020621206222062320624206252062620627206282062920630206312063220633206342063520636206372063820639206402064120642206432064420645206462064720648206492065020651206522065320654206552065620657206582065920660206612066220663206642066520666206672066820669206702067120672206732067420675206762067720678206792068020681206822068320684206852068620687206882068920690206912069220693206942069520696206972069820699207002070120702207032070420705207062070720708207092071020711207122071320714207152071620717207182071920720207212072220723207242072520726207272072820729207302073120732207332073420735207362073720738207392074020741207422074320744207452074620747207482074920750207512075220753207542075520756207572075820759207602076120762207632076420765207662076720768207692077020771207722077320774207752077620777207782077920780207812078220783207842078520786207872078820789207902079120792207932079420795207962079720798207992080020801208022080320804208052080620807208082080920810208112081220813208142081520816208172081820819208202082120822208232082420825208262082720828208292083020831208322083320834208352083620837208382083920840208412084220843208442084520846208472084820849208502085120852208532085420855208562085720858208592086020861208622086320864208652086620867208682086920870208712087220873208742087520876208772087820879208802088120882208832088420885208862088720888208892089020891208922089320894208952089620897208982089920900209012090220903209042090520906209072090820909209102091120912209132091420915209162091720918209192092020921209222092320924209252092620927209282092920930209312093220933209342093520936209372093820939209402094120942209432094420945209462094720948209492095020951209522095320954209552095620957209582095920960209612096220963209642096520966209672096820969209702097120972209732097420975209762097720978209792098020981209822098320984209852098620987209882098920990209912099220993209942099520996209972099820999210002100121002210032100421005210062100721008210092101021011210122101321014210152101621017210182101921020210212102221023210242102521026210272102821029210302103121032210332103421035210362103721038210392104021041210422104321044210452104621047210482104921050210512105221053210542105521056210572105821059210602106121062210632106421065210662106721068210692107021071210722107321074210752107621077210782107921080210812108221083210842108521086210872108821089210902109121092210932109421095210962109721098210992110021101211022110321104211052110621107211082110921110211112111221113211142111521116211172111821119211202112121122211232112421125211262112721128211292113021131211322113321134211352113621137211382113921140211412114221143211442114521146211472114821149211502115121152211532115421155211562115721158211592116021161211622116321164211652116621167211682116921170211712117221173211742117521176211772117821179211802118121182211832118421185211862118721188211892119021191211922119321194211952119621197211982119921200212012120221203212042120521206212072120821209212102121121212212132121421215212162121721218212192122021221212222122321224212252122621227212282122921230212312123221233212342123521236212372123821239212402124121242212432124421245212462124721248212492125021251212522125321254212552125621257212582125921260212612126221263212642126521266212672126821269212702127121272212732127421275212762127721278212792128021281212822128321284212852128621287212882128921290212912129221293212942129521296212972129821299213002130121302213032130421305213062130721308213092131021311213122131321314213152131621317213182131921320213212132221323213242132521326213272132821329213302133121332213332133421335213362133721338213392134021341213422134321344213452134621347213482134921350213512135221353213542135521356213572135821359213602136121362213632136421365213662136721368213692137021371213722137321374213752137621377213782137921380213812138221383213842138521386213872138821389213902139121392213932139421395213962139721398213992140021401214022140321404214052140621407214082140921410214112141221413214142141521416214172141821419214202142121422214232142421425214262142721428214292143021431214322143321434214352143621437214382143921440214412144221443214442144521446214472144821449214502145121452214532145421455214562145721458214592146021461214622146321464214652146621467214682146921470214712147221473214742147521476214772147821479214802148121482214832148421485214862148721488214892149021491214922149321494214952149621497214982149921500215012150221503215042150521506215072150821509215102151121512215132151421515215162151721518215192152021521215222152321524215252152621527215282152921530215312153221533215342153521536215372153821539215402154121542215432154421545215462154721548215492155021551215522155321554215552155621557215582155921560215612156221563215642156521566215672156821569215702157121572215732157421575215762157721578215792158021581215822158321584215852158621587215882158921590215912159221593215942159521596215972159821599216002160121602216032160421605216062160721608216092161021611216122161321614216152161621617216182161921620216212162221623216242162521626216272162821629216302163121632216332163421635216362163721638216392164021641216422164321644216452164621647216482164921650216512165221653216542165521656216572165821659216602166121662216632166421665216662166721668216692167021671216722167321674216752167621677216782167921680216812168221683216842168521686216872168821689216902169121692216932169421695216962169721698216992170021701217022170321704217052170621707217082170921710217112171221713217142171521716217172171821719217202172121722217232172421725217262172721728217292173021731217322173321734217352173621737217382173921740217412174221743217442174521746217472174821749217502175121752217532175421755217562175721758217592176021761217622176321764217652176621767217682176921770217712177221773217742177521776217772177821779217802178121782217832178421785217862178721788217892179021791217922179321794217952179621797217982179921800218012180221803218042180521806218072180821809218102181121812218132181421815218162181721818218192182021821218222182321824218252182621827218282182921830218312183221833218342183521836218372183821839218402184121842218432184421845218462184721848218492185021851218522185321854218552185621857218582185921860218612186221863218642186521866218672186821869218702187121872218732187421875218762187721878218792188021881218822188321884218852188621887218882188921890218912189221893218942189521896218972189821899219002190121902219032190421905219062190721908219092191021911219122191321914219152191621917219182191921920219212192221923219242192521926219272192821929219302193121932219332193421935219362193721938219392194021941219422194321944219452194621947219482194921950219512195221953219542195521956219572195821959219602196121962219632196421965219662196721968219692197021971219722197321974219752197621977219782197921980219812198221983219842198521986219872198821989219902199121992219932199421995219962199721998219992200022001220022200322004220052200622007220082200922010220112201222013220142201522016220172201822019220202202122022220232202422025220262202722028220292203022031220322203322034220352203622037220382203922040220412204222043220442204522046220472204822049220502205122052220532205422055220562205722058220592206022061220622206322064220652206622067220682206922070220712207222073220742207522076220772207822079220802208122082220832208422085220862208722088220892209022091220922209322094220952209622097220982209922100221012210222103221042210522106221072210822109221102211122112221132211422115221162211722118221192212022121221222212322124221252212622127221282212922130221312213222133221342213522136221372213822139221402214122142221432214422145221462214722148221492215022151221522215322154221552215622157221582215922160221612216222163221642216522166221672216822169221702217122172221732217422175221762217722178221792218022181221822218322184221852218622187221882218922190221912219222193221942219522196221972219822199222002220122202222032220422205222062220722208222092221022211222122221322214222152221622217222182221922220222212222222223222242222522226222272222822229222302223122232222332223422235222362223722238222392224022241222422224322244222452224622247222482224922250222512225222253222542225522256222572225822259222602226122262222632226422265222662226722268222692227022271222722227322274222752227622277222782227922280222812228222283222842228522286222872228822289222902229122292222932229422295222962229722298222992230022301223022230322304223052230622307223082230922310223112231222313223142231522316223172231822319223202232122322223232232422325223262232722328223292233022331223322233322334223352233622337223382233922340223412234222343223442234522346223472234822349223502235122352223532235422355223562235722358223592236022361223622236322364223652236622367223682236922370223712237222373223742237522376223772237822379223802238122382223832238422385223862238722388223892239022391223922239322394223952239622397223982239922400224012240222403224042240522406224072240822409224102241122412224132241422415224162241722418224192242022421224222242322424224252242622427224282242922430224312243222433224342243522436224372243822439224402244122442224432244422445224462244722448224492245022451224522245322454224552245622457224582245922460224612246222463224642246522466224672246822469224702247122472224732247422475224762247722478224792248022481224822248322484224852248622487224882248922490224912249222493224942249522496224972249822499225002250122502225032250422505225062250722508225092251022511225122251322514225152251622517225182251922520225212252222523225242252522526225272252822529225302253122532225332253422535225362253722538225392254022541225422254322544225452254622547225482254922550225512255222553225542255522556225572255822559225602256122562225632256422565225662256722568225692257022571225722257322574225752257622577225782257922580225812258222583225842258522586225872258822589225902259122592225932259422595225962259722598225992260022601226022260322604226052260622607226082260922610226112261222613226142261522616226172261822619226202262122622226232262422625226262262722628226292263022631226322263322634226352263622637226382263922640226412264222643226442264522646226472264822649226502265122652226532265422655226562265722658226592266022661226622266322664226652266622667226682266922670226712267222673226742267522676226772267822679226802268122682226832268422685226862268722688226892269022691226922269322694226952269622697226982269922700227012270222703227042270522706227072270822709227102271122712227132271422715227162271722718227192272022721227222272322724227252272622727227282272922730227312273222733227342273522736227372273822739227402274122742227432274422745227462274722748227492275022751227522275322754227552275622757227582275922760227612276222763227642276522766227672276822769227702277122772227732277422775227762277722778227792278022781227822278322784227852278622787227882278922790227912279222793227942279522796227972279822799228002280122802228032280422805228062280722808228092281022811228122281322814228152281622817228182281922820228212282222823228242282522826228272282822829228302283122832228332283422835228362283722838228392284022841228422284322844228452284622847228482284922850228512285222853228542285522856228572285822859228602286122862228632286422865228662286722868228692287022871228722287322874228752287622877228782287922880228812288222883228842288522886228872288822889228902289122892228932289422895228962289722898228992290022901229022290322904229052290622907229082290922910229112291222913229142291522916229172291822919229202292122922229232292422925229262292722928229292293022931229322293322934229352293622937229382293922940229412294222943229442294522946229472294822949229502295122952229532295422955229562295722958229592296022961229622296322964229652296622967229682296922970229712297222973229742297522976229772297822979229802298122982229832298422985229862298722988229892299022991229922299322994229952299622997229982299923000230012300223003230042300523006230072300823009230102301123012230132301423015230162301723018230192302023021230222302323024230252302623027230282302923030230312303223033230342303523036230372303823039230402304123042230432304423045230462304723048230492305023051230522305323054230552305623057230582305923060230612306223063230642306523066230672306823069230702307123072230732307423075230762307723078230792308023081230822308323084230852308623087230882308923090230912309223093230942309523096230972309823099231002310123102231032310423105231062310723108231092311023111231122311323114231152311623117231182311923120231212312223123231242312523126231272312823129231302313123132231332313423135231362313723138231392314023141231422314323144231452314623147231482314923150231512315223153231542315523156231572315823159231602316123162231632316423165231662316723168231692317023171231722317323174231752317623177231782317923180231812318223183231842318523186231872318823189231902319123192231932319423195231962319723198231992320023201232022320323204232052320623207232082320923210232112321223213232142321523216232172321823219232202322123222232232322423225232262322723228232292323023231232322323323234232352323623237232382323923240232412324223243232442324523246232472324823249232502325123252232532325423255232562325723258232592326023261232622326323264232652326623267232682326923270232712327223273232742327523276232772327823279232802328123282232832328423285232862328723288232892329023291232922329323294232952329623297232982329923300233012330223303233042330523306233072330823309233102331123312233132331423315233162331723318233192332023321233222332323324233252332623327233282332923330233312333223333233342333523336233372333823339233402334123342233432334423345233462334723348233492335023351233522335323354233552335623357233582335923360233612336223363233642336523366233672336823369233702337123372233732337423375233762337723378233792338023381233822338323384233852338623387233882338923390233912339223393233942339523396233972339823399234002340123402234032340423405234062340723408234092341023411234122341323414234152341623417234182341923420234212342223423234242342523426234272342823429234302343123432234332343423435234362343723438234392344023441234422344323444234452344623447234482344923450234512345223453234542345523456234572345823459234602346123462234632346423465234662346723468234692347023471234722347323474234752347623477234782347923480234812348223483234842348523486234872348823489234902349123492234932349423495234962349723498234992350023501235022350323504235052350623507235082350923510235112351223513235142351523516235172351823519235202352123522235232352423525235262352723528235292353023531235322353323534235352353623537235382353923540235412354223543235442354523546235472354823549235502355123552235532355423555235562355723558235592356023561235622356323564235652356623567235682356923570235712357223573235742357523576235772357823579235802358123582235832358423585235862358723588235892359023591235922359323594235952359623597235982359923600236012360223603236042360523606236072360823609236102361123612236132361423615236162361723618236192362023621236222362323624236252362623627236282362923630236312363223633236342363523636236372363823639236402364123642236432364423645236462364723648236492365023651236522365323654236552365623657236582365923660236612366223663236642366523666236672366823669236702367123672236732367423675236762367723678236792368023681236822368323684236852368623687236882368923690236912369223693236942369523696236972369823699237002370123702237032370423705237062370723708237092371023711237122371323714237152371623717237182371923720237212372223723237242372523726237272372823729237302373123732237332373423735237362373723738237392374023741237422374323744237452374623747237482374923750237512375223753237542375523756237572375823759237602376123762237632376423765237662376723768237692377023771237722377323774237752377623777237782377923780237812378223783237842378523786237872378823789237902379123792237932379423795237962379723798237992380023801238022380323804238052380623807238082380923810238112381223813238142381523816238172381823819238202382123822238232382423825238262382723828238292383023831238322383323834238352383623837238382383923840238412384223843238442384523846238472384823849238502385123852238532385423855238562385723858238592386023861238622386323864238652386623867238682386923870238712387223873238742387523876238772387823879238802388123882238832388423885238862388723888238892389023891238922389323894238952389623897238982389923900239012390223903239042390523906239072390823909239102391123912239132391423915239162391723918239192392023921239222392323924239252392623927239282392923930239312393223933239342393523936239372393823939239402394123942239432394423945239462394723948239492395023951239522395323954239552395623957239582395923960239612396223963239642396523966239672396823969239702397123972239732397423975239762397723978239792398023981239822398323984239852398623987239882398923990239912399223993239942399523996239972399823999240002400124002240032400424005240062400724008240092401024011240122401324014240152401624017240182401924020240212402224023240242402524026240272402824029240302403124032240332403424035240362403724038240392404024041240422404324044240452404624047240482404924050240512405224053240542405524056240572405824059240602406124062240632406424065240662406724068240692407024071240722407324074240752407624077240782407924080240812408224083240842408524086240872408824089240902409124092240932409424095240962409724098240992410024101241022410324104241052410624107241082410924110241112411224113241142411524116241172411824119241202412124122241232412424125241262412724128241292413024131241322413324134241352413624137241382413924140241412414224143241442414524146241472414824149241502415124152241532415424155241562415724158241592416024161241622416324164241652416624167241682416924170241712417224173241742417524176241772417824179241802418124182241832418424185241862418724188241892419024191241922419324194241952419624197241982419924200242012420224203242042420524206242072420824209242102421124212242132421424215242162421724218242192422024221242222422324224242252422624227242282422924230242312423224233242342423524236242372423824239242402424124242242432424424245242462424724248242492425024251242522425324254242552425624257242582425924260242612426224263242642426524266242672426824269242702427124272242732427424275242762427724278242792428024281242822428324284242852428624287242882428924290242912429224293242942429524296242972429824299243002430124302243032430424305243062430724308243092431024311243122431324314243152431624317243182431924320243212432224323243242432524326243272432824329243302433124332243332433424335243362433724338243392434024341243422434324344243452434624347243482434924350243512435224353243542435524356243572435824359243602436124362243632436424365243662436724368243692437024371243722437324374243752437624377243782437924380243812438224383243842438524386243872438824389243902439124392243932439424395243962439724398243992440024401244022440324404244052440624407244082440924410244112441224413244142441524416244172441824419244202442124422244232442424425244262442724428244292443024431244322443324434244352443624437244382443924440244412444224443244442444524446244472444824449244502445124452244532445424455244562445724458244592446024461244622446324464244652446624467244682446924470244712447224473244742447524476244772447824479244802448124482244832448424485244862448724488244892449024491244922449324494244952449624497244982449924500245012450224503245042450524506245072450824509245102451124512245132451424515245162451724518245192452024521245222452324524245252452624527245282452924530245312453224533245342453524536245372453824539245402454124542245432454424545245462454724548245492455024551245522455324554245552455624557245582455924560245612456224563245642456524566245672456824569245702457124572245732457424575245762457724578245792458024581245822458324584245852458624587245882458924590245912459224593245942459524596245972459824599246002460124602246032460424605246062460724608246092461024611246122461324614246152461624617246182461924620246212462224623246242462524626246272462824629246302463124632246332463424635246362463724638246392464024641246422464324644246452464624647246482464924650246512465224653246542465524656246572465824659246602466124662246632466424665246662466724668246692467024671246722467324674246752467624677246782467924680246812468224683246842468524686246872468824689246902469124692246932469424695246962469724698246992470024701247022470324704247052470624707247082470924710247112471224713247142471524716247172471824719247202472124722247232472424725247262472724728247292473024731247322473324734247352473624737247382473924740247412474224743247442474524746247472474824749247502475124752247532475424755247562475724758247592476024761247622476324764247652476624767247682476924770247712477224773247742477524776247772477824779247802478124782247832478424785247862478724788247892479024791247922479324794247952479624797247982479924800248012480224803248042480524806248072480824809248102481124812248132481424815248162481724818248192482024821248222482324824248252482624827248282482924830248312483224833248342483524836248372483824839248402484124842248432484424845248462484724848248492485024851248522485324854248552485624857248582485924860248612486224863248642486524866248672486824869248702487124872248732487424875248762487724878248792488024881248822488324884248852488624887248882488924890248912489224893248942489524896248972489824899249002490124902249032490424905249062490724908249092491024911249122491324914249152491624917249182491924920249212492224923249242492524926249272492824929249302493124932249332493424935249362493724938249392494024941249422494324944249452494624947249482494924950249512495224953249542495524956249572495824959249602496124962249632496424965249662496724968249692497024971249722497324974249752497624977249782497924980249812498224983249842498524986249872498824989249902499124992249932499424995249962499724998249992500025001250022500325004250052500625007250082500925010250112501225013250142501525016250172501825019250202502125022250232502425025250262502725028250292503025031250322503325034250352503625037250382503925040250412504225043250442504525046250472504825049250502505125052250532505425055250562505725058250592506025061250622506325064250652506625067250682506925070250712507225073250742507525076250772507825079250802508125082250832508425085250862508725088250892509025091250922509325094250952509625097250982509925100251012510225103251042510525106251072510825109251102511125112251132511425115251162511725118251192512025121251222512325124251252512625127251282512925130251312513225133251342513525136251372513825139251402514125142251432514425145251462514725148251492515025151251522515325154251552515625157251582515925160251612516225163251642516525166251672516825169251702517125172251732517425175251762517725178251792518025181251822518325184251852518625187251882518925190251912519225193251942519525196251972519825199252002520125202252032520425205252062520725208252092521025211252122521325214252152521625217252182521925220252212522225223252242522525226252272522825229252302523125232252332523425235252362523725238252392524025241252422524325244252452524625247252482524925250252512525225253252542525525256252572525825259252602526125262252632526425265252662526725268252692527025271252722527325274252752527625277252782527925280252812528225283252842528525286252872528825289252902529125292252932529425295252962529725298252992530025301253022530325304253052530625307253082530925310253112531225313253142531525316253172531825319253202532125322253232532425325253262532725328253292533025331253322533325334253352533625337253382533925340253412534225343253442534525346253472534825349253502535125352253532535425355253562535725358253592536025361253622536325364253652536625367253682536925370253712537225373253742537525376253772537825379253802538125382253832538425385253862538725388253892539025391253922539325394253952539625397253982539925400254012540225403254042540525406254072540825409254102541125412254132541425415254162541725418254192542025421254222542325424254252542625427254282542925430254312543225433254342543525436254372543825439254402544125442254432544425445254462544725448254492545025451254522545325454254552545625457254582545925460254612546225463254642546525466254672546825469254702547125472254732547425475254762547725478254792548025481254822548325484254852548625487254882548925490254912549225493254942549525496254972549825499255002550125502255032550425505255062550725508255092551025511255122551325514255152551625517255182551925520255212552225523255242552525526255272552825529255302553125532255332553425535255362553725538255392554025541255422554325544255452554625547255482554925550255512555225553255542555525556255572555825559255602556125562255632556425565255662556725568255692557025571255722557325574255752557625577255782557925580255812558225583255842558525586255872558825589255902559125592255932559425595255962559725598255992560025601256022560325604256052560625607256082560925610256112561225613256142561525616256172561825619256202562125622256232562425625256262562725628256292563025631256322563325634256352563625637256382563925640256412564225643256442564525646256472564825649256502565125652256532565425655256562565725658256592566025661256622566325664256652566625667256682566925670256712567225673256742567525676256772567825679256802568125682256832568425685256862568725688256892569025691256922569325694256952569625697256982569925700257012570225703257042570525706257072570825709257102571125712257132571425715257162571725718257192572025721257222572325724257252572625727257282572925730257312573225733257342573525736257372573825739257402574125742257432574425745257462574725748257492575025751257522575325754257552575625757257582575925760257612576225763257642576525766257672576825769257702577125772257732577425775257762577725778257792578025781257822578325784257852578625787257882578925790257912579225793257942579525796257972579825799258002580125802258032580425805258062580725808258092581025811258122581325814258152581625817258182581925820258212582225823258242582525826258272582825829258302583125832258332583425835258362583725838258392584025841258422584325844258452584625847258482584925850258512585225853258542585525856258572585825859258602586125862258632586425865258662586725868258692587025871258722587325874258752587625877258782587925880258812588225883258842588525886258872588825889258902589125892258932589425895258962589725898258992590025901259022590325904259052590625907259082590925910259112591225913259142591525916259172591825919259202592125922259232592425925259262592725928259292593025931259322593325934259352593625937259382593925940259412594225943259442594525946259472594825949259502595125952259532595425955259562595725958259592596025961259622596325964259652596625967259682596925970259712597225973259742597525976259772597825979259802598125982259832598425985259862598725988259892599025991259922599325994259952599625997259982599926000260012600226003260042600526006260072600826009260102601126012260132601426015260162601726018260192602026021260222602326024260252602626027260282602926030260312603226033260342603526036260372603826039260402604126042260432604426045260462604726048260492605026051260522605326054260552605626057260582605926060260612606226063260642606526066260672606826069260702607126072260732607426075260762607726078260792608026081260822608326084260852608626087260882608926090260912609226093260942609526096260972609826099261002610126102261032610426105261062610726108261092611026111261122611326114261152611626117261182611926120261212612226123261242612526126261272612826129261302613126132261332613426135261362613726138261392614026141261422614326144261452614626147261482614926150261512615226153261542615526156261572615826159261602616126162261632616426165261662616726168261692617026171261722617326174261752617626177261782617926180261812618226183261842618526186261872618826189261902619126192261932619426195261962619726198261992620026201262022620326204262052620626207262082620926210262112621226213262142621526216262172621826219262202622126222262232622426225262262622726228262292623026231262322623326234262352623626237262382623926240262412624226243262442624526246262472624826249262502625126252262532625426255262562625726258262592626026261262622626326264262652626626267262682626926270262712627226273262742627526276262772627826279262802628126282262832628426285262862628726288262892629026291262922629326294262952629626297262982629926300263012630226303263042630526306263072630826309263102631126312263132631426315263162631726318263192632026321263222632326324263252632626327263282632926330263312633226333263342633526336263372633826339263402634126342263432634426345263462634726348263492635026351263522635326354263552635626357263582635926360263612636226363263642636526366263672636826369263702637126372263732637426375263762637726378263792638026381263822638326384263852638626387263882638926390263912639226393263942639526396263972639826399264002640126402264032640426405264062640726408264092641026411264122641326414264152641626417264182641926420264212642226423264242642526426264272642826429264302643126432264332643426435264362643726438264392644026441264422644326444264452644626447264482644926450264512645226453264542645526456264572645826459264602646126462264632646426465264662646726468264692647026471264722647326474264752647626477264782647926480264812648226483264842648526486264872648826489264902649126492264932649426495264962649726498264992650026501265022650326504265052650626507265082650926510265112651226513265142651526516265172651826519265202652126522265232652426525265262652726528265292653026531265322653326534265352653626537265382653926540265412654226543265442654526546265472654826549265502655126552265532655426555265562655726558265592656026561265622656326564265652656626567265682656926570265712657226573265742657526576265772657826579265802658126582265832658426585265862658726588265892659026591265922659326594265952659626597265982659926600266012660226603266042660526606266072660826609266102661126612266132661426615266162661726618266192662026621266222662326624266252662626627266282662926630266312663226633266342663526636266372663826639266402664126642266432664426645266462664726648266492665026651266522665326654266552665626657266582665926660266612666226663266642666526666266672666826669266702667126672266732667426675266762667726678266792668026681266822668326684266852668626687266882668926690266912669226693266942669526696266972669826699267002670126702267032670426705267062670726708267092671026711267122671326714267152671626717267182671926720267212672226723267242672526726267272672826729267302673126732267332673426735267362673726738267392674026741267422674326744267452674626747267482674926750267512675226753267542675526756267572675826759267602676126762267632676426765267662676726768267692677026771267722677326774267752677626777267782677926780267812678226783267842678526786267872678826789267902679126792267932679426795267962679726798267992680026801268022680326804268052680626807268082680926810268112681226813268142681526816268172681826819268202682126822268232682426825268262682726828268292683026831268322683326834268352683626837268382683926840268412684226843268442684526846268472684826849268502685126852268532685426855268562685726858268592686026861268622686326864268652686626867268682686926870268712687226873268742687526876268772687826879268802688126882268832688426885268862688726888268892689026891268922689326894268952689626897268982689926900269012690226903269042690526906269072690826909269102691126912269132691426915269162691726918269192692026921269222692326924269252692626927269282692926930269312693226933269342693526936269372693826939269402694126942269432694426945269462694726948269492695026951269522695326954269552695626957269582695926960269612696226963269642696526966269672696826969269702697126972269732697426975269762697726978269792698026981269822698326984269852698626987269882698926990269912699226993269942699526996269972699826999270002700127002270032700427005270062700727008270092701027011270122701327014270152701627017270182701927020270212702227023270242702527026270272702827029270302703127032270332703427035270362703727038270392704027041270422704327044270452704627047270482704927050270512705227053270542705527056270572705827059270602706127062270632706427065270662706727068270692707027071270722707327074270752707627077270782707927080270812708227083270842708527086270872708827089270902709127092270932709427095270962709727098270992710027101271022710327104271052710627107271082710927110271112711227113271142711527116271172711827119271202712127122271232712427125271262712727128271292713027131271322713327134271352713627137271382713927140271412714227143271442714527146271472714827149271502715127152271532715427155271562715727158271592716027161271622716327164271652716627167271682716927170271712717227173271742717527176271772717827179271802718127182271832718427185271862718727188271892719027191271922719327194271952719627197271982719927200272012720227203272042720527206272072720827209272102721127212272132721427215272162721727218272192722027221272222722327224272252722627227272282722927230272312723227233272342723527236272372723827239272402724127242272432724427245272462724727248272492725027251272522725327254272552725627257272582725927260272612726227263272642726527266272672726827269272702727127272272732727427275272762727727278272792728027281272822728327284272852728627287272882728927290272912729227293272942729527296272972729827299273002730127302273032730427305273062730727308273092731027311273122731327314273152731627317273182731927320273212732227323273242732527326273272732827329273302733127332273332733427335273362733727338273392734027341273422734327344273452734627347273482734927350273512735227353273542735527356273572735827359273602736127362273632736427365273662736727368273692737027371273722737327374273752737627377273782737927380273812738227383273842738527386273872738827389273902739127392273932739427395273962739727398273992740027401274022740327404274052740627407274082740927410274112741227413274142741527416274172741827419274202742127422274232742427425274262742727428274292743027431274322743327434274352743627437274382743927440274412744227443274442744527446274472744827449274502745127452274532745427455274562745727458274592746027461274622746327464274652746627467274682746927470274712747227473274742747527476274772747827479274802748127482274832748427485274862748727488274892749027491274922749327494274952749627497274982749927500275012750227503275042750527506275072750827509275102751127512275132751427515275162751727518275192752027521275222752327524275252752627527275282752927530275312753227533275342753527536275372753827539275402754127542275432754427545275462754727548275492755027551275522755327554275552755627557275582755927560275612756227563275642756527566275672756827569275702757127572275732757427575275762757727578275792758027581275822758327584275852758627587275882758927590275912759227593275942759527596275972759827599276002760127602276032760427605276062760727608276092761027611276122761327614276152761627617276182761927620276212762227623276242762527626276272762827629276302763127632276332763427635276362763727638276392764027641276422764327644276452764627647276482764927650276512765227653276542765527656276572765827659276602766127662276632766427665276662766727668276692767027671276722767327674276752767627677276782767927680276812768227683276842768527686276872768827689276902769127692276932769427695276962769727698276992770027701277022770327704277052770627707277082770927710277112771227713277142771527716277172771827719277202772127722277232772427725277262772727728277292773027731277322773327734277352773627737277382773927740277412774227743277442774527746277472774827749277502775127752277532775427755277562775727758277592776027761277622776327764277652776627767277682776927770277712777227773277742777527776277772777827779277802778127782277832778427785277862778727788277892779027791277922779327794277952779627797277982779927800278012780227803278042780527806278072780827809278102781127812278132781427815278162781727818278192782027821278222782327824278252782627827278282782927830278312783227833278342783527836278372783827839278402784127842278432784427845278462784727848278492785027851278522785327854278552785627857278582785927860278612786227863278642786527866278672786827869278702787127872278732787427875278762787727878278792788027881278822788327884278852788627887278882788927890278912789227893278942789527896278972789827899279002790127902279032790427905279062790727908279092791027911279122791327914279152791627917279182791927920279212792227923279242792527926279272792827929279302793127932279332793427935279362793727938279392794027941279422794327944279452794627947279482794927950279512795227953279542795527956279572795827959279602796127962279632796427965279662796727968279692797027971279722797327974279752797627977279782797927980279812798227983279842798527986279872798827989279902799127992279932799427995279962799727998279992800028001280022800328004280052800628007280082800928010280112801228013280142801528016280172801828019280202802128022280232802428025280262802728028280292803028031280322803328034280352803628037280382803928040280412804228043280442804528046280472804828049280502805128052280532805428055280562805728058280592806028061280622806328064280652806628067280682806928070280712807228073280742807528076280772807828079280802808128082280832808428085280862808728088280892809028091280922809328094280952809628097280982809928100281012810228103281042810528106281072810828109281102811128112281132811428115281162811728118281192812028121281222812328124281252812628127281282812928130281312813228133281342813528136281372813828139281402814128142281432814428145281462814728148281492815028151281522815328154281552815628157281582815928160281612816228163281642816528166281672816828169281702817128172281732817428175281762817728178281792818028181281822818328184281852818628187281882818928190281912819228193281942819528196281972819828199282002820128202282032820428205282062820728208282092821028211282122821328214282152821628217282182821928220282212822228223282242822528226282272822828229282302823128232282332823428235282362823728238282392824028241282422824328244282452824628247282482824928250282512825228253282542825528256282572825828259282602826128262282632826428265282662826728268282692827028271282722827328274282752827628277282782827928280282812828228283282842828528286282872828828289282902829128292282932829428295282962829728298282992830028301283022830328304283052830628307283082830928310283112831228313283142831528316283172831828319283202832128322283232832428325283262832728328283292833028331283322833328334283352833628337283382833928340283412834228343283442834528346283472834828349283502835128352283532835428355283562835728358283592836028361283622836328364283652836628367283682836928370283712837228373283742837528376283772837828379283802838128382283832838428385283862838728388283892839028391283922839328394283952839628397283982839928400284012840228403284042840528406284072840828409284102841128412284132841428415284162841728418284192842028421284222842328424284252842628427284282842928430284312843228433284342843528436284372843828439284402844128442284432844428445284462844728448284492845028451284522845328454284552845628457284582845928460284612846228463284642846528466284672846828469284702847128472284732847428475284762847728478284792848028481284822848328484284852848628487284882848928490284912849228493284942849528496284972849828499285002850128502285032850428505285062850728508285092851028511285122851328514285152851628517285182851928520285212852228523285242852528526285272852828529285302853128532285332853428535285362853728538285392854028541285422854328544285452854628547285482854928550285512855228553285542855528556285572855828559285602856128562285632856428565285662856728568285692857028571285722857328574285752857628577285782857928580285812858228583285842858528586285872858828589285902859128592285932859428595285962859728598285992860028601286022860328604286052860628607286082860928610286112861228613286142861528616286172861828619286202862128622286232862428625286262862728628286292863028631286322863328634286352863628637286382863928640286412864228643286442864528646286472864828649286502865128652286532865428655286562865728658286592866028661286622866328664286652866628667286682866928670286712867228673286742867528676286772867828679286802868128682286832868428685286862868728688286892869028691286922869328694286952869628697286982869928700287012870228703287042870528706287072870828709287102871128712287132871428715287162871728718287192872028721287222872328724287252872628727287282872928730287312873228733287342873528736287372873828739287402874128742287432874428745287462874728748287492875028751287522875328754287552875628757287582875928760287612876228763287642876528766287672876828769287702877128772287732877428775287762877728778287792878028781287822878328784287852878628787287882878928790287912879228793287942879528796287972879828799288002880128802288032880428805288062880728808288092881028811288122881328814288152881628817288182881928820288212882228823288242882528826288272882828829288302883128832288332883428835288362883728838288392884028841288422884328844288452884628847288482884928850288512885228853288542885528856288572885828859288602886128862288632886428865288662886728868288692887028871288722887328874288752887628877288782887928880288812888228883288842888528886288872888828889288902889128892288932889428895288962889728898288992890028901289022890328904289052890628907289082890928910289112891228913289142891528916289172891828919289202892128922289232892428925289262892728928289292893028931289322893328934289352893628937289382893928940289412894228943289442894528946289472894828949289502895128952289532895428955289562895728958289592896028961289622896328964289652896628967289682896928970289712897228973289742897528976289772897828979289802898128982289832898428985289862898728988289892899028991289922899328994289952899628997289982899929000290012900229003290042900529006290072900829009290102901129012290132901429015290162901729018290192902029021290222902329024290252902629027290282902929030290312903229033290342903529036290372903829039290402904129042290432904429045290462904729048290492905029051290522905329054290552905629057290582905929060290612906229063290642906529066290672906829069290702907129072290732907429075290762907729078290792908029081290822908329084290852908629087290882908929090290912909229093290942909529096290972909829099291002910129102291032910429105291062910729108291092911029111291122911329114291152911629117291182911929120291212912229123291242912529126291272912829129291302913129132291332913429135291362913729138291392914029141291422914329144291452914629147291482914929150291512915229153291542915529156291572915829159291602916129162291632916429165291662916729168291692917029171291722917329174291752917629177291782917929180291812918229183291842918529186291872918829189291902919129192291932919429195291962919729198291992920029201292022920329204292052920629207292082920929210292112921229213292142921529216292172921829219292202922129222292232922429225292262922729228292292923029231292322923329234292352923629237292382923929240292412924229243292442924529246292472924829249292502925129252292532925429255292562925729258292592926029261292622926329264292652926629267292682926929270292712927229273292742927529276292772927829279292802928129282292832928429285292862928729288292892929029291292922929329294292952929629297292982929929300293012930229303293042930529306293072930829309293102931129312293132931429315293162931729318293192932029321293222932329324293252932629327293282932929330293312933229333293342933529336293372933829339293402934129342293432934429345293462934729348293492935029351293522935329354293552935629357293582935929360293612936229363293642936529366293672936829369293702937129372293732937429375293762937729378293792938029381293822938329384293852938629387293882938929390293912939229393293942939529396293972939829399294002940129402294032940429405294062940729408294092941029411294122941329414294152941629417294182941929420294212942229423294242942529426294272942829429294302943129432294332943429435294362943729438294392944029441294422944329444294452944629447294482944929450294512945229453294542945529456294572945829459294602946129462294632946429465294662946729468294692947029471294722947329474294752947629477294782947929480294812948229483294842948529486294872948829489294902949129492294932949429495294962949729498294992950029501295022950329504295052950629507295082950929510295112951229513295142951529516295172951829519295202952129522295232952429525295262952729528295292953029531295322953329534295352953629537295382953929540295412954229543295442954529546295472954829549295502955129552295532955429555295562955729558295592956029561295622956329564295652956629567295682956929570295712957229573295742957529576295772957829579295802958129582295832958429585295862958729588295892959029591295922959329594295952959629597295982959929600296012960229603296042960529606296072960829609296102961129612296132961429615296162961729618296192962029621296222962329624296252962629627296282962929630296312963229633296342963529636296372963829639296402964129642296432964429645296462964729648296492965029651296522965329654296552965629657296582965929660296612966229663296642966529666296672966829669296702967129672296732967429675296762967729678296792968029681296822968329684296852968629687296882968929690296912969229693296942969529696296972969829699297002970129702297032970429705297062970729708297092971029711297122971329714297152971629717297182971929720297212972229723297242972529726297272972829729297302973129732297332973429735297362973729738297392974029741297422974329744297452974629747297482974929750297512975229753297542975529756297572975829759297602976129762297632976429765297662976729768297692977029771297722977329774297752977629777297782977929780297812978229783297842978529786297872978829789297902979129792297932979429795297962979729798297992980029801298022980329804298052980629807298082980929810298112981229813298142981529816298172981829819298202982129822298232982429825298262982729828298292983029831298322983329834298352983629837298382983929840298412984229843298442984529846298472984829849298502985129852298532985429855298562985729858298592986029861298622986329864298652986629867298682986929870298712987229873298742987529876298772987829879298802988129882298832988429885298862988729888298892989029891298922989329894298952989629897298982989929900299012990229903299042990529906299072990829909299102991129912299132991429915299162991729918299192992029921299222992329924299252992629927299282992929930299312993229933299342993529936299372993829939299402994129942299432994429945299462994729948299492995029951299522995329954299552995629957299582995929960299612996229963299642996529966299672996829969299702997129972299732997429975299762997729978299792998029981299822998329984299852998629987299882998929990299912999229993299942999529996299972999829999300003000130002300033000430005300063000730008300093001030011300123001330014300153001630017300183001930020300213002230023300243002530026300273002830029300303003130032300333003430035300363003730038300393004030041300423004330044300453004630047300483004930050300513005230053300543005530056300573005830059300603006130062300633006430065300663006730068300693007030071300723007330074300753007630077300783007930080300813008230083300843008530086300873008830089300903009130092300933009430095300963009730098300993010030101301023010330104301053010630107301083010930110301113011230113301143011530116301173011830119301203012130122301233012430125301263012730128301293013030131301323013330134301353013630137301383013930140301413014230143301443014530146301473014830149301503015130152301533015430155301563015730158301593016030161301623016330164301653016630167301683016930170301713017230173301743017530176301773017830179301803018130182301833018430185301863018730188301893019030191301923019330194301953019630197301983019930200302013020230203302043020530206302073020830209302103021130212302133021430215302163021730218302193022030221302223022330224302253022630227302283022930230302313023230233302343023530236302373023830239302403024130242302433024430245302463024730248302493025030251302523025330254302553025630257302583025930260302613026230263302643026530266302673026830269302703027130272302733027430275302763027730278302793028030281302823028330284302853028630287302883028930290302913029230293302943029530296302973029830299303003030130302303033030430305303063030730308303093031030311303123031330314303153031630317303183031930320303213032230323303243032530326303273032830329303303033130332303333033430335303363033730338303393034030341303423034330344303453034630347303483034930350303513035230353303543035530356303573035830359303603036130362303633036430365303663036730368303693037030371303723037330374303753037630377303783037930380303813038230383303843038530386303873038830389303903039130392303933039430395303963039730398303993040030401304023040330404304053040630407304083040930410304113041230413304143041530416304173041830419304203042130422304233042430425304263042730428304293043030431304323043330434304353043630437304383043930440304413044230443304443044530446304473044830449304503045130452304533045430455304563045730458304593046030461304623046330464304653046630467304683046930470304713047230473304743047530476304773047830479304803048130482304833048430485304863048730488304893049030491304923049330494304953049630497304983049930500305013050230503305043050530506305073050830509305103051130512305133051430515305163051730518305193052030521305223052330524305253052630527305283052930530305313053230533305343053530536305373053830539305403054130542305433054430545305463054730548305493055030551305523055330554305553055630557305583055930560305613056230563305643056530566305673056830569305703057130572305733057430575305763057730578305793058030581305823058330584305853058630587305883058930590305913059230593305943059530596305973059830599306003060130602306033060430605306063060730608306093061030611306123061330614306153061630617306183061930620306213062230623306243062530626306273062830629306303063130632306333063430635306363063730638306393064030641306423064330644306453064630647306483064930650306513065230653306543065530656306573065830659306603066130662306633066430665306663066730668306693067030671306723067330674306753067630677306783067930680306813068230683306843068530686306873068830689306903069130692306933069430695306963069730698306993070030701307023070330704307053070630707307083070930710307113071230713307143071530716307173071830719307203072130722307233072430725307263072730728307293073030731307323073330734307353073630737307383073930740307413074230743307443074530746307473074830749307503075130752307533075430755307563075730758307593076030761307623076330764307653076630767307683076930770307713077230773307743077530776307773077830779307803078130782307833078430785307863078730788307893079030791307923079330794307953079630797307983079930800308013080230803308043080530806308073080830809308103081130812308133081430815308163081730818308193082030821308223082330824308253082630827308283082930830308313083230833308343083530836308373083830839308403084130842308433084430845308463084730848308493085030851308523085330854308553085630857308583085930860308613086230863308643086530866308673086830869308703087130872308733087430875308763087730878308793088030881308823088330884308853088630887308883088930890308913089230893308943089530896308973089830899309003090130902309033090430905309063090730908309093091030911309123091330914309153091630917309183091930920309213092230923309243092530926309273092830929309303093130932309333093430935309363093730938309393094030941309423094330944309453094630947309483094930950309513095230953309543095530956309573095830959309603096130962309633096430965309663096730968309693097030971309723097330974309753097630977309783097930980309813098230983309843098530986309873098830989309903099130992309933099430995309963099730998309993100031001310023100331004310053100631007310083100931010310113101231013310143101531016310173101831019310203102131022310233102431025310263102731028310293103031031310323103331034310353103631037310383103931040310413104231043310443104531046310473104831049310503105131052310533105431055310563105731058310593106031061310623106331064310653106631067310683106931070310713107231073310743107531076310773107831079310803108131082310833108431085310863108731088310893109031091310923109331094310953109631097310983109931100311013110231103311043110531106311073110831109311103111131112311133111431115311163111731118311193112031121311223112331124311253112631127311283112931130311313113231133311343113531136311373113831139311403114131142311433114431145311463114731148311493115031151311523115331154311553115631157311583115931160311613116231163311643116531166311673116831169311703117131172311733117431175311763117731178311793118031181311823118331184311853118631187311883118931190311913119231193311943119531196311973119831199312003120131202312033120431205312063120731208312093121031211312123121331214312153121631217312183121931220312213122231223312243122531226312273122831229312303123131232312333123431235312363123731238312393124031241312423124331244312453124631247312483124931250312513125231253312543125531256312573125831259312603126131262312633126431265312663126731268312693127031271312723127331274312753127631277312783127931280312813128231283312843128531286312873128831289312903129131292312933129431295312963129731298312993130031301313023130331304313053130631307313083130931310313113131231313313143131531316313173131831319313203132131322313233132431325313263132731328313293133031331313323133331334313353133631337313383133931340313413134231343313443134531346313473134831349313503135131352313533135431355313563135731358313593136031361313623136331364313653136631367313683136931370313713137231373313743137531376313773137831379313803138131382313833138431385313863138731388313893139031391313923139331394313953139631397313983139931400314013140231403314043140531406314073140831409314103141131412314133141431415314163141731418314193142031421314223142331424314253142631427314283142931430314313143231433314343143531436314373143831439314403144131442314433144431445314463144731448314493145031451314523145331454314553145631457314583145931460314613146231463314643146531466314673146831469314703147131472314733147431475314763147731478314793148031481314823148331484314853148631487314883148931490314913149231493314943149531496314973149831499315003150131502315033150431505315063150731508315093151031511315123151331514315153151631517315183151931520315213152231523315243152531526315273152831529315303153131532315333153431535315363153731538315393154031541315423154331544315453154631547315483154931550315513155231553315543155531556315573155831559315603156131562315633156431565315663156731568315693157031571315723157331574315753157631577315783157931580315813158231583315843158531586315873158831589315903159131592315933159431595315963159731598315993160031601316023160331604316053160631607316083160931610316113161231613316143161531616316173161831619316203162131622316233162431625316263162731628316293163031631316323163331634316353163631637316383163931640316413164231643316443164531646316473164831649316503165131652316533165431655316563165731658316593166031661316623166331664316653166631667316683166931670316713167231673316743167531676316773167831679316803168131682316833168431685316863168731688316893169031691316923169331694316953169631697316983169931700317013170231703317043170531706317073170831709317103171131712317133171431715317163171731718317193172031721317223172331724317253172631727317283172931730317313173231733317343173531736317373173831739317403174131742317433174431745317463174731748317493175031751317523175331754317553175631757317583175931760317613176231763317643176531766317673176831769317703177131772317733177431775317763177731778317793178031781317823178331784317853178631787317883178931790317913179231793317943179531796317973179831799318003180131802318033180431805318063180731808318093181031811318123181331814318153181631817318183181931820318213182231823318243182531826318273182831829318303183131832318333183431835318363183731838318393184031841318423184331844318453184631847318483184931850318513185231853318543185531856318573185831859318603186131862318633186431865318663186731868318693187031871318723187331874318753187631877318783187931880318813188231883318843188531886318873188831889318903189131892318933189431895318963189731898318993190031901319023190331904319053190631907319083190931910319113191231913319143191531916319173191831919319203192131922319233192431925319263192731928319293193031931319323193331934319353193631937319383193931940319413194231943319443194531946319473194831949319503195131952319533195431955319563195731958319593196031961319623196331964319653196631967319683196931970319713197231973319743197531976319773197831979319803198131982319833198431985319863198731988319893199031991319923199331994319953199631997319983199932000320013200232003320043200532006320073200832009320103201132012320133201432015320163201732018320193202032021320223202332024320253202632027320283202932030320313203232033320343203532036320373203832039320403204132042320433204432045320463204732048320493205032051320523205332054320553205632057320583205932060320613206232063320643206532066320673206832069320703207132072320733207432075320763207732078320793208032081320823208332084320853208632087320883208932090320913209232093320943209532096320973209832099321003210132102321033210432105321063210732108321093211032111321123211332114321153211632117321183211932120321213212232123321243212532126321273212832129321303213132132321333213432135321363213732138321393214032141321423214332144321453214632147321483214932150321513215232153321543215532156321573215832159321603216132162321633216432165321663216732168321693217032171321723217332174321753217632177321783217932180321813218232183321843218532186321873218832189321903219132192321933219432195321963219732198321993220032201322023220332204322053220632207322083220932210322113221232213322143221532216322173221832219322203222132222322233222432225322263222732228322293223032231322323223332234322353223632237322383223932240322413224232243322443224532246322473224832249322503225132252322533225432255322563225732258322593226032261322623226332264322653226632267322683226932270322713227232273322743227532276322773227832279322803228132282322833228432285322863228732288322893229032291322923229332294322953229632297322983229932300323013230232303323043230532306323073230832309323103231132312323133231432315323163231732318323193232032321323223232332324323253232632327323283232932330323313233232333323343233532336323373233832339323403234132342323433234432345323463234732348323493235032351323523235332354323553235632357323583235932360323613236232363323643236532366323673236832369323703237132372323733237432375323763237732378323793238032381323823238332384323853238632387323883238932390323913239232393323943239532396323973239832399324003240132402324033240432405324063240732408324093241032411324123241332414324153241632417324183241932420324213242232423324243242532426324273242832429324303243132432324333243432435324363243732438324393244032441324423244332444324453244632447324483244932450324513245232453324543245532456324573245832459324603246132462324633246432465324663246732468324693247032471324723247332474324753247632477324783247932480324813248232483324843248532486324873248832489324903249132492324933249432495324963249732498324993250032501325023250332504325053250632507325083250932510325113251232513325143251532516325173251832519325203252132522325233252432525325263252732528325293253032531325323253332534325353253632537325383253932540325413254232543325443254532546325473254832549325503255132552325533255432555325563255732558325593256032561325623256332564325653256632567325683256932570325713257232573325743257532576325773257832579325803258132582325833258432585325863258732588325893259032591325923259332594325953259632597325983259932600326013260232603326043260532606326073260832609326103261132612326133261432615326163261732618326193262032621326223262332624326253262632627326283262932630326313263232633326343263532636326373263832639326403264132642326433264432645326463264732648326493265032651326523265332654326553265632657326583265932660326613266232663326643266532666326673266832669326703267132672326733267432675326763267732678326793268032681326823268332684326853268632687326883268932690326913269232693326943269532696326973269832699327003270132702327033270432705327063270732708327093271032711327123271332714327153271632717327183271932720327213272232723327243272532726327273272832729327303273132732327333273432735327363273732738327393274032741327423274332744327453274632747327483274932750327513275232753327543275532756327573275832759327603276132762327633276432765327663276732768327693277032771327723277332774327753277632777327783277932780327813278232783327843278532786327873278832789327903279132792327933279432795327963279732798327993280032801328023280332804328053280632807328083280932810328113281232813328143281532816328173281832819328203282132822328233282432825328263282732828328293283032831328323283332834328353283632837328383283932840328413284232843328443284532846328473284832849328503285132852328533285432855328563285732858328593286032861328623286332864328653286632867328683286932870328713287232873328743287532876328773287832879328803288132882328833288432885328863288732888328893289032891328923289332894328953289632897328983289932900329013290232903329043290532906329073290832909329103291132912329133291432915329163291732918329193292032921329223292332924329253292632927329283292932930329313293232933329343293532936329373293832939329403294132942329433294432945329463294732948329493295032951329523295332954329553295632957329583295932960329613296232963329643296532966329673296832969329703297132972329733297432975329763297732978329793298032981329823298332984329853298632987329883298932990329913299232993329943299532996329973299832999330003300133002330033300433005330063300733008330093301033011330123301333014330153301633017330183301933020330213302233023330243302533026330273302833029330303303133032330333303433035330363303733038330393304033041330423304333044330453304633047330483304933050330513305233053330543305533056330573305833059330603306133062330633306433065330663306733068330693307033071330723307333074330753307633077330783307933080330813308233083330843308533086330873308833089330903309133092330933309433095330963309733098330993310033101331023310333104331053310633107331083310933110331113311233113331143311533116331173311833119331203312133122331233312433125331263312733128331293313033131331323313333134331353313633137331383313933140331413314233143331443314533146331473314833149331503315133152331533315433155331563315733158331593316033161331623316333164331653316633167331683316933170331713317233173331743317533176331773317833179331803318133182331833318433185331863318733188331893319033191331923319333194331953319633197331983319933200332013320233203332043320533206332073320833209332103321133212332133321433215332163321733218332193322033221332223322333224332253322633227332283322933230332313323233233332343323533236332373323833239332403324133242332433324433245332463324733248332493325033251332523325333254332553325633257332583325933260332613326233263332643326533266332673326833269332703327133272332733327433275332763327733278332793328033281332823328333284332853328633287332883328933290332913329233293332943329533296332973329833299333003330133302333033330433305333063330733308333093331033311333123331333314333153331633317333183331933320333213332233323333243332533326333273332833329333303333133332333333333433335333363333733338333393334033341333423334333344333453334633347333483334933350333513335233353333543335533356333573335833359333603336133362333633336433365333663336733368333693337033371333723337333374333753337633377333783337933380333813338233383333843338533386333873338833389333903339133392333933339433395333963339733398333993340033401334023340333404334053340633407334083340933410334113341233413334143341533416334173341833419334203342133422334233342433425334263342733428334293343033431334323343333434334353343633437334383343933440334413344233443334443344533446334473344833449334503345133452334533345433455334563345733458334593346033461334623346333464334653346633467334683346933470334713347233473334743347533476334773347833479334803348133482334833348433485334863348733488334893349033491334923349333494334953349633497334983349933500335013350233503335043350533506335073350833509335103351133512335133351433515335163351733518335193352033521335223352333524335253352633527335283352933530335313353233533335343353533536335373353833539335403354133542335433354433545335463354733548335493355033551335523355333554335553355633557335583355933560335613356233563335643356533566335673356833569335703357133572335733357433575335763357733578335793358033581335823358333584335853358633587335883358933590335913359233593335943359533596335973359833599336003360133602336033360433605336063360733608336093361033611336123361333614336153361633617336183361933620336213362233623336243362533626336273362833629336303363133632336333363433635336363363733638336393364033641336423364333644336453364633647336483364933650336513365233653336543365533656336573365833659336603366133662336633366433665336663366733668336693367033671336723367333674336753367633677336783367933680336813368233683336843368533686336873368833689336903369133692336933369433695336963369733698336993370033701337023370333704337053370633707337083370933710337113371233713337143371533716337173371833719337203372133722337233372433725337263372733728337293373033731337323373333734337353373633737337383373933740337413374233743337443374533746337473374833749337503375133752337533375433755337563375733758337593376033761337623376333764337653376633767337683376933770337713377233773337743377533776337773377833779337803378133782337833378433785337863378733788337893379033791337923379333794337953379633797337983379933800338013380233803338043380533806338073380833809338103381133812338133381433815338163381733818338193382033821338223382333824338253382633827338283382933830338313383233833338343383533836338373383833839338403384133842338433384433845338463384733848338493385033851338523385333854338553385633857338583385933860338613386233863338643386533866338673386833869338703387133872338733387433875338763387733878338793388033881338823388333884338853388633887338883388933890338913389233893338943389533896338973389833899339003390133902339033390433905339063390733908339093391033911339123391333914339153391633917339183391933920339213392233923339243392533926339273392833929339303393133932339333393433935339363393733938339393394033941339423394333944339453394633947339483394933950339513395233953339543395533956339573395833959339603396133962339633396433965339663396733968339693397033971339723397333974339753397633977339783397933980339813398233983339843398533986339873398833989339903399133992339933399433995339963399733998339993400034001340023400334004340053400634007340083400934010340113401234013340143401534016340173401834019340203402134022340233402434025340263402734028340293403034031340323403334034340353403634037340383403934040340413404234043340443404534046340473404834049340503405134052340533405434055340563405734058340593406034061340623406334064340653406634067340683406934070340713407234073340743407534076340773407834079340803408134082340833408434085340863408734088340893409034091340923409334094340953409634097340983409934100341013410234103341043410534106341073410834109341103411134112341133411434115341163411734118341193412034121341223412334124341253412634127341283412934130341313413234133341343413534136341373413834139341403414134142341433414434145341463414734148341493415034151341523415334154341553415634157341583415934160341613416234163341643416534166341673416834169341703417134172341733417434175341763417734178341793418034181341823418334184341853418634187341883418934190341913419234193341943419534196341973419834199342003420134202342033420434205342063420734208342093421034211342123421334214342153421634217342183421934220342213422234223342243422534226342273422834229342303423134232342333423434235342363423734238342393424034241342423424334244342453424634247342483424934250342513425234253342543425534256342573425834259342603426134262342633426434265342663426734268342693427034271342723427334274342753427634277342783427934280342813428234283342843428534286342873428834289342903429134292342933429434295342963429734298342993430034301343023430334304343053430634307343083430934310343113431234313343143431534316343173431834319343203432134322343233432434325343263432734328343293433034331343323433334334343353433634337343383433934340343413434234343343443434534346343473434834349343503435134352343533435434355343563435734358343593436034361343623436334364343653436634367343683436934370343713437234373343743437534376343773437834379343803438134382343833438434385343863438734388343893439034391343923439334394343953439634397343983439934400344013440234403344043440534406344073440834409344103441134412344133441434415344163441734418344193442034421344223442334424344253442634427344283442934430344313443234433344343443534436344373443834439344403444134442344433444434445344463444734448344493445034451344523445334454344553445634457344583445934460344613446234463344643446534466344673446834469344703447134472344733447434475344763447734478344793448034481344823448334484344853448634487344883448934490344913449234493344943449534496344973449834499345003450134502345033450434505345063450734508345093451034511345123451334514345153451634517345183451934520345213452234523345243452534526345273452834529345303453134532345333453434535345363453734538345393454034541345423454334544345453454634547345483454934550345513455234553345543455534556345573455834559345603456134562345633456434565345663456734568345693457034571345723457334574345753457634577345783457934580345813458234583345843458534586345873458834589345903459134592345933459434595345963459734598345993460034601346023460334604346053460634607346083460934610346113461234613346143461534616346173461834619346203462134622346233462434625346263462734628346293463034631346323463334634346353463634637346383463934640346413464234643346443464534646346473464834649346503465134652346533465434655346563465734658346593466034661346623466334664346653466634667346683466934670346713467234673346743467534676346773467834679346803468134682346833468434685346863468734688346893469034691346923469334694346953469634697346983469934700347013470234703347043470534706347073470834709347103471134712347133471434715347163471734718347193472034721347223472334724347253472634727347283472934730347313473234733347343473534736347373473834739347403474134742347433474434745347463474734748347493475034751347523475334754347553475634757347583475934760347613476234763347643476534766347673476834769347703477134772347733477434775347763477734778347793478034781347823478334784347853478634787347883478934790347913479234793347943479534796347973479834799348003480134802348033480434805348063480734808348093481034811348123481334814348153481634817348183481934820348213482234823348243482534826348273482834829348303483134832348333483434835348363483734838348393484034841348423484334844348453484634847348483484934850348513485234853348543485534856348573485834859348603486134862348633486434865348663486734868348693487034871348723487334874348753487634877348783487934880348813488234883348843488534886348873488834889348903489134892348933489434895348963489734898348993490034901349023490334904349053490634907349083490934910349113491234913349143491534916349173491834919349203492134922349233492434925349263492734928349293493034931349323493334934349353493634937349383493934940349413494234943349443494534946349473494834949349503495134952349533495434955349563495734958349593496034961349623496334964349653496634967349683496934970349713497234973349743497534976349773497834979349803498134982349833498434985349863498734988349893499034991349923499334994349953499634997349983499935000350013500235003350043500535006350073500835009350103501135012350133501435015350163501735018350193502035021350223502335024350253502635027350283502935030350313503235033350343503535036350373503835039350403504135042350433504435045350463504735048350493505035051350523505335054350553505635057350583505935060350613506235063350643506535066350673506835069350703507135072350733507435075350763507735078350793508035081350823508335084350853508635087350883508935090350913509235093350943509535096350973509835099351003510135102351033510435105351063510735108351093511035111351123511335114351153511635117351183511935120351213512235123351243512535126351273512835129351303513135132351333513435135351363513735138351393514035141351423514335144351453514635147351483514935150351513515235153351543515535156351573515835159351603516135162351633516435165351663516735168351693517035171351723517335174351753517635177351783517935180351813518235183351843518535186351873518835189351903519135192351933519435195351963519735198351993520035201352023520335204352053520635207352083520935210352113521235213352143521535216352173521835219352203522135222352233522435225352263522735228352293523035231352323523335234352353523635237352383523935240352413524235243352443524535246352473524835249352503525135252352533525435255352563525735258352593526035261352623526335264352653526635267352683526935270352713527235273352743527535276352773527835279352803528135282352833528435285352863528735288352893529035291352923529335294352953529635297352983529935300353013530235303353043530535306353073530835309353103531135312353133531435315353163531735318353193532035321353223532335324353253532635327353283532935330353313533235333353343533535336353373533835339353403534135342353433534435345353463534735348353493535035351353523535335354353553535635357353583535935360353613536235363353643536535366353673536835369353703537135372353733537435375353763537735378353793538035381353823538335384353853538635387353883538935390353913539235393353943539535396353973539835399354003540135402354033540435405354063540735408354093541035411354123541335414354153541635417354183541935420354213542235423354243542535426354273542835429354303543135432354333543435435354363543735438354393544035441354423544335444354453544635447354483544935450354513545235453354543545535456354573545835459354603546135462354633546435465354663546735468354693547035471354723547335474354753547635477354783547935480354813548235483354843548535486354873548835489354903549135492354933549435495354963549735498354993550035501355023550335504355053550635507355083550935510355113551235513355143551535516355173551835519355203552135522355233552435525355263552735528355293553035531355323553335534355353553635537355383553935540355413554235543355443554535546355473554835549355503555135552355533555435555355563555735558355593556035561355623556335564355653556635567355683556935570355713557235573355743557535576355773557835579355803558135582355833558435585355863558735588355893559035591355923559335594355953559635597355983559935600356013560235603356043560535606356073560835609356103561135612356133561435615356163561735618356193562035621356223562335624356253562635627356283562935630356313563235633356343563535636356373563835639356403564135642356433564435645356463564735648356493565035651356523565335654356553565635657356583565935660356613566235663356643566535666356673566835669356703567135672356733567435675356763567735678356793568035681356823568335684356853568635687356883568935690356913569235693356943569535696356973569835699357003570135702357033570435705357063570735708357093571035711357123571335714357153571635717357183571935720357213572235723357243572535726357273572835729357303573135732357333573435735357363573735738357393574035741357423574335744357453574635747357483574935750357513575235753357543575535756357573575835759357603576135762357633576435765357663576735768357693577035771357723577335774357753577635777357783577935780357813578235783357843578535786357873578835789357903579135792357933579435795357963579735798357993580035801358023580335804358053580635807358083580935810358113581235813358143581535816358173581835819358203582135822358233582435825358263582735828358293583035831358323583335834358353583635837358383583935840358413584235843358443584535846358473584835849358503585135852358533585435855358563585735858358593586035861358623586335864358653586635867358683586935870358713587235873358743587535876358773587835879358803588135882358833588435885358863588735888358893589035891358923589335894358953589635897358983589935900359013590235903359043590535906359073590835909359103591135912359133591435915359163591735918359193592035921359223592335924359253592635927359283592935930359313593235933359343593535936359373593835939359403594135942359433594435945359463594735948359493595035951359523595335954359553595635957359583595935960359613596235963359643596535966359673596835969359703597135972359733597435975359763597735978359793598035981359823598335984359853598635987359883598935990359913599235993359943599535996359973599835999360003600136002360033600436005360063600736008360093601036011360123601336014360153601636017360183601936020360213602236023360243602536026360273602836029360303603136032360333603436035360363603736038360393604036041360423604336044360453604636047360483604936050360513605236053360543605536056360573605836059360603606136062360633606436065360663606736068360693607036071360723607336074360753607636077360783607936080360813608236083360843608536086360873608836089360903609136092360933609436095360963609736098360993610036101361023610336104361053610636107361083610936110361113611236113361143611536116361173611836119361203612136122361233612436125361263612736128361293613036131361323613336134361353613636137361383613936140361413614236143361443614536146361473614836149361503615136152361533615436155361563615736158361593616036161361623616336164361653616636167361683616936170361713617236173361743617536176361773617836179361803618136182361833618436185361863618736188361893619036191361923619336194361953619636197361983619936200362013620236203362043620536206362073620836209362103621136212362133621436215362163621736218362193622036221362223622336224362253622636227362283622936230362313623236233362343623536236362373623836239362403624136242362433624436245362463624736248362493625036251362523625336254362553625636257362583625936260362613626236263362643626536266362673626836269362703627136272362733627436275362763627736278362793628036281362823628336284362853628636287362883628936290362913629236293362943629536296362973629836299363003630136302363033630436305363063630736308363093631036311363123631336314363153631636317363183631936320363213632236323363243632536326363273632836329363303633136332363333633436335363363633736338363393634036341363423634336344363453634636347363483634936350363513635236353363543635536356363573635836359363603636136362363633636436365363663636736368363693637036371363723637336374363753637636377363783637936380363813638236383363843638536386363873638836389363903639136392363933639436395363963639736398363993640036401364023640336404364053640636407364083640936410364113641236413364143641536416364173641836419364203642136422364233642436425364263642736428364293643036431364323643336434364353643636437364383643936440364413644236443364443644536446364473644836449364503645136452364533645436455364563645736458364593646036461364623646336464364653646636467364683646936470364713647236473364743647536476364773647836479364803648136482364833648436485364863648736488364893649036491364923649336494364953649636497364983649936500365013650236503365043650536506365073650836509365103651136512365133651436515365163651736518365193652036521365223652336524365253652636527365283652936530365313653236533365343653536536365373653836539365403654136542365433654436545365463654736548365493655036551365523655336554365553655636557365583655936560365613656236563365643656536566365673656836569365703657136572365733657436575365763657736578365793658036581365823658336584365853658636587365883658936590365913659236593365943659536596365973659836599366003660136602366033660436605366063660736608366093661036611366123661336614366153661636617366183661936620366213662236623366243662536626366273662836629366303663136632366333663436635366363663736638366393664036641366423664336644366453664636647366483664936650366513665236653366543665536656366573665836659366603666136662366633666436665366663666736668366693667036671366723667336674366753667636677366783667936680366813668236683366843668536686366873668836689366903669136692366933669436695366963669736698366993670036701367023670336704367053670636707367083670936710367113671236713367143671536716367173671836719367203672136722367233672436725367263672736728367293673036731367323673336734367353673636737367383673936740367413674236743367443674536746367473674836749367503675136752367533675436755367563675736758367593676036761367623676336764367653676636767367683676936770367713677236773367743677536776367773677836779367803678136782367833678436785367863678736788367893679036791367923679336794367953679636797367983679936800368013680236803368043680536806368073680836809368103681136812368133681436815368163681736818368193682036821368223682336824368253682636827368283682936830368313683236833368343683536836368373683836839368403684136842368433684436845368463684736848368493685036851368523685336854368553685636857368583685936860368613686236863368643686536866368673686836869368703687136872368733687436875368763687736878368793688036881368823688336884368853688636887368883688936890368913689236893368943689536896368973689836899369003690136902369033690436905369063690736908369093691036911369123691336914369153691636917369183691936920369213692236923369243692536926369273692836929369303693136932369333693436935369363693736938369393694036941369423694336944369453694636947369483694936950369513695236953369543695536956369573695836959369603696136962369633696436965369663696736968369693697036971369723697336974369753697636977369783697936980369813698236983369843698536986369873698836989369903699136992369933699436995369963699736998369993700037001370023700337004370053700637007370083700937010370113701237013370143701537016370173701837019370203702137022370233702437025370263702737028370293703037031370323703337034370353703637037370383703937040370413704237043370443704537046370473704837049370503705137052370533705437055370563705737058370593706037061370623706337064370653706637067370683706937070370713707237073370743707537076370773707837079370803708137082370833708437085370863708737088370893709037091370923709337094370953709637097370983709937100371013710237103371043710537106371073710837109371103711137112371133711437115371163711737118371193712037121371223712337124371253712637127371283712937130371313713237133371343713537136371373713837139371403714137142371433714437145371463714737148371493715037151371523715337154371553715637157371583715937160371613716237163371643716537166371673716837169371703717137172371733717437175371763717737178371793718037181371823718337184371853718637187371883718937190371913719237193371943719537196371973719837199372003720137202372033720437205372063720737208372093721037211372123721337214372153721637217372183721937220372213722237223372243722537226372273722837229372303723137232372333723437235372363723737238372393724037241372423724337244372453724637247372483724937250372513725237253372543725537256372573725837259372603726137262372633726437265372663726737268372693727037271372723727337274372753727637277372783727937280372813728237283372843728537286372873728837289372903729137292372933729437295372963729737298372993730037301373023730337304373053730637307373083730937310373113731237313373143731537316373173731837319373203732137322373233732437325373263732737328373293733037331373323733337334373353733637337373383733937340373413734237343373443734537346373473734837349373503735137352373533735437355373563735737358373593736037361373623736337364373653736637367373683736937370373713737237373373743737537376373773737837379373803738137382373833738437385373863738737388373893739037391373923739337394373953739637397373983739937400374013740237403374043740537406374073740837409374103741137412374133741437415374163741737418374193742037421374223742337424374253742637427374283742937430374313743237433374343743537436374373743837439374403744137442374433744437445374463744737448374493745037451374523745337454374553745637457374583745937460374613746237463374643746537466374673746837469374703747137472374733747437475374763747737478374793748037481374823748337484374853748637487374883748937490374913749237493374943749537496374973749837499375003750137502375033750437505375063750737508375093751037511375123751337514375153751637517375183751937520375213752237523375243752537526375273752837529375303753137532375333753437535375363753737538375393754037541375423754337544375453754637547375483754937550375513755237553375543755537556375573755837559375603756137562375633756437565375663756737568375693757037571375723757337574375753757637577375783757937580375813758237583375843758537586375873758837589375903759137592375933759437595375963759737598375993760037601376023760337604376053760637607376083760937610376113761237613376143761537616376173761837619376203762137622376233762437625376263762737628376293763037631376323763337634376353763637637376383763937640376413764237643376443764537646376473764837649376503765137652376533765437655376563765737658376593766037661376623766337664376653766637667376683766937670376713767237673376743767537676376773767837679376803768137682376833768437685376863768737688376893769037691376923769337694376953769637697376983769937700377013770237703377043770537706377073770837709377103771137712377133771437715377163771737718377193772037721377223772337724377253772637727377283772937730377313773237733377343773537736377373773837739377403774137742377433774437745377463774737748377493775037751377523775337754377553775637757377583775937760377613776237763377643776537766377673776837769377703777137772377733777437775377763777737778377793778037781377823778337784377853778637787377883778937790377913779237793377943779537796377973779837799378003780137802378033780437805378063780737808378093781037811378123781337814378153781637817378183781937820378213782237823378243782537826378273782837829378303783137832378333783437835378363783737838378393784037841378423784337844378453784637847378483784937850378513785237853378543785537856378573785837859378603786137862378633786437865378663786737868378693787037871378723787337874378753787637877378783787937880378813788237883378843788537886378873788837889378903789137892378933789437895378963789737898378993790037901379023790337904379053790637907379083790937910379113791237913379143791537916379173791837919379203792137922379233792437925379263792737928379293793037931379323793337934379353793637937379383793937940379413794237943379443794537946379473794837949379503795137952379533795437955379563795737958379593796037961379623796337964379653796637967379683796937970379713797237973379743797537976379773797837979379803798137982379833798437985379863798737988379893799037991379923799337994379953799637997379983799938000380013800238003380043800538006380073800838009380103801138012380133801438015380163801738018380193802038021380223802338024380253802638027380283802938030380313803238033380343803538036380373803838039380403804138042380433804438045380463804738048380493805038051380523805338054380553805638057380583805938060380613806238063380643806538066380673806838069380703807138072380733807438075380763807738078380793808038081380823808338084380853808638087380883808938090380913809238093380943809538096380973809838099381003810138102381033810438105381063810738108381093811038111381123811338114381153811638117381183811938120381213812238123381243812538126381273812838129381303813138132381333813438135381363813738138381393814038141381423814338144381453814638147381483814938150381513815238153381543815538156381573815838159381603816138162381633816438165381663816738168381693817038171381723817338174381753817638177381783817938180381813818238183381843818538186381873818838189381903819138192381933819438195381963819738198381993820038201382023820338204382053820638207382083820938210382113821238213382143821538216382173821838219382203822138222382233822438225382263822738228382293823038231382323823338234382353823638237382383823938240382413824238243382443824538246382473824838249382503825138252382533825438255382563825738258382593826038261382623826338264382653826638267382683826938270382713827238273382743827538276382773827838279382803828138282382833828438285382863828738288382893829038291382923829338294382953829638297382983829938300383013830238303383043830538306383073830838309383103831138312383133831438315383163831738318383193832038321383223832338324383253832638327383283832938330383313833238333383343833538336383373833838339383403834138342383433834438345383463834738348383493835038351383523835338354383553835638357383583835938360383613836238363383643836538366383673836838369383703837138372383733837438375383763837738378383793838038381383823838338384383853838638387383883838938390383913839238393383943839538396383973839838399384003840138402384033840438405384063840738408384093841038411384123841338414384153841638417384183841938420384213842238423384243842538426384273842838429384303843138432384333843438435384363843738438384393844038441384423844338444384453844638447384483844938450384513845238453384543845538456384573845838459384603846138462384633846438465384663846738468384693847038471384723847338474384753847638477384783847938480384813848238483384843848538486384873848838489384903849138492384933849438495384963849738498384993850038501385023850338504385053850638507385083850938510385113851238513385143851538516385173851838519385203852138522385233852438525385263852738528385293853038531385323853338534385353853638537385383853938540385413854238543385443854538546385473854838549385503855138552385533855438555385563855738558385593856038561385623856338564385653856638567385683856938570385713857238573385743857538576385773857838579385803858138582385833858438585385863858738588385893859038591385923859338594385953859638597385983859938600386013860238603386043860538606386073860838609386103861138612386133861438615386163861738618386193862038621386223862338624386253862638627386283862938630386313863238633386343863538636386373863838639386403864138642386433864438645386463864738648386493865038651386523865338654386553865638657386583865938660386613866238663386643866538666386673866838669386703867138672386733867438675386763867738678386793868038681386823868338684386853868638687386883868938690386913869238693386943869538696386973869838699387003870138702387033870438705387063870738708387093871038711387123871338714387153871638717387183871938720387213872238723387243872538726387273872838729387303873138732387333873438735387363873738738387393874038741387423874338744387453874638747387483874938750387513875238753387543875538756387573875838759387603876138762387633876438765387663876738768387693877038771387723877338774387753877638777387783877938780387813878238783387843878538786387873878838789387903879138792387933879438795387963879738798387993880038801388023880338804388053880638807388083880938810388113881238813388143881538816388173881838819388203882138822388233882438825388263882738828388293883038831388323883338834388353883638837388383883938840388413884238843388443884538846388473884838849388503885138852388533885438855388563885738858388593886038861388623886338864388653886638867388683886938870388713887238873388743887538876388773887838879388803888138882388833888438885388863888738888388893889038891388923889338894388953889638897388983889938900389013890238903389043890538906389073890838909389103891138912389133891438915389163891738918389193892038921389223892338924389253892638927389283892938930389313893238933389343893538936389373893838939389403894138942389433894438945389463894738948389493895038951389523895338954389553895638957389583895938960389613896238963389643896538966389673896838969389703897138972389733897438975389763897738978389793898038981389823898338984389853898638987389883898938990389913899238993389943899538996389973899838999390003900139002390033900439005390063900739008390093901039011390123901339014390153901639017390183901939020390213902239023390243902539026390273902839029390303903139032390333903439035390363903739038390393904039041390423904339044390453904639047390483904939050390513905239053390543905539056390573905839059390603906139062390633906439065390663906739068390693907039071390723907339074390753907639077390783907939080390813908239083390843908539086390873908839089390903909139092390933909439095390963909739098390993910039101391023910339104391053910639107391083910939110391113911239113391143911539116391173911839119391203912139122391233912439125391263912739128391293913039131391323913339134391353913639137391383913939140391413914239143391443914539146391473914839149391503915139152391533915439155391563915739158391593916039161391623916339164391653916639167391683916939170391713917239173391743917539176391773917839179391803918139182391833918439185391863918739188391893919039191391923919339194391953919639197391983919939200392013920239203392043920539206392073920839209392103921139212392133921439215392163921739218392193922039221392223922339224392253922639227392283922939230392313923239233392343923539236392373923839239392403924139242392433924439245392463924739248392493925039251392523925339254392553925639257392583925939260392613926239263392643926539266392673926839269392703927139272392733927439275392763927739278392793928039281392823928339284392853928639287392883928939290392913929239293392943929539296392973929839299393003930139302393033930439305393063930739308393093931039311393123931339314393153931639317393183931939320393213932239323393243932539326393273932839329393303933139332393333933439335393363933739338393393934039341393423934339344393453934639347393483934939350393513935239353393543935539356393573935839359393603936139362393633936439365393663936739368393693937039371393723937339374393753937639377393783937939380393813938239383393843938539386393873938839389393903939139392393933939439395393963939739398393993940039401394023940339404394053940639407394083940939410394113941239413394143941539416394173941839419394203942139422394233942439425394263942739428394293943039431394323943339434394353943639437394383943939440394413944239443394443944539446394473944839449394503945139452394533945439455394563945739458394593946039461394623946339464394653946639467394683946939470394713947239473394743947539476394773947839479394803948139482394833948439485394863948739488394893949039491394923949339494394953949639497394983949939500395013950239503395043950539506395073950839509395103951139512395133951439515395163951739518395193952039521395223952339524395253952639527395283952939530395313953239533395343953539536395373953839539395403954139542395433954439545395463954739548395493955039551395523955339554395553955639557395583955939560395613956239563395643956539566395673956839569395703957139572395733957439575395763957739578395793958039581395823958339584395853958639587395883958939590395913959239593395943959539596395973959839599396003960139602396033960439605396063960739608396093961039611396123961339614396153961639617396183961939620396213962239623396243962539626396273962839629396303963139632396333963439635396363963739638396393964039641396423964339644396453964639647396483964939650396513965239653396543965539656396573965839659396603966139662396633966439665396663966739668396693967039671396723967339674396753967639677396783967939680396813968239683396843968539686396873968839689396903969139692396933969439695396963969739698396993970039701397023970339704397053970639707397083970939710397113971239713397143971539716397173971839719397203972139722397233972439725397263972739728397293973039731397323973339734397353973639737397383973939740397413974239743397443974539746397473974839749397503975139752397533975439755397563975739758397593976039761397623976339764397653976639767397683976939770397713977239773397743977539776397773977839779397803978139782397833978439785397863978739788397893979039791397923979339794397953979639797397983979939800398013980239803398043980539806398073980839809398103981139812398133981439815398163981739818398193982039821398223982339824398253982639827398283982939830398313983239833398343983539836398373983839839398403984139842398433984439845398463984739848398493985039851398523985339854398553985639857398583985939860398613986239863398643986539866398673986839869398703987139872398733987439875398763987739878398793988039881398823988339884398853988639887398883988939890398913989239893398943989539896398973989839899399003990139902399033990439905399063990739908399093991039911399123991339914399153991639917399183991939920399213992239923399243992539926399273992839929399303993139932399333993439935399363993739938399393994039941399423994339944399453994639947399483994939950399513995239953399543995539956399573995839959399603996139962399633996439965399663996739968399693997039971399723997339974399753997639977399783997939980399813998239983399843998539986399873998839989399903999139992399933999439995399963999739998399994000040001400024000340004400054000640007400084000940010400114001240013400144001540016400174001840019400204002140022400234002440025400264002740028400294003040031400324003340034400354003640037400384003940040400414004240043400444004540046400474004840049400504005140052400534005440055400564005740058400594006040061400624006340064400654006640067400684006940070400714007240073400744007540076400774007840079400804008140082400834008440085400864008740088400894009040091400924009340094400954009640097400984009940100401014010240103401044010540106401074010840109401104011140112401134011440115401164011740118401194012040121401224012340124401254012640127401284012940130401314013240133401344013540136401374013840139401404014140142401434014440145401464014740148401494015040151401524015340154401554015640157401584015940160401614016240163401644016540166401674016840169401704017140172401734017440175401764017740178401794018040181401824018340184401854018640187401884018940190401914019240193401944019540196401974019840199402004020140202402034020440205402064020740208402094021040211402124021340214402154021640217402184021940220402214022240223402244022540226402274022840229402304023140232402334023440235402364023740238402394024040241402424024340244402454024640247402484024940250402514025240253402544025540256402574025840259402604026140262402634026440265402664026740268402694027040271402724027340274402754027640277402784027940280402814028240283402844028540286402874028840289402904029140292402934029440295402964029740298402994030040301403024030340304403054030640307403084030940310403114031240313403144031540316403174031840319403204032140322403234032440325403264032740328403294033040331403324033340334403354033640337403384033940340403414034240343403444034540346403474034840349403504035140352403534035440355403564035740358403594036040361403624036340364403654036640367403684036940370403714037240373403744037540376403774037840379403804038140382403834038440385403864038740388403894039040391403924039340394403954039640397403984039940400404014040240403404044040540406404074040840409404104041140412404134041440415404164041740418404194042040421404224042340424404254042640427404284042940430404314043240433404344043540436404374043840439404404044140442404434044440445404464044740448404494045040451404524045340454404554045640457404584045940460404614046240463404644046540466404674046840469404704047140472404734047440475404764047740478404794048040481404824048340484404854048640487404884048940490404914049240493404944049540496404974049840499405004050140502405034050440505405064050740508405094051040511405124051340514405154051640517405184051940520405214052240523405244052540526405274052840529405304053140532405334053440535405364053740538405394054040541405424054340544405454054640547405484054940550405514055240553405544055540556405574055840559405604056140562405634056440565405664056740568405694057040571405724057340574405754057640577405784057940580405814058240583405844058540586405874058840589405904059140592405934059440595405964059740598405994060040601406024060340604406054060640607406084060940610406114061240613406144061540616406174061840619406204062140622406234062440625406264062740628406294063040631406324063340634406354063640637406384063940640406414064240643406444064540646406474064840649406504065140652406534065440655406564065740658406594066040661406624066340664406654066640667406684066940670406714067240673406744067540676406774067840679406804068140682406834068440685406864068740688406894069040691406924069340694406954069640697406984069940700407014070240703407044070540706407074070840709407104071140712407134071440715407164071740718407194072040721407224072340724407254072640727407284072940730407314073240733407344073540736407374073840739407404074140742407434074440745407464074740748407494075040751407524075340754407554075640757407584075940760407614076240763407644076540766407674076840769407704077140772407734077440775407764077740778407794078040781407824078340784407854078640787407884078940790407914079240793407944079540796407974079840799408004080140802408034080440805408064080740808408094081040811408124081340814408154081640817408184081940820408214082240823408244082540826408274082840829408304083140832408334083440835408364083740838408394084040841408424084340844408454084640847408484084940850408514085240853408544085540856408574085840859408604086140862408634086440865408664086740868408694087040871408724087340874408754087640877408784087940880408814088240883408844088540886408874088840889408904089140892408934089440895408964089740898408994090040901409024090340904409054090640907409084090940910409114091240913409144091540916409174091840919409204092140922409234092440925409264092740928409294093040931409324093340934409354093640937409384093940940409414094240943409444094540946409474094840949409504095140952409534095440955409564095740958409594096040961409624096340964409654096640967409684096940970409714097240973409744097540976409774097840979409804098140982409834098440985409864098740988409894099040991409924099340994409954099640997409984099941000410014100241003410044100541006410074100841009410104101141012410134101441015410164101741018410194102041021410224102341024410254102641027410284102941030410314103241033410344103541036410374103841039410404104141042410434104441045410464104741048410494105041051410524105341054410554105641057410584105941060410614106241063410644106541066410674106841069410704107141072410734107441075410764107741078410794108041081410824108341084410854108641087410884108941090410914109241093410944109541096410974109841099411004110141102411034110441105411064110741108411094111041111411124111341114411154111641117411184111941120411214112241123411244112541126411274112841129411304113141132411334113441135411364113741138411394114041141411424114341144411454114641147411484114941150411514115241153411544115541156411574115841159411604116141162411634116441165411664116741168411694117041171411724117341174411754117641177411784117941180411814118241183411844118541186411874118841189411904119141192411934119441195411964119741198411994120041201412024120341204412054120641207412084120941210412114121241213412144121541216412174121841219412204122141222412234122441225412264122741228412294123041231412324123341234412354123641237412384123941240412414124241243412444124541246412474124841249412504125141252412534125441255412564125741258412594126041261412624126341264412654126641267412684126941270412714127241273412744127541276412774127841279412804128141282412834128441285412864128741288412894129041291412924129341294412954129641297412984129941300413014130241303413044130541306413074130841309413104131141312413134131441315413164131741318413194132041321413224132341324413254132641327413284132941330413314133241333413344133541336413374133841339413404134141342413434134441345413464134741348413494135041351413524135341354413554135641357413584135941360413614136241363413644136541366413674136841369413704137141372413734137441375413764137741378413794138041381413824138341384413854138641387413884138941390413914139241393413944139541396413974139841399414004140141402414034140441405414064140741408414094141041411414124141341414414154141641417414184141941420414214142241423414244142541426414274142841429414304143141432414334143441435414364143741438414394144041441414424144341444414454144641447414484144941450414514145241453414544145541456414574145841459414604146141462414634146441465414664146741468414694147041471414724147341474414754147641477414784147941480414814148241483414844148541486414874148841489414904149141492414934149441495414964149741498414994150041501415024150341504415054150641507415084150941510415114151241513415144151541516415174151841519415204152141522415234152441525415264152741528415294153041531415324153341534415354153641537415384153941540415414154241543415444154541546415474154841549415504155141552415534155441555415564155741558415594156041561415624156341564415654156641567415684156941570415714157241573415744157541576415774157841579415804158141582415834158441585415864158741588415894159041591415924159341594415954159641597415984159941600416014160241603416044160541606416074160841609416104161141612416134161441615416164161741618416194162041621416224162341624416254162641627416284162941630416314163241633416344163541636416374163841639416404164141642416434164441645416464164741648416494165041651416524165341654416554165641657416584165941660416614166241663416644166541666416674166841669416704167141672416734167441675416764167741678416794168041681416824168341684416854168641687416884168941690416914169241693416944169541696416974169841699417004170141702417034170441705417064170741708417094171041711417124171341714417154171641717417184171941720417214172241723417244172541726417274172841729417304173141732417334173441735417364173741738417394174041741417424174341744417454174641747417484174941750417514175241753417544175541756417574175841759417604176141762417634176441765417664176741768417694177041771417724177341774417754177641777417784177941780417814178241783417844178541786417874178841789417904179141792417934179441795417964179741798417994180041801418024180341804418054180641807418084180941810418114181241813418144181541816418174181841819418204182141822418234182441825418264182741828418294183041831418324183341834418354183641837418384183941840418414184241843418444184541846418474184841849418504185141852418534185441855418564185741858418594186041861418624186341864418654186641867418684186941870418714187241873418744187541876418774187841879418804188141882418834188441885418864188741888418894189041891418924189341894418954189641897418984189941900419014190241903419044190541906419074190841909419104191141912419134191441915419164191741918419194192041921419224192341924419254192641927419284192941930419314193241933419344193541936419374193841939419404194141942419434194441945419464194741948419494195041951419524195341954419554195641957419584195941960419614196241963419644196541966419674196841969419704197141972419734197441975419764197741978419794198041981419824198341984419854198641987419884198941990419914199241993419944199541996419974199841999420004200142002420034200442005420064200742008420094201042011420124201342014420154201642017420184201942020420214202242023420244202542026420274202842029420304203142032420334203442035420364203742038420394204042041420424204342044420454204642047420484204942050420514205242053420544205542056420574205842059420604206142062420634206442065420664206742068420694207042071420724207342074420754207642077420784207942080420814208242083420844208542086420874208842089420904209142092420934209442095420964209742098420994210042101421024210342104421054210642107421084210942110421114211242113421144211542116421174211842119421204212142122421234212442125421264212742128421294213042131421324213342134421354213642137421384213942140421414214242143421444214542146421474214842149421504215142152421534215442155421564215742158421594216042161421624216342164421654216642167421684216942170421714217242173421744217542176421774217842179421804218142182421834218442185421864218742188421894219042191421924219342194421954219642197421984219942200422014220242203422044220542206422074220842209422104221142212422134221442215422164221742218422194222042221422224222342224422254222642227422284222942230422314223242233422344223542236422374223842239422404224142242422434224442245422464224742248422494225042251422524225342254422554225642257422584225942260422614226242263422644226542266422674226842269422704227142272422734227442275422764227742278422794228042281422824228342284422854228642287422884228942290422914229242293422944229542296422974229842299423004230142302423034230442305423064230742308423094231042311423124231342314423154231642317423184231942320423214232242323423244232542326423274232842329423304233142332423334233442335423364233742338423394234042341423424234342344423454234642347423484234942350423514235242353423544235542356423574235842359423604236142362423634236442365423664236742368423694237042371423724237342374423754237642377423784237942380423814238242383423844238542386423874238842389423904239142392423934239442395423964239742398423994240042401424024240342404424054240642407424084240942410424114241242413424144241542416424174241842419424204242142422424234242442425424264242742428424294243042431424324243342434424354243642437424384243942440424414244242443424444244542446424474244842449424504245142452424534245442455424564245742458424594246042461424624246342464424654246642467424684246942470424714247242473424744247542476424774247842479424804248142482424834248442485424864248742488424894249042491424924249342494424954249642497424984249942500425014250242503425044250542506425074250842509425104251142512425134251442515425164251742518425194252042521425224252342524425254252642527425284252942530425314253242533425344253542536425374253842539425404254142542425434254442545425464254742548425494255042551425524255342554425554255642557425584255942560425614256242563425644256542566425674256842569425704257142572425734257442575425764257742578425794258042581425824258342584425854258642587425884258942590425914259242593425944259542596425974259842599426004260142602426034260442605426064260742608426094261042611426124261342614426154261642617426184261942620426214262242623426244262542626426274262842629426304263142632426334263442635426364263742638426394264042641426424264342644426454264642647426484264942650426514265242653426544265542656426574265842659426604266142662426634266442665426664266742668426694267042671426724267342674426754267642677426784267942680426814268242683426844268542686426874268842689426904269142692426934269442695426964269742698426994270042701427024270342704427054270642707427084270942710427114271242713427144271542716427174271842719427204272142722427234272442725427264272742728427294273042731427324273342734427354273642737427384273942740427414274242743427444274542746427474274842749427504275142752427534275442755427564275742758427594276042761427624276342764427654276642767427684276942770427714277242773427744277542776427774277842779427804278142782427834278442785427864278742788427894279042791427924279342794427954279642797427984279942800428014280242803428044280542806428074280842809428104281142812428134281442815428164281742818428194282042821428224282342824428254282642827428284282942830428314283242833428344283542836428374283842839428404284142842428434284442845428464284742848428494285042851428524285342854428554285642857428584285942860428614286242863428644286542866428674286842869428704287142872428734287442875428764287742878428794288042881428824288342884428854288642887428884288942890428914289242893428944289542896428974289842899429004290142902429034290442905429064290742908429094291042911429124291342914429154291642917429184291942920429214292242923429244292542926429274292842929429304293142932429334293442935429364293742938429394294042941429424294342944429454294642947429484294942950429514295242953429544295542956429574295842959429604296142962429634296442965429664296742968429694297042971429724297342974429754297642977429784297942980429814298242983429844298542986429874298842989429904299142992429934299442995429964299742998429994300043001430024300343004430054300643007430084300943010430114301243013430144301543016430174301843019430204302143022430234302443025430264302743028430294303043031430324303343034430354303643037430384303943040430414304243043430444304543046430474304843049430504305143052430534305443055430564305743058430594306043061430624306343064430654306643067430684306943070430714307243073430744307543076430774307843079430804308143082430834308443085430864308743088430894309043091430924309343094430954309643097430984309943100431014310243103431044310543106431074310843109431104311143112431134311443115431164311743118431194312043121431224312343124431254312643127431284312943130431314313243133431344313543136431374313843139431404314143142431434314443145431464314743148431494315043151431524315343154431554315643157431584315943160431614316243163431644316543166431674316843169431704317143172431734317443175431764317743178431794318043181431824318343184431854318643187431884318943190431914319243193431944319543196431974319843199432004320143202432034320443205432064320743208432094321043211432124321343214432154321643217432184321943220432214322243223432244322543226432274322843229432304323143232432334323443235432364323743238432394324043241432424324343244432454324643247432484324943250432514325243253432544325543256432574325843259432604326143262432634326443265432664326743268432694327043271432724327343274432754327643277432784327943280432814328243283432844328543286432874328843289432904329143292432934329443295432964329743298432994330043301433024330343304433054330643307433084330943310433114331243313433144331543316433174331843319433204332143322433234332443325433264332743328433294333043331433324333343334433354333643337433384333943340433414334243343433444334543346433474334843349433504335143352433534335443355433564335743358433594336043361433624336343364433654336643367433684336943370433714337243373433744337543376433774337843379433804338143382433834338443385433864338743388433894339043391433924339343394433954339643397433984339943400434014340243403434044340543406434074340843409434104341143412434134341443415434164341743418434194342043421434224342343424434254342643427434284342943430434314343243433434344343543436434374343843439434404344143442434434344443445434464344743448434494345043451434524345343454434554345643457434584345943460434614346243463434644346543466434674346843469434704347143472434734347443475434764347743478434794348043481434824348343484434854348643487434884348943490434914349243493434944349543496434974349843499435004350143502435034350443505435064350743508435094351043511435124351343514435154351643517435184351943520435214352243523435244352543526435274352843529435304353143532435334353443535435364353743538435394354043541435424354343544435454354643547435484354943550435514355243553435544355543556435574355843559435604356143562435634356443565435664356743568435694357043571435724357343574435754357643577435784357943580435814358243583435844358543586435874358843589435904359143592435934359443595435964359743598435994360043601436024360343604436054360643607436084360943610436114361243613436144361543616436174361843619436204362143622436234362443625436264362743628436294363043631436324363343634436354363643637436384363943640436414364243643436444364543646436474364843649436504365143652436534365443655436564365743658436594366043661436624366343664436654366643667436684366943670436714367243673436744367543676436774367843679436804368143682436834368443685436864368743688436894369043691436924369343694436954369643697436984369943700437014370243703437044370543706437074370843709437104371143712437134371443715437164371743718437194372043721437224372343724437254372643727437284372943730437314373243733437344373543736437374373843739437404374143742437434374443745437464374743748437494375043751437524375343754437554375643757437584375943760437614376243763437644376543766437674376843769437704377143772437734377443775437764377743778437794378043781437824378343784437854378643787437884378943790437914379243793437944379543796437974379843799438004380143802438034380443805438064380743808438094381043811438124381343814438154381643817438184381943820438214382243823438244382543826438274382843829438304383143832438334383443835438364383743838438394384043841438424384343844438454384643847438484384943850438514385243853438544385543856438574385843859438604386143862438634386443865438664386743868438694387043871438724387343874438754387643877438784387943880438814388243883438844388543886438874388843889438904389143892438934389443895438964389743898438994390043901439024390343904439054390643907439084390943910439114391243913439144391543916439174391843919439204392143922439234392443925439264392743928439294393043931439324393343934439354393643937439384393943940439414394243943439444394543946439474394843949439504395143952439534395443955439564395743958439594396043961439624396343964439654396643967439684396943970439714397243973439744397543976439774397843979439804398143982439834398443985439864398743988439894399043991439924399343994439954399643997439984399944000440014400244003440044400544006440074400844009440104401144012440134401444015440164401744018440194402044021440224402344024440254402644027440284402944030440314403244033440344403544036440374403844039440404404144042440434404444045440464404744048440494405044051440524405344054440554405644057440584405944060440614406244063440644406544066440674406844069440704407144072440734407444075440764407744078440794408044081440824408344084440854408644087440884408944090440914409244093440944409544096440974409844099441004410144102441034410444105441064410744108441094411044111441124411344114441154411644117441184411944120441214412244123441244412544126441274412844129441304413144132441334413444135441364413744138441394414044141441424414344144441454414644147441484414944150441514415244153441544415544156441574415844159441604416144162441634416444165441664416744168441694417044171441724417344174441754417644177441784417944180441814418244183441844418544186441874418844189441904419144192441934419444195441964419744198441994420044201442024420344204442054420644207442084420944210442114421244213442144421544216442174421844219442204422144222442234422444225442264422744228442294423044231442324423344234442354423644237442384423944240442414424244243442444424544246442474424844249442504425144252442534425444255442564425744258442594426044261442624426344264442654426644267442684426944270442714427244273442744427544276442774427844279442804428144282442834428444285442864428744288442894429044291442924429344294442954429644297442984429944300443014430244303443044430544306443074430844309443104431144312443134431444315443164431744318443194432044321443224432344324443254432644327443284432944330443314433244333443344433544336443374433844339443404434144342443434434444345443464434744348443494435044351443524435344354443554435644357443584435944360443614436244363443644436544366443674436844369443704437144372443734437444375443764437744378443794438044381443824438344384443854438644387443884438944390443914439244393443944439544396443974439844399444004440144402444034440444405444064440744408444094441044411444124441344414444154441644417444184441944420444214442244423444244442544426444274442844429444304443144432444334443444435444364443744438444394444044441444424444344444444454444644447444484444944450444514445244453444544445544456444574445844459444604446144462444634446444465444664446744468444694447044471444724447344474444754447644477444784447944480444814448244483444844448544486444874448844489444904449144492444934449444495444964449744498444994450044501445024450344504445054450644507445084450944510445114451244513445144451544516445174451844519445204452144522445234452444525445264452744528445294453044531445324453344534445354453644537445384453944540445414454244543445444454544546445474454844549445504455144552445534455444555445564455744558445594456044561445624456344564445654456644567445684456944570445714457244573445744457544576445774457844579445804458144582445834458444585445864458744588445894459044591445924459344594445954459644597445984459944600446014460244603446044460544606446074460844609446104461144612446134461444615446164461744618446194462044621446224462344624446254462644627446284462944630446314463244633446344463544636446374463844639446404464144642446434464444645446464464744648446494465044651446524465344654446554465644657446584465944660446614466244663446644466544666446674466844669446704467144672446734467444675446764467744678446794468044681446824468344684446854468644687446884468944690446914469244693446944469544696446974469844699447004470144702447034470444705447064470744708447094471044711447124471344714447154471644717447184471944720447214472244723447244472544726447274472844729447304473144732447334473444735447364473744738447394474044741447424474344744447454474644747447484474944750447514475244753447544475544756447574475844759447604476144762447634476444765447664476744768447694477044771447724477344774447754477644777447784477944780447814478244783447844478544786447874478844789447904479144792447934479444795447964479744798447994480044801448024480344804448054480644807448084480944810448114481244813448144481544816448174481844819448204482144822448234482444825448264482744828448294483044831448324483344834448354483644837448384483944840448414484244843448444484544846448474484844849448504485144852448534485444855448564485744858448594486044861448624486344864448654486644867448684486944870448714487244873448744487544876448774487844879448804488144882448834488444885448864488744888448894489044891448924489344894448954489644897448984489944900449014490244903449044490544906449074490844909449104491144912449134491444915449164491744918449194492044921449224492344924449254492644927449284492944930449314493244933449344493544936449374493844939449404494144942449434494444945449464494744948449494495044951449524495344954449554495644957449584495944960449614496244963449644496544966449674496844969449704497144972449734497444975449764497744978449794498044981449824498344984449854498644987449884498944990449914499244993449944499544996449974499844999450004500145002450034500445005450064500745008450094501045011450124501345014450154501645017450184501945020450214502245023450244502545026450274502845029450304503145032450334503445035450364503745038450394504045041450424504345044450454504645047450484504945050450514505245053450544505545056450574505845059450604506145062450634506445065450664506745068450694507045071450724507345074450754507645077450784507945080450814508245083450844508545086450874508845089450904509145092450934509445095450964509745098450994510045101451024510345104451054510645107451084510945110451114511245113451144511545116451174511845119451204512145122451234512445125451264512745128451294513045131451324513345134451354513645137451384513945140451414514245143451444514545146451474514845149451504515145152451534515445155451564515745158451594516045161451624516345164451654516645167451684516945170451714517245173451744517545176451774517845179451804518145182451834518445185451864518745188451894519045191451924519345194451954519645197451984519945200452014520245203452044520545206452074520845209452104521145212452134521445215452164521745218452194522045221452224522345224452254522645227452284522945230452314523245233452344523545236452374523845239452404524145242452434524445245452464524745248452494525045251452524525345254452554525645257452584525945260452614526245263452644526545266452674526845269452704527145272452734527445275452764527745278452794528045281452824528345284452854528645287452884528945290452914529245293452944529545296452974529845299453004530145302453034530445305453064530745308453094531045311453124531345314453154531645317453184531945320453214532245323453244532545326453274532845329453304533145332453334533445335453364533745338453394534045341453424534345344453454534645347453484534945350453514535245353453544535545356453574535845359453604536145362453634536445365453664536745368453694537045371453724537345374453754537645377453784537945380453814538245383453844538545386453874538845389453904539145392453934539445395453964539745398453994540045401454024540345404454054540645407454084540945410454114541245413454144541545416454174541845419454204542145422454234542445425454264542745428454294543045431454324543345434454354543645437454384543945440454414544245443454444544545446454474544845449454504545145452454534545445455454564545745458454594546045461454624546345464454654546645467454684546945470454714547245473454744547545476454774547845479454804548145482454834548445485454864548745488454894549045491454924549345494454954549645497454984549945500455014550245503455044550545506455074550845509455104551145512455134551445515455164551745518455194552045521455224552345524455254552645527455284552945530455314553245533455344553545536455374553845539455404554145542455434554445545455464554745548455494555045551455524555345554455554555645557455584555945560455614556245563455644556545566455674556845569455704557145572455734557445575455764557745578455794558045581455824558345584455854558645587455884558945590455914559245593455944559545596455974559845599456004560145602456034560445605456064560745608456094561045611456124561345614456154561645617456184561945620456214562245623456244562545626456274562845629456304563145632456334563445635456364563745638456394564045641456424564345644456454564645647456484564945650456514565245653456544565545656456574565845659456604566145662456634566445665456664566745668456694567045671456724567345674456754567645677456784567945680456814568245683456844568545686456874568845689456904569145692456934569445695456964569745698456994570045701457024570345704457054570645707457084570945710457114571245713457144571545716457174571845719457204572145722457234572445725457264572745728457294573045731457324573345734457354573645737457384573945740457414574245743457444574545746457474574845749457504575145752457534575445755457564575745758457594576045761457624576345764457654576645767457684576945770457714577245773457744577545776457774577845779457804578145782457834578445785457864578745788457894579045791457924579345794457954579645797457984579945800458014580245803458044580545806458074580845809458104581145812458134581445815458164581745818458194582045821458224582345824458254582645827458284582945830458314583245833458344583545836458374583845839458404584145842458434584445845458464584745848458494585045851458524585345854458554585645857458584585945860458614586245863458644586545866458674586845869458704587145872458734587445875458764587745878458794588045881458824588345884458854588645887458884588945890458914589245893458944589545896458974589845899459004590145902459034590445905459064590745908459094591045911459124591345914459154591645917459184591945920459214592245923459244592545926459274592845929459304593145932459334593445935459364593745938459394594045941459424594345944459454594645947459484594945950459514595245953459544595545956459574595845959459604596145962459634596445965459664596745968459694597045971459724597345974459754597645977459784597945980459814598245983459844598545986459874598845989459904599145992459934599445995459964599745998459994600046001460024600346004460054600646007460084600946010460114601246013460144601546016460174601846019460204602146022460234602446025460264602746028460294603046031460324603346034460354603646037460384603946040460414604246043460444604546046460474604846049460504605146052460534605446055460564605746058460594606046061460624606346064460654606646067460684606946070460714607246073460744607546076460774607846079460804608146082460834608446085460864608746088460894609046091460924609346094460954609646097460984609946100461014610246103461044610546106461074610846109461104611146112461134611446115461164611746118461194612046121461224612346124461254612646127461284612946130461314613246133461344613546136461374613846139461404614146142461434614446145461464614746148461494615046151461524615346154461554615646157461584615946160461614616246163461644616546166461674616846169461704617146172461734617446175461764617746178461794618046181461824618346184461854618646187461884618946190461914619246193461944619546196461974619846199462004620146202462034620446205462064620746208462094621046211462124621346214462154621646217462184621946220462214622246223462244622546226462274622846229462304623146232462334623446235462364623746238462394624046241462424624346244462454624646247462484624946250462514625246253462544625546256462574625846259462604626146262462634626446265462664626746268462694627046271462724627346274462754627646277462784627946280462814628246283462844628546286462874628846289462904629146292462934629446295462964629746298462994630046301463024630346304463054630646307463084630946310463114631246313463144631546316463174631846319463204632146322463234632446325463264632746328463294633046331463324633346334463354633646337463384633946340463414634246343463444634546346463474634846349463504635146352463534635446355463564635746358463594636046361463624636346364463654636646367463684636946370463714637246373463744637546376463774637846379463804638146382463834638446385463864638746388463894639046391463924639346394463954639646397463984639946400464014640246403464044640546406464074640846409464104641146412464134641446415464164641746418464194642046421464224642346424464254642646427464284642946430464314643246433464344643546436464374643846439464404644146442464434644446445464464644746448464494645046451464524645346454464554645646457464584645946460464614646246463464644646546466464674646846469464704647146472464734647446475464764647746478464794648046481464824648346484464854648646487464884648946490464914649246493464944649546496464974649846499465004650146502465034650446505465064650746508465094651046511465124651346514465154651646517465184651946520465214652246523465244652546526465274652846529465304653146532465334653446535465364653746538465394654046541465424654346544465454654646547465484654946550465514655246553465544655546556465574655846559465604656146562465634656446565465664656746568465694657046571465724657346574465754657646577465784657946580465814658246583465844658546586465874658846589465904659146592465934659446595465964659746598465994660046601466024660346604466054660646607466084660946610466114661246613466144661546616466174661846619466204662146622466234662446625466264662746628466294663046631466324663346634466354663646637466384663946640466414664246643466444664546646466474664846649466504665146652466534665446655466564665746658466594666046661466624666346664466654666646667466684666946670466714667246673466744667546676466774667846679466804668146682466834668446685466864668746688466894669046691466924669346694466954669646697466984669946700467014670246703467044670546706467074670846709467104671146712467134671446715467164671746718467194672046721467224672346724467254672646727467284672946730467314673246733467344673546736467374673846739467404674146742467434674446745467464674746748467494675046751467524675346754467554675646757467584675946760467614676246763467644676546766467674676846769467704677146772467734677446775467764677746778467794678046781467824678346784467854678646787467884678946790467914679246793467944679546796467974679846799468004680146802468034680446805468064680746808468094681046811468124681346814468154681646817468184681946820468214682246823468244682546826468274682846829468304683146832468334683446835468364683746838468394684046841468424684346844468454684646847468484684946850468514685246853468544685546856468574685846859468604686146862468634686446865468664686746868468694687046871468724687346874468754687646877468784687946880468814688246883468844688546886468874688846889468904689146892468934689446895468964689746898468994690046901469024690346904469054690646907469084690946910469114691246913469144691546916469174691846919469204692146922469234692446925469264692746928469294693046931469324693346934469354693646937469384693946940469414694246943469444694546946469474694846949469504695146952469534695446955469564695746958469594696046961469624696346964469654696646967469684696946970469714697246973469744697546976469774697846979469804698146982469834698446985469864698746988469894699046991469924699346994469954699646997469984699947000470014700247003470044700547006470074700847009470104701147012470134701447015470164701747018470194702047021470224702347024470254702647027470284702947030470314703247033470344703547036470374703847039470404704147042470434704447045470464704747048470494705047051470524705347054470554705647057470584705947060470614706247063470644706547066470674706847069470704707147072470734707447075470764707747078470794708047081470824708347084470854708647087470884708947090470914709247093470944709547096470974709847099471004710147102471034710447105471064710747108471094711047111471124711347114471154711647117471184711947120471214712247123471244712547126471274712847129471304713147132471334713447135471364713747138471394714047141471424714347144471454714647147471484714947150471514715247153471544715547156471574715847159471604716147162471634716447165471664716747168471694717047171471724717347174471754717647177471784717947180471814718247183471844718547186471874718847189471904719147192471934719447195471964719747198471994720047201472024720347204472054720647207472084720947210472114721247213472144721547216472174721847219472204722147222472234722447225472264722747228472294723047231472324723347234472354723647237472384723947240472414724247243472444724547246472474724847249472504725147252472534725447255472564725747258472594726047261472624726347264472654726647267472684726947270472714727247273472744727547276472774727847279472804728147282472834728447285472864728747288472894729047291472924729347294472954729647297472984729947300473014730247303473044730547306473074730847309473104731147312473134731447315473164731747318473194732047321473224732347324473254732647327473284732947330473314733247333473344733547336473374733847339473404734147342473434734447345473464734747348473494735047351473524735347354473554735647357473584735947360473614736247363473644736547366473674736847369473704737147372473734737447375473764737747378473794738047381473824738347384473854738647387473884738947390473914739247393473944739547396473974739847399474004740147402474034740447405474064740747408474094741047411474124741347414474154741647417474184741947420474214742247423474244742547426474274742847429474304743147432474334743447435474364743747438474394744047441474424744347444474454744647447474484744947450474514745247453474544745547456474574745847459474604746147462474634746447465474664746747468474694747047471474724747347474474754747647477474784747947480474814748247483474844748547486474874748847489474904749147492474934749447495474964749747498474994750047501475024750347504475054750647507475084750947510475114751247513475144751547516475174751847519475204752147522475234752447525475264752747528475294753047531475324753347534475354753647537475384753947540475414754247543475444754547546475474754847549475504755147552475534755447555475564755747558475594756047561475624756347564475654756647567475684756947570475714757247573475744757547576475774757847579475804758147582475834758447585475864758747588475894759047591475924759347594475954759647597475984759947600476014760247603476044760547606476074760847609476104761147612476134761447615476164761747618476194762047621476224762347624476254762647627476284762947630476314763247633476344763547636476374763847639476404764147642476434764447645476464764747648476494765047651476524765347654476554765647657476584765947660476614766247663476644766547666476674766847669476704767147672476734767447675476764767747678476794768047681476824768347684476854768647687476884768947690476914769247693476944769547696476974769847699477004770147702477034770447705477064770747708477094771047711477124771347714477154771647717477184771947720477214772247723477244772547726477274772847729477304773147732477334773447735477364773747738477394774047741477424774347744477454774647747477484774947750477514775247753477544775547756477574775847759477604776147762477634776447765477664776747768477694777047771477724777347774477754777647777477784777947780477814778247783477844778547786477874778847789477904779147792477934779447795477964779747798477994780047801478024780347804478054780647807478084780947810478114781247813478144781547816478174781847819478204782147822478234782447825478264782747828478294783047831478324783347834478354783647837478384783947840478414784247843478444784547846478474784847849478504785147852478534785447855478564785747858478594786047861478624786347864478654786647867478684786947870478714787247873478744787547876478774787847879478804788147882478834788447885478864788747888478894789047891478924789347894478954789647897478984789947900479014790247903479044790547906479074790847909479104791147912479134791447915479164791747918479194792047921479224792347924479254792647927479284792947930479314793247933479344793547936479374793847939479404794147942479434794447945479464794747948479494795047951479524795347954479554795647957479584795947960479614796247963479644796547966479674796847969479704797147972479734797447975479764797747978479794798047981479824798347984479854798647987479884798947990479914799247993479944799547996479974799847999480004800148002480034800448005480064800748008480094801048011480124801348014480154801648017480184801948020480214802248023480244802548026480274802848029480304803148032480334803448035480364803748038480394804048041480424804348044480454804648047480484804948050480514805248053480544805548056480574805848059480604806148062480634806448065480664806748068480694807048071480724807348074480754807648077480784807948080480814808248083480844808548086480874808848089480904809148092480934809448095480964809748098480994810048101481024810348104481054810648107481084810948110481114811248113481144811548116481174811848119481204812148122481234812448125481264812748128481294813048131481324813348134481354813648137481384813948140481414814248143481444814548146481474814848149481504815148152481534815448155481564815748158481594816048161481624816348164481654816648167481684816948170481714817248173481744817548176481774817848179481804818148182481834818448185481864818748188481894819048191481924819348194481954819648197481984819948200482014820248203482044820548206482074820848209482104821148212482134821448215482164821748218482194822048221482224822348224482254822648227482284822948230482314823248233482344823548236482374823848239482404824148242482434824448245482464824748248482494825048251482524825348254482554825648257482584825948260482614826248263482644826548266482674826848269482704827148272482734827448275482764827748278482794828048281482824828348284482854828648287482884828948290482914829248293482944829548296482974829848299483004830148302483034830448305483064830748308483094831048311483124831348314483154831648317483184831948320483214832248323483244832548326483274832848329483304833148332483334833448335483364833748338483394834048341483424834348344483454834648347483484834948350483514835248353483544835548356483574835848359483604836148362483634836448365483664836748368483694837048371483724837348374483754837648377483784837948380483814838248383483844838548386483874838848389483904839148392483934839448395483964839748398483994840048401484024840348404484054840648407484084840948410484114841248413484144841548416484174841848419484204842148422484234842448425484264842748428484294843048431484324843348434484354843648437484384843948440484414844248443484444844548446484474844848449484504845148452484534845448455484564845748458484594846048461484624846348464484654846648467484684846948470484714847248473484744847548476484774847848479484804848148482484834848448485484864848748488484894849048491484924849348494484954849648497484984849948500485014850248503485044850548506485074850848509485104851148512485134851448515485164851748518485194852048521485224852348524485254852648527485284852948530485314853248533485344853548536485374853848539485404854148542485434854448545485464854748548485494855048551485524855348554485554855648557485584855948560485614856248563485644856548566485674856848569485704857148572485734857448575485764857748578485794858048581485824858348584485854858648587485884858948590485914859248593485944859548596485974859848599486004860148602486034860448605486064860748608486094861048611486124861348614486154861648617486184861948620486214862248623486244862548626486274862848629486304863148632486334863448635486364863748638486394864048641486424864348644486454864648647486484864948650486514865248653486544865548656486574865848659486604866148662486634866448665486664866748668486694867048671486724867348674486754867648677486784867948680486814868248683486844868548686486874868848689486904869148692486934869448695486964869748698486994870048701487024870348704487054870648707487084870948710487114871248713487144871548716487174871848719487204872148722487234872448725487264872748728487294873048731487324873348734487354873648737487384873948740487414874248743487444874548746487474874848749487504875148752487534875448755487564875748758487594876048761487624876348764487654876648767487684876948770487714877248773487744877548776487774877848779487804878148782487834878448785487864878748788487894879048791487924879348794487954879648797487984879948800488014880248803488044880548806488074880848809488104881148812488134881448815488164881748818488194882048821488224882348824488254882648827488284882948830488314883248833488344883548836488374883848839488404884148842488434884448845488464884748848488494885048851488524885348854488554885648857488584885948860488614886248863488644886548866488674886848869488704887148872488734887448875488764887748878488794888048881488824888348884488854888648887488884888948890488914889248893488944889548896488974889848899489004890148902489034890448905489064890748908489094891048911489124891348914489154891648917489184891948920489214892248923489244892548926489274892848929489304893148932489334893448935489364893748938489394894048941489424894348944489454894648947489484894948950489514895248953489544895548956489574895848959489604896148962489634896448965489664896748968489694897048971489724897348974489754897648977489784897948980489814898248983489844898548986489874898848989489904899148992489934899448995489964899748998489994900049001490024900349004490054900649007490084900949010490114901249013490144901549016490174901849019490204902149022490234902449025490264902749028490294903049031490324903349034490354903649037490384903949040490414904249043490444904549046490474904849049490504905149052490534905449055490564905749058490594906049061490624906349064490654906649067490684906949070490714907249073490744907549076490774907849079490804908149082490834908449085490864908749088490894909049091490924909349094490954909649097490984909949100491014910249103491044910549106491074910849109491104911149112491134911449115491164911749118491194912049121491224912349124491254912649127491284912949130491314913249133491344913549136491374913849139491404914149142491434914449145491464914749148491494915049151491524915349154491554915649157491584915949160491614916249163491644916549166491674916849169491704917149172491734917449175491764917749178491794918049181491824918349184491854918649187491884918949190491914919249193491944919549196491974919849199492004920149202492034920449205492064920749208492094921049211492124921349214492154921649217492184921949220492214922249223492244922549226492274922849229492304923149232492334923449235492364923749238492394924049241492424924349244492454924649247492484924949250492514925249253492544925549256492574925849259492604926149262492634926449265492664926749268492694927049271492724927349274492754927649277492784927949280492814928249283492844928549286492874928849289492904929149292492934929449295492964929749298492994930049301493024930349304493054930649307493084930949310493114931249313493144931549316493174931849319493204932149322493234932449325493264932749328493294933049331493324933349334493354933649337493384933949340493414934249343493444934549346493474934849349493504935149352493534935449355493564935749358493594936049361493624936349364493654936649367493684936949370493714937249373493744937549376493774937849379493804938149382493834938449385493864938749388493894939049391493924939349394493954939649397493984939949400494014940249403494044940549406494074940849409494104941149412494134941449415494164941749418494194942049421494224942349424494254942649427494284942949430494314943249433494344943549436494374943849439494404944149442494434944449445494464944749448494494945049451494524945349454494554945649457494584945949460494614946249463494644946549466494674946849469494704947149472494734947449475494764947749478494794948049481494824948349484494854948649487494884948949490494914949249493494944949549496494974949849499495004950149502495034950449505495064950749508495094951049511495124951349514495154951649517495184951949520495214952249523495244952549526495274952849529495304953149532495334953449535495364953749538495394954049541495424954349544495454954649547495484954949550495514955249553495544955549556495574955849559495604956149562495634956449565495664956749568495694957049571495724957349574495754957649577495784957949580495814958249583495844958549586495874958849589495904959149592495934959449595495964959749598495994960049601496024960349604496054960649607496084960949610496114961249613496144961549616496174961849619496204962149622496234962449625496264962749628496294963049631496324963349634496354963649637496384963949640496414964249643496444964549646496474964849649496504965149652496534965449655496564965749658496594966049661496624966349664496654966649667496684966949670496714967249673496744967549676496774967849679496804968149682496834968449685496864968749688496894969049691496924969349694496954969649697496984969949700497014970249703497044970549706497074970849709497104971149712497134971449715497164971749718497194972049721497224972349724497254972649727497284972949730497314973249733497344973549736497374973849739497404974149742497434974449745497464974749748497494975049751497524975349754497554975649757497584975949760497614976249763497644976549766497674976849769497704977149772497734977449775497764977749778497794978049781497824978349784497854978649787497884978949790497914979249793497944979549796497974979849799498004980149802498034980449805498064980749808498094981049811498124981349814498154981649817498184981949820498214982249823498244982549826498274982849829498304983149832498334983449835498364983749838498394984049841498424984349844498454984649847498484984949850498514985249853498544985549856498574985849859498604986149862498634986449865498664986749868498694987049871498724987349874498754987649877498784987949880498814988249883498844988549886498874988849889498904989149892498934989449895498964989749898498994990049901499024990349904499054990649907499084990949910499114991249913499144991549916499174991849919499204992149922499234992449925499264992749928499294993049931499324993349934499354993649937499384993949940499414994249943499444994549946499474994849949499504995149952499534995449955499564995749958499594996049961499624996349964499654996649967499684996949970499714997249973499744997549976499774997849979499804998149982499834998449985499864998749988499894999049991499924999349994499954999649997499984999950000500015000250003500045000550006500075000850009500105001150012500135001450015500165001750018500195002050021500225002350024500255002650027500285002950030500315003250033500345003550036500375003850039500405004150042500435004450045500465004750048500495005050051500525005350054500555005650057500585005950060500615006250063500645006550066500675006850069500705007150072500735007450075500765007750078500795008050081500825008350084500855008650087500885008950090500915009250093500945009550096500975009850099501005010150102501035010450105501065010750108501095011050111501125011350114501155011650117501185011950120501215012250123501245012550126501275012850129501305013150132501335013450135501365013750138501395014050141501425014350144501455014650147501485014950150501515015250153501545015550156501575015850159501605016150162501635016450165501665016750168501695017050171501725017350174501755017650177501785017950180501815018250183501845018550186501875018850189501905019150192501935019450195501965019750198501995020050201502025020350204502055020650207502085020950210502115021250213502145021550216502175021850219502205022150222502235022450225502265022750228502295023050231502325023350234502355023650237502385023950240502415024250243502445024550246502475024850249502505025150252502535025450255502565025750258502595026050261502625026350264502655026650267502685026950270502715027250273502745027550276502775027850279502805028150282502835028450285502865028750288502895029050291502925029350294502955029650297502985029950300503015030250303503045030550306503075030850309503105031150312503135031450315503165031750318503195032050321503225032350324503255032650327503285032950330503315033250333503345033550336503375033850339503405034150342503435034450345503465034750348503495035050351503525035350354503555035650357503585035950360503615036250363503645036550366503675036850369503705037150372503735037450375503765037750378503795038050381503825038350384503855038650387503885038950390503915039250393503945039550396503975039850399504005040150402504035040450405504065040750408504095041050411504125041350414504155041650417504185041950420504215042250423504245042550426504275042850429504305043150432504335043450435504365043750438504395044050441504425044350444504455044650447504485044950450504515045250453504545045550456504575045850459504605046150462504635046450465504665046750468504695047050471504725047350474504755047650477504785047950480504815048250483504845048550486504875048850489504905049150492504935049450495504965049750498504995050050501505025050350504505055050650507505085050950510505115051250513505145051550516505175051850519505205052150522505235052450525505265052750528505295053050531505325053350534505355053650537505385053950540505415054250543505445054550546505475054850549505505055150552505535055450555505565055750558505595056050561505625056350564505655056650567505685056950570505715057250573505745057550576505775057850579505805058150582505835058450585505865058750588505895059050591505925059350594505955059650597505985059950600506015060250603506045060550606506075060850609506105061150612506135061450615506165061750618506195062050621506225062350624506255062650627506285062950630506315063250633506345063550636506375063850639506405064150642506435064450645506465064750648506495065050651506525065350654506555065650657506585065950660506615066250663506645066550666506675066850669506705067150672506735067450675506765067750678506795068050681506825068350684506855068650687506885068950690506915069250693506945069550696506975069850699507005070150702507035070450705507065070750708507095071050711507125071350714507155071650717507185071950720507215072250723507245072550726507275072850729507305073150732507335073450735507365073750738507395074050741507425074350744507455074650747507485074950750507515075250753507545075550756507575075850759507605076150762507635076450765507665076750768507695077050771507725077350774507755077650777507785077950780507815078250783507845078550786507875078850789507905079150792507935079450795507965079750798507995080050801508025080350804508055080650807508085080950810508115081250813508145081550816508175081850819508205082150822508235082450825508265082750828508295083050831508325083350834508355083650837508385083950840508415084250843508445084550846508475084850849508505085150852508535085450855508565085750858508595086050861508625086350864508655086650867508685086950870508715087250873508745087550876508775087850879508805088150882508835088450885508865088750888508895089050891508925089350894508955089650897508985089950900509015090250903509045090550906509075090850909509105091150912509135091450915509165091750918509195092050921509225092350924509255092650927509285092950930509315093250933509345093550936509375093850939509405094150942509435094450945509465094750948509495095050951509525095350954509555095650957509585095950960509615096250963509645096550966509675096850969509705097150972509735097450975509765097750978509795098050981509825098350984509855098650987509885098950990509915099250993509945099550996509975099850999510005100151002510035100451005510065100751008510095101051011510125101351014510155101651017510185101951020510215102251023510245102551026510275102851029510305103151032510335103451035510365103751038510395104051041510425104351044510455104651047510485104951050510515105251053510545105551056510575105851059510605106151062510635106451065510665106751068510695107051071510725107351074510755107651077510785107951080510815108251083510845108551086510875108851089510905109151092510935109451095510965109751098510995110051101511025110351104511055110651107511085110951110511115111251113511145111551116511175111851119511205112151122511235112451125511265112751128511295113051131511325113351134511355113651137511385113951140511415114251143511445114551146511475114851149511505115151152511535115451155511565115751158511595116051161511625116351164511655116651167511685116951170511715117251173511745117551176511775117851179511805118151182511835118451185511865118751188511895119051191511925119351194511955119651197511985119951200512015120251203512045120551206512075120851209512105121151212512135121451215512165121751218512195122051221512225122351224512255122651227512285122951230512315123251233512345123551236512375123851239512405124151242512435124451245512465124751248512495125051251512525125351254512555125651257512585125951260512615126251263512645126551266512675126851269512705127151272512735127451275512765127751278512795128051281512825128351284512855128651287512885128951290512915129251293512945129551296512975129851299513005130151302513035130451305513065130751308513095131051311513125131351314513155131651317513185131951320513215132251323513245132551326513275132851329513305133151332513335133451335513365133751338513395134051341513425134351344513455134651347513485134951350513515135251353513545135551356513575135851359513605136151362513635136451365513665136751368513695137051371513725137351374513755137651377513785137951380513815138251383513845138551386513875138851389513905139151392513935139451395513965139751398513995140051401514025140351404514055140651407514085140951410514115141251413514145141551416514175141851419514205142151422514235142451425514265142751428514295143051431514325143351434514355143651437514385143951440514415144251443514445144551446514475144851449514505145151452514535145451455514565145751458514595146051461514625146351464514655146651467514685146951470514715147251473514745147551476514775147851479514805148151482514835148451485514865148751488514895149051491514925149351494514955149651497514985149951500515015150251503515045150551506515075150851509515105151151512515135151451515515165151751518515195152051521515225152351524515255152651527515285152951530515315153251533515345153551536515375153851539515405154151542515435154451545515465154751548515495155051551515525155351554515555155651557515585155951560515615156251563515645156551566515675156851569515705157151572515735157451575515765157751578515795158051581515825158351584515855158651587515885158951590515915159251593515945159551596515975159851599516005160151602516035160451605516065160751608516095161051611516125161351614516155161651617516185161951620516215162251623516245162551626516275162851629516305163151632516335163451635516365163751638516395164051641516425164351644516455164651647516485164951650516515165251653516545165551656516575165851659516605166151662516635166451665516665166751668516695167051671516725167351674516755167651677516785167951680516815168251683516845168551686516875168851689516905169151692516935169451695516965169751698516995170051701517025170351704517055170651707517085170951710517115171251713517145171551716517175171851719517205172151722517235172451725517265172751728517295173051731517325173351734517355173651737517385173951740517415174251743517445174551746517475174851749517505175151752517535175451755517565175751758517595176051761517625176351764517655176651767517685176951770517715177251773517745177551776517775177851779517805178151782517835178451785517865178751788517895179051791517925179351794517955179651797517985179951800518015180251803518045180551806518075180851809518105181151812518135181451815518165181751818518195182051821518225182351824518255182651827518285182951830518315183251833518345183551836518375183851839518405184151842518435184451845518465184751848518495185051851518525185351854518555185651857518585185951860518615186251863518645186551866518675186851869518705187151872518735187451875518765187751878518795188051881518825188351884518855188651887518885188951890518915189251893518945189551896518975189851899519005190151902519035190451905519065190751908519095191051911519125191351914519155191651917519185191951920519215192251923519245192551926519275192851929519305193151932519335193451935519365193751938519395194051941519425194351944519455194651947519485194951950519515195251953519545195551956519575195851959519605196151962519635196451965519665196751968519695197051971519725197351974519755197651977519785197951980519815198251983519845198551986519875198851989519905199151992519935199451995519965199751998519995200052001520025200352004520055200652007520085200952010520115201252013520145201552016520175201852019520205202152022520235202452025520265202752028520295203052031520325203352034520355203652037520385203952040520415204252043520445204552046520475204852049520505205152052520535205452055520565205752058520595206052061520625206352064520655206652067520685206952070520715207252073520745207552076520775207852079520805208152082520835208452085520865208752088520895209052091520925209352094520955209652097520985209952100521015210252103521045210552106521075210852109521105211152112521135211452115521165211752118521195212052121521225212352124521255212652127521285212952130521315213252133521345213552136521375213852139521405214152142521435214452145521465214752148521495215052151521525215352154521555215652157521585215952160521615216252163521645216552166521675216852169521705217152172521735217452175521765217752178521795218052181521825218352184521855218652187521885218952190521915219252193521945219552196521975219852199522005220152202522035220452205522065220752208522095221052211522125221352214522155221652217522185221952220522215222252223522245222552226522275222852229522305223152232522335223452235522365223752238522395224052241522425224352244522455224652247522485224952250522515225252253522545225552256522575225852259522605226152262522635226452265522665226752268522695227052271522725227352274522755227652277522785227952280522815228252283522845228552286522875228852289522905229152292522935229452295522965229752298522995230052301523025230352304523055230652307523085230952310523115231252313523145231552316523175231852319523205232152322523235232452325523265232752328523295233052331523325233352334523355233652337523385233952340523415234252343523445234552346523475234852349523505235152352523535235452355523565235752358523595236052361523625236352364523655236652367523685236952370523715237252373523745237552376523775237852379523805238152382523835238452385523865238752388523895239052391523925239352394523955239652397523985239952400524015240252403524045240552406524075240852409524105241152412524135241452415524165241752418524195242052421524225242352424524255242652427524285242952430524315243252433524345243552436524375243852439524405244152442524435244452445524465244752448524495245052451524525245352454524555245652457524585245952460524615246252463524645246552466524675246852469524705247152472524735247452475524765247752478524795248052481524825248352484524855248652487524885248952490524915249252493524945249552496524975249852499525005250152502525035250452505525065250752508525095251052511525125251352514525155251652517525185251952520525215252252523525245252552526525275252852529525305253152532525335253452535525365253752538525395254052541525425254352544525455254652547525485254952550525515255252553525545255552556525575255852559525605256152562525635256452565525665256752568525695257052571525725257352574525755257652577525785257952580525815258252583525845258552586525875258852589525905259152592525935259452595525965259752598525995260052601526025260352604526055260652607526085260952610526115261252613526145261552616526175261852619526205262152622526235262452625526265262752628526295263052631526325263352634526355263652637526385263952640526415264252643526445264552646526475264852649526505265152652526535265452655526565265752658526595266052661526625266352664526655266652667526685266952670526715267252673526745267552676526775267852679526805268152682526835268452685526865268752688526895269052691526925269352694526955269652697526985269952700527015270252703527045270552706527075270852709527105271152712527135271452715527165271752718527195272052721527225272352724527255272652727527285272952730527315273252733527345273552736527375273852739527405274152742527435274452745527465274752748527495275052751527525275352754527555275652757527585275952760527615276252763527645276552766527675276852769527705277152772527735277452775527765277752778527795278052781527825278352784527855278652787527885278952790527915279252793527945279552796527975279852799528005280152802528035280452805528065280752808528095281052811528125281352814528155281652817528185281952820528215282252823528245282552826528275282852829528305283152832528335283452835528365283752838528395284052841528425284352844528455284652847528485284952850528515285252853528545285552856528575285852859528605286152862528635286452865528665286752868528695287052871528725287352874528755287652877528785287952880528815288252883528845288552886528875288852889528905289152892528935289452895528965289752898528995290052901529025290352904529055290652907529085290952910529115291252913529145291552916529175291852919529205292152922529235292452925529265292752928529295293052931529325293352934529355293652937529385293952940529415294252943529445294552946529475294852949529505295152952529535295452955529565295752958529595296052961529625296352964529655296652967529685296952970529715297252973529745297552976529775297852979529805298152982529835298452985529865298752988529895299052991529925299352994529955299652997529985299953000530015300253003530045300553006530075300853009530105301153012530135301453015530165301753018530195302053021530225302353024530255302653027530285302953030530315303253033530345303553036530375303853039530405304153042530435304453045530465304753048530495305053051530525305353054530555305653057530585305953060530615306253063530645306553066530675306853069530705307153072530735307453075530765307753078530795308053081530825308353084530855308653087530885308953090530915309253093530945309553096530975309853099531005310153102531035310453105531065310753108531095311053111531125311353114531155311653117531185311953120531215312253123531245312553126531275312853129531305313153132531335313453135531365313753138531395314053141531425314353144531455314653147531485314953150531515315253153531545315553156531575315853159531605316153162531635316453165531665316753168531695317053171531725317353174531755317653177531785317953180531815318253183531845318553186531875318853189531905319153192531935319453195531965319753198531995320053201532025320353204532055320653207532085320953210532115321253213532145321553216532175321853219532205322153222532235322453225532265322753228532295323053231532325323353234532355323653237532385323953240532415324253243532445324553246532475324853249532505325153252532535325453255532565325753258532595326053261532625326353264532655326653267532685326953270532715327253273532745327553276532775327853279532805328153282532835328453285532865328753288532895329053291532925329353294532955329653297532985329953300533015330253303533045330553306533075330853309533105331153312533135331453315533165331753318533195332053321533225332353324533255332653327533285332953330533315333253333533345333553336533375333853339533405334153342533435334453345533465334753348533495335053351533525335353354533555335653357533585335953360533615336253363533645336553366533675336853369533705337153372533735337453375533765337753378533795338053381533825338353384533855338653387533885338953390533915339253393533945339553396533975339853399534005340153402534035340453405534065340753408534095341053411534125341353414534155341653417534185341953420534215342253423534245342553426534275342853429534305343153432534335343453435534365343753438534395344053441534425344353444534455344653447534485344953450534515345253453534545345553456534575345853459534605346153462534635346453465534665346753468534695347053471534725347353474534755347653477534785347953480534815348253483534845348553486534875348853489534905349153492534935349453495534965349753498534995350053501535025350353504535055350653507535085350953510535115351253513535145351553516535175351853519535205352153522535235352453525535265352753528535295353053531535325353353534535355353653537535385353953540535415354253543535445354553546535475354853549535505355153552535535355453555535565355753558535595356053561535625356353564535655356653567535685356953570535715357253573535745357553576535775357853579535805358153582535835358453585535865358753588535895359053591535925359353594535955359653597535985359953600536015360253603536045360553606536075360853609536105361153612536135361453615536165361753618536195362053621536225362353624536255362653627536285362953630536315363253633536345363553636536375363853639536405364153642536435364453645536465364753648536495365053651536525365353654536555365653657536585365953660536615366253663536645366553666536675366853669536705367153672536735367453675536765367753678536795368053681536825368353684536855368653687536885368953690536915369253693536945369553696536975369853699537005370153702537035370453705537065370753708537095371053711537125371353714537155371653717537185371953720537215372253723537245372553726537275372853729537305373153732537335373453735537365373753738537395374053741537425374353744537455374653747537485374953750537515375253753537545375553756537575375853759537605376153762537635376453765537665376753768537695377053771537725377353774537755377653777537785377953780537815378253783537845378553786537875378853789537905379153792537935379453795537965379753798537995380053801538025380353804538055380653807538085380953810538115381253813538145381553816538175381853819538205382153822538235382453825538265382753828538295383053831538325383353834538355383653837538385383953840538415384253843538445384553846538475384853849538505385153852538535385453855538565385753858538595386053861538625386353864538655386653867538685386953870538715387253873538745387553876538775387853879538805388153882538835388453885538865388753888538895389053891538925389353894538955389653897538985389953900539015390253903539045390553906539075390853909539105391153912539135391453915539165391753918539195392053921539225392353924539255392653927539285392953930539315393253933539345393553936539375393853939539405394153942539435394453945539465394753948539495395053951539525395353954539555395653957539585395953960539615396253963539645396553966539675396853969539705397153972539735397453975539765397753978539795398053981539825398353984539855398653987539885398953990539915399253993539945399553996539975399853999540005400154002540035400454005540065400754008540095401054011540125401354014540155401654017540185401954020540215402254023540245402554026540275402854029540305403154032540335403454035540365403754038540395404054041540425404354044540455404654047540485404954050540515405254053540545405554056540575405854059540605406154062540635406454065540665406754068540695407054071540725407354074540755407654077540785407954080540815408254083540845408554086540875408854089540905409154092540935409454095540965409754098540995410054101541025410354104541055410654107541085410954110541115411254113541145411554116541175411854119541205412154122541235412454125541265412754128541295413054131541325413354134541355413654137541385413954140541415414254143541445414554146541475414854149541505415154152541535415454155541565415754158541595416054161541625416354164541655416654167541685416954170541715417254173541745417554176541775417854179541805418154182541835418454185541865418754188541895419054191541925419354194541955419654197541985419954200542015420254203542045420554206542075420854209542105421154212542135421454215542165421754218542195422054221542225422354224542255422654227542285422954230542315423254233542345423554236542375423854239542405424154242542435424454245542465424754248542495425054251542525425354254542555425654257542585425954260542615426254263542645426554266542675426854269542705427154272542735427454275542765427754278542795428054281542825428354284542855428654287542885428954290542915429254293542945429554296542975429854299543005430154302543035430454305543065430754308543095431054311543125431354314543155431654317543185431954320543215432254323543245432554326543275432854329543305433154332543335433454335543365433754338543395434054341543425434354344543455434654347543485434954350543515435254353543545435554356543575435854359543605436154362543635436454365543665436754368543695437054371543725437354374543755437654377543785437954380543815438254383543845438554386543875438854389543905439154392543935439454395543965439754398543995440054401544025440354404544055440654407544085440954410544115441254413544145441554416544175441854419544205442154422544235442454425544265442754428544295443054431544325443354434544355443654437544385443954440544415444254443544445444554446544475444854449544505445154452544535445454455544565445754458544595446054461544625446354464544655446654467544685446954470544715447254473544745447554476544775447854479544805448154482544835448454485544865448754488544895449054491544925449354494544955449654497544985449954500545015450254503545045450554506545075450854509545105451154512545135451454515545165451754518545195452054521545225452354524545255452654527545285452954530545315453254533545345453554536545375453854539545405454154542545435454454545545465454754548545495455054551545525455354554545555455654557545585455954560545615456254563545645456554566545675456854569545705457154572545735457454575545765457754578545795458054581545825458354584545855458654587545885458954590545915459254593545945459554596545975459854599546005460154602546035460454605546065460754608546095461054611546125461354614546155461654617546185461954620546215462254623546245462554626546275462854629546305463154632546335463454635546365463754638546395464054641546425464354644546455464654647546485464954650546515465254653546545465554656546575465854659546605466154662546635466454665546665466754668546695467054671546725467354674546755467654677546785467954680546815468254683546845468554686546875468854689546905469154692546935469454695546965469754698546995470054701547025470354704547055470654707547085470954710547115471254713547145471554716547175471854719547205472154722547235472454725547265472754728547295473054731547325473354734547355473654737547385473954740547415474254743547445474554746547475474854749547505475154752547535475454755547565475754758547595476054761547625476354764547655476654767547685476954770547715477254773547745477554776547775477854779547805478154782547835478454785547865478754788547895479054791547925479354794547955479654797547985479954800548015480254803548045480554806548075480854809548105481154812548135481454815548165481754818548195482054821548225482354824548255482654827548285482954830548315483254833548345483554836548375483854839548405484154842548435484454845548465484754848548495485054851548525485354854548555485654857548585485954860548615486254863548645486554866548675486854869548705487154872548735487454875548765487754878548795488054881548825488354884548855488654887548885488954890548915489254893548945489554896548975489854899549005490154902549035490454905549065490754908549095491054911549125491354914549155491654917549185491954920549215492254923549245492554926549275492854929549305493154932549335493454935549365493754938549395494054941549425494354944549455494654947549485494954950549515495254953549545495554956549575495854959549605496154962549635496454965549665496754968549695497054971549725497354974549755497654977549785497954980549815498254983549845498554986549875498854989549905499154992549935499454995549965499754998549995500055001550025500355004550055500655007550085500955010550115501255013550145501555016550175501855019550205502155022550235502455025550265502755028550295503055031550325503355034550355503655037550385503955040550415504255043550445504555046550475504855049550505505155052550535505455055550565505755058550595506055061550625506355064550655506655067550685506955070550715507255073550745507555076550775507855079550805508155082550835508455085550865508755088550895509055091550925509355094550955509655097550985509955100551015510255103551045510555106551075510855109551105511155112551135511455115551165511755118551195512055121551225512355124551255512655127551285512955130551315513255133551345513555136551375513855139551405514155142551435514455145551465514755148551495515055151551525515355154551555515655157551585515955160551615516255163551645516555166551675516855169551705517155172551735517455175551765517755178551795518055181551825518355184551855518655187551885518955190551915519255193551945519555196551975519855199552005520155202552035520455205552065520755208552095521055211552125521355214552155521655217552185521955220552215522255223552245522555226552275522855229552305523155232552335523455235552365523755238552395524055241552425524355244552455524655247552485524955250552515525255253552545525555256552575525855259552605526155262552635526455265552665526755268552695527055271552725527355274552755527655277552785527955280552815528255283552845528555286552875528855289552905529155292552935529455295552965529755298552995530055301553025530355304553055530655307553085530955310553115531255313553145531555316553175531855319553205532155322553235532455325553265532755328553295533055331553325533355334553355533655337553385533955340553415534255343553445534555346553475534855349553505535155352553535535455355553565535755358553595536055361553625536355364553655536655367553685536955370553715537255373553745537555376553775537855379553805538155382553835538455385553865538755388553895539055391553925539355394553955539655397553985539955400554015540255403554045540555406554075540855409554105541155412554135541455415554165541755418554195542055421554225542355424554255542655427554285542955430554315543255433554345543555436554375543855439554405544155442554435544455445554465544755448554495545055451554525545355454554555545655457554585545955460554615546255463554645546555466554675546855469554705547155472554735547455475554765547755478554795548055481554825548355484554855548655487554885548955490554915549255493554945549555496554975549855499555005550155502555035550455505555065550755508555095551055511555125551355514555155551655517555185551955520555215552255523555245552555526555275552855529555305553155532555335553455535555365553755538555395554055541555425554355544555455554655547555485554955550555515555255553555545555555556555575555855559555605556155562555635556455565555665556755568555695557055571555725557355574555755557655577555785557955580555815558255583555845558555586555875558855589555905559155592555935559455595555965559755598555995560055601556025560355604556055560655607556085560955610556115561255613556145561555616556175561855619556205562155622556235562455625556265562755628556295563055631556325563355634556355563655637556385563955640556415564255643556445564555646556475564855649556505565155652556535565455655556565565755658556595566055661556625566355664556655566655667556685566955670556715567255673556745567555676556775567855679556805568155682556835568455685556865568755688556895569055691556925569355694556955569655697556985569955700557015570255703557045570555706557075570855709557105571155712557135571455715557165571755718557195572055721557225572355724557255572655727557285572955730557315573255733557345573555736557375573855739557405574155742557435574455745557465574755748557495575055751557525575355754557555575655757557585575955760557615576255763557645576555766557675576855769557705577155772557735577455775557765577755778557795578055781557825578355784557855578655787557885578955790557915579255793557945579555796557975579855799558005580155802558035580455805558065580755808558095581055811558125581355814558155581655817558185581955820558215582255823558245582555826558275582855829558305583155832558335583455835558365583755838558395584055841558425584355844558455584655847558485584955850558515585255853558545585555856558575585855859558605586155862558635586455865558665586755868558695587055871558725587355874558755587655877558785587955880558815588255883558845588555886558875588855889558905589155892558935589455895558965589755898558995590055901559025590355904559055590655907559085590955910559115591255913559145591555916559175591855919559205592155922559235592455925559265592755928559295593055931559325593355934559355593655937559385593955940559415594255943559445594555946559475594855949559505595155952559535595455955559565595755958559595596055961559625596355964559655596655967559685596955970559715597255973559745597555976559775597855979559805598155982559835598455985559865598755988559895599055991559925599355994559955599655997559985599956000560015600256003560045600556006560075600856009560105601156012560135601456015560165601756018560195602056021560225602356024560255602656027560285602956030560315603256033560345603556036560375603856039560405604156042560435604456045560465604756048560495605056051560525605356054560555605656057560585605956060560615606256063560645606556066560675606856069560705607156072560735607456075560765607756078560795608056081560825608356084560855608656087560885608956090560915609256093560945609556096560975609856099561005610156102561035610456105561065610756108561095611056111561125611356114561155611656117561185611956120561215612256123561245612556126561275612856129561305613156132561335613456135561365613756138561395614056141561425614356144561455614656147561485614956150561515615256153561545615556156561575615856159561605616156162561635616456165561665616756168561695617056171561725617356174561755617656177561785617956180561815618256183561845618556186561875618856189561905619156192561935619456195561965619756198561995620056201562025620356204562055620656207562085620956210562115621256213562145621556216562175621856219562205622156222562235622456225562265622756228562295623056231562325623356234562355623656237562385623956240562415624256243562445624556246562475624856249562505625156252562535625456255562565625756258562595626056261562625626356264562655626656267562685626956270562715627256273562745627556276562775627856279562805628156282562835628456285562865628756288562895629056291562925629356294562955629656297562985629956300563015630256303563045630556306563075630856309563105631156312563135631456315563165631756318563195632056321563225632356324563255632656327563285632956330563315633256333563345633556336563375633856339563405634156342563435634456345563465634756348563495635056351563525635356354563555635656357563585635956360563615636256363563645636556366563675636856369563705637156372563735637456375563765637756378563795638056381563825638356384563855638656387563885638956390563915639256393563945639556396563975639856399564005640156402564035640456405564065640756408564095641056411564125641356414564155641656417564185641956420564215642256423564245642556426564275642856429564305643156432564335643456435564365643756438564395644056441564425644356444564455644656447564485644956450564515645256453564545645556456564575645856459564605646156462564635646456465564665646756468564695647056471564725647356474564755647656477564785647956480564815648256483564845648556486564875648856489564905649156492564935649456495564965649756498564995650056501565025650356504565055650656507565085650956510565115651256513565145651556516565175651856519565205652156522565235652456525565265652756528565295653056531565325653356534565355653656537565385653956540565415654256543565445654556546565475654856549565505655156552565535655456555565565655756558565595656056561565625656356564565655656656567565685656956570565715657256573565745657556576565775657856579565805658156582565835658456585565865658756588565895659056591565925659356594565955659656597565985659956600566015660256603566045660556606566075660856609566105661156612566135661456615566165661756618566195662056621566225662356624566255662656627566285662956630566315663256633566345663556636566375663856639566405664156642566435664456645566465664756648566495665056651566525665356654566555665656657566585665956660566615666256663566645666556666566675666856669566705667156672566735667456675566765667756678566795668056681566825668356684566855668656687566885668956690566915669256693566945669556696566975669856699567005670156702567035670456705567065670756708567095671056711567125671356714567155671656717567185671956720567215672256723567245672556726567275672856729567305673156732567335673456735567365673756738567395674056741567425674356744567455674656747567485674956750567515675256753567545675556756567575675856759567605676156762567635676456765567665676756768567695677056771567725677356774567755677656777567785677956780567815678256783567845678556786567875678856789567905679156792567935679456795567965679756798567995680056801568025680356804568055680656807568085680956810568115681256813568145681556816568175681856819568205682156822568235682456825568265682756828568295683056831568325683356834568355683656837568385683956840568415684256843568445684556846568475684856849568505685156852568535685456855568565685756858568595686056861568625686356864568655686656867568685686956870568715687256873568745687556876568775687856879568805688156882568835688456885568865688756888568895689056891568925689356894568955689656897568985689956900569015690256903569045690556906569075690856909569105691156912569135691456915569165691756918569195692056921569225692356924569255692656927569285692956930569315693256933569345693556936569375693856939569405694156942569435694456945569465694756948569495695056951569525695356954569555695656957569585695956960569615696256963569645696556966569675696856969569705697156972569735697456975569765697756978569795698056981569825698356984569855698656987569885698956990569915699256993569945699556996569975699856999570005700157002570035700457005570065700757008570095701057011570125701357014570155701657017570185701957020570215702257023570245702557026570275702857029570305703157032570335703457035570365703757038570395704057041570425704357044570455704657047570485704957050570515705257053570545705557056570575705857059570605706157062570635706457065570665706757068570695707057071570725707357074570755707657077570785707957080570815708257083570845708557086570875708857089570905709157092570935709457095570965709757098570995710057101571025710357104571055710657107571085710957110571115711257113571145711557116571175711857119571205712157122571235712457125571265712757128571295713057131571325713357134571355713657137571385713957140571415714257143571445714557146571475714857149571505715157152571535715457155571565715757158571595716057161571625716357164571655716657167571685716957170571715717257173571745717557176571775717857179571805718157182571835718457185571865718757188571895719057191571925719357194571955719657197571985719957200572015720257203572045720557206572075720857209572105721157212572135721457215572165721757218572195722057221572225722357224572255722657227572285722957230572315723257233572345723557236572375723857239572405724157242572435724457245572465724757248572495725057251572525725357254572555725657257572585725957260572615726257263572645726557266572675726857269572705727157272572735727457275572765727757278572795728057281572825728357284572855728657287572885728957290572915729257293572945729557296572975729857299573005730157302573035730457305573065730757308573095731057311573125731357314573155731657317573185731957320573215732257323573245732557326573275732857329573305733157332573335733457335573365733757338573395734057341573425734357344573455734657347573485734957350573515735257353573545735557356573575735857359573605736157362573635736457365573665736757368573695737057371573725737357374573755737657377573785737957380573815738257383573845738557386573875738857389573905739157392573935739457395573965739757398573995740057401574025740357404574055740657407574085740957410574115741257413574145741557416574175741857419574205742157422574235742457425574265742757428574295743057431574325743357434574355743657437574385743957440574415744257443574445744557446574475744857449574505745157452574535745457455574565745757458574595746057461574625746357464574655746657467574685746957470574715747257473574745747557476574775747857479574805748157482574835748457485574865748757488574895749057491574925749357494574955749657497574985749957500575015750257503575045750557506575075750857509575105751157512575135751457515575165751757518575195752057521575225752357524575255752657527575285752957530575315753257533575345753557536575375753857539575405754157542575435754457545575465754757548575495755057551575525755357554575555755657557575585755957560575615756257563575645756557566575675756857569575705757157572575735757457575575765757757578575795758057581575825758357584575855758657587575885758957590575915759257593575945759557596575975759857599576005760157602576035760457605576065760757608576095761057611576125761357614576155761657617576185761957620576215762257623576245762557626576275762857629576305763157632576335763457635576365763757638576395764057641576425764357644576455764657647576485764957650576515765257653576545765557656576575765857659576605766157662576635766457665576665766757668576695767057671576725767357674576755767657677576785767957680576815768257683576845768557686576875768857689576905769157692576935769457695576965769757698576995770057701577025770357704577055770657707577085770957710577115771257713577145771557716577175771857719577205772157722577235772457725577265772757728577295773057731577325773357734577355773657737577385773957740577415774257743577445774557746577475774857749577505775157752577535775457755577565775757758577595776057761577625776357764577655776657767577685776957770577715777257773577745777557776577775777857779577805778157782577835778457785577865778757788577895779057791577925779357794577955779657797577985779957800578015780257803578045780557806578075780857809578105781157812578135781457815578165781757818578195782057821578225782357824578255782657827578285782957830578315783257833578345783557836578375783857839578405784157842578435784457845578465784757848578495785057851578525785357854578555785657857578585785957860578615786257863578645786557866578675786857869578705787157872578735787457875578765787757878578795788057881578825788357884578855788657887578885788957890578915789257893578945789557896578975789857899579005790157902579035790457905579065790757908579095791057911579125791357914579155791657917579185791957920579215792257923579245792557926579275792857929579305793157932579335793457935579365793757938579395794057941579425794357944579455794657947579485794957950579515795257953579545795557956579575795857959579605796157962579635796457965579665796757968579695797057971579725797357974579755797657977579785797957980579815798257983579845798557986579875798857989579905799157992579935799457995579965799757998579995800058001580025800358004580055800658007580085800958010580115801258013580145801558016580175801858019580205802158022580235802458025580265802758028580295803058031580325803358034580355803658037580385803958040580415804258043580445804558046580475804858049580505805158052580535805458055580565805758058580595806058061580625806358064580655806658067580685806958070580715807258073580745807558076580775807858079580805808158082580835808458085580865808758088580895809058091580925809358094580955809658097580985809958100581015810258103581045810558106581075810858109581105811158112581135811458115581165811758118581195812058121581225812358124581255812658127581285812958130581315813258133581345813558136581375813858139581405814158142581435814458145581465814758148581495815058151581525815358154581555815658157581585815958160581615816258163581645816558166581675816858169581705817158172581735817458175581765817758178581795818058181581825818358184581855818658187581885818958190581915819258193581945819558196581975819858199582005820158202582035820458205582065820758208582095821058211582125821358214582155821658217582185821958220582215822258223582245822558226582275822858229582305823158232582335823458235582365823758238582395824058241582425824358244582455824658247582485824958250582515825258253582545825558256582575825858259582605826158262582635826458265582665826758268582695827058271582725827358274582755827658277582785827958280582815828258283582845828558286582875828858289582905829158292582935829458295582965829758298582995830058301583025830358304583055830658307583085830958310583115831258313583145831558316583175831858319583205832158322583235832458325583265832758328583295833058331583325833358334583355833658337583385833958340583415834258343583445834558346583475834858349583505835158352583535835458355583565835758358583595836058361583625836358364583655836658367583685836958370583715837258373583745837558376583775837858379583805838158382583835838458385583865838758388583895839058391583925839358394583955839658397583985839958400584015840258403584045840558406584075840858409584105841158412584135841458415584165841758418584195842058421584225842358424584255842658427584285842958430584315843258433584345843558436584375843858439584405844158442584435844458445584465844758448584495845058451584525845358454584555845658457584585845958460584615846258463584645846558466584675846858469584705847158472584735847458475584765847758478584795848058481584825848358484584855848658487584885848958490584915849258493584945849558496584975849858499585005850158502585035850458505585065850758508585095851058511585125851358514585155851658517585185851958520585215852258523585245852558526585275852858529585305853158532585335853458535585365853758538585395854058541585425854358544585455854658547585485854958550585515855258553585545855558556585575855858559585605856158562585635856458565585665856758568585695857058571585725857358574585755857658577585785857958580585815858258583585845858558586585875858858589585905859158592585935859458595585965859758598585995860058601586025860358604586055860658607586085860958610586115861258613586145861558616586175861858619586205862158622586235862458625586265862758628586295863058631586325863358634586355863658637586385863958640586415864258643586445864558646586475864858649586505865158652586535865458655586565865758658586595866058661586625866358664586655866658667586685866958670586715867258673586745867558676586775867858679586805868158682586835868458685586865868758688586895869058691586925869358694586955869658697586985869958700587015870258703587045870558706587075870858709587105871158712587135871458715587165871758718587195872058721587225872358724587255872658727587285872958730587315873258733587345873558736587375873858739587405874158742587435874458745587465874758748587495875058751587525875358754587555875658757587585875958760587615876258763587645876558766587675876858769587705877158772587735877458775587765877758778587795878058781587825878358784587855878658787587885878958790587915879258793587945879558796587975879858799588005880158802588035880458805588065880758808588095881058811588125881358814588155881658817588185881958820588215882258823588245882558826588275882858829588305883158832588335883458835588365883758838588395884058841588425884358844588455884658847588485884958850588515885258853588545885558856588575885858859588605886158862588635886458865588665886758868588695887058871588725887358874588755887658877588785887958880588815888258883588845888558886588875888858889588905889158892588935889458895588965889758898588995890058901589025890358904589055890658907589085890958910589115891258913589145891558916589175891858919589205892158922589235892458925589265892758928589295893058931589325893358934589355893658937589385893958940589415894258943589445894558946589475894858949589505895158952589535895458955589565895758958589595896058961589625896358964589655896658967589685896958970589715897258973589745897558976589775897858979589805898158982589835898458985589865898758988589895899058991589925899358994589955899658997589985899959000590015900259003590045900559006590075900859009590105901159012590135901459015590165901759018590195902059021590225902359024590255902659027590285902959030590315903259033590345903559036590375903859039590405904159042590435904459045590465904759048590495905059051590525905359054590555905659057590585905959060590615906259063590645906559066590675906859069590705907159072590735907459075590765907759078590795908059081590825908359084590855908659087590885908959090590915909259093590945909559096590975909859099591005910159102591035910459105591065910759108591095911059111591125911359114591155911659117591185911959120591215912259123591245912559126591275912859129591305913159132591335913459135591365913759138591395914059141591425914359144591455914659147591485914959150591515915259153591545915559156591575915859159591605916159162591635916459165591665916759168591695917059171591725917359174591755917659177591785917959180591815918259183591845918559186591875918859189591905919159192591935919459195591965919759198591995920059201592025920359204592055920659207592085920959210592115921259213592145921559216592175921859219592205922159222592235922459225592265922759228592295923059231592325923359234592355923659237592385923959240592415924259243592445924559246592475924859249592505925159252592535925459255592565925759258592595926059261592625926359264592655926659267592685926959270592715927259273592745927559276592775927859279592805928159282592835928459285592865928759288592895929059291592925929359294592955929659297592985929959300593015930259303593045930559306593075930859309593105931159312593135931459315593165931759318593195932059321593225932359324593255932659327593285932959330593315933259333593345933559336593375933859339593405934159342593435934459345593465934759348593495935059351593525935359354593555935659357593585935959360593615936259363593645936559366593675936859369593705937159372593735937459375593765937759378593795938059381593825938359384593855938659387593885938959390593915939259393593945939559396593975939859399594005940159402594035940459405594065940759408594095941059411594125941359414594155941659417594185941959420594215942259423594245942559426594275942859429594305943159432594335943459435594365943759438594395944059441594425944359444594455944659447594485944959450594515945259453594545945559456594575945859459594605946159462594635946459465594665946759468594695947059471594725947359474594755947659477594785947959480594815948259483594845948559486594875948859489594905949159492594935949459495594965949759498594995950059501595025950359504595055950659507595085950959510595115951259513595145951559516595175951859519595205952159522595235952459525595265952759528595295953059531595325953359534595355953659537595385953959540595415954259543595445954559546595475954859549595505955159552595535955459555595565955759558595595956059561595625956359564595655956659567595685956959570595715957259573595745957559576595775957859579595805958159582595835958459585595865958759588595895959059591595925959359594595955959659597595985959959600596015960259603596045960559606596075960859609596105961159612596135961459615596165961759618596195962059621596225962359624596255962659627596285962959630596315963259633596345963559636596375963859639596405964159642596435964459645596465964759648596495965059651596525965359654596555965659657596585965959660596615966259663596645966559666596675966859669596705967159672596735967459675596765967759678596795968059681596825968359684596855968659687596885968959690596915969259693596945969559696596975969859699597005970159702597035970459705597065970759708597095971059711597125971359714597155971659717597185971959720597215972259723597245972559726597275972859729597305973159732597335973459735597365973759738597395974059741597425974359744597455974659747597485974959750597515975259753597545975559756597575975859759597605976159762597635976459765597665976759768597695977059771597725977359774597755977659777597785977959780597815978259783597845978559786597875978859789597905979159792597935979459795597965979759798597995980059801598025980359804598055980659807598085980959810598115981259813598145981559816598175981859819598205982159822598235982459825598265982759828598295983059831598325983359834598355983659837598385983959840598415984259843598445984559846598475984859849598505985159852598535985459855598565985759858598595986059861598625986359864598655986659867598685986959870598715987259873598745987559876598775987859879598805988159882598835988459885598865988759888598895989059891598925989359894598955989659897598985989959900599015990259903599045990559906599075990859909599105991159912599135991459915599165991759918599195992059921599225992359924599255992659927599285992959930599315993259933599345993559936599375993859939599405994159942599435994459945599465994759948599495995059951599525995359954599555995659957599585995959960599615996259963599645996559966599675996859969599705997159972599735997459975599765997759978599795998059981599825998359984599855998659987599885998959990599915999259993599945999559996599975999859999600006000160002600036000460005600066000760008600096001060011600126001360014600156001660017600186001960020600216002260023600246002560026600276002860029600306003160032600336003460035600366003760038600396004060041600426004360044600456004660047600486004960050600516005260053600546005560056600576005860059600606006160062600636006460065600666006760068600696007060071600726007360074600756007660077600786007960080600816008260083600846008560086600876008860089600906009160092600936009460095600966009760098600996010060101601026010360104601056010660107601086010960110601116011260113601146011560116601176011860119601206012160122601236012460125601266012760128601296013060131601326013360134601356013660137601386013960140601416014260143601446014560146601476014860149601506015160152601536015460155601566015760158601596016060161601626016360164601656016660167601686016960170601716017260173601746017560176601776017860179601806018160182601836018460185601866018760188601896019060191601926019360194601956019660197601986019960200602016020260203602046020560206602076020860209602106021160212602136021460215602166021760218602196022060221602226022360224602256022660227602286022960230602316023260233602346023560236602376023860239602406024160242602436024460245602466024760248602496025060251602526025360254602556025660257602586025960260602616026260263602646026560266602676026860269602706027160272602736027460275602766027760278602796028060281602826028360284602856028660287602886028960290602916029260293602946029560296602976029860299603006030160302603036030460305603066030760308603096031060311603126031360314603156031660317603186031960320603216032260323603246032560326603276032860329603306033160332603336033460335603366033760338603396034060341603426034360344603456034660347603486034960350603516035260353603546035560356603576035860359603606036160362603636036460365603666036760368603696037060371603726037360374603756037660377603786037960380603816038260383603846038560386603876038860389603906039160392603936039460395603966039760398603996040060401604026040360404604056040660407604086040960410604116041260413604146041560416604176041860419604206042160422604236042460425604266042760428604296043060431604326043360434604356043660437604386043960440604416044260443604446044560446604476044860449604506045160452604536045460455604566045760458604596046060461604626046360464604656046660467604686046960470604716047260473604746047560476604776047860479604806048160482604836048460485604866048760488604896049060491604926049360494604956049660497604986049960500605016050260503605046050560506605076050860509605106051160512605136051460515605166051760518605196052060521605226052360524605256052660527605286052960530605316053260533605346053560536605376053860539605406054160542605436054460545605466054760548605496055060551605526055360554605556055660557605586055960560605616056260563605646056560566605676056860569605706057160572605736057460575605766057760578605796058060581605826058360584605856058660587605886058960590605916059260593605946059560596605976059860599606006060160602606036060460605606066060760608606096061060611606126061360614606156061660617606186061960620606216062260623606246062560626606276062860629606306063160632606336063460635606366063760638606396064060641606426064360644606456064660647606486064960650606516065260653606546065560656606576065860659606606066160662606636066460665606666066760668606696067060671606726067360674606756067660677606786067960680606816068260683606846068560686606876068860689606906069160692606936069460695606966069760698606996070060701607026070360704607056070660707607086070960710607116071260713607146071560716607176071860719607206072160722607236072460725607266072760728607296073060731607326073360734607356073660737607386073960740607416074260743607446074560746607476074860749607506075160752607536075460755607566075760758607596076060761607626076360764607656076660767607686076960770607716077260773607746077560776607776077860779607806078160782607836078460785607866078760788607896079060791607926079360794607956079660797607986079960800608016080260803608046080560806608076080860809608106081160812608136081460815608166081760818608196082060821608226082360824608256082660827608286082960830608316083260833608346083560836608376083860839608406084160842608436084460845608466084760848608496085060851608526085360854608556085660857608586085960860608616086260863608646086560866608676086860869608706087160872608736087460875608766087760878608796088060881608826088360884608856088660887608886088960890608916089260893608946089560896608976089860899609006090160902609036090460905609066090760908609096091060911609126091360914609156091660917609186091960920609216092260923609246092560926609276092860929609306093160932609336093460935609366093760938609396094060941609426094360944609456094660947609486094960950609516095260953609546095560956609576095860959609606096160962609636096460965609666096760968609696097060971609726097360974609756097660977609786097960980609816098260983609846098560986609876098860989609906099160992609936099460995609966099760998609996100061001610026100361004610056100661007610086100961010610116101261013610146101561016610176101861019610206102161022610236102461025610266102761028610296103061031610326103361034610356103661037610386103961040610416104261043610446104561046610476104861049610506105161052610536105461055610566105761058610596106061061610626106361064610656106661067610686106961070610716107261073610746107561076610776107861079610806108161082610836108461085610866108761088610896109061091610926109361094610956109661097610986109961100611016110261103611046110561106611076110861109611106111161112611136111461115611166111761118611196112061121611226112361124611256112661127611286112961130611316113261133611346113561136611376113861139611406114161142611436114461145611466114761148611496115061151611526115361154611556115661157611586115961160611616116261163611646116561166611676116861169611706117161172611736117461175611766117761178611796118061181611826118361184611856118661187611886118961190611916119261193611946119561196611976119861199612006120161202612036120461205612066120761208612096121061211612126121361214612156121661217612186121961220612216122261223612246122561226612276122861229612306123161232612336123461235612366123761238612396124061241612426124361244612456124661247612486124961250612516125261253612546125561256612576125861259612606126161262612636126461265612666126761268612696127061271612726127361274612756127661277612786127961280612816128261283612846128561286612876128861289612906129161292612936129461295612966129761298612996130061301613026130361304613056130661307613086130961310613116131261313613146131561316613176131861319613206132161322613236132461325613266132761328613296133061331613326133361334613356133661337613386133961340613416134261343613446134561346613476134861349613506135161352613536135461355613566135761358613596136061361613626136361364613656136661367613686136961370613716137261373613746137561376613776137861379613806138161382613836138461385613866138761388613896139061391613926139361394613956139661397613986139961400614016140261403614046140561406614076140861409614106141161412614136141461415614166141761418614196142061421614226142361424614256142661427614286142961430614316143261433614346143561436614376143861439614406144161442614436144461445614466144761448614496145061451614526145361454614556145661457614586145961460614616146261463614646146561466614676146861469614706147161472614736147461475614766147761478614796148061481614826148361484614856148661487614886148961490614916149261493614946149561496614976149861499615006150161502615036150461505615066150761508615096151061511615126151361514615156151661517615186151961520615216152261523615246152561526615276152861529615306153161532615336153461535615366153761538615396154061541615426154361544615456154661547615486154961550615516155261553615546155561556615576155861559615606156161562615636156461565615666156761568615696157061571615726157361574615756157661577615786157961580615816158261583615846158561586615876158861589615906159161592615936159461595615966159761598615996160061601616026160361604616056160661607616086160961610616116161261613616146161561616616176161861619616206162161622616236162461625616266162761628616296163061631616326163361634616356163661637616386163961640616416164261643616446164561646616476164861649616506165161652616536165461655616566165761658616596166061661616626166361664616656166661667616686166961670616716167261673616746167561676616776167861679616806168161682616836168461685616866168761688616896169061691616926169361694616956169661697616986169961700617016170261703617046170561706617076170861709617106171161712617136171461715617166171761718617196172061721617226172361724617256172661727617286172961730617316173261733617346173561736617376173861739617406174161742617436174461745617466174761748617496175061751617526175361754617556175661757617586175961760617616176261763617646176561766617676176861769617706177161772617736177461775617766177761778617796178061781617826178361784617856178661787617886178961790617916179261793617946179561796617976179861799618006180161802618036180461805618066180761808618096181061811618126181361814618156181661817618186181961820618216182261823618246182561826618276182861829618306183161832618336183461835618366183761838618396184061841618426184361844618456184661847618486184961850618516185261853618546185561856618576185861859618606186161862618636186461865618666186761868618696187061871618726187361874618756187661877618786187961880618816188261883618846188561886618876188861889618906189161892618936189461895618966189761898618996190061901619026190361904619056190661907619086190961910619116191261913619146191561916619176191861919619206192161922619236192461925619266192761928619296193061931619326193361934619356193661937619386193961940619416194261943619446194561946619476194861949619506195161952619536195461955619566195761958619596196061961619626196361964619656196661967619686196961970619716197261973619746197561976619776197861979619806198161982619836198461985619866198761988619896199061991619926199361994619956199661997619986199962000620016200262003620046200562006620076200862009620106201162012620136201462015620166201762018620196202062021620226202362024620256202662027620286202962030620316203262033620346203562036620376203862039620406204162042620436204462045620466204762048620496205062051620526205362054620556205662057620586205962060620616206262063620646206562066620676206862069620706207162072620736207462075620766207762078620796208062081620826208362084620856208662087620886208962090620916209262093620946209562096620976209862099621006210162102621036210462105621066210762108621096211062111621126211362114621156211662117621186211962120621216212262123621246212562126621276212862129621306213162132621336213462135621366213762138621396214062141621426214362144621456214662147621486214962150621516215262153621546215562156621576215862159621606216162162621636216462165621666216762168621696217062171621726217362174621756217662177621786217962180621816218262183621846218562186621876218862189621906219162192621936219462195621966219762198621996220062201622026220362204622056220662207622086220962210622116221262213622146221562216622176221862219622206222162222622236222462225622266222762228622296223062231622326223362234622356223662237622386223962240622416224262243622446224562246622476224862249622506225162252622536225462255622566225762258622596226062261622626226362264622656226662267622686226962270622716227262273622746227562276622776227862279622806228162282622836228462285622866228762288622896229062291622926229362294622956229662297622986229962300623016230262303623046230562306623076230862309623106231162312623136231462315623166231762318623196232062321623226232362324623256232662327623286232962330623316233262333623346233562336623376233862339623406234162342623436234462345623466234762348623496235062351623526235362354623556235662357623586235962360623616236262363623646236562366623676236862369623706237162372623736237462375623766237762378623796238062381623826238362384623856238662387623886238962390623916239262393623946239562396623976239862399624006240162402624036240462405624066240762408624096241062411624126241362414624156241662417624186241962420624216242262423624246242562426624276242862429624306243162432624336243462435624366243762438624396244062441624426244362444624456244662447624486244962450624516245262453624546245562456624576245862459624606246162462624636246462465624666246762468624696247062471624726247362474624756247662477624786247962480624816248262483624846248562486624876248862489624906249162492624936249462495624966249762498624996250062501625026250362504625056250662507625086250962510625116251262513625146251562516625176251862519625206252162522625236252462525625266252762528625296253062531625326253362534625356253662537625386253962540625416254262543625446254562546625476254862549625506255162552625536255462555625566255762558625596256062561625626256362564625656256662567625686256962570625716257262573625746257562576625776257862579625806258162582625836258462585625866258762588625896259062591625926259362594625956259662597625986259962600626016260262603626046260562606626076260862609626106261162612626136261462615626166261762618626196262062621626226262362624626256262662627626286262962630626316263262633626346263562636626376263862639626406264162642626436264462645626466264762648626496265062651626526265362654626556265662657626586265962660626616266262663626646266562666626676266862669626706267162672626736267462675626766267762678626796268062681626826268362684626856268662687626886268962690626916269262693626946269562696626976269862699627006270162702627036270462705627066270762708627096271062711627126271362714627156271662717627186271962720627216272262723627246272562726627276272862729627306273162732627336273462735627366273762738627396274062741627426274362744627456274662747627486274962750627516275262753627546275562756627576275862759627606276162762627636276462765627666276762768627696277062771627726277362774627756277662777627786277962780627816278262783627846278562786627876278862789627906279162792627936279462795627966279762798627996280062801628026280362804628056280662807628086280962810628116281262813628146281562816628176281862819628206282162822628236282462825628266282762828628296283062831628326283362834628356283662837628386283962840628416284262843628446284562846628476284862849628506285162852628536285462855628566285762858628596286062861628626286362864628656286662867628686286962870628716287262873628746287562876628776287862879628806288162882628836288462885628866288762888628896289062891628926289362894628956289662897628986289962900629016290262903629046290562906629076290862909629106291162912629136291462915629166291762918629196292062921629226292362924629256292662927629286292962930629316293262933629346293562936629376293862939629406294162942629436294462945629466294762948629496295062951629526295362954629556295662957629586295962960629616296262963629646296562966629676296862969629706297162972629736297462975629766297762978629796298062981629826298362984629856298662987629886298962990629916299262993629946299562996629976299862999630006300163002630036300463005630066300763008630096301063011630126301363014630156301663017630186301963020630216302263023630246302563026630276302863029630306303163032630336303463035630366303763038630396304063041630426304363044630456304663047630486304963050630516305263053630546305563056630576305863059630606306163062630636306463065630666306763068630696307063071630726307363074630756307663077630786307963080630816308263083630846308563086630876308863089630906309163092630936309463095630966309763098630996310063101631026310363104631056310663107631086310963110631116311263113631146311563116631176311863119631206312163122631236312463125631266312763128631296313063131631326313363134631356313663137631386313963140631416314263143631446314563146631476314863149631506315163152631536315463155631566315763158631596316063161631626316363164631656316663167631686316963170631716317263173631746317563176631776317863179631806318163182631836318463185631866318763188631896319063191631926319363194631956319663197631986319963200632016320263203632046320563206632076320863209632106321163212632136321463215632166321763218632196322063221632226322363224632256322663227632286322963230632316323263233632346323563236632376323863239632406324163242632436324463245632466324763248632496325063251632526325363254632556325663257632586325963260632616326263263632646326563266632676326863269632706327163272632736327463275632766327763278632796328063281632826328363284632856328663287632886328963290632916329263293632946329563296632976329863299633006330163302633036330463305633066330763308633096331063311633126331363314633156331663317633186331963320633216332263323633246332563326633276332863329633306333163332633336333463335633366333763338633396334063341633426334363344633456334663347633486334963350633516335263353633546335563356633576335863359633606336163362633636336463365633666336763368633696337063371633726337363374633756337663377633786337963380633816338263383633846338563386633876338863389633906339163392633936339463395633966339763398633996340063401634026340363404634056340663407634086340963410634116341263413634146341563416634176341863419634206342163422634236342463425634266342763428634296343063431634326343363434634356343663437634386343963440634416344263443634446344563446634476344863449634506345163452634536345463455634566345763458634596346063461634626346363464634656346663467634686346963470634716347263473634746347563476634776347863479634806348163482634836348463485634866348763488634896349063491634926349363494634956349663497634986349963500635016350263503635046350563506635076350863509635106351163512635136351463515635166351763518635196352063521635226352363524635256352663527635286352963530635316353263533635346353563536635376353863539635406354163542635436354463545635466354763548635496355063551635526355363554635556355663557635586355963560635616356263563635646356563566635676356863569635706357163572635736357463575635766357763578635796358063581635826358363584635856358663587635886358963590635916359263593635946359563596635976359863599636006360163602636036360463605636066360763608636096361063611636126361363614636156361663617636186361963620636216362263623636246362563626636276362863629636306363163632636336363463635636366363763638636396364063641636426364363644636456364663647636486364963650636516365263653636546365563656636576365863659636606366163662636636366463665636666366763668636696367063671636726367363674636756367663677636786367963680636816368263683636846368563686636876368863689636906369163692636936369463695636966369763698636996370063701637026370363704637056370663707637086370963710637116371263713637146371563716637176371863719637206372163722637236372463725637266372763728637296373063731637326373363734637356373663737637386373963740637416374263743637446374563746637476374863749637506375163752637536375463755637566375763758637596376063761637626376363764637656376663767637686376963770637716377263773637746377563776637776377863779637806378163782637836378463785637866378763788637896379063791637926379363794637956379663797637986379963800638016380263803638046380563806638076380863809638106381163812638136381463815638166381763818638196382063821638226382363824638256382663827638286382963830638316383263833638346383563836638376383863839638406384163842638436384463845638466384763848638496385063851638526385363854638556385663857638586385963860638616386263863638646386563866638676386863869638706387163872638736387463875638766387763878638796388063881638826388363884638856388663887638886388963890638916389263893638946389563896638976389863899639006390163902639036390463905639066390763908639096391063911639126391363914639156391663917639186391963920639216392263923639246392563926639276392863929639306393163932639336393463935639366393763938639396394063941639426394363944639456394663947639486394963950639516395263953639546395563956639576395863959639606396163962639636396463965639666396763968639696397063971639726397363974639756397663977639786397963980639816398263983639846398563986639876398863989639906399163992639936399463995639966399763998639996400064001640026400364004640056400664007640086400964010640116401264013640146401564016640176401864019640206402164022640236402464025640266402764028640296403064031640326403364034640356403664037640386403964040640416404264043640446404564046640476404864049640506405164052640536405464055640566405764058640596406064061640626406364064640656406664067640686406964070640716407264073640746407564076640776407864079640806408164082640836408464085640866408764088640896409064091640926409364094640956409664097640986409964100641016410264103641046410564106641076410864109641106411164112641136411464115641166411764118641196412064121641226412364124641256412664127641286412964130641316413264133641346413564136641376413864139641406414164142641436414464145641466414764148641496415064151641526415364154641556415664157641586415964160641616416264163641646416564166641676416864169641706417164172641736417464175641766417764178641796418064181641826418364184641856418664187641886418964190641916419264193641946419564196641976419864199642006420164202642036420464205642066420764208642096421064211642126421364214642156421664217642186421964220642216422264223642246422564226642276422864229642306423164232642336423464235642366423764238642396424064241642426424364244642456424664247642486424964250642516425264253642546425564256642576425864259642606426164262642636426464265642666426764268642696427064271642726427364274642756427664277642786427964280642816428264283642846428564286642876428864289642906429164292642936429464295642966429764298642996430064301643026430364304643056430664307643086430964310643116431264313643146431564316643176431864319643206432164322643236432464325643266432764328643296433064331643326433364334643356433664337643386433964340643416434264343643446434564346643476434864349643506435164352643536435464355643566435764358643596436064361643626436364364643656436664367643686436964370643716437264373643746437564376643776437864379643806438164382643836438464385643866438764388643896439064391643926439364394643956439664397643986439964400644016440264403644046440564406644076440864409644106441164412644136441464415644166441764418644196442064421644226442364424644256442664427644286442964430644316443264433644346443564436644376443864439644406444164442644436444464445644466444764448644496445064451644526445364454644556445664457644586445964460644616446264463644646446564466644676446864469644706447164472644736447464475644766447764478644796448064481644826448364484644856448664487644886448964490644916449264493644946449564496644976449864499645006450164502645036450464505645066450764508645096451064511645126451364514645156451664517645186451964520645216452264523645246452564526645276452864529645306453164532645336453464535645366453764538645396454064541645426454364544645456454664547645486454964550645516455264553645546455564556645576455864559645606456164562645636456464565645666456764568645696457064571645726457364574645756457664577645786457964580645816458264583645846458564586645876458864589645906459164592645936459464595645966459764598645996460064601646026460364604646056460664607646086460964610646116461264613646146461564616646176461864619646206462164622646236462464625646266462764628646296463064631646326463364634646356463664637646386463964640646416464264643646446464564646646476464864649646506465164652646536465464655646566465764658646596466064661646626466364664646656466664667646686466964670646716467264673646746467564676646776467864679646806468164682646836468464685646866468764688646896469064691646926469364694646956469664697646986469964700647016470264703647046470564706647076470864709647106471164712647136471464715647166471764718647196472064721647226472364724647256472664727647286472964730647316473264733647346473564736647376473864739647406474164742647436474464745647466474764748647496475064751647526475364754647556475664757647586475964760647616476264763647646476564766647676476864769647706477164772647736477464775647766477764778647796478064781647826478364784647856478664787647886478964790647916479264793647946479564796647976479864799648006480164802648036480464805648066480764808648096481064811648126481364814648156481664817648186481964820648216482264823648246482564826648276482864829648306483164832648336483464835648366483764838648396484064841648426484364844648456484664847648486484964850648516485264853648546485564856648576485864859648606486164862648636486464865648666486764868648696487064871648726487364874648756487664877648786487964880648816488264883648846488564886648876488864889648906489164892648936489464895648966489764898648996490064901649026490364904649056490664907649086490964910649116491264913649146491564916649176491864919649206492164922649236492464925649266492764928649296493064931649326493364934649356493664937649386493964940649416494264943649446494564946649476494864949649506495164952649536495464955649566495764958649596496064961649626496364964649656496664967649686496964970649716497264973649746497564976649776497864979649806498164982649836498464985649866498764988649896499064991649926499364994649956499664997649986499965000650016500265003650046500565006650076500865009650106501165012650136501465015650166501765018650196502065021650226502365024650256502665027650286502965030650316503265033650346503565036650376503865039650406504165042650436504465045650466504765048650496505065051650526505365054650556505665057650586505965060650616506265063650646506565066650676506865069650706507165072650736507465075650766507765078650796508065081650826508365084650856508665087650886508965090650916509265093650946509565096650976509865099651006510165102651036510465105651066510765108651096511065111651126511365114651156511665117651186511965120651216512265123651246512565126651276512865129651306513165132651336513465135651366513765138651396514065141651426514365144651456514665147651486514965150651516515265153651546515565156651576515865159651606516165162651636516465165651666516765168651696517065171651726517365174651756517665177651786517965180651816518265183651846518565186651876518865189651906519165192651936519465195651966519765198651996520065201652026520365204652056520665207652086520965210652116521265213652146521565216652176521865219652206522165222652236522465225652266522765228652296523065231652326523365234652356523665237652386523965240652416524265243652446524565246652476524865249652506525165252652536525465255652566525765258652596526065261652626526365264652656526665267652686526965270652716527265273652746527565276652776527865279652806528165282652836528465285652866528765288652896529065291652926529365294652956529665297652986529965300653016530265303653046530565306653076530865309653106531165312653136531465315653166531765318653196532065321653226532365324653256532665327653286532965330653316533265333653346533565336653376533865339653406534165342653436534465345653466534765348653496535065351653526535365354653556535665357653586535965360653616536265363653646536565366653676536865369653706537165372653736537465375653766537765378653796538065381653826538365384653856538665387653886538965390653916539265393653946539565396653976539865399654006540165402654036540465405654066540765408654096541065411654126541365414654156541665417654186541965420654216542265423654246542565426654276542865429654306543165432654336543465435654366543765438654396544065441654426544365444654456544665447654486544965450654516545265453654546545565456654576545865459654606546165462654636546465465654666546765468654696547065471654726547365474654756547665477654786547965480654816548265483654846548565486654876548865489654906549165492654936549465495654966549765498654996550065501655026550365504655056550665507655086550965510655116551265513655146551565516655176551865519655206552165522655236552465525655266552765528655296553065531655326553365534655356553665537655386553965540655416554265543655446554565546655476554865549655506555165552655536555465555655566555765558655596556065561655626556365564655656556665567655686556965570655716557265573655746557565576655776557865579655806558165582655836558465585655866558765588655896559065591655926559365594655956559665597655986559965600656016560265603656046560565606656076560865609656106561165612656136561465615656166561765618656196562065621656226562365624656256562665627656286562965630656316563265633656346563565636656376563865639656406564165642656436564465645656466564765648656496565065651656526565365654656556565665657656586565965660656616566265663656646566565666656676566865669656706567165672656736567465675656766567765678656796568065681656826568365684656856568665687656886568965690656916569265693656946569565696656976569865699657006570165702657036570465705657066570765708657096571065711657126571365714657156571665717657186571965720657216572265723657246572565726657276572865729657306573165732657336573465735657366573765738657396574065741657426574365744657456574665747657486574965750657516575265753657546575565756657576575865759657606576165762657636576465765657666576765768657696577065771657726577365774657756577665777657786577965780657816578265783657846578565786657876578865789657906579165792657936579465795657966579765798657996580065801658026580365804658056580665807658086580965810658116581265813658146581565816658176581865819658206582165822658236582465825658266582765828658296583065831658326583365834658356583665837658386583965840658416584265843658446584565846658476584865849658506585165852658536585465855658566585765858658596586065861658626586365864658656586665867658686586965870658716587265873658746587565876658776587865879658806588165882658836588465885658866588765888658896589065891658926589365894658956589665897658986589965900659016590265903659046590565906659076590865909659106591165912659136591465915659166591765918659196592065921659226592365924659256592665927659286592965930659316593265933659346593565936659376593865939659406594165942659436594465945659466594765948659496595065951659526595365954659556595665957659586595965960659616596265963659646596565966659676596865969659706597165972659736597465975659766597765978659796598065981659826598365984659856598665987659886598965990659916599265993659946599565996659976599865999660006600166002660036600466005660066600766008660096601066011660126601366014660156601666017660186601966020660216602266023660246602566026660276602866029660306603166032660336603466035660366603766038660396604066041660426604366044660456604666047660486604966050660516605266053660546605566056660576605866059660606606166062660636606466065660666606766068660696607066071660726607366074660756607666077660786607966080660816608266083660846608566086660876608866089660906609166092660936609466095660966609766098660996610066101661026610366104661056610666107661086610966110661116611266113661146611566116661176611866119661206612166122661236612466125661266612766128661296613066131661326613366134661356613666137661386613966140661416614266143661446614566146661476614866149661506615166152661536615466155661566615766158661596616066161661626616366164661656616666167661686616966170661716617266173661746617566176661776617866179661806618166182661836618466185661866618766188661896619066191661926619366194661956619666197661986619966200662016620266203662046620566206662076620866209662106621166212662136621466215662166621766218662196622066221662226622366224662256622666227662286622966230662316623266233662346623566236662376623866239662406624166242662436624466245662466624766248662496625066251662526625366254662556625666257662586625966260662616626266263662646626566266662676626866269662706627166272662736627466275662766627766278662796628066281662826628366284662856628666287662886628966290662916629266293662946629566296662976629866299663006630166302663036630466305663066630766308663096631066311663126631366314663156631666317663186631966320663216632266323663246632566326663276632866329663306633166332663336633466335663366633766338663396634066341663426634366344663456634666347663486634966350663516635266353663546635566356663576635866359663606636166362663636636466365663666636766368663696637066371663726637366374663756637666377663786637966380663816638266383663846638566386663876638866389663906639166392663936639466395663966639766398663996640066401664026640366404664056640666407664086640966410664116641266413664146641566416664176641866419664206642166422664236642466425664266642766428664296643066431664326643366434664356643666437664386643966440664416644266443664446644566446664476644866449664506645166452664536645466455664566645766458664596646066461664626646366464664656646666467664686646966470664716647266473664746647566476664776647866479664806648166482664836648466485664866648766488664896649066491664926649366494664956649666497664986649966500665016650266503665046650566506665076650866509665106651166512665136651466515665166651766518665196652066521665226652366524665256652666527665286652966530665316653266533665346653566536665376653866539665406654166542665436654466545665466654766548665496655066551665526655366554665556655666557665586655966560665616656266563665646656566566665676656866569665706657166572665736657466575665766657766578665796658066581665826658366584665856658666587665886658966590665916659266593665946659566596665976659866599666006660166602666036660466605666066660766608666096661066611666126661366614666156661666617666186661966620666216662266623666246662566626666276662866629666306663166632666336663466635666366663766638666396664066641666426664366644666456664666647666486664966650666516665266653666546665566656666576665866659666606666166662666636666466665666666666766668666696667066671666726667366674666756667666677666786667966680666816668266683666846668566686666876668866689666906669166692666936669466695666966669766698666996670066701667026670366704667056670666707667086670966710667116671266713667146671566716667176671866719667206672166722667236672466725667266672766728667296673066731667326673366734667356673666737667386673966740667416674266743667446674566746667476674866749667506675166752667536675466755667566675766758667596676066761667626676366764667656676666767667686676966770667716677266773667746677566776667776677866779667806678166782667836678466785667866678766788667896679066791667926679366794667956679666797667986679966800668016680266803668046680566806668076680866809668106681166812668136681466815668166681766818668196682066821668226682366824668256682666827668286682966830668316683266833668346683566836668376683866839668406684166842668436684466845668466684766848668496685066851668526685366854668556685666857668586685966860668616686266863668646686566866668676686866869668706687166872668736687466875668766687766878668796688066881668826688366884668856688666887668886688966890668916689266893668946689566896668976689866899669006690166902669036690466905669066690766908669096691066911669126691366914669156691666917669186691966920669216692266923669246692566926669276692866929669306693166932669336693466935669366693766938669396694066941669426694366944669456694666947669486694966950669516695266953669546695566956669576695866959669606696166962669636696466965669666696766968669696697066971669726697366974669756697666977669786697966980669816698266983669846698566986669876698866989669906699166992669936699466995669966699766998669996700067001670026700367004670056700667007670086700967010670116701267013670146701567016670176701867019670206702167022670236702467025670266702767028670296703067031670326703367034670356703667037670386703967040670416704267043670446704567046670476704867049670506705167052670536705467055670566705767058670596706067061670626706367064670656706667067670686706967070670716707267073670746707567076670776707867079670806708167082670836708467085670866708767088670896709067091670926709367094670956709667097670986709967100671016710267103671046710567106671076710867109671106711167112671136711467115671166711767118671196712067121671226712367124671256712667127671286712967130671316713267133671346713567136671376713867139671406714167142671436714467145671466714767148671496715067151671526715367154671556715667157671586715967160671616716267163671646716567166671676716867169671706717167172671736717467175671766717767178671796718067181671826718367184671856718667187671886718967190671916719267193671946719567196671976719867199672006720167202672036720467205672066720767208672096721067211672126721367214672156721667217672186721967220672216722267223672246722567226672276722867229672306723167232672336723467235672366723767238672396724067241672426724367244672456724667247672486724967250672516725267253672546725567256672576725867259672606726167262672636726467265672666726767268672696727067271672726727367274672756727667277672786727967280672816728267283672846728567286672876728867289672906729167292672936729467295672966729767298672996730067301673026730367304673056730667307673086730967310673116731267313673146731567316673176731867319673206732167322673236732467325673266732767328673296733067331673326733367334673356733667337673386733967340673416734267343673446734567346673476734867349673506735167352673536735467355673566735767358673596736067361673626736367364673656736667367673686736967370673716737267373673746737567376673776737867379673806738167382673836738467385673866738767388673896739067391673926739367394673956739667397673986739967400674016740267403674046740567406674076740867409674106741167412674136741467415674166741767418674196742067421674226742367424674256742667427674286742967430674316743267433674346743567436674376743867439674406744167442674436744467445674466744767448674496745067451674526745367454674556745667457674586745967460674616746267463674646746567466674676746867469674706747167472674736747467475674766747767478674796748067481674826748367484674856748667487674886748967490674916749267493674946749567496674976749867499675006750167502675036750467505675066750767508675096751067511675126751367514675156751667517675186751967520675216752267523675246752567526675276752867529675306753167532675336753467535675366753767538675396754067541675426754367544675456754667547675486754967550675516755267553675546755567556675576755867559675606756167562675636756467565675666756767568675696757067571675726757367574675756757667577675786757967580675816758267583675846758567586675876758867589675906759167592675936759467595675966759767598675996760067601676026760367604676056760667607676086760967610676116761267613676146761567616676176761867619676206762167622676236762467625676266762767628676296763067631676326763367634676356763667637676386763967640676416764267643676446764567646676476764867649676506765167652676536765467655676566765767658676596766067661676626766367664676656766667667676686766967670676716767267673676746767567676676776767867679676806768167682676836768467685676866768767688676896769067691676926769367694676956769667697676986769967700677016770267703677046770567706677076770867709677106771167712677136771467715677166771767718677196772067721677226772367724677256772667727677286772967730677316773267733677346773567736677376773867739677406774167742677436774467745677466774767748677496775067751677526775367754677556775667757677586775967760677616776267763677646776567766677676776867769677706777167772677736777467775677766777767778677796778067781677826778367784677856778667787677886778967790677916779267793677946779567796677976779867799678006780167802678036780467805678066780767808678096781067811678126781367814678156781667817678186781967820678216782267823678246782567826678276782867829678306783167832678336783467835678366783767838678396784067841678426784367844678456784667847678486784967850678516785267853678546785567856678576785867859678606786167862678636786467865678666786767868678696787067871678726787367874678756787667877678786787967880678816788267883678846788567886678876788867889678906789167892678936789467895678966789767898678996790067901679026790367904679056790667907679086790967910679116791267913679146791567916679176791867919679206792167922679236792467925679266792767928679296793067931679326793367934679356793667937679386793967940679416794267943679446794567946679476794867949679506795167952679536795467955679566795767958679596796067961679626796367964679656796667967679686796967970679716797267973679746797567976679776797867979679806798167982679836798467985679866798767988679896799067991679926799367994679956799667997679986799968000680016800268003680046800568006680076800868009680106801168012680136801468015680166801768018680196802068021680226802368024680256802668027680286802968030680316803268033680346803568036680376803868039680406804168042680436804468045680466804768048680496805068051680526805368054680556805668057680586805968060680616806268063680646806568066680676806868069680706807168072680736807468075680766807768078680796808068081680826808368084680856808668087680886808968090680916809268093680946809568096680976809868099681006810168102681036810468105681066810768108681096811068111681126811368114681156811668117681186811968120681216812268123681246812568126681276812868129681306813168132681336813468135681366813768138681396814068141681426814368144681456814668147681486814968150681516815268153681546815568156681576815868159681606816168162681636816468165681666816768168681696817068171681726817368174681756817668177681786817968180681816818268183681846818568186681876818868189681906819168192681936819468195681966819768198681996820068201682026820368204682056820668207682086820968210682116821268213682146821568216682176821868219682206822168222682236822468225682266822768228682296823068231682326823368234682356823668237682386823968240682416824268243682446824568246682476824868249682506825168252682536825468255682566825768258682596826068261682626826368264682656826668267682686826968270682716827268273682746827568276682776827868279682806828168282682836828468285682866828768288682896829068291682926829368294682956829668297682986829968300683016830268303683046830568306683076830868309683106831168312683136831468315683166831768318683196832068321683226832368324683256832668327683286832968330683316833268333683346833568336683376833868339683406834168342683436834468345683466834768348683496835068351683526835368354683556835668357683586835968360683616836268363683646836568366683676836868369683706837168372683736837468375683766837768378683796838068381683826838368384683856838668387683886838968390683916839268393683946839568396683976839868399684006840168402684036840468405684066840768408684096841068411684126841368414684156841668417684186841968420684216842268423684246842568426684276842868429684306843168432684336843468435684366843768438684396844068441684426844368444684456844668447684486844968450684516845268453684546845568456684576845868459684606846168462684636846468465684666846768468684696847068471684726847368474684756847668477684786847968480684816848268483684846848568486684876848868489684906849168492684936849468495684966849768498684996850068501685026850368504685056850668507685086850968510685116851268513685146851568516685176851868519685206852168522685236852468525685266852768528685296853068531685326853368534685356853668537685386853968540685416854268543685446854568546685476854868549685506855168552685536855468555685566855768558685596856068561685626856368564685656856668567685686856968570685716857268573685746857568576685776857868579685806858168582685836858468585685866858768588685896859068591685926859368594685956859668597685986859968600686016860268603686046860568606686076860868609686106861168612686136861468615686166861768618686196862068621686226862368624686256862668627686286862968630686316863268633686346863568636686376863868639686406864168642686436864468645686466864768648686496865068651686526865368654686556865668657686586865968660686616866268663686646866568666686676866868669686706867168672686736867468675686766867768678686796868068681686826868368684686856868668687686886868968690686916869268693686946869568696686976869868699687006870168702687036870468705687066870768708687096871068711687126871368714687156871668717687186871968720687216872268723687246872568726687276872868729687306873168732687336873468735687366873768738687396874068741687426874368744687456874668747687486874968750687516875268753687546875568756687576875868759687606876168762687636876468765687666876768768687696877068771687726877368774687756877668777687786877968780687816878268783687846878568786687876878868789687906879168792687936879468795687966879768798687996880068801688026880368804688056880668807688086880968810688116881268813688146881568816688176881868819688206882168822688236882468825688266882768828688296883068831688326883368834688356883668837688386883968840688416884268843688446884568846688476884868849688506885168852688536885468855688566885768858688596886068861688626886368864688656886668867688686886968870688716887268873688746887568876688776887868879688806888168882688836888468885688866888768888688896889068891688926889368894688956889668897688986889968900689016890268903689046890568906689076890868909689106891168912689136891468915689166891768918689196892068921689226892368924689256892668927689286892968930689316893268933689346893568936689376893868939689406894168942689436894468945689466894768948689496895068951689526895368954689556895668957689586895968960689616896268963689646896568966689676896868969689706897168972689736897468975689766897768978689796898068981689826898368984689856898668987689886898968990689916899268993689946899568996689976899868999690006900169002690036900469005690066900769008690096901069011690126901369014690156901669017690186901969020690216902269023690246902569026690276902869029690306903169032690336903469035690366903769038690396904069041690426904369044690456904669047690486904969050690516905269053690546905569056690576905869059690606906169062690636906469065690666906769068690696907069071690726907369074690756907669077690786907969080690816908269083690846908569086690876908869089690906909169092690936909469095690966909769098690996910069101691026910369104691056910669107691086910969110691116911269113691146911569116691176911869119691206912169122691236912469125691266912769128691296913069131691326913369134691356913669137691386913969140691416914269143691446914569146691476914869149691506915169152691536915469155691566915769158691596916069161691626916369164691656916669167691686916969170691716917269173691746917569176691776917869179691806918169182691836918469185691866918769188691896919069191691926919369194691956919669197691986919969200692016920269203692046920569206692076920869209692106921169212692136921469215692166921769218692196922069221692226922369224692256922669227692286922969230692316923269233692346923569236692376923869239692406924169242692436924469245692466924769248692496925069251692526925369254692556925669257692586925969260692616926269263692646926569266692676926869269692706927169272692736927469275692766927769278692796928069281692826928369284692856928669287692886928969290692916929269293692946929569296692976929869299693006930169302693036930469305693066930769308693096931069311693126931369314693156931669317693186931969320693216932269323693246932569326693276932869329693306933169332693336933469335693366933769338693396934069341693426934369344693456934669347693486934969350693516935269353693546935569356693576935869359693606936169362693636936469365693666936769368693696937069371693726937369374693756937669377693786937969380693816938269383693846938569386693876938869389693906939169392693936939469395693966939769398693996940069401694026940369404694056940669407694086940969410694116941269413694146941569416694176941869419694206942169422694236942469425694266942769428694296943069431694326943369434694356943669437694386943969440694416944269443694446944569446694476944869449694506945169452694536945469455694566945769458694596946069461694626946369464694656946669467694686946969470694716947269473694746947569476694776947869479694806948169482694836948469485694866948769488694896949069491694926949369494694956949669497694986949969500695016950269503695046950569506695076950869509695106951169512695136951469515695166951769518695196952069521695226952369524695256952669527695286952969530695316953269533695346953569536695376953869539695406954169542695436954469545695466954769548695496955069551695526955369554695556955669557695586955969560695616956269563695646956569566695676956869569695706957169572695736957469575695766957769578695796958069581695826958369584695856958669587695886958969590695916959269593695946959569596695976959869599696006960169602696036960469605696066960769608696096961069611696126961369614696156961669617696186961969620696216962269623696246962569626696276962869629696306963169632696336963469635696366963769638696396964069641696426964369644696456964669647696486964969650696516965269653696546965569656696576965869659696606966169662696636966469665696666966769668696696967069671696726967369674696756967669677696786967969680696816968269683696846968569686696876968869689696906969169692696936969469695696966969769698696996970069701697026970369704697056970669707697086970969710697116971269713697146971569716697176971869719697206972169722697236972469725697266972769728697296973069731697326973369734697356973669737697386973969740697416974269743697446974569746697476974869749697506975169752697536975469755697566975769758697596976069761697626976369764697656976669767697686976969770697716977269773697746977569776697776977869779697806978169782697836978469785697866978769788697896979069791697926979369794697956979669797697986979969800698016980269803698046980569806698076980869809698106981169812698136981469815698166981769818698196982069821698226982369824698256982669827698286982969830698316983269833698346983569836698376983869839698406984169842698436984469845698466984769848698496985069851698526985369854698556985669857698586985969860698616986269863698646986569866698676986869869698706987169872698736987469875698766987769878698796988069881698826988369884698856988669887698886988969890698916989269893698946989569896698976989869899699006990169902699036990469905699066990769908699096991069911699126991369914699156991669917699186991969920699216992269923699246992569926699276992869929699306993169932699336993469935699366993769938699396994069941699426994369944699456994669947699486994969950699516995269953699546995569956699576995869959699606996169962699636996469965699666996769968699696997069971699726997369974699756997669977699786997969980699816998269983699846998569986699876998869989699906999169992699936999469995699966999769998699997000070001700027000370004700057000670007700087000970010700117001270013700147001570016700177001870019700207002170022700237002470025700267002770028700297003070031700327003370034700357003670037700387003970040700417004270043700447004570046700477004870049700507005170052700537005470055700567005770058700597006070061700627006370064700657006670067700687006970070700717007270073700747007570076700777007870079700807008170082700837008470085700867008770088700897009070091700927009370094700957009670097700987009970100701017010270103701047010570106701077010870109701107011170112701137011470115701167011770118701197012070121701227012370124701257012670127701287012970130701317013270133701347013570136701377013870139701407014170142701437014470145701467014770148701497015070151701527015370154701557015670157701587015970160701617016270163701647016570166701677016870169701707017170172701737017470175701767017770178701797018070181701827018370184701857018670187701887018970190701917019270193701947019570196701977019870199702007020170202702037020470205702067020770208702097021070211702127021370214702157021670217702187021970220702217022270223702247022570226702277022870229702307023170232702337023470235702367023770238702397024070241702427024370244702457024670247702487024970250702517025270253702547025570256702577025870259702607026170262702637026470265702667026770268702697027070271702727027370274702757027670277702787027970280702817028270283702847028570286702877028870289702907029170292702937029470295702967029770298702997030070301703027030370304703057030670307703087030970310703117031270313703147031570316703177031870319703207032170322703237032470325703267032770328703297033070331703327033370334703357033670337703387033970340703417034270343703447034570346703477034870349703507035170352703537035470355703567035770358703597036070361703627036370364703657036670367703687036970370703717037270373703747037570376703777037870379703807038170382703837038470385703867038770388703897039070391703927039370394703957039670397703987039970400704017040270403704047040570406704077040870409704107041170412704137041470415704167041770418704197042070421704227042370424704257042670427704287042970430704317043270433704347043570436704377043870439704407044170442704437044470445704467044770448704497045070451704527045370454704557045670457704587045970460704617046270463704647046570466704677046870469704707047170472704737047470475704767047770478704797048070481704827048370484704857048670487704887048970490704917049270493704947049570496704977049870499705007050170502705037050470505705067050770508705097051070511705127051370514705157051670517705187051970520705217052270523705247052570526705277052870529705307053170532705337053470535705367053770538705397054070541705427054370544705457054670547705487054970550705517055270553705547055570556705577055870559705607056170562705637056470565705667056770568705697057070571705727057370574705757057670577705787057970580705817058270583705847058570586705877058870589705907059170592705937059470595705967059770598705997060070601706027060370604706057060670607706087060970610706117061270613706147061570616706177061870619706207062170622706237062470625706267062770628706297063070631706327063370634706357063670637706387063970640706417064270643706447064570646706477064870649706507065170652706537065470655706567065770658706597066070661706627066370664706657066670667706687066970670706717067270673706747067570676706777067870679706807068170682706837068470685706867068770688706897069070691706927069370694706957069670697706987069970700707017070270703707047070570706707077070870709707107071170712707137071470715707167071770718707197072070721707227072370724707257072670727707287072970730707317073270733707347073570736707377073870739707407074170742707437074470745707467074770748707497075070751707527075370754707557075670757707587075970760707617076270763707647076570766707677076870769707707077170772707737077470775707767077770778707797078070781707827078370784707857078670787707887078970790707917079270793707947079570796707977079870799708007080170802708037080470805708067080770808708097081070811708127081370814708157081670817708187081970820708217082270823708247082570826708277082870829708307083170832708337083470835708367083770838708397084070841708427084370844708457084670847708487084970850708517085270853708547085570856708577085870859708607086170862708637086470865708667086770868708697087070871708727087370874708757087670877708787087970880708817088270883708847088570886708877088870889708907089170892708937089470895708967089770898708997090070901709027090370904709057090670907709087090970910709117091270913709147091570916709177091870919709207092170922709237092470925709267092770928709297093070931709327093370934709357093670937709387093970940709417094270943709447094570946709477094870949709507095170952709537095470955709567095770958709597096070961709627096370964709657096670967709687096970970709717097270973709747097570976709777097870979709807098170982709837098470985709867098770988709897099070991709927099370994709957099670997709987099971000710017100271003710047100571006710077100871009710107101171012710137101471015710167101771018710197102071021710227102371024710257102671027710287102971030710317103271033710347103571036710377103871039710407104171042710437104471045710467104771048710497105071051710527105371054710557105671057710587105971060710617106271063710647106571066710677106871069710707107171072710737107471075710767107771078710797108071081710827108371084710857108671087710887108971090710917109271093710947109571096710977109871099711007110171102711037110471105711067110771108711097111071111711127111371114711157111671117711187111971120711217112271123711247112571126711277112871129711307113171132711337113471135711367113771138711397114071141711427114371144711457114671147711487114971150711517115271153711547115571156711577115871159711607116171162711637116471165711667116771168711697117071171711727117371174711757117671177711787117971180711817118271183711847118571186711877118871189711907119171192711937119471195711967119771198711997120071201712027120371204712057120671207712087120971210712117121271213712147121571216712177121871219712207122171222712237122471225712267122771228712297123071231712327123371234712357123671237712387123971240712417124271243712447124571246712477124871249712507125171252712537125471255712567125771258712597126071261712627126371264712657126671267712687126971270712717127271273712747127571276712777127871279712807128171282712837128471285712867128771288712897129071291712927129371294712957129671297712987129971300713017130271303713047130571306713077130871309713107131171312713137131471315713167131771318713197132071321713227132371324713257132671327713287132971330713317133271333713347133571336713377133871339713407134171342713437134471345713467134771348713497135071351713527135371354713557135671357713587135971360713617136271363713647136571366713677136871369713707137171372713737137471375713767137771378713797138071381713827138371384713857138671387713887138971390713917139271393713947139571396713977139871399714007140171402714037140471405714067140771408714097141071411714127141371414714157141671417714187141971420714217142271423714247142571426714277142871429714307143171432714337143471435714367143771438714397144071441714427144371444714457144671447714487144971450714517145271453714547145571456714577145871459714607146171462714637146471465714667146771468714697147071471714727147371474714757147671477714787147971480714817148271483714847148571486714877148871489714907149171492714937149471495714967149771498714997150071501715027150371504715057150671507715087150971510715117151271513715147151571516715177151871519715207152171522715237152471525715267152771528715297153071531715327153371534715357153671537715387153971540715417154271543715447154571546715477154871549715507155171552715537155471555715567155771558715597156071561715627156371564715657156671567715687156971570715717157271573715747157571576715777157871579715807158171582715837158471585715867158771588715897159071591715927159371594715957159671597715987159971600716017160271603716047160571606716077160871609716107161171612716137161471615716167161771618716197162071621716227162371624716257162671627716287162971630716317163271633716347163571636716377163871639716407164171642716437164471645716467164771648716497165071651716527165371654716557165671657716587165971660716617166271663716647166571666716677166871669716707167171672716737167471675716767167771678716797168071681716827168371684716857168671687716887168971690716917169271693716947169571696716977169871699717007170171702717037170471705717067170771708717097171071711717127171371714717157171671717717187171971720717217172271723717247172571726717277172871729717307173171732717337173471735717367173771738717397174071741717427174371744717457174671747717487174971750717517175271753717547175571756717577175871759717607176171762717637176471765717667176771768717697177071771717727177371774717757177671777717787177971780717817178271783717847178571786717877178871789717907179171792717937179471795717967179771798717997180071801718027180371804718057180671807718087180971810718117181271813718147181571816718177181871819718207182171822718237182471825718267182771828718297183071831718327183371834718357183671837718387183971840718417184271843718447184571846718477184871849718507185171852718537185471855718567185771858718597186071861718627186371864718657186671867718687186971870718717187271873718747187571876718777187871879718807188171882718837188471885718867188771888718897189071891718927189371894718957189671897718987189971900719017190271903719047190571906719077190871909719107191171912719137191471915719167191771918719197192071921719227192371924719257192671927719287192971930719317193271933719347193571936719377193871939719407194171942719437194471945719467194771948719497195071951719527195371954719557195671957719587195971960719617196271963719647196571966719677196871969719707197171972719737197471975719767197771978719797198071981719827198371984719857198671987719887198971990719917199271993719947199571996719977199871999720007200172002720037200472005720067200772008720097201072011720127201372014720157201672017720187201972020720217202272023720247202572026720277202872029720307203172032720337203472035720367203772038720397204072041720427204372044720457204672047720487204972050720517205272053720547205572056720577205872059720607206172062720637206472065720667206772068720697207072071720727207372074720757207672077720787207972080720817208272083720847208572086720877208872089720907209172092720937209472095720967209772098720997210072101721027210372104721057210672107721087210972110721117211272113721147211572116721177211872119721207212172122721237212472125721267212772128721297213072131721327213372134721357213672137721387213972140721417214272143721447214572146721477214872149721507215172152721537215472155721567215772158721597216072161721627216372164721657216672167721687216972170721717217272173721747217572176721777217872179721807218172182721837218472185721867218772188721897219072191721927219372194721957219672197721987219972200722017220272203722047220572206722077220872209722107221172212722137221472215722167221772218722197222072221722227222372224722257222672227722287222972230722317223272233722347223572236722377223872239722407224172242722437224472245722467224772248722497225072251722527225372254722557225672257722587225972260722617226272263722647226572266722677226872269722707227172272722737227472275722767227772278722797228072281722827228372284722857228672287722887228972290722917229272293722947229572296722977229872299723007230172302723037230472305723067230772308723097231072311723127231372314723157231672317723187231972320723217232272323723247232572326723277232872329723307233172332723337233472335723367233772338723397234072341723427234372344723457234672347723487234972350723517235272353723547235572356723577235872359723607236172362723637236472365723667236772368723697237072371723727237372374723757237672377723787237972380723817238272383723847238572386723877238872389723907239172392723937239472395723967239772398723997240072401724027240372404724057240672407724087240972410724117241272413724147241572416724177241872419724207242172422724237242472425724267242772428724297243072431724327243372434724357243672437724387243972440724417244272443724447244572446724477244872449724507245172452724537245472455724567245772458724597246072461724627246372464724657246672467724687246972470724717247272473724747247572476724777247872479724807248172482724837248472485724867248772488724897249072491724927249372494724957249672497724987249972500725017250272503725047250572506725077250872509725107251172512725137251472515725167251772518725197252072521725227252372524725257252672527725287252972530725317253272533725347253572536725377253872539725407254172542725437254472545725467254772548725497255072551725527255372554725557255672557725587255972560725617256272563725647256572566725677256872569725707257172572725737257472575725767257772578725797258072581725827258372584725857258672587725887258972590725917259272593725947259572596725977259872599726007260172602726037260472605726067260772608726097261072611726127261372614726157261672617726187261972620726217262272623726247262572626726277262872629726307263172632726337263472635726367263772638726397264072641726427264372644726457264672647726487264972650726517265272653726547265572656726577265872659726607266172662726637266472665726667266772668726697267072671726727267372674726757267672677726787267972680726817268272683726847268572686726877268872689726907269172692726937269472695726967269772698726997270072701727027270372704727057270672707727087270972710727117271272713727147271572716727177271872719727207272172722727237272472725727267272772728727297273072731727327273372734727357273672737727387273972740727417274272743727447274572746727477274872749727507275172752727537275472755727567275772758727597276072761727627276372764727657276672767727687276972770727717277272773727747277572776727777277872779727807278172782727837278472785727867278772788727897279072791727927279372794727957279672797727987279972800728017280272803728047280572806728077280872809728107281172812728137281472815728167281772818728197282072821728227282372824728257282672827728287282972830728317283272833728347283572836728377283872839728407284172842728437284472845728467284772848728497285072851728527285372854728557285672857728587285972860728617286272863728647286572866728677286872869728707287172872728737287472875728767287772878728797288072881728827288372884728857288672887728887288972890728917289272893728947289572896728977289872899729007290172902729037290472905729067290772908729097291072911729127291372914729157291672917729187291972920729217292272923729247292572926729277292872929729307293172932729337293472935729367293772938729397294072941729427294372944729457294672947729487294972950729517295272953729547295572956729577295872959729607296172962729637296472965729667296772968729697297072971729727297372974729757297672977729787297972980729817298272983729847298572986729877298872989729907299172992729937299472995729967299772998729997300073001730027300373004730057300673007730087300973010730117301273013730147301573016730177301873019730207302173022730237302473025730267302773028730297303073031730327303373034730357303673037730387303973040730417304273043730447304573046730477304873049730507305173052730537305473055730567305773058730597306073061730627306373064730657306673067730687306973070730717307273073730747307573076730777307873079730807308173082730837308473085730867308773088730897309073091730927309373094730957309673097730987309973100731017310273103731047310573106731077310873109731107311173112731137311473115731167311773118731197312073121731227312373124731257312673127731287312973130731317313273133731347313573136731377313873139731407314173142731437314473145731467314773148731497315073151731527315373154731557315673157731587315973160731617316273163731647316573166731677316873169731707317173172731737317473175731767317773178731797318073181731827318373184731857318673187731887318973190731917319273193731947319573196731977319873199732007320173202732037320473205732067320773208732097321073211732127321373214732157321673217732187321973220732217322273223732247322573226732277322873229732307323173232732337323473235732367323773238732397324073241732427324373244732457324673247732487324973250732517325273253732547325573256732577325873259732607326173262732637326473265732667326773268732697327073271732727327373274732757327673277732787327973280732817328273283732847328573286732877328873289732907329173292732937329473295732967329773298732997330073301733027330373304733057330673307733087330973310733117331273313733147331573316733177331873319733207332173322733237332473325733267332773328733297333073331733327333373334733357333673337733387333973340733417334273343733447334573346733477334873349733507335173352733537335473355733567335773358733597336073361733627336373364733657336673367733687336973370733717337273373733747337573376733777337873379733807338173382733837338473385733867338773388733897339073391733927339373394733957339673397733987339973400734017340273403734047340573406734077340873409734107341173412734137341473415734167341773418734197342073421734227342373424734257342673427734287342973430734317343273433734347343573436734377343873439734407344173442734437344473445734467344773448734497345073451734527345373454734557345673457734587345973460734617346273463734647346573466734677346873469734707347173472734737347473475734767347773478734797348073481734827348373484734857348673487734887348973490734917349273493734947349573496734977349873499735007350173502735037350473505735067350773508735097351073511735127351373514735157351673517735187351973520735217352273523735247352573526735277352873529735307353173532735337353473535735367353773538735397354073541735427354373544735457354673547735487354973550735517355273553735547355573556735577355873559735607356173562735637356473565735667356773568735697357073571735727357373574735757357673577735787357973580735817358273583735847358573586735877358873589735907359173592735937359473595735967359773598735997360073601736027360373604736057360673607736087360973610736117361273613736147361573616736177361873619736207362173622736237362473625736267362773628736297363073631736327363373634736357363673637736387363973640736417364273643736447364573646736477364873649736507365173652736537365473655736567365773658736597366073661736627366373664736657366673667736687366973670736717367273673736747367573676736777367873679736807368173682736837368473685736867368773688736897369073691736927369373694736957369673697736987369973700737017370273703737047370573706737077370873709737107371173712737137371473715737167371773718737197372073721737227372373724737257372673727737287372973730737317373273733737347373573736737377373873739737407374173742737437374473745737467374773748737497375073751737527375373754737557375673757737587375973760737617376273763737647376573766737677376873769737707377173772737737377473775737767377773778737797378073781737827378373784737857378673787737887378973790737917379273793737947379573796737977379873799738007380173802738037380473805738067380773808738097381073811738127381373814738157381673817738187381973820738217382273823738247382573826738277382873829738307383173832738337383473835738367383773838738397384073841738427384373844738457384673847738487384973850738517385273853738547385573856738577385873859738607386173862738637386473865738667386773868738697387073871738727387373874738757387673877738787387973880738817388273883738847388573886738877388873889738907389173892738937389473895738967389773898738997390073901739027390373904739057390673907739087390973910739117391273913739147391573916739177391873919739207392173922739237392473925739267392773928739297393073931739327393373934739357393673937739387393973940739417394273943739447394573946739477394873949739507395173952739537395473955739567395773958739597396073961739627396373964739657396673967739687396973970739717397273973739747397573976739777397873979739807398173982739837398473985739867398773988739897399073991739927399373994739957399673997739987399974000740017400274003740047400574006740077400874009740107401174012740137401474015740167401774018740197402074021740227402374024740257402674027740287402974030740317403274033740347403574036740377403874039740407404174042740437404474045740467404774048740497405074051740527405374054740557405674057740587405974060740617406274063740647406574066740677406874069740707407174072740737407474075740767407774078740797408074081740827408374084740857408674087740887408974090740917409274093740947409574096740977409874099741007410174102741037410474105741067410774108741097411074111741127411374114741157411674117741187411974120741217412274123741247412574126741277412874129741307413174132741337413474135741367413774138741397414074141741427414374144741457414674147741487414974150741517415274153741547415574156741577415874159741607416174162741637416474165741667416774168741697417074171741727417374174741757417674177741787417974180741817418274183741847418574186741877418874189741907419174192741937419474195741967419774198741997420074201742027420374204742057420674207742087420974210742117421274213742147421574216742177421874219742207422174222742237422474225742267422774228742297423074231742327423374234742357423674237742387423974240742417424274243742447424574246742477424874249742507425174252742537425474255742567425774258742597426074261742627426374264742657426674267742687426974270742717427274273742747427574276742777427874279742807428174282742837428474285742867428774288742897429074291742927429374294742957429674297742987429974300743017430274303743047430574306743077430874309743107431174312743137431474315743167431774318743197432074321743227432374324743257432674327743287432974330743317433274333743347433574336743377433874339743407434174342743437434474345743467434774348743497435074351743527435374354743557435674357743587435974360743617436274363743647436574366743677436874369743707437174372743737437474375743767437774378743797438074381743827438374384743857438674387743887438974390743917439274393743947439574396743977439874399744007440174402744037440474405744067440774408744097441074411744127441374414744157441674417744187441974420744217442274423744247442574426744277442874429744307443174432744337443474435744367443774438744397444074441744427444374444744457444674447744487444974450744517445274453744547445574456744577445874459744607446174462744637446474465744667446774468744697447074471744727447374474744757447674477744787447974480744817448274483744847448574486744877448874489744907449174492744937449474495744967449774498744997450074501745027450374504745057450674507745087450974510745117451274513745147451574516745177451874519745207452174522745237452474525745267452774528745297453074531745327453374534745357453674537745387453974540745417454274543745447454574546745477454874549745507455174552745537455474555745567455774558745597456074561745627456374564745657456674567745687456974570745717457274573745747457574576745777457874579745807458174582745837458474585745867458774588745897459074591745927459374594745957459674597745987459974600746017460274603746047460574606746077460874609746107461174612746137461474615746167461774618746197462074621746227462374624746257462674627746287462974630746317463274633746347463574636746377463874639746407464174642746437464474645746467464774648746497465074651746527465374654746557465674657746587465974660746617466274663746647466574666746677466874669746707467174672746737467474675746767467774678746797468074681746827468374684746857468674687746887468974690746917469274693746947469574696746977469874699747007470174702747037470474705747067470774708747097471074711747127471374714747157471674717747187471974720747217472274723747247472574726747277472874729747307473174732747337473474735747367473774738747397474074741747427474374744747457474674747747487474974750747517475274753747547475574756747577475874759747607476174762747637476474765747667476774768747697477074771747727477374774747757477674777747787477974780747817478274783747847478574786747877478874789747907479174792747937479474795747967479774798747997480074801748027480374804748057480674807748087480974810748117481274813748147481574816748177481874819748207482174822748237482474825748267482774828748297483074831748327483374834748357483674837748387483974840748417484274843748447484574846748477484874849748507485174852748537485474855748567485774858748597486074861748627486374864748657486674867748687486974870748717487274873748747487574876748777487874879748807488174882748837488474885748867488774888748897489074891748927489374894748957489674897748987489974900749017490274903749047490574906749077490874909749107491174912749137491474915749167491774918749197492074921749227492374924749257492674927749287492974930749317493274933749347493574936749377493874939749407494174942749437494474945749467494774948749497495074951749527495374954749557495674957749587495974960749617496274963749647496574966749677496874969749707497174972749737497474975749767497774978749797498074981749827498374984749857498674987749887498974990749917499274993749947499574996749977499874999750007500175002750037500475005750067500775008750097501075011750127501375014750157501675017750187501975020750217502275023750247502575026750277502875029750307503175032750337503475035750367503775038750397504075041750427504375044750457504675047750487504975050750517505275053750547505575056750577505875059750607506175062750637506475065750667506775068750697507075071750727507375074750757507675077750787507975080750817508275083750847508575086750877508875089750907509175092750937509475095750967509775098750997510075101751027510375104751057510675107751087510975110751117511275113751147511575116751177511875119751207512175122751237512475125751267512775128751297513075131751327513375134751357513675137751387513975140751417514275143751447514575146751477514875149751507515175152751537515475155751567515775158751597516075161751627516375164751657516675167751687516975170751717517275173751747517575176751777517875179751807518175182751837518475185751867518775188751897519075191751927519375194751957519675197751987519975200752017520275203752047520575206752077520875209752107521175212752137521475215752167521775218752197522075221752227522375224752257522675227752287522975230752317523275233752347523575236752377523875239752407524175242752437524475245752467524775248752497525075251752527525375254752557525675257752587525975260752617526275263752647526575266752677526875269752707527175272752737527475275752767527775278752797528075281752827528375284752857528675287752887528975290752917529275293752947529575296752977529875299753007530175302753037530475305753067530775308753097531075311753127531375314753157531675317753187531975320753217532275323753247532575326753277532875329753307533175332753337533475335753367533775338753397534075341753427534375344753457534675347753487534975350753517535275353753547535575356753577535875359753607536175362753637536475365753667536775368753697537075371753727537375374753757537675377753787537975380753817538275383753847538575386753877538875389753907539175392753937539475395753967539775398753997540075401754027540375404754057540675407754087540975410754117541275413754147541575416754177541875419754207542175422754237542475425754267542775428754297543075431754327543375434754357543675437754387543975440754417544275443754447544575446754477544875449754507545175452754537545475455754567545775458754597546075461754627546375464754657546675467754687546975470754717547275473754747547575476754777547875479754807548175482754837548475485754867548775488754897549075491754927549375494754957549675497754987549975500755017550275503755047550575506755077550875509755107551175512755137551475515755167551775518755197552075521755227552375524755257552675527755287552975530755317553275533755347553575536755377553875539755407554175542755437554475545755467554775548755497555075551755527555375554755557555675557755587555975560755617556275563755647556575566755677556875569755707557175572755737557475575755767557775578755797558075581755827558375584755857558675587755887558975590755917559275593755947559575596755977559875599756007560175602756037560475605756067560775608756097561075611756127561375614756157561675617756187561975620756217562275623756247562575626756277562875629756307563175632756337563475635756367563775638756397564075641756427564375644756457564675647756487564975650756517565275653756547565575656756577565875659756607566175662756637566475665756667566775668756697567075671756727567375674756757567675677756787567975680756817568275683756847568575686756877568875689756907569175692756937569475695756967569775698756997570075701757027570375704757057570675707757087570975710757117571275713757147571575716757177571875719757207572175722757237572475725757267572775728757297573075731757327573375734757357573675737757387573975740757417574275743757447574575746757477574875749757507575175752757537575475755757567575775758757597576075761757627576375764757657576675767757687576975770757717577275773757747577575776757777577875779757807578175782757837578475785757867578775788757897579075791757927579375794757957579675797757987579975800758017580275803758047580575806758077580875809758107581175812758137581475815758167581775818758197582075821758227582375824758257582675827758287582975830758317583275833758347583575836758377583875839758407584175842758437584475845758467584775848758497585075851758527585375854758557585675857758587585975860758617586275863758647586575866758677586875869758707587175872758737587475875758767587775878758797588075881758827588375884758857588675887758887588975890758917589275893758947589575896758977589875899759007590175902759037590475905759067590775908759097591075911759127591375914759157591675917759187591975920759217592275923759247592575926759277592875929759307593175932759337593475935759367593775938759397594075941759427594375944759457594675947759487594975950759517595275953759547595575956759577595875959759607596175962759637596475965759667596775968759697597075971759727597375974759757597675977759787597975980759817598275983759847598575986759877598875989759907599175992759937599475995759967599775998759997600076001760027600376004760057600676007760087600976010760117601276013760147601576016760177601876019760207602176022760237602476025760267602776028760297603076031760327603376034760357603676037760387603976040760417604276043760447604576046760477604876049760507605176052760537605476055760567605776058760597606076061760627606376064760657606676067760687606976070760717607276073760747607576076760777607876079760807608176082760837608476085760867608776088760897609076091760927609376094760957609676097760987609976100761017610276103761047610576106761077610876109761107611176112761137611476115761167611776118761197612076121761227612376124761257612676127761287612976130761317613276133761347613576136761377613876139761407614176142761437614476145761467614776148761497615076151761527615376154761557615676157761587615976160761617616276163761647616576166761677616876169761707617176172761737617476175761767617776178761797618076181761827618376184761857618676187761887618976190761917619276193761947619576196761977619876199762007620176202762037620476205762067620776208762097621076211762127621376214762157621676217762187621976220762217622276223762247622576226762277622876229762307623176232762337623476235762367623776238762397624076241762427624376244762457624676247762487624976250762517625276253762547625576256762577625876259762607626176262762637626476265762667626776268762697627076271762727627376274762757627676277762787627976280762817628276283762847628576286762877628876289762907629176292762937629476295762967629776298762997630076301763027630376304763057630676307763087630976310763117631276313763147631576316763177631876319763207632176322763237632476325763267632776328763297633076331763327633376334763357633676337763387633976340763417634276343763447634576346763477634876349763507635176352763537635476355763567635776358763597636076361763627636376364763657636676367763687636976370763717637276373763747637576376763777637876379763807638176382763837638476385763867638776388763897639076391763927639376394763957639676397763987639976400764017640276403764047640576406764077640876409764107641176412764137641476415764167641776418764197642076421764227642376424764257642676427764287642976430764317643276433764347643576436764377643876439764407644176442764437644476445764467644776448764497645076451764527645376454764557645676457764587645976460764617646276463764647646576466764677646876469764707647176472764737647476475764767647776478764797648076481764827648376484764857648676487764887648976490764917649276493764947649576496764977649876499765007650176502765037650476505765067650776508765097651076511765127651376514765157651676517765187651976520765217652276523765247652576526765277652876529765307653176532765337653476535765367653776538765397654076541765427654376544765457654676547765487654976550765517655276553765547655576556765577655876559765607656176562765637656476565765667656776568765697657076571765727657376574765757657676577765787657976580765817658276583765847658576586765877658876589765907659176592765937659476595765967659776598765997660076601766027660376604766057660676607766087660976610766117661276613766147661576616766177661876619766207662176622766237662476625766267662776628766297663076631766327663376634766357663676637766387663976640766417664276643766447664576646766477664876649766507665176652766537665476655766567665776658766597666076661766627666376664766657666676667766687666976670766717667276673766747667576676766777667876679766807668176682766837668476685766867668776688766897669076691766927669376694766957669676697766987669976700767017670276703767047670576706767077670876709767107671176712767137671476715767167671776718767197672076721767227672376724767257672676727767287672976730767317673276733767347673576736767377673876739767407674176742767437674476745767467674776748767497675076751767527675376754767557675676757767587675976760767617676276763767647676576766767677676876769767707677176772767737677476775767767677776778767797678076781767827678376784767857678676787767887678976790767917679276793767947679576796767977679876799768007680176802768037680476805768067680776808768097681076811768127681376814768157681676817768187681976820768217682276823768247682576826768277682876829768307683176832768337683476835768367683776838768397684076841768427684376844768457684676847768487684976850768517685276853768547685576856768577685876859768607686176862768637686476865768667686776868768697687076871768727687376874768757687676877768787687976880768817688276883768847688576886768877688876889768907689176892768937689476895768967689776898768997690076901769027690376904769057690676907769087690976910769117691276913769147691576916769177691876919769207692176922769237692476925769267692776928769297693076931769327693376934769357693676937769387693976940769417694276943769447694576946769477694876949769507695176952769537695476955769567695776958769597696076961769627696376964769657696676967769687696976970769717697276973769747697576976769777697876979769807698176982769837698476985769867698776988769897699076991769927699376994769957699676997769987699977000770017700277003770047700577006770077700877009770107701177012770137701477015770167701777018770197702077021770227702377024770257702677027770287702977030770317703277033770347703577036770377703877039770407704177042770437704477045770467704777048770497705077051770527705377054770557705677057770587705977060770617706277063770647706577066770677706877069770707707177072770737707477075770767707777078770797708077081770827708377084770857708677087770887708977090770917709277093770947709577096770977709877099771007710177102771037710477105771067710777108771097711077111771127711377114771157711677117771187711977120771217712277123771247712577126771277712877129771307713177132771337713477135771367713777138771397714077141771427714377144771457714677147771487714977150771517715277153771547715577156771577715877159771607716177162771637716477165771667716777168771697717077171771727717377174771757717677177771787717977180771817718277183771847718577186771877718877189771907719177192771937719477195771967719777198771997720077201772027720377204772057720677207772087720977210772117721277213772147721577216772177721877219772207722177222772237722477225772267722777228772297723077231772327723377234772357723677237772387723977240772417724277243772447724577246772477724877249772507725177252772537725477255772567725777258772597726077261772627726377264772657726677267772687726977270772717727277273772747727577276772777727877279772807728177282772837728477285772867728777288772897729077291772927729377294772957729677297772987729977300773017730277303773047730577306773077730877309773107731177312773137731477315773167731777318773197732077321773227732377324773257732677327773287732977330773317733277333773347733577336773377733877339773407734177342773437734477345773467734777348773497735077351773527735377354773557735677357773587735977360773617736277363773647736577366773677736877369773707737177372773737737477375773767737777378773797738077381773827738377384773857738677387773887738977390773917739277393773947739577396773977739877399774007740177402774037740477405774067740777408774097741077411774127741377414774157741677417774187741977420774217742277423774247742577426774277742877429774307743177432774337743477435774367743777438774397744077441774427744377444774457744677447774487744977450774517745277453774547745577456774577745877459774607746177462774637746477465774667746777468774697747077471774727747377474774757747677477774787747977480774817748277483774847748577486774877748877489774907749177492774937749477495774967749777498774997750077501775027750377504775057750677507775087750977510775117751277513775147751577516775177751877519775207752177522775237752477525775267752777528775297753077531775327753377534775357753677537775387753977540775417754277543775447754577546775477754877549775507755177552775537755477555775567755777558775597756077561775627756377564775657756677567775687756977570775717757277573775747757577576775777757877579775807758177582775837758477585775867758777588775897759077591775927759377594775957759677597775987759977600776017760277603776047760577606776077760877609776107761177612776137761477615776167761777618776197762077621776227762377624776257762677627776287762977630776317763277633776347763577636776377763877639776407764177642776437764477645776467764777648776497765077651776527765377654776557765677657776587765977660776617766277663776647766577666776677766877669776707767177672776737767477675776767767777678776797768077681776827768377684776857768677687776887768977690776917769277693776947769577696776977769877699777007770177702777037770477705777067770777708777097771077711777127771377714777157771677717777187771977720777217772277723777247772577726777277772877729777307773177732777337773477735777367773777738777397774077741777427774377744777457774677747777487774977750777517775277753777547775577756777577775877759777607776177762777637776477765777667776777768777697777077771777727777377774777757777677777777787777977780777817778277783777847778577786777877778877789777907779177792777937779477795777967779777798777997780077801778027780377804778057780677807778087780977810778117781277813778147781577816778177781877819778207782177822778237782477825778267782777828778297783077831778327783377834778357783677837778387783977840778417784277843778447784577846778477784877849778507785177852778537785477855778567785777858778597786077861778627786377864778657786677867778687786977870778717787277873778747787577876778777787877879778807788177882778837788477885778867788777888778897789077891778927789377894778957789677897778987789977900779017790277903779047790577906779077790877909779107791177912779137791477915779167791777918779197792077921779227792377924779257792677927779287792977930779317793277933779347793577936779377793877939779407794177942779437794477945779467794777948779497795077951779527795377954779557795677957779587795977960779617796277963779647796577966779677796877969779707797177972779737797477975779767797777978779797798077981779827798377984779857798677987779887798977990779917799277993779947799577996779977799877999780007800178002780037800478005780067800778008780097801078011780127801378014780157801678017780187801978020780217802278023780247802578026780277802878029780307803178032780337803478035780367803778038780397804078041780427804378044780457804678047780487804978050780517805278053780547805578056780577805878059780607806178062780637806478065780667806778068780697807078071780727807378074780757807678077780787807978080780817808278083780847808578086780877808878089780907809178092780937809478095780967809778098780997810078101781027810378104781057810678107781087810978110781117811278113781147811578116781177811878119781207812178122781237812478125781267812778128781297813078131781327813378134781357813678137781387813978140781417814278143781447814578146781477814878149781507815178152781537815478155781567815778158781597816078161781627816378164781657816678167781687816978170781717817278173781747817578176781777817878179781807818178182781837818478185781867818778188781897819078191781927819378194781957819678197781987819978200782017820278203782047820578206782077820878209782107821178212782137821478215782167821778218782197822078221782227822378224782257822678227782287822978230782317823278233782347823578236782377823878239782407824178242782437824478245782467824778248782497825078251782527825378254782557825678257782587825978260782617826278263782647826578266782677826878269782707827178272782737827478275782767827778278782797828078281782827828378284782857828678287782887828978290782917829278293782947829578296782977829878299783007830178302783037830478305783067830778308783097831078311783127831378314783157831678317783187831978320783217832278323783247832578326783277832878329783307833178332783337833478335783367833778338783397834078341783427834378344783457834678347783487834978350783517835278353783547835578356783577835878359783607836178362783637836478365783667836778368783697837078371783727837378374783757837678377783787837978380783817838278383783847838578386783877838878389783907839178392783937839478395783967839778398783997840078401784027840378404784057840678407784087840978410784117841278413784147841578416784177841878419784207842178422784237842478425784267842778428784297843078431784327843378434784357843678437784387843978440784417844278443784447844578446784477844878449784507845178452784537845478455784567845778458784597846078461784627846378464784657846678467784687846978470784717847278473784747847578476784777847878479784807848178482784837848478485784867848778488784897849078491784927849378494784957849678497784987849978500785017850278503785047850578506785077850878509785107851178512785137851478515785167851778518785197852078521785227852378524785257852678527785287852978530785317853278533785347853578536785377853878539785407854178542785437854478545785467854778548785497855078551785527855378554785557855678557785587855978560785617856278563785647856578566785677856878569785707857178572785737857478575785767857778578785797858078581785827858378584785857858678587785887858978590785917859278593785947859578596785977859878599786007860178602786037860478605786067860778608786097861078611786127861378614786157861678617786187861978620786217862278623786247862578626786277862878629786307863178632786337863478635786367863778638786397864078641786427864378644786457864678647786487864978650786517865278653786547865578656786577865878659786607866178662786637866478665786667866778668786697867078671786727867378674786757867678677786787867978680786817868278683786847868578686786877868878689786907869178692786937869478695786967869778698786997870078701787027870378704787057870678707787087870978710787117871278713787147871578716787177871878719787207872178722787237872478725787267872778728787297873078731787327873378734787357873678737787387873978740787417874278743787447874578746787477874878749787507875178752787537875478755787567875778758787597876078761787627876378764787657876678767787687876978770787717877278773787747877578776787777877878779787807878178782787837878478785787867878778788787897879078791787927879378794787957879678797787987879978800788017880278803788047880578806788077880878809788107881178812788137881478815788167881778818788197882078821788227882378824788257882678827788287882978830788317883278833788347883578836788377883878839788407884178842788437884478845788467884778848788497885078851788527885378854788557885678857788587885978860788617886278863788647886578866788677886878869788707887178872788737887478875788767887778878788797888078881788827888378884788857888678887788887888978890788917889278893788947889578896788977889878899789007890178902789037890478905789067890778908789097891078911789127891378914789157891678917789187891978920789217892278923789247892578926789277892878929789307893178932789337893478935789367893778938789397894078941789427894378944789457894678947789487894978950789517895278953789547895578956789577895878959789607896178962789637896478965789667896778968789697897078971789727897378974789757897678977789787897978980789817898278983789847898578986789877898878989789907899178992789937899478995789967899778998789997900079001790027900379004790057900679007790087900979010790117901279013790147901579016790177901879019790207902179022790237902479025790267902779028790297903079031790327903379034790357903679037790387903979040790417904279043790447904579046790477904879049790507905179052790537905479055790567905779058790597906079061790627906379064790657906679067790687906979070790717907279073790747907579076790777907879079790807908179082790837908479085790867908779088790897909079091790927909379094790957909679097790987909979100791017910279103791047910579106791077910879109791107911179112791137911479115791167911779118791197912079121791227912379124791257912679127791287912979130791317913279133791347913579136791377913879139791407914179142791437914479145791467914779148791497915079151791527915379154791557915679157791587915979160791617916279163791647916579166791677916879169791707917179172791737917479175791767917779178791797918079181791827918379184791857918679187791887918979190791917919279193791947919579196791977919879199792007920179202792037920479205792067920779208792097921079211792127921379214792157921679217792187921979220792217922279223792247922579226792277922879229792307923179232792337923479235792367923779238792397924079241792427924379244792457924679247792487924979250792517925279253792547925579256792577925879259792607926179262792637926479265792667926779268792697927079271792727927379274792757927679277792787927979280792817928279283792847928579286792877928879289792907929179292792937929479295792967929779298792997930079301793027930379304793057930679307793087930979310793117931279313793147931579316793177931879319793207932179322793237932479325793267932779328793297933079331793327933379334793357933679337793387933979340793417934279343793447934579346793477934879349793507935179352793537935479355793567935779358793597936079361793627936379364793657936679367793687936979370793717937279373793747937579376793777937879379793807938179382793837938479385793867938779388793897939079391793927939379394793957939679397793987939979400794017940279403794047940579406794077940879409794107941179412794137941479415794167941779418794197942079421794227942379424794257942679427794287942979430794317943279433794347943579436794377943879439794407944179442794437944479445794467944779448794497945079451794527945379454794557945679457794587945979460794617946279463794647946579466794677946879469794707947179472794737947479475794767947779478794797948079481794827948379484794857948679487794887948979490794917949279493794947949579496794977949879499795007950179502795037950479505795067950779508795097951079511795127951379514795157951679517795187951979520795217952279523795247952579526795277952879529795307953179532795337953479535795367953779538795397954079541795427954379544795457954679547795487954979550795517955279553795547955579556795577955879559795607956179562795637956479565795667956779568795697957079571795727957379574795757957679577795787957979580795817958279583795847958579586795877958879589795907959179592795937959479595795967959779598795997960079601796027960379604796057960679607796087960979610796117961279613796147961579616796177961879619796207962179622796237962479625796267962779628796297963079631796327963379634796357963679637796387963979640796417964279643796447964579646796477964879649796507965179652796537965479655796567965779658796597966079661796627966379664796657966679667796687966979670796717967279673796747967579676796777967879679796807968179682796837968479685796867968779688796897969079691796927969379694796957969679697796987969979700797017970279703797047970579706797077970879709797107971179712797137971479715797167971779718797197972079721797227972379724797257972679727797287972979730797317973279733797347973579736797377973879739797407974179742797437974479745797467974779748797497975079751797527975379754797557975679757797587975979760797617976279763797647976579766797677976879769797707977179772797737977479775797767977779778797797978079781797827978379784797857978679787797887978979790797917979279793797947979579796797977979879799798007980179802798037980479805798067980779808798097981079811798127981379814798157981679817798187981979820798217982279823798247982579826798277982879829798307983179832798337983479835798367983779838798397984079841798427984379844798457984679847798487984979850798517985279853798547985579856798577985879859798607986179862798637986479865798667986779868798697987079871798727987379874798757987679877798787987979880798817988279883798847988579886798877988879889798907989179892798937989479895798967989779898798997990079901799027990379904799057990679907799087990979910799117991279913799147991579916799177991879919799207992179922799237992479925799267992779928799297993079931799327993379934799357993679937799387993979940799417994279943799447994579946799477994879949799507995179952799537995479955799567995779958799597996079961799627996379964799657996679967799687996979970799717997279973799747997579976799777997879979799807998179982799837998479985799867998779988799897999079991799927999379994799957999679997799987999980000800018000280003800048000580006800078000880009800108001180012800138001480015800168001780018800198002080021800228002380024800258002680027800288002980030800318003280033800348003580036800378003880039800408004180042800438004480045800468004780048800498005080051800528005380054800558005680057800588005980060800618006280063800648006580066800678006880069800708007180072800738007480075800768007780078800798008080081800828008380084800858008680087800888008980090800918009280093800948009580096800978009880099801008010180102801038010480105801068010780108801098011080111801128011380114801158011680117801188011980120801218012280123801248012580126801278012880129801308013180132801338013480135801368013780138801398014080141801428014380144801458014680147801488014980150801518015280153801548015580156801578015880159801608016180162801638016480165801668016780168801698017080171801728017380174801758017680177801788017980180801818018280183801848018580186801878018880189801908019180192801938019480195801968019780198801998020080201802028020380204802058020680207802088020980210802118021280213802148021580216802178021880219802208022180222802238022480225802268022780228802298023080231802328023380234802358023680237802388023980240802418024280243802448024580246802478024880249802508025180252802538025480255802568025780258802598026080261802628026380264802658026680267802688026980270802718027280273802748027580276802778027880279802808028180282802838028480285802868028780288802898029080291802928029380294802958029680297802988029980300803018030280303803048030580306803078030880309803108031180312803138031480315803168031780318803198032080321803228032380324803258032680327803288032980330803318033280333803348033580336803378033880339803408034180342803438034480345803468034780348803498035080351803528035380354803558035680357803588035980360803618036280363803648036580366803678036880369803708037180372803738037480375803768037780378803798038080381803828038380384803858038680387803888038980390803918039280393803948039580396803978039880399804008040180402804038040480405804068040780408804098041080411804128041380414804158041680417804188041980420804218042280423804248042580426804278042880429804308043180432804338043480435804368043780438804398044080441804428044380444804458044680447804488044980450804518045280453804548045580456804578045880459804608046180462804638046480465804668046780468804698047080471804728047380474804758047680477804788047980480804818048280483804848048580486804878048880489804908049180492804938049480495804968049780498804998050080501805028050380504805058050680507805088050980510805118051280513805148051580516805178051880519805208052180522805238052480525805268052780528805298053080531805328053380534805358053680537805388053980540805418054280543805448054580546805478054880549805508055180552805538055480555805568055780558805598056080561805628056380564805658056680567805688056980570805718057280573805748057580576805778057880579805808058180582805838058480585805868058780588805898059080591805928059380594805958059680597805988059980600806018060280603806048060580606806078060880609806108061180612806138061480615806168061780618806198062080621806228062380624806258062680627806288062980630806318063280633806348063580636806378063880639806408064180642806438064480645806468064780648806498065080651806528065380654806558065680657806588065980660806618066280663806648066580666806678066880669806708067180672806738067480675806768067780678806798068080681806828068380684806858068680687806888068980690806918069280693806948069580696806978069880699807008070180702807038070480705807068070780708807098071080711807128071380714807158071680717807188071980720807218072280723807248072580726807278072880729807308073180732807338073480735807368073780738807398074080741807428074380744807458074680747807488074980750807518075280753807548075580756807578075880759807608076180762807638076480765807668076780768807698077080771807728077380774807758077680777807788077980780807818078280783807848078580786807878078880789807908079180792807938079480795807968079780798807998080080801808028080380804808058080680807808088080980810808118081280813808148081580816808178081880819808208082180822808238082480825808268082780828808298083080831808328083380834808358083680837808388083980840808418084280843808448084580846808478084880849808508085180852808538085480855808568085780858808598086080861808628086380864808658086680867808688086980870808718087280873808748087580876808778087880879808808088180882808838088480885808868088780888808898089080891808928089380894808958089680897808988089980900809018090280903809048090580906809078090880909809108091180912809138091480915809168091780918809198092080921809228092380924809258092680927809288092980930809318093280933809348093580936809378093880939809408094180942809438094480945809468094780948809498095080951809528095380954809558095680957809588095980960809618096280963809648096580966809678096880969809708097180972809738097480975809768097780978809798098080981809828098380984809858098680987809888098980990809918099280993809948099580996809978099880999810008100181002810038100481005810068100781008810098101081011810128101381014810158101681017810188101981020810218102281023810248102581026810278102881029810308103181032810338103481035810368103781038810398104081041810428104381044810458104681047810488104981050810518105281053810548105581056810578105881059810608106181062810638106481065810668106781068810698107081071810728107381074810758107681077810788107981080810818108281083810848108581086810878108881089810908109181092810938109481095810968109781098810998110081101811028110381104811058110681107811088110981110811118111281113811148111581116811178111881119811208112181122811238112481125811268112781128811298113081131811328113381134811358113681137811388113981140811418114281143811448114581146811478114881149811508115181152811538115481155811568115781158811598116081161811628116381164811658116681167811688116981170811718117281173811748117581176811778117881179811808118181182811838118481185811868118781188811898119081191811928119381194811958119681197811988119981200812018120281203812048120581206812078120881209812108121181212812138121481215812168121781218812198122081221812228122381224812258122681227812288122981230812318123281233812348123581236812378123881239812408124181242812438124481245812468124781248812498125081251812528125381254812558125681257812588125981260812618126281263812648126581266812678126881269812708127181272812738127481275812768127781278812798128081281812828128381284812858128681287812888128981290812918129281293812948129581296812978129881299813008130181302813038130481305813068130781308813098131081311813128131381314813158131681317813188131981320813218132281323813248132581326813278132881329813308133181332813338133481335813368133781338813398134081341813428134381344813458134681347813488134981350813518135281353813548135581356813578135881359813608136181362813638136481365813668136781368813698137081371813728137381374813758137681377813788137981380813818138281383813848138581386813878138881389813908139181392813938139481395813968139781398813998140081401814028140381404814058140681407814088140981410814118141281413814148141581416814178141881419814208142181422814238142481425814268142781428814298143081431814328143381434814358143681437814388143981440814418144281443814448144581446814478144881449814508145181452814538145481455814568145781458814598146081461814628146381464814658146681467814688146981470814718147281473814748147581476814778147881479814808148181482814838148481485814868148781488814898149081491814928149381494814958149681497814988149981500815018150281503815048150581506815078150881509815108151181512815138151481515815168151781518815198152081521815228152381524815258152681527815288152981530815318153281533815348153581536815378153881539815408154181542815438154481545815468154781548815498155081551815528155381554815558155681557815588155981560815618156281563815648156581566815678156881569815708157181572815738157481575815768157781578815798158081581815828158381584815858158681587815888158981590815918159281593815948159581596815978159881599816008160181602816038160481605816068160781608816098161081611816128161381614816158161681617816188161981620816218162281623816248162581626816278162881629816308163181632816338163481635816368163781638816398164081641816428164381644816458164681647816488164981650816518165281653816548165581656816578165881659816608166181662816638166481665816668166781668816698167081671816728167381674816758167681677816788167981680816818168281683816848168581686816878168881689816908169181692816938169481695816968169781698816998170081701817028170381704817058170681707817088170981710817118171281713817148171581716817178171881719817208172181722817238172481725817268172781728817298173081731817328173381734817358173681737817388173981740817418174281743817448174581746817478174881749817508175181752817538175481755817568175781758817598176081761817628176381764817658176681767817688176981770817718177281773817748177581776817778177881779817808178181782817838178481785817868178781788817898179081791817928179381794817958179681797817988179981800818018180281803818048180581806818078180881809818108181181812818138181481815818168181781818818198182081821818228182381824818258182681827818288182981830818318183281833818348183581836818378183881839818408184181842818438184481845818468184781848818498185081851818528185381854818558185681857818588185981860818618186281863818648186581866818678186881869818708187181872818738187481875818768187781878818798188081881818828188381884818858188681887818888188981890818918189281893818948189581896818978189881899819008190181902819038190481905819068190781908819098191081911819128191381914819158191681917819188191981920819218192281923819248192581926819278192881929819308193181932819338193481935819368193781938819398194081941819428194381944819458194681947819488194981950819518195281953819548195581956819578195881959819608196181962819638196481965819668196781968819698197081971819728197381974819758197681977819788197981980819818198281983819848198581986819878198881989819908199181992819938199481995819968199781998819998200082001820028200382004820058200682007820088200982010820118201282013820148201582016820178201882019820208202182022820238202482025820268202782028820298203082031820328203382034820358203682037820388203982040820418204282043820448204582046820478204882049820508205182052820538205482055820568205782058820598206082061820628206382064820658206682067820688206982070820718207282073820748207582076820778207882079820808208182082820838208482085820868208782088820898209082091820928209382094820958209682097820988209982100821018210282103821048210582106821078210882109821108211182112821138211482115821168211782118821198212082121821228212382124821258212682127821288212982130821318213282133821348213582136821378213882139821408214182142821438214482145821468214782148821498215082151821528215382154821558215682157821588215982160821618216282163821648216582166821678216882169821708217182172821738217482175821768217782178821798218082181821828218382184821858218682187821888218982190821918219282193821948219582196821978219882199822008220182202822038220482205822068220782208822098221082211822128221382214822158221682217822188221982220822218222282223822248222582226822278222882229822308223182232822338223482235822368223782238822398224082241822428224382244822458224682247822488224982250822518225282253822548225582256822578225882259822608226182262822638226482265822668226782268822698227082271822728227382274822758227682277822788227982280822818228282283822848228582286822878228882289822908229182292822938229482295822968229782298822998230082301823028230382304823058230682307823088230982310823118231282313823148231582316823178231882319823208232182322823238232482325823268232782328823298233082331823328233382334823358233682337823388233982340823418234282343823448234582346823478234882349823508235182352823538235482355823568235782358823598236082361823628236382364823658236682367823688236982370823718237282373823748237582376823778237882379823808238182382823838238482385823868238782388823898239082391823928239382394823958239682397823988239982400824018240282403824048240582406824078240882409824108241182412824138241482415824168241782418824198242082421824228242382424824258242682427824288242982430824318243282433824348243582436824378243882439824408244182442824438244482445824468244782448824498245082451824528245382454824558245682457824588245982460824618246282463824648246582466824678246882469824708247182472824738247482475824768247782478824798248082481824828248382484824858248682487824888248982490824918249282493824948249582496824978249882499825008250182502825038250482505825068250782508825098251082511825128251382514825158251682517825188251982520825218252282523825248252582526825278252882529825308253182532825338253482535825368253782538825398254082541825428254382544825458254682547825488254982550825518255282553825548255582556825578255882559825608256182562825638256482565825668256782568825698257082571825728257382574825758257682577825788257982580825818258282583825848258582586825878258882589825908259182592825938259482595825968259782598825998260082601826028260382604826058260682607826088260982610826118261282613826148261582616826178261882619826208262182622826238262482625826268262782628826298263082631826328263382634826358263682637826388263982640826418264282643826448264582646826478264882649826508265182652826538265482655826568265782658826598266082661826628266382664826658266682667826688266982670826718267282673826748267582676826778267882679826808268182682826838268482685826868268782688826898269082691826928269382694826958269682697826988269982700827018270282703827048270582706827078270882709827108271182712827138271482715827168271782718827198272082721827228272382724827258272682727827288272982730827318273282733827348273582736827378273882739827408274182742827438274482745827468274782748827498275082751827528275382754827558275682757827588275982760827618276282763827648276582766827678276882769827708277182772827738277482775827768277782778827798278082781827828278382784827858278682787827888278982790827918279282793827948279582796827978279882799828008280182802828038280482805828068280782808828098281082811828128281382814828158281682817828188281982820828218282282823828248282582826828278282882829828308283182832828338283482835828368283782838828398284082841828428284382844828458284682847828488284982850828518285282853828548285582856828578285882859828608286182862828638286482865828668286782868828698287082871828728287382874828758287682877828788287982880828818288282883828848288582886828878288882889828908289182892828938289482895828968289782898828998290082901829028290382904829058290682907829088290982910829118291282913829148291582916829178291882919829208292182922829238292482925829268292782928829298293082931829328293382934829358293682937829388293982940829418294282943829448294582946829478294882949829508295182952829538295482955829568295782958829598296082961829628296382964829658296682967829688296982970829718297282973829748297582976829778297882979829808298182982829838298482985829868298782988829898299082991829928299382994829958299682997829988299983000830018300283003830048300583006830078300883009830108301183012830138301483015830168301783018830198302083021830228302383024830258302683027830288302983030830318303283033830348303583036830378303883039830408304183042830438304483045830468304783048830498305083051830528305383054830558305683057830588305983060830618306283063830648306583066830678306883069830708307183072830738307483075830768307783078830798308083081830828308383084830858308683087830888308983090830918309283093830948309583096830978309883099831008310183102831038310483105831068310783108831098311083111831128311383114831158311683117831188311983120831218312283123831248312583126831278312883129831308313183132831338313483135831368313783138831398314083141831428314383144831458314683147831488314983150831518315283153831548315583156831578315883159831608316183162831638316483165831668316783168831698317083171831728317383174831758317683177831788317983180831818318283183831848318583186831878318883189831908319183192831938319483195831968319783198831998320083201832028320383204832058320683207832088320983210832118321283213832148321583216832178321883219832208322183222832238322483225832268322783228832298323083231832328323383234832358323683237832388323983240832418324283243832448324583246832478324883249832508325183252832538325483255832568325783258832598326083261832628326383264832658326683267832688326983270832718327283273832748327583276832778327883279832808328183282832838328483285832868328783288832898329083291832928329383294832958329683297832988329983300833018330283303833048330583306833078330883309833108331183312833138331483315833168331783318833198332083321833228332383324833258332683327833288332983330833318333283333833348333583336833378333883339833408334183342833438334483345833468334783348833498335083351833528335383354833558335683357833588335983360833618336283363833648336583366833678336883369833708337183372833738337483375833768337783378833798338083381833828338383384833858338683387833888338983390833918339283393833948339583396833978339883399834008340183402834038340483405834068340783408834098341083411834128341383414834158341683417834188341983420834218342283423834248342583426834278342883429834308343183432834338343483435834368343783438834398344083441834428344383444834458344683447834488344983450834518345283453834548345583456834578345883459834608346183462834638346483465834668346783468834698347083471834728347383474834758347683477834788347983480834818348283483834848348583486834878348883489834908349183492834938349483495834968349783498834998350083501835028350383504835058350683507835088350983510835118351283513835148351583516835178351883519835208352183522835238352483525835268352783528835298353083531835328353383534835358353683537835388353983540835418354283543835448354583546835478354883549835508355183552835538355483555835568355783558835598356083561835628356383564835658356683567835688356983570835718357283573835748357583576835778357883579835808358183582835838358483585835868358783588835898359083591835928359383594835958359683597835988359983600836018360283603836048360583606836078360883609836108361183612836138361483615836168361783618836198362083621836228362383624836258362683627836288362983630836318363283633836348363583636836378363883639836408364183642836438364483645836468364783648836498365083651836528365383654836558365683657836588365983660836618366283663836648366583666836678366883669836708367183672836738367483675836768367783678836798368083681836828368383684836858368683687836888368983690836918369283693836948369583696836978369883699837008370183702837038370483705837068370783708837098371083711837128371383714837158371683717837188371983720837218372283723837248372583726837278372883729837308373183732837338373483735837368373783738837398374083741837428374383744837458374683747837488374983750837518375283753837548375583756837578375883759837608376183762837638376483765837668376783768837698377083771837728377383774837758377683777837788377983780837818378283783837848378583786837878378883789837908379183792837938379483795837968379783798837998380083801838028380383804838058380683807838088380983810838118381283813838148381583816838178381883819838208382183822838238382483825838268382783828838298383083831838328383383834838358383683837838388383983840838418384283843838448384583846838478384883849838508385183852838538385483855838568385783858838598386083861838628386383864838658386683867838688386983870838718387283873838748387583876838778387883879838808388183882838838388483885838868388783888838898389083891838928389383894838958389683897838988389983900839018390283903839048390583906839078390883909839108391183912839138391483915839168391783918839198392083921839228392383924839258392683927839288392983930839318393283933839348393583936839378393883939839408394183942839438394483945839468394783948839498395083951839528395383954839558395683957839588395983960839618396283963839648396583966839678396883969839708397183972839738397483975839768397783978839798398083981839828398383984839858398683987839888398983990839918399283993839948399583996839978399883999840008400184002840038400484005840068400784008840098401084011840128401384014840158401684017840188401984020840218402284023840248402584026840278402884029840308403184032840338403484035840368403784038840398404084041840428404384044840458404684047840488404984050840518405284053840548405584056840578405884059840608406184062840638406484065840668406784068840698407084071840728407384074840758407684077840788407984080840818408284083840848408584086840878408884089840908409184092840938409484095840968409784098840998410084101841028410384104841058410684107841088410984110841118411284113841148411584116841178411884119841208412184122841238412484125841268412784128841298413084131841328413384134841358413684137841388413984140841418414284143841448414584146841478414884149841508415184152841538415484155841568415784158841598416084161841628416384164841658416684167841688416984170841718417284173841748417584176841778417884179841808418184182841838418484185841868418784188841898419084191841928419384194841958419684197841988419984200842018420284203842048420584206842078420884209842108421184212842138421484215842168421784218842198422084221842228422384224842258422684227842288422984230842318423284233842348423584236842378423884239842408424184242842438424484245842468424784248842498425084251842528425384254842558425684257842588425984260842618426284263842648426584266842678426884269842708427184272842738427484275842768427784278842798428084281842828428384284842858428684287842888428984290842918429284293842948429584296842978429884299843008430184302843038430484305843068430784308843098431084311843128431384314843158431684317843188431984320843218432284323843248432584326843278432884329843308433184332843338433484335843368433784338843398434084341843428434384344843458434684347843488434984350843518435284353843548435584356843578435884359843608436184362843638436484365843668436784368843698437084371843728437384374843758437684377843788437984380843818438284383843848438584386843878438884389843908439184392843938439484395843968439784398843998440084401844028440384404844058440684407844088440984410844118441284413844148441584416844178441884419844208442184422844238442484425844268442784428844298443084431844328443384434844358443684437844388443984440844418444284443844448444584446844478444884449844508445184452844538445484455844568445784458844598446084461844628446384464844658446684467844688446984470844718447284473844748447584476844778447884479844808448184482844838448484485844868448784488844898449084491844928449384494844958449684497844988449984500845018450284503845048450584506845078450884509845108451184512845138451484515845168451784518845198452084521845228452384524845258452684527845288452984530845318453284533845348453584536845378453884539845408454184542845438454484545845468454784548845498455084551845528455384554845558455684557845588455984560845618456284563845648456584566845678456884569845708457184572845738457484575845768457784578845798458084581845828458384584845858458684587845888458984590845918459284593845948459584596845978459884599846008460184602846038460484605846068460784608846098461084611846128461384614846158461684617846188461984620846218462284623846248462584626846278462884629846308463184632846338463484635846368463784638846398464084641846428464384644846458464684647846488464984650846518465284653846548465584656846578465884659846608466184662846638466484665846668466784668846698467084671846728467384674846758467684677846788467984680846818468284683846848468584686846878468884689846908469184692846938469484695846968469784698846998470084701847028470384704847058470684707847088470984710847118471284713847148471584716847178471884719847208472184722847238472484725847268472784728847298473084731847328473384734847358473684737847388473984740847418474284743847448474584746847478474884749847508475184752847538475484755847568475784758847598476084761847628476384764847658476684767847688476984770847718477284773847748477584776847778477884779847808478184782847838478484785847868478784788847898479084791847928479384794847958479684797847988479984800848018480284803848048480584806848078480884809848108481184812848138481484815848168481784818848198482084821848228482384824848258482684827848288482984830848318483284833848348483584836848378483884839848408484184842848438484484845848468484784848848498485084851848528485384854848558485684857848588485984860848618486284863848648486584866848678486884869848708487184872848738487484875848768487784878848798488084881848828488384884848858488684887848888488984890848918489284893848948489584896848978489884899849008490184902849038490484905849068490784908849098491084911849128491384914849158491684917849188491984920849218492284923849248492584926849278492884929849308493184932849338493484935849368493784938849398494084941849428494384944849458494684947849488494984950849518495284953849548495584956849578495884959849608496184962849638496484965849668496784968849698497084971849728497384974849758497684977849788497984980849818498284983849848498584986849878498884989849908499184992849938499484995849968499784998849998500085001850028500385004850058500685007850088500985010850118501285013850148501585016850178501885019850208502185022850238502485025850268502785028850298503085031850328503385034850358503685037850388503985040850418504285043850448504585046850478504885049850508505185052850538505485055850568505785058850598506085061850628506385064850658506685067850688506985070850718507285073850748507585076850778507885079850808508185082850838508485085850868508785088850898509085091850928509385094850958509685097850988509985100851018510285103851048510585106851078510885109851108511185112851138511485115851168511785118851198512085121851228512385124851258512685127851288512985130851318513285133851348513585136851378513885139851408514185142851438514485145851468514785148851498515085151851528515385154851558515685157851588515985160851618516285163851648516585166851678516885169851708517185172851738517485175851768517785178851798518085181851828518385184851858518685187851888518985190851918519285193851948519585196851978519885199852008520185202852038520485205852068520785208852098521085211852128521385214852158521685217852188521985220852218522285223852248522585226852278522885229852308523185232852338523485235852368523785238852398524085241852428524385244852458524685247852488524985250852518525285253852548525585256852578525885259852608526185262852638526485265852668526785268852698527085271852728527385274852758527685277852788527985280852818528285283852848528585286852878528885289852908529185292852938529485295852968529785298852998530085301853028530385304853058530685307853088530985310853118531285313853148531585316853178531885319853208532185322853238532485325853268532785328853298533085331853328533385334853358533685337853388533985340853418534285343853448534585346853478534885349853508535185352853538535485355853568535785358853598536085361853628536385364853658536685367853688536985370853718537285373853748537585376853778537885379853808538185382853838538485385853868538785388853898539085391853928539385394853958539685397853988539985400854018540285403854048540585406854078540885409854108541185412854138541485415854168541785418854198542085421854228542385424854258542685427854288542985430854318543285433854348543585436854378543885439854408544185442854438544485445854468544785448854498545085451854528545385454854558545685457854588545985460854618546285463854648546585466854678546885469854708547185472854738547485475854768547785478854798548085481854828548385484854858548685487854888548985490854918549285493854948549585496854978549885499855008550185502855038550485505855068550785508855098551085511855128551385514855158551685517855188551985520855218552285523855248552585526855278552885529855308553185532855338553485535855368553785538855398554085541855428554385544855458554685547855488554985550855518555285553855548555585556855578555885559855608556185562855638556485565855668556785568855698557085571855728557385574855758557685577855788557985580855818558285583855848558585586855878558885589855908559185592855938559485595855968559785598855998560085601856028560385604856058560685607856088560985610856118561285613856148561585616856178561885619856208562185622856238562485625856268562785628856298563085631856328563385634856358563685637856388563985640856418564285643856448564585646856478564885649856508565185652856538565485655856568565785658856598566085661856628566385664856658566685667856688566985670856718567285673856748567585676856778567885679856808568185682856838568485685856868568785688856898569085691856928569385694856958569685697856988569985700857018570285703857048570585706857078570885709857108571185712857138571485715857168571785718857198572085721857228572385724857258572685727857288572985730857318573285733857348573585736857378573885739857408574185742857438574485745857468574785748857498575085751857528575385754857558575685757857588575985760857618576285763857648576585766857678576885769857708577185772857738577485775857768577785778857798578085781857828578385784857858578685787857888578985790857918579285793857948579585796857978579885799858008580185802858038580485805858068580785808858098581085811858128581385814858158581685817858188581985820858218582285823858248582585826858278582885829858308583185832858338583485835858368583785838858398584085841858428584385844858458584685847858488584985850858518585285853858548585585856858578585885859858608586185862858638586485865858668586785868858698587085871858728587385874858758587685877858788587985880858818588285883858848588585886858878588885889858908589185892858938589485895858968589785898858998590085901859028590385904859058590685907859088590985910859118591285913859148591585916859178591885919859208592185922859238592485925859268592785928859298593085931859328593385934859358593685937859388593985940859418594285943859448594585946859478594885949859508595185952859538595485955859568595785958859598596085961859628596385964859658596685967859688596985970859718597285973859748597585976859778597885979859808598185982859838598485985859868598785988859898599085991859928599385994859958599685997859988599986000860018600286003860048600586006860078600886009860108601186012860138601486015860168601786018860198602086021860228602386024860258602686027860288602986030860318603286033860348603586036860378603886039860408604186042860438604486045860468604786048860498605086051860528605386054860558605686057860588605986060860618606286063860648606586066860678606886069860708607186072860738607486075860768607786078860798608086081860828608386084860858608686087860888608986090860918609286093860948609586096860978609886099861008610186102861038610486105861068610786108861098611086111861128611386114861158611686117861188611986120861218612286123861248612586126861278612886129861308613186132861338613486135861368613786138861398614086141861428614386144861458614686147861488614986150861518615286153861548615586156861578615886159861608616186162861638616486165861668616786168861698617086171861728617386174861758617686177861788617986180861818618286183861848618586186861878618886189861908619186192861938619486195861968619786198861998620086201862028620386204862058620686207862088620986210862118621286213862148621586216862178621886219862208622186222862238622486225862268622786228862298623086231862328623386234862358623686237862388623986240862418624286243862448624586246862478624886249862508625186252862538625486255862568625786258862598626086261862628626386264862658626686267862688626986270862718627286273862748627586276862778627886279862808628186282862838628486285862868628786288862898629086291862928629386294862958629686297862988629986300863018630286303863048630586306863078630886309863108631186312863138631486315863168631786318863198632086321863228632386324863258632686327863288632986330863318633286333863348633586336863378633886339863408634186342863438634486345863468634786348863498635086351863528635386354863558635686357863588635986360863618636286363863648636586366863678636886369863708637186372863738637486375863768637786378863798638086381863828638386384863858638686387863888638986390863918639286393863948639586396863978639886399864008640186402864038640486405864068640786408864098641086411864128641386414864158641686417864188641986420864218642286423864248642586426864278642886429864308643186432864338643486435864368643786438864398644086441864428644386444864458644686447864488644986450864518645286453864548645586456864578645886459864608646186462864638646486465864668646786468864698647086471864728647386474864758647686477864788647986480864818648286483864848648586486864878648886489864908649186492864938649486495864968649786498864998650086501865028650386504865058650686507865088650986510865118651286513865148651586516865178651886519865208652186522865238652486525865268652786528865298653086531865328653386534865358653686537865388653986540865418654286543865448654586546865478654886549865508655186552865538655486555865568655786558865598656086561865628656386564865658656686567865688656986570865718657286573865748657586576865778657886579865808658186582865838658486585865868658786588865898659086591865928659386594865958659686597865988659986600866018660286603866048660586606866078660886609866108661186612866138661486615866168661786618866198662086621866228662386624866258662686627866288662986630866318663286633866348663586636866378663886639866408664186642866438664486645866468664786648866498665086651866528665386654866558665686657866588665986660866618666286663866648666586666866678666886669866708667186672866738667486675866768667786678866798668086681866828668386684866858668686687866888668986690866918669286693866948669586696866978669886699867008670186702867038670486705867068670786708867098671086711867128671386714867158671686717867188671986720867218672286723867248672586726867278672886729867308673186732867338673486735867368673786738867398674086741867428674386744867458674686747867488674986750867518675286753867548675586756867578675886759867608676186762867638676486765867668676786768867698677086771867728677386774867758677686777867788677986780867818678286783867848678586786867878678886789867908679186792867938679486795867968679786798867998680086801868028680386804868058680686807868088680986810868118681286813868148681586816868178681886819868208682186822868238682486825868268682786828868298683086831868328683386834868358683686837868388683986840868418684286843868448684586846868478684886849868508685186852868538685486855868568685786858868598686086861868628686386864868658686686867868688686986870868718687286873868748687586876868778687886879868808688186882868838688486885868868688786888868898689086891868928689386894868958689686897868988689986900869018690286903869048690586906869078690886909869108691186912869138691486915869168691786918869198692086921869228692386924869258692686927869288692986930869318693286933869348693586936869378693886939869408694186942869438694486945869468694786948869498695086951869528695386954869558695686957869588695986960869618696286963869648696586966869678696886969869708697186972869738697486975869768697786978869798698086981869828698386984869858698686987869888698986990869918699286993869948699586996869978699886999870008700187002870038700487005870068700787008870098701087011870128701387014870158701687017870188701987020870218702287023870248702587026870278702887029870308703187032870338703487035870368703787038870398704087041870428704387044870458704687047870488704987050870518705287053870548705587056870578705887059870608706187062870638706487065870668706787068870698707087071870728707387074870758707687077870788707987080870818708287083870848708587086870878708887089870908709187092870938709487095870968709787098870998710087101871028710387104871058710687107871088710987110871118711287113871148711587116871178711887119871208712187122871238712487125871268712787128871298713087131871328713387134871358713687137871388713987140871418714287143871448714587146871478714887149871508715187152871538715487155871568715787158871598716087161871628716387164871658716687167871688716987170871718717287173871748717587176871778717887179871808718187182871838718487185871868718787188871898719087191871928719387194871958719687197871988719987200872018720287203872048720587206872078720887209872108721187212872138721487215872168721787218872198722087221872228722387224872258722687227872288722987230872318723287233872348723587236872378723887239872408724187242872438724487245872468724787248872498725087251872528725387254872558725687257872588725987260872618726287263872648726587266872678726887269872708727187272872738727487275872768727787278872798728087281872828728387284872858728687287872888728987290872918729287293872948729587296872978729887299873008730187302873038730487305873068730787308873098731087311873128731387314873158731687317873188731987320873218732287323873248732587326873278732887329873308733187332873338733487335873368733787338873398734087341873428734387344873458734687347873488734987350873518735287353873548735587356873578735887359873608736187362873638736487365873668736787368873698737087371873728737387374873758737687377873788737987380873818738287383873848738587386873878738887389873908739187392873938739487395873968739787398873998740087401874028740387404874058740687407874088740987410874118741287413874148741587416874178741887419874208742187422874238742487425874268742787428874298743087431874328743387434874358743687437874388743987440874418744287443874448744587446874478744887449874508745187452874538745487455874568745787458874598746087461874628746387464874658746687467874688746987470874718747287473874748747587476874778747887479874808748187482874838748487485874868748787488874898749087491874928749387494874958749687497874988749987500875018750287503875048750587506875078750887509875108751187512875138751487515875168751787518875198752087521875228752387524875258752687527875288752987530875318753287533875348753587536875378753887539875408754187542875438754487545875468754787548875498755087551875528755387554875558755687557875588755987560875618756287563875648756587566875678756887569875708757187572875738757487575875768757787578875798758087581875828758387584875858758687587875888758987590875918759287593875948759587596875978759887599876008760187602876038760487605876068760787608876098761087611876128761387614876158761687617876188761987620876218762287623876248762587626876278762887629876308763187632876338763487635876368763787638876398764087641876428764387644876458764687647876488764987650876518765287653876548765587656876578765887659876608766187662876638766487665876668766787668876698767087671876728767387674876758767687677876788767987680876818768287683876848768587686876878768887689876908769187692876938769487695876968769787698876998770087701877028770387704877058770687707877088770987710877118771287713877148771587716877178771887719877208772187722877238772487725877268772787728877298773087731877328773387734877358773687737877388773987740877418774287743877448774587746877478774887749877508775187752877538775487755877568775787758877598776087761877628776387764877658776687767877688776987770877718777287773877748777587776877778777887779877808778187782877838778487785877868778787788877898779087791877928779387794877958779687797877988779987800878018780287803878048780587806878078780887809878108781187812878138781487815878168781787818878198782087821878228782387824878258782687827878288782987830878318783287833878348783587836878378783887839878408784187842878438784487845878468784787848878498785087851878528785387854878558785687857878588785987860878618786287863878648786587866878678786887869878708787187872878738787487875878768787787878878798788087881878828788387884878858788687887878888788987890878918789287893878948789587896878978789887899879008790187902879038790487905879068790787908879098791087911879128791387914879158791687917879188791987920879218792287923879248792587926879278792887929879308793187932879338793487935879368793787938879398794087941879428794387944879458794687947879488794987950879518795287953879548795587956879578795887959879608796187962879638796487965879668796787968879698797087971879728797387974879758797687977879788797987980879818798287983879848798587986879878798887989879908799187992879938799487995879968799787998879998800088001880028800388004880058800688007880088800988010880118801288013880148801588016880178801888019880208802188022880238802488025880268802788028880298803088031880328803388034880358803688037880388803988040880418804288043880448804588046880478804888049880508805188052880538805488055880568805788058880598806088061880628806388064880658806688067880688806988070880718807288073880748807588076880778807888079880808808188082880838808488085880868808788088880898809088091880928809388094880958809688097880988809988100881018810288103881048810588106881078810888109881108811188112881138811488115881168811788118881198812088121881228812388124881258812688127881288812988130881318813288133881348813588136881378813888139881408814188142881438814488145881468814788148881498815088151881528815388154881558815688157881588815988160881618816288163881648816588166881678816888169881708817188172881738817488175881768817788178881798818088181881828818388184881858818688187881888818988190881918819288193881948819588196881978819888199882008820188202882038820488205882068820788208882098821088211882128821388214882158821688217882188821988220882218822288223882248822588226882278822888229882308823188232882338823488235882368823788238882398824088241882428824388244882458824688247882488824988250882518825288253882548825588256882578825888259882608826188262882638826488265882668826788268882698827088271882728827388274882758827688277882788827988280882818828288283882848828588286882878828888289882908829188292882938829488295882968829788298882998830088301883028830388304883058830688307883088830988310883118831288313883148831588316883178831888319883208832188322883238832488325883268832788328883298833088331883328833388334883358833688337883388833988340883418834288343883448834588346883478834888349883508835188352883538835488355883568835788358883598836088361883628836388364883658836688367883688836988370883718837288373883748837588376883778837888379883808838188382883838838488385883868838788388883898839088391883928839388394883958839688397883988839988400884018840288403884048840588406884078840888409884108841188412884138841488415884168841788418884198842088421884228842388424884258842688427884288842988430884318843288433884348843588436884378843888439884408844188442884438844488445884468844788448884498845088451884528845388454884558845688457884588845988460884618846288463884648846588466884678846888469884708847188472884738847488475884768847788478884798848088481884828848388484884858848688487884888848988490884918849288493884948849588496884978849888499885008850188502885038850488505885068850788508885098851088511885128851388514885158851688517885188851988520885218852288523885248852588526885278852888529885308853188532885338853488535885368853788538885398854088541885428854388544885458854688547885488854988550885518855288553885548855588556885578855888559885608856188562885638856488565885668856788568885698857088571885728857388574885758857688577885788857988580885818858288583885848858588586885878858888589885908859188592885938859488595885968859788598885998860088601886028860388604886058860688607886088860988610886118861288613886148861588616886178861888619886208862188622886238862488625886268862788628886298863088631886328863388634886358863688637886388863988640886418864288643886448864588646886478864888649886508865188652886538865488655886568865788658886598866088661886628866388664886658866688667886688866988670886718867288673886748867588676886778867888679886808868188682886838868488685886868868788688886898869088691886928869388694886958869688697886988869988700887018870288703887048870588706887078870888709887108871188712887138871488715887168871788718887198872088721887228872388724887258872688727887288872988730887318873288733887348873588736887378873888739887408874188742887438874488745887468874788748887498875088751887528875388754887558875688757887588875988760887618876288763887648876588766887678876888769887708877188772887738877488775887768877788778887798878088781887828878388784887858878688787887888878988790887918879288793887948879588796887978879888799888008880188802888038880488805888068880788808888098881088811888128881388814888158881688817888188881988820888218882288823888248882588826888278882888829888308883188832888338883488835888368883788838888398884088841888428884388844888458884688847888488884988850888518885288853888548885588856888578885888859888608886188862888638886488865888668886788868888698887088871888728887388874888758887688877888788887988880888818888288883888848888588886888878888888889888908889188892888938889488895888968889788898888998890088901889028890388904889058890688907889088890988910889118891288913889148891588916889178891888919889208892188922889238892488925889268892788928889298893088931889328893388934889358893688937889388893988940889418894288943889448894588946889478894888949889508895188952889538895488955889568895788958889598896088961889628896388964889658896688967889688896988970889718897288973889748897588976889778897888979889808898188982889838898488985889868898788988889898899088991889928899388994889958899688997889988899989000890018900289003890048900589006890078900889009890108901189012890138901489015890168901789018890198902089021890228902389024890258902689027890288902989030890318903289033890348903589036890378903889039890408904189042890438904489045890468904789048890498905089051890528905389054890558905689057890588905989060890618906289063890648906589066890678906889069890708907189072890738907489075890768907789078890798908089081890828908389084890858908689087890888908989090890918909289093890948909589096890978909889099891008910189102891038910489105891068910789108891098911089111891128911389114891158911689117891188911989120891218912289123891248912589126891278912889129891308913189132891338913489135891368913789138891398914089141891428914389144891458914689147891488914989150891518915289153891548915589156891578915889159891608916189162891638916489165891668916789168891698917089171891728917389174891758917689177891788917989180891818918289183891848918589186891878918889189891908919189192891938919489195891968919789198891998920089201892028920389204892058920689207892088920989210892118921289213892148921589216892178921889219892208922189222892238922489225892268922789228892298923089231892328923389234892358923689237892388923989240892418924289243892448924589246892478924889249892508925189252892538925489255892568925789258892598926089261892628926389264892658926689267892688926989270892718927289273892748927589276892778927889279892808928189282892838928489285892868928789288892898929089291892928929389294892958929689297892988929989300893018930289303893048930589306893078930889309893108931189312893138931489315893168931789318893198932089321893228932389324893258932689327893288932989330893318933289333893348933589336893378933889339893408934189342893438934489345893468934789348893498935089351893528935389354893558935689357893588935989360893618936289363893648936589366893678936889369893708937189372893738937489375893768937789378893798938089381893828938389384893858938689387893888938989390893918939289393893948939589396893978939889399894008940189402894038940489405894068940789408894098941089411894128941389414894158941689417894188941989420894218942289423894248942589426894278942889429894308943189432894338943489435894368943789438894398944089441894428944389444894458944689447894488944989450894518945289453894548945589456894578945889459894608946189462894638946489465894668946789468894698947089471894728947389474894758947689477894788947989480894818948289483894848948589486894878948889489894908949189492894938949489495894968949789498894998950089501895028950389504895058950689507895088950989510895118951289513895148951589516895178951889519895208952189522895238952489525895268952789528895298953089531895328953389534895358953689537895388953989540895418954289543895448954589546895478954889549895508955189552895538955489555895568955789558895598956089561895628956389564895658956689567895688956989570895718957289573895748957589576895778957889579895808958189582895838958489585895868958789588895898959089591895928959389594895958959689597895988959989600896018960289603896048960589606896078960889609896108961189612896138961489615896168961789618896198962089621896228962389624896258962689627896288962989630896318963289633896348963589636896378963889639896408964189642896438964489645896468964789648896498965089651896528965389654896558965689657896588965989660896618966289663896648966589666896678966889669896708967189672896738967489675896768967789678896798968089681896828968389684896858968689687896888968989690896918969289693896948969589696896978969889699897008970189702897038970489705897068970789708897098971089711897128971389714897158971689717897188971989720897218972289723897248972589726897278972889729897308973189732897338973489735897368973789738897398974089741897428974389744897458974689747897488974989750897518975289753897548975589756897578975889759897608976189762897638976489765897668976789768897698977089771897728977389774897758977689777897788977989780897818978289783897848978589786897878978889789897908979189792897938979489795897968979789798897998980089801898028980389804898058980689807898088980989810898118981289813898148981589816898178981889819898208982189822898238982489825898268982789828898298983089831898328983389834898358983689837898388983989840898418984289843898448984589846898478984889849898508985189852898538985489855898568985789858898598986089861898628986389864898658986689867898688986989870898718987289873898748987589876898778987889879898808988189882898838988489885898868988789888898898989089891898928989389894898958989689897898988989989900899018990289903899048990589906899078990889909899108991189912899138991489915899168991789918899198992089921899228992389924899258992689927899288992989930899318993289933899348993589936899378993889939899408994189942899438994489945899468994789948899498995089951899528995389954899558995689957899588995989960899618996289963899648996589966899678996889969899708997189972899738997489975899768997789978899798998089981899828998389984899858998689987899888998989990899918999289993899948999589996899978999889999900009000190002900039000490005900069000790008900099001090011900129001390014900159001690017900189001990020900219002290023900249002590026900279002890029900309003190032900339003490035900369003790038900399004090041900429004390044900459004690047900489004990050900519005290053900549005590056900579005890059900609006190062900639006490065900669006790068900699007090071900729007390074900759007690077900789007990080900819008290083900849008590086900879008890089900909009190092900939009490095900969009790098900999010090101901029010390104901059010690107901089010990110901119011290113901149011590116901179011890119901209012190122901239012490125901269012790128901299013090131901329013390134901359013690137901389013990140901419014290143901449014590146901479014890149901509015190152901539015490155901569015790158901599016090161901629016390164901659016690167901689016990170901719017290173901749017590176901779017890179901809018190182901839018490185901869018790188901899019090191901929019390194901959019690197901989019990200902019020290203902049020590206902079020890209902109021190212902139021490215902169021790218902199022090221902229022390224902259022690227902289022990230902319023290233902349023590236902379023890239902409024190242902439024490245902469024790248902499025090251902529025390254902559025690257902589025990260902619026290263902649026590266902679026890269902709027190272902739027490275902769027790278902799028090281902829028390284902859028690287902889028990290902919029290293902949029590296902979029890299903009030190302903039030490305903069030790308903099031090311903129031390314903159031690317903189031990320903219032290323903249032590326903279032890329903309033190332903339033490335903369033790338903399034090341903429034390344903459034690347903489034990350903519035290353903549035590356903579035890359903609036190362903639036490365903669036790368903699037090371903729037390374903759037690377903789037990380903819038290383903849038590386903879038890389903909039190392903939039490395903969039790398903999040090401904029040390404904059040690407904089040990410904119041290413904149041590416904179041890419904209042190422904239042490425904269042790428904299043090431904329043390434904359043690437904389043990440904419044290443904449044590446904479044890449904509045190452904539045490455904569045790458904599046090461904629046390464904659046690467904689046990470904719047290473904749047590476904779047890479904809048190482904839048490485904869048790488904899049090491904929049390494904959049690497904989049990500905019050290503905049050590506905079050890509905109051190512905139051490515905169051790518905199052090521905229052390524905259052690527905289052990530905319053290533905349053590536905379053890539905409054190542905439054490545905469054790548905499055090551905529055390554905559055690557905589055990560905619056290563905649056590566905679056890569905709057190572905739057490575905769057790578905799058090581905829058390584905859058690587905889058990590905919059290593905949059590596905979059890599906009060190602906039060490605906069060790608906099061090611906129061390614906159061690617906189061990620906219062290623906249062590626906279062890629906309063190632906339063490635906369063790638906399064090641906429064390644906459064690647906489064990650906519065290653906549065590656906579065890659906609066190662906639066490665906669066790668906699067090671906729067390674906759067690677906789067990680906819068290683906849068590686906879068890689906909069190692906939069490695906969069790698906999070090701907029070390704907059070690707907089070990710907119071290713907149071590716907179071890719907209072190722907239072490725907269072790728907299073090731907329073390734907359073690737907389073990740907419074290743907449074590746907479074890749907509075190752907539075490755907569075790758907599076090761907629076390764907659076690767907689076990770907719077290773907749077590776907779077890779907809078190782907839078490785907869078790788907899079090791907929079390794907959079690797907989079990800908019080290803908049080590806908079080890809908109081190812908139081490815908169081790818908199082090821908229082390824908259082690827908289082990830908319083290833908349083590836908379083890839908409084190842908439084490845908469084790848908499085090851908529085390854908559085690857908589085990860908619086290863908649086590866908679086890869908709087190872908739087490875908769087790878908799088090881908829088390884908859088690887908889088990890908919089290893908949089590896908979089890899909009090190902909039090490905909069090790908909099091090911909129091390914909159091690917909189091990920909219092290923909249092590926909279092890929909309093190932909339093490935909369093790938909399094090941909429094390944909459094690947909489094990950909519095290953909549095590956909579095890959909609096190962909639096490965909669096790968909699097090971909729097390974909759097690977909789097990980909819098290983909849098590986909879098890989909909099190992909939099490995909969099790998909999100091001910029100391004910059100691007910089100991010
  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 .hw_rev 00000010 080201f0 080201f0 000081f0 2**0
  7. CONTENTS, ALLOC, LOAD, DATA
  8. 2 .text 000250cc 08020200 08020200 00008200 2**3
  9. CONTENTS, ALLOC, LOAD, READONLY, CODE
  10. 3 .ARM 00000008 080452cc 080452cc 0002d2cc 2**2
  11. CONTENTS, ALLOC, LOAD, READONLY, DATA
  12. 4 .init_array 00000004 080452d4 080452d4 0002d2d4 2**2
  13. CONTENTS, ALLOC, LOAD, DATA
  14. 5 .fini_array 00000004 080452d8 080452d8 0002d2d8 2**2
  15. CONTENTS, ALLOC, LOAD, DATA
  16. 6 .data 00000ac4 20000000 080452dc 00030000 2**2
  17. CONTENTS, ALLOC, LOAD, DATA
  18. 7 .fill 0003a25c 08045da0 08045da0 00035da0 2**0
  19. CONTENTS, ALLOC, LOAD, DATA
  20. 8 .crc 00000004 0807fffc 0807fffc 0006fffc 2**2
  21. CONTENTS, ALLOC, LOAD, DATA
  22. 9 .bss 000136ec 20000ac4 08045da0 00070ac4 2**2
  23. ALLOC
  24. 10 ._user_heap_stack 00000200 200141b0 0805948c 00070ac4 2**0
  25. ALLOC
  26. 11 .memory_b1_text 0000f000 10000000 10000000 00070000 2**0
  27. ALLOC
  28. 12 .ARM.attributes 0000002f 00000000 00000000 00070000 2**0
  29. CONTENTS, READONLY
  30. 13 .debug_info 00050efc 00000000 00000000 0007002f 2**0
  31. CONTENTS, READONLY, DEBUGGING
  32. 14 .debug_abbrev 0000cd1f 00000000 00000000 000c0f2b 2**0
  33. CONTENTS, READONLY, DEBUGGING
  34. 15 .debug_loc 000263bd 00000000 00000000 000cdc4a 2**0
  35. CONTENTS, READONLY, DEBUGGING
  36. 16 .debug_aranges 00003168 00000000 00000000 000f4008 2**3
  37. CONTENTS, READONLY, DEBUGGING
  38. 17 .debug_ranges 00003a68 00000000 00000000 000f7170 2**3
  39. CONTENTS, READONLY, DEBUGGING
  40. 18 .debug_macro 000214c9 00000000 00000000 000fabd8 2**0
  41. CONTENTS, READONLY, DEBUGGING
  42. 19 .debug_line 0002718a 00000000 00000000 0011c0a1 2**0
  43. CONTENTS, READONLY, DEBUGGING
  44. 20 .debug_str 000821ec 00000000 00000000 0014322b 2**0
  45. CONTENTS, READONLY, DEBUGGING
  46. 21 .comment 00000030 00000000 00000000 001c5417 2**0
  47. CONTENTS, READONLY
  48. 22 .debug_frame 00008534 00000000 00000000 001c5448 2**2
  49. CONTENTS, READONLY, DEBUGGING
  50. Disassembly of section .text:
  51. 08020200 <deregister_tm_clones>:
  52. 8020200: b508 push {r3, lr}
  53. 8020202: f640 20c4 movw r0, #2756 ; 0xac4
  54. 8020206: 4b07 ldr r3, [pc, #28] ; (8020224 <deregister_tm_clones+0x24>)
  55. 8020208: f2c2 0000 movt r0, #8192 ; 0x2000
  56. 802020c: 1a1b subs r3, r3, r0
  57. 802020e: 2b06 cmp r3, #6
  58. 8020210: d800 bhi.n 8020214 <deregister_tm_clones+0x14>
  59. 8020212: bd08 pop {r3, pc}
  60. 8020214: f240 0300 movw r3, #0
  61. 8020218: f2c0 0300 movt r3, #0
  62. 802021c: 2b00 cmp r3, #0
  63. 802021e: d0f8 beq.n 8020212 <deregister_tm_clones+0x12>
  64. 8020220: 4798 blx r3
  65. 8020222: e7f6 b.n 8020212 <deregister_tm_clones+0x12>
  66. 8020224: 20000ac7 .word 0x20000ac7
  67. 08020228 <register_tm_clones>:
  68. 8020228: b508 push {r3, lr}
  69. 802022a: f640 20c4 movw r0, #2756 ; 0xac4
  70. 802022e: f640 23c4 movw r3, #2756 ; 0xac4
  71. 8020232: f2c2 0000 movt r0, #8192 ; 0x2000
  72. 8020236: f2c2 0300 movt r3, #8192 ; 0x2000
  73. 802023a: 1a1b subs r3, r3, r0
  74. 802023c: 109b asrs r3, r3, #2
  75. 802023e: eb03 73d3 add.w r3, r3, r3, lsr #31
  76. 8020242: 1059 asrs r1, r3, #1
  77. 8020244: d100 bne.n 8020248 <register_tm_clones+0x20>
  78. 8020246: bd08 pop {r3, pc}
  79. 8020248: f240 0200 movw r2, #0
  80. 802024c: f2c0 0200 movt r2, #0
  81. 8020250: 2a00 cmp r2, #0
  82. 8020252: d0f8 beq.n 8020246 <register_tm_clones+0x1e>
  83. 8020254: 4790 blx r2
  84. 8020256: e7f6 b.n 8020246 <register_tm_clones+0x1e>
  85. 08020258 <__do_global_dtors_aux>:
  86. 8020258: b510 push {r4, lr}
  87. 802025a: f640 24c4 movw r4, #2756 ; 0xac4
  88. 802025e: f2c2 0400 movt r4, #8192 ; 0x2000
  89. 8020262: 7823 ldrb r3, [r4, #0]
  90. 8020264: b973 cbnz r3, 8020284 <__do_global_dtors_aux+0x2c>
  91. 8020266: f7ff ffcb bl 8020200 <deregister_tm_clones>
  92. 802026a: f240 0300 movw r3, #0
  93. 802026e: f2c0 0300 movt r3, #0
  94. 8020272: b12b cbz r3, 8020280 <__do_global_dtors_aux+0x28>
  95. 8020274: f245 20b4 movw r0, #21172 ; 0x52b4
  96. 8020278: f6c0 0004 movt r0, #2052 ; 0x804
  97. 802027c: f3af 8000 nop.w
  98. 8020280: 2301 movs r3, #1
  99. 8020282: 7023 strb r3, [r4, #0]
  100. 8020284: bd10 pop {r4, pc}
  101. 8020286: bf00 nop
  102. 08020288 <frame_dummy>:
  103. 8020288: b508 push {r3, lr}
  104. 802028a: f240 0300 movw r3, #0
  105. 802028e: f2c0 0300 movt r3, #0
  106. 8020292: b14b cbz r3, 80202a8 <frame_dummy+0x20>
  107. 8020294: f245 20b4 movw r0, #21172 ; 0x52b4
  108. 8020298: f640 21c8 movw r1, #2760 ; 0xac8
  109. 802029c: f6c0 0004 movt r0, #2052 ; 0x804
  110. 80202a0: f2c2 0100 movt r1, #8192 ; 0x2000
  111. 80202a4: f3af 8000 nop.w
  112. 80202a8: f640 20c4 movw r0, #2756 ; 0xac4
  113. 80202ac: f2c2 0000 movt r0, #8192 ; 0x2000
  114. 80202b0: 6803 ldr r3, [r0, #0]
  115. 80202b2: b12b cbz r3, 80202c0 <frame_dummy+0x38>
  116. 80202b4: f240 0300 movw r3, #0
  117. 80202b8: f2c0 0300 movt r3, #0
  118. 80202bc: b103 cbz r3, 80202c0 <frame_dummy+0x38>
  119. 80202be: 4798 blx r3
  120. 80202c0: e8bd 4008 ldmia.w sp!, {r3, lr}
  121. 80202c4: f7ff bfb0 b.w 8020228 <register_tm_clones>
  122. 080202c8 <__aeabi_drsub>:
  123. 80202c8: f081 4100 eor.w r1, r1, #2147483648 ; 0x80000000
  124. 80202cc: e002 b.n 80202d4 <__adddf3>
  125. 80202ce: bf00 nop
  126. 080202d0 <__aeabi_dsub>:
  127. 80202d0: f083 4300 eor.w r3, r3, #2147483648 ; 0x80000000
  128. 080202d4 <__adddf3>:
  129. 80202d4: b530 push {r4, r5, lr}
  130. 80202d6: ea4f 0441 mov.w r4, r1, lsl #1
  131. 80202da: ea4f 0543 mov.w r5, r3, lsl #1
  132. 80202de: ea94 0f05 teq r4, r5
  133. 80202e2: bf08 it eq
  134. 80202e4: ea90 0f02 teqeq r0, r2
  135. 80202e8: bf1f itttt ne
  136. 80202ea: ea54 0c00 orrsne.w ip, r4, r0
  137. 80202ee: ea55 0c02 orrsne.w ip, r5, r2
  138. 80202f2: ea7f 5c64 mvnsne.w ip, r4, asr #21
  139. 80202f6: ea7f 5c65 mvnsne.w ip, r5, asr #21
  140. 80202fa: f000 80e2 beq.w 80204c2 <__adddf3+0x1ee>
  141. 80202fe: ea4f 5454 mov.w r4, r4, lsr #21
  142. 8020302: ebd4 5555 rsbs r5, r4, r5, lsr #21
  143. 8020306: bfb8 it lt
  144. 8020308: 426d neglt r5, r5
  145. 802030a: dd0c ble.n 8020326 <__adddf3+0x52>
  146. 802030c: 442c add r4, r5
  147. 802030e: ea80 0202 eor.w r2, r0, r2
  148. 8020312: ea81 0303 eor.w r3, r1, r3
  149. 8020316: ea82 0000 eor.w r0, r2, r0
  150. 802031a: ea83 0101 eor.w r1, r3, r1
  151. 802031e: ea80 0202 eor.w r2, r0, r2
  152. 8020322: ea81 0303 eor.w r3, r1, r3
  153. 8020326: 2d36 cmp r5, #54 ; 0x36
  154. 8020328: bf88 it hi
  155. 802032a: bd30 pophi {r4, r5, pc}
  156. 802032c: f011 4f00 tst.w r1, #2147483648 ; 0x80000000
  157. 8020330: ea4f 3101 mov.w r1, r1, lsl #12
  158. 8020334: f44f 1c80 mov.w ip, #1048576 ; 0x100000
  159. 8020338: ea4c 3111 orr.w r1, ip, r1, lsr #12
  160. 802033c: d002 beq.n 8020344 <__adddf3+0x70>
  161. 802033e: 4240 negs r0, r0
  162. 8020340: eb61 0141 sbc.w r1, r1, r1, lsl #1
  163. 8020344: f013 4f00 tst.w r3, #2147483648 ; 0x80000000
  164. 8020348: ea4f 3303 mov.w r3, r3, lsl #12
  165. 802034c: ea4c 3313 orr.w r3, ip, r3, lsr #12
  166. 8020350: d002 beq.n 8020358 <__adddf3+0x84>
  167. 8020352: 4252 negs r2, r2
  168. 8020354: eb63 0343 sbc.w r3, r3, r3, lsl #1
  169. 8020358: ea94 0f05 teq r4, r5
  170. 802035c: f000 80a7 beq.w 80204ae <__adddf3+0x1da>
  171. 8020360: f1a4 0401 sub.w r4, r4, #1
  172. 8020364: f1d5 0e20 rsbs lr, r5, #32
  173. 8020368: db0d blt.n 8020386 <__adddf3+0xb2>
  174. 802036a: fa02 fc0e lsl.w ip, r2, lr
  175. 802036e: fa22 f205 lsr.w r2, r2, r5
  176. 8020372: 1880 adds r0, r0, r2
  177. 8020374: f141 0100 adc.w r1, r1, #0
  178. 8020378: fa03 f20e lsl.w r2, r3, lr
  179. 802037c: 1880 adds r0, r0, r2
  180. 802037e: fa43 f305 asr.w r3, r3, r5
  181. 8020382: 4159 adcs r1, r3
  182. 8020384: e00e b.n 80203a4 <__adddf3+0xd0>
  183. 8020386: f1a5 0520 sub.w r5, r5, #32
  184. 802038a: f10e 0e20 add.w lr, lr, #32
  185. 802038e: 2a01 cmp r2, #1
  186. 8020390: fa03 fc0e lsl.w ip, r3, lr
  187. 8020394: bf28 it cs
  188. 8020396: f04c 0c02 orrcs.w ip, ip, #2
  189. 802039a: fa43 f305 asr.w r3, r3, r5
  190. 802039e: 18c0 adds r0, r0, r3
  191. 80203a0: eb51 71e3 adcs.w r1, r1, r3, asr #31
  192. 80203a4: f001 4500 and.w r5, r1, #2147483648 ; 0x80000000
  193. 80203a8: d507 bpl.n 80203ba <__adddf3+0xe6>
  194. 80203aa: f04f 0e00 mov.w lr, #0
  195. 80203ae: f1dc 0c00 rsbs ip, ip, #0
  196. 80203b2: eb7e 0000 sbcs.w r0, lr, r0
  197. 80203b6: eb6e 0101 sbc.w r1, lr, r1
  198. 80203ba: f5b1 1f80 cmp.w r1, #1048576 ; 0x100000
  199. 80203be: d31b bcc.n 80203f8 <__adddf3+0x124>
  200. 80203c0: f5b1 1f00 cmp.w r1, #2097152 ; 0x200000
  201. 80203c4: d30c bcc.n 80203e0 <__adddf3+0x10c>
  202. 80203c6: 0849 lsrs r1, r1, #1
  203. 80203c8: ea5f 0030 movs.w r0, r0, rrx
  204. 80203cc: ea4f 0c3c mov.w ip, ip, rrx
  205. 80203d0: f104 0401 add.w r4, r4, #1
  206. 80203d4: ea4f 5244 mov.w r2, r4, lsl #21
  207. 80203d8: f512 0f80 cmn.w r2, #4194304 ; 0x400000
  208. 80203dc: f080 809a bcs.w 8020514 <__adddf3+0x240>
  209. 80203e0: f1bc 4f00 cmp.w ip, #2147483648 ; 0x80000000
  210. 80203e4: bf08 it eq
  211. 80203e6: ea5f 0c50 movseq.w ip, r0, lsr #1
  212. 80203ea: f150 0000 adcs.w r0, r0, #0
  213. 80203ee: eb41 5104 adc.w r1, r1, r4, lsl #20
  214. 80203f2: ea41 0105 orr.w r1, r1, r5
  215. 80203f6: bd30 pop {r4, r5, pc}
  216. 80203f8: ea5f 0c4c movs.w ip, ip, lsl #1
  217. 80203fc: 4140 adcs r0, r0
  218. 80203fe: eb41 0101 adc.w r1, r1, r1
  219. 8020402: f411 1f80 tst.w r1, #1048576 ; 0x100000
  220. 8020406: f1a4 0401 sub.w r4, r4, #1
  221. 802040a: d1e9 bne.n 80203e0 <__adddf3+0x10c>
  222. 802040c: f091 0f00 teq r1, #0
  223. 8020410: bf04 itt eq
  224. 8020412: 4601 moveq r1, r0
  225. 8020414: 2000 moveq r0, #0
  226. 8020416: fab1 f381 clz r3, r1
  227. 802041a: bf08 it eq
  228. 802041c: 3320 addeq r3, #32
  229. 802041e: f1a3 030b sub.w r3, r3, #11
  230. 8020422: f1b3 0220 subs.w r2, r3, #32
  231. 8020426: da0c bge.n 8020442 <__adddf3+0x16e>
  232. 8020428: 320c adds r2, #12
  233. 802042a: dd08 ble.n 802043e <__adddf3+0x16a>
  234. 802042c: f102 0c14 add.w ip, r2, #20
  235. 8020430: f1c2 020c rsb r2, r2, #12
  236. 8020434: fa01 f00c lsl.w r0, r1, ip
  237. 8020438: fa21 f102 lsr.w r1, r1, r2
  238. 802043c: e00c b.n 8020458 <__adddf3+0x184>
  239. 802043e: f102 0214 add.w r2, r2, #20
  240. 8020442: bfd8 it le
  241. 8020444: f1c2 0c20 rsble ip, r2, #32
  242. 8020448: fa01 f102 lsl.w r1, r1, r2
  243. 802044c: fa20 fc0c lsr.w ip, r0, ip
  244. 8020450: bfdc itt le
  245. 8020452: ea41 010c orrle.w r1, r1, ip
  246. 8020456: 4090 lslle r0, r2
  247. 8020458: 1ae4 subs r4, r4, r3
  248. 802045a: bfa2 ittt ge
  249. 802045c: eb01 5104 addge.w r1, r1, r4, lsl #20
  250. 8020460: 4329 orrge r1, r5
  251. 8020462: bd30 popge {r4, r5, pc}
  252. 8020464: ea6f 0404 mvn.w r4, r4
  253. 8020468: 3c1f subs r4, #31
  254. 802046a: da1c bge.n 80204a6 <__adddf3+0x1d2>
  255. 802046c: 340c adds r4, #12
  256. 802046e: dc0e bgt.n 802048e <__adddf3+0x1ba>
  257. 8020470: f104 0414 add.w r4, r4, #20
  258. 8020474: f1c4 0220 rsb r2, r4, #32
  259. 8020478: fa20 f004 lsr.w r0, r0, r4
  260. 802047c: fa01 f302 lsl.w r3, r1, r2
  261. 8020480: ea40 0003 orr.w r0, r0, r3
  262. 8020484: fa21 f304 lsr.w r3, r1, r4
  263. 8020488: ea45 0103 orr.w r1, r5, r3
  264. 802048c: bd30 pop {r4, r5, pc}
  265. 802048e: f1c4 040c rsb r4, r4, #12
  266. 8020492: f1c4 0220 rsb r2, r4, #32
  267. 8020496: fa20 f002 lsr.w r0, r0, r2
  268. 802049a: fa01 f304 lsl.w r3, r1, r4
  269. 802049e: ea40 0003 orr.w r0, r0, r3
  270. 80204a2: 4629 mov r1, r5
  271. 80204a4: bd30 pop {r4, r5, pc}
  272. 80204a6: fa21 f004 lsr.w r0, r1, r4
  273. 80204aa: 4629 mov r1, r5
  274. 80204ac: bd30 pop {r4, r5, pc}
  275. 80204ae: f094 0f00 teq r4, #0
  276. 80204b2: f483 1380 eor.w r3, r3, #1048576 ; 0x100000
  277. 80204b6: bf06 itte eq
  278. 80204b8: f481 1180 eoreq.w r1, r1, #1048576 ; 0x100000
  279. 80204bc: 3401 addeq r4, #1
  280. 80204be: 3d01 subne r5, #1
  281. 80204c0: e74e b.n 8020360 <__adddf3+0x8c>
  282. 80204c2: ea7f 5c64 mvns.w ip, r4, asr #21
  283. 80204c6: bf18 it ne
  284. 80204c8: ea7f 5c65 mvnsne.w ip, r5, asr #21
  285. 80204cc: d029 beq.n 8020522 <__adddf3+0x24e>
  286. 80204ce: ea94 0f05 teq r4, r5
  287. 80204d2: bf08 it eq
  288. 80204d4: ea90 0f02 teqeq r0, r2
  289. 80204d8: d005 beq.n 80204e6 <__adddf3+0x212>
  290. 80204da: ea54 0c00 orrs.w ip, r4, r0
  291. 80204de: bf04 itt eq
  292. 80204e0: 4619 moveq r1, r3
  293. 80204e2: 4610 moveq r0, r2
  294. 80204e4: bd30 pop {r4, r5, pc}
  295. 80204e6: ea91 0f03 teq r1, r3
  296. 80204ea: bf1e ittt ne
  297. 80204ec: 2100 movne r1, #0
  298. 80204ee: 2000 movne r0, #0
  299. 80204f0: bd30 popne {r4, r5, pc}
  300. 80204f2: ea5f 5c54 movs.w ip, r4, lsr #21
  301. 80204f6: d105 bne.n 8020504 <__adddf3+0x230>
  302. 80204f8: 0040 lsls r0, r0, #1
  303. 80204fa: 4149 adcs r1, r1
  304. 80204fc: bf28 it cs
  305. 80204fe: f041 4100 orrcs.w r1, r1, #2147483648 ; 0x80000000
  306. 8020502: bd30 pop {r4, r5, pc}
  307. 8020504: f514 0480 adds.w r4, r4, #4194304 ; 0x400000
  308. 8020508: bf3c itt cc
  309. 802050a: f501 1180 addcc.w r1, r1, #1048576 ; 0x100000
  310. 802050e: bd30 popcc {r4, r5, pc}
  311. 8020510: f001 4500 and.w r5, r1, #2147483648 ; 0x80000000
  312. 8020514: f045 41fe orr.w r1, r5, #2130706432 ; 0x7f000000
  313. 8020518: f441 0170 orr.w r1, r1, #15728640 ; 0xf00000
  314. 802051c: f04f 0000 mov.w r0, #0
  315. 8020520: bd30 pop {r4, r5, pc}
  316. 8020522: ea7f 5c64 mvns.w ip, r4, asr #21
  317. 8020526: bf1a itte ne
  318. 8020528: 4619 movne r1, r3
  319. 802052a: 4610 movne r0, r2
  320. 802052c: ea7f 5c65 mvnseq.w ip, r5, asr #21
  321. 8020530: bf1c itt ne
  322. 8020532: 460b movne r3, r1
  323. 8020534: 4602 movne r2, r0
  324. 8020536: ea50 3401 orrs.w r4, r0, r1, lsl #12
  325. 802053a: bf06 itte eq
  326. 802053c: ea52 3503 orrseq.w r5, r2, r3, lsl #12
  327. 8020540: ea91 0f03 teqeq r1, r3
  328. 8020544: f441 2100 orrne.w r1, r1, #524288 ; 0x80000
  329. 8020548: bd30 pop {r4, r5, pc}
  330. 802054a: bf00 nop
  331. 0802054c <__aeabi_ui2d>:
  332. 802054c: f090 0f00 teq r0, #0
  333. 8020550: bf04 itt eq
  334. 8020552: 2100 moveq r1, #0
  335. 8020554: 4770 bxeq lr
  336. 8020556: b530 push {r4, r5, lr}
  337. 8020558: f44f 6480 mov.w r4, #1024 ; 0x400
  338. 802055c: f104 0432 add.w r4, r4, #50 ; 0x32
  339. 8020560: f04f 0500 mov.w r5, #0
  340. 8020564: f04f 0100 mov.w r1, #0
  341. 8020568: e750 b.n 802040c <__adddf3+0x138>
  342. 802056a: bf00 nop
  343. 0802056c <__aeabi_i2d>:
  344. 802056c: f090 0f00 teq r0, #0
  345. 8020570: bf04 itt eq
  346. 8020572: 2100 moveq r1, #0
  347. 8020574: 4770 bxeq lr
  348. 8020576: b530 push {r4, r5, lr}
  349. 8020578: f44f 6480 mov.w r4, #1024 ; 0x400
  350. 802057c: f104 0432 add.w r4, r4, #50 ; 0x32
  351. 8020580: f010 4500 ands.w r5, r0, #2147483648 ; 0x80000000
  352. 8020584: bf48 it mi
  353. 8020586: 4240 negmi r0, r0
  354. 8020588: f04f 0100 mov.w r1, #0
  355. 802058c: e73e b.n 802040c <__adddf3+0x138>
  356. 802058e: bf00 nop
  357. 08020590 <__aeabi_f2d>:
  358. 8020590: 0042 lsls r2, r0, #1
  359. 8020592: ea4f 01e2 mov.w r1, r2, asr #3
  360. 8020596: ea4f 0131 mov.w r1, r1, rrx
  361. 802059a: ea4f 7002 mov.w r0, r2, lsl #28
  362. 802059e: bf1f itttt ne
  363. 80205a0: f012 437f andsne.w r3, r2, #4278190080 ; 0xff000000
  364. 80205a4: f093 4f7f teqne r3, #4278190080 ; 0xff000000
  365. 80205a8: f081 5160 eorne.w r1, r1, #939524096 ; 0x38000000
  366. 80205ac: 4770 bxne lr
  367. 80205ae: f092 0f00 teq r2, #0
  368. 80205b2: bf14 ite ne
  369. 80205b4: f093 4f7f teqne r3, #4278190080 ; 0xff000000
  370. 80205b8: 4770 bxeq lr
  371. 80205ba: b530 push {r4, r5, lr}
  372. 80205bc: f44f 7460 mov.w r4, #896 ; 0x380
  373. 80205c0: f001 4500 and.w r5, r1, #2147483648 ; 0x80000000
  374. 80205c4: f021 4100 bic.w r1, r1, #2147483648 ; 0x80000000
  375. 80205c8: e720 b.n 802040c <__adddf3+0x138>
  376. 80205ca: bf00 nop
  377. 080205cc <__aeabi_ul2d>:
  378. 80205cc: ea50 0201 orrs.w r2, r0, r1
  379. 80205d0: bf08 it eq
  380. 80205d2: 4770 bxeq lr
  381. 80205d4: b530 push {r4, r5, lr}
  382. 80205d6: f04f 0500 mov.w r5, #0
  383. 80205da: e00a b.n 80205f2 <__aeabi_l2d+0x16>
  384. 080205dc <__aeabi_l2d>:
  385. 80205dc: ea50 0201 orrs.w r2, r0, r1
  386. 80205e0: bf08 it eq
  387. 80205e2: 4770 bxeq lr
  388. 80205e4: b530 push {r4, r5, lr}
  389. 80205e6: f011 4500 ands.w r5, r1, #2147483648 ; 0x80000000
  390. 80205ea: d502 bpl.n 80205f2 <__aeabi_l2d+0x16>
  391. 80205ec: 4240 negs r0, r0
  392. 80205ee: eb61 0141 sbc.w r1, r1, r1, lsl #1
  393. 80205f2: f44f 6480 mov.w r4, #1024 ; 0x400
  394. 80205f6: f104 0432 add.w r4, r4, #50 ; 0x32
  395. 80205fa: ea5f 5c91 movs.w ip, r1, lsr #22
  396. 80205fe: f43f aedc beq.w 80203ba <__adddf3+0xe6>
  397. 8020602: f04f 0203 mov.w r2, #3
  398. 8020606: ea5f 0cdc movs.w ip, ip, lsr #3
  399. 802060a: bf18 it ne
  400. 802060c: 3203 addne r2, #3
  401. 802060e: ea5f 0cdc movs.w ip, ip, lsr #3
  402. 8020612: bf18 it ne
  403. 8020614: 3203 addne r2, #3
  404. 8020616: eb02 02dc add.w r2, r2, ip, lsr #3
  405. 802061a: f1c2 0320 rsb r3, r2, #32
  406. 802061e: fa00 fc03 lsl.w ip, r0, r3
  407. 8020622: fa20 f002 lsr.w r0, r0, r2
  408. 8020626: fa01 fe03 lsl.w lr, r1, r3
  409. 802062a: ea40 000e orr.w r0, r0, lr
  410. 802062e: fa21 f102 lsr.w r1, r1, r2
  411. 8020632: 4414 add r4, r2
  412. 8020634: e6c1 b.n 80203ba <__adddf3+0xe6>
  413. 8020636: bf00 nop
  414. 08020638 <__aeabi_dmul>:
  415. 8020638: b570 push {r4, r5, r6, lr}
  416. 802063a: f04f 0cff mov.w ip, #255 ; 0xff
  417. 802063e: f44c 6ce0 orr.w ip, ip, #1792 ; 0x700
  418. 8020642: ea1c 5411 ands.w r4, ip, r1, lsr #20
  419. 8020646: bf1d ittte ne
  420. 8020648: ea1c 5513 andsne.w r5, ip, r3, lsr #20
  421. 802064c: ea94 0f0c teqne r4, ip
  422. 8020650: ea95 0f0c teqne r5, ip
  423. 8020654: f000 f8de bleq 8020814 <__aeabi_dmul+0x1dc>
  424. 8020658: 442c add r4, r5
  425. 802065a: ea81 0603 eor.w r6, r1, r3
  426. 802065e: ea21 514c bic.w r1, r1, ip, lsl #21
  427. 8020662: ea23 534c bic.w r3, r3, ip, lsl #21
  428. 8020666: ea50 3501 orrs.w r5, r0, r1, lsl #12
  429. 802066a: bf18 it ne
  430. 802066c: ea52 3503 orrsne.w r5, r2, r3, lsl #12
  431. 8020670: f441 1180 orr.w r1, r1, #1048576 ; 0x100000
  432. 8020674: f443 1380 orr.w r3, r3, #1048576 ; 0x100000
  433. 8020678: d038 beq.n 80206ec <__aeabi_dmul+0xb4>
  434. 802067a: fba0 ce02 umull ip, lr, r0, r2
  435. 802067e: f04f 0500 mov.w r5, #0
  436. 8020682: fbe1 e502 umlal lr, r5, r1, r2
  437. 8020686: f006 4200 and.w r2, r6, #2147483648 ; 0x80000000
  438. 802068a: fbe0 e503 umlal lr, r5, r0, r3
  439. 802068e: f04f 0600 mov.w r6, #0
  440. 8020692: fbe1 5603 umlal r5, r6, r1, r3
  441. 8020696: f09c 0f00 teq ip, #0
  442. 802069a: bf18 it ne
  443. 802069c: f04e 0e01 orrne.w lr, lr, #1
  444. 80206a0: f1a4 04ff sub.w r4, r4, #255 ; 0xff
  445. 80206a4: f5b6 7f00 cmp.w r6, #512 ; 0x200
  446. 80206a8: f564 7440 sbc.w r4, r4, #768 ; 0x300
  447. 80206ac: d204 bcs.n 80206b8 <__aeabi_dmul+0x80>
  448. 80206ae: ea5f 0e4e movs.w lr, lr, lsl #1
  449. 80206b2: 416d adcs r5, r5
  450. 80206b4: eb46 0606 adc.w r6, r6, r6
  451. 80206b8: ea42 21c6 orr.w r1, r2, r6, lsl #11
  452. 80206bc: ea41 5155 orr.w r1, r1, r5, lsr #21
  453. 80206c0: ea4f 20c5 mov.w r0, r5, lsl #11
  454. 80206c4: ea40 505e orr.w r0, r0, lr, lsr #21
  455. 80206c8: ea4f 2ece mov.w lr, lr, lsl #11
  456. 80206cc: f1b4 0cfd subs.w ip, r4, #253 ; 0xfd
  457. 80206d0: bf88 it hi
  458. 80206d2: f5bc 6fe0 cmphi.w ip, #1792 ; 0x700
  459. 80206d6: d81e bhi.n 8020716 <__aeabi_dmul+0xde>
  460. 80206d8: f1be 4f00 cmp.w lr, #2147483648 ; 0x80000000
  461. 80206dc: bf08 it eq
  462. 80206de: ea5f 0e50 movseq.w lr, r0, lsr #1
  463. 80206e2: f150 0000 adcs.w r0, r0, #0
  464. 80206e6: eb41 5104 adc.w r1, r1, r4, lsl #20
  465. 80206ea: bd70 pop {r4, r5, r6, pc}
  466. 80206ec: f006 4600 and.w r6, r6, #2147483648 ; 0x80000000
  467. 80206f0: ea46 0101 orr.w r1, r6, r1
  468. 80206f4: ea40 0002 orr.w r0, r0, r2
  469. 80206f8: ea81 0103 eor.w r1, r1, r3
  470. 80206fc: ebb4 045c subs.w r4, r4, ip, lsr #1
  471. 8020700: bfc2 ittt gt
  472. 8020702: ebd4 050c rsbsgt r5, r4, ip
  473. 8020706: ea41 5104 orrgt.w r1, r1, r4, lsl #20
  474. 802070a: bd70 popgt {r4, r5, r6, pc}
  475. 802070c: f441 1180 orr.w r1, r1, #1048576 ; 0x100000
  476. 8020710: f04f 0e00 mov.w lr, #0
  477. 8020714: 3c01 subs r4, #1
  478. 8020716: f300 80ab bgt.w 8020870 <__aeabi_dmul+0x238>
  479. 802071a: f114 0f36 cmn.w r4, #54 ; 0x36
  480. 802071e: bfde ittt le
  481. 8020720: 2000 movle r0, #0
  482. 8020722: f001 4100 andle.w r1, r1, #2147483648 ; 0x80000000
  483. 8020726: bd70 pople {r4, r5, r6, pc}
  484. 8020728: f1c4 0400 rsb r4, r4, #0
  485. 802072c: 3c20 subs r4, #32
  486. 802072e: da35 bge.n 802079c <__aeabi_dmul+0x164>
  487. 8020730: 340c adds r4, #12
  488. 8020732: dc1b bgt.n 802076c <__aeabi_dmul+0x134>
  489. 8020734: f104 0414 add.w r4, r4, #20
  490. 8020738: f1c4 0520 rsb r5, r4, #32
  491. 802073c: fa00 f305 lsl.w r3, r0, r5
  492. 8020740: fa20 f004 lsr.w r0, r0, r4
  493. 8020744: fa01 f205 lsl.w r2, r1, r5
  494. 8020748: ea40 0002 orr.w r0, r0, r2
  495. 802074c: f001 4200 and.w r2, r1, #2147483648 ; 0x80000000
  496. 8020750: f021 4100 bic.w r1, r1, #2147483648 ; 0x80000000
  497. 8020754: eb10 70d3 adds.w r0, r0, r3, lsr #31
  498. 8020758: fa21 f604 lsr.w r6, r1, r4
  499. 802075c: eb42 0106 adc.w r1, r2, r6
  500. 8020760: ea5e 0e43 orrs.w lr, lr, r3, lsl #1
  501. 8020764: bf08 it eq
  502. 8020766: ea20 70d3 biceq.w r0, r0, r3, lsr #31
  503. 802076a: bd70 pop {r4, r5, r6, pc}
  504. 802076c: f1c4 040c rsb r4, r4, #12
  505. 8020770: f1c4 0520 rsb r5, r4, #32
  506. 8020774: fa00 f304 lsl.w r3, r0, r4
  507. 8020778: fa20 f005 lsr.w r0, r0, r5
  508. 802077c: fa01 f204 lsl.w r2, r1, r4
  509. 8020780: ea40 0002 orr.w r0, r0, r2
  510. 8020784: f001 4100 and.w r1, r1, #2147483648 ; 0x80000000
  511. 8020788: eb10 70d3 adds.w r0, r0, r3, lsr #31
  512. 802078c: f141 0100 adc.w r1, r1, #0
  513. 8020790: ea5e 0e43 orrs.w lr, lr, r3, lsl #1
  514. 8020794: bf08 it eq
  515. 8020796: ea20 70d3 biceq.w r0, r0, r3, lsr #31
  516. 802079a: bd70 pop {r4, r5, r6, pc}
  517. 802079c: f1c4 0520 rsb r5, r4, #32
  518. 80207a0: fa00 f205 lsl.w r2, r0, r5
  519. 80207a4: ea4e 0e02 orr.w lr, lr, r2
  520. 80207a8: fa20 f304 lsr.w r3, r0, r4
  521. 80207ac: fa01 f205 lsl.w r2, r1, r5
  522. 80207b0: ea43 0302 orr.w r3, r3, r2
  523. 80207b4: fa21 f004 lsr.w r0, r1, r4
  524. 80207b8: f001 4100 and.w r1, r1, #2147483648 ; 0x80000000
  525. 80207bc: fa21 f204 lsr.w r2, r1, r4
  526. 80207c0: ea20 0002 bic.w r0, r0, r2
  527. 80207c4: eb00 70d3 add.w r0, r0, r3, lsr #31
  528. 80207c8: ea5e 0e43 orrs.w lr, lr, r3, lsl #1
  529. 80207cc: bf08 it eq
  530. 80207ce: ea20 70d3 biceq.w r0, r0, r3, lsr #31
  531. 80207d2: bd70 pop {r4, r5, r6, pc}
  532. 80207d4: f094 0f00 teq r4, #0
  533. 80207d8: d10f bne.n 80207fa <__aeabi_dmul+0x1c2>
  534. 80207da: f001 4600 and.w r6, r1, #2147483648 ; 0x80000000
  535. 80207de: 0040 lsls r0, r0, #1
  536. 80207e0: eb41 0101 adc.w r1, r1, r1
  537. 80207e4: f411 1f80 tst.w r1, #1048576 ; 0x100000
  538. 80207e8: bf08 it eq
  539. 80207ea: 3c01 subeq r4, #1
  540. 80207ec: d0f7 beq.n 80207de <__aeabi_dmul+0x1a6>
  541. 80207ee: ea41 0106 orr.w r1, r1, r6
  542. 80207f2: f095 0f00 teq r5, #0
  543. 80207f6: bf18 it ne
  544. 80207f8: 4770 bxne lr
  545. 80207fa: f003 4600 and.w r6, r3, #2147483648 ; 0x80000000
  546. 80207fe: 0052 lsls r2, r2, #1
  547. 8020800: eb43 0303 adc.w r3, r3, r3
  548. 8020804: f413 1f80 tst.w r3, #1048576 ; 0x100000
  549. 8020808: bf08 it eq
  550. 802080a: 3d01 subeq r5, #1
  551. 802080c: d0f7 beq.n 80207fe <__aeabi_dmul+0x1c6>
  552. 802080e: ea43 0306 orr.w r3, r3, r6
  553. 8020812: 4770 bx lr
  554. 8020814: ea94 0f0c teq r4, ip
  555. 8020818: ea0c 5513 and.w r5, ip, r3, lsr #20
  556. 802081c: bf18 it ne
  557. 802081e: ea95 0f0c teqne r5, ip
  558. 8020822: d00c beq.n 802083e <__aeabi_dmul+0x206>
  559. 8020824: ea50 0641 orrs.w r6, r0, r1, lsl #1
  560. 8020828: bf18 it ne
  561. 802082a: ea52 0643 orrsne.w r6, r2, r3, lsl #1
  562. 802082e: d1d1 bne.n 80207d4 <__aeabi_dmul+0x19c>
  563. 8020830: ea81 0103 eor.w r1, r1, r3
  564. 8020834: f001 4100 and.w r1, r1, #2147483648 ; 0x80000000
  565. 8020838: f04f 0000 mov.w r0, #0
  566. 802083c: bd70 pop {r4, r5, r6, pc}
  567. 802083e: ea50 0641 orrs.w r6, r0, r1, lsl #1
  568. 8020842: bf06 itte eq
  569. 8020844: 4610 moveq r0, r2
  570. 8020846: 4619 moveq r1, r3
  571. 8020848: ea52 0643 orrsne.w r6, r2, r3, lsl #1
  572. 802084c: d019 beq.n 8020882 <__aeabi_dmul+0x24a>
  573. 802084e: ea94 0f0c teq r4, ip
  574. 8020852: d102 bne.n 802085a <__aeabi_dmul+0x222>
  575. 8020854: ea50 3601 orrs.w r6, r0, r1, lsl #12
  576. 8020858: d113 bne.n 8020882 <__aeabi_dmul+0x24a>
  577. 802085a: ea95 0f0c teq r5, ip
  578. 802085e: d105 bne.n 802086c <__aeabi_dmul+0x234>
  579. 8020860: ea52 3603 orrs.w r6, r2, r3, lsl #12
  580. 8020864: bf1c itt ne
  581. 8020866: 4610 movne r0, r2
  582. 8020868: 4619 movne r1, r3
  583. 802086a: d10a bne.n 8020882 <__aeabi_dmul+0x24a>
  584. 802086c: ea81 0103 eor.w r1, r1, r3
  585. 8020870: f001 4100 and.w r1, r1, #2147483648 ; 0x80000000
  586. 8020874: f041 41fe orr.w r1, r1, #2130706432 ; 0x7f000000
  587. 8020878: f441 0170 orr.w r1, r1, #15728640 ; 0xf00000
  588. 802087c: f04f 0000 mov.w r0, #0
  589. 8020880: bd70 pop {r4, r5, r6, pc}
  590. 8020882: f041 41fe orr.w r1, r1, #2130706432 ; 0x7f000000
  591. 8020886: f441 0178 orr.w r1, r1, #16252928 ; 0xf80000
  592. 802088a: bd70 pop {r4, r5, r6, pc}
  593. 0802088c <__aeabi_ddiv>:
  594. 802088c: b570 push {r4, r5, r6, lr}
  595. 802088e: f04f 0cff mov.w ip, #255 ; 0xff
  596. 8020892: f44c 6ce0 orr.w ip, ip, #1792 ; 0x700
  597. 8020896: ea1c 5411 ands.w r4, ip, r1, lsr #20
  598. 802089a: bf1d ittte ne
  599. 802089c: ea1c 5513 andsne.w r5, ip, r3, lsr #20
  600. 80208a0: ea94 0f0c teqne r4, ip
  601. 80208a4: ea95 0f0c teqne r5, ip
  602. 80208a8: f000 f8a7 bleq 80209fa <__aeabi_ddiv+0x16e>
  603. 80208ac: eba4 0405 sub.w r4, r4, r5
  604. 80208b0: ea81 0e03 eor.w lr, r1, r3
  605. 80208b4: ea52 3503 orrs.w r5, r2, r3, lsl #12
  606. 80208b8: ea4f 3101 mov.w r1, r1, lsl #12
  607. 80208bc: f000 8088 beq.w 80209d0 <__aeabi_ddiv+0x144>
  608. 80208c0: ea4f 3303 mov.w r3, r3, lsl #12
  609. 80208c4: f04f 5580 mov.w r5, #268435456 ; 0x10000000
  610. 80208c8: ea45 1313 orr.w r3, r5, r3, lsr #4
  611. 80208cc: ea43 6312 orr.w r3, r3, r2, lsr #24
  612. 80208d0: ea4f 2202 mov.w r2, r2, lsl #8
  613. 80208d4: ea45 1511 orr.w r5, r5, r1, lsr #4
  614. 80208d8: ea45 6510 orr.w r5, r5, r0, lsr #24
  615. 80208dc: ea4f 2600 mov.w r6, r0, lsl #8
  616. 80208e0: f00e 4100 and.w r1, lr, #2147483648 ; 0x80000000
  617. 80208e4: 429d cmp r5, r3
  618. 80208e6: bf08 it eq
  619. 80208e8: 4296 cmpeq r6, r2
  620. 80208ea: f144 04fd adc.w r4, r4, #253 ; 0xfd
  621. 80208ee: f504 7440 add.w r4, r4, #768 ; 0x300
  622. 80208f2: d202 bcs.n 80208fa <__aeabi_ddiv+0x6e>
  623. 80208f4: 085b lsrs r3, r3, #1
  624. 80208f6: ea4f 0232 mov.w r2, r2, rrx
  625. 80208fa: 1ab6 subs r6, r6, r2
  626. 80208fc: eb65 0503 sbc.w r5, r5, r3
  627. 8020900: 085b lsrs r3, r3, #1
  628. 8020902: ea4f 0232 mov.w r2, r2, rrx
  629. 8020906: f44f 1080 mov.w r0, #1048576 ; 0x100000
  630. 802090a: f44f 2c00 mov.w ip, #524288 ; 0x80000
  631. 802090e: ebb6 0e02 subs.w lr, r6, r2
  632. 8020912: eb75 0e03 sbcs.w lr, r5, r3
  633. 8020916: bf22 ittt cs
  634. 8020918: 1ab6 subcs r6, r6, r2
  635. 802091a: 4675 movcs r5, lr
  636. 802091c: ea40 000c orrcs.w r0, r0, ip
  637. 8020920: 085b lsrs r3, r3, #1
  638. 8020922: ea4f 0232 mov.w r2, r2, rrx
  639. 8020926: ebb6 0e02 subs.w lr, r6, r2
  640. 802092a: eb75 0e03 sbcs.w lr, r5, r3
  641. 802092e: bf22 ittt cs
  642. 8020930: 1ab6 subcs r6, r6, r2
  643. 8020932: 4675 movcs r5, lr
  644. 8020934: ea40 005c orrcs.w r0, r0, ip, lsr #1
  645. 8020938: 085b lsrs r3, r3, #1
  646. 802093a: ea4f 0232 mov.w r2, r2, rrx
  647. 802093e: ebb6 0e02 subs.w lr, r6, r2
  648. 8020942: eb75 0e03 sbcs.w lr, r5, r3
  649. 8020946: bf22 ittt cs
  650. 8020948: 1ab6 subcs r6, r6, r2
  651. 802094a: 4675 movcs r5, lr
  652. 802094c: ea40 009c orrcs.w r0, r0, ip, lsr #2
  653. 8020950: 085b lsrs r3, r3, #1
  654. 8020952: ea4f 0232 mov.w r2, r2, rrx
  655. 8020956: ebb6 0e02 subs.w lr, r6, r2
  656. 802095a: eb75 0e03 sbcs.w lr, r5, r3
  657. 802095e: bf22 ittt cs
  658. 8020960: 1ab6 subcs r6, r6, r2
  659. 8020962: 4675 movcs r5, lr
  660. 8020964: ea40 00dc orrcs.w r0, r0, ip, lsr #3
  661. 8020968: ea55 0e06 orrs.w lr, r5, r6
  662. 802096c: d018 beq.n 80209a0 <__aeabi_ddiv+0x114>
  663. 802096e: ea4f 1505 mov.w r5, r5, lsl #4
  664. 8020972: ea45 7516 orr.w r5, r5, r6, lsr #28
  665. 8020976: ea4f 1606 mov.w r6, r6, lsl #4
  666. 802097a: ea4f 03c3 mov.w r3, r3, lsl #3
  667. 802097e: ea43 7352 orr.w r3, r3, r2, lsr #29
  668. 8020982: ea4f 02c2 mov.w r2, r2, lsl #3
  669. 8020986: ea5f 1c1c movs.w ip, ip, lsr #4
  670. 802098a: d1c0 bne.n 802090e <__aeabi_ddiv+0x82>
  671. 802098c: f411 1f80 tst.w r1, #1048576 ; 0x100000
  672. 8020990: d10b bne.n 80209aa <__aeabi_ddiv+0x11e>
  673. 8020992: ea41 0100 orr.w r1, r1, r0
  674. 8020996: f04f 0000 mov.w r0, #0
  675. 802099a: f04f 4c00 mov.w ip, #2147483648 ; 0x80000000
  676. 802099e: e7b6 b.n 802090e <__aeabi_ddiv+0x82>
  677. 80209a0: f411 1f80 tst.w r1, #1048576 ; 0x100000
  678. 80209a4: bf04 itt eq
  679. 80209a6: 4301 orreq r1, r0
  680. 80209a8: 2000 moveq r0, #0
  681. 80209aa: f1b4 0cfd subs.w ip, r4, #253 ; 0xfd
  682. 80209ae: bf88 it hi
  683. 80209b0: f5bc 6fe0 cmphi.w ip, #1792 ; 0x700
  684. 80209b4: f63f aeaf bhi.w 8020716 <__aeabi_dmul+0xde>
  685. 80209b8: ebb5 0c03 subs.w ip, r5, r3
  686. 80209bc: bf04 itt eq
  687. 80209be: ebb6 0c02 subseq.w ip, r6, r2
  688. 80209c2: ea5f 0c50 movseq.w ip, r0, lsr #1
  689. 80209c6: f150 0000 adcs.w r0, r0, #0
  690. 80209ca: eb41 5104 adc.w r1, r1, r4, lsl #20
  691. 80209ce: bd70 pop {r4, r5, r6, pc}
  692. 80209d0: f00e 4e00 and.w lr, lr, #2147483648 ; 0x80000000
  693. 80209d4: ea4e 3111 orr.w r1, lr, r1, lsr #12
  694. 80209d8: eb14 045c adds.w r4, r4, ip, lsr #1
  695. 80209dc: bfc2 ittt gt
  696. 80209de: ebd4 050c rsbsgt r5, r4, ip
  697. 80209e2: ea41 5104 orrgt.w r1, r1, r4, lsl #20
  698. 80209e6: bd70 popgt {r4, r5, r6, pc}
  699. 80209e8: f441 1180 orr.w r1, r1, #1048576 ; 0x100000
  700. 80209ec: f04f 0e00 mov.w lr, #0
  701. 80209f0: 3c01 subs r4, #1
  702. 80209f2: e690 b.n 8020716 <__aeabi_dmul+0xde>
  703. 80209f4: ea45 0e06 orr.w lr, r5, r6
  704. 80209f8: e68d b.n 8020716 <__aeabi_dmul+0xde>
  705. 80209fa: ea0c 5513 and.w r5, ip, r3, lsr #20
  706. 80209fe: ea94 0f0c teq r4, ip
  707. 8020a02: bf08 it eq
  708. 8020a04: ea95 0f0c teqeq r5, ip
  709. 8020a08: f43f af3b beq.w 8020882 <__aeabi_dmul+0x24a>
  710. 8020a0c: ea94 0f0c teq r4, ip
  711. 8020a10: d10a bne.n 8020a28 <__aeabi_ddiv+0x19c>
  712. 8020a12: ea50 3401 orrs.w r4, r0, r1, lsl #12
  713. 8020a16: f47f af34 bne.w 8020882 <__aeabi_dmul+0x24a>
  714. 8020a1a: ea95 0f0c teq r5, ip
  715. 8020a1e: f47f af25 bne.w 802086c <__aeabi_dmul+0x234>
  716. 8020a22: 4610 mov r0, r2
  717. 8020a24: 4619 mov r1, r3
  718. 8020a26: e72c b.n 8020882 <__aeabi_dmul+0x24a>
  719. 8020a28: ea95 0f0c teq r5, ip
  720. 8020a2c: d106 bne.n 8020a3c <__aeabi_ddiv+0x1b0>
  721. 8020a2e: ea52 3503 orrs.w r5, r2, r3, lsl #12
  722. 8020a32: f43f aefd beq.w 8020830 <__aeabi_dmul+0x1f8>
  723. 8020a36: 4610 mov r0, r2
  724. 8020a38: 4619 mov r1, r3
  725. 8020a3a: e722 b.n 8020882 <__aeabi_dmul+0x24a>
  726. 8020a3c: ea50 0641 orrs.w r6, r0, r1, lsl #1
  727. 8020a40: bf18 it ne
  728. 8020a42: ea52 0643 orrsne.w r6, r2, r3, lsl #1
  729. 8020a46: f47f aec5 bne.w 80207d4 <__aeabi_dmul+0x19c>
  730. 8020a4a: ea50 0441 orrs.w r4, r0, r1, lsl #1
  731. 8020a4e: f47f af0d bne.w 802086c <__aeabi_dmul+0x234>
  732. 8020a52: ea52 0543 orrs.w r5, r2, r3, lsl #1
  733. 8020a56: f47f aeeb bne.w 8020830 <__aeabi_dmul+0x1f8>
  734. 8020a5a: e712 b.n 8020882 <__aeabi_dmul+0x24a>
  735. 08020a5c <__gedf2>:
  736. 8020a5c: f04f 3cff mov.w ip, #4294967295
  737. 8020a60: e006 b.n 8020a70 <__cmpdf2+0x4>
  738. 8020a62: bf00 nop
  739. 08020a64 <__ledf2>:
  740. 8020a64: f04f 0c01 mov.w ip, #1
  741. 8020a68: e002 b.n 8020a70 <__cmpdf2+0x4>
  742. 8020a6a: bf00 nop
  743. 08020a6c <__cmpdf2>:
  744. 8020a6c: f04f 0c01 mov.w ip, #1
  745. 8020a70: f84d cd04 str.w ip, [sp, #-4]!
  746. 8020a74: ea4f 0c41 mov.w ip, r1, lsl #1
  747. 8020a78: ea7f 5c6c mvns.w ip, ip, asr #21
  748. 8020a7c: ea4f 0c43 mov.w ip, r3, lsl #1
  749. 8020a80: bf18 it ne
  750. 8020a82: ea7f 5c6c mvnsne.w ip, ip, asr #21
  751. 8020a86: d01b beq.n 8020ac0 <__cmpdf2+0x54>
  752. 8020a88: b001 add sp, #4
  753. 8020a8a: ea50 0c41 orrs.w ip, r0, r1, lsl #1
  754. 8020a8e: bf0c ite eq
  755. 8020a90: ea52 0c43 orrseq.w ip, r2, r3, lsl #1
  756. 8020a94: ea91 0f03 teqne r1, r3
  757. 8020a98: bf02 ittt eq
  758. 8020a9a: ea90 0f02 teqeq r0, r2
  759. 8020a9e: 2000 moveq r0, #0
  760. 8020aa0: 4770 bxeq lr
  761. 8020aa2: f110 0f00 cmn.w r0, #0
  762. 8020aa6: ea91 0f03 teq r1, r3
  763. 8020aaa: bf58 it pl
  764. 8020aac: 4299 cmppl r1, r3
  765. 8020aae: bf08 it eq
  766. 8020ab0: 4290 cmpeq r0, r2
  767. 8020ab2: bf2c ite cs
  768. 8020ab4: 17d8 asrcs r0, r3, #31
  769. 8020ab6: ea6f 70e3 mvncc.w r0, r3, asr #31
  770. 8020aba: f040 0001 orr.w r0, r0, #1
  771. 8020abe: 4770 bx lr
  772. 8020ac0: ea4f 0c41 mov.w ip, r1, lsl #1
  773. 8020ac4: ea7f 5c6c mvns.w ip, ip, asr #21
  774. 8020ac8: d102 bne.n 8020ad0 <__cmpdf2+0x64>
  775. 8020aca: ea50 3c01 orrs.w ip, r0, r1, lsl #12
  776. 8020ace: d107 bne.n 8020ae0 <__cmpdf2+0x74>
  777. 8020ad0: ea4f 0c43 mov.w ip, r3, lsl #1
  778. 8020ad4: ea7f 5c6c mvns.w ip, ip, asr #21
  779. 8020ad8: d1d6 bne.n 8020a88 <__cmpdf2+0x1c>
  780. 8020ada: ea52 3c03 orrs.w ip, r2, r3, lsl #12
  781. 8020ade: d0d3 beq.n 8020a88 <__cmpdf2+0x1c>
  782. 8020ae0: f85d 0b04 ldr.w r0, [sp], #4
  783. 8020ae4: 4770 bx lr
  784. 8020ae6: bf00 nop
  785. 08020ae8 <__aeabi_cdrcmple>:
  786. 8020ae8: 4684 mov ip, r0
  787. 8020aea: 4610 mov r0, r2
  788. 8020aec: 4662 mov r2, ip
  789. 8020aee: 468c mov ip, r1
  790. 8020af0: 4619 mov r1, r3
  791. 8020af2: 4663 mov r3, ip
  792. 8020af4: e000 b.n 8020af8 <__aeabi_cdcmpeq>
  793. 8020af6: bf00 nop
  794. 08020af8 <__aeabi_cdcmpeq>:
  795. 8020af8: b501 push {r0, lr}
  796. 8020afa: f7ff ffb7 bl 8020a6c <__cmpdf2>
  797. 8020afe: 2800 cmp r0, #0
  798. 8020b00: bf48 it mi
  799. 8020b02: f110 0f00 cmnmi.w r0, #0
  800. 8020b06: bd01 pop {r0, pc}
  801. 08020b08 <__aeabi_dcmpeq>:
  802. 8020b08: f84d ed08 str.w lr, [sp, #-8]!
  803. 8020b0c: f7ff fff4 bl 8020af8 <__aeabi_cdcmpeq>
  804. 8020b10: bf0c ite eq
  805. 8020b12: 2001 moveq r0, #1
  806. 8020b14: 2000 movne r0, #0
  807. 8020b16: f85d fb08 ldr.w pc, [sp], #8
  808. 8020b1a: bf00 nop
  809. 08020b1c <__aeabi_dcmplt>:
  810. 8020b1c: f84d ed08 str.w lr, [sp, #-8]!
  811. 8020b20: f7ff ffea bl 8020af8 <__aeabi_cdcmpeq>
  812. 8020b24: bf34 ite cc
  813. 8020b26: 2001 movcc r0, #1
  814. 8020b28: 2000 movcs r0, #0
  815. 8020b2a: f85d fb08 ldr.w pc, [sp], #8
  816. 8020b2e: bf00 nop
  817. 08020b30 <__aeabi_dcmple>:
  818. 8020b30: f84d ed08 str.w lr, [sp, #-8]!
  819. 8020b34: f7ff ffe0 bl 8020af8 <__aeabi_cdcmpeq>
  820. 8020b38: bf94 ite ls
  821. 8020b3a: 2001 movls r0, #1
  822. 8020b3c: 2000 movhi r0, #0
  823. 8020b3e: f85d fb08 ldr.w pc, [sp], #8
  824. 8020b42: bf00 nop
  825. 08020b44 <__aeabi_dcmpge>:
  826. 8020b44: f84d ed08 str.w lr, [sp, #-8]!
  827. 8020b48: f7ff ffce bl 8020ae8 <__aeabi_cdrcmple>
  828. 8020b4c: bf94 ite ls
  829. 8020b4e: 2001 movls r0, #1
  830. 8020b50: 2000 movhi r0, #0
  831. 8020b52: f85d fb08 ldr.w pc, [sp], #8
  832. 8020b56: bf00 nop
  833. 08020b58 <__aeabi_dcmpgt>:
  834. 8020b58: f84d ed08 str.w lr, [sp, #-8]!
  835. 8020b5c: f7ff ffc4 bl 8020ae8 <__aeabi_cdrcmple>
  836. 8020b60: bf34 ite cc
  837. 8020b62: 2001 movcc r0, #1
  838. 8020b64: 2000 movcs r0, #0
  839. 8020b66: f85d fb08 ldr.w pc, [sp], #8
  840. 8020b6a: bf00 nop
  841. 08020b6c <__aeabi_d2iz>:
  842. 8020b6c: ea4f 0241 mov.w r2, r1, lsl #1
  843. 8020b70: f512 1200 adds.w r2, r2, #2097152 ; 0x200000
  844. 8020b74: d215 bcs.n 8020ba2 <__aeabi_d2iz+0x36>
  845. 8020b76: d511 bpl.n 8020b9c <__aeabi_d2iz+0x30>
  846. 8020b78: f46f 7378 mvn.w r3, #992 ; 0x3e0
  847. 8020b7c: ebb3 5262 subs.w r2, r3, r2, asr #21
  848. 8020b80: d912 bls.n 8020ba8 <__aeabi_d2iz+0x3c>
  849. 8020b82: ea4f 23c1 mov.w r3, r1, lsl #11
  850. 8020b86: f043 4300 orr.w r3, r3, #2147483648 ; 0x80000000
  851. 8020b8a: ea43 5350 orr.w r3, r3, r0, lsr #21
  852. 8020b8e: f011 4f00 tst.w r1, #2147483648 ; 0x80000000
  853. 8020b92: fa23 f002 lsr.w r0, r3, r2
  854. 8020b96: bf18 it ne
  855. 8020b98: 4240 negne r0, r0
  856. 8020b9a: 4770 bx lr
  857. 8020b9c: f04f 0000 mov.w r0, #0
  858. 8020ba0: 4770 bx lr
  859. 8020ba2: ea50 3001 orrs.w r0, r0, r1, lsl #12
  860. 8020ba6: d105 bne.n 8020bb4 <__aeabi_d2iz+0x48>
  861. 8020ba8: f011 4000 ands.w r0, r1, #2147483648 ; 0x80000000
  862. 8020bac: bf08 it eq
  863. 8020bae: f06f 4000 mvneq.w r0, #2147483648 ; 0x80000000
  864. 8020bb2: 4770 bx lr
  865. 8020bb4: f04f 0000 mov.w r0, #0
  866. 8020bb8: 4770 bx lr
  867. 8020bba: bf00 nop
  868. 08020bbc <__aeabi_d2uiz>:
  869. 8020bbc: 004a lsls r2, r1, #1
  870. 8020bbe: d211 bcs.n 8020be4 <__aeabi_d2uiz+0x28>
  871. 8020bc0: f512 1200 adds.w r2, r2, #2097152 ; 0x200000
  872. 8020bc4: d211 bcs.n 8020bea <__aeabi_d2uiz+0x2e>
  873. 8020bc6: d50d bpl.n 8020be4 <__aeabi_d2uiz+0x28>
  874. 8020bc8: f46f 7378 mvn.w r3, #992 ; 0x3e0
  875. 8020bcc: ebb3 5262 subs.w r2, r3, r2, asr #21
  876. 8020bd0: d40e bmi.n 8020bf0 <__aeabi_d2uiz+0x34>
  877. 8020bd2: ea4f 23c1 mov.w r3, r1, lsl #11
  878. 8020bd6: f043 4300 orr.w r3, r3, #2147483648 ; 0x80000000
  879. 8020bda: ea43 5350 orr.w r3, r3, r0, lsr #21
  880. 8020bde: fa23 f002 lsr.w r0, r3, r2
  881. 8020be2: 4770 bx lr
  882. 8020be4: f04f 0000 mov.w r0, #0
  883. 8020be8: 4770 bx lr
  884. 8020bea: ea50 3001 orrs.w r0, r0, r1, lsl #12
  885. 8020bee: d102 bne.n 8020bf6 <__aeabi_d2uiz+0x3a>
  886. 8020bf0: f04f 30ff mov.w r0, #4294967295
  887. 8020bf4: 4770 bx lr
  888. 8020bf6: f04f 0000 mov.w r0, #0
  889. 8020bfa: 4770 bx lr
  890. 08020bfc <__aeabi_d2f>:
  891. 8020bfc: ea4f 0241 mov.w r2, r1, lsl #1
  892. 8020c00: f1b2 43e0 subs.w r3, r2, #1879048192 ; 0x70000000
  893. 8020c04: bf24 itt cs
  894. 8020c06: f5b3 1c00 subscs.w ip, r3, #2097152 ; 0x200000
  895. 8020c0a: f1dc 5cfe rsbscs ip, ip, #532676608 ; 0x1fc00000
  896. 8020c0e: d90d bls.n 8020c2c <__aeabi_d2f+0x30>
  897. 8020c10: f001 4c00 and.w ip, r1, #2147483648 ; 0x80000000
  898. 8020c14: ea4f 02c0 mov.w r2, r0, lsl #3
  899. 8020c18: ea4c 7050 orr.w r0, ip, r0, lsr #29
  900. 8020c1c: f1b2 4f00 cmp.w r2, #2147483648 ; 0x80000000
  901. 8020c20: eb40 0083 adc.w r0, r0, r3, lsl #2
  902. 8020c24: bf08 it eq
  903. 8020c26: f020 0001 biceq.w r0, r0, #1
  904. 8020c2a: 4770 bx lr
  905. 8020c2c: f011 4f80 tst.w r1, #1073741824 ; 0x40000000
  906. 8020c30: d121 bne.n 8020c76 <__aeabi_d2f+0x7a>
  907. 8020c32: f113 7238 adds.w r2, r3, #48234496 ; 0x2e00000
  908. 8020c36: bfbc itt lt
  909. 8020c38: f001 4000 andlt.w r0, r1, #2147483648 ; 0x80000000
  910. 8020c3c: 4770 bxlt lr
  911. 8020c3e: f441 1180 orr.w r1, r1, #1048576 ; 0x100000
  912. 8020c42: ea4f 5252 mov.w r2, r2, lsr #21
  913. 8020c46: f1c2 0218 rsb r2, r2, #24
  914. 8020c4a: f1c2 0c20 rsb ip, r2, #32
  915. 8020c4e: fa10 f30c lsls.w r3, r0, ip
  916. 8020c52: fa20 f002 lsr.w r0, r0, r2
  917. 8020c56: bf18 it ne
  918. 8020c58: f040 0001 orrne.w r0, r0, #1
  919. 8020c5c: ea4f 23c1 mov.w r3, r1, lsl #11
  920. 8020c60: ea4f 23d3 mov.w r3, r3, lsr #11
  921. 8020c64: fa03 fc0c lsl.w ip, r3, ip
  922. 8020c68: ea40 000c orr.w r0, r0, ip
  923. 8020c6c: fa23 f302 lsr.w r3, r3, r2
  924. 8020c70: ea4f 0343 mov.w r3, r3, lsl #1
  925. 8020c74: e7cc b.n 8020c10 <__aeabi_d2f+0x14>
  926. 8020c76: ea7f 5362 mvns.w r3, r2, asr #21
  927. 8020c7a: d107 bne.n 8020c8c <__aeabi_d2f+0x90>
  928. 8020c7c: ea50 3301 orrs.w r3, r0, r1, lsl #12
  929. 8020c80: bf1e ittt ne
  930. 8020c82: f04f 40fe movne.w r0, #2130706432 ; 0x7f000000
  931. 8020c86: f440 0040 orrne.w r0, r0, #12582912 ; 0xc00000
  932. 8020c8a: 4770 bxne lr
  933. 8020c8c: f001 4000 and.w r0, r1, #2147483648 ; 0x80000000
  934. 8020c90: f040 40fe orr.w r0, r0, #2130706432 ; 0x7f000000
  935. 8020c94: f440 0000 orr.w r0, r0, #8388608 ; 0x800000
  936. 8020c98: 4770 bx lr
  937. 8020c9a: bf00 nop
  938. 08020c9c <__aeabi_frsub>:
  939. 8020c9c: f080 4000 eor.w r0, r0, #2147483648 ; 0x80000000
  940. 8020ca0: e002 b.n 8020ca8 <__addsf3>
  941. 8020ca2: bf00 nop
  942. 08020ca4 <__aeabi_fsub>:
  943. 8020ca4: f081 4100 eor.w r1, r1, #2147483648 ; 0x80000000
  944. 08020ca8 <__addsf3>:
  945. 8020ca8: 0042 lsls r2, r0, #1
  946. 8020caa: bf1f itttt ne
  947. 8020cac: ea5f 0341 movsne.w r3, r1, lsl #1
  948. 8020cb0: ea92 0f03 teqne r2, r3
  949. 8020cb4: ea7f 6c22 mvnsne.w ip, r2, asr #24
  950. 8020cb8: ea7f 6c23 mvnsne.w ip, r3, asr #24
  951. 8020cbc: d06a beq.n 8020d94 <__addsf3+0xec>
  952. 8020cbe: ea4f 6212 mov.w r2, r2, lsr #24
  953. 8020cc2: ebd2 6313 rsbs r3, r2, r3, lsr #24
  954. 8020cc6: bfc1 itttt gt
  955. 8020cc8: 18d2 addgt r2, r2, r3
  956. 8020cca: 4041 eorgt r1, r0
  957. 8020ccc: 4048 eorgt r0, r1
  958. 8020cce: 4041 eorgt r1, r0
  959. 8020cd0: bfb8 it lt
  960. 8020cd2: 425b neglt r3, r3
  961. 8020cd4: 2b19 cmp r3, #25
  962. 8020cd6: bf88 it hi
  963. 8020cd8: 4770 bxhi lr
  964. 8020cda: f010 4f00 tst.w r0, #2147483648 ; 0x80000000
  965. 8020cde: f440 0000 orr.w r0, r0, #8388608 ; 0x800000
  966. 8020ce2: f020 407f bic.w r0, r0, #4278190080 ; 0xff000000
  967. 8020ce6: bf18 it ne
  968. 8020ce8: 4240 negne r0, r0
  969. 8020cea: f011 4f00 tst.w r1, #2147483648 ; 0x80000000
  970. 8020cee: f441 0100 orr.w r1, r1, #8388608 ; 0x800000
  971. 8020cf2: f021 417f bic.w r1, r1, #4278190080 ; 0xff000000
  972. 8020cf6: bf18 it ne
  973. 8020cf8: 4249 negne r1, r1
  974. 8020cfa: ea92 0f03 teq r2, r3
  975. 8020cfe: d03f beq.n 8020d80 <__addsf3+0xd8>
  976. 8020d00: f1a2 0201 sub.w r2, r2, #1
  977. 8020d04: fa41 fc03 asr.w ip, r1, r3
  978. 8020d08: eb10 000c adds.w r0, r0, ip
  979. 8020d0c: f1c3 0320 rsb r3, r3, #32
  980. 8020d10: fa01 f103 lsl.w r1, r1, r3
  981. 8020d14: f000 4300 and.w r3, r0, #2147483648 ; 0x80000000
  982. 8020d18: d502 bpl.n 8020d20 <__addsf3+0x78>
  983. 8020d1a: 4249 negs r1, r1
  984. 8020d1c: eb60 0040 sbc.w r0, r0, r0, lsl #1
  985. 8020d20: f5b0 0f00 cmp.w r0, #8388608 ; 0x800000
  986. 8020d24: d313 bcc.n 8020d4e <__addsf3+0xa6>
  987. 8020d26: f1b0 7f80 cmp.w r0, #16777216 ; 0x1000000
  988. 8020d2a: d306 bcc.n 8020d3a <__addsf3+0x92>
  989. 8020d2c: 0840 lsrs r0, r0, #1
  990. 8020d2e: ea4f 0131 mov.w r1, r1, rrx
  991. 8020d32: f102 0201 add.w r2, r2, #1
  992. 8020d36: 2afe cmp r2, #254 ; 0xfe
  993. 8020d38: d251 bcs.n 8020dde <__addsf3+0x136>
  994. 8020d3a: f1b1 4f00 cmp.w r1, #2147483648 ; 0x80000000
  995. 8020d3e: eb40 50c2 adc.w r0, r0, r2, lsl #23
  996. 8020d42: bf08 it eq
  997. 8020d44: f020 0001 biceq.w r0, r0, #1
  998. 8020d48: ea40 0003 orr.w r0, r0, r3
  999. 8020d4c: 4770 bx lr
  1000. 8020d4e: 0049 lsls r1, r1, #1
  1001. 8020d50: eb40 0000 adc.w r0, r0, r0
  1002. 8020d54: f410 0f00 tst.w r0, #8388608 ; 0x800000
  1003. 8020d58: f1a2 0201 sub.w r2, r2, #1
  1004. 8020d5c: d1ed bne.n 8020d3a <__addsf3+0x92>
  1005. 8020d5e: fab0 fc80 clz ip, r0
  1006. 8020d62: f1ac 0c08 sub.w ip, ip, #8
  1007. 8020d66: ebb2 020c subs.w r2, r2, ip
  1008. 8020d6a: fa00 f00c lsl.w r0, r0, ip
  1009. 8020d6e: bfaa itet ge
  1010. 8020d70: eb00 50c2 addge.w r0, r0, r2, lsl #23
  1011. 8020d74: 4252 neglt r2, r2
  1012. 8020d76: 4318 orrge r0, r3
  1013. 8020d78: bfbc itt lt
  1014. 8020d7a: 40d0 lsrlt r0, r2
  1015. 8020d7c: 4318 orrlt r0, r3
  1016. 8020d7e: 4770 bx lr
  1017. 8020d80: f092 0f00 teq r2, #0
  1018. 8020d84: f481 0100 eor.w r1, r1, #8388608 ; 0x800000
  1019. 8020d88: bf06 itte eq
  1020. 8020d8a: f480 0000 eoreq.w r0, r0, #8388608 ; 0x800000
  1021. 8020d8e: 3201 addeq r2, #1
  1022. 8020d90: 3b01 subne r3, #1
  1023. 8020d92: e7b5 b.n 8020d00 <__addsf3+0x58>
  1024. 8020d94: ea4f 0341 mov.w r3, r1, lsl #1
  1025. 8020d98: ea7f 6c22 mvns.w ip, r2, asr #24
  1026. 8020d9c: bf18 it ne
  1027. 8020d9e: ea7f 6c23 mvnsne.w ip, r3, asr #24
  1028. 8020da2: d021 beq.n 8020de8 <__addsf3+0x140>
  1029. 8020da4: ea92 0f03 teq r2, r3
  1030. 8020da8: d004 beq.n 8020db4 <__addsf3+0x10c>
  1031. 8020daa: f092 0f00 teq r2, #0
  1032. 8020dae: bf08 it eq
  1033. 8020db0: 4608 moveq r0, r1
  1034. 8020db2: 4770 bx lr
  1035. 8020db4: ea90 0f01 teq r0, r1
  1036. 8020db8: bf1c itt ne
  1037. 8020dba: 2000 movne r0, #0
  1038. 8020dbc: 4770 bxne lr
  1039. 8020dbe: f012 4f7f tst.w r2, #4278190080 ; 0xff000000
  1040. 8020dc2: d104 bne.n 8020dce <__addsf3+0x126>
  1041. 8020dc4: 0040 lsls r0, r0, #1
  1042. 8020dc6: bf28 it cs
  1043. 8020dc8: f040 4000 orrcs.w r0, r0, #2147483648 ; 0x80000000
  1044. 8020dcc: 4770 bx lr
  1045. 8020dce: f112 7200 adds.w r2, r2, #33554432 ; 0x2000000
  1046. 8020dd2: bf3c itt cc
  1047. 8020dd4: f500 0000 addcc.w r0, r0, #8388608 ; 0x800000
  1048. 8020dd8: 4770 bxcc lr
  1049. 8020dda: f000 4300 and.w r3, r0, #2147483648 ; 0x80000000
  1050. 8020dde: f043 40fe orr.w r0, r3, #2130706432 ; 0x7f000000
  1051. 8020de2: f440 0000 orr.w r0, r0, #8388608 ; 0x800000
  1052. 8020de6: 4770 bx lr
  1053. 8020de8: ea7f 6222 mvns.w r2, r2, asr #24
  1054. 8020dec: bf16 itet ne
  1055. 8020dee: 4608 movne r0, r1
  1056. 8020df0: ea7f 6323 mvnseq.w r3, r3, asr #24
  1057. 8020df4: 4601 movne r1, r0
  1058. 8020df6: 0242 lsls r2, r0, #9
  1059. 8020df8: bf06 itte eq
  1060. 8020dfa: ea5f 2341 movseq.w r3, r1, lsl #9
  1061. 8020dfe: ea90 0f01 teqeq r0, r1
  1062. 8020e02: f440 0080 orrne.w r0, r0, #4194304 ; 0x400000
  1063. 8020e06: 4770 bx lr
  1064. 08020e08 <__aeabi_ui2f>:
  1065. 8020e08: f04f 0300 mov.w r3, #0
  1066. 8020e0c: e004 b.n 8020e18 <__aeabi_i2f+0x8>
  1067. 8020e0e: bf00 nop
  1068. 08020e10 <__aeabi_i2f>:
  1069. 8020e10: f010 4300 ands.w r3, r0, #2147483648 ; 0x80000000
  1070. 8020e14: bf48 it mi
  1071. 8020e16: 4240 negmi r0, r0
  1072. 8020e18: ea5f 0c00 movs.w ip, r0
  1073. 8020e1c: bf08 it eq
  1074. 8020e1e: 4770 bxeq lr
  1075. 8020e20: f043 4396 orr.w r3, r3, #1258291200 ; 0x4b000000
  1076. 8020e24: 4601 mov r1, r0
  1077. 8020e26: f04f 0000 mov.w r0, #0
  1078. 8020e2a: e01c b.n 8020e66 <__aeabi_l2f+0x2a>
  1079. 08020e2c <__aeabi_ul2f>:
  1080. 8020e2c: ea50 0201 orrs.w r2, r0, r1
  1081. 8020e30: bf08 it eq
  1082. 8020e32: 4770 bxeq lr
  1083. 8020e34: f04f 0300 mov.w r3, #0
  1084. 8020e38: e00a b.n 8020e50 <__aeabi_l2f+0x14>
  1085. 8020e3a: bf00 nop
  1086. 08020e3c <__aeabi_l2f>:
  1087. 8020e3c: ea50 0201 orrs.w r2, r0, r1
  1088. 8020e40: bf08 it eq
  1089. 8020e42: 4770 bxeq lr
  1090. 8020e44: f011 4300 ands.w r3, r1, #2147483648 ; 0x80000000
  1091. 8020e48: d502 bpl.n 8020e50 <__aeabi_l2f+0x14>
  1092. 8020e4a: 4240 negs r0, r0
  1093. 8020e4c: eb61 0141 sbc.w r1, r1, r1, lsl #1
  1094. 8020e50: ea5f 0c01 movs.w ip, r1
  1095. 8020e54: bf02 ittt eq
  1096. 8020e56: 4684 moveq ip, r0
  1097. 8020e58: 4601 moveq r1, r0
  1098. 8020e5a: 2000 moveq r0, #0
  1099. 8020e5c: f043 43b6 orr.w r3, r3, #1526726656 ; 0x5b000000
  1100. 8020e60: bf08 it eq
  1101. 8020e62: f1a3 5380 subeq.w r3, r3, #268435456 ; 0x10000000
  1102. 8020e66: f5a3 0300 sub.w r3, r3, #8388608 ; 0x800000
  1103. 8020e6a: fabc f28c clz r2, ip
  1104. 8020e6e: 3a08 subs r2, #8
  1105. 8020e70: eba3 53c2 sub.w r3, r3, r2, lsl #23
  1106. 8020e74: db10 blt.n 8020e98 <__aeabi_l2f+0x5c>
  1107. 8020e76: fa01 fc02 lsl.w ip, r1, r2
  1108. 8020e7a: 4463 add r3, ip
  1109. 8020e7c: fa00 fc02 lsl.w ip, r0, r2
  1110. 8020e80: f1c2 0220 rsb r2, r2, #32
  1111. 8020e84: f1bc 4f00 cmp.w ip, #2147483648 ; 0x80000000
  1112. 8020e88: fa20 f202 lsr.w r2, r0, r2
  1113. 8020e8c: eb43 0002 adc.w r0, r3, r2
  1114. 8020e90: bf08 it eq
  1115. 8020e92: f020 0001 biceq.w r0, r0, #1
  1116. 8020e96: 4770 bx lr
  1117. 8020e98: f102 0220 add.w r2, r2, #32
  1118. 8020e9c: fa01 fc02 lsl.w ip, r1, r2
  1119. 8020ea0: f1c2 0220 rsb r2, r2, #32
  1120. 8020ea4: ea50 004c orrs.w r0, r0, ip, lsl #1
  1121. 8020ea8: fa21 f202 lsr.w r2, r1, r2
  1122. 8020eac: eb43 0002 adc.w r0, r3, r2
  1123. 8020eb0: bf08 it eq
  1124. 8020eb2: ea20 70dc biceq.w r0, r0, ip, lsr #31
  1125. 8020eb6: 4770 bx lr
  1126. 08020eb8 <__aeabi_fmul>:
  1127. 8020eb8: f04f 0cff mov.w ip, #255 ; 0xff
  1128. 8020ebc: ea1c 52d0 ands.w r2, ip, r0, lsr #23
  1129. 8020ec0: bf1e ittt ne
  1130. 8020ec2: ea1c 53d1 andsne.w r3, ip, r1, lsr #23
  1131. 8020ec6: ea92 0f0c teqne r2, ip
  1132. 8020eca: ea93 0f0c teqne r3, ip
  1133. 8020ece: d06f beq.n 8020fb0 <__aeabi_fmul+0xf8>
  1134. 8020ed0: 441a add r2, r3
  1135. 8020ed2: ea80 0c01 eor.w ip, r0, r1
  1136. 8020ed6: 0240 lsls r0, r0, #9
  1137. 8020ed8: bf18 it ne
  1138. 8020eda: ea5f 2141 movsne.w r1, r1, lsl #9
  1139. 8020ede: d01e beq.n 8020f1e <__aeabi_fmul+0x66>
  1140. 8020ee0: f04f 6300 mov.w r3, #134217728 ; 0x8000000
  1141. 8020ee4: ea43 1050 orr.w r0, r3, r0, lsr #5
  1142. 8020ee8: ea43 1151 orr.w r1, r3, r1, lsr #5
  1143. 8020eec: fba0 3101 umull r3, r1, r0, r1
  1144. 8020ef0: f00c 4000 and.w r0, ip, #2147483648 ; 0x80000000
  1145. 8020ef4: f5b1 0f00 cmp.w r1, #8388608 ; 0x800000
  1146. 8020ef8: bf3e ittt cc
  1147. 8020efa: 0049 lslcc r1, r1, #1
  1148. 8020efc: ea41 71d3 orrcc.w r1, r1, r3, lsr #31
  1149. 8020f00: 005b lslcc r3, r3, #1
  1150. 8020f02: ea40 0001 orr.w r0, r0, r1
  1151. 8020f06: f162 027f sbc.w r2, r2, #127 ; 0x7f
  1152. 8020f0a: 2afd cmp r2, #253 ; 0xfd
  1153. 8020f0c: d81d bhi.n 8020f4a <__aeabi_fmul+0x92>
  1154. 8020f0e: f1b3 4f00 cmp.w r3, #2147483648 ; 0x80000000
  1155. 8020f12: eb40 50c2 adc.w r0, r0, r2, lsl #23
  1156. 8020f16: bf08 it eq
  1157. 8020f18: f020 0001 biceq.w r0, r0, #1
  1158. 8020f1c: 4770 bx lr
  1159. 8020f1e: f090 0f00 teq r0, #0
  1160. 8020f22: f00c 4c00 and.w ip, ip, #2147483648 ; 0x80000000
  1161. 8020f26: bf08 it eq
  1162. 8020f28: 0249 lsleq r1, r1, #9
  1163. 8020f2a: ea4c 2050 orr.w r0, ip, r0, lsr #9
  1164. 8020f2e: ea40 2051 orr.w r0, r0, r1, lsr #9
  1165. 8020f32: 3a7f subs r2, #127 ; 0x7f
  1166. 8020f34: bfc2 ittt gt
  1167. 8020f36: f1d2 03ff rsbsgt r3, r2, #255 ; 0xff
  1168. 8020f3a: ea40 50c2 orrgt.w r0, r0, r2, lsl #23
  1169. 8020f3e: 4770 bxgt lr
  1170. 8020f40: f440 0000 orr.w r0, r0, #8388608 ; 0x800000
  1171. 8020f44: f04f 0300 mov.w r3, #0
  1172. 8020f48: 3a01 subs r2, #1
  1173. 8020f4a: dc5d bgt.n 8021008 <__aeabi_fmul+0x150>
  1174. 8020f4c: f112 0f19 cmn.w r2, #25
  1175. 8020f50: bfdc itt le
  1176. 8020f52: f000 4000 andle.w r0, r0, #2147483648 ; 0x80000000
  1177. 8020f56: 4770 bxle lr
  1178. 8020f58: f1c2 0200 rsb r2, r2, #0
  1179. 8020f5c: 0041 lsls r1, r0, #1
  1180. 8020f5e: fa21 f102 lsr.w r1, r1, r2
  1181. 8020f62: f1c2 0220 rsb r2, r2, #32
  1182. 8020f66: fa00 fc02 lsl.w ip, r0, r2
  1183. 8020f6a: ea5f 0031 movs.w r0, r1, rrx
  1184. 8020f6e: f140 0000 adc.w r0, r0, #0
  1185. 8020f72: ea53 034c orrs.w r3, r3, ip, lsl #1
  1186. 8020f76: bf08 it eq
  1187. 8020f78: ea20 70dc biceq.w r0, r0, ip, lsr #31
  1188. 8020f7c: 4770 bx lr
  1189. 8020f7e: f092 0f00 teq r2, #0
  1190. 8020f82: f000 4c00 and.w ip, r0, #2147483648 ; 0x80000000
  1191. 8020f86: bf02 ittt eq
  1192. 8020f88: 0040 lsleq r0, r0, #1
  1193. 8020f8a: f410 0f00 tsteq.w r0, #8388608 ; 0x800000
  1194. 8020f8e: 3a01 subeq r2, #1
  1195. 8020f90: d0f9 beq.n 8020f86 <__aeabi_fmul+0xce>
  1196. 8020f92: ea40 000c orr.w r0, r0, ip
  1197. 8020f96: f093 0f00 teq r3, #0
  1198. 8020f9a: f001 4c00 and.w ip, r1, #2147483648 ; 0x80000000
  1199. 8020f9e: bf02 ittt eq
  1200. 8020fa0: 0049 lsleq r1, r1, #1
  1201. 8020fa2: f411 0f00 tsteq.w r1, #8388608 ; 0x800000
  1202. 8020fa6: 3b01 subeq r3, #1
  1203. 8020fa8: d0f9 beq.n 8020f9e <__aeabi_fmul+0xe6>
  1204. 8020faa: ea41 010c orr.w r1, r1, ip
  1205. 8020fae: e78f b.n 8020ed0 <__aeabi_fmul+0x18>
  1206. 8020fb0: ea0c 53d1 and.w r3, ip, r1, lsr #23
  1207. 8020fb4: ea92 0f0c teq r2, ip
  1208. 8020fb8: bf18 it ne
  1209. 8020fba: ea93 0f0c teqne r3, ip
  1210. 8020fbe: d00a beq.n 8020fd6 <__aeabi_fmul+0x11e>
  1211. 8020fc0: f030 4c00 bics.w ip, r0, #2147483648 ; 0x80000000
  1212. 8020fc4: bf18 it ne
  1213. 8020fc6: f031 4c00 bicsne.w ip, r1, #2147483648 ; 0x80000000
  1214. 8020fca: d1d8 bne.n 8020f7e <__aeabi_fmul+0xc6>
  1215. 8020fcc: ea80 0001 eor.w r0, r0, r1
  1216. 8020fd0: f000 4000 and.w r0, r0, #2147483648 ; 0x80000000
  1217. 8020fd4: 4770 bx lr
  1218. 8020fd6: f090 0f00 teq r0, #0
  1219. 8020fda: bf17 itett ne
  1220. 8020fdc: f090 4f00 teqne r0, #2147483648 ; 0x80000000
  1221. 8020fe0: 4608 moveq r0, r1
  1222. 8020fe2: f091 0f00 teqne r1, #0
  1223. 8020fe6: f091 4f00 teqne r1, #2147483648 ; 0x80000000
  1224. 8020fea: d014 beq.n 8021016 <__aeabi_fmul+0x15e>
  1225. 8020fec: ea92 0f0c teq r2, ip
  1226. 8020ff0: d101 bne.n 8020ff6 <__aeabi_fmul+0x13e>
  1227. 8020ff2: 0242 lsls r2, r0, #9
  1228. 8020ff4: d10f bne.n 8021016 <__aeabi_fmul+0x15e>
  1229. 8020ff6: ea93 0f0c teq r3, ip
  1230. 8020ffa: d103 bne.n 8021004 <__aeabi_fmul+0x14c>
  1231. 8020ffc: 024b lsls r3, r1, #9
  1232. 8020ffe: bf18 it ne
  1233. 8021000: 4608 movne r0, r1
  1234. 8021002: d108 bne.n 8021016 <__aeabi_fmul+0x15e>
  1235. 8021004: ea80 0001 eor.w r0, r0, r1
  1236. 8021008: f000 4000 and.w r0, r0, #2147483648 ; 0x80000000
  1237. 802100c: f040 40fe orr.w r0, r0, #2130706432 ; 0x7f000000
  1238. 8021010: f440 0000 orr.w r0, r0, #8388608 ; 0x800000
  1239. 8021014: 4770 bx lr
  1240. 8021016: f040 40fe orr.w r0, r0, #2130706432 ; 0x7f000000
  1241. 802101a: f440 0040 orr.w r0, r0, #12582912 ; 0xc00000
  1242. 802101e: 4770 bx lr
  1243. 08021020 <__aeabi_fdiv>:
  1244. 8021020: f04f 0cff mov.w ip, #255 ; 0xff
  1245. 8021024: ea1c 52d0 ands.w r2, ip, r0, lsr #23
  1246. 8021028: bf1e ittt ne
  1247. 802102a: ea1c 53d1 andsne.w r3, ip, r1, lsr #23
  1248. 802102e: ea92 0f0c teqne r2, ip
  1249. 8021032: ea93 0f0c teqne r3, ip
  1250. 8021036: d069 beq.n 802110c <__aeabi_fdiv+0xec>
  1251. 8021038: eba2 0203 sub.w r2, r2, r3
  1252. 802103c: ea80 0c01 eor.w ip, r0, r1
  1253. 8021040: 0249 lsls r1, r1, #9
  1254. 8021042: ea4f 2040 mov.w r0, r0, lsl #9
  1255. 8021046: d037 beq.n 80210b8 <__aeabi_fdiv+0x98>
  1256. 8021048: f04f 5380 mov.w r3, #268435456 ; 0x10000000
  1257. 802104c: ea43 1111 orr.w r1, r3, r1, lsr #4
  1258. 8021050: ea43 1310 orr.w r3, r3, r0, lsr #4
  1259. 8021054: f00c 4000 and.w r0, ip, #2147483648 ; 0x80000000
  1260. 8021058: 428b cmp r3, r1
  1261. 802105a: bf38 it cc
  1262. 802105c: 005b lslcc r3, r3, #1
  1263. 802105e: f142 027d adc.w r2, r2, #125 ; 0x7d
  1264. 8021062: f44f 0c00 mov.w ip, #8388608 ; 0x800000
  1265. 8021066: 428b cmp r3, r1
  1266. 8021068: bf24 itt cs
  1267. 802106a: 1a5b subcs r3, r3, r1
  1268. 802106c: ea40 000c orrcs.w r0, r0, ip
  1269. 8021070: ebb3 0f51 cmp.w r3, r1, lsr #1
  1270. 8021074: bf24 itt cs
  1271. 8021076: eba3 0351 subcs.w r3, r3, r1, lsr #1
  1272. 802107a: ea40 005c orrcs.w r0, r0, ip, lsr #1
  1273. 802107e: ebb3 0f91 cmp.w r3, r1, lsr #2
  1274. 8021082: bf24 itt cs
  1275. 8021084: eba3 0391 subcs.w r3, r3, r1, lsr #2
  1276. 8021088: ea40 009c orrcs.w r0, r0, ip, lsr #2
  1277. 802108c: ebb3 0fd1 cmp.w r3, r1, lsr #3
  1278. 8021090: bf24 itt cs
  1279. 8021092: eba3 03d1 subcs.w r3, r3, r1, lsr #3
  1280. 8021096: ea40 00dc orrcs.w r0, r0, ip, lsr #3
  1281. 802109a: 011b lsls r3, r3, #4
  1282. 802109c: bf18 it ne
  1283. 802109e: ea5f 1c1c movsne.w ip, ip, lsr #4
  1284. 80210a2: d1e0 bne.n 8021066 <__aeabi_fdiv+0x46>
  1285. 80210a4: 2afd cmp r2, #253 ; 0xfd
  1286. 80210a6: f63f af50 bhi.w 8020f4a <__aeabi_fmul+0x92>
  1287. 80210aa: 428b cmp r3, r1
  1288. 80210ac: eb40 50c2 adc.w r0, r0, r2, lsl #23
  1289. 80210b0: bf08 it eq
  1290. 80210b2: f020 0001 biceq.w r0, r0, #1
  1291. 80210b6: 4770 bx lr
  1292. 80210b8: f00c 4c00 and.w ip, ip, #2147483648 ; 0x80000000
  1293. 80210bc: ea4c 2050 orr.w r0, ip, r0, lsr #9
  1294. 80210c0: 327f adds r2, #127 ; 0x7f
  1295. 80210c2: bfc2 ittt gt
  1296. 80210c4: f1d2 03ff rsbsgt r3, r2, #255 ; 0xff
  1297. 80210c8: ea40 50c2 orrgt.w r0, r0, r2, lsl #23
  1298. 80210cc: 4770 bxgt lr
  1299. 80210ce: f440 0000 orr.w r0, r0, #8388608 ; 0x800000
  1300. 80210d2: f04f 0300 mov.w r3, #0
  1301. 80210d6: 3a01 subs r2, #1
  1302. 80210d8: e737 b.n 8020f4a <__aeabi_fmul+0x92>
  1303. 80210da: f092 0f00 teq r2, #0
  1304. 80210de: f000 4c00 and.w ip, r0, #2147483648 ; 0x80000000
  1305. 80210e2: bf02 ittt eq
  1306. 80210e4: 0040 lsleq r0, r0, #1
  1307. 80210e6: f410 0f00 tsteq.w r0, #8388608 ; 0x800000
  1308. 80210ea: 3a01 subeq r2, #1
  1309. 80210ec: d0f9 beq.n 80210e2 <__aeabi_fdiv+0xc2>
  1310. 80210ee: ea40 000c orr.w r0, r0, ip
  1311. 80210f2: f093 0f00 teq r3, #0
  1312. 80210f6: f001 4c00 and.w ip, r1, #2147483648 ; 0x80000000
  1313. 80210fa: bf02 ittt eq
  1314. 80210fc: 0049 lsleq r1, r1, #1
  1315. 80210fe: f411 0f00 tsteq.w r1, #8388608 ; 0x800000
  1316. 8021102: 3b01 subeq r3, #1
  1317. 8021104: d0f9 beq.n 80210fa <__aeabi_fdiv+0xda>
  1318. 8021106: ea41 010c orr.w r1, r1, ip
  1319. 802110a: e795 b.n 8021038 <__aeabi_fdiv+0x18>
  1320. 802110c: ea0c 53d1 and.w r3, ip, r1, lsr #23
  1321. 8021110: ea92 0f0c teq r2, ip
  1322. 8021114: d108 bne.n 8021128 <__aeabi_fdiv+0x108>
  1323. 8021116: 0242 lsls r2, r0, #9
  1324. 8021118: f47f af7d bne.w 8021016 <__aeabi_fmul+0x15e>
  1325. 802111c: ea93 0f0c teq r3, ip
  1326. 8021120: f47f af70 bne.w 8021004 <__aeabi_fmul+0x14c>
  1327. 8021124: 4608 mov r0, r1
  1328. 8021126: e776 b.n 8021016 <__aeabi_fmul+0x15e>
  1329. 8021128: ea93 0f0c teq r3, ip
  1330. 802112c: d104 bne.n 8021138 <__aeabi_fdiv+0x118>
  1331. 802112e: 024b lsls r3, r1, #9
  1332. 8021130: f43f af4c beq.w 8020fcc <__aeabi_fmul+0x114>
  1333. 8021134: 4608 mov r0, r1
  1334. 8021136: e76e b.n 8021016 <__aeabi_fmul+0x15e>
  1335. 8021138: f030 4c00 bics.w ip, r0, #2147483648 ; 0x80000000
  1336. 802113c: bf18 it ne
  1337. 802113e: f031 4c00 bicsne.w ip, r1, #2147483648 ; 0x80000000
  1338. 8021142: d1ca bne.n 80210da <__aeabi_fdiv+0xba>
  1339. 8021144: f030 4200 bics.w r2, r0, #2147483648 ; 0x80000000
  1340. 8021148: f47f af5c bne.w 8021004 <__aeabi_fmul+0x14c>
  1341. 802114c: f031 4300 bics.w r3, r1, #2147483648 ; 0x80000000
  1342. 8021150: f47f af3c bne.w 8020fcc <__aeabi_fmul+0x114>
  1343. 8021154: e75f b.n 8021016 <__aeabi_fmul+0x15e>
  1344. 8021156: bf00 nop
  1345. 08021158 <__gesf2>:
  1346. 8021158: f04f 3cff mov.w ip, #4294967295
  1347. 802115c: e006 b.n 802116c <__cmpsf2+0x4>
  1348. 802115e: bf00 nop
  1349. 08021160 <__lesf2>:
  1350. 8021160: f04f 0c01 mov.w ip, #1
  1351. 8021164: e002 b.n 802116c <__cmpsf2+0x4>
  1352. 8021166: bf00 nop
  1353. 08021168 <__cmpsf2>:
  1354. 8021168: f04f 0c01 mov.w ip, #1
  1355. 802116c: f84d cd04 str.w ip, [sp, #-4]!
  1356. 8021170: ea4f 0240 mov.w r2, r0, lsl #1
  1357. 8021174: ea4f 0341 mov.w r3, r1, lsl #1
  1358. 8021178: ea7f 6c22 mvns.w ip, r2, asr #24
  1359. 802117c: bf18 it ne
  1360. 802117e: ea7f 6c23 mvnsne.w ip, r3, asr #24
  1361. 8021182: d011 beq.n 80211a8 <__cmpsf2+0x40>
  1362. 8021184: b001 add sp, #4
  1363. 8021186: ea52 0c53 orrs.w ip, r2, r3, lsr #1
  1364. 802118a: bf18 it ne
  1365. 802118c: ea90 0f01 teqne r0, r1
  1366. 8021190: bf58 it pl
  1367. 8021192: ebb2 0003 subspl.w r0, r2, r3
  1368. 8021196: bf88 it hi
  1369. 8021198: 17c8 asrhi r0, r1, #31
  1370. 802119a: bf38 it cc
  1371. 802119c: ea6f 70e1 mvncc.w r0, r1, asr #31
  1372. 80211a0: bf18 it ne
  1373. 80211a2: f040 0001 orrne.w r0, r0, #1
  1374. 80211a6: 4770 bx lr
  1375. 80211a8: ea7f 6c22 mvns.w ip, r2, asr #24
  1376. 80211ac: d102 bne.n 80211b4 <__cmpsf2+0x4c>
  1377. 80211ae: ea5f 2c40 movs.w ip, r0, lsl #9
  1378. 80211b2: d105 bne.n 80211c0 <__cmpsf2+0x58>
  1379. 80211b4: ea7f 6c23 mvns.w ip, r3, asr #24
  1380. 80211b8: d1e4 bne.n 8021184 <__cmpsf2+0x1c>
  1381. 80211ba: ea5f 2c41 movs.w ip, r1, lsl #9
  1382. 80211be: d0e1 beq.n 8021184 <__cmpsf2+0x1c>
  1383. 80211c0: f85d 0b04 ldr.w r0, [sp], #4
  1384. 80211c4: 4770 bx lr
  1385. 80211c6: bf00 nop
  1386. 080211c8 <__aeabi_cfrcmple>:
  1387. 80211c8: 4684 mov ip, r0
  1388. 80211ca: 4608 mov r0, r1
  1389. 80211cc: 4661 mov r1, ip
  1390. 80211ce: e7ff b.n 80211d0 <__aeabi_cfcmpeq>
  1391. 080211d0 <__aeabi_cfcmpeq>:
  1392. 80211d0: b50f push {r0, r1, r2, r3, lr}
  1393. 80211d2: f7ff ffc9 bl 8021168 <__cmpsf2>
  1394. 80211d6: 2800 cmp r0, #0
  1395. 80211d8: bf48 it mi
  1396. 80211da: f110 0f00 cmnmi.w r0, #0
  1397. 80211de: bd0f pop {r0, r1, r2, r3, pc}
  1398. 080211e0 <__aeabi_fcmpeq>:
  1399. 80211e0: f84d ed08 str.w lr, [sp, #-8]!
  1400. 80211e4: f7ff fff4 bl 80211d0 <__aeabi_cfcmpeq>
  1401. 80211e8: bf0c ite eq
  1402. 80211ea: 2001 moveq r0, #1
  1403. 80211ec: 2000 movne r0, #0
  1404. 80211ee: f85d fb08 ldr.w pc, [sp], #8
  1405. 80211f2: bf00 nop
  1406. 080211f4 <__aeabi_fcmplt>:
  1407. 80211f4: f84d ed08 str.w lr, [sp, #-8]!
  1408. 80211f8: f7ff ffea bl 80211d0 <__aeabi_cfcmpeq>
  1409. 80211fc: bf34 ite cc
  1410. 80211fe: 2001 movcc r0, #1
  1411. 8021200: 2000 movcs r0, #0
  1412. 8021202: f85d fb08 ldr.w pc, [sp], #8
  1413. 8021206: bf00 nop
  1414. 08021208 <__aeabi_fcmple>:
  1415. 8021208: f84d ed08 str.w lr, [sp, #-8]!
  1416. 802120c: f7ff ffe0 bl 80211d0 <__aeabi_cfcmpeq>
  1417. 8021210: bf94 ite ls
  1418. 8021212: 2001 movls r0, #1
  1419. 8021214: 2000 movhi r0, #0
  1420. 8021216: f85d fb08 ldr.w pc, [sp], #8
  1421. 802121a: bf00 nop
  1422. 0802121c <__aeabi_fcmpge>:
  1423. 802121c: f84d ed08 str.w lr, [sp, #-8]!
  1424. 8021220: f7ff ffd2 bl 80211c8 <__aeabi_cfrcmple>
  1425. 8021224: bf94 ite ls
  1426. 8021226: 2001 movls r0, #1
  1427. 8021228: 2000 movhi r0, #0
  1428. 802122a: f85d fb08 ldr.w pc, [sp], #8
  1429. 802122e: bf00 nop
  1430. 08021230 <__aeabi_fcmpgt>:
  1431. 8021230: f84d ed08 str.w lr, [sp, #-8]!
  1432. 8021234: f7ff ffc8 bl 80211c8 <__aeabi_cfrcmple>
  1433. 8021238: bf34 ite cc
  1434. 802123a: 2001 movcc r0, #1
  1435. 802123c: 2000 movcs r0, #0
  1436. 802123e: f85d fb08 ldr.w pc, [sp], #8
  1437. 8021242: bf00 nop
  1438. 08021244 <__aeabi_uldivmod>:
  1439. 8021244: b94b cbnz r3, 802125a <__aeabi_uldivmod+0x16>
  1440. 8021246: b942 cbnz r2, 802125a <__aeabi_uldivmod+0x16>
  1441. 8021248: 2900 cmp r1, #0
  1442. 802124a: bf08 it eq
  1443. 802124c: 2800 cmpeq r0, #0
  1444. 802124e: d002 beq.n 8021256 <__aeabi_uldivmod+0x12>
  1445. 8021250: f04f 31ff mov.w r1, #4294967295
  1446. 8021254: 4608 mov r0, r1
  1447. 8021256: f000 b83b b.w 80212d0 <__aeabi_idiv0>
  1448. 802125a: b082 sub sp, #8
  1449. 802125c: 46ec mov ip, sp
  1450. 802125e: e92d 5000 stmdb sp!, {ip, lr}
  1451. 8021262: f000 f81d bl 80212a0 <__gnu_uldivmod_helper>
  1452. 8021266: f8dd e004 ldr.w lr, [sp, #4]
  1453. 802126a: b002 add sp, #8
  1454. 802126c: bc0c pop {r2, r3}
  1455. 802126e: 4770 bx lr
  1456. 08021270 <__gnu_ldivmod_helper>:
  1457. 8021270: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr}
  1458. 8021274: 4690 mov r8, r2
  1459. 8021276: 4699 mov r9, r3
  1460. 8021278: 4606 mov r6, r0
  1461. 802127a: 460f mov r7, r1
  1462. 802127c: f000 f82a bl 80212d4 <__divdi3>
  1463. 8021280: 9b08 ldr r3, [sp, #32]
  1464. 8021282: fba8 4500 umull r4, r5, r8, r0
  1465. 8021286: fb08 f801 mul.w r8, r8, r1
  1466. 802128a: fb00 8209 mla r2, r0, r9, r8
  1467. 802128e: 1955 adds r5, r2, r5
  1468. 8021290: 1b34 subs r4, r6, r4
  1469. 8021292: eb67 0505 sbc.w r5, r7, r5
  1470. 8021296: e9c3 4500 strd r4, r5, [r3]
  1471. 802129a: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc}
  1472. 802129e: bf00 nop
  1473. 080212a0 <__gnu_uldivmod_helper>:
  1474. 80212a0: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  1475. 80212a4: 4690 mov r8, r2
  1476. 80212a6: 4606 mov r6, r0
  1477. 80212a8: 460f mov r7, r1
  1478. 80212aa: 461d mov r5, r3
  1479. 80212ac: f000 f9c8 bl 8021640 <__udivdi3>
  1480. 80212b0: fb00 f305 mul.w r3, r0, r5
  1481. 80212b4: fba0 4508 umull r4, r5, r0, r8
  1482. 80212b8: fb08 3801 mla r8, r8, r1, r3
  1483. 80212bc: 9b06 ldr r3, [sp, #24]
  1484. 80212be: 4445 add r5, r8
  1485. 80212c0: 1b34 subs r4, r6, r4
  1486. 80212c2: eb67 0505 sbc.w r5, r7, r5
  1487. 80212c6: e9c3 4500 strd r4, r5, [r3]
  1488. 80212ca: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  1489. 80212ce: bf00 nop
  1490. 080212d0 <__aeabi_idiv0>:
  1491. 80212d0: 4770 bx lr
  1492. 80212d2: bf00 nop
  1493. 080212d4 <__divdi3>:
  1494. 80212d4: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  1495. 80212d8: 2500 movs r5, #0
  1496. 80212da: 2900 cmp r1, #0
  1497. 80212dc: b085 sub sp, #20
  1498. 80212de: 461c mov r4, r3
  1499. 80212e0: f2c0 8149 blt.w 8021576 <__divdi3+0x2a2>
  1500. 80212e4: 2c00 cmp r4, #0
  1501. 80212e6: f2c0 8141 blt.w 802156c <__divdi3+0x298>
  1502. 80212ea: 468c mov ip, r1
  1503. 80212ec: 460f mov r7, r1
  1504. 80212ee: 4682 mov sl, r0
  1505. 80212f0: 4691 mov r9, r2
  1506. 80212f2: 4614 mov r4, r2
  1507. 80212f4: 4606 mov r6, r0
  1508. 80212f6: 4619 mov r1, r3
  1509. 80212f8: 2b00 cmp r3, #0
  1510. 80212fa: d14b bne.n 8021394 <__divdi3+0xc0>
  1511. 80212fc: 4562 cmp r2, ip
  1512. 80212fe: d959 bls.n 80213b4 <__divdi3+0xe0>
  1513. 8021300: fab2 f382 clz r3, r2
  1514. 8021304: b143 cbz r3, 8021318 <__divdi3+0x44>
  1515. 8021306: f1c3 0220 rsb r2, r3, #32
  1516. 802130a: fa0c f703 lsl.w r7, ip, r3
  1517. 802130e: fa20 f202 lsr.w r2, r0, r2
  1518. 8021312: 409c lsls r4, r3
  1519. 8021314: 4317 orrs r7, r2
  1520. 8021316: 409e lsls r6, r3
  1521. 8021318: ea4f 4814 mov.w r8, r4, lsr #16
  1522. 802131c: 4638 mov r0, r7
  1523. 802131e: 4641 mov r1, r8
  1524. 8021320: fa1f f984 uxth.w r9, r4
  1525. 8021324: f000 fb18 bl 8021958 <__aeabi_uidiv>
  1526. 8021328: 4641 mov r1, r8
  1527. 802132a: 4682 mov sl, r0
  1528. 802132c: 4638 mov r0, r7
  1529. 802132e: f000 fc41 bl 8021bb4 <__aeabi_uidivmod>
  1530. 8021332: 0c33 lsrs r3, r6, #16
  1531. 8021334: fb09 f00a mul.w r0, r9, sl
  1532. 8021338: ea43 4101 orr.w r1, r3, r1, lsl #16
  1533. 802133c: 4288 cmp r0, r1
  1534. 802133e: d90a bls.n 8021356 <__divdi3+0x82>
  1535. 8021340: 1909 adds r1, r1, r4
  1536. 8021342: f10a 32ff add.w r2, sl, #4294967295
  1537. 8021346: d205 bcs.n 8021354 <__divdi3+0x80>
  1538. 8021348: 4288 cmp r0, r1
  1539. 802134a: bf84 itt hi
  1540. 802134c: f1aa 0a02 subhi.w sl, sl, #2
  1541. 8021350: 1909 addhi r1, r1, r4
  1542. 8021352: d800 bhi.n 8021356 <__divdi3+0x82>
  1543. 8021354: 4692 mov sl, r2
  1544. 8021356: ebc0 0b01 rsb fp, r0, r1
  1545. 802135a: 4641 mov r1, r8
  1546. 802135c: 4658 mov r0, fp
  1547. 802135e: b2b6 uxth r6, r6
  1548. 8021360: f000 fafa bl 8021958 <__aeabi_uidiv>
  1549. 8021364: 4641 mov r1, r8
  1550. 8021366: 4607 mov r7, r0
  1551. 8021368: 4658 mov r0, fp
  1552. 802136a: f000 fc23 bl 8021bb4 <__aeabi_uidivmod>
  1553. 802136e: fb09 f907 mul.w r9, r9, r7
  1554. 8021372: ea46 4101 orr.w r1, r6, r1, lsl #16
  1555. 8021376: 4589 cmp r9, r1
  1556. 8021378: d907 bls.n 802138a <__divdi3+0xb6>
  1557. 802137a: 1e7b subs r3, r7, #1
  1558. 802137c: 190c adds r4, r1, r4
  1559. 802137e: f080 8157 bcs.w 8021630 <__divdi3+0x35c>
  1560. 8021382: 3f02 subs r7, #2
  1561. 8021384: 45a1 cmp r9, r4
  1562. 8021386: f240 8153 bls.w 8021630 <__divdi3+0x35c>
  1563. 802138a: ea47 400a orr.w r0, r7, sl, lsl #16
  1564. 802138e: f04f 0800 mov.w r8, #0
  1565. 8021392: e004 b.n 802139e <__divdi3+0xca>
  1566. 8021394: 4563 cmp r3, ip
  1567. 8021396: d958 bls.n 802144a <__divdi3+0x176>
  1568. 8021398: f04f 0800 mov.w r8, #0
  1569. 802139c: 4640 mov r0, r8
  1570. 802139e: 4602 mov r2, r0
  1571. 80213a0: 4643 mov r3, r8
  1572. 80213a2: b115 cbz r5, 80213aa <__divdi3+0xd6>
  1573. 80213a4: 4252 negs r2, r2
  1574. 80213a6: eb63 0343 sbc.w r3, r3, r3, lsl #1
  1575. 80213aa: 4610 mov r0, r2
  1576. 80213ac: 4619 mov r1, r3
  1577. 80213ae: b005 add sp, #20
  1578. 80213b0: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  1579. 80213b4: b922 cbnz r2, 80213c0 <__divdi3+0xec>
  1580. 80213b6: 2001 movs r0, #1
  1581. 80213b8: 4611 mov r1, r2
  1582. 80213ba: f000 facd bl 8021958 <__aeabi_uidiv>
  1583. 80213be: 4604 mov r4, r0
  1584. 80213c0: fab4 f384 clz r3, r4
  1585. 80213c4: 2b00 cmp r3, #0
  1586. 80213c6: f040 80dc bne.w 8021582 <__divdi3+0x2ae>
  1587. 80213ca: 1b3f subs r7, r7, r4
  1588. 80213cc: ea4f 4914 mov.w r9, r4, lsr #16
  1589. 80213d0: fa1f fa84 uxth.w sl, r4
  1590. 80213d4: f04f 0801 mov.w r8, #1
  1591. 80213d8: 4649 mov r1, r9
  1592. 80213da: 4638 mov r0, r7
  1593. 80213dc: f000 fabc bl 8021958 <__aeabi_uidiv>
  1594. 80213e0: 4649 mov r1, r9
  1595. 80213e2: 4683 mov fp, r0
  1596. 80213e4: 4638 mov r0, r7
  1597. 80213e6: f000 fbe5 bl 8021bb4 <__aeabi_uidivmod>
  1598. 80213ea: 0c33 lsrs r3, r6, #16
  1599. 80213ec: fb0a f00b mul.w r0, sl, fp
  1600. 80213f0: ea43 4101 orr.w r1, r3, r1, lsl #16
  1601. 80213f4: 4288 cmp r0, r1
  1602. 80213f6: d90b bls.n 8021410 <__divdi3+0x13c>
  1603. 80213f8: 1909 adds r1, r1, r4
  1604. 80213fa: f10b 33ff add.w r3, fp, #4294967295
  1605. 80213fe: f080 8115 bcs.w 802162c <__divdi3+0x358>
  1606. 8021402: 4288 cmp r0, r1
  1607. 8021404: bf84 itt hi
  1608. 8021406: f1ab 0b02 subhi.w fp, fp, #2
  1609. 802140a: 1909 addhi r1, r1, r4
  1610. 802140c: f240 810e bls.w 802162c <__divdi3+0x358>
  1611. 8021410: 1a0b subs r3, r1, r0
  1612. 8021412: 4649 mov r1, r9
  1613. 8021414: 4618 mov r0, r3
  1614. 8021416: 9301 str r3, [sp, #4]
  1615. 8021418: f000 fa9e bl 8021958 <__aeabi_uidiv>
  1616. 802141c: 9b01 ldr r3, [sp, #4]
  1617. 802141e: 4649 mov r1, r9
  1618. 8021420: b2b6 uxth r6, r6
  1619. 8021422: 4607 mov r7, r0
  1620. 8021424: 4618 mov r0, r3
  1621. 8021426: f000 fbc5 bl 8021bb4 <__aeabi_uidivmod>
  1622. 802142a: fb0a fa07 mul.w sl, sl, r7
  1623. 802142e: ea46 4101 orr.w r1, r6, r1, lsl #16
  1624. 8021432: 458a cmp sl, r1
  1625. 8021434: d906 bls.n 8021444 <__divdi3+0x170>
  1626. 8021436: 1e7b subs r3, r7, #1
  1627. 8021438: 190c adds r4, r1, r4
  1628. 802143a: d202 bcs.n 8021442 <__divdi3+0x16e>
  1629. 802143c: 3f02 subs r7, #2
  1630. 802143e: 45a2 cmp sl, r4
  1631. 8021440: d800 bhi.n 8021444 <__divdi3+0x170>
  1632. 8021442: 461f mov r7, r3
  1633. 8021444: ea47 400b orr.w r0, r7, fp, lsl #16
  1634. 8021448: e7a9 b.n 802139e <__divdi3+0xca>
  1635. 802144a: fab3 f483 clz r4, r3
  1636. 802144e: 2c00 cmp r4, #0
  1637. 8021450: f000 80e4 beq.w 802161c <__divdi3+0x348>
  1638. 8021454: f1c4 0320 rsb r3, r4, #32
  1639. 8021458: fa01 f104 lsl.w r1, r1, r4
  1640. 802145c: fa22 fa03 lsr.w sl, r2, r3
  1641. 8021460: fa2c fb03 lsr.w fp, ip, r3
  1642. 8021464: ea4a 0a01 orr.w sl, sl, r1
  1643. 8021468: fa20 f803 lsr.w r8, r0, r3
  1644. 802146c: fa0c fc04 lsl.w ip, ip, r4
  1645. 8021470: 4658 mov r0, fp
  1646. 8021472: ea4f 471a mov.w r7, sl, lsr #16
  1647. 8021476: ea48 080c orr.w r8, r8, ip
  1648. 802147a: 4639 mov r1, r7
  1649. 802147c: fa02 f904 lsl.w r9, r2, r4
  1650. 8021480: f8cd 900c str.w r9, [sp, #12]
  1651. 8021484: f000 fa68 bl 8021958 <__aeabi_uidiv>
  1652. 8021488: 4639 mov r1, r7
  1653. 802148a: 4681 mov r9, r0
  1654. 802148c: 4658 mov r0, fp
  1655. 802148e: f000 fb91 bl 8021bb4 <__aeabi_uidivmod>
  1656. 8021492: fa1f fc8a uxth.w ip, sl
  1657. 8021496: ea4f 4318 mov.w r3, r8, lsr #16
  1658. 802149a: fb0c f009 mul.w r0, ip, r9
  1659. 802149e: ea43 4301 orr.w r3, r3, r1, lsl #16
  1660. 80214a2: 4298 cmp r0, r3
  1661. 80214a4: d90c bls.n 80214c0 <__divdi3+0x1ec>
  1662. 80214a6: eb13 030a adds.w r3, r3, sl
  1663. 80214aa: f109 31ff add.w r1, r9, #4294967295
  1664. 80214ae: f080 80c3 bcs.w 8021638 <__divdi3+0x364>
  1665. 80214b2: 4298 cmp r0, r3
  1666. 80214b4: bf84 itt hi
  1667. 80214b6: f1a9 0902 subhi.w r9, r9, #2
  1668. 80214ba: 4453 addhi r3, sl
  1669. 80214bc: f240 80bc bls.w 8021638 <__divdi3+0x364>
  1670. 80214c0: 1a1b subs r3, r3, r0
  1671. 80214c2: 4639 mov r1, r7
  1672. 80214c4: 4618 mov r0, r3
  1673. 80214c6: f8cd c008 str.w ip, [sp, #8]
  1674. 80214ca: 9301 str r3, [sp, #4]
  1675. 80214cc: f000 fa44 bl 8021958 <__aeabi_uidiv>
  1676. 80214d0: 9b01 ldr r3, [sp, #4]
  1677. 80214d2: 4639 mov r1, r7
  1678. 80214d4: fa1f f888 uxth.w r8, r8
  1679. 80214d8: 4683 mov fp, r0
  1680. 80214da: 4618 mov r0, r3
  1681. 80214dc: f000 fb6a bl 8021bb4 <__aeabi_uidivmod>
  1682. 80214e0: f8dd c008 ldr.w ip, [sp, #8]
  1683. 80214e4: fb0c f30b mul.w r3, ip, fp
  1684. 80214e8: ea48 4101 orr.w r1, r8, r1, lsl #16
  1685. 80214ec: 428b cmp r3, r1
  1686. 80214ee: d90c bls.n 802150a <__divdi3+0x236>
  1687. 80214f0: eb11 010a adds.w r1, r1, sl
  1688. 80214f4: f10b 30ff add.w r0, fp, #4294967295
  1689. 80214f8: f080 809c bcs.w 8021634 <__divdi3+0x360>
  1690. 80214fc: 428b cmp r3, r1
  1691. 80214fe: bf84 itt hi
  1692. 8021500: f1ab 0b02 subhi.w fp, fp, #2
  1693. 8021504: 4451 addhi r1, sl
  1694. 8021506: f240 8095 bls.w 8021634 <__divdi3+0x360>
  1695. 802150a: 9f03 ldr r7, [sp, #12]
  1696. 802150c: ea4b 4009 orr.w r0, fp, r9, lsl #16
  1697. 8021510: 1ac9 subs r1, r1, r3
  1698. 8021512: fa1f fc80 uxth.w ip, r0
  1699. 8021516: b2ba uxth r2, r7
  1700. 8021518: ea4f 4917 mov.w r9, r7, lsr #16
  1701. 802151c: 0c07 lsrs r7, r0, #16
  1702. 802151e: fb02 f80c mul.w r8, r2, ip
  1703. 8021522: fb02 f207 mul.w r2, r2, r7
  1704. 8021526: fb09 230c mla r3, r9, ip, r2
  1705. 802152a: fb09 f907 mul.w r9, r9, r7
  1706. 802152e: eb03 4318 add.w r3, r3, r8, lsr #16
  1707. 8021532: 429a cmp r2, r3
  1708. 8021534: bf88 it hi
  1709. 8021536: f509 3980 addhi.w r9, r9, #65536 ; 0x10000
  1710. 802153a: eb09 4913 add.w r9, r9, r3, lsr #16
  1711. 802153e: 4549 cmp r1, r9
  1712. 8021540: d310 bcc.n 8021564 <__divdi3+0x290>
  1713. 8021542: fa1f f888 uxth.w r8, r8
  1714. 8021546: bf14 ite ne
  1715. 8021548: 2200 movne r2, #0
  1716. 802154a: 2201 moveq r2, #1
  1717. 802154c: fa06 f404 lsl.w r4, r6, r4
  1718. 8021550: eb08 4303 add.w r3, r8, r3, lsl #16
  1719. 8021554: 429c cmp r4, r3
  1720. 8021556: bf2c ite cs
  1721. 8021558: 2300 movcs r3, #0
  1722. 802155a: f002 0301 andcc.w r3, r2, #1
  1723. 802155e: 2b00 cmp r3, #0
  1724. 8021560: f43f af15 beq.w 802138e <__divdi3+0xba>
  1725. 8021564: 3801 subs r0, #1
  1726. 8021566: f04f 0800 mov.w r8, #0
  1727. 802156a: e718 b.n 802139e <__divdi3+0xca>
  1728. 802156c: 4252 negs r2, r2
  1729. 802156e: eb63 0343 sbc.w r3, r3, r3, lsl #1
  1730. 8021572: 43ed mvns r5, r5
  1731. 8021574: e6b9 b.n 80212ea <__divdi3+0x16>
  1732. 8021576: 4240 negs r0, r0
  1733. 8021578: eb61 0141 sbc.w r1, r1, r1, lsl #1
  1734. 802157c: f04f 35ff mov.w r5, #4294967295
  1735. 8021580: e6b0 b.n 80212e4 <__divdi3+0x10>
  1736. 8021582: 409c lsls r4, r3
  1737. 8021584: f1c3 0b20 rsb fp, r3, #32
  1738. 8021588: fa27 f80b lsr.w r8, r7, fp
  1739. 802158c: fa07 f703 lsl.w r7, r7, r3
  1740. 8021590: ea4f 4914 mov.w r9, r4, lsr #16
  1741. 8021594: 4640 mov r0, r8
  1742. 8021596: 4649 mov r1, r9
  1743. 8021598: fa26 fb0b lsr.w fp, r6, fp
  1744. 802159c: 409e lsls r6, r3
  1745. 802159e: f000 f9db bl 8021958 <__aeabi_uidiv>
  1746. 80215a2: 4649 mov r1, r9
  1747. 80215a4: fa1f fa84 uxth.w sl, r4
  1748. 80215a8: ea4b 0b07 orr.w fp, fp, r7
  1749. 80215ac: 4603 mov r3, r0
  1750. 80215ae: 4640 mov r0, r8
  1751. 80215b0: 9301 str r3, [sp, #4]
  1752. 80215b2: f000 faff bl 8021bb4 <__aeabi_uidivmod>
  1753. 80215b6: 9b01 ldr r3, [sp, #4]
  1754. 80215b8: ea4f 421b mov.w r2, fp, lsr #16
  1755. 80215bc: fb0a f003 mul.w r0, sl, r3
  1756. 80215c0: ea42 4101 orr.w r1, r2, r1, lsl #16
  1757. 80215c4: 4288 cmp r0, r1
  1758. 80215c6: d906 bls.n 80215d6 <__divdi3+0x302>
  1759. 80215c8: 1e5a subs r2, r3, #1
  1760. 80215ca: 1909 adds r1, r1, r4
  1761. 80215cc: d236 bcs.n 802163c <__divdi3+0x368>
  1762. 80215ce: 4288 cmp r0, r1
  1763. 80215d0: d934 bls.n 802163c <__divdi3+0x368>
  1764. 80215d2: 3b02 subs r3, #2
  1765. 80215d4: 1909 adds r1, r1, r4
  1766. 80215d6: 1a0f subs r7, r1, r0
  1767. 80215d8: 4649 mov r1, r9
  1768. 80215da: 4638 mov r0, r7
  1769. 80215dc: 9301 str r3, [sp, #4]
  1770. 80215de: f000 f9bb bl 8021958 <__aeabi_uidiv>
  1771. 80215e2: 4649 mov r1, r9
  1772. 80215e4: fa1f fb8b uxth.w fp, fp
  1773. 80215e8: 4680 mov r8, r0
  1774. 80215ea: 4638 mov r0, r7
  1775. 80215ec: f000 fae2 bl 8021bb4 <__aeabi_uidivmod>
  1776. 80215f0: 9b01 ldr r3, [sp, #4]
  1777. 80215f2: fb0a f708 mul.w r7, sl, r8
  1778. 80215f6: ea4b 4101 orr.w r1, fp, r1, lsl #16
  1779. 80215fa: 428f cmp r7, r1
  1780. 80215fc: d90a bls.n 8021614 <__divdi3+0x340>
  1781. 80215fe: 1909 adds r1, r1, r4
  1782. 8021600: f108 32ff add.w r2, r8, #4294967295
  1783. 8021604: d205 bcs.n 8021612 <__divdi3+0x33e>
  1784. 8021606: 428f cmp r7, r1
  1785. 8021608: bf84 itt hi
  1786. 802160a: f1a8 0802 subhi.w r8, r8, #2
  1787. 802160e: 1909 addhi r1, r1, r4
  1788. 8021610: d800 bhi.n 8021614 <__divdi3+0x340>
  1789. 8021612: 4690 mov r8, r2
  1790. 8021614: 1bcf subs r7, r1, r7
  1791. 8021616: ea48 4803 orr.w r8, r8, r3, lsl #16
  1792. 802161a: e6dd b.n 80213d8 <__divdi3+0x104>
  1793. 802161c: 2001 movs r0, #1
  1794. 802161e: 4563 cmp r3, ip
  1795. 8021620: bf28 it cs
  1796. 8021622: 4552 cmpcs r2, sl
  1797. 8021624: 46a0 mov r8, r4
  1798. 8021626: f67f aeba bls.w 802139e <__divdi3+0xca>
  1799. 802162a: e6b5 b.n 8021398 <__divdi3+0xc4>
  1800. 802162c: 469b mov fp, r3
  1801. 802162e: e6ef b.n 8021410 <__divdi3+0x13c>
  1802. 8021630: 461f mov r7, r3
  1803. 8021632: e6aa b.n 802138a <__divdi3+0xb6>
  1804. 8021634: 4683 mov fp, r0
  1805. 8021636: e768 b.n 802150a <__divdi3+0x236>
  1806. 8021638: 4689 mov r9, r1
  1807. 802163a: e741 b.n 80214c0 <__divdi3+0x1ec>
  1808. 802163c: 4613 mov r3, r2
  1809. 802163e: e7ca b.n 80215d6 <__divdi3+0x302>
  1810. 08021640 <__udivdi3>:
  1811. 8021640: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  1812. 8021644: 4606 mov r6, r0
  1813. 8021646: b083 sub sp, #12
  1814. 8021648: 460d mov r5, r1
  1815. 802164a: 4614 mov r4, r2
  1816. 802164c: 4607 mov r7, r0
  1817. 802164e: 4688 mov r8, r1
  1818. 8021650: 2b00 cmp r3, #0
  1819. 8021652: d14a bne.n 80216ea <__udivdi3+0xaa>
  1820. 8021654: 428a cmp r2, r1
  1821. 8021656: d955 bls.n 8021704 <__udivdi3+0xc4>
  1822. 8021658: fab2 f382 clz r3, r2
  1823. 802165c: b14b cbz r3, 8021672 <__udivdi3+0x32>
  1824. 802165e: f1c3 0220 rsb r2, r3, #32
  1825. 8021662: fa01 f803 lsl.w r8, r1, r3
  1826. 8021666: fa20 f202 lsr.w r2, r0, r2
  1827. 802166a: 409c lsls r4, r3
  1828. 802166c: ea42 0808 orr.w r8, r2, r8
  1829. 8021670: 409f lsls r7, r3
  1830. 8021672: 0c25 lsrs r5, r4, #16
  1831. 8021674: 4640 mov r0, r8
  1832. 8021676: 4629 mov r1, r5
  1833. 8021678: fa1f fa84 uxth.w sl, r4
  1834. 802167c: f000 f96c bl 8021958 <__aeabi_uidiv>
  1835. 8021680: 4629 mov r1, r5
  1836. 8021682: 4681 mov r9, r0
  1837. 8021684: 4640 mov r0, r8
  1838. 8021686: f000 fa95 bl 8021bb4 <__aeabi_uidivmod>
  1839. 802168a: 0c3b lsrs r3, r7, #16
  1840. 802168c: fb0a f009 mul.w r0, sl, r9
  1841. 8021690: ea43 4101 orr.w r1, r3, r1, lsl #16
  1842. 8021694: 4288 cmp r0, r1
  1843. 8021696: d90a bls.n 80216ae <__udivdi3+0x6e>
  1844. 8021698: 1909 adds r1, r1, r4
  1845. 802169a: f109 32ff add.w r2, r9, #4294967295
  1846. 802169e: d205 bcs.n 80216ac <__udivdi3+0x6c>
  1847. 80216a0: 4288 cmp r0, r1
  1848. 80216a2: bf84 itt hi
  1849. 80216a4: f1a9 0902 subhi.w r9, r9, #2
  1850. 80216a8: 1909 addhi r1, r1, r4
  1851. 80216aa: d800 bhi.n 80216ae <__udivdi3+0x6e>
  1852. 80216ac: 4691 mov r9, r2
  1853. 80216ae: ebc0 0801 rsb r8, r0, r1
  1854. 80216b2: 4629 mov r1, r5
  1855. 80216b4: 4640 mov r0, r8
  1856. 80216b6: b2bf uxth r7, r7
  1857. 80216b8: f000 f94e bl 8021958 <__aeabi_uidiv>
  1858. 80216bc: 4629 mov r1, r5
  1859. 80216be: 4606 mov r6, r0
  1860. 80216c0: 4640 mov r0, r8
  1861. 80216c2: f000 fa77 bl 8021bb4 <__aeabi_uidivmod>
  1862. 80216c6: fb0a fa06 mul.w sl, sl, r6
  1863. 80216ca: ea47 4101 orr.w r1, r7, r1, lsl #16
  1864. 80216ce: 458a cmp sl, r1
  1865. 80216d0: d907 bls.n 80216e2 <__udivdi3+0xa2>
  1866. 80216d2: 1e73 subs r3, r6, #1
  1867. 80216d4: 190c adds r4, r1, r4
  1868. 80216d6: f080 8122 bcs.w 802191e <__udivdi3+0x2de>
  1869. 80216da: 3e02 subs r6, #2
  1870. 80216dc: 45a2 cmp sl, r4
  1871. 80216de: f240 811e bls.w 802191e <__udivdi3+0x2de>
  1872. 80216e2: ea46 4009 orr.w r0, r6, r9, lsl #16
  1873. 80216e6: 2600 movs r6, #0
  1874. 80216e8: e058 b.n 802179c <__udivdi3+0x15c>
  1875. 80216ea: 428b cmp r3, r1
  1876. 80216ec: d854 bhi.n 8021798 <__udivdi3+0x158>
  1877. 80216ee: fab3 f483 clz r4, r3
  1878. 80216f2: 2c00 cmp r4, #0
  1879. 80216f4: d156 bne.n 80217a4 <__udivdi3+0x164>
  1880. 80216f6: 428b cmp r3, r1
  1881. 80216f8: bf28 it cs
  1882. 80216fa: 4282 cmpcs r2, r0
  1883. 80216fc: d84c bhi.n 8021798 <__udivdi3+0x158>
  1884. 80216fe: 4626 mov r6, r4
  1885. 8021700: 2001 movs r0, #1
  1886. 8021702: e04b b.n 802179c <__udivdi3+0x15c>
  1887. 8021704: b922 cbnz r2, 8021710 <__udivdi3+0xd0>
  1888. 8021706: 2001 movs r0, #1
  1889. 8021708: 4611 mov r1, r2
  1890. 802170a: f000 f925 bl 8021958 <__aeabi_uidiv>
  1891. 802170e: 4604 mov r4, r0
  1892. 8021710: fab4 f384 clz r3, r4
  1893. 8021714: 2b00 cmp r3, #0
  1894. 8021716: f040 80b9 bne.w 802188c <__udivdi3+0x24c>
  1895. 802171a: 1b2d subs r5, r5, r4
  1896. 802171c: ea4f 4814 mov.w r8, r4, lsr #16
  1897. 8021720: fa1f fa84 uxth.w sl, r4
  1898. 8021724: 2601 movs r6, #1
  1899. 8021726: 4641 mov r1, r8
  1900. 8021728: 4628 mov r0, r5
  1901. 802172a: f000 f915 bl 8021958 <__aeabi_uidiv>
  1902. 802172e: 4641 mov r1, r8
  1903. 8021730: 4681 mov r9, r0
  1904. 8021732: 4628 mov r0, r5
  1905. 8021734: f000 fa3e bl 8021bb4 <__aeabi_uidivmod>
  1906. 8021738: 0c3b lsrs r3, r7, #16
  1907. 802173a: fb0a f009 mul.w r0, sl, r9
  1908. 802173e: ea43 4101 orr.w r1, r3, r1, lsl #16
  1909. 8021742: 4288 cmp r0, r1
  1910. 8021744: d90b bls.n 802175e <__udivdi3+0x11e>
  1911. 8021746: 1909 adds r1, r1, r4
  1912. 8021748: f109 33ff add.w r3, r9, #4294967295
  1913. 802174c: f080 80e9 bcs.w 8021922 <__udivdi3+0x2e2>
  1914. 8021750: 4288 cmp r0, r1
  1915. 8021752: bf84 itt hi
  1916. 8021754: f1a9 0902 subhi.w r9, r9, #2
  1917. 8021758: 1909 addhi r1, r1, r4
  1918. 802175a: f240 80e2 bls.w 8021922 <__udivdi3+0x2e2>
  1919. 802175e: ebc0 0b01 rsb fp, r0, r1
  1920. 8021762: 4641 mov r1, r8
  1921. 8021764: 4658 mov r0, fp
  1922. 8021766: b2bf uxth r7, r7
  1923. 8021768: f000 f8f6 bl 8021958 <__aeabi_uidiv>
  1924. 802176c: 4641 mov r1, r8
  1925. 802176e: 4605 mov r5, r0
  1926. 8021770: 4658 mov r0, fp
  1927. 8021772: f000 fa1f bl 8021bb4 <__aeabi_uidivmod>
  1928. 8021776: fb0a fa05 mul.w sl, sl, r5
  1929. 802177a: ea47 4101 orr.w r1, r7, r1, lsl #16
  1930. 802177e: 458a cmp sl, r1
  1931. 8021780: d907 bls.n 8021792 <__udivdi3+0x152>
  1932. 8021782: 1e6b subs r3, r5, #1
  1933. 8021784: 190c adds r4, r1, r4
  1934. 8021786: f080 80ce bcs.w 8021926 <__udivdi3+0x2e6>
  1935. 802178a: 3d02 subs r5, #2
  1936. 802178c: 45a2 cmp sl, r4
  1937. 802178e: f240 80ca bls.w 8021926 <__udivdi3+0x2e6>
  1938. 8021792: ea45 4009 orr.w r0, r5, r9, lsl #16
  1939. 8021796: e001 b.n 802179c <__udivdi3+0x15c>
  1940. 8021798: 2600 movs r6, #0
  1941. 802179a: 4630 mov r0, r6
  1942. 802179c: 4631 mov r1, r6
  1943. 802179e: b003 add sp, #12
  1944. 80217a0: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  1945. 80217a4: f1c4 0120 rsb r1, r4, #32
  1946. 80217a8: fa03 f304 lsl.w r3, r3, r4
  1947. 80217ac: fa22 f801 lsr.w r8, r2, r1
  1948. 80217b0: fa25 f701 lsr.w r7, r5, r1
  1949. 80217b4: ea48 0803 orr.w r8, r8, r3
  1950. 80217b8: fa20 f101 lsr.w r1, r0, r1
  1951. 80217bc: fa05 f504 lsl.w r5, r5, r4
  1952. 80217c0: 4638 mov r0, r7
  1953. 80217c2: ea4f 4918 mov.w r9, r8, lsr #16
  1954. 80217c6: 430d orrs r5, r1
  1955. 80217c8: 4649 mov r1, r9
  1956. 80217ca: fa02 f204 lsl.w r2, r2, r4
  1957. 80217ce: 9201 str r2, [sp, #4]
  1958. 80217d0: f000 f8c2 bl 8021958 <__aeabi_uidiv>
  1959. 80217d4: 4649 mov r1, r9
  1960. 80217d6: 4682 mov sl, r0
  1961. 80217d8: 4638 mov r0, r7
  1962. 80217da: f000 f9eb bl 8021bb4 <__aeabi_uidivmod>
  1963. 80217de: fa1f f288 uxth.w r2, r8
  1964. 80217e2: 0c2f lsrs r7, r5, #16
  1965. 80217e4: fb02 f00a mul.w r0, r2, sl
  1966. 80217e8: ea47 4701 orr.w r7, r7, r1, lsl #16
  1967. 80217ec: 42b8 cmp r0, r7
  1968. 80217ee: d906 bls.n 80217fe <__udivdi3+0x1be>
  1969. 80217f0: eb17 0708 adds.w r7, r7, r8
  1970. 80217f4: f10a 31ff add.w r1, sl, #4294967295
  1971. 80217f8: f0c0 809f bcc.w 802193a <__udivdi3+0x2fa>
  1972. 80217fc: 468a mov sl, r1
  1973. 80217fe: 1a3f subs r7, r7, r0
  1974. 8021800: 4649 mov r1, r9
  1975. 8021802: 4638 mov r0, r7
  1976. 8021804: 9200 str r2, [sp, #0]
  1977. 8021806: f000 f8a7 bl 8021958 <__aeabi_uidiv>
  1978. 802180a: 4649 mov r1, r9
  1979. 802180c: b2ad uxth r5, r5
  1980. 802180e: 4683 mov fp, r0
  1981. 8021810: 4638 mov r0, r7
  1982. 8021812: f000 f9cf bl 8021bb4 <__aeabi_uidivmod>
  1983. 8021816: 9a00 ldr r2, [sp, #0]
  1984. 8021818: fb02 f70b mul.w r7, r2, fp
  1985. 802181c: ea45 4101 orr.w r1, r5, r1, lsl #16
  1986. 8021820: 428f cmp r7, r1
  1987. 8021822: d905 bls.n 8021830 <__udivdi3+0x1f0>
  1988. 8021824: eb11 0108 adds.w r1, r1, r8
  1989. 8021828: f10b 32ff add.w r2, fp, #4294967295
  1990. 802182c: d37d bcc.n 802192a <__udivdi3+0x2ea>
  1991. 802182e: 4693 mov fp, r2
  1992. 8021830: 9b01 ldr r3, [sp, #4]
  1993. 8021832: ea4b 400a orr.w r0, fp, sl, lsl #16
  1994. 8021836: 1bc9 subs r1, r1, r7
  1995. 8021838: ea4f 4c10 mov.w ip, r0, lsr #16
  1996. 802183c: b29d uxth r5, r3
  1997. 802183e: ea4f 4a13 mov.w sl, r3, lsr #16
  1998. 8021842: b283 uxth r3, r0
  1999. 8021844: fb05 f203 mul.w r2, r5, r3
  2000. 8021848: fb05 f50c mul.w r5, r5, ip
  2001. 802184c: fb0a 5303 mla r3, sl, r3, r5
  2002. 8021850: fb0a fa0c mul.w sl, sl, ip
  2003. 8021854: eb03 4312 add.w r3, r3, r2, lsr #16
  2004. 8021858: 429d cmp r5, r3
  2005. 802185a: bf88 it hi
  2006. 802185c: f50a 3a80 addhi.w sl, sl, #65536 ; 0x10000
  2007. 8021860: eb0a 4a13 add.w sl, sl, r3, lsr #16
  2008. 8021864: 4551 cmp r1, sl
  2009. 8021866: d30e bcc.n 8021886 <__udivdi3+0x246>
  2010. 8021868: b292 uxth r2, r2
  2011. 802186a: bf14 ite ne
  2012. 802186c: 2100 movne r1, #0
  2013. 802186e: 2101 moveq r1, #1
  2014. 8021870: fa06 f604 lsl.w r6, r6, r4
  2015. 8021874: eb02 4303 add.w r3, r2, r3, lsl #16
  2016. 8021878: 429e cmp r6, r3
  2017. 802187a: bf2c ite cs
  2018. 802187c: 2600 movcs r6, #0
  2019. 802187e: f001 0601 andcc.w r6, r1, #1
  2020. 8021882: 2e00 cmp r6, #0
  2021. 8021884: d08a beq.n 802179c <__udivdi3+0x15c>
  2022. 8021886: 3801 subs r0, #1
  2023. 8021888: 2600 movs r6, #0
  2024. 802188a: e787 b.n 802179c <__udivdi3+0x15c>
  2025. 802188c: 409c lsls r4, r3
  2026. 802188e: f1c3 0220 rsb r2, r3, #32
  2027. 8021892: fa25 fa02 lsr.w sl, r5, r2
  2028. 8021896: fa26 f902 lsr.w r9, r6, r2
  2029. 802189a: ea4f 4814 mov.w r8, r4, lsr #16
  2030. 802189e: 4650 mov r0, sl
  2031. 80218a0: 4641 mov r1, r8
  2032. 80218a2: fa05 f503 lsl.w r5, r5, r3
  2033. 80218a6: fa06 f703 lsl.w r7, r6, r3
  2034. 80218aa: f000 f855 bl 8021958 <__aeabi_uidiv>
  2035. 80218ae: 4641 mov r1, r8
  2036. 80218b0: ea49 0905 orr.w r9, r9, r5
  2037. 80218b4: 4683 mov fp, r0
  2038. 80218b6: 4650 mov r0, sl
  2039. 80218b8: f000 f97c bl 8021bb4 <__aeabi_uidivmod>
  2040. 80218bc: fa1f fa84 uxth.w sl, r4
  2041. 80218c0: ea4f 4319 mov.w r3, r9, lsr #16
  2042. 80218c4: fb0a f00b mul.w r0, sl, fp
  2043. 80218c8: ea43 4101 orr.w r1, r3, r1, lsl #16
  2044. 80218cc: 4288 cmp r0, r1
  2045. 80218ce: d909 bls.n 80218e4 <__udivdi3+0x2a4>
  2046. 80218d0: 1909 adds r1, r1, r4
  2047. 80218d2: f10b 33ff add.w r3, fp, #4294967295
  2048. 80218d6: d238 bcs.n 802194a <__udivdi3+0x30a>
  2049. 80218d8: 4288 cmp r0, r1
  2050. 80218da: bf84 itt hi
  2051. 80218dc: f1ab 0b02 subhi.w fp, fp, #2
  2052. 80218e0: 1909 addhi r1, r1, r4
  2053. 80218e2: d932 bls.n 802194a <__udivdi3+0x30a>
  2054. 80218e4: 1a0d subs r5, r1, r0
  2055. 80218e6: 4641 mov r1, r8
  2056. 80218e8: 4628 mov r0, r5
  2057. 80218ea: fa1f f989 uxth.w r9, r9
  2058. 80218ee: f000 f833 bl 8021958 <__aeabi_uidiv>
  2059. 80218f2: 4641 mov r1, r8
  2060. 80218f4: 4606 mov r6, r0
  2061. 80218f6: 4628 mov r0, r5
  2062. 80218f8: f000 f95c bl 8021bb4 <__aeabi_uidivmod>
  2063. 80218fc: fb0a f506 mul.w r5, sl, r6
  2064. 8021900: ea49 4101 orr.w r1, r9, r1, lsl #16
  2065. 8021904: 428d cmp r5, r1
  2066. 8021906: d906 bls.n 8021916 <__udivdi3+0x2d6>
  2067. 8021908: 1e73 subs r3, r6, #1
  2068. 802190a: 1909 adds r1, r1, r4
  2069. 802190c: d21f bcs.n 802194e <__udivdi3+0x30e>
  2070. 802190e: 428d cmp r5, r1
  2071. 8021910: d91d bls.n 802194e <__udivdi3+0x30e>
  2072. 8021912: 3e02 subs r6, #2
  2073. 8021914: 1909 adds r1, r1, r4
  2074. 8021916: 1b4d subs r5, r1, r5
  2075. 8021918: ea46 460b orr.w r6, r6, fp, lsl #16
  2076. 802191c: e703 b.n 8021726 <__udivdi3+0xe6>
  2077. 802191e: 461e mov r6, r3
  2078. 8021920: e6df b.n 80216e2 <__udivdi3+0xa2>
  2079. 8021922: 4699 mov r9, r3
  2080. 8021924: e71b b.n 802175e <__udivdi3+0x11e>
  2081. 8021926: 461d mov r5, r3
  2082. 8021928: e733 b.n 8021792 <__udivdi3+0x152>
  2083. 802192a: 428f cmp r7, r1
  2084. 802192c: bf84 itt hi
  2085. 802192e: f1ab 0b02 subhi.w fp, fp, #2
  2086. 8021932: 4441 addhi r1, r8
  2087. 8021934: f63f af7c bhi.w 8021830 <__udivdi3+0x1f0>
  2088. 8021938: e779 b.n 802182e <__udivdi3+0x1ee>
  2089. 802193a: 42b8 cmp r0, r7
  2090. 802193c: bf84 itt hi
  2091. 802193e: f1aa 0a02 subhi.w sl, sl, #2
  2092. 8021942: 4447 addhi r7, r8
  2093. 8021944: f63f af5b bhi.w 80217fe <__udivdi3+0x1be>
  2094. 8021948: e758 b.n 80217fc <__udivdi3+0x1bc>
  2095. 802194a: 469b mov fp, r3
  2096. 802194c: e7ca b.n 80218e4 <__udivdi3+0x2a4>
  2097. 802194e: 461e mov r6, r3
  2098. 8021950: e7e1 b.n 8021916 <__udivdi3+0x2d6>
  2099. 8021952: bf00 nop
  2100. 8021954: 0000 movs r0, r0
  2101. 8021956: 0000 movs r0, r0
  2102. 08021958 <__aeabi_uidiv>:
  2103. 8021958: 1e4a subs r2, r1, #1
  2104. 802195a: bf08 it eq
  2105. 802195c: 4770 bxeq lr
  2106. 802195e: f0c0 8124 bcc.w 8021baa <__aeabi_uidiv+0x252>
  2107. 8021962: 4288 cmp r0, r1
  2108. 8021964: f240 8116 bls.w 8021b94 <__aeabi_uidiv+0x23c>
  2109. 8021968: 4211 tst r1, r2
  2110. 802196a: f000 8117 beq.w 8021b9c <__aeabi_uidiv+0x244>
  2111. 802196e: fab0 f380 clz r3, r0
  2112. 8021972: fab1 f281 clz r2, r1
  2113. 8021976: eba2 0303 sub.w r3, r2, r3
  2114. 802197a: f1c3 031f rsb r3, r3, #31
  2115. 802197e: a204 add r2, pc, #16 ; (adr r2, 8021990 <__aeabi_uidiv+0x38>)
  2116. 8021980: eb02 1303 add.w r3, r2, r3, lsl #4
  2117. 8021984: f04f 0200 mov.w r2, #0
  2118. 8021988: 469f mov pc, r3
  2119. 802198a: bf00 nop
  2120. 802198c: f3af 8000 nop.w
  2121. 8021990: ebb0 7fc1 cmp.w r0, r1, lsl #31
  2122. 8021994: bf00 nop
  2123. 8021996: eb42 0202 adc.w r2, r2, r2
  2124. 802199a: bf28 it cs
  2125. 802199c: eba0 70c1 subcs.w r0, r0, r1, lsl #31
  2126. 80219a0: ebb0 7f81 cmp.w r0, r1, lsl #30
  2127. 80219a4: bf00 nop
  2128. 80219a6: eb42 0202 adc.w r2, r2, r2
  2129. 80219aa: bf28 it cs
  2130. 80219ac: eba0 7081 subcs.w r0, r0, r1, lsl #30
  2131. 80219b0: ebb0 7f41 cmp.w r0, r1, lsl #29
  2132. 80219b4: bf00 nop
  2133. 80219b6: eb42 0202 adc.w r2, r2, r2
  2134. 80219ba: bf28 it cs
  2135. 80219bc: eba0 7041 subcs.w r0, r0, r1, lsl #29
  2136. 80219c0: ebb0 7f01 cmp.w r0, r1, lsl #28
  2137. 80219c4: bf00 nop
  2138. 80219c6: eb42 0202 adc.w r2, r2, r2
  2139. 80219ca: bf28 it cs
  2140. 80219cc: eba0 7001 subcs.w r0, r0, r1, lsl #28
  2141. 80219d0: ebb0 6fc1 cmp.w r0, r1, lsl #27
  2142. 80219d4: bf00 nop
  2143. 80219d6: eb42 0202 adc.w r2, r2, r2
  2144. 80219da: bf28 it cs
  2145. 80219dc: eba0 60c1 subcs.w r0, r0, r1, lsl #27
  2146. 80219e0: ebb0 6f81 cmp.w r0, r1, lsl #26
  2147. 80219e4: bf00 nop
  2148. 80219e6: eb42 0202 adc.w r2, r2, r2
  2149. 80219ea: bf28 it cs
  2150. 80219ec: eba0 6081 subcs.w r0, r0, r1, lsl #26
  2151. 80219f0: ebb0 6f41 cmp.w r0, r1, lsl #25
  2152. 80219f4: bf00 nop
  2153. 80219f6: eb42 0202 adc.w r2, r2, r2
  2154. 80219fa: bf28 it cs
  2155. 80219fc: eba0 6041 subcs.w r0, r0, r1, lsl #25
  2156. 8021a00: ebb0 6f01 cmp.w r0, r1, lsl #24
  2157. 8021a04: bf00 nop
  2158. 8021a06: eb42 0202 adc.w r2, r2, r2
  2159. 8021a0a: bf28 it cs
  2160. 8021a0c: eba0 6001 subcs.w r0, r0, r1, lsl #24
  2161. 8021a10: ebb0 5fc1 cmp.w r0, r1, lsl #23
  2162. 8021a14: bf00 nop
  2163. 8021a16: eb42 0202 adc.w r2, r2, r2
  2164. 8021a1a: bf28 it cs
  2165. 8021a1c: eba0 50c1 subcs.w r0, r0, r1, lsl #23
  2166. 8021a20: ebb0 5f81 cmp.w r0, r1, lsl #22
  2167. 8021a24: bf00 nop
  2168. 8021a26: eb42 0202 adc.w r2, r2, r2
  2169. 8021a2a: bf28 it cs
  2170. 8021a2c: eba0 5081 subcs.w r0, r0, r1, lsl #22
  2171. 8021a30: ebb0 5f41 cmp.w r0, r1, lsl #21
  2172. 8021a34: bf00 nop
  2173. 8021a36: eb42 0202 adc.w r2, r2, r2
  2174. 8021a3a: bf28 it cs
  2175. 8021a3c: eba0 5041 subcs.w r0, r0, r1, lsl #21
  2176. 8021a40: ebb0 5f01 cmp.w r0, r1, lsl #20
  2177. 8021a44: bf00 nop
  2178. 8021a46: eb42 0202 adc.w r2, r2, r2
  2179. 8021a4a: bf28 it cs
  2180. 8021a4c: eba0 5001 subcs.w r0, r0, r1, lsl #20
  2181. 8021a50: ebb0 4fc1 cmp.w r0, r1, lsl #19
  2182. 8021a54: bf00 nop
  2183. 8021a56: eb42 0202 adc.w r2, r2, r2
  2184. 8021a5a: bf28 it cs
  2185. 8021a5c: eba0 40c1 subcs.w r0, r0, r1, lsl #19
  2186. 8021a60: ebb0 4f81 cmp.w r0, r1, lsl #18
  2187. 8021a64: bf00 nop
  2188. 8021a66: eb42 0202 adc.w r2, r2, r2
  2189. 8021a6a: bf28 it cs
  2190. 8021a6c: eba0 4081 subcs.w r0, r0, r1, lsl #18
  2191. 8021a70: ebb0 4f41 cmp.w r0, r1, lsl #17
  2192. 8021a74: bf00 nop
  2193. 8021a76: eb42 0202 adc.w r2, r2, r2
  2194. 8021a7a: bf28 it cs
  2195. 8021a7c: eba0 4041 subcs.w r0, r0, r1, lsl #17
  2196. 8021a80: ebb0 4f01 cmp.w r0, r1, lsl #16
  2197. 8021a84: bf00 nop
  2198. 8021a86: eb42 0202 adc.w r2, r2, r2
  2199. 8021a8a: bf28 it cs
  2200. 8021a8c: eba0 4001 subcs.w r0, r0, r1, lsl #16
  2201. 8021a90: ebb0 3fc1 cmp.w r0, r1, lsl #15
  2202. 8021a94: bf00 nop
  2203. 8021a96: eb42 0202 adc.w r2, r2, r2
  2204. 8021a9a: bf28 it cs
  2205. 8021a9c: eba0 30c1 subcs.w r0, r0, r1, lsl #15
  2206. 8021aa0: ebb0 3f81 cmp.w r0, r1, lsl #14
  2207. 8021aa4: bf00 nop
  2208. 8021aa6: eb42 0202 adc.w r2, r2, r2
  2209. 8021aaa: bf28 it cs
  2210. 8021aac: eba0 3081 subcs.w r0, r0, r1, lsl #14
  2211. 8021ab0: ebb0 3f41 cmp.w r0, r1, lsl #13
  2212. 8021ab4: bf00 nop
  2213. 8021ab6: eb42 0202 adc.w r2, r2, r2
  2214. 8021aba: bf28 it cs
  2215. 8021abc: eba0 3041 subcs.w r0, r0, r1, lsl #13
  2216. 8021ac0: ebb0 3f01 cmp.w r0, r1, lsl #12
  2217. 8021ac4: bf00 nop
  2218. 8021ac6: eb42 0202 adc.w r2, r2, r2
  2219. 8021aca: bf28 it cs
  2220. 8021acc: eba0 3001 subcs.w r0, r0, r1, lsl #12
  2221. 8021ad0: ebb0 2fc1 cmp.w r0, r1, lsl #11
  2222. 8021ad4: bf00 nop
  2223. 8021ad6: eb42 0202 adc.w r2, r2, r2
  2224. 8021ada: bf28 it cs
  2225. 8021adc: eba0 20c1 subcs.w r0, r0, r1, lsl #11
  2226. 8021ae0: ebb0 2f81 cmp.w r0, r1, lsl #10
  2227. 8021ae4: bf00 nop
  2228. 8021ae6: eb42 0202 adc.w r2, r2, r2
  2229. 8021aea: bf28 it cs
  2230. 8021aec: eba0 2081 subcs.w r0, r0, r1, lsl #10
  2231. 8021af0: ebb0 2f41 cmp.w r0, r1, lsl #9
  2232. 8021af4: bf00 nop
  2233. 8021af6: eb42 0202 adc.w r2, r2, r2
  2234. 8021afa: bf28 it cs
  2235. 8021afc: eba0 2041 subcs.w r0, r0, r1, lsl #9
  2236. 8021b00: ebb0 2f01 cmp.w r0, r1, lsl #8
  2237. 8021b04: bf00 nop
  2238. 8021b06: eb42 0202 adc.w r2, r2, r2
  2239. 8021b0a: bf28 it cs
  2240. 8021b0c: eba0 2001 subcs.w r0, r0, r1, lsl #8
  2241. 8021b10: ebb0 1fc1 cmp.w r0, r1, lsl #7
  2242. 8021b14: bf00 nop
  2243. 8021b16: eb42 0202 adc.w r2, r2, r2
  2244. 8021b1a: bf28 it cs
  2245. 8021b1c: eba0 10c1 subcs.w r0, r0, r1, lsl #7
  2246. 8021b20: ebb0 1f81 cmp.w r0, r1, lsl #6
  2247. 8021b24: bf00 nop
  2248. 8021b26: eb42 0202 adc.w r2, r2, r2
  2249. 8021b2a: bf28 it cs
  2250. 8021b2c: eba0 1081 subcs.w r0, r0, r1, lsl #6
  2251. 8021b30: ebb0 1f41 cmp.w r0, r1, lsl #5
  2252. 8021b34: bf00 nop
  2253. 8021b36: eb42 0202 adc.w r2, r2, r2
  2254. 8021b3a: bf28 it cs
  2255. 8021b3c: eba0 1041 subcs.w r0, r0, r1, lsl #5
  2256. 8021b40: ebb0 1f01 cmp.w r0, r1, lsl #4
  2257. 8021b44: bf00 nop
  2258. 8021b46: eb42 0202 adc.w r2, r2, r2
  2259. 8021b4a: bf28 it cs
  2260. 8021b4c: eba0 1001 subcs.w r0, r0, r1, lsl #4
  2261. 8021b50: ebb0 0fc1 cmp.w r0, r1, lsl #3
  2262. 8021b54: bf00 nop
  2263. 8021b56: eb42 0202 adc.w r2, r2, r2
  2264. 8021b5a: bf28 it cs
  2265. 8021b5c: eba0 00c1 subcs.w r0, r0, r1, lsl #3
  2266. 8021b60: ebb0 0f81 cmp.w r0, r1, lsl #2
  2267. 8021b64: bf00 nop
  2268. 8021b66: eb42 0202 adc.w r2, r2, r2
  2269. 8021b6a: bf28 it cs
  2270. 8021b6c: eba0 0081 subcs.w r0, r0, r1, lsl #2
  2271. 8021b70: ebb0 0f41 cmp.w r0, r1, lsl #1
  2272. 8021b74: bf00 nop
  2273. 8021b76: eb42 0202 adc.w r2, r2, r2
  2274. 8021b7a: bf28 it cs
  2275. 8021b7c: eba0 0041 subcs.w r0, r0, r1, lsl #1
  2276. 8021b80: ebb0 0f01 cmp.w r0, r1
  2277. 8021b84: bf00 nop
  2278. 8021b86: eb42 0202 adc.w r2, r2, r2
  2279. 8021b8a: bf28 it cs
  2280. 8021b8c: eba0 0001 subcs.w r0, r0, r1
  2281. 8021b90: 4610 mov r0, r2
  2282. 8021b92: 4770 bx lr
  2283. 8021b94: bf0c ite eq
  2284. 8021b96: 2001 moveq r0, #1
  2285. 8021b98: 2000 movne r0, #0
  2286. 8021b9a: 4770 bx lr
  2287. 8021b9c: fab1 f281 clz r2, r1
  2288. 8021ba0: f1c2 021f rsb r2, r2, #31
  2289. 8021ba4: fa20 f002 lsr.w r0, r0, r2
  2290. 8021ba8: 4770 bx lr
  2291. 8021baa: b108 cbz r0, 8021bb0 <__aeabi_uidiv+0x258>
  2292. 8021bac: f04f 30ff mov.w r0, #4294967295
  2293. 8021bb0: f7ff bb8e b.w 80212d0 <__aeabi_idiv0>
  2294. 08021bb4 <__aeabi_uidivmod>:
  2295. 8021bb4: 2900 cmp r1, #0
  2296. 8021bb6: d0f8 beq.n 8021baa <__aeabi_uidiv+0x252>
  2297. 8021bb8: e92d 4003 stmdb sp!, {r0, r1, lr}
  2298. 8021bbc: f7ff fecc bl 8021958 <__aeabi_uidiv>
  2299. 8021bc0: e8bd 4006 ldmia.w sp!, {r1, r2, lr}
  2300. 8021bc4: fb02 f300 mul.w r3, r2, r0
  2301. 8021bc8: eba1 0103 sub.w r1, r1, r3
  2302. 8021bcc: 4770 bx lr
  2303. 8021bce: bf00 nop
  2304. 08021bd0 <atof>:
  2305. 8021bd0: 2100 movs r1, #0
  2306. 8021bd2: f001 bde7 b.w 80237a4 <strtod>
  2307. 8021bd6: bf00 nop
  2308. 08021bd8 <atoi>:
  2309. 8021bd8: 2100 movs r1, #0
  2310. 8021bda: 220a movs r2, #10
  2311. 8021bdc: f001 bee2 b.w 80239a4 <strtol>
  2312. 08021be0 <_atoi_r>:
  2313. 8021be0: 2200 movs r2, #0
  2314. 8021be2: 230a movs r3, #10
  2315. 8021be4: f001 be3c b.w 8023860 <_strtol_r>
  2316. 08021be8 <__libc_init_array>:
  2317. 8021be8: b570 push {r4, r5, r6, lr}
  2318. 8021bea: f245 26d4 movw r6, #21204 ; 0x52d4
  2319. 8021bee: f245 25d4 movw r5, #21204 ; 0x52d4
  2320. 8021bf2: f6c0 0604 movt r6, #2052 ; 0x804
  2321. 8021bf6: f6c0 0504 movt r5, #2052 ; 0x804
  2322. 8021bfa: 1b76 subs r6, r6, r5
  2323. 8021bfc: 10b6 asrs r6, r6, #2
  2324. 8021bfe: d007 beq.n 8021c10 <__libc_init_array+0x28>
  2325. 8021c00: 3d04 subs r5, #4
  2326. 8021c02: 2400 movs r4, #0
  2327. 8021c04: f855 3f04 ldr.w r3, [r5, #4]!
  2328. 8021c08: 3401 adds r4, #1
  2329. 8021c0a: 4798 blx r3
  2330. 8021c0c: 42a6 cmp r6, r4
  2331. 8021c0e: d1f9 bne.n 8021c04 <__libc_init_array+0x1c>
  2332. 8021c10: f245 26d8 movw r6, #21208 ; 0x52d8
  2333. 8021c14: f245 25d4 movw r5, #21204 ; 0x52d4
  2334. 8021c18: f6c0 0604 movt r6, #2052 ; 0x804
  2335. 8021c1c: f6c0 0504 movt r5, #2052 ; 0x804
  2336. 8021c20: 1b76 subs r6, r6, r5
  2337. 8021c22: f023 fb47 bl 80452b4 <_init>
  2338. 8021c26: 10b6 asrs r6, r6, #2
  2339. 8021c28: d008 beq.n 8021c3c <__libc_init_array+0x54>
  2340. 8021c2a: 3d04 subs r5, #4
  2341. 8021c2c: 2400 movs r4, #0
  2342. 8021c2e: f855 3f04 ldr.w r3, [r5, #4]!
  2343. 8021c32: 3401 adds r4, #1
  2344. 8021c34: 4798 blx r3
  2345. 8021c36: 42a6 cmp r6, r4
  2346. 8021c38: d1f9 bne.n 8021c2e <__libc_init_array+0x46>
  2347. 8021c3a: bd70 pop {r4, r5, r6, pc}
  2348. 8021c3c: bd70 pop {r4, r5, r6, pc}
  2349. 8021c3e: bf00 nop
  2350. 08021c40 <memcmp>:
  2351. 8021c40: 2a03 cmp r2, #3
  2352. 8021c42: b470 push {r4, r5, r6}
  2353. 8021c44: d922 bls.n 8021c8c <memcmp+0x4c>
  2354. 8021c46: ea41 0300 orr.w r3, r1, r0
  2355. 8021c4a: 079b lsls r3, r3, #30
  2356. 8021c4c: d013 beq.n 8021c76 <memcmp+0x36>
  2357. 8021c4e: 7805 ldrb r5, [r0, #0]
  2358. 8021c50: 3a01 subs r2, #1
  2359. 8021c52: 780c ldrb r4, [r1, #0]
  2360. 8021c54: 2300 movs r3, #0
  2361. 8021c56: 42a5 cmp r5, r4
  2362. 8021c58: d006 beq.n 8021c68 <memcmp+0x28>
  2363. 8021c5a: e01b b.n 8021c94 <memcmp+0x54>
  2364. 8021c5c: f810 5f01 ldrb.w r5, [r0, #1]!
  2365. 8021c60: f811 4f01 ldrb.w r4, [r1, #1]!
  2366. 8021c64: 42a5 cmp r5, r4
  2367. 8021c66: d115 bne.n 8021c94 <memcmp+0x54>
  2368. 8021c68: 4293 cmp r3, r2
  2369. 8021c6a: f103 0301 add.w r3, r3, #1
  2370. 8021c6e: d1f5 bne.n 8021c5c <memcmp+0x1c>
  2371. 8021c70: 2000 movs r0, #0
  2372. 8021c72: bc70 pop {r4, r5, r6}
  2373. 8021c74: 4770 bx lr
  2374. 8021c76: 460c mov r4, r1
  2375. 8021c78: 4603 mov r3, r0
  2376. 8021c7a: 3104 adds r1, #4
  2377. 8021c7c: 3004 adds r0, #4
  2378. 8021c7e: 681e ldr r6, [r3, #0]
  2379. 8021c80: 6825 ldr r5, [r4, #0]
  2380. 8021c82: 42ae cmp r6, r5
  2381. 8021c84: d108 bne.n 8021c98 <memcmp+0x58>
  2382. 8021c86: 3a04 subs r2, #4
  2383. 8021c88: 2a03 cmp r2, #3
  2384. 8021c8a: d8f4 bhi.n 8021c76 <memcmp+0x36>
  2385. 8021c8c: 2a00 cmp r2, #0
  2386. 8021c8e: d1de bne.n 8021c4e <memcmp+0xe>
  2387. 8021c90: 4610 mov r0, r2
  2388. 8021c92: e7ee b.n 8021c72 <memcmp+0x32>
  2389. 8021c94: 1b28 subs r0, r5, r4
  2390. 8021c96: e7ec b.n 8021c72 <memcmp+0x32>
  2391. 8021c98: 4621 mov r1, r4
  2392. 8021c9a: 4618 mov r0, r3
  2393. 8021c9c: 2a00 cmp r2, #0
  2394. 8021c9e: d1d6 bne.n 8021c4e <memcmp+0xe>
  2395. 8021ca0: e7f6 b.n 8021c90 <memcmp+0x50>
  2396. 8021ca2: bf00 nop
  2397. 08021ca4 <memcpy>:
  2398. 8021ca4: 2a03 cmp r2, #3
  2399. 8021ca6: e92d 0ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp}
  2400. 8021caa: d809 bhi.n 8021cc0 <memcpy+0x1c>
  2401. 8021cac: b12a cbz r2, 8021cba <memcpy+0x16>
  2402. 8021cae: 2300 movs r3, #0
  2403. 8021cb0: 5ccc ldrb r4, [r1, r3]
  2404. 8021cb2: 54c4 strb r4, [r0, r3]
  2405. 8021cb4: 3301 adds r3, #1
  2406. 8021cb6: 4293 cmp r3, r2
  2407. 8021cb8: d1fa bne.n 8021cb0 <memcpy+0xc>
  2408. 8021cba: e8bd 0ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp}
  2409. 8021cbe: 4770 bx lr
  2410. 8021cc0: 0783 lsls r3, r0, #30
  2411. 8021cc2: 4402 add r2, r0
  2412. 8021cc4: d00e beq.n 8021ce4 <memcpy+0x40>
  2413. 8021cc6: 1c44 adds r4, r0, #1
  2414. 8021cc8: 1c4d adds r5, r1, #1
  2415. 8021cca: f815 7c01 ldrb.w r7, [r5, #-1]
  2416. 8021cce: f004 0603 and.w r6, r4, #3
  2417. 8021cd2: 4623 mov r3, r4
  2418. 8021cd4: 3401 adds r4, #1
  2419. 8021cd6: 4629 mov r1, r5
  2420. 8021cd8: 3501 adds r5, #1
  2421. 8021cda: f804 7c02 strb.w r7, [r4, #-2]
  2422. 8021cde: 2e00 cmp r6, #0
  2423. 8021ce0: d1f3 bne.n 8021cca <memcpy+0x26>
  2424. 8021ce2: e000 b.n 8021ce6 <memcpy+0x42>
  2425. 8021ce4: 4603 mov r3, r0
  2426. 8021ce6: f011 0403 ands.w r4, r1, #3
  2427. 8021cea: d06d beq.n 8021dc8 <memcpy+0x124>
  2428. 8021cec: 1ad7 subs r7, r2, r3
  2429. 8021cee: 1b0d subs r5, r1, r4
  2430. 8021cf0: 2f03 cmp r7, #3
  2431. 8021cf2: 682e ldr r6, [r5, #0]
  2432. 8021cf4: dd19 ble.n 8021d2a <memcpy+0x86>
  2433. 8021cf6: f1c4 0c04 rsb ip, r4, #4
  2434. 8021cfa: ea4f 08c4 mov.w r8, r4, lsl #3
  2435. 8021cfe: 1d1c adds r4, r3, #4
  2436. 8021d00: ea4f 0ccc mov.w ip, ip, lsl #3
  2437. 8021d04: f855 7f04 ldr.w r7, [r5, #4]!
  2438. 8021d08: ebc4 0902 rsb r9, r4, r2
  2439. 8021d0c: 4623 mov r3, r4
  2440. 8021d0e: 3104 adds r1, #4
  2441. 8021d10: 3404 adds r4, #4
  2442. 8021d12: f1b9 0f03 cmp.w r9, #3
  2443. 8021d16: fa26 fa08 lsr.w sl, r6, r8
  2444. 8021d1a: fa07 fb0c lsl.w fp, r7, ip
  2445. 8021d1e: 463e mov r6, r7
  2446. 8021d20: ea4b 070a orr.w r7, fp, sl
  2447. 8021d24: f844 7c08 str.w r7, [r4, #-8]
  2448. 8021d28: dcec bgt.n 8021d04 <memcpy+0x60>
  2449. 8021d2a: 429a cmp r2, r3
  2450. 8021d2c: d9c5 bls.n 8021cba <memcpy+0x16>
  2451. 8021d2e: 3301 adds r3, #1
  2452. 8021d30: 3101 adds r1, #1
  2453. 8021d32: 3201 adds r2, #1
  2454. 8021d34: f811 4c01 ldrb.w r4, [r1, #-1]
  2455. 8021d38: 3301 adds r3, #1
  2456. 8021d3a: 3101 adds r1, #1
  2457. 8021d3c: 4293 cmp r3, r2
  2458. 8021d3e: f803 4c02 strb.w r4, [r3, #-2]
  2459. 8021d42: d1f7 bne.n 8021d34 <memcpy+0x90>
  2460. 8021d44: e7b9 b.n 8021cba <memcpy+0x16>
  2461. 8021d46: 680c ldr r4, [r1, #0]
  2462. 8021d48: 3340 adds r3, #64 ; 0x40
  2463. 8021d4a: 3140 adds r1, #64 ; 0x40
  2464. 8021d4c: f843 4c40 str.w r4, [r3, #-64]
  2465. 8021d50: f851 4c3c ldr.w r4, [r1, #-60]
  2466. 8021d54: f843 4c3c str.w r4, [r3, #-60]
  2467. 8021d58: f851 4c38 ldr.w r4, [r1, #-56]
  2468. 8021d5c: f843 4c38 str.w r4, [r3, #-56]
  2469. 8021d60: f851 4c34 ldr.w r4, [r1, #-52]
  2470. 8021d64: f843 4c34 str.w r4, [r3, #-52]
  2471. 8021d68: f851 4c30 ldr.w r4, [r1, #-48]
  2472. 8021d6c: f843 4c30 str.w r4, [r3, #-48]
  2473. 8021d70: f851 4c2c ldr.w r4, [r1, #-44]
  2474. 8021d74: f843 4c2c str.w r4, [r3, #-44]
  2475. 8021d78: f851 4c28 ldr.w r4, [r1, #-40]
  2476. 8021d7c: f843 4c28 str.w r4, [r3, #-40]
  2477. 8021d80: f851 4c24 ldr.w r4, [r1, #-36]
  2478. 8021d84: f843 4c24 str.w r4, [r3, #-36]
  2479. 8021d88: f851 4c20 ldr.w r4, [r1, #-32]
  2480. 8021d8c: f843 4c20 str.w r4, [r3, #-32]
  2481. 8021d90: f851 4c1c ldr.w r4, [r1, #-28]
  2482. 8021d94: f843 4c1c str.w r4, [r3, #-28]
  2483. 8021d98: f851 4c18 ldr.w r4, [r1, #-24]
  2484. 8021d9c: f843 4c18 str.w r4, [r3, #-24]
  2485. 8021da0: f851 4c14 ldr.w r4, [r1, #-20]
  2486. 8021da4: f843 4c14 str.w r4, [r3, #-20]
  2487. 8021da8: f851 4c10 ldr.w r4, [r1, #-16]
  2488. 8021dac: f843 4c10 str.w r4, [r3, #-16]
  2489. 8021db0: f851 4c0c ldr.w r4, [r1, #-12]
  2490. 8021db4: f843 4c0c str.w r4, [r3, #-12]
  2491. 8021db8: f851 4c08 ldr.w r4, [r1, #-8]
  2492. 8021dbc: f843 4c08 str.w r4, [r3, #-8]
  2493. 8021dc0: f851 4c04 ldr.w r4, [r1, #-4]
  2494. 8021dc4: f843 4c04 str.w r4, [r3, #-4]
  2495. 8021dc8: 1ad4 subs r4, r2, r3
  2496. 8021dca: 2c3f cmp r4, #63 ; 0x3f
  2497. 8021dcc: dcbb bgt.n 8021d46 <memcpy+0xa2>
  2498. 8021dce: e011 b.n 8021df4 <memcpy+0x150>
  2499. 8021dd0: 680c ldr r4, [r1, #0]
  2500. 8021dd2: 3310 adds r3, #16
  2501. 8021dd4: 3110 adds r1, #16
  2502. 8021dd6: f843 4c10 str.w r4, [r3, #-16]
  2503. 8021dda: f851 4c0c ldr.w r4, [r1, #-12]
  2504. 8021dde: f843 4c0c str.w r4, [r3, #-12]
  2505. 8021de2: f851 4c08 ldr.w r4, [r1, #-8]
  2506. 8021de6: f843 4c08 str.w r4, [r3, #-8]
  2507. 8021dea: f851 4c04 ldr.w r4, [r1, #-4]
  2508. 8021dee: f843 4c04 str.w r4, [r3, #-4]
  2509. 8021df2: 1ad4 subs r4, r2, r3
  2510. 8021df4: 2c0f cmp r4, #15
  2511. 8021df6: dceb bgt.n 8021dd0 <memcpy+0x12c>
  2512. 8021df8: 2c03 cmp r4, #3
  2513. 8021dfa: dd96 ble.n 8021d2a <memcpy+0x86>
  2514. 8021dfc: 1d1c adds r4, r3, #4
  2515. 8021dfe: 1d0d adds r5, r1, #4
  2516. 8021e00: f855 7c04 ldr.w r7, [r5, #-4]
  2517. 8021e04: 1b16 subs r6, r2, r4
  2518. 8021e06: 4623 mov r3, r4
  2519. 8021e08: 4629 mov r1, r5
  2520. 8021e0a: 3404 adds r4, #4
  2521. 8021e0c: 3504 adds r5, #4
  2522. 8021e0e: 2e03 cmp r6, #3
  2523. 8021e10: f844 7c08 str.w r7, [r4, #-8]
  2524. 8021e14: dcf4 bgt.n 8021e00 <memcpy+0x15c>
  2525. 8021e16: e788 b.n 8021d2a <memcpy+0x86>
  2526. 08021e18 <memset>:
  2527. 8021e18: 2a03 cmp r2, #3
  2528. 8021e1a: b2c9 uxtb r1, r1
  2529. 8021e1c: b470 push {r4, r5, r6}
  2530. 8021e1e: d808 bhi.n 8021e32 <memset+0x1a>
  2531. 8021e20: b12a cbz r2, 8021e2e <memset+0x16>
  2532. 8021e22: 4603 mov r3, r0
  2533. 8021e24: 1812 adds r2, r2, r0
  2534. 8021e26: f803 1b01 strb.w r1, [r3], #1
  2535. 8021e2a: 4293 cmp r3, r2
  2536. 8021e2c: d1fb bne.n 8021e26 <memset+0xe>
  2537. 8021e2e: bc70 pop {r4, r5, r6}
  2538. 8021e30: 4770 bx lr
  2539. 8021e32: 0783 lsls r3, r0, #30
  2540. 8021e34: 4402 add r2, r0
  2541. 8021e36: d009 beq.n 8021e4c <memset+0x34>
  2542. 8021e38: 1c44 adds r4, r0, #1
  2543. 8021e3a: f004 0503 and.w r5, r4, #3
  2544. 8021e3e: 4623 mov r3, r4
  2545. 8021e40: f804 1c01 strb.w r1, [r4, #-1]
  2546. 8021e44: 3401 adds r4, #1
  2547. 8021e46: 2d00 cmp r5, #0
  2548. 8021e48: d1f7 bne.n 8021e3a <memset+0x22>
  2549. 8021e4a: e000 b.n 8021e4e <memset+0x36>
  2550. 8021e4c: 4603 mov r3, r0
  2551. 8021e4e: 1ad5 subs r5, r2, r3
  2552. 8021e50: eb01 2401 add.w r4, r1, r1, lsl #8
  2553. 8021e54: 2d3f cmp r5, #63 ; 0x3f
  2554. 8021e56: eb04 4404 add.w r4, r4, r4, lsl #16
  2555. 8021e5a: dd2c ble.n 8021eb6 <memset+0x9e>
  2556. 8021e5c: 601c str r4, [r3, #0]
  2557. 8021e5e: 3340 adds r3, #64 ; 0x40
  2558. 8021e60: 1ad5 subs r5, r2, r3
  2559. 8021e62: f843 4c3c str.w r4, [r3, #-60]
  2560. 8021e66: 2d3f cmp r5, #63 ; 0x3f
  2561. 8021e68: f843 4c38 str.w r4, [r3, #-56]
  2562. 8021e6c: f843 4c34 str.w r4, [r3, #-52]
  2563. 8021e70: f843 4c30 str.w r4, [r3, #-48]
  2564. 8021e74: f843 4c2c str.w r4, [r3, #-44]
  2565. 8021e78: f843 4c28 str.w r4, [r3, #-40]
  2566. 8021e7c: f843 4c24 str.w r4, [r3, #-36]
  2567. 8021e80: f843 4c20 str.w r4, [r3, #-32]
  2568. 8021e84: f843 4c1c str.w r4, [r3, #-28]
  2569. 8021e88: f843 4c18 str.w r4, [r3, #-24]
  2570. 8021e8c: f843 4c14 str.w r4, [r3, #-20]
  2571. 8021e90: f843 4c10 str.w r4, [r3, #-16]
  2572. 8021e94: f843 4c0c str.w r4, [r3, #-12]
  2573. 8021e98: f843 4c08 str.w r4, [r3, #-8]
  2574. 8021e9c: f843 4c04 str.w r4, [r3, #-4]
  2575. 8021ea0: dcdc bgt.n 8021e5c <memset+0x44>
  2576. 8021ea2: e008 b.n 8021eb6 <memset+0x9e>
  2577. 8021ea4: 601c str r4, [r3, #0]
  2578. 8021ea6: 3310 adds r3, #16
  2579. 8021ea8: 1ad5 subs r5, r2, r3
  2580. 8021eaa: f843 4c0c str.w r4, [r3, #-12]
  2581. 8021eae: f843 4c08 str.w r4, [r3, #-8]
  2582. 8021eb2: f843 4c04 str.w r4, [r3, #-4]
  2583. 8021eb6: 2d0f cmp r5, #15
  2584. 8021eb8: dcf4 bgt.n 8021ea4 <memset+0x8c>
  2585. 8021eba: 2d03 cmp r5, #3
  2586. 8021ebc: dd08 ble.n 8021ed0 <memset+0xb8>
  2587. 8021ebe: 1d1d adds r5, r3, #4
  2588. 8021ec0: 1b56 subs r6, r2, r5
  2589. 8021ec2: f845 4c04 str.w r4, [r5, #-4]
  2590. 8021ec6: 2e03 cmp r6, #3
  2591. 8021ec8: 462b mov r3, r5
  2592. 8021eca: f105 0504 add.w r5, r5, #4
  2593. 8021ece: dcf7 bgt.n 8021ec0 <memset+0xa8>
  2594. 8021ed0: 429a cmp r2, r3
  2595. 8021ed2: d9ac bls.n 8021e2e <memset+0x16>
  2596. 8021ed4: 3301 adds r3, #1
  2597. 8021ed6: 3201 adds r2, #1
  2598. 8021ed8: f803 1c01 strb.w r1, [r3, #-1]
  2599. 8021edc: 3301 adds r3, #1
  2600. 8021ede: 4293 cmp r3, r2
  2601. 8021ee0: d1fa bne.n 8021ed8 <memset+0xc0>
  2602. 8021ee2: e7a4 b.n 8021e2e <memset+0x16>
  2603. 08021ee4 <strcat>:
  2604. 8021ee4: 0783 lsls r3, r0, #30
  2605. 8021ee6: b570 push {r4, r5, r6, lr}
  2606. 8021ee8: 4606 mov r6, r0
  2607. 8021eea: d114 bne.n 8021f16 <strcat+0x32>
  2608. 8021eec: 6803 ldr r3, [r0, #0]
  2609. 8021eee: f1a3 3201 sub.w r2, r3, #16843009 ; 0x1010101
  2610. 8021ef2: ea22 0303 bic.w r3, r2, r3
  2611. 8021ef6: f013 3f80 tst.w r3, #2155905152 ; 0x80808080
  2612. 8021efa: d10c bne.n 8021f16 <strcat+0x32>
  2613. 8021efc: 1d03 adds r3, r0, #4
  2614. 8021efe: 461a mov r2, r3
  2615. 8021f00: f853 4b04 ldr.w r4, [r3], #4
  2616. 8021f04: f1a4 3501 sub.w r5, r4, #16843009 ; 0x1010101
  2617. 8021f08: ea25 0404 bic.w r4, r5, r4
  2618. 8021f0c: f014 3f80 tst.w r4, #2155905152 ; 0x80808080
  2619. 8021f10: d0f5 beq.n 8021efe <strcat+0x1a>
  2620. 8021f12: 4610 mov r0, r2
  2621. 8021f14: e000 b.n 8021f18 <strcat+0x34>
  2622. 8021f16: 4630 mov r0, r6
  2623. 8021f18: 7803 ldrb r3, [r0, #0]
  2624. 8021f1a: b12b cbz r3, 8021f28 <strcat+0x44>
  2625. 8021f1c: 1c43 adds r3, r0, #1
  2626. 8021f1e: 4618 mov r0, r3
  2627. 8021f20: 3301 adds r3, #1
  2628. 8021f22: 7804 ldrb r4, [r0, #0]
  2629. 8021f24: 2c00 cmp r4, #0
  2630. 8021f26: d1fa bne.n 8021f1e <strcat+0x3a>
  2631. 8021f28: f000 f8f0 bl 802210c <strcpy>
  2632. 8021f2c: 4630 mov r0, r6
  2633. 8021f2e: bd70 pop {r4, r5, r6, pc}
  2634. 08021f30 <strcmp>:
  2635. 8021f30: ea80 0201 eor.w r2, r0, r1
  2636. 8021f34: f012 0f03 tst.w r2, #3
  2637. 8021f38: f040 803a bne.w 8021fb0 <strcmp_unaligned>
  2638. 8021f3c: f010 0203 ands.w r2, r0, #3
  2639. 8021f40: f020 0003 bic.w r0, r0, #3
  2640. 8021f44: f021 0103 bic.w r1, r1, #3
  2641. 8021f48: f850 cb04 ldr.w ip, [r0], #4
  2642. 8021f4c: bf08 it eq
  2643. 8021f4e: f851 3b04 ldreq.w r3, [r1], #4
  2644. 8021f52: d00d beq.n 8021f70 <strcmp+0x40>
  2645. 8021f54: f082 0203 eor.w r2, r2, #3
  2646. 8021f58: ea4f 02c2 mov.w r2, r2, lsl #3
  2647. 8021f5c: f06f 437f mvn.w r3, #4278190080 ; 0xff000000
  2648. 8021f60: fa23 f202 lsr.w r2, r3, r2
  2649. 8021f64: f851 3b04 ldr.w r3, [r1], #4
  2650. 8021f68: ea4c 0c02 orr.w ip, ip, r2
  2651. 8021f6c: ea43 0302 orr.w r3, r3, r2
  2652. 8021f70: f1ac 3201 sub.w r2, ip, #16843009 ; 0x1010101
  2653. 8021f74: 459c cmp ip, r3
  2654. 8021f76: bf01 itttt eq
  2655. 8021f78: ea22 020c biceq.w r2, r2, ip
  2656. 8021f7c: f012 3f80 tsteq.w r2, #2155905152 ; 0x80808080
  2657. 8021f80: f850 cb04 ldreq.w ip, [r0], #4
  2658. 8021f84: f851 3b04 ldreq.w r3, [r1], #4
  2659. 8021f88: d0f2 beq.n 8021f70 <strcmp+0x40>
  2660. 8021f8a: ea4f 600c mov.w r0, ip, lsl #24
  2661. 8021f8e: ea4f 2c1c mov.w ip, ip, lsr #8
  2662. 8021f92: 2801 cmp r0, #1
  2663. 8021f94: bf28 it cs
  2664. 8021f96: ebb0 6f03 cmpcs.w r0, r3, lsl #24
  2665. 8021f9a: bf08 it eq
  2666. 8021f9c: 0a1b lsreq r3, r3, #8
  2667. 8021f9e: d0f4 beq.n 8021f8a <strcmp+0x5a>
  2668. 8021fa0: f003 03ff and.w r3, r3, #255 ; 0xff
  2669. 8021fa4: ea4f 6010 mov.w r0, r0, lsr #24
  2670. 8021fa8: eba0 0003 sub.w r0, r0, r3
  2671. 8021fac: 4770 bx lr
  2672. 8021fae: bf00 nop
  2673. 08021fb0 <strcmp_unaligned>:
  2674. 8021fb0: f010 0f03 tst.w r0, #3
  2675. 8021fb4: d00a beq.n 8021fcc <strcmp_unaligned+0x1c>
  2676. 8021fb6: f810 2b01 ldrb.w r2, [r0], #1
  2677. 8021fba: f811 3b01 ldrb.w r3, [r1], #1
  2678. 8021fbe: 2a01 cmp r2, #1
  2679. 8021fc0: bf28 it cs
  2680. 8021fc2: 429a cmpcs r2, r3
  2681. 8021fc4: d0f4 beq.n 8021fb0 <strcmp_unaligned>
  2682. 8021fc6: eba2 0003 sub.w r0, r2, r3
  2683. 8021fca: 4770 bx lr
  2684. 8021fcc: f84d 5d04 str.w r5, [sp, #-4]!
  2685. 8021fd0: f84d 4d04 str.w r4, [sp, #-4]!
  2686. 8021fd4: f04f 0201 mov.w r2, #1
  2687. 8021fd8: ea42 2202 orr.w r2, r2, r2, lsl #8
  2688. 8021fdc: ea42 4202 orr.w r2, r2, r2, lsl #16
  2689. 8021fe0: f001 0c03 and.w ip, r1, #3
  2690. 8021fe4: f021 0103 bic.w r1, r1, #3
  2691. 8021fe8: f850 4b04 ldr.w r4, [r0], #4
  2692. 8021fec: f851 5b04 ldr.w r5, [r1], #4
  2693. 8021ff0: f1bc 0f02 cmp.w ip, #2
  2694. 8021ff4: d026 beq.n 8022044 <strcmp_unaligned+0x94>
  2695. 8021ff6: d84b bhi.n 8022090 <strcmp_unaligned+0xe0>
  2696. 8021ff8: f024 4c7f bic.w ip, r4, #4278190080 ; 0xff000000
  2697. 8021ffc: ebbc 2f15 cmp.w ip, r5, lsr #8
  2698. 8022000: eba4 0302 sub.w r3, r4, r2
  2699. 8022004: ea23 0304 bic.w r3, r3, r4
  2700. 8022008: d10d bne.n 8022026 <strcmp_unaligned+0x76>
  2701. 802200a: ea13 13c2 ands.w r3, r3, r2, lsl #7
  2702. 802200e: bf08 it eq
  2703. 8022010: f851 5b04 ldreq.w r5, [r1], #4
  2704. 8022014: d10a bne.n 802202c <strcmp_unaligned+0x7c>
  2705. 8022016: ea8c 0c04 eor.w ip, ip, r4
  2706. 802201a: ebbc 6f05 cmp.w ip, r5, lsl #24
  2707. 802201e: d10c bne.n 802203a <strcmp_unaligned+0x8a>
  2708. 8022020: f850 4b04 ldr.w r4, [r0], #4
  2709. 8022024: e7e8 b.n 8021ff8 <strcmp_unaligned+0x48>
  2710. 8022026: ea4f 2515 mov.w r5, r5, lsr #8
  2711. 802202a: e05c b.n 80220e6 <strcmp_unaligned+0x136>
  2712. 802202c: f033 437f bics.w r3, r3, #4278190080 ; 0xff000000
  2713. 8022030: d152 bne.n 80220d8 <strcmp_unaligned+0x128>
  2714. 8022032: 780d ldrb r5, [r1, #0]
  2715. 8022034: ea4f 6c14 mov.w ip, r4, lsr #24
  2716. 8022038: e055 b.n 80220e6 <strcmp_unaligned+0x136>
  2717. 802203a: ea4f 6c14 mov.w ip, r4, lsr #24
  2718. 802203e: f005 05ff and.w r5, r5, #255 ; 0xff
  2719. 8022042: e050 b.n 80220e6 <strcmp_unaligned+0x136>
  2720. 8022044: ea4f 4c04 mov.w ip, r4, lsl #16
  2721. 8022048: eba4 0302 sub.w r3, r4, r2
  2722. 802204c: ea4f 4c1c mov.w ip, ip, lsr #16
  2723. 8022050: ea23 0304 bic.w r3, r3, r4
  2724. 8022054: ebbc 4f15 cmp.w ip, r5, lsr #16
  2725. 8022058: d117 bne.n 802208a <strcmp_unaligned+0xda>
  2726. 802205a: ea13 13c2 ands.w r3, r3, r2, lsl #7
  2727. 802205e: bf08 it eq
  2728. 8022060: f851 5b04 ldreq.w r5, [r1], #4
  2729. 8022064: d107 bne.n 8022076 <strcmp_unaligned+0xc6>
  2730. 8022066: ea8c 0c04 eor.w ip, ip, r4
  2731. 802206a: ebbc 4f05 cmp.w ip, r5, lsl #16
  2732. 802206e: d108 bne.n 8022082 <strcmp_unaligned+0xd2>
  2733. 8022070: f850 4b04 ldr.w r4, [r0], #4
  2734. 8022074: e7e6 b.n 8022044 <strcmp_unaligned+0x94>
  2735. 8022076: 041b lsls r3, r3, #16
  2736. 8022078: d12e bne.n 80220d8 <strcmp_unaligned+0x128>
  2737. 802207a: 880d ldrh r5, [r1, #0]
  2738. 802207c: ea4f 4c14 mov.w ip, r4, lsr #16
  2739. 8022080: e031 b.n 80220e6 <strcmp_unaligned+0x136>
  2740. 8022082: ea4f 4505 mov.w r5, r5, lsl #16
  2741. 8022086: ea4f 4c14 mov.w ip, r4, lsr #16
  2742. 802208a: ea4f 4515 mov.w r5, r5, lsr #16
  2743. 802208e: e02a b.n 80220e6 <strcmp_unaligned+0x136>
  2744. 8022090: f004 0cff and.w ip, r4, #255 ; 0xff
  2745. 8022094: ebbc 6f15 cmp.w ip, r5, lsr #24
  2746. 8022098: eba4 0302 sub.w r3, r4, r2
  2747. 802209c: ea23 0304 bic.w r3, r3, r4
  2748. 80220a0: d10d bne.n 80220be <strcmp_unaligned+0x10e>
  2749. 80220a2: ea13 13c2 ands.w r3, r3, r2, lsl #7
  2750. 80220a6: bf08 it eq
  2751. 80220a8: f851 5b04 ldreq.w r5, [r1], #4
  2752. 80220ac: d10a bne.n 80220c4 <strcmp_unaligned+0x114>
  2753. 80220ae: ea8c 0c04 eor.w ip, ip, r4
  2754. 80220b2: ebbc 2f05 cmp.w ip, r5, lsl #8
  2755. 80220b6: d10a bne.n 80220ce <strcmp_unaligned+0x11e>
  2756. 80220b8: f850 4b04 ldr.w r4, [r0], #4
  2757. 80220bc: e7e8 b.n 8022090 <strcmp_unaligned+0xe0>
  2758. 80220be: ea4f 6515 mov.w r5, r5, lsr #24
  2759. 80220c2: e010 b.n 80220e6 <strcmp_unaligned+0x136>
  2760. 80220c4: f014 0fff tst.w r4, #255 ; 0xff
  2761. 80220c8: d006 beq.n 80220d8 <strcmp_unaligned+0x128>
  2762. 80220ca: f851 5b04 ldr.w r5, [r1], #4
  2763. 80220ce: ea4f 2c14 mov.w ip, r4, lsr #8
  2764. 80220d2: f025 457f bic.w r5, r5, #4278190080 ; 0xff000000
  2765. 80220d6: e006 b.n 80220e6 <strcmp_unaligned+0x136>
  2766. 80220d8: f04f 0000 mov.w r0, #0
  2767. 80220dc: f85d 4b04 ldr.w r4, [sp], #4
  2768. 80220e0: f85d 5b04 ldr.w r5, [sp], #4
  2769. 80220e4: 4770 bx lr
  2770. 80220e6: f00c 02ff and.w r2, ip, #255 ; 0xff
  2771. 80220ea: f005 00ff and.w r0, r5, #255 ; 0xff
  2772. 80220ee: 2801 cmp r0, #1
  2773. 80220f0: bf28 it cs
  2774. 80220f2: 4290 cmpcs r0, r2
  2775. 80220f4: bf04 itt eq
  2776. 80220f6: ea4f 2c1c moveq.w ip, ip, lsr #8
  2777. 80220fa: 0a2d lsreq r5, r5, #8
  2778. 80220fc: d0f3 beq.n 80220e6 <strcmp_unaligned+0x136>
  2779. 80220fe: eba2 0000 sub.w r0, r2, r0
  2780. 8022102: f85d 4b04 ldr.w r4, [sp], #4
  2781. 8022106: f85d 5b04 ldr.w r5, [sp], #4
  2782. 802210a: 4770 bx lr
  2783. 0802210c <strcpy>:
  2784. 802210c: ea80 0201 eor.w r2, r0, r1
  2785. 8022110: 4684 mov ip, r0
  2786. 8022112: f012 0f03 tst.w r2, #3
  2787. 8022116: d14f bne.n 80221b8 <strcpy+0xac>
  2788. 8022118: f011 0f03 tst.w r1, #3
  2789. 802211c: d132 bne.n 8022184 <strcpy+0x78>
  2790. 802211e: f84d 4d04 str.w r4, [sp, #-4]!
  2791. 8022122: f011 0f04 tst.w r1, #4
  2792. 8022126: f851 3b04 ldr.w r3, [r1], #4
  2793. 802212a: d00b beq.n 8022144 <strcpy+0x38>
  2794. 802212c: f1a3 3201 sub.w r2, r3, #16843009 ; 0x1010101
  2795. 8022130: 439a bics r2, r3
  2796. 8022132: f012 3f80 tst.w r2, #2155905152 ; 0x80808080
  2797. 8022136: bf04 itt eq
  2798. 8022138: f84c 3b04 streq.w r3, [ip], #4
  2799. 802213c: f851 3b04 ldreq.w r3, [r1], #4
  2800. 8022140: d116 bne.n 8022170 <strcpy+0x64>
  2801. 8022142: bf00 nop
  2802. 8022144: f851 4b04 ldr.w r4, [r1], #4
  2803. 8022148: f1a3 3201 sub.w r2, r3, #16843009 ; 0x1010101
  2804. 802214c: 439a bics r2, r3
  2805. 802214e: f012 3f80 tst.w r2, #2155905152 ; 0x80808080
  2806. 8022152: f1a4 3201 sub.w r2, r4, #16843009 ; 0x1010101
  2807. 8022156: d10b bne.n 8022170 <strcpy+0x64>
  2808. 8022158: f84c 3b04 str.w r3, [ip], #4
  2809. 802215c: 43a2 bics r2, r4
  2810. 802215e: f012 3f80 tst.w r2, #2155905152 ; 0x80808080
  2811. 8022162: bf04 itt eq
  2812. 8022164: f851 3b04 ldreq.w r3, [r1], #4
  2813. 8022168: f84c 4b04 streq.w r4, [ip], #4
  2814. 802216c: d0ea beq.n 8022144 <strcpy+0x38>
  2815. 802216e: 4623 mov r3, r4
  2816. 8022170: f80c 3b01 strb.w r3, [ip], #1
  2817. 8022174: f013 0fff tst.w r3, #255 ; 0xff
  2818. 8022178: ea4f 2333 mov.w r3, r3, ror #8
  2819. 802217c: d1f8 bne.n 8022170 <strcpy+0x64>
  2820. 802217e: f85d 4b04 ldr.w r4, [sp], #4
  2821. 8022182: 4770 bx lr
  2822. 8022184: f011 0f01 tst.w r1, #1
  2823. 8022188: d006 beq.n 8022198 <strcpy+0x8c>
  2824. 802218a: f811 2b01 ldrb.w r2, [r1], #1
  2825. 802218e: f80c 2b01 strb.w r2, [ip], #1
  2826. 8022192: 2a00 cmp r2, #0
  2827. 8022194: bf08 it eq
  2828. 8022196: 4770 bxeq lr
  2829. 8022198: f011 0f02 tst.w r1, #2
  2830. 802219c: d0bf beq.n 802211e <strcpy+0x12>
  2831. 802219e: f831 2b02 ldrh.w r2, [r1], #2
  2832. 80221a2: f012 0fff tst.w r2, #255 ; 0xff
  2833. 80221a6: bf16 itet ne
  2834. 80221a8: f82c 2b02 strhne.w r2, [ip], #2
  2835. 80221ac: f88c 2000 strbeq.w r2, [ip]
  2836. 80221b0: f412 4f7f tstne.w r2, #65280 ; 0xff00
  2837. 80221b4: d1b3 bne.n 802211e <strcpy+0x12>
  2838. 80221b6: 4770 bx lr
  2839. 80221b8: f811 2b01 ldrb.w r2, [r1], #1
  2840. 80221bc: f80c 2b01 strb.w r2, [ip], #1
  2841. 80221c0: 2a00 cmp r2, #0
  2842. 80221c2: d1f9 bne.n 80221b8 <strcpy+0xac>
  2843. 80221c4: 4770 bx lr
  2844. 80221c6: bf00 nop
  2845. 080221c8 <strlen>:
  2846. 80221c8: f020 0103 bic.w r1, r0, #3
  2847. 80221cc: f010 0003 ands.w r0, r0, #3
  2848. 80221d0: f1c0 0000 rsb r0, r0, #0
  2849. 80221d4: f851 3b04 ldr.w r3, [r1], #4
  2850. 80221d8: f100 0c04 add.w ip, r0, #4
  2851. 80221dc: ea4f 0ccc mov.w ip, ip, lsl #3
  2852. 80221e0: f06f 0200 mvn.w r2, #0
  2853. 80221e4: bf1c itt ne
  2854. 80221e6: fa22 f20c lsrne.w r2, r2, ip
  2855. 80221ea: 4313 orrne r3, r2
  2856. 80221ec: f04f 0c01 mov.w ip, #1
  2857. 80221f0: ea4c 2c0c orr.w ip, ip, ip, lsl #8
  2858. 80221f4: ea4c 4c0c orr.w ip, ip, ip, lsl #16
  2859. 80221f8: eba3 020c sub.w r2, r3, ip
  2860. 80221fc: ea22 0203 bic.w r2, r2, r3
  2861. 8022200: ea12 12cc ands.w r2, r2, ip, lsl #7
  2862. 8022204: bf04 itt eq
  2863. 8022206: f851 3b04 ldreq.w r3, [r1], #4
  2864. 802220a: 3004 addeq r0, #4
  2865. 802220c: d0f4 beq.n 80221f8 <strlen+0x30>
  2866. 802220e: f013 0fff tst.w r3, #255 ; 0xff
  2867. 8022212: bf1f itttt ne
  2868. 8022214: 3001 addne r0, #1
  2869. 8022216: f413 4f7f tstne.w r3, #65280 ; 0xff00
  2870. 802221a: 3001 addne r0, #1
  2871. 802221c: f413 0f7f tstne.w r3, #16711680 ; 0xff0000
  2872. 8022220: bf18 it ne
  2873. 8022222: 3001 addne r0, #1
  2874. 8022224: 4770 bx lr
  2875. 8022226: bf00 nop
  2876. 08022228 <strncat>:
  2877. 8022228: 0783 lsls r3, r0, #30
  2878. 802222a: b470 push {r4, r5, r6}
  2879. 802222c: d113 bne.n 8022256 <strncat+0x2e>
  2880. 802222e: 6803 ldr r3, [r0, #0]
  2881. 8022230: f1a3 3401 sub.w r4, r3, #16843009 ; 0x1010101
  2882. 8022234: ea24 0303 bic.w r3, r4, r3
  2883. 8022238: f013 3f80 tst.w r3, #2155905152 ; 0x80808080
  2884. 802223c: d10b bne.n 8022256 <strncat+0x2e>
  2885. 802223e: 1d03 adds r3, r0, #4
  2886. 8022240: 461d mov r5, r3
  2887. 8022242: f853 4b04 ldr.w r4, [r3], #4
  2888. 8022246: f1a4 3601 sub.w r6, r4, #16843009 ; 0x1010101
  2889. 802224a: ea26 0404 bic.w r4, r6, r4
  2890. 802224e: f014 3f80 tst.w r4, #2155905152 ; 0x80808080
  2891. 8022252: d0f5 beq.n 8022240 <strncat+0x18>
  2892. 8022254: e000 b.n 8022258 <strncat+0x30>
  2893. 8022256: 4605 mov r5, r0
  2894. 8022258: 782b ldrb r3, [r5, #0]
  2895. 802225a: b12b cbz r3, 8022268 <strncat+0x40>
  2896. 802225c: 1c6b adds r3, r5, #1
  2897. 802225e: 461d mov r5, r3
  2898. 8022260: 3301 adds r3, #1
  2899. 8022262: 782c ldrb r4, [r5, #0]
  2900. 8022264: 2c00 cmp r4, #0
  2901. 8022266: d1fa bne.n 802225e <strncat+0x36>
  2902. 8022268: 3901 subs r1, #1
  2903. 802226a: 3d01 subs r5, #1
  2904. 802226c: 1e53 subs r3, r2, #1
  2905. 802226e: b15a cbz r2, 8022288 <strncat+0x60>
  2906. 8022270: f811 4f01 ldrb.w r4, [r1, #1]!
  2907. 8022274: 461a mov r2, r3
  2908. 8022276: f805 4f01 strb.w r4, [r5, #1]!
  2909. 802227a: b12c cbz r4, 8022288 <strncat+0x60>
  2910. 802227c: 2b00 cmp r3, #0
  2911. 802227e: d1f5 bne.n 802226c <strncat+0x44>
  2912. 8022280: 706b strb r3, [r5, #1]
  2913. 8022282: 1e53 subs r3, r2, #1
  2914. 8022284: 2a00 cmp r2, #0
  2915. 8022286: d1f3 bne.n 8022270 <strncat+0x48>
  2916. 8022288: bc70 pop {r4, r5, r6}
  2917. 802228a: 4770 bx lr
  2918. 0802228c <strncmp>:
  2919. 802228c: b470 push {r4, r5, r6}
  2920. 802228e: 2a00 cmp r2, #0
  2921. 8022290: d045 beq.n 802231e <strncmp+0x92>
  2922. 8022292: ea41 0300 orr.w r3, r1, r0
  2923. 8022296: f013 0303 ands.w r3, r3, #3
  2924. 802229a: d129 bne.n 80222f0 <strncmp+0x64>
  2925. 802229c: 2a03 cmp r2, #3
  2926. 802229e: d927 bls.n 80222f0 <strncmp+0x64>
  2927. 80222a0: 6805 ldr r5, [r0, #0]
  2928. 80222a2: 680c ldr r4, [r1, #0]
  2929. 80222a4: 42a5 cmp r5, r4
  2930. 80222a6: d123 bne.n 80222f0 <strncmp+0x64>
  2931. 80222a8: 1f14 subs r4, r2, #4
  2932. 80222aa: d03a beq.n 8022322 <strncmp+0x96>
  2933. 80222ac: f1a5 3201 sub.w r2, r5, #16843009 ; 0x1010101
  2934. 80222b0: ea22 0505 bic.w r5, r2, r5
  2935. 80222b4: f015 3f80 tst.w r5, #2155905152 ; 0x80808080
  2936. 80222b8: d00d beq.n 80222d6 <strncmp+0x4a>
  2937. 80222ba: e03a b.n 8022332 <strncmp+0xa6>
  2938. 80222bc: 685b ldr r3, [r3, #4]
  2939. 80222be: 686a ldr r2, [r5, #4]
  2940. 80222c0: f1a3 3501 sub.w r5, r3, #16843009 ; 0x1010101
  2941. 80222c4: 4293 cmp r3, r2
  2942. 80222c6: ea25 0503 bic.w r5, r5, r3
  2943. 80222ca: d12e bne.n 802232a <strncmp+0x9e>
  2944. 80222cc: 3c04 subs r4, #4
  2945. 80222ce: d028 beq.n 8022322 <strncmp+0x96>
  2946. 80222d0: f015 3f80 tst.w r5, #2155905152 ; 0x80808080
  2947. 80222d4: d127 bne.n 8022326 <strncmp+0x9a>
  2948. 80222d6: 460d mov r5, r1
  2949. 80222d8: 4603 mov r3, r0
  2950. 80222da: 3104 adds r1, #4
  2951. 80222dc: 3004 adds r0, #4
  2952. 80222de: 2c03 cmp r4, #3
  2953. 80222e0: d8ec bhi.n 80222bc <strncmp+0x30>
  2954. 80222e2: 1e66 subs r6, r4, #1
  2955. 80222e4: b92c cbnz r4, 80222f2 <strncmp+0x66>
  2956. 80222e6: 791c ldrb r4, [r3, #4]
  2957. 80222e8: 792a ldrb r2, [r5, #4]
  2958. 80222ea: 1aa0 subs r0, r4, r2
  2959. 80222ec: bc70 pop {r4, r5, r6}
  2960. 80222ee: 4770 bx lr
  2961. 80222f0: 1e56 subs r6, r2, #1
  2962. 80222f2: 7804 ldrb r4, [r0, #0]
  2963. 80222f4: 780a ldrb r2, [r1, #0]
  2964. 80222f6: 4294 cmp r4, r2
  2965. 80222f8: d1f7 bne.n 80222ea <strncmp+0x5e>
  2966. 80222fa: b1c6 cbz r6, 802232e <strncmp+0xa2>
  2967. 80222fc: b18c cbz r4, 8022322 <strncmp+0x96>
  2968. 80222fe: 3601 adds r6, #1
  2969. 8022300: 1c8b adds r3, r1, #2
  2970. 8022302: 1989 adds r1, r1, r6
  2971. 8022304: e004 b.n 8022310 <strncmp+0x84>
  2972. 8022306: 428b cmp r3, r1
  2973. 8022308: f103 0301 add.w r3, r3, #1
  2974. 802230c: d00b beq.n 8022326 <strncmp+0x9a>
  2975. 802230e: b144 cbz r4, 8022322 <strncmp+0x96>
  2976. 8022310: f813 2c01 ldrb.w r2, [r3, #-1]
  2977. 8022314: f810 4f01 ldrb.w r4, [r0, #1]!
  2978. 8022318: 4294 cmp r4, r2
  2979. 802231a: d0f4 beq.n 8022306 <strncmp+0x7a>
  2980. 802231c: e7e5 b.n 80222ea <strncmp+0x5e>
  2981. 802231e: 4610 mov r0, r2
  2982. 8022320: e7e4 b.n 80222ec <strncmp+0x60>
  2983. 8022322: 4620 mov r0, r4
  2984. 8022324: e7e2 b.n 80222ec <strncmp+0x60>
  2985. 8022326: 2000 movs r0, #0
  2986. 8022328: e7e0 b.n 80222ec <strncmp+0x60>
  2987. 802232a: 1e66 subs r6, r4, #1
  2988. 802232c: e7e1 b.n 80222f2 <strncmp+0x66>
  2989. 802232e: 4630 mov r0, r6
  2990. 8022330: e7dc b.n 80222ec <strncmp+0x60>
  2991. 8022332: 4618 mov r0, r3
  2992. 8022334: e7da b.n 80222ec <strncmp+0x60>
  2993. 8022336: bf00 nop
  2994. 08022338 <strncpy>:
  2995. 8022338: ea41 0300 orr.w r3, r1, r0
  2996. 802233c: f013 0f03 tst.w r3, #3
  2997. 8022340: 4603 mov r3, r0
  2998. 8022342: b470 push {r4, r5, r6}
  2999. 8022344: d025 beq.n 8022392 <strncpy+0x5a>
  3000. 8022346: b1aa cbz r2, 8022374 <strncpy+0x3c>
  3001. 8022348: 780c ldrb r4, [r1, #0]
  3002. 802234a: 3a01 subs r2, #1
  3003. 802234c: f803 4b01 strb.w r4, [r3], #1
  3004. 8022350: b14c cbz r4, 8022366 <strncpy+0x2e>
  3005. 8022352: 461c mov r4, r3
  3006. 8022354: b172 cbz r2, 8022374 <strncpy+0x3c>
  3007. 8022356: f811 5f01 ldrb.w r5, [r1, #1]!
  3008. 802235a: 3a01 subs r2, #1
  3009. 802235c: f804 5b01 strb.w r5, [r4], #1
  3010. 8022360: 4623 mov r3, r4
  3011. 8022362: 2d00 cmp r5, #0
  3012. 8022364: d1f6 bne.n 8022354 <strncpy+0x1c>
  3013. 8022366: b12a cbz r2, 8022374 <strncpy+0x3c>
  3014. 8022368: 189a adds r2, r3, r2
  3015. 802236a: 2100 movs r1, #0
  3016. 802236c: f803 1b01 strb.w r1, [r3], #1
  3017. 8022370: 4293 cmp r3, r2
  3018. 8022372: d1fb bne.n 802236c <strncpy+0x34>
  3019. 8022374: bc70 pop {r4, r5, r6}
  3020. 8022376: 4770 bx lr
  3021. 8022378: 460e mov r6, r1
  3022. 802237a: f851 4b04 ldr.w r4, [r1], #4
  3023. 802237e: f1a4 3501 sub.w r5, r4, #16843009 ; 0x1010101
  3024. 8022382: ea25 0504 bic.w r5, r5, r4
  3025. 8022386: f015 3f80 tst.w r5, #2155905152 ; 0x80808080
  3026. 802238a: d105 bne.n 8022398 <strncpy+0x60>
  3027. 802238c: 3a04 subs r2, #4
  3028. 802238e: f843 4b04 str.w r4, [r3], #4
  3029. 8022392: 2a03 cmp r2, #3
  3030. 8022394: d8f0 bhi.n 8022378 <strncpy+0x40>
  3031. 8022396: e7d6 b.n 8022346 <strncpy+0xe>
  3032. 8022398: 4631 mov r1, r6
  3033. 802239a: e7d4 b.n 8022346 <strncpy+0xe>
  3034. 0802239c <strpbrk>:
  3035. 802239c: b4f0 push {r4, r5, r6, r7}
  3036. 802239e: 7804 ldrb r4, [r0, #0]
  3037. 80223a0: 2c00 cmp r4, #0
  3038. 80223a2: d021 beq.n 80223e8 <strpbrk+0x4c>
  3039. 80223a4: 780f ldrb r7, [r1, #0]
  3040. 80223a6: 4606 mov r6, r0
  3041. 80223a8: 4630 mov r0, r6
  3042. 80223aa: b1af cbz r7, 80223d8 <strpbrk+0x3c>
  3043. 80223ac: 42a7 cmp r7, r4
  3044. 80223ae: d019 beq.n 80223e4 <strpbrk+0x48>
  3045. 80223b0: 1c4b adds r3, r1, #1
  3046. 80223b2: e001 b.n 80223b8 <strpbrk+0x1c>
  3047. 80223b4: 4294 cmp r4, r2
  3048. 80223b6: d009 beq.n 80223cc <strpbrk+0x30>
  3049. 80223b8: 461d mov r5, r3
  3050. 80223ba: f813 2b01 ldrb.w r2, [r3], #1
  3051. 80223be: 2a00 cmp r2, #0
  3052. 80223c0: d1f8 bne.n 80223b4 <strpbrk+0x18>
  3053. 80223c2: 7844 ldrb r4, [r0, #1]
  3054. 80223c4: 3601 adds r6, #1
  3055. 80223c6: 2c00 cmp r4, #0
  3056. 80223c8: d1ee bne.n 80223a8 <strpbrk+0xc>
  3057. 80223ca: 782a ldrb r2, [r5, #0]
  3058. 80223cc: 2a00 cmp r2, #0
  3059. 80223ce: bf14 ite ne
  3060. 80223d0: 4630 movne r0, r6
  3061. 80223d2: 2000 moveq r0, #0
  3062. 80223d4: bcf0 pop {r4, r5, r6, r7}
  3063. 80223d6: 4770 bx lr
  3064. 80223d8: 7844 ldrb r4, [r0, #1]
  3065. 80223da: 460d mov r5, r1
  3066. 80223dc: 3601 adds r6, #1
  3067. 80223de: 2c00 cmp r4, #0
  3068. 80223e0: d1e2 bne.n 80223a8 <strpbrk+0xc>
  3069. 80223e2: e7f2 b.n 80223ca <strpbrk+0x2e>
  3070. 80223e4: 463a mov r2, r7
  3071. 80223e6: e7f1 b.n 80223cc <strpbrk+0x30>
  3072. 80223e8: 4620 mov r0, r4
  3073. 80223ea: e7f3 b.n 80223d4 <strpbrk+0x38>
  3074. 080223ec <critical_factorization>:
  3075. 80223ec: e92d 07f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl}
  3076. 80223f0: 2701 movs r7, #1
  3077. 80223f2: 463c mov r4, r7
  3078. 80223f4: 2500 movs r5, #0
  3079. 80223f6: f04f 36ff mov.w r6, #4294967295
  3080. 80223fa: 1963 adds r3, r4, r5
  3081. 80223fc: eb00 0c06 add.w ip, r0, r6
  3082. 8022400: 428b cmp r3, r1
  3083. 8022402: d20d bcs.n 8022420 <critical_factorization+0x34>
  3084. 8022404: f81c c004 ldrb.w ip, [ip, r4]
  3085. 8022408: f810 8003 ldrb.w r8, [r0, r3]
  3086. 802240c: 45e0 cmp r8, ip
  3087. 802240e: d22e bcs.n 802246e <critical_factorization+0x82>
  3088. 8022410: 2401 movs r4, #1
  3089. 8022412: 461d mov r5, r3
  3090. 8022414: 1b9f subs r7, r3, r6
  3091. 8022416: 1963 adds r3, r4, r5
  3092. 8022418: 428b cmp r3, r1
  3093. 802241a: eb00 0c06 add.w ip, r0, r6
  3094. 802241e: d3f1 bcc.n 8022404 <critical_factorization+0x18>
  3095. 8022420: f04f 0a01 mov.w sl, #1
  3096. 8022424: 2500 movs r5, #0
  3097. 8022426: 4654 mov r4, sl
  3098. 8022428: f04f 3cff mov.w ip, #4294967295
  3099. 802242c: 6017 str r7, [r2, #0]
  3100. 802242e: 1963 adds r3, r4, r5
  3101. 8022430: eb00 080c add.w r8, r0, ip
  3102. 8022434: 4299 cmp r1, r3
  3103. 8022436: d90e bls.n 8022456 <critical_factorization+0x6a>
  3104. 8022438: f818 8004 ldrb.w r8, [r8, r4]
  3105. 802243c: f810 9003 ldrb.w r9, [r0, r3]
  3106. 8022440: 45c1 cmp r9, r8
  3107. 8022442: d91a bls.n 802247a <critical_factorization+0x8e>
  3108. 8022444: 2401 movs r4, #1
  3109. 8022446: 461d mov r5, r3
  3110. 8022448: ebcc 0a03 rsb sl, ip, r3
  3111. 802244c: 1963 adds r3, r4, r5
  3112. 802244e: 4299 cmp r1, r3
  3113. 8022450: eb00 080c add.w r8, r0, ip
  3114. 8022454: d8f0 bhi.n 8022438 <critical_factorization+0x4c>
  3115. 8022456: f10c 0001 add.w r0, ip, #1
  3116. 802245a: 3601 adds r6, #1
  3117. 802245c: 42b0 cmp r0, r6
  3118. 802245e: bf3c itt cc
  3119. 8022460: 46ba movcc sl, r7
  3120. 8022462: 4630 movcc r0, r6
  3121. 8022464: f8c2 a000 str.w sl, [r2]
  3122. 8022468: e8bd 07f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl}
  3123. 802246c: 4770 bx lr
  3124. 802246e: d00b beq.n 8022488 <critical_factorization+0x9c>
  3125. 8022470: 2701 movs r7, #1
  3126. 8022472: 462e mov r6, r5
  3127. 8022474: 463c mov r4, r7
  3128. 8022476: 19ed adds r5, r5, r7
  3129. 8022478: e7bf b.n 80223fa <critical_factorization+0xe>
  3130. 802247a: d009 beq.n 8022490 <critical_factorization+0xa4>
  3131. 802247c: f04f 0a01 mov.w sl, #1
  3132. 8022480: 46ac mov ip, r5
  3133. 8022482: 4654 mov r4, sl
  3134. 8022484: 4455 add r5, sl
  3135. 8022486: e7d2 b.n 802242e <critical_factorization+0x42>
  3136. 8022488: 42bc cmp r4, r7
  3137. 802248a: d005 beq.n 8022498 <critical_factorization+0xac>
  3138. 802248c: 3401 adds r4, #1
  3139. 802248e: e7b4 b.n 80223fa <critical_factorization+0xe>
  3140. 8022490: 4554 cmp r4, sl
  3141. 8022492: d005 beq.n 80224a0 <critical_factorization+0xb4>
  3142. 8022494: 3401 adds r4, #1
  3143. 8022496: e7ca b.n 802242e <critical_factorization+0x42>
  3144. 8022498: 4627 mov r7, r4
  3145. 802249a: 461d mov r5, r3
  3146. 802249c: 2401 movs r4, #1
  3147. 802249e: e7ac b.n 80223fa <critical_factorization+0xe>
  3148. 80224a0: 46a2 mov sl, r4
  3149. 80224a2: 461d mov r5, r3
  3150. 80224a4: 2401 movs r4, #1
  3151. 80224a6: e7c2 b.n 802242e <critical_factorization+0x42>
  3152. 080224a8 <two_way_long_needle>:
  3153. 80224a8: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  3154. 80224ac: f2ad 4d24 subw sp, sp, #1060 ; 0x424
  3155. 80224b0: 4616 mov r6, r2
  3156. 80224b2: 4680 mov r8, r0
  3157. 80224b4: 460c mov r4, r1
  3158. 80224b6: 4610 mov r0, r2
  3159. 80224b8: 4619 mov r1, r3
  3160. 80224ba: aa07 add r2, sp, #28
  3161. 80224bc: 461d mov r5, r3
  3162. 80224be: f7ff ff95 bl 80223ec <critical_factorization>
  3163. 80224c2: ab07 add r3, sp, #28
  3164. 80224c4: f20d 421c addw r2, sp, #1052 ; 0x41c
  3165. 80224c8: 9003 str r0, [sp, #12]
  3166. 80224ca: f843 5f04 str.w r5, [r3, #4]!
  3167. 80224ce: 4293 cmp r3, r2
  3168. 80224d0: d1fb bne.n 80224ca <two_way_long_needle+0x22>
  3169. 80224d2: 1e6f subs r7, r5, #1
  3170. 80224d4: 2300 movs r3, #0
  3171. 80224d6: a808 add r0, sp, #32
  3172. 80224d8: b135 cbz r5, 80224e8 <two_way_long_needle+0x40>
  3173. 80224da: 5cf2 ldrb r2, [r6, r3]
  3174. 80224dc: 1af9 subs r1, r7, r3
  3175. 80224de: 3301 adds r3, #1
  3176. 80224e0: 42ab cmp r3, r5
  3177. 80224e2: f840 1022 str.w r1, [r0, r2, lsl #2]
  3178. 80224e6: d1f8 bne.n 80224da <two_way_long_needle+0x32>
  3179. 80224e8: 9907 ldr r1, [sp, #28]
  3180. 80224ea: 4630 mov r0, r6
  3181. 80224ec: 9a03 ldr r2, [sp, #12]
  3182. 80224ee: 1871 adds r1, r6, r1
  3183. 80224f0: f7ff fba6 bl 8021c40 <memcmp>
  3184. 80224f4: 2800 cmp r0, #0
  3185. 80224f6: d17f bne.n 80225f8 <two_way_long_needle+0x150>
  3186. 80224f8: f8dd c00c ldr.w ip, [sp, #12]
  3187. 80224fc: 4622 mov r2, r4
  3188. 80224fe: 4682 mov sl, r0
  3189. 8022500: 1e6f subs r7, r5, #1
  3190. 8022502: f10c 3cff add.w ip, ip, #4294967295
  3191. 8022506: f8cd c008 str.w ip, [sp, #8]
  3192. 802250a: 44b4 add ip, r6
  3193. 802250c: f8cd c014 str.w ip, [sp, #20]
  3194. 8022510: f8dd c00c ldr.w ip, [sp, #12]
  3195. 8022514: 4604 mov r4, r0
  3196. 8022516: 9501 str r5, [sp, #4]
  3197. 8022518: f1cc 0c01 rsb ip, ip, #1
  3198. 802251c: f8cd c010 str.w ip, [sp, #16]
  3199. 8022520: e009 b.n 8022536 <two_way_long_needle+0x8e>
  3200. 8022522: b134 cbz r4, 8022532 <two_way_long_needle+0x8a>
  3201. 8022524: 9a07 ldr r2, [sp, #28]
  3202. 8022526: 4293 cmp r3, r2
  3203. 8022528: bf3e ittt cc
  3204. 802252a: 4604 movcc r4, r0
  3205. 802252c: 9901 ldrcc r1, [sp, #4]
  3206. 802252e: ebc2 0301 rsbcc r3, r2, r1
  3207. 8022532: 449a add sl, r3
  3208. 8022534: 462a mov r2, r5
  3209. 8022536: 9b01 ldr r3, [sp, #4]
  3210. 8022538: eb08 0002 add.w r0, r8, r2
  3211. 802253c: 2100 movs r1, #0
  3212. 802253e: eb0a 0503 add.w r5, sl, r3
  3213. 8022542: 1aaa subs r2, r5, r2
  3214. 8022544: f002 fa90 bl 8024a68 <memchr>
  3215. 8022548: 2800 cmp r0, #0
  3216. 802254a: d14f bne.n 80225ec <two_way_long_needle+0x144>
  3217. 802254c: 2d00 cmp r5, #0
  3218. 802254e: d04d beq.n 80225ec <two_way_long_needle+0x144>
  3219. 8022550: eb08 0305 add.w r3, r8, r5
  3220. 8022554: a908 add r1, sp, #32
  3221. 8022556: f813 3c01 ldrb.w r3, [r3, #-1]
  3222. 802255a: f851 3023 ldr.w r3, [r1, r3, lsl #2]
  3223. 802255e: 2b00 cmp r3, #0
  3224. 8022560: d1df bne.n 8022522 <two_way_long_needle+0x7a>
  3225. 8022562: 9a03 ldr r2, [sp, #12]
  3226. 8022564: 4294 cmp r4, r2
  3227. 8022566: bf28 it cs
  3228. 8022568: 4622 movcs r2, r4
  3229. 802256a: 42ba cmp r2, r7
  3230. 802256c: d211 bcs.n 8022592 <two_way_long_needle+0xea>
  3231. 802256e: eb08 030a add.w r3, r8, sl
  3232. 8022572: f816 c002 ldrb.w ip, [r6, r2]
  3233. 8022576: 18b1 adds r1, r6, r2
  3234. 8022578: 5c98 ldrb r0, [r3, r2]
  3235. 802257a: 4584 cmp ip, r0
  3236. 802257c: d006 beq.n 802258c <two_way_long_needle+0xe4>
  3237. 802257e: e02f b.n 80225e0 <two_way_long_needle+0x138>
  3238. 8022580: f811 0f01 ldrb.w r0, [r1, #1]!
  3239. 8022584: f813 c002 ldrb.w ip, [r3, r2]
  3240. 8022588: 4584 cmp ip, r0
  3241. 802258a: d129 bne.n 80225e0 <two_way_long_needle+0x138>
  3242. 802258c: 3201 adds r2, #1
  3243. 802258e: 42ba cmp r2, r7
  3244. 8022590: d3f6 bcc.n 8022580 <two_way_long_needle+0xd8>
  3245. 8022592: 9b03 ldr r3, [sp, #12]
  3246. 8022594: 9802 ldr r0, [sp, #8]
  3247. 8022596: 429c cmp r4, r3
  3248. 8022598: bf28 it cs
  3249. 802259a: 4618 movcs r0, r3
  3250. 802259c: d218 bcs.n 80225d0 <two_way_long_needle+0x128>
  3251. 802259e: f8dd c008 ldr.w ip, [sp, #8]
  3252. 80225a2: eb08 030a add.w r3, r8, sl
  3253. 80225a6: f816 100c ldrb.w r1, [r6, ip]
  3254. 80225aa: f813 200c ldrb.w r2, [r3, ip]
  3255. 80225ae: 4291 cmp r1, r2
  3256. 80225b0: f040 8085 bne.w 80226be <two_way_long_needle+0x216>
  3257. 80225b4: 9a05 ldr r2, [sp, #20]
  3258. 80225b6: eb06 0b04 add.w fp, r6, r4
  3259. 80225ba: e006 b.n 80225ca <two_way_long_needle+0x122>
  3260. 80225bc: f813 c001 ldrb.w ip, [r3, r1]
  3261. 80225c0: f812 9d01 ldrb.w r9, [r2, #-1]!
  3262. 80225c4: 45e1 cmp r9, ip
  3263. 80225c6: d103 bne.n 80225d0 <two_way_long_needle+0x128>
  3264. 80225c8: 4608 mov r0, r1
  3265. 80225ca: 1e41 subs r1, r0, #1
  3266. 80225cc: 455a cmp r2, fp
  3267. 80225ce: d1f5 bne.n 80225bc <two_way_long_needle+0x114>
  3268. 80225d0: 3401 adds r4, #1
  3269. 80225d2: 4284 cmp r4, r0
  3270. 80225d4: d875 bhi.n 80226c2 <two_way_long_needle+0x21a>
  3271. 80225d6: 9c07 ldr r4, [sp, #28]
  3272. 80225d8: 9b01 ldr r3, [sp, #4]
  3273. 80225da: 44a2 add sl, r4
  3274. 80225dc: 1b1c subs r4, r3, r4
  3275. 80225de: e7a9 b.n 8022534 <two_way_long_needle+0x8c>
  3276. 80225e0: f8dd c010 ldr.w ip, [sp, #16]
  3277. 80225e4: 2400 movs r4, #0
  3278. 80225e6: 44e2 add sl, ip
  3279. 80225e8: 4492 add sl, r2
  3280. 80225ea: e7a3 b.n 8022534 <two_way_long_needle+0x8c>
  3281. 80225ec: 2000 movs r0, #0
  3282. 80225ee: b009 add sp, #36 ; 0x24
  3283. 80225f0: f50d 6d80 add.w sp, sp, #1024 ; 0x400
  3284. 80225f4: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  3285. 80225f8: f8dd c00c ldr.w ip, [sp, #12]
  3286. 80225fc: f04f 0a00 mov.w sl, #0
  3287. 8022600: f8dd b00c ldr.w fp, [sp, #12]
  3288. 8022604: f10d 0920 add.w r9, sp, #32
  3289. 8022608: ebcc 0305 rsb r3, ip, r5
  3290. 802260c: 1e6f subs r7, r5, #1
  3291. 802260e: 4563 cmp r3, ip
  3292. 8022610: bf38 it cc
  3293. 8022612: 4663 movcc r3, ip
  3294. 8022614: 4622 mov r2, r4
  3295. 8022616: 3301 adds r3, #1
  3296. 8022618: 9307 str r3, [sp, #28]
  3297. 802261a: f10c 33ff add.w r3, ip, #4294967295
  3298. 802261e: 9301 str r3, [sp, #4]
  3299. 8022620: 9b03 ldr r3, [sp, #12]
  3300. 8022622: 44b4 add ip, r6
  3301. 8022624: f8cd c008 str.w ip, [sp, #8]
  3302. 8022628: f1c3 0301 rsb r3, r3, #1
  3303. 802262c: 9304 str r3, [sp, #16]
  3304. 802262e: eb0a 0405 add.w r4, sl, r5
  3305. 8022632: eb08 0002 add.w r0, r8, r2
  3306. 8022636: 2100 movs r1, #0
  3307. 8022638: 1aa2 subs r2, r4, r2
  3308. 802263a: f002 fa15 bl 8024a68 <memchr>
  3309. 802263e: 2800 cmp r0, #0
  3310. 8022640: d1d4 bne.n 80225ec <two_way_long_needle+0x144>
  3311. 8022642: 2c00 cmp r4, #0
  3312. 8022644: d0d2 beq.n 80225ec <two_way_long_needle+0x144>
  3313. 8022646: eb08 0304 add.w r3, r8, r4
  3314. 802264a: f813 3c01 ldrb.w r3, [r3, #-1]
  3315. 802264e: f859 3023 ldr.w r3, [r9, r3, lsl #2]
  3316. 8022652: bb63 cbnz r3, 80226ae <two_way_long_needle+0x206>
  3317. 8022654: 45bb cmp fp, r7
  3318. 8022656: eb08 000a add.w r0, r8, sl
  3319. 802265a: d215 bcs.n 8022688 <two_way_long_needle+0x1e0>
  3320. 802265c: f8dd c008 ldr.w ip, [sp, #8]
  3321. 8022660: f810 300b ldrb.w r3, [r0, fp]
  3322. 8022664: f89c 2000 ldrb.w r2, [ip]
  3323. 8022668: 429a cmp r2, r3
  3324. 802266a: bf18 it ne
  3325. 802266c: 465b movne r3, fp
  3326. 802266e: d121 bne.n 80226b4 <two_way_long_needle+0x20c>
  3327. 8022670: 9a02 ldr r2, [sp, #8]
  3328. 8022672: 465b mov r3, fp
  3329. 8022674: e005 b.n 8022682 <two_way_long_needle+0x1da>
  3330. 8022676: f812 1f01 ldrb.w r1, [r2, #1]!
  3331. 802267a: f810 c003 ldrb.w ip, [r0, r3]
  3332. 802267e: 458c cmp ip, r1
  3333. 8022680: d118 bne.n 80226b4 <two_way_long_needle+0x20c>
  3334. 8022682: 3301 adds r3, #1
  3335. 8022684: 42bb cmp r3, r7
  3336. 8022686: d3f6 bcc.n 8022676 <two_way_long_needle+0x1ce>
  3337. 8022688: 9b01 ldr r3, [sp, #4]
  3338. 802268a: 1c5a adds r2, r3, #1
  3339. 802268c: d0af beq.n 80225ee <two_way_long_needle+0x146>
  3340. 802268e: f8dd c004 ldr.w ip, [sp, #4]
  3341. 8022692: f816 100c ldrb.w r1, [r6, ip]
  3342. 8022696: f810 200c ldrb.w r2, [r0, ip]
  3343. 802269a: 4291 cmp r1, r2
  3344. 802269c: d106 bne.n 80226ac <two_way_long_needle+0x204>
  3345. 802269e: f113 33ff adds.w r3, r3, #4294967295
  3346. 80226a2: d3a4 bcc.n 80225ee <two_way_long_needle+0x146>
  3347. 80226a4: 5cf1 ldrb r1, [r6, r3]
  3348. 80226a6: 5cc2 ldrb r2, [r0, r3]
  3349. 80226a8: 4291 cmp r1, r2
  3350. 80226aa: d0f8 beq.n 802269e <two_way_long_needle+0x1f6>
  3351. 80226ac: 9b07 ldr r3, [sp, #28]
  3352. 80226ae: 449a add sl, r3
  3353. 80226b0: 4622 mov r2, r4
  3354. 80226b2: e7bc b.n 802262e <two_way_long_needle+0x186>
  3355. 80226b4: f8dd c010 ldr.w ip, [sp, #16]
  3356. 80226b8: 44e2 add sl, ip
  3357. 80226ba: 449a add sl, r3
  3358. 80226bc: e7f8 b.n 80226b0 <two_way_long_needle+0x208>
  3359. 80226be: 9803 ldr r0, [sp, #12]
  3360. 80226c0: e786 b.n 80225d0 <two_way_long_needle+0x128>
  3361. 80226c2: eb08 000a add.w r0, r8, sl
  3362. 80226c6: e792 b.n 80225ee <two_way_long_needle+0x146>
  3363. 080226c8 <strstr>:
  3364. 80226c8: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  3365. 80226cc: 4680 mov r8, r0
  3366. 80226ce: 7803 ldrb r3, [r0, #0]
  3367. 80226d0: b087 sub sp, #28
  3368. 80226d2: 460e mov r6, r1
  3369. 80226d4: 2b00 cmp r3, #0
  3370. 80226d6: f000 80f7 beq.w 80228c8 <strstr+0x200>
  3371. 80226da: 780a ldrb r2, [r1, #0]
  3372. 80226dc: b19a cbz r2, 8022706 <strstr+0x3e>
  3373. 80226de: 4684 mov ip, r0
  3374. 80226e0: 3101 adds r1, #1
  3375. 80226e2: 2701 movs r7, #1
  3376. 80226e4: e002 b.n 80226ec <strstr+0x24>
  3377. 80226e6: f811 2b01 ldrb.w r2, [r1], #1
  3378. 80226ea: b15a cbz r2, 8022704 <strstr+0x3c>
  3379. 80226ec: 4293 cmp r3, r2
  3380. 80226ee: bf14 ite ne
  3381. 80226f0: 2700 movne r7, #0
  3382. 80226f2: f007 0701 andeq.w r7, r7, #1
  3383. 80226f6: f81c 3f01 ldrb.w r3, [ip, #1]!
  3384. 80226fa: 460d mov r5, r1
  3385. 80226fc: 2b00 cmp r3, #0
  3386. 80226fe: d1f2 bne.n 80226e6 <strstr+0x1e>
  3387. 8022700: 782b ldrb r3, [r5, #0]
  3388. 8022702: bb03 cbnz r3, 8022746 <strstr+0x7e>
  3389. 8022704: b11f cbz r7, 802270e <strstr+0x46>
  3390. 8022706: 4640 mov r0, r8
  3391. 8022708: b007 add sp, #28
  3392. 802270a: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  3393. 802270e: f108 0001 add.w r0, r8, #1
  3394. 8022712: 7831 ldrb r1, [r6, #0]
  3395. 8022714: f002 fe92 bl 802543c <strchr>
  3396. 8022718: 1bad subs r5, r5, r6
  3397. 802271a: 2d01 cmp r5, #1
  3398. 802271c: bf18 it ne
  3399. 802271e: 2800 cmpne r0, #0
  3400. 8022720: 4607 mov r7, r0
  3401. 8022722: bf08 it eq
  3402. 8022724: 4680 moveq r8, r0
  3403. 8022726: d0ee beq.n 8022706 <strstr+0x3e>
  3404. 8022728: 44a8 add r8, r5
  3405. 802272a: 4540 cmp r0, r8
  3406. 802272c: bf94 ite ls
  3407. 802272e: ebc0 0408 rsbls r4, r0, r8
  3408. 8022732: 2401 movhi r4, #1
  3409. 8022734: 2d1f cmp r5, #31
  3410. 8022736: d909 bls.n 802274c <strstr+0x84>
  3411. 8022738: 4621 mov r1, r4
  3412. 802273a: 4632 mov r2, r6
  3413. 802273c: 462b mov r3, r5
  3414. 802273e: f7ff feb3 bl 80224a8 <two_way_long_needle>
  3415. 8022742: 4680 mov r8, r0
  3416. 8022744: e7df b.n 8022706 <strstr+0x3e>
  3417. 8022746: f04f 0800 mov.w r8, #0
  3418. 802274a: e7dc b.n 8022706 <strstr+0x3e>
  3419. 802274c: 4629 mov r1, r5
  3420. 802274e: aa05 add r2, sp, #20
  3421. 8022750: 4630 mov r0, r6
  3422. 8022752: f7ff fe4b bl 80223ec <critical_factorization>
  3423. 8022756: 9905 ldr r1, [sp, #20]
  3424. 8022758: 1871 adds r1, r6, r1
  3425. 802275a: 9001 str r0, [sp, #4]
  3426. 802275c: 4630 mov r0, r6
  3427. 802275e: 9a01 ldr r2, [sp, #4]
  3428. 8022760: f7ff fa6e bl 8021c40 <memcmp>
  3429. 8022764: 2800 cmp r0, #0
  3430. 8022766: d152 bne.n 802280e <strstr+0x146>
  3431. 8022768: 9b01 ldr r3, [sp, #4]
  3432. 802276a: 4683 mov fp, r0
  3433. 802276c: 4680 mov r8, r0
  3434. 802276e: 3b01 subs r3, #1
  3435. 8022770: 9300 str r3, [sp, #0]
  3436. 8022772: 18f3 adds r3, r6, r3
  3437. 8022774: 9303 str r3, [sp, #12]
  3438. 8022776: 9b01 ldr r3, [sp, #4]
  3439. 8022778: f1c3 0301 rsb r3, r3, #1
  3440. 802277c: 9302 str r3, [sp, #8]
  3441. 802277e: 4622 mov r2, r4
  3442. 8022780: eb08 0405 add.w r4, r8, r5
  3443. 8022784: 18b8 adds r0, r7, r2
  3444. 8022786: 2100 movs r1, #0
  3445. 8022788: 1aa2 subs r2, r4, r2
  3446. 802278a: f002 f96d bl 8024a68 <memchr>
  3447. 802278e: 2800 cmp r0, #0
  3448. 8022790: d1d9 bne.n 8022746 <strstr+0x7e>
  3449. 8022792: 2c00 cmp r4, #0
  3450. 8022794: d0d7 beq.n 8022746 <strstr+0x7e>
  3451. 8022796: 9b01 ldr r3, [sp, #4]
  3452. 8022798: 459b cmp fp, r3
  3453. 802279a: bf28 it cs
  3454. 802279c: 465b movcs r3, fp
  3455. 802279e: 429d cmp r5, r3
  3456. 80227a0: d913 bls.n 80227ca <strstr+0x102>
  3457. 80227a2: 18f9 adds r1, r7, r3
  3458. 80227a4: 5cf0 ldrb r0, [r6, r3]
  3459. 80227a6: 18f2 adds r2, r6, r3
  3460. 80227a8: f811 1008 ldrb.w r1, [r1, r8]
  3461. 80227ac: 4288 cmp r0, r1
  3462. 80227ae: f040 8085 bne.w 80228bc <strstr+0x1f4>
  3463. 80227b2: eb07 0c08 add.w ip, r7, r8
  3464. 80227b6: e005 b.n 80227c4 <strstr+0xfc>
  3465. 80227b8: f812 1f01 ldrb.w r1, [r2, #1]!
  3466. 80227bc: f81c 0003 ldrb.w r0, [ip, r3]
  3467. 80227c0: 4288 cmp r0, r1
  3468. 80227c2: d17b bne.n 80228bc <strstr+0x1f4>
  3469. 80227c4: 3301 adds r3, #1
  3470. 80227c6: 429d cmp r5, r3
  3471. 80227c8: d8f6 bhi.n 80227b8 <strstr+0xf0>
  3472. 80227ca: e89d 000a ldmia.w sp, {r1, r3}
  3473. 80227ce: 455b cmp r3, fp
  3474. 80227d0: d97d bls.n 80228ce <strstr+0x206>
  3475. 80227d2: eb07 0908 add.w r9, r7, r8
  3476. 80227d6: 5c72 ldrb r2, [r6, r1]
  3477. 80227d8: f819 3001 ldrb.w r3, [r9, r1]
  3478. 80227dc: 429a cmp r2, r3
  3479. 80227de: d176 bne.n 80228ce <strstr+0x206>
  3480. 80227e0: 9b03 ldr r3, [sp, #12]
  3481. 80227e2: eb06 0a0b add.w sl, r6, fp
  3482. 80227e6: e006 b.n 80227f6 <strstr+0x12e>
  3483. 80227e8: f819 0002 ldrb.w r0, [r9, r2]
  3484. 80227ec: f813 cd01 ldrb.w ip, [r3, #-1]!
  3485. 80227f0: 4584 cmp ip, r0
  3486. 80227f2: d103 bne.n 80227fc <strstr+0x134>
  3487. 80227f4: 4611 mov r1, r2
  3488. 80227f6: 1e4a subs r2, r1, #1
  3489. 80227f8: 4553 cmp r3, sl
  3490. 80227fa: d1f5 bne.n 80227e8 <strstr+0x120>
  3491. 80227fc: f10b 0b01 add.w fp, fp, #1
  3492. 8022800: 458b cmp fp, r1
  3493. 8022802: d866 bhi.n 80228d2 <strstr+0x20a>
  3494. 8022804: 9b05 ldr r3, [sp, #20]
  3495. 8022806: 4498 add r8, r3
  3496. 8022808: ebc3 0b05 rsb fp, r3, r5
  3497. 802280c: e7b7 b.n 802277e <strstr+0xb6>
  3498. 802280e: 9801 ldr r0, [sp, #4]
  3499. 8022810: f04f 0b00 mov.w fp, #0
  3500. 8022814: 4622 mov r2, r4
  3501. 8022816: 1a2b subs r3, r5, r0
  3502. 8022818: eb06 0900 add.w r9, r6, r0
  3503. 802281c: f100 38ff add.w r8, r0, #4294967295
  3504. 8022820: 4682 mov sl, r0
  3505. 8022822: 4283 cmp r3, r0
  3506. 8022824: bf38 it cc
  3507. 8022826: 4603 movcc r3, r0
  3508. 8022828: 1839 adds r1, r7, r0
  3509. 802282a: 3301 adds r3, #1
  3510. 802282c: 9100 str r1, [sp, #0]
  3511. 802282e: 9305 str r3, [sp, #20]
  3512. 8022830: f1c0 0301 rsb r3, r0, #1
  3513. 8022834: 9302 str r3, [sp, #8]
  3514. 8022836: eb0b 0405 add.w r4, fp, r5
  3515. 802283a: 18b8 adds r0, r7, r2
  3516. 802283c: 2100 movs r1, #0
  3517. 802283e: 1aa2 subs r2, r4, r2
  3518. 8022840: f002 f912 bl 8024a68 <memchr>
  3519. 8022844: 2800 cmp r0, #0
  3520. 8022846: f47f af7e bne.w 8022746 <strstr+0x7e>
  3521. 802284a: 2c00 cmp r4, #0
  3522. 802284c: f43f af7b beq.w 8022746 <strstr+0x7e>
  3523. 8022850: 4555 cmp r5, sl
  3524. 8022852: bf98 it ls
  3525. 8022854: eb07 000b addls.w r0, r7, fp
  3526. 8022858: d914 bls.n 8022884 <strstr+0x1bc>
  3527. 802285a: 9800 ldr r0, [sp, #0]
  3528. 802285c: f899 2000 ldrb.w r2, [r9]
  3529. 8022860: f810 300b ldrb.w r3, [r0, fp]
  3530. 8022864: 429a cmp r2, r3
  3531. 8022866: d124 bne.n 80228b2 <strstr+0x1ea>
  3532. 8022868: 464a mov r2, r9
  3533. 802286a: 4653 mov r3, sl
  3534. 802286c: eb07 000b add.w r0, r7, fp
  3535. 8022870: e005 b.n 802287e <strstr+0x1b6>
  3536. 8022872: f812 1f01 ldrb.w r1, [r2, #1]!
  3537. 8022876: f810 c003 ldrb.w ip, [r0, r3]
  3538. 802287a: 458c cmp ip, r1
  3539. 802287c: d11a bne.n 80228b4 <strstr+0x1ec>
  3540. 802287e: 3301 adds r3, #1
  3541. 8022880: 429d cmp r5, r3
  3542. 8022882: d8f6 bhi.n 8022872 <strstr+0x1aa>
  3543. 8022884: f1b8 3fff cmp.w r8, #4294967295
  3544. 8022888: 4643 mov r3, r8
  3545. 802288a: f43f af5a beq.w 8022742 <strstr+0x7a>
  3546. 802288e: f816 1008 ldrb.w r1, [r6, r8]
  3547. 8022892: f810 2008 ldrb.w r2, [r0, r8]
  3548. 8022896: 4291 cmp r1, r2
  3549. 8022898: d107 bne.n 80228aa <strstr+0x1e2>
  3550. 802289a: f113 33ff adds.w r3, r3, #4294967295
  3551. 802289e: f4ff af50 bcc.w 8022742 <strstr+0x7a>
  3552. 80228a2: 5cf1 ldrb r1, [r6, r3]
  3553. 80228a4: 5cc2 ldrb r2, [r0, r3]
  3554. 80228a6: 4291 cmp r1, r2
  3555. 80228a8: d0f7 beq.n 802289a <strstr+0x1d2>
  3556. 80228aa: 9b05 ldr r3, [sp, #20]
  3557. 80228ac: 449b add fp, r3
  3558. 80228ae: 4622 mov r2, r4
  3559. 80228b0: e7c1 b.n 8022836 <strstr+0x16e>
  3560. 80228b2: 4653 mov r3, sl
  3561. 80228b4: 9a02 ldr r2, [sp, #8]
  3562. 80228b6: 4493 add fp, r2
  3563. 80228b8: 449b add fp, r3
  3564. 80228ba: e7f8 b.n 80228ae <strstr+0x1e6>
  3565. 80228bc: 9902 ldr r1, [sp, #8]
  3566. 80228be: f04f 0b00 mov.w fp, #0
  3567. 80228c2: 4488 add r8, r1
  3568. 80228c4: 4498 add r8, r3
  3569. 80228c6: e75a b.n 802277e <strstr+0xb6>
  3570. 80228c8: 460d mov r5, r1
  3571. 80228ca: 2701 movs r7, #1
  3572. 80228cc: e718 b.n 8022700 <strstr+0x38>
  3573. 80228ce: 9901 ldr r1, [sp, #4]
  3574. 80228d0: e794 b.n 80227fc <strstr+0x134>
  3575. 80228d2: 44b8 add r8, r7
  3576. 80228d4: e717 b.n 8022706 <strstr+0x3e>
  3577. 80228d6: bf00 nop
  3578. 080228d8 <_strtod_r>:
  3579. 80228d8: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  3580. 80228dc: b09d sub sp, #116 ; 0x74
  3581. 80228de: 468c mov ip, r1
  3582. 80228e0: 4683 mov fp, r0
  3583. 80228e2: 9210 str r2, [sp, #64] ; 0x40
  3584. 80228e4: 4662 mov r2, ip
  3585. 80228e6: 2000 movs r0, #0
  3586. 80228e8: 2100 movs r1, #0
  3587. 80228ea: f8cd c05c str.w ip, [sp, #92] ; 0x5c
  3588. 80228ee: e9cd 0106 strd r0, r1, [sp, #24]
  3589. 80228f2: 4611 mov r1, r2
  3590. 80228f4: f812 3b01 ldrb.w r3, [r2], #1
  3591. 80228f8: 2b2d cmp r3, #45 ; 0x2d
  3592. 80228fa: f200 8147 bhi.w 8022b8c <_strtod_r+0x2b4>
  3593. 80228fe: e8df f013 tbh [pc, r3, lsl #1]
  3594. 8022902: 0131 .short 0x0131
  3595. 8022904: 01450145 .word 0x01450145
  3596. 8022908: 01450145 .word 0x01450145
  3597. 802290c: 01450145 .word 0x01450145
  3598. 8022910: 01450145 .word 0x01450145
  3599. 8022914: 01640164 .word 0x01640164
  3600. 8022918: 01640164 .word 0x01640164
  3601. 802291c: 01450164 .word 0x01450164
  3602. 8022920: 01450145 .word 0x01450145
  3603. 8022924: 01450145 .word 0x01450145
  3604. 8022928: 01450145 .word 0x01450145
  3605. 802292c: 01450145 .word 0x01450145
  3606. 8022930: 01450145 .word 0x01450145
  3607. 8022934: 01450145 .word 0x01450145
  3608. 8022938: 01450145 .word 0x01450145
  3609. 802293c: 01450145 .word 0x01450145
  3610. 8022940: 01640145 .word 0x01640145
  3611. 8022944: 01450145 .word 0x01450145
  3612. 8022948: 01450145 .word 0x01450145
  3613. 802294c: 01450145 .word 0x01450145
  3614. 8022950: 01450145 .word 0x01450145
  3615. 8022954: 01450145 .word 0x01450145
  3616. 8022958: 0145012e .word 0x0145012e
  3617. 802295c: 002e .short 0x002e
  3618. 802295e: 2501 movs r5, #1
  3619. 8022960: 9512 str r5, [sp, #72] ; 0x48
  3620. 8022962: 1c4e adds r6, r1, #1
  3621. 8022964: 9617 str r6, [sp, #92] ; 0x5c
  3622. 8022966: 784b ldrb r3, [r1, #1]
  3623. 8022968: 4699 mov r9, r3
  3624. 802296a: 469a mov sl, r3
  3625. 802296c: 2b00 cmp r3, #0
  3626. 802296e: f000 80fc beq.w 8022b6a <_strtod_r+0x292>
  3627. 8022972: 2b30 cmp r3, #48 ; 0x30
  3628. 8022974: bf18 it ne
  3629. 8022976: f04f 0900 movne.w r9, #0
  3630. 802297a: f000 8110 beq.w 8022b9e <_strtod_r+0x2c6>
  3631. 802297e: 2b2f cmp r3, #47 ; 0x2f
  3632. 8022980: 461d mov r5, r3
  3633. 8022982: f04f 0a00 mov.w sl, #0
  3634. 8022986: f340 84f9 ble.w 802337c <_strtod_r+0xaa4>
  3635. 802298a: 2b39 cmp r3, #57 ; 0x39
  3636. 802298c: f300 84f6 bgt.w 802337c <_strtod_r+0xaa4>
  3637. 8022990: 1c72 adds r2, r6, #1
  3638. 8022992: 4657 mov r7, sl
  3639. 8022994: 4654 mov r4, sl
  3640. 8022996: e001 b.n 802299c <_strtod_r+0xc4>
  3641. 8022998: 2b39 cmp r3, #57 ; 0x39
  3642. 802299a: dc18 bgt.n 80229ce <_strtod_r+0xf6>
  3643. 802299c: eb07 0187 add.w r1, r7, r7, lsl #2
  3644. 80229a0: 2c08 cmp r4, #8
  3645. 80229a2: eb03 0141 add.w r1, r3, r1, lsl #1
  3646. 80229a6: bfd8 it le
  3647. 80229a8: f1a1 0730 suble.w r7, r1, #48 ; 0x30
  3648. 80229ac: dd07 ble.n 80229be <_strtod_r+0xe6>
  3649. 80229ae: eb0a 018a add.w r1, sl, sl, lsl #2
  3650. 80229b2: 2c0f cmp r4, #15
  3651. 80229b4: eb03 0341 add.w r3, r3, r1, lsl #1
  3652. 80229b8: bfd8 it le
  3653. 80229ba: f1a3 0a30 suble.w sl, r3, #48 ; 0x30
  3654. 80229be: 9217 str r2, [sp, #92] ; 0x5c
  3655. 80229c0: 4690 mov r8, r2
  3656. 80229c2: f812 3b01 ldrb.w r3, [r2], #1
  3657. 80229c6: 3401 adds r4, #1
  3658. 80229c8: 2b2f cmp r3, #47 ; 0x2f
  3659. 80229ca: 461d mov r5, r3
  3660. 80229cc: dce4 bgt.n 8022998 <_strtod_r+0xc0>
  3661. 80229ce: 4658 mov r0, fp
  3662. 80229d0: f8cd c010 str.w ip, [sp, #16]
  3663. 80229d4: f001 fd5a bl 802448c <_localeconv_r>
  3664. 80229d8: 6801 ldr r1, [r0, #0]
  3665. 80229da: 4658 mov r0, fp
  3666. 80229dc: 9105 str r1, [sp, #20]
  3667. 80229de: f001 fd55 bl 802448c <_localeconv_r>
  3668. 80229e2: 6800 ldr r0, [r0, #0]
  3669. 80229e4: f7ff fbf0 bl 80221c8 <strlen>
  3670. 80229e8: 9905 ldr r1, [sp, #20]
  3671. 80229ea: 4602 mov r2, r0
  3672. 80229ec: 4640 mov r0, r8
  3673. 80229ee: f7ff fc4d bl 802228c <strncmp>
  3674. 80229f2: f8dd c010 ldr.w ip, [sp, #16]
  3675. 80229f6: 4680 mov r8, r0
  3676. 80229f8: 2800 cmp r0, #0
  3677. 80229fa: f000 8142 beq.w 8022c82 <_strtod_r+0x3aa>
  3678. 80229fe: 2000 movs r0, #0
  3679. 8022a00: 46a0 mov r8, r4
  3680. 8022a02: 4601 mov r1, r0
  3681. 8022a04: 9009 str r0, [sp, #36] ; 0x24
  3682. 8022a06: f025 0320 bic.w r3, r5, #32
  3683. 8022a0a: 2b45 cmp r3, #69 ; 0x45
  3684. 8022a0c: f040 80df bne.w 8022bce <_strtod_r+0x2f6>
  3685. 8022a10: ea48 0300 orr.w r3, r8, r0
  3686. 8022a14: ea53 0309 orrs.w r3, r3, r9
  3687. 8022a18: f000 811d beq.w 8022c56 <_strtod_r+0x37e>
  3688. 8022a1c: f8dd c05c ldr.w ip, [sp, #92] ; 0x5c
  3689. 8022a20: f10c 0301 add.w r3, ip, #1
  3690. 8022a24: 9317 str r3, [sp, #92] ; 0x5c
  3691. 8022a26: f89c 5001 ldrb.w r5, [ip, #1]
  3692. 8022a2a: 2d2b cmp r5, #43 ; 0x2b
  3693. 8022a2c: f000 84ab beq.w 8023386 <_strtod_r+0xaae>
  3694. 8022a30: 2d2d cmp r5, #45 ; 0x2d
  3695. 8022a32: f000 833d beq.w 80230b0 <_strtod_r+0x7d8>
  3696. 8022a36: 2200 movs r2, #0
  3697. 8022a38: 920a str r2, [sp, #40] ; 0x28
  3698. 8022a3a: f1a5 0330 sub.w r3, r5, #48 ; 0x30
  3699. 8022a3e: 2b09 cmp r3, #9
  3700. 8022a40: f200 842c bhi.w 802329c <_strtod_r+0x9c4>
  3701. 8022a44: 2d30 cmp r5, #48 ; 0x30
  3702. 8022a46: d106 bne.n 8022a56 <_strtod_r+0x17e>
  3703. 8022a48: 9b17 ldr r3, [sp, #92] ; 0x5c
  3704. 8022a4a: 3301 adds r3, #1
  3705. 8022a4c: 9317 str r3, [sp, #92] ; 0x5c
  3706. 8022a4e: f813 5b01 ldrb.w r5, [r3], #1
  3707. 8022a52: 2d30 cmp r5, #48 ; 0x30
  3708. 8022a54: d0fa beq.n 8022a4c <_strtod_r+0x174>
  3709. 8022a56: f1a5 0331 sub.w r3, r5, #49 ; 0x31
  3710. 8022a5a: 2b08 cmp r3, #8
  3711. 8022a5c: f200 80b7 bhi.w 8022bce <_strtod_r+0x2f6>
  3712. 8022a60: 9a17 ldr r2, [sp, #92] ; 0x5c
  3713. 8022a62: 3d30 subs r5, #48 ; 0x30
  3714. 8022a64: 950d str r5, [sp, #52] ; 0x34
  3715. 8022a66: 1c53 adds r3, r2, #1
  3716. 8022a68: 9317 str r3, [sp, #92] ; 0x5c
  3717. 8022a6a: 7855 ldrb r5, [r2, #1]
  3718. 8022a6c: 920b str r2, [sp, #44] ; 0x2c
  3719. 8022a6e: 2d2f cmp r5, #47 ; 0x2f
  3720. 8022a70: dd16 ble.n 8022aa0 <_strtod_r+0x1c8>
  3721. 8022a72: 2d39 cmp r5, #57 ; 0x39
  3722. 8022a74: dc14 bgt.n 8022aa0 <_strtod_r+0x1c8>
  3723. 8022a76: 1c93 adds r3, r2, #2
  3724. 8022a78: 910c str r1, [sp, #48] ; 0x30
  3725. 8022a7a: 9a0d ldr r2, [sp, #52] ; 0x34
  3726. 8022a7c: e001 b.n 8022a82 <_strtod_r+0x1aa>
  3727. 8022a7e: 2d39 cmp r5, #57 ; 0x39
  3728. 8022a80: dc0b bgt.n 8022a9a <_strtod_r+0x1c2>
  3729. 8022a82: 9317 str r3, [sp, #92] ; 0x5c
  3730. 8022a84: 4619 mov r1, r3
  3731. 8022a86: eb02 0282 add.w r2, r2, r2, lsl #2
  3732. 8022a8a: 3301 adds r3, #1
  3733. 8022a8c: eb05 0242 add.w r2, r5, r2, lsl #1
  3734. 8022a90: f813 5c01 ldrb.w r5, [r3, #-1]
  3735. 8022a94: 3a30 subs r2, #48 ; 0x30
  3736. 8022a96: 2d2f cmp r5, #47 ; 0x2f
  3737. 8022a98: dcf1 bgt.n 8022a7e <_strtod_r+0x1a6>
  3738. 8022a9a: 460b mov r3, r1
  3739. 8022a9c: 990c ldr r1, [sp, #48] ; 0x30
  3740. 8022a9e: 920d str r2, [sp, #52] ; 0x34
  3741. 8022aa0: 9a0b ldr r2, [sp, #44] ; 0x2c
  3742. 8022aa2: 1a9b subs r3, r3, r2
  3743. 8022aa4: 2b08 cmp r3, #8
  3744. 8022aa6: bfc8 it gt
  3745. 8022aa8: f644 621f movwgt r2, #19999 ; 0x4e1f
  3746. 8022aac: dc05 bgt.n 8022aba <_strtod_r+0x1e2>
  3747. 8022aae: 9a0d ldr r2, [sp, #52] ; 0x34
  3748. 8022ab0: f644 631f movw r3, #19999 ; 0x4e1f
  3749. 8022ab4: 429a cmp r2, r3
  3750. 8022ab6: bfa8 it ge
  3751. 8022ab8: 461a movge r2, r3
  3752. 8022aba: 9b0a ldr r3, [sp, #40] ; 0x28
  3753. 8022abc: b103 cbz r3, 8022ac0 <_strtod_r+0x1e8>
  3754. 8022abe: 4252 negs r2, r2
  3755. 8022ac0: f1b8 0f00 cmp.w r8, #0
  3756. 8022ac4: f000 8088 beq.w 8022bd8 <_strtod_r+0x300>
  3757. 8022ac8: 9d09 ldr r5, [sp, #36] ; 0x24
  3758. 8022aca: 4638 mov r0, r7
  3759. 8022acc: 2c00 cmp r4, #0
  3760. 8022ace: bf08 it eq
  3761. 8022ad0: 4644 moveq r4, r8
  3762. 8022ad2: 940a str r4, [sp, #40] ; 0x28
  3763. 8022ad4: 1b52 subs r2, r2, r5
  3764. 8022ad6: 9209 str r2, [sp, #36] ; 0x24
  3765. 8022ad8: f7fd fd38 bl 802054c <__aeabi_ui2d>
  3766. 8022adc: f1b8 0f10 cmp.w r8, #16
  3767. 8022ae0: bfb4 ite lt
  3768. 8022ae2: 46c1 movlt r9, r8
  3769. 8022ae4: f04f 0910 movge.w r9, #16
  3770. 8022ae8: f1b9 0f09 cmp.w r9, #9
  3771. 8022aec: 4602 mov r2, r0
  3772. 8022aee: 460b mov r3, r1
  3773. 8022af0: e9cd 2306 strd r2, r3, [sp, #24]
  3774. 8022af4: dd16 ble.n 8022b24 <_strtod_r+0x24c>
  3775. 8022af6: f648 63e8 movw r3, #36584 ; 0x8ee8
  3776. 8022afa: f6c0 0303 movt r3, #2051 ; 0x803
  3777. 8022afe: eb03 03c9 add.w r3, r3, r9, lsl #3
  3778. 8022b02: e953 2312 ldrd r2, r3, [r3, #-72] ; 0x48
  3779. 8022b06: f7fd fd97 bl 8020638 <__aeabi_dmul>
  3780. 8022b0a: 4604 mov r4, r0
  3781. 8022b0c: 4650 mov r0, sl
  3782. 8022b0e: 460d mov r5, r1
  3783. 8022b10: f7fd fd1c bl 802054c <__aeabi_ui2d>
  3784. 8022b14: 4602 mov r2, r0
  3785. 8022b16: 460b mov r3, r1
  3786. 8022b18: 4620 mov r0, r4
  3787. 8022b1a: 4629 mov r1, r5
  3788. 8022b1c: f7fd fbda bl 80202d4 <__adddf3>
  3789. 8022b20: e9cd 0106 strd r0, r1, [sp, #24]
  3790. 8022b24: f1b8 0f0f cmp.w r8, #15
  3791. 8022b28: f300 80f2 bgt.w 8022d10 <_strtod_r+0x438>
  3792. 8022b2c: 9c09 ldr r4, [sp, #36] ; 0x24
  3793. 8022b2e: 2c00 cmp r4, #0
  3794. 8022b30: f000 80a2 beq.w 8022c78 <_strtod_r+0x3a0>
  3795. 8022b34: f340 8591 ble.w 802365a <_strtod_r+0xd82>
  3796. 8022b38: 9d09 ldr r5, [sp, #36] ; 0x24
  3797. 8022b3a: 2d16 cmp r5, #22
  3798. 8022b3c: f300 8545 bgt.w 80235ca <_strtod_r+0xcf2>
  3799. 8022b40: f648 61e8 movw r1, #36584 ; 0x8ee8
  3800. 8022b44: e9dd 2306 ldrd r2, r3, [sp, #24]
  3801. 8022b48: f6c0 0103 movt r1, #2051 ; 0x803
  3802. 8022b4c: eb01 01c5 add.w r1, r1, r5, lsl #3
  3803. 8022b50: e9d1 0100 ldrd r0, r1, [r1]
  3804. 8022b54: f7fd fd70 bl 8020638 <__aeabi_dmul>
  3805. 8022b58: 4681 mov r9, r0
  3806. 8022b5a: 468a mov sl, r1
  3807. 8022b5c: e009 b.n 8022b72 <_strtod_r+0x29a>
  3808. 8022b5e: 2400 movs r4, #0
  3809. 8022b60: 9412 str r4, [sp, #72] ; 0x48
  3810. 8022b62: e6fe b.n 8022962 <_strtod_r+0x8a>
  3811. 8022b64: f04f 0900 mov.w r9, #0
  3812. 8022b68: 46ca mov sl, r9
  3813. 8022b6a: 2400 movs r4, #0
  3814. 8022b6c: f8cd c05c str.w ip, [sp, #92] ; 0x5c
  3815. 8022b70: 9412 str r4, [sp, #72] ; 0x48
  3816. 8022b72: 9c10 ldr r4, [sp, #64] ; 0x40
  3817. 8022b74: b10c cbz r4, 8022b7a <_strtod_r+0x2a2>
  3818. 8022b76: 9b17 ldr r3, [sp, #92] ; 0x5c
  3819. 8022b78: 6023 str r3, [r4, #0]
  3820. 8022b7a: 9d12 ldr r5, [sp, #72] ; 0x48
  3821. 8022b7c: b10d cbz r5, 8022b82 <_strtod_r+0x2aa>
  3822. 8022b7e: f10a 4a00 add.w sl, sl, #2147483648 ; 0x80000000
  3823. 8022b82: 4648 mov r0, r9
  3824. 8022b84: 4651 mov r1, sl
  3825. 8022b86: b01d add sp, #116 ; 0x74
  3826. 8022b88: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  3827. 8022b8c: 2500 movs r5, #0
  3828. 8022b8e: 2b30 cmp r3, #48 ; 0x30
  3829. 8022b90: 460e mov r6, r1
  3830. 8022b92: 9512 str r5, [sp, #72] ; 0x48
  3831. 8022b94: bf18 it ne
  3832. 8022b96: f04f 0900 movne.w r9, #0
  3833. 8022b9a: f47f aef0 bne.w 802297e <_strtod_r+0xa6>
  3834. 8022b9e: 7873 ldrb r3, [r6, #1]
  3835. 8022ba0: 2b58 cmp r3, #88 ; 0x58
  3836. 8022ba2: f000 8383 beq.w 80232ac <_strtod_r+0x9d4>
  3837. 8022ba6: 1c72 adds r2, r6, #1
  3838. 8022ba8: 2b78 cmp r3, #120 ; 0x78
  3839. 8022baa: f000 837f beq.w 80232ac <_strtod_r+0x9d4>
  3840. 8022bae: 4616 mov r6, r2
  3841. 8022bb0: 9217 str r2, [sp, #92] ; 0x5c
  3842. 8022bb2: f812 3b01 ldrb.w r3, [r2], #1
  3843. 8022bb6: 2b30 cmp r3, #48 ; 0x30
  3844. 8022bb8: d0f9 beq.n 8022bae <_strtod_r+0x2d6>
  3845. 8022bba: f04f 0901 mov.w r9, #1
  3846. 8022bbe: 2b00 cmp r3, #0
  3847. 8022bc0: f47f aedd bne.w 802297e <_strtod_r+0xa6>
  3848. 8022bc4: 4699 mov r9, r3
  3849. 8022bc6: 469a mov sl, r3
  3850. 8022bc8: e7d3 b.n 8022b72 <_strtod_r+0x29a>
  3851. 8022bca: 9217 str r2, [sp, #92] ; 0x5c
  3852. 8022bcc: e691 b.n 80228f2 <_strtod_r+0x1a>
  3853. 8022bce: 2200 movs r2, #0
  3854. 8022bd0: f1b8 0f00 cmp.w r8, #0
  3855. 8022bd4: f47f af78 bne.w 8022ac8 <_strtod_r+0x1f0>
  3856. 8022bd8: ea50 0009 orrs.w r0, r0, r9
  3857. 8022bdc: d14c bne.n 8022c78 <_strtod_r+0x3a0>
  3858. 8022bde: 2900 cmp r1, #0
  3859. 8022be0: d139 bne.n 8022c56 <_strtod_r+0x37e>
  3860. 8022be2: 3d49 subs r5, #73 ; 0x49
  3861. 8022be4: 2d25 cmp r5, #37 ; 0x25
  3862. 8022be6: d836 bhi.n 8022c56 <_strtod_r+0x37e>
  3863. 8022be8: e8df f015 tbh [pc, r5, lsl #1]
  3864. 8022bec: 0035026a .word 0x0035026a
  3865. 8022bf0: 00350035 .word 0x00350035
  3866. 8022bf4: 00260035 .word 0x00260035
  3867. 8022bf8: 00350035 .word 0x00350035
  3868. 8022bfc: 00350035 .word 0x00350035
  3869. 8022c00: 00350035 .word 0x00350035
  3870. 8022c04: 00350035 .word 0x00350035
  3871. 8022c08: 00350035 .word 0x00350035
  3872. 8022c0c: 00350035 .word 0x00350035
  3873. 8022c10: 00350035 .word 0x00350035
  3874. 8022c14: 00350035 .word 0x00350035
  3875. 8022c18: 00350035 .word 0x00350035
  3876. 8022c1c: 00350035 .word 0x00350035
  3877. 8022c20: 00350035 .word 0x00350035
  3878. 8022c24: 00350035 .word 0x00350035
  3879. 8022c28: 00350035 .word 0x00350035
  3880. 8022c2c: 0035026a .word 0x0035026a
  3881. 8022c30: 00350035 .word 0x00350035
  3882. 8022c34: 00260035 .word 0x00260035
  3883. 8022c38: 4853 ldr r0, [pc, #332] ; (8022d88 <_strtod_r+0x4b0>)
  3884. 8022c3a: 9a17 ldr r2, [sp, #92] ; 0x5c
  3885. 8022c3c: f810 1f01 ldrb.w r1, [r0, #1]!
  3886. 8022c40: 4613 mov r3, r2
  3887. 8022c42: b169 cbz r1, 8022c60 <_strtod_r+0x388>
  3888. 8022c44: 785b ldrb r3, [r3, #1]
  3889. 8022c46: 3201 adds r2, #1
  3890. 8022c48: 2b40 cmp r3, #64 ; 0x40
  3891. 8022c4a: dd02 ble.n 8022c52 <_strtod_r+0x37a>
  3892. 8022c4c: 2b5a cmp r3, #90 ; 0x5a
  3893. 8022c4e: bfd8 it le
  3894. 8022c50: 3320 addle r3, #32
  3895. 8022c52: 428b cmp r3, r1
  3896. 8022c54: d0f2 beq.n 8022c3c <_strtod_r+0x364>
  3897. 8022c56: f8dd 9018 ldr.w r9, [sp, #24]
  3898. 8022c5a: f8dd a01c ldr.w sl, [sp, #28]
  3899. 8022c5e: e784 b.n 8022b6a <_strtod_r+0x292>
  3900. 8022c60: 1c53 adds r3, r2, #1
  3901. 8022c62: 9317 str r3, [sp, #92] ; 0x5c
  3902. 8022c64: 7853 ldrb r3, [r2, #1]
  3903. 8022c66: 2b28 cmp r3, #40 ; 0x28
  3904. 8022c68: f000 8575 beq.w 8023756 <_strtod_r+0xe7e>
  3905. 8022c6c: 2300 movs r3, #0
  3906. 8022c6e: 9306 str r3, [sp, #24]
  3907. 8022c70: 461c mov r4, r3
  3908. 8022c72: f6cf 74f8 movt r4, #65528 ; 0xfff8
  3909. 8022c76: 9407 str r4, [sp, #28]
  3910. 8022c78: f8dd 9018 ldr.w r9, [sp, #24]
  3911. 8022c7c: f8dd a01c ldr.w sl, [sp, #28]
  3912. 8022c80: e777 b.n 8022b72 <_strtod_r+0x29a>
  3913. 8022c82: 4658 mov r0, fp
  3914. 8022c84: 9d17 ldr r5, [sp, #92] ; 0x5c
  3915. 8022c86: f001 fc01 bl 802448c <_localeconv_r>
  3916. 8022c8a: 6800 ldr r0, [r0, #0]
  3917. 8022c8c: f7ff fa9c bl 80221c8 <strlen>
  3918. 8022c90: f8dd c010 ldr.w ip, [sp, #16]
  3919. 8022c94: 182b adds r3, r5, r0
  3920. 8022c96: 9317 str r3, [sp, #92] ; 0x5c
  3921. 8022c98: 5c2d ldrb r5, [r5, r0]
  3922. 8022c9a: 2c00 cmp r4, #0
  3923. 8022c9c: f040 819b bne.w 8022fd6 <_strtod_r+0x6fe>
  3924. 8022ca0: 2d30 cmp r5, #48 ; 0x30
  3925. 8022ca2: 4620 mov r0, r4
  3926. 8022ca4: d105 bne.n 8022cb2 <_strtod_r+0x3da>
  3927. 8022ca6: 3301 adds r3, #1
  3928. 8022ca8: 9317 str r3, [sp, #92] ; 0x5c
  3929. 8022caa: 3001 adds r0, #1
  3930. 8022cac: 781d ldrb r5, [r3, #0]
  3931. 8022cae: 2d30 cmp r5, #48 ; 0x30
  3932. 8022cb0: d0f9 beq.n 8022ca6 <_strtod_r+0x3ce>
  3933. 8022cb2: f1a5 0331 sub.w r3, r5, #49 ; 0x31
  3934. 8022cb6: 2b08 cmp r3, #8
  3935. 8022cb8: f200 819a bhi.w 8022ff0 <_strtod_r+0x718>
  3936. 8022cbc: 9e17 ldr r6, [sp, #92] ; 0x5c
  3937. 8022cbe: f04f 0800 mov.w r8, #0
  3938. 8022cc2: 9009 str r0, [sp, #36] ; 0x24
  3939. 8022cc4: f1a5 0130 sub.w r1, r5, #48 ; 0x30
  3940. 8022cc8: 2001 movs r0, #1
  3941. 8022cca: 960a str r6, [sp, #40] ; 0x28
  3942. 8022ccc: 2900 cmp r1, #0
  3943. 8022cce: f000 836c beq.w 80233aa <_strtod_r+0xad2>
  3944. 8022cd2: 9a09 ldr r2, [sp, #36] ; 0x24
  3945. 8022cd4: 2801 cmp r0, #1
  3946. 8022cd6: 4402 add r2, r0
  3947. 8022cd8: 9209 str r2, [sp, #36] ; 0x24
  3948. 8022cda: f000 8532 beq.w 8023742 <_strtod_r+0xe6a>
  3949. 8022cde: eb08 0200 add.w r2, r8, r0
  3950. 8022ce2: 4643 mov r3, r8
  3951. 8022ce4: 3a01 subs r2, #1
  3952. 8022ce6: f8cd 802c str.w r8, [sp, #44] ; 0x2c
  3953. 8022cea: 4690 mov r8, r2
  3954. 8022cec: e003 b.n 8022cf6 <_strtod_r+0x41e>
  3955. 8022cee: 006f lsls r7, r5, #1
  3956. 8022cf0: 4543 cmp r3, r8
  3957. 8022cf2: f000 834b beq.w 802338c <_strtod_r+0xab4>
  3958. 8022cf6: 3301 adds r3, #1
  3959. 8022cf8: eb07 0587 add.w r5, r7, r7, lsl #2
  3960. 8022cfc: 1e5a subs r2, r3, #1
  3961. 8022cfe: 2a08 cmp r2, #8
  3962. 8022d00: ddf5 ble.n 8022cee <_strtod_r+0x416>
  3963. 8022d02: eb0a 028a add.w r2, sl, sl, lsl #2
  3964. 8022d06: 2b10 cmp r3, #16
  3965. 8022d08: bfd8 it le
  3966. 8022d0a: ea4f 0a42 movle.w sl, r2, lsl #1
  3967. 8022d0e: e7ef b.n 8022cf0 <_strtod_r+0x418>
  3968. 8022d10: 9d09 ldr r5, [sp, #36] ; 0x24
  3969. 8022d12: ebc9 0908 rsb r9, r9, r8
  3970. 8022d16: eb05 0409 add.w r4, r5, r9
  3971. 8022d1a: 2c00 cmp r4, #0
  3972. 8022d1c: f340 83de ble.w 80234dc <_strtod_r+0xc04>
  3973. 8022d20: f014 000f ands.w r0, r4, #15
  3974. 8022d24: d00d beq.n 8022d42 <_strtod_r+0x46a>
  3975. 8022d26: f648 61e8 movw r1, #36584 ; 0x8ee8
  3976. 8022d2a: e9dd 2306 ldrd r2, r3, [sp, #24]
  3977. 8022d2e: f6c0 0103 movt r1, #2051 ; 0x803
  3978. 8022d32: eb01 01c0 add.w r1, r1, r0, lsl #3
  3979. 8022d36: e9d1 0100 ldrd r0, r1, [r1]
  3980. 8022d3a: f7fd fc7d bl 8020638 <__aeabi_dmul>
  3981. 8022d3e: e9cd 0106 strd r0, r1, [sp, #24]
  3982. 8022d42: f034 040f bics.w r4, r4, #15
  3983. 8022d46: f040 815f bne.w 8023008 <_strtod_r+0x730>
  3984. 8022d4a: f8dd 9018 ldr.w r9, [sp, #24]
  3985. 8022d4e: f8dd a01c ldr.w sl, [sp, #28]
  3986. 8022d52: 940b str r4, [sp, #44] ; 0x2c
  3987. 8022d54: 9700 str r7, [sp, #0]
  3988. 8022d56: 4658 mov r0, fp
  3989. 8022d58: 4631 mov r1, r6
  3990. 8022d5a: 9a0a ldr r2, [sp, #40] ; 0x28
  3991. 8022d5c: 4643 mov r3, r8
  3992. 8022d5e: f001 ff67 bl 8024c30 <__s2b>
  3993. 8022d62: 9d09 ldr r5, [sp, #36] ; 0x24
  3994. 8022d64: 2d00 cmp r5, #0
  3995. 8022d66: 9011 str r0, [sp, #68] ; 0x44
  3996. 8022d68: f2c0 8472 blt.w 8023650 <_strtod_r+0xd78>
  3997. 8022d6c: 2400 movs r4, #0
  3998. 8022d6e: 940d str r4, [sp, #52] ; 0x34
  3999. 8022d70: 9d09 ldr r5, [sp, #36] ; 0x24
  4000. 8022d72: 9c11 ldr r4, [sp, #68] ; 0x44
  4001. 8022d74: ea25 75e5 bic.w r5, r5, r5, asr #31
  4002. 8022d78: f8cd 9024 str.w r9, [sp, #36] ; 0x24
  4003. 8022d7c: 340c adds r4, #12
  4004. 8022d7e: 950e str r5, [sp, #56] ; 0x38
  4005. 8022d80: 9413 str r4, [sp, #76] ; 0x4c
  4006. 8022d82: f8cd a028 str.w sl, [sp, #40] ; 0x28
  4007. 8022d86: e073 b.n 8022e70 <_strtod_r+0x598>
  4008. 8022d88: 0804527f .word 0x0804527f
  4009. 8022d8c: 9b0f ldr r3, [sp, #60] ; 0x3c
  4010. 8022d8e: 2b00 cmp r3, #0
  4011. 8022d90: f000 81a8 beq.w 80230e4 <_strtod_r+0x80c>
  4012. 8022d94: f04f 0900 mov.w r9, #0
  4013. 8022d98: 2500 movs r5, #0
  4014. 8022d9a: f8dd c01c ldr.w ip, [sp, #28]
  4015. 8022d9e: 2400 movs r4, #0
  4016. 8022da0: f6c3 75f0 movt r5, #16368 ; 0x3ff0
  4017. 8022da4: f6c3 79f0 movt r9, #16368 ; 0x3ff0
  4018. 8022da8: f8cd 8030 str.w r8, [sp, #48] ; 0x30
  4019. 8022dac: f04f 0800 mov.w r8, #0
  4020. 8022db0: 4643 mov r3, r8
  4021. 8022db2: f6c7 78f0 movt r8, #32752 ; 0x7ff0
  4022. 8022db6: f6c7 73e0 movt r3, #32736 ; 0x7fe0
  4023. 8022dba: ea0c 0808 and.w r8, ip, r8
  4024. 8022dbe: 4598 cmp r8, r3
  4025. 8022dc0: f000 81c5 beq.w 802314e <_strtod_r+0x876>
  4026. 8022dc4: 9a0b ldr r2, [sp, #44] ; 0x2c
  4027. 8022dc6: f1b8 6fd4 cmp.w r8, #111149056 ; 0x6a00000
  4028. 8022dca: bf8c ite hi
  4029. 8022dcc: 2300 movhi r3, #0
  4030. 8022dce: 2301 movls r3, #1
  4031. 8022dd0: 2a00 cmp r2, #0
  4032. 8022dd2: bf08 it eq
  4033. 8022dd4: 2300 moveq r3, #0
  4034. 8022dd6: b1eb cbz r3, 8022e14 <_strtod_r+0x53c>
  4035. 8022dd8: 980c ldr r0, [sp, #48] ; 0x30
  4036. 8022dda: 4649 mov r1, r9
  4037. 8022ddc: a388 add r3, pc, #544 ; (adr r3, 8023000 <_strtod_r+0x728>)
  4038. 8022dde: e9d3 2300 ldrd r2, r3, [r3]
  4039. 8022de2: f7fd fea5 bl 8020b30 <__aeabi_dcmple>
  4040. 8022de6: b188 cbz r0, 8022e0c <_strtod_r+0x534>
  4041. 8022de8: 980c ldr r0, [sp, #48] ; 0x30
  4042. 8022dea: 4649 mov r1, r9
  4043. 8022dec: f7fd fee6 bl 8020bbc <__aeabi_d2uiz>
  4044. 8022df0: 2800 cmp r0, #0
  4045. 8022df2: f000 8246 beq.w 8023282 <_strtod_r+0x9aa>
  4046. 8022df6: f7fd fba9 bl 802054c <__aeabi_ui2d>
  4047. 8022dfa: 4689 mov r9, r1
  4048. 8022dfc: 900c str r0, [sp, #48] ; 0x30
  4049. 8022dfe: 9c0f ldr r4, [sp, #60] ; 0x3c
  4050. 8022e00: f109 4300 add.w r3, r9, #2147483648 ; 0x80000000
  4051. 8022e04: b104 cbz r4, 8022e08 <_strtod_r+0x530>
  4052. 8022e06: 464b mov r3, r9
  4053. 8022e08: 9c0c ldr r4, [sp, #48] ; 0x30
  4054. 8022e0a: 461d mov r5, r3
  4055. 8022e0c: f105 63d6 add.w r3, r5, #112197632 ; 0x6b00000
  4056. 8022e10: ebc8 0503 rsb r5, r8, r3
  4057. 8022e14: 9809 ldr r0, [sp, #36] ; 0x24
  4058. 8022e16: 990a ldr r1, [sp, #40] ; 0x28
  4059. 8022e18: f002 f98a bl 8025130 <__ulp>
  4060. 8022e1c: 4602 mov r2, r0
  4061. 8022e1e: 460b mov r3, r1
  4062. 8022e20: 4620 mov r0, r4
  4063. 8022e22: 4629 mov r1, r5
  4064. 8022e24: f7fd fc08 bl 8020638 <__aeabi_dmul>
  4065. 8022e28: 4602 mov r2, r0
  4066. 8022e2a: 460b mov r3, r1
  4067. 8022e2c: 9809 ldr r0, [sp, #36] ; 0x24
  4068. 8022e2e: 990a ldr r1, [sp, #40] ; 0x28
  4069. 8022e30: f7fd fa50 bl 80202d4 <__adddf3>
  4070. 8022e34: e9cd 0106 strd r0, r1, [sp, #24]
  4071. 8022e38: 9c07 ldr r4, [sp, #28]
  4072. 8022e3a: 9009 str r0, [sp, #36] ; 0x24
  4073. 8022e3c: 910a str r1, [sp, #40] ; 0x28
  4074. 8022e3e: 9d0b ldr r5, [sp, #44] ; 0x2c
  4075. 8022e40: b935 cbnz r5, 8022e50 <_strtod_r+0x578>
  4076. 8022e42: 2300 movs r3, #0
  4077. 8022e44: f6c7 73f0 movt r3, #32752 ; 0x7ff0
  4078. 8022e48: 4023 ands r3, r4
  4079. 8022e4a: 4598 cmp r8, r3
  4080. 8022e4c: f000 81bc beq.w 80231c8 <_strtod_r+0x8f0>
  4081. 8022e50: 4658 mov r0, fp
  4082. 8022e52: 9918 ldr r1, [sp, #96] ; 0x60
  4083. 8022e54: f001 fe8c bl 8024b70 <_Bfree>
  4084. 8022e58: 4658 mov r0, fp
  4085. 8022e5a: 4651 mov r1, sl
  4086. 8022e5c: f001 fe88 bl 8024b70 <_Bfree>
  4087. 8022e60: 4658 mov r0, fp
  4088. 8022e62: 4639 mov r1, r7
  4089. 8022e64: f001 fe84 bl 8024b70 <_Bfree>
  4090. 8022e68: 4658 mov r0, fp
  4091. 8022e6a: 4631 mov r1, r6
  4092. 8022e6c: f001 fe80 bl 8024b70 <_Bfree>
  4093. 8022e70: 9c11 ldr r4, [sp, #68] ; 0x44
  4094. 8022e72: 4658 mov r0, fp
  4095. 8022e74: ad16 add r5, sp, #88 ; 0x58
  4096. 8022e76: 6861 ldr r1, [r4, #4]
  4097. 8022e78: f001 fe44 bl 8024b04 <_Balloc>
  4098. 8022e7c: 6923 ldr r3, [r4, #16]
  4099. 8022e7e: 9913 ldr r1, [sp, #76] ; 0x4c
  4100. 8022e80: 1c9a adds r2, r3, #2
  4101. 8022e82: 0092 lsls r2, r2, #2
  4102. 8022e84: 4682 mov sl, r0
  4103. 8022e86: 300c adds r0, #12
  4104. 8022e88: f7fe ff0c bl 8021ca4 <memcpy>
  4105. 8022e8c: 9a09 ldr r2, [sp, #36] ; 0x24
  4106. 8022e8e: 9b0a ldr r3, [sp, #40] ; 0x28
  4107. 8022e90: a819 add r0, sp, #100 ; 0x64
  4108. 8022e92: 9500 str r5, [sp, #0]
  4109. 8022e94: 9001 str r0, [sp, #4]
  4110. 8022e96: 4658 mov r0, fp
  4111. 8022e98: f002 f9c4 bl 8025224 <__d2b>
  4112. 8022e9c: 2101 movs r1, #1
  4113. 8022e9e: 9018 str r0, [sp, #96] ; 0x60
  4114. 8022ea0: 4658 mov r0, fp
  4115. 8022ea2: f001 ff5d bl 8024d60 <__i2b>
  4116. 8022ea6: 9a16 ldr r2, [sp, #88] ; 0x58
  4117. 8022ea8: 9b19 ldr r3, [sp, #100] ; 0x64
  4118. 8022eaa: f46f 717f mvn.w r1, #1020 ; 0x3fc
  4119. 8022eae: 2a00 cmp r2, #0
  4120. 8022eb0: bfaa itet ge
  4121. 8022eb2: 9d0d ldrge r5, [sp, #52] ; 0x34
  4122. 8022eb4: 9c0e ldrlt r4, [sp, #56] ; 0x38
  4123. 8022eb6: 18ac addge r4, r5, r2
  4124. 8022eb8: 9d0b ldr r5, [sp, #44] ; 0x2c
  4125. 8022eba: 4607 mov r7, r0
  4126. 8022ebc: bfb8 it lt
  4127. 8022ebe: ebc2 0004 rsblt r0, r2, r4
  4128. 8022ec2: ebc5 0202 rsb r2, r5, r2
  4129. 8022ec6: bfb8 it lt
  4130. 8022ec8: 9c0d ldrlt r4, [sp, #52] ; 0x34
  4131. 8022eca: eb02 0503 add.w r5, r2, r3
  4132. 8022ece: bfa8 it ge
  4133. 8022ed0: 980e ldrge r0, [sp, #56] ; 0x38
  4134. 8022ed2: 428d cmp r5, r1
  4135. 8022ed4: 990d ldr r1, [sp, #52] ; 0x34
  4136. 8022ed6: bfb4 ite lt
  4137. 8022ed8: f202 4333 addwlt r3, r2, #1075 ; 0x433
  4138. 8022edc: f1c3 0336 rsbge r3, r3, #54 ; 0x36
  4139. 8022ee0: 18e6 adds r6, r4, r3
  4140. 8022ee2: 18c3 adds r3, r0, r3
  4141. 8022ee4: 980b ldr r0, [sp, #44] ; 0x2c
  4142. 8022ee6: 181d adds r5, r3, r0
  4143. 8022ee8: 42a6 cmp r6, r4
  4144. 8022eea: bfb4 ite lt
  4145. 8022eec: 4633 movlt r3, r6
  4146. 8022eee: 4623 movge r3, r4
  4147. 8022ef0: 42ab cmp r3, r5
  4148. 8022ef2: bfa8 it ge
  4149. 8022ef4: 462b movge r3, r5
  4150. 8022ef6: 2b00 cmp r3, #0
  4151. 8022ef8: bfc2 ittt gt
  4152. 8022efa: ebc3 0606 rsbgt r6, r3, r6
  4153. 8022efe: ebc3 0505 rsbgt r5, r3, r5
  4154. 8022f02: ebc3 0404 rsbgt r4, r3, r4
  4155. 8022f06: b189 cbz r1, 8022f2c <_strtod_r+0x654>
  4156. 8022f08: 460a mov r2, r1
  4157. 8022f0a: 4658 mov r0, fp
  4158. 8022f0c: 4639 mov r1, r7
  4159. 8022f0e: f001 ffcf bl 8024eb0 <__pow5mult>
  4160. 8022f12: 9a18 ldr r2, [sp, #96] ; 0x60
  4161. 8022f14: 4607 mov r7, r0
  4162. 8022f16: 4658 mov r0, fp
  4163. 8022f18: 4639 mov r1, r7
  4164. 8022f1a: f001 ff2b bl 8024d74 <__multiply>
  4165. 8022f1e: 9918 ldr r1, [sp, #96] ; 0x60
  4166. 8022f20: 4680 mov r8, r0
  4167. 8022f22: 4658 mov r0, fp
  4168. 8022f24: f001 fe24 bl 8024b70 <_Bfree>
  4169. 8022f28: f8cd 8060 str.w r8, [sp, #96] ; 0x60
  4170. 8022f2c: 2e00 cmp r6, #0
  4171. 8022f2e: dd05 ble.n 8022f3c <_strtod_r+0x664>
  4172. 8022f30: 4658 mov r0, fp
  4173. 8022f32: 9918 ldr r1, [sp, #96] ; 0x60
  4174. 8022f34: 4632 mov r2, r6
  4175. 8022f36: f002 f80d bl 8024f54 <__lshift>
  4176. 8022f3a: 9018 str r0, [sp, #96] ; 0x60
  4177. 8022f3c: 9a0e ldr r2, [sp, #56] ; 0x38
  4178. 8022f3e: b122 cbz r2, 8022f4a <_strtod_r+0x672>
  4179. 8022f40: 4651 mov r1, sl
  4180. 8022f42: 4658 mov r0, fp
  4181. 8022f44: f001 ffb4 bl 8024eb0 <__pow5mult>
  4182. 8022f48: 4682 mov sl, r0
  4183. 8022f4a: 2d00 cmp r5, #0
  4184. 8022f4c: dd05 ble.n 8022f5a <_strtod_r+0x682>
  4185. 8022f4e: 4651 mov r1, sl
  4186. 8022f50: 4658 mov r0, fp
  4187. 8022f52: 462a mov r2, r5
  4188. 8022f54: f001 fffe bl 8024f54 <__lshift>
  4189. 8022f58: 4682 mov sl, r0
  4190. 8022f5a: 2c00 cmp r4, #0
  4191. 8022f5c: dd05 ble.n 8022f6a <_strtod_r+0x692>
  4192. 8022f5e: 4639 mov r1, r7
  4193. 8022f60: 4658 mov r0, fp
  4194. 8022f62: 4622 mov r2, r4
  4195. 8022f64: f001 fff6 bl 8024f54 <__lshift>
  4196. 8022f68: 4607 mov r7, r0
  4197. 8022f6a: 9918 ldr r1, [sp, #96] ; 0x60
  4198. 8022f6c: 4652 mov r2, sl
  4199. 8022f6e: 4658 mov r0, fp
  4200. 8022f70: f04f 0800 mov.w r8, #0
  4201. 8022f74: f002 f866 bl 8025044 <__mdiff>
  4202. 8022f78: 4639 mov r1, r7
  4203. 8022f7a: 68c4 ldr r4, [r0, #12]
  4204. 8022f7c: 4606 mov r6, r0
  4205. 8022f7e: f8c0 800c str.w r8, [r0, #12]
  4206. 8022f82: 940f str r4, [sp, #60] ; 0x3c
  4207. 8022f84: f002 f840 bl 8025008 <__mcmp>
  4208. 8022f88: 4540 cmp r0, r8
  4209. 8022f8a: f2c0 8213 blt.w 80233b4 <_strtod_r+0xadc>
  4210. 8022f8e: f000 8261 beq.w 8023454 <_strtod_r+0xb7c>
  4211. 8022f92: 4630 mov r0, r6
  4212. 8022f94: 4639 mov r1, r7
  4213. 8022f96: f002 f9a3 bl 80252e0 <__ratio>
  4214. 8022f9a: 2200 movs r2, #0
  4215. 8022f9c: f04f 4380 mov.w r3, #1073741824 ; 0x40000000
  4216. 8022fa0: 4604 mov r4, r0
  4217. 8022fa2: 460d mov r5, r1
  4218. 8022fa4: f7fd fdc4 bl 8020b30 <__aeabi_dcmple>
  4219. 8022fa8: 2800 cmp r0, #0
  4220. 8022faa: f47f aeef bne.w 8022d8c <_strtod_r+0x4b4>
  4221. 8022fae: 2300 movs r3, #0
  4222. 8022fb0: 4620 mov r0, r4
  4223. 8022fb2: f6c3 73e0 movt r3, #16352 ; 0x3fe0
  4224. 8022fb6: 4629 mov r1, r5
  4225. 8022fb8: 2200 movs r2, #0
  4226. 8022fba: f7fd fb3d bl 8020638 <__aeabi_dmul>
  4227. 8022fbe: 9c0f ldr r4, [sp, #60] ; 0x3c
  4228. 8022fc0: 900c str r0, [sp, #48] ; 0x30
  4229. 8022fc2: 4689 mov r9, r1
  4230. 8022fc4: f101 4300 add.w r3, r1, #2147483648 ; 0x80000000
  4231. 8022fc8: b104 cbz r4, 8022fcc <_strtod_r+0x6f4>
  4232. 8022fca: 460b mov r3, r1
  4233. 8022fcc: 9c0c ldr r4, [sp, #48] ; 0x30
  4234. 8022fce: 461d mov r5, r3
  4235. 8022fd0: f8dd c01c ldr.w ip, [sp, #28]
  4236. 8022fd4: e6ea b.n 8022dac <_strtod_r+0x4d4>
  4237. 8022fd6: 4640 mov r0, r8
  4238. 8022fd8: 46a0 mov r8, r4
  4239. 8022fda: 9009 str r0, [sp, #36] ; 0x24
  4240. 8022fdc: f1a5 0130 sub.w r1, r5, #48 ; 0x30
  4241. 8022fe0: 2909 cmp r1, #9
  4242. 8022fe2: d803 bhi.n 8022fec <_strtod_r+0x714>
  4243. 8022fe4: 9a17 ldr r2, [sp, #92] ; 0x5c
  4244. 8022fe6: 3001 adds r0, #1
  4245. 8022fe8: 920a str r2, [sp, #40] ; 0x28
  4246. 8022fea: e66f b.n 8022ccc <_strtod_r+0x3f4>
  4247. 8022fec: 2101 movs r1, #1
  4248. 8022fee: e50a b.n 8022a06 <_strtod_r+0x12e>
  4249. 8022ff0: f04f 0800 mov.w r8, #0
  4250. 8022ff4: 2101 movs r1, #1
  4251. 8022ff6: f8cd 8024 str.w r8, [sp, #36] ; 0x24
  4252. 8022ffa: e504 b.n 8022a06 <_strtod_r+0x12e>
  4253. 8022ffc: f3af 8000 nop.w
  4254. 8023000: ffc00000 .word 0xffc00000
  4255. 8023004: 41dfffff .word 0x41dfffff
  4256. 8023008: f5b4 7f9a cmp.w r4, #308 ; 0x134
  4257. 802300c: f300 8258 bgt.w 80234c0 <_strtod_r+0xbe8>
  4258. 8023010: 1124 asrs r4, r4, #4
  4259. 8023012: f648 7ad8 movw sl, #36824 ; 0x8fd8
  4260. 8023016: 2c01 cmp r4, #1
  4261. 8023018: f340 8398 ble.w 802374c <_strtod_r+0xe74>
  4262. 802301c: f6c0 0a03 movt sl, #2051 ; 0x803
  4263. 8023020: e9dd 2306 ldrd r2, r3, [sp, #24]
  4264. 8023024: f04f 0900 mov.w r9, #0
  4265. 8023028: 4655 mov r5, sl
  4266. 802302a: f014 0f01 tst.w r4, #1
  4267. 802302e: 4610 mov r0, r2
  4268. 8023030: 4619 mov r1, r3
  4269. 8023032: ea4f 0464 mov.w r4, r4, asr #1
  4270. 8023036: f109 0901 add.w r9, r9, #1
  4271. 802303a: d005 beq.n 8023048 <_strtod_r+0x770>
  4272. 802303c: e9d5 2300 ldrd r2, r3, [r5]
  4273. 8023040: f7fd fafa bl 8020638 <__aeabi_dmul>
  4274. 8023044: 4602 mov r2, r0
  4275. 8023046: 460b mov r3, r1
  4276. 8023048: 3508 adds r5, #8
  4277. 802304a: 2c01 cmp r4, #1
  4278. 802304c: dced bgt.n 802302a <_strtod_r+0x752>
  4279. 802304e: 4610 mov r0, r2
  4280. 8023050: 4619 mov r1, r3
  4281. 8023052: e9cd 0106 strd r0, r1, [sp, #24]
  4282. 8023056: 9907 ldr r1, [sp, #28]
  4283. 8023058: eb0a 09c9 add.w r9, sl, r9, lsl #3
  4284. 802305c: f1a1 7154 sub.w r1, r1, #55574528 ; 0x3500000
  4285. 8023060: 9107 str r1, [sp, #28]
  4286. 8023062: e9dd 2306 ldrd r2, r3, [sp, #24]
  4287. 8023066: e9d9 0100 ldrd r0, r1, [r9]
  4288. 802306a: f7fd fae5 bl 8020638 <__aeabi_dmul>
  4289. 802306e: 2300 movs r3, #0
  4290. 8023070: 2200 movs r2, #0
  4291. 8023072: f6c7 73f0 movt r3, #32752 ; 0x7ff0
  4292. 8023076: f6c7 42a0 movt r2, #31904 ; 0x7ca0
  4293. 802307a: e9cd 0106 strd r0, r1, [sp, #24]
  4294. 802307e: 9907 ldr r1, [sp, #28]
  4295. 8023080: 400b ands r3, r1
  4296. 8023082: 4293 cmp r3, r2
  4297. 8023084: f200 821c bhi.w 80234c0 <_strtod_r+0xbe8>
  4298. 8023088: 2200 movs r2, #0
  4299. 802308a: f6c7 4290 movt r2, #31888 ; 0x7c90
  4300. 802308e: 4293 cmp r3, r2
  4301. 8023090: f240 8305 bls.w 802369e <_strtod_r+0xdc6>
  4302. 8023094: f64f 72ff movw r2, #65535 ; 0xffff
  4303. 8023098: f04f 30ff mov.w r0, #4294967295
  4304. 802309c: 4615 mov r5, r2
  4305. 802309e: 2400 movs r4, #0
  4306. 80230a0: f6c7 75ef movt r5, #32751 ; 0x7fef
  4307. 80230a4: 940b str r4, [sp, #44] ; 0x2c
  4308. 80230a6: 9507 str r5, [sp, #28]
  4309. 80230a8: 4681 mov r9, r0
  4310. 80230aa: 9006 str r0, [sp, #24]
  4311. 80230ac: 46aa mov sl, r5
  4312. 80230ae: e651 b.n 8022d54 <_strtod_r+0x47c>
  4313. 80230b0: 2301 movs r3, #1
  4314. 80230b2: 930a str r3, [sp, #40] ; 0x28
  4315. 80230b4: f10c 0302 add.w r3, ip, #2
  4316. 80230b8: 9317 str r3, [sp, #92] ; 0x5c
  4317. 80230ba: f89c 5002 ldrb.w r5, [ip, #2]
  4318. 80230be: e4bc b.n 8022a3a <_strtod_r+0x162>
  4319. 80230c0: 48ab ldr r0, [pc, #684] ; (8023370 <_strtod_r+0xa98>)
  4320. 80230c2: 9a17 ldr r2, [sp, #92] ; 0x5c
  4321. 80230c4: f810 1f01 ldrb.w r1, [r0, #1]!
  4322. 80230c8: 4613 mov r3, r2
  4323. 80230ca: 2900 cmp r1, #0
  4324. 80230cc: f000 8311 beq.w 80236f2 <_strtod_r+0xe1a>
  4325. 80230d0: 785b ldrb r3, [r3, #1]
  4326. 80230d2: 3201 adds r2, #1
  4327. 80230d4: 2b40 cmp r3, #64 ; 0x40
  4328. 80230d6: dd02 ble.n 80230de <_strtod_r+0x806>
  4329. 80230d8: 2b5a cmp r3, #90 ; 0x5a
  4330. 80230da: bfd8 it le
  4331. 80230dc: 3320 addle r3, #32
  4332. 80230de: 428b cmp r3, r1
  4333. 80230e0: d0f0 beq.n 80230c4 <_strtod_r+0x7ec>
  4334. 80230e2: e5b8 b.n 8022c56 <_strtod_r+0x37e>
  4335. 80230e4: 9b06 ldr r3, [sp, #24]
  4336. 80230e6: f8dd c01c ldr.w ip, [sp, #28]
  4337. 80230ea: 2b00 cmp r3, #0
  4338. 80230ec: f040 80a6 bne.w 802323c <_strtod_r+0x964>
  4339. 80230f0: f3cc 0313 ubfx r3, ip, #0, #20
  4340. 80230f4: bb03 cbnz r3, 8023138 <_strtod_r+0x860>
  4341. 80230f6: 2300 movs r3, #0
  4342. 80230f8: 4620 mov r0, r4
  4343. 80230fa: 4629 mov r1, r5
  4344. 80230fc: 2200 movs r2, #0
  4345. 80230fe: f6c3 73f0 movt r3, #16368 ; 0x3ff0
  4346. 8023102: f8cd c010 str.w ip, [sp, #16]
  4347. 8023106: f7fd fd09 bl 8020b1c <__aeabi_dcmplt>
  4348. 802310a: f8dd c010 ldr.w ip, [sp, #16]
  4349. 802310e: 2800 cmp r0, #0
  4350. 8023110: f040 8246 bne.w 80235a0 <_strtod_r+0xcc8>
  4351. 8023114: 2300 movs r3, #0
  4352. 8023116: 2200 movs r2, #0
  4353. 8023118: f6c3 73e0 movt r3, #16352 ; 0x3fe0
  4354. 802311c: 4620 mov r0, r4
  4355. 802311e: 4629 mov r1, r5
  4356. 8023120: f7fd fa8a bl 8020638 <__aeabi_dmul>
  4357. 8023124: f8dd c010 ldr.w ip, [sp, #16]
  4358. 8023128: 4689 mov r9, r1
  4359. 802312a: 4602 mov r2, r0
  4360. 802312c: f101 4300 add.w r3, r1, #2147483648 ; 0x80000000
  4361. 8023130: 900c str r0, [sp, #48] ; 0x30
  4362. 8023132: 4614 mov r4, r2
  4363. 8023134: 461d mov r5, r3
  4364. 8023136: e639 b.n 8022dac <_strtod_r+0x4d4>
  4365. 8023138: f04f 0900 mov.w r9, #0
  4366. 802313c: 2500 movs r5, #0
  4367. 802313e: f8cd 9030 str.w r9, [sp, #48] ; 0x30
  4368. 8023142: 2400 movs r4, #0
  4369. 8023144: f6cb 75f0 movt r5, #49136 ; 0xbff0
  4370. 8023148: f6c3 79f0 movt r9, #16368 ; 0x3ff0
  4371. 802314c: e62e b.n 8022dac <_strtod_r+0x4d4>
  4372. 802314e: f1ac 7c54 sub.w ip, ip, #55574528 ; 0x3500000
  4373. 8023152: 9a09 ldr r2, [sp, #36] ; 0x24
  4374. 8023154: f8cd c01c str.w ip, [sp, #28]
  4375. 8023158: 9b0a ldr r3, [sp, #40] ; 0x28
  4376. 802315a: e9dd 0106 ldrd r0, r1, [sp, #24]
  4377. 802315e: e9cd 4502 strd r4, r5, [sp, #8]
  4378. 8023162: 4614 mov r4, r2
  4379. 8023164: 461d mov r5, r3
  4380. 8023166: e9cd 4514 strd r4, r5, [sp, #80] ; 0x50
  4381. 802316a: f001 ffe1 bl 8025130 <__ulp>
  4382. 802316e: 4602 mov r2, r0
  4383. 8023170: 460b mov r3, r1
  4384. 8023172: e9dd 0102 ldrd r0, r1, [sp, #8]
  4385. 8023176: f7fd fa5f bl 8020638 <__aeabi_dmul>
  4386. 802317a: 4602 mov r2, r0
  4387. 802317c: 460b mov r3, r1
  4388. 802317e: e9dd 0106 ldrd r0, r1, [sp, #24]
  4389. 8023182: f7fd f8a7 bl 80202d4 <__adddf3>
  4390. 8023186: 2300 movs r3, #0
  4391. 8023188: f6c7 73f0 movt r3, #32752 ; 0x7ff0
  4392. 802318c: f64f 72ff movw r2, #65535 ; 0xffff
  4393. 8023190: f6c7 429f movt r2, #31903 ; 0x7c9f
  4394. 8023194: e9cd 0106 strd r0, r1, [sp, #24]
  4395. 8023198: 9c07 ldr r4, [sp, #28]
  4396. 802319a: 4023 ands r3, r4
  4397. 802319c: 4293 cmp r3, r2
  4398. 802319e: d976 bls.n 802328e <_strtod_r+0x9b6>
  4399. 80231a0: f64f 73ff movw r3, #65535 ; 0xffff
  4400. 80231a4: 9d15 ldr r5, [sp, #84] ; 0x54
  4401. 80231a6: f6c7 73ef movt r3, #32751 ; 0x7fef
  4402. 80231aa: 429d cmp r5, r3
  4403. 80231ac: f000 8177 beq.w 802349e <_strtod_r+0xbc6>
  4404. 80231b0: f64f 71ff movw r1, #65535 ; 0xffff
  4405. 80231b4: f04f 33ff mov.w r3, #4294967295
  4406. 80231b8: 460a mov r2, r1
  4407. 80231ba: 9306 str r3, [sp, #24]
  4408. 80231bc: f6c7 72ef movt r2, #32751 ; 0x7fef
  4409. 80231c0: 9309 str r3, [sp, #36] ; 0x24
  4410. 80231c2: 9207 str r2, [sp, #28]
  4411. 80231c4: 920a str r2, [sp, #40] ; 0x28
  4412. 80231c6: e643 b.n 8022e50 <_strtod_r+0x578>
  4413. 80231c8: 4649 mov r1, r9
  4414. 80231ca: 980c ldr r0, [sp, #48] ; 0x30
  4415. 80231cc: f7fd fcce bl 8020b6c <__aeabi_d2iz>
  4416. 80231d0: f7fd f9cc bl 802056c <__aeabi_i2d>
  4417. 80231d4: 4602 mov r2, r0
  4418. 80231d6: 460b mov r3, r1
  4419. 80231d8: 980c ldr r0, [sp, #48] ; 0x30
  4420. 80231da: 4649 mov r1, r9
  4421. 80231dc: f7fd f878 bl 80202d0 <__aeabi_dsub>
  4422. 80231e0: 9d0f ldr r5, [sp, #60] ; 0x3c
  4423. 80231e2: 4680 mov r8, r0
  4424. 80231e4: 4689 mov r9, r1
  4425. 80231e6: 2d00 cmp r5, #0
  4426. 80231e8: d137 bne.n 802325a <_strtod_r+0x982>
  4427. 80231ea: 9a06 ldr r2, [sp, #24]
  4428. 80231ec: 2a00 cmp r2, #0
  4429. 80231ee: d134 bne.n 802325a <_strtod_r+0x982>
  4430. 80231f0: f3c4 0413 ubfx r4, r4, #0, #20
  4431. 80231f4: 2c00 cmp r4, #0
  4432. 80231f6: d130 bne.n 802325a <_strtod_r+0x982>
  4433. 80231f8: a357 add r3, pc, #348 ; (adr r3, 8023358 <_strtod_r+0xa80>)
  4434. 80231fa: e9d3 2300 ldrd r2, r3, [r3]
  4435. 80231fe: f7fd fc8d bl 8020b1c <__aeabi_dcmplt>
  4436. 8023202: 2800 cmp r0, #0
  4437. 8023204: f43f ae24 beq.w 8022e50 <_strtod_r+0x578>
  4438. 8023208: 4654 mov r4, sl
  4439. 802320a: f8dd 9024 ldr.w r9, [sp, #36] ; 0x24
  4440. 802320e: f8dd a028 ldr.w sl, [sp, #40] ; 0x28
  4441. 8023212: 4658 mov r0, fp
  4442. 8023214: 9918 ldr r1, [sp, #96] ; 0x60
  4443. 8023216: f001 fcab bl 8024b70 <_Bfree>
  4444. 802321a: 4658 mov r0, fp
  4445. 802321c: 4621 mov r1, r4
  4446. 802321e: f001 fca7 bl 8024b70 <_Bfree>
  4447. 8023222: 4658 mov r0, fp
  4448. 8023224: 4639 mov r1, r7
  4449. 8023226: f001 fca3 bl 8024b70 <_Bfree>
  4450. 802322a: 4658 mov r0, fp
  4451. 802322c: 9911 ldr r1, [sp, #68] ; 0x44
  4452. 802322e: f001 fc9f bl 8024b70 <_Bfree>
  4453. 8023232: 4658 mov r0, fp
  4454. 8023234: 4631 mov r1, r6
  4455. 8023236: f001 fc9b bl 8024b70 <_Bfree>
  4456. 802323a: e49a b.n 8022b72 <_strtod_r+0x29a>
  4457. 802323c: 2b01 cmp r3, #1
  4458. 802323e: f47f af7b bne.w 8023138 <_strtod_r+0x860>
  4459. 8023242: 4661 mov r1, ip
  4460. 8023244: 2900 cmp r1, #0
  4461. 8023246: f47f af77 bne.w 8023138 <_strtod_r+0x860>
  4462. 802324a: 4654 mov r4, sl
  4463. 802324c: f04f 0900 mov.w r9, #0
  4464. 8023250: 46ca mov sl, r9
  4465. 8023252: 2322 movs r3, #34 ; 0x22
  4466. 8023254: f8cb 3000 str.w r3, [fp]
  4467. 8023258: e7db b.n 8023212 <_strtod_r+0x93a>
  4468. 802325a: 4640 mov r0, r8
  4469. 802325c: 4649 mov r1, r9
  4470. 802325e: a340 add r3, pc, #256 ; (adr r3, 8023360 <_strtod_r+0xa88>)
  4471. 8023260: e9d3 2300 ldrd r2, r3, [r3]
  4472. 8023264: f7fd fc5a bl 8020b1c <__aeabi_dcmplt>
  4473. 8023268: 2800 cmp r0, #0
  4474. 802326a: d1cd bne.n 8023208 <_strtod_r+0x930>
  4475. 802326c: 4640 mov r0, r8
  4476. 802326e: 4649 mov r1, r9
  4477. 8023270: a33d add r3, pc, #244 ; (adr r3, 8023368 <_strtod_r+0xa90>)
  4478. 8023272: e9d3 2300 ldrd r2, r3, [r3]
  4479. 8023276: f7fd fc6f bl 8020b58 <__aeabi_dcmpgt>
  4480. 802327a: 2800 cmp r0, #0
  4481. 802327c: f43f ade8 beq.w 8022e50 <_strtod_r+0x578>
  4482. 8023280: e7c2 b.n 8023208 <_strtod_r+0x930>
  4483. 8023282: f04f 0900 mov.w r9, #0
  4484. 8023286: 900c str r0, [sp, #48] ; 0x30
  4485. 8023288: f6c3 79f0 movt r9, #16368 ; 0x3ff0
  4486. 802328c: e5b7 b.n 8022dfe <_strtod_r+0x526>
  4487. 802328e: 9906 ldr r1, [sp, #24]
  4488. 8023290: f104 7454 add.w r4, r4, #55574528 ; 0x3500000
  4489. 8023294: 9407 str r4, [sp, #28]
  4490. 8023296: 940a str r4, [sp, #40] ; 0x28
  4491. 8023298: 9109 str r1, [sp, #36] ; 0x24
  4492. 802329a: e5d0 b.n 8022e3e <_strtod_r+0x566>
  4493. 802329c: f8cd c05c str.w ip, [sp, #92] ; 0x5c
  4494. 80232a0: 2200 movs r2, #0
  4495. 80232a2: f1b8 0f00 cmp.w r8, #0
  4496. 80232a6: f47f ac0f bne.w 8022ac8 <_strtod_r+0x1f0>
  4497. 80232aa: e495 b.n 8022bd8 <_strtod_r+0x300>
  4498. 80232ac: 9d12 ldr r5, [sp, #72] ; 0x48
  4499. 80232ae: f240 0404 movw r4, #4
  4500. 80232b2: f2c2 0400 movt r4, #8192 ; 0x2000
  4501. 80232b6: ab18 add r3, sp, #96 ; 0x60
  4502. 80232b8: 4658 mov r0, fp
  4503. 80232ba: e88d 0028 stmia.w sp, {r3, r5}
  4504. 80232be: a917 add r1, sp, #92 ; 0x5c
  4505. 80232c0: 4622 mov r2, r4
  4506. 80232c2: ab19 add r3, sp, #100 ; 0x64
  4507. 80232c4: f000 fd1c bl 8023d00 <__gethex>
  4508. 80232c8: f010 0707 ands.w r7, r0, #7
  4509. 80232cc: 4605 mov r5, r0
  4510. 80232ce: bf04 itt eq
  4511. 80232d0: 46b9 moveq r9, r7
  4512. 80232d2: 46ca moveq sl, r9
  4513. 80232d4: f43f ac4d beq.w 8022b72 <_strtod_r+0x29a>
  4514. 80232d8: 2f06 cmp r7, #6
  4515. 80232da: f000 816f beq.w 80235bc <_strtod_r+0xce4>
  4516. 80232de: 9a18 ldr r2, [sp, #96] ; 0x60
  4517. 80232e0: b13a cbz r2, 80232f2 <_strtod_r+0xa1a>
  4518. 80232e2: 6821 ldr r1, [r4, #0]
  4519. 80232e4: a81a add r0, sp, #104 ; 0x68
  4520. 80232e6: f002 f845 bl 8025374 <__copybits>
  4521. 80232ea: 4658 mov r0, fp
  4522. 80232ec: 9918 ldr r1, [sp, #96] ; 0x60
  4523. 80232ee: f001 fc3f bl 8024b70 <_Bfree>
  4524. 80232f2: 9b19 ldr r3, [sp, #100] ; 0x64
  4525. 80232f4: 2f06 cmp r7, #6
  4526. 80232f6: d80b bhi.n 8023310 <_strtod_r+0xa38>
  4527. 80232f8: e8df f007 tbb [pc, r7]
  4528. 80232fc: 141b203c .word 0x141b203c
  4529. 8023300: 2004 .short 0x2004
  4530. 8023302: 3c .byte 0x3c
  4531. 8023303: 00 .byte 0x00
  4532. 8023304: f06f 4400 mvn.w r4, #2147483648 ; 0x80000000
  4533. 8023308: f04f 30ff mov.w r0, #4294967295
  4534. 802330c: 9407 str r4, [sp, #28]
  4535. 802330e: 9006 str r0, [sp, #24]
  4536. 8023310: 072b lsls r3, r5, #28
  4537. 8023312: f57f acb1 bpl.w 8022c78 <_strtod_r+0x3a0>
  4538. 8023316: 9907 ldr r1, [sp, #28]
  4539. 8023318: f8dd 9018 ldr.w r9, [sp, #24]
  4540. 802331c: f041 4300 orr.w r3, r1, #2147483648 ; 0x80000000
  4541. 8023320: 469a mov sl, r3
  4542. 8023322: e426 b.n 8022b72 <_strtod_r+0x29a>
  4543. 8023324: 2100 movs r1, #0
  4544. 8023326: 9106 str r1, [sp, #24]
  4545. 8023328: 460a mov r2, r1
  4546. 802332a: f6c7 72f0 movt r2, #32752 ; 0x7ff0
  4547. 802332e: 9207 str r2, [sp, #28]
  4548. 8023330: e7ee b.n 8023310 <_strtod_r+0xa38>
  4549. 8023332: 9b1a ldr r3, [sp, #104] ; 0x68
  4550. 8023334: 9c1b ldr r4, [sp, #108] ; 0x6c
  4551. 8023336: 9306 str r3, [sp, #24]
  4552. 8023338: 9407 str r4, [sp, #28]
  4553. 802333a: e7e9 b.n 8023310 <_strtod_r+0xa38>
  4554. 802333c: 981a ldr r0, [sp, #104] ; 0x68
  4555. 802333e: f203 4333 addw r3, r3, #1075 ; 0x433
  4556. 8023342: 9a1b ldr r2, [sp, #108] ; 0x6c
  4557. 8023344: f422 1280 bic.w r2, r2, #1048576 ; 0x100000
  4558. 8023348: 9006 str r0, [sp, #24]
  4559. 802334a: ea42 5203 orr.w r2, r2, r3, lsl #20
  4560. 802334e: 9207 str r2, [sp, #28]
  4561. 8023350: e7de b.n 8023310 <_strtod_r+0xa38>
  4562. 8023352: bf00 nop
  4563. 8023354: f3af 8000 nop.w
  4564. 8023358: 94a03595 .word 0x94a03595
  4565. 802335c: 3fcfffff .word 0x3fcfffff
  4566. 8023360: 94a03595 .word 0x94a03595
  4567. 8023364: 3fdfffff .word 0x3fdfffff
  4568. 8023368: 35afe535 .word 0x35afe535
  4569. 802336c: 3fe00000 .word 0x3fe00000
  4570. 8023370: 08045273 .word 0x08045273
  4571. 8023374: 2100 movs r1, #0
  4572. 8023376: 9107 str r1, [sp, #28]
  4573. 8023378: 9106 str r1, [sp, #24]
  4574. 802337a: e7c9 b.n 8023310 <_strtod_r+0xa38>
  4575. 802337c: 46b0 mov r8, r6
  4576. 802337e: 4657 mov r7, sl
  4577. 8023380: 4654 mov r4, sl
  4578. 8023382: f7ff bb24 b.w 80229ce <_strtod_r+0xf6>
  4579. 8023386: 2300 movs r3, #0
  4580. 8023388: 930a str r3, [sp, #40] ; 0x28
  4581. 802338a: e693 b.n 80230b4 <_strtod_r+0x7dc>
  4582. 802338c: f8dd 802c ldr.w r8, [sp, #44] ; 0x2c
  4583. 8023390: eb08 0300 add.w r3, r8, r0
  4584. 8023394: 3b01 subs r3, #1
  4585. 8023396: 2b08 cmp r3, #8
  4586. 8023398: f103 0801 add.w r8, r3, #1
  4587. 802339c: f300 8172 bgt.w 8023684 <_strtod_r+0xdac>
  4588. 80233a0: eb07 0787 add.w r7, r7, r7, lsl #2
  4589. 80233a4: 2000 movs r0, #0
  4590. 80233a6: eb01 0747 add.w r7, r1, r7, lsl #1
  4591. 80233aa: 9d0a ldr r5, [sp, #40] ; 0x28
  4592. 80233ac: 1c6b adds r3, r5, #1
  4593. 80233ae: 9317 str r3, [sp, #92] ; 0x5c
  4594. 80233b0: 786d ldrb r5, [r5, #1]
  4595. 80233b2: e613 b.n 8022fdc <_strtod_r+0x704>
  4596. 80233b4: 9d0f ldr r5, [sp, #60] ; 0x3c
  4597. 80233b6: 4654 mov r4, sl
  4598. 80233b8: bb7d cbnz r5, 802341a <_strtod_r+0xb42>
  4599. 80233ba: 9806 ldr r0, [sp, #24]
  4600. 80233bc: bb68 cbnz r0, 802341a <_strtod_r+0xb42>
  4601. 80233be: 9a07 ldr r2, [sp, #28]
  4602. 80233c0: f3c2 0313 ubfx r3, r2, #0, #20
  4603. 80233c4: bb4b cbnz r3, 802341a <_strtod_r+0xb42>
  4604. 80233c6: 4643 mov r3, r8
  4605. 80233c8: f6c7 73f0 movt r3, #32752 ; 0x7ff0
  4606. 80233cc: 4013 ands r3, r2
  4607. 80233ce: f1b3 6fd6 cmp.w r3, #112197632 ; 0x6b00000
  4608. 80233d2: d922 bls.n 802341a <_strtod_r+0xb42>
  4609. 80233d4: 6973 ldr r3, [r6, #20]
  4610. 80233d6: b913 cbnz r3, 80233de <_strtod_r+0xb06>
  4611. 80233d8: 6933 ldr r3, [r6, #16]
  4612. 80233da: 2b01 cmp r3, #1
  4613. 80233dc: dd1d ble.n 802341a <_strtod_r+0xb42>
  4614. 80233de: 4631 mov r1, r6
  4615. 80233e0: 2201 movs r2, #1
  4616. 80233e2: 4658 mov r0, fp
  4617. 80233e4: f001 fdb6 bl 8024f54 <__lshift>
  4618. 80233e8: 4639 mov r1, r7
  4619. 80233ea: 4606 mov r6, r0
  4620. 80233ec: f001 fe0c bl 8025008 <__mcmp>
  4621. 80233f0: 2800 cmp r0, #0
  4622. 80233f2: dd12 ble.n 802341a <_strtod_r+0xb42>
  4623. 80233f4: 9d0b ldr r5, [sp, #44] ; 0x2c
  4624. 80233f6: 2d00 cmp r5, #0
  4625. 80233f8: f040 8195 bne.w 8023726 <_strtod_r+0xe4e>
  4626. 80233fc: 9807 ldr r0, [sp, #28]
  4627. 80233fe: f020 4300 bic.w r3, r0, #2147483648 ; 0x80000000
  4628. 8023402: 0d1b lsrs r3, r3, #20
  4629. 8023404: 051b lsls r3, r3, #20
  4630. 8023406: f5a3 1380 sub.w r3, r3, #1048576 ; 0x100000
  4631. 802340a: f04f 32ff mov.w r2, #4294967295
  4632. 802340e: 9206 str r2, [sp, #24]
  4633. 8023410: ea6f 5313 mvn.w r3, r3, lsr #20
  4634. 8023414: ea6f 5303 mvn.w r3, r3, lsl #20
  4635. 8023418: 9307 str r3, [sp, #28]
  4636. 802341a: 9d0b ldr r5, [sp, #44] ; 0x2c
  4637. 802341c: 2d00 cmp r5, #0
  4638. 802341e: f000 80c8 beq.w 80235b2 <_strtod_r+0xcda>
  4639. 8023422: 2200 movs r2, #0
  4640. 8023424: 2300 movs r3, #0
  4641. 8023426: f6c3 1250 movt r2, #14672 ; 0x3950
  4642. 802342a: 9314 str r3, [sp, #80] ; 0x50
  4643. 802342c: 9215 str r2, [sp, #84] ; 0x54
  4644. 802342e: e9dd 0106 ldrd r0, r1, [sp, #24]
  4645. 8023432: e9dd 2314 ldrd r2, r3, [sp, #80] ; 0x50
  4646. 8023436: f7fd f8ff bl 8020638 <__aeabi_dmul>
  4647. 802343a: e9cd 0106 strd r0, r1, [sp, #24]
  4648. 802343e: 468a mov sl, r1
  4649. 8023440: 9907 ldr r1, [sp, #28]
  4650. 8023442: 4681 mov r9, r0
  4651. 8023444: 2900 cmp r1, #0
  4652. 8023446: f47f aee4 bne.w 8023212 <_strtod_r+0x93a>
  4653. 802344a: 9a06 ldr r2, [sp, #24]
  4654. 802344c: 2a00 cmp r2, #0
  4655. 802344e: f47f aee0 bne.w 8023212 <_strtod_r+0x93a>
  4656. 8023452: e6fe b.n 8023252 <_strtod_r+0x97a>
  4657. 8023454: 9d0f ldr r5, [sp, #60] ; 0x3c
  4658. 8023456: 4654 mov r4, sl
  4659. 8023458: f8dd 9024 ldr.w r9, [sp, #36] ; 0x24
  4660. 802345c: f8dd a028 ldr.w sl, [sp, #40] ; 0x28
  4661. 8023460: 2d00 cmp r5, #0
  4662. 8023462: f000 80d3 beq.w 802360c <_strtod_r+0xd34>
  4663. 8023466: 9b07 ldr r3, [sp, #28]
  4664. 8023468: f64f 72ff movw r2, #65535 ; 0xffff
  4665. 802346c: f2c0 020f movt r2, #15
  4666. 8023470: f023 417f bic.w r1, r3, #4278190080 ; 0xff000000
  4667. 8023474: f421 0170 bic.w r1, r1, #15728640 ; 0xf00000
  4668. 8023478: 4291 cmp r1, r2
  4669. 802347a: 9906 ldr r1, [sp, #24]
  4670. 802347c: f000 8119 beq.w 80236b2 <_strtod_r+0xdda>
  4671. 8023480: 07cb lsls r3, r1, #31
  4672. 8023482: d5ca bpl.n 802341a <_strtod_r+0xb42>
  4673. 8023484: 4648 mov r0, r9
  4674. 8023486: 4651 mov r1, sl
  4675. 8023488: f001 fe52 bl 8025130 <__ulp>
  4676. 802348c: 4602 mov r2, r0
  4677. 802348e: 460b mov r3, r1
  4678. 8023490: 4648 mov r0, r9
  4679. 8023492: 4651 mov r1, sl
  4680. 8023494: f7fc ff1e bl 80202d4 <__adddf3>
  4681. 8023498: e9cd 0106 strd r0, r1, [sp, #24]
  4682. 802349c: e7bd b.n 802341a <_strtod_r+0xb42>
  4683. 802349e: 9814 ldr r0, [sp, #80] ; 0x50
  4684. 80234a0: 3001 adds r0, #1
  4685. 80234a2: f47f ae85 bne.w 80231b0 <_strtod_r+0x8d8>
  4686. 80234a6: 2000 movs r0, #0
  4687. 80234a8: 4654 mov r4, sl
  4688. 80234aa: 4601 mov r1, r0
  4689. 80234ac: 2322 movs r3, #34 ; 0x22
  4690. 80234ae: f6c7 71f0 movt r1, #32752 ; 0x7ff0
  4691. 80234b2: f8cb 3000 str.w r3, [fp]
  4692. 80234b6: 9107 str r1, [sp, #28]
  4693. 80234b8: 4681 mov r9, r0
  4694. 80234ba: 9006 str r0, [sp, #24]
  4695. 80234bc: 468a mov sl, r1
  4696. 80234be: e6a8 b.n 8023212 <_strtod_r+0x93a>
  4697. 80234c0: 2300 movs r3, #0
  4698. 80234c2: 2500 movs r5, #0
  4699. 80234c4: 461c mov r4, r3
  4700. 80234c6: 9506 str r5, [sp, #24]
  4701. 80234c8: f6c7 74f0 movt r4, #32752 ; 0x7ff0
  4702. 80234cc: 2322 movs r3, #34 ; 0x22
  4703. 80234ce: 9407 str r4, [sp, #28]
  4704. 80234d0: 46a9 mov r9, r5
  4705. 80234d2: f8cb 3000 str.w r3, [fp]
  4706. 80234d6: 46a2 mov sl, r4
  4707. 80234d8: f7ff bb4b b.w 8022b72 <_strtod_r+0x29a>
  4708. 80234dc: f43f ac35 beq.w 8022d4a <_strtod_r+0x472>
  4709. 80234e0: 4264 negs r4, r4
  4710. 80234e2: f014 020f ands.w r2, r4, #15
  4711. 80234e6: d00d beq.n 8023504 <_strtod_r+0xc2c>
  4712. 80234e8: f648 63e8 movw r3, #36584 ; 0x8ee8
  4713. 80234ec: e9dd 0106 ldrd r0, r1, [sp, #24]
  4714. 80234f0: f6c0 0303 movt r3, #2051 ; 0x803
  4715. 80234f4: eb03 03c2 add.w r3, r3, r2, lsl #3
  4716. 80234f8: e9d3 2300 ldrd r2, r3, [r3]
  4717. 80234fc: f7fd f9c6 bl 802088c <__aeabi_ddiv>
  4718. 8023500: e9cd 0106 strd r0, r1, [sp, #24]
  4719. 8023504: 1124 asrs r4, r4, #4
  4720. 8023506: f43f ac20 beq.w 8022d4a <_strtod_r+0x472>
  4721. 802350a: 2c1f cmp r4, #31
  4722. 802350c: dc40 bgt.n 8023590 <_strtod_r+0xcb8>
  4723. 802350e: f014 0f10 tst.w r4, #16
  4724. 8023512: bf14 ite ne
  4725. 8023514: 256a movne r5, #106 ; 0x6a
  4726. 8023516: 2500 moveq r5, #0
  4727. 8023518: 2c00 cmp r4, #0
  4728. 802351a: 950b str r5, [sp, #44] ; 0x2c
  4729. 802351c: dd17 ble.n 802354e <_strtod_r+0xc76>
  4730. 802351e: f648 65b0 movw r5, #36528 ; 0x8eb0
  4731. 8023522: e9dd 2306 ldrd r2, r3, [sp, #24]
  4732. 8023526: f6c0 0503 movt r5, #2051 ; 0x803
  4733. 802352a: f014 0f01 tst.w r4, #1
  4734. 802352e: 4610 mov r0, r2
  4735. 8023530: 4619 mov r1, r3
  4736. 8023532: d005 beq.n 8023540 <_strtod_r+0xc68>
  4737. 8023534: e9d5 2300 ldrd r2, r3, [r5]
  4738. 8023538: f7fd f87e bl 8020638 <__aeabi_dmul>
  4739. 802353c: 4602 mov r2, r0
  4740. 802353e: 460b mov r3, r1
  4741. 8023540: 3508 adds r5, #8
  4742. 8023542: 1064 asrs r4, r4, #1
  4743. 8023544: d1f1 bne.n 802352a <_strtod_r+0xc52>
  4744. 8023546: 4610 mov r0, r2
  4745. 8023548: 4619 mov r1, r3
  4746. 802354a: e9cd 0106 strd r0, r1, [sp, #24]
  4747. 802354e: 9c0b ldr r4, [sp, #44] ; 0x2c
  4748. 8023550: b18c cbz r4, 8023576 <_strtod_r+0xc9e>
  4749. 8023552: 9a07 ldr r2, [sp, #28]
  4750. 8023554: f3c2 530a ubfx r3, r2, #20, #11
  4751. 8023558: f1c3 036b rsb r3, r3, #107 ; 0x6b
  4752. 802355c: 2b00 cmp r3, #0
  4753. 802355e: dd0a ble.n 8023576 <_strtod_r+0xc9e>
  4754. 8023560: 2b1f cmp r3, #31
  4755. 8023562: f340 810a ble.w 802377a <_strtod_r+0xea2>
  4756. 8023566: 2100 movs r1, #0
  4757. 8023568: 2b34 cmp r3, #52 ; 0x34
  4758. 802356a: 9106 str r1, [sp, #24]
  4759. 802356c: f340 810d ble.w 802378a <_strtod_r+0xeb2>
  4760. 8023570: f04f 725c mov.w r2, #57671680 ; 0x3700000
  4761. 8023574: 9207 str r2, [sp, #28]
  4762. 8023576: 9d06 ldr r5, [sp, #24]
  4763. 8023578: 2200 movs r2, #0
  4764. 802357a: 9c07 ldr r4, [sp, #28]
  4765. 802357c: 2300 movs r3, #0
  4766. 802357e: 4628 mov r0, r5
  4767. 8023580: 46a9 mov r9, r5
  4768. 8023582: 4621 mov r1, r4
  4769. 8023584: 46a2 mov sl, r4
  4770. 8023586: f7fd fabf bl 8020b08 <__aeabi_dcmpeq>
  4771. 802358a: 2800 cmp r0, #0
  4772. 802358c: f43f abe2 beq.w 8022d54 <_strtod_r+0x47c>
  4773. 8023590: f04f 0900 mov.w r9, #0
  4774. 8023594: 2322 movs r3, #34 ; 0x22
  4775. 8023596: 46ca mov sl, r9
  4776. 8023598: f8cb 3000 str.w r3, [fp]
  4777. 802359c: f7ff bae9 b.w 8022b72 <_strtod_r+0x29a>
  4778. 80235a0: 9a0f ldr r2, [sp, #60] ; 0x3c
  4779. 80235a2: 2300 movs r3, #0
  4780. 80235a4: 4699 mov r9, r3
  4781. 80235a6: f6cb 73e0 movt r3, #49120 ; 0xbfe0
  4782. 80235aa: f6c3 79e0 movt r9, #16352 ; 0x3fe0
  4783. 80235ae: 920c str r2, [sp, #48] ; 0x30
  4784. 80235b0: e5bf b.n 8023132 <_strtod_r+0x85a>
  4785. 80235b2: f8dd 9018 ldr.w r9, [sp, #24]
  4786. 80235b6: f8dd a01c ldr.w sl, [sp, #28]
  4787. 80235ba: e62a b.n 8023212 <_strtod_r+0x93a>
  4788. 80235bc: f04f 0900 mov.w r9, #0
  4789. 80235c0: 3601 adds r6, #1
  4790. 80235c2: 46ca mov sl, r9
  4791. 80235c4: 9617 str r6, [sp, #92] ; 0x5c
  4792. 80235c6: f7ff bad4 b.w 8022b72 <_strtod_r+0x29a>
  4793. 80235ca: 9c09 ldr r4, [sp, #36] ; 0x24
  4794. 80235cc: f1c8 0325 rsb r3, r8, #37 ; 0x25
  4795. 80235d0: 429c cmp r4, r3
  4796. 80235d2: f73f ab9d bgt.w 8022d10 <_strtod_r+0x438>
  4797. 80235d6: f1c8 080f rsb r8, r8, #15
  4798. 80235da: f648 64e8 movw r4, #36584 ; 0x8ee8
  4799. 80235de: f6c0 0403 movt r4, #2051 ; 0x803
  4800. 80235e2: e9dd 2306 ldrd r2, r3, [sp, #24]
  4801. 80235e6: eb04 01c8 add.w r1, r4, r8, lsl #3
  4802. 80235ea: e9d1 0100 ldrd r0, r1, [r1]
  4803. 80235ee: f7fd f823 bl 8020638 <__aeabi_dmul>
  4804. 80235f2: 9d09 ldr r5, [sp, #36] ; 0x24
  4805. 80235f4: ebc8 0805 rsb r8, r8, r5
  4806. 80235f8: eb04 04c8 add.w r4, r4, r8, lsl #3
  4807. 80235fc: e9d4 2300 ldrd r2, r3, [r4]
  4808. 8023600: f7fd f81a bl 8020638 <__aeabi_dmul>
  4809. 8023604: 4681 mov r9, r0
  4810. 8023606: 468a mov sl, r1
  4811. 8023608: f7ff bab3 b.w 8022b72 <_strtod_r+0x29a>
  4812. 802360c: 9907 ldr r1, [sp, #28]
  4813. 802360e: f3c1 0313 ubfx r3, r1, #0, #20
  4814. 8023612: 2b00 cmp r3, #0
  4815. 8023614: d141 bne.n 802369a <_strtod_r+0xdc2>
  4816. 8023616: 9b06 ldr r3, [sp, #24]
  4817. 8023618: 2b00 cmp r3, #0
  4818. 802361a: f43f aeeb beq.w 80233f4 <_strtod_r+0xb1c>
  4819. 802361e: 07da lsls r2, r3, #31
  4820. 8023620: f57f aefb bpl.w 802341a <_strtod_r+0xb42>
  4821. 8023624: 4648 mov r0, r9
  4822. 8023626: 4651 mov r1, sl
  4823. 8023628: f001 fd82 bl 8025130 <__ulp>
  4824. 802362c: 4602 mov r2, r0
  4825. 802362e: 460b mov r3, r1
  4826. 8023630: 4648 mov r0, r9
  4827. 8023632: 4651 mov r1, sl
  4828. 8023634: f7fc fe4c bl 80202d0 <__aeabi_dsub>
  4829. 8023638: 4602 mov r2, r0
  4830. 802363a: 460b mov r3, r1
  4831. 802363c: e9cd 2306 strd r2, r3, [sp, #24]
  4832. 8023640: 2200 movs r2, #0
  4833. 8023642: 2300 movs r3, #0
  4834. 8023644: f7fd fa60 bl 8020b08 <__aeabi_dcmpeq>
  4835. 8023648: 2800 cmp r0, #0
  4836. 802364a: f47f adff bne.w 802324c <_strtod_r+0x974>
  4837. 802364e: e6e4 b.n 802341a <_strtod_r+0xb42>
  4838. 8023650: 9d09 ldr r5, [sp, #36] ; 0x24
  4839. 8023652: 426d negs r5, r5
  4840. 8023654: 950d str r5, [sp, #52] ; 0x34
  4841. 8023656: f7ff bb8b b.w 8022d70 <_strtod_r+0x498>
  4842. 802365a: 9c09 ldr r4, [sp, #36] ; 0x24
  4843. 802365c: f114 0f16 cmn.w r4, #22
  4844. 8023660: f6ff ab56 blt.w 8022d10 <_strtod_r+0x438>
  4845. 8023664: f648 63e8 movw r3, #36584 ; 0x8ee8
  4846. 8023668: e9dd 0106 ldrd r0, r1, [sp, #24]
  4847. 802366c: f6c0 0303 movt r3, #2051 ; 0x803
  4848. 8023670: eba3 03c4 sub.w r3, r3, r4, lsl #3
  4849. 8023674: e9d3 2300 ldrd r2, r3, [r3]
  4850. 8023678: f7fd f908 bl 802088c <__aeabi_ddiv>
  4851. 802367c: 4681 mov r9, r0
  4852. 802367e: 468a mov sl, r1
  4853. 8023680: f7ff ba77 b.w 8022b72 <_strtod_r+0x29a>
  4854. 8023684: 2000 movs r0, #0
  4855. 8023686: f1b8 0f10 cmp.w r8, #16
  4856. 802368a: f73f ae8e bgt.w 80233aa <_strtod_r+0xad2>
  4857. 802368e: eb0a 0a8a add.w sl, sl, sl, lsl #2
  4858. 8023692: 2000 movs r0, #0
  4859. 8023694: eb01 0a4a add.w sl, r1, sl, lsl #1
  4860. 8023698: e687 b.n 80233aa <_strtod_r+0xad2>
  4861. 802369a: 9b06 ldr r3, [sp, #24]
  4862. 802369c: e7bf b.n 802361e <_strtod_r+0xd46>
  4863. 802369e: f101 7154 add.w r1, r1, #55574528 ; 0x3500000
  4864. 80236a2: 2400 movs r4, #0
  4865. 80236a4: 9107 str r1, [sp, #28]
  4866. 80236a6: 468a mov sl, r1
  4867. 80236a8: 940b str r4, [sp, #44] ; 0x2c
  4868. 80236aa: f8dd 9018 ldr.w r9, [sp, #24]
  4869. 80236ae: f7ff bb51 b.w 8022d54 <_strtod_r+0x47c>
  4870. 80236b2: 9d0b ldr r5, [sp, #44] ; 0x2c
  4871. 80236b4: b1d5 cbz r5, 80236ec <_strtod_r+0xe14>
  4872. 80236b6: 2200 movs r2, #0
  4873. 80236b8: f6c7 72f0 movt r2, #32752 ; 0x7ff0
  4874. 80236bc: 401a ands r2, r3
  4875. 80236be: f1b2 6fd4 cmp.w r2, #111149056 ; 0x6a00000
  4876. 80236c2: d813 bhi.n 80236ec <_strtod_r+0xe14>
  4877. 80236c4: 0d12 lsrs r2, r2, #20
  4878. 80236c6: f04f 30ff mov.w r0, #4294967295
  4879. 80236ca: f1c2 026b rsb r2, r2, #107 ; 0x6b
  4880. 80236ce: fa00 f202 lsl.w r2, r0, r2
  4881. 80236d2: 4291 cmp r1, r2
  4882. 80236d4: f47f aed4 bne.w 8023480 <_strtod_r+0xba8>
  4883. 80236d8: 2200 movs r2, #0
  4884. 80236da: 2000 movs r0, #0
  4885. 80236dc: f6c7 72f0 movt r2, #32752 ; 0x7ff0
  4886. 80236e0: 9006 str r0, [sp, #24]
  4887. 80236e2: 401a ands r2, r3
  4888. 80236e4: f502 1280 add.w r2, r2, #1048576 ; 0x100000
  4889. 80236e8: 9207 str r2, [sp, #28]
  4890. 80236ea: e696 b.n 802341a <_strtod_r+0xb42>
  4891. 80236ec: f04f 32ff mov.w r2, #4294967295
  4892. 80236f0: e7ef b.n 80236d2 <_strtod_r+0xdfa>
  4893. 80236f2: 4c2a ldr r4, [pc, #168] ; (802379c <_strtod_r+0xec4>)
  4894. 80236f4: 4611 mov r1, r2
  4895. 80236f6: 9217 str r2, [sp, #92] ; 0x5c
  4896. 80236f8: f814 0f01 ldrb.w r0, [r4, #1]!
  4897. 80236fc: 460b mov r3, r1
  4898. 80236fe: b310 cbz r0, 8023746 <_strtod_r+0xe6e>
  4899. 8023700: 785b ldrb r3, [r3, #1]
  4900. 8023702: 3101 adds r1, #1
  4901. 8023704: 2b40 cmp r3, #64 ; 0x40
  4902. 8023706: dd02 ble.n 802370e <_strtod_r+0xe36>
  4903. 8023708: 2b5a cmp r3, #90 ; 0x5a
  4904. 802370a: bfd8 it le
  4905. 802370c: 3320 addle r3, #32
  4906. 802370e: 4283 cmp r3, r0
  4907. 8023710: d0f2 beq.n 80236f8 <_strtod_r+0xe20>
  4908. 8023712: 3201 adds r2, #1
  4909. 8023714: 9217 str r2, [sp, #92] ; 0x5c
  4910. 8023716: 2500 movs r5, #0
  4911. 8023718: 9506 str r5, [sp, #24]
  4912. 802371a: 4628 mov r0, r5
  4913. 802371c: f6c7 70f0 movt r0, #32752 ; 0x7ff0
  4914. 8023720: 9007 str r0, [sp, #28]
  4915. 8023722: f7ff baa9 b.w 8022c78 <_strtod_r+0x3a0>
  4916. 8023726: 9907 ldr r1, [sp, #28]
  4917. 8023728: f021 4300 bic.w r3, r1, #2147483648 ; 0x80000000
  4918. 802372c: 0d1b lsrs r3, r3, #20
  4919. 802372e: 051b lsls r3, r3, #20
  4920. 8023730: f1b3 6fd6 cmp.w r3, #112197632 ; 0x6b00000
  4921. 8023734: f63f ae67 bhi.w 8023406 <_strtod_r+0xb2e>
  4922. 8023738: f1b3 7f5c cmp.w r3, #57671680 ; 0x3700000
  4923. 802373c: f63f ae71 bhi.w 8023422 <_strtod_r+0xb4a>
  4924. 8023740: e584 b.n 802324c <_strtod_r+0x974>
  4925. 8023742: 4643 mov r3, r8
  4926. 8023744: e627 b.n 8023396 <_strtod_r+0xabe>
  4927. 8023746: 3101 adds r1, #1
  4928. 8023748: 9117 str r1, [sp, #92] ; 0x5c
  4929. 802374a: e7e4 b.n 8023716 <_strtod_r+0xe3e>
  4930. 802374c: f04f 0900 mov.w r9, #0
  4931. 8023750: f6c0 0a03 movt sl, #2051 ; 0x803
  4932. 8023754: e47f b.n 8023056 <_strtod_r+0x77e>
  4933. 8023756: a817 add r0, sp, #92 ; 0x5c
  4934. 8023758: 4911 ldr r1, [pc, #68] ; (80237a0 <_strtod_r+0xec8>)
  4935. 802375a: aa1a add r2, sp, #104 ; 0x68
  4936. 802375c: f000 fd7e bl 802425c <__hexnan>
  4937. 8023760: 2805 cmp r0, #5
  4938. 8023762: f47f aa83 bne.w 8022c6c <_strtod_r+0x394>
  4939. 8023766: 9b1b ldr r3, [sp, #108] ; 0x6c
  4940. 8023768: 9a1a ldr r2, [sp, #104] ; 0x68
  4941. 802376a: f043 43ff orr.w r3, r3, #2139095040 ; 0x7f800000
  4942. 802376e: f443 03e0 orr.w r3, r3, #7340032 ; 0x700000
  4943. 8023772: 9307 str r3, [sp, #28]
  4944. 8023774: 9206 str r2, [sp, #24]
  4945. 8023776: f7ff ba7f b.w 8022c78 <_strtod_r+0x3a0>
  4946. 802377a: f04f 32ff mov.w r2, #4294967295
  4947. 802377e: 9c06 ldr r4, [sp, #24]
  4948. 8023780: fa02 f303 lsl.w r3, r2, r3
  4949. 8023784: 401c ands r4, r3
  4950. 8023786: 9406 str r4, [sp, #24]
  4951. 8023788: e6f5 b.n 8023576 <_strtod_r+0xc9e>
  4952. 802378a: f04f 31ff mov.w r1, #4294967295
  4953. 802378e: 3b20 subs r3, #32
  4954. 8023790: fa01 f303 lsl.w r3, r1, r3
  4955. 8023794: 4013 ands r3, r2
  4956. 8023796: 9307 str r3, [sp, #28]
  4957. 8023798: e6ed b.n 8023576 <_strtod_r+0xc9e>
  4958. 802379a: bf00 nop
  4959. 802379c: 08045277 .word 0x08045277
  4960. 80237a0: 20000018 .word 0x20000018
  4961. 080237a4 <strtod>:
  4962. 80237a4: f240 032c movw r3, #44 ; 0x2c
  4963. 80237a8: 460a mov r2, r1
  4964. 80237aa: f2c2 0300 movt r3, #8192 ; 0x2000
  4965. 80237ae: 4601 mov r1, r0
  4966. 80237b0: 6818 ldr r0, [r3, #0]
  4967. 80237b2: f7ff b891 b.w 80228d8 <_strtod_r>
  4968. 80237b6: bf00 nop
  4969. 080237b8 <strtof>:
  4970. 80237b8: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr}
  4971. 80237bc: f240 062c movw r6, #44 ; 0x2c
  4972. 80237c0: f2c2 0600 movt r6, #8192 ; 0x2000
  4973. 80237c4: 460a mov r2, r1
  4974. 80237c6: 4601 mov r1, r0
  4975. 80237c8: f04f 0801 mov.w r8, #1
  4976. 80237cc: 6830 ldr r0, [r6, #0]
  4977. 80237ce: f7ff f883 bl 80228d8 <_strtod_r>
  4978. 80237d2: 460d mov r5, r1
  4979. 80237d4: 4604 mov r4, r0
  4980. 80237d6: f7fd fa11 bl 8020bfc <__aeabi_d2f>
  4981. 80237da: 2100 movs r1, #0
  4982. 80237dc: 4607 mov r7, r0
  4983. 80237de: f7fd fcff bl 80211e0 <__aeabi_fcmpeq>
  4984. 80237e2: b908 cbnz r0, 80237e8 <strtof+0x30>
  4985. 80237e4: f04f 0800 mov.w r8, #0
  4986. 80237e8: 4620 mov r0, r4
  4987. 80237ea: 4629 mov r1, r5
  4988. 80237ec: 2200 movs r2, #0
  4989. 80237ee: 2300 movs r3, #0
  4990. 80237f0: f04f 0901 mov.w r9, #1
  4991. 80237f4: f7fd f988 bl 8020b08 <__aeabi_dcmpeq>
  4992. 80237f8: b108 cbz r0, 80237fe <strtof+0x46>
  4993. 80237fa: f04f 0900 mov.w r9, #0
  4994. 80237fe: ea08 0809 and.w r8, r8, r9
  4995. 8023802: f018 0fff tst.w r8, #255 ; 0xff
  4996. 8023806: d116 bne.n 8023836 <strtof+0x7e>
  4997. 8023808: f64f 71ff movw r1, #65535 ; 0xffff
  4998. 802380c: 4638 mov r0, r7
  4999. 802380e: f6c7 717f movt r1, #32639 ; 0x7f7f
  5000. 8023812: f7fd fd0d bl 8021230 <__aeabi_fcmpgt>
  5001. 8023816: b9a0 cbnz r0, 8023842 <strtof+0x8a>
  5002. 8023818: 4638 mov r0, r7
  5003. 802381a: f46f 0100 mvn.w r1, #8388608 ; 0x800000
  5004. 802381e: f7fd fce9 bl 80211f4 <__aeabi_fcmplt>
  5005. 8023822: b158 cbz r0, 802383c <strtof+0x84>
  5006. 8023824: 4620 mov r0, r4
  5007. 8023826: 4629 mov r1, r5
  5008. 8023828: f04f 32ff mov.w r2, #4294967295
  5009. 802382c: f46f 1380 mvn.w r3, #1048576 ; 0x100000
  5010. 8023830: f7fd f974 bl 8020b1c <__aeabi_dcmplt>
  5011. 8023834: b910 cbnz r0, 802383c <strtof+0x84>
  5012. 8023836: 6833 ldr r3, [r6, #0]
  5013. 8023838: 2222 movs r2, #34 ; 0x22
  5014. 802383a: 601a str r2, [r3, #0]
  5015. 802383c: 4638 mov r0, r7
  5016. 802383e: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc}
  5017. 8023842: f64f 73ff movw r3, #65535 ; 0xffff
  5018. 8023846: 4620 mov r0, r4
  5019. 8023848: 4629 mov r1, r5
  5020. 802384a: f04f 32ff mov.w r2, #4294967295
  5021. 802384e: f6c7 73ef movt r3, #32751 ; 0x7fef
  5022. 8023852: f7fd f981 bl 8020b58 <__aeabi_dcmpgt>
  5023. 8023856: 2800 cmp r0, #0
  5024. 8023858: d0ed beq.n 8023836 <strtof+0x7e>
  5025. 802385a: e7dd b.n 8023818 <strtof+0x60>
  5026. 802385c: f3af 8000 nop.w
  5027. 08023860 <_strtol_r>:
  5028. 8023860: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  5029. 8023864: f240 0400 movw r4, #0
  5030. 8023868: f2c2 0400 movt r4, #8192 ; 0x2000
  5031. 802386c: b085 sub sp, #20
  5032. 802386e: 4699 mov r9, r3
  5033. 8023870: 460b mov r3, r1
  5034. 8023872: f8d4 8000 ldr.w r8, [r4]
  5035. 8023876: 9102 str r1, [sp, #8]
  5036. 8023878: 9003 str r0, [sp, #12]
  5037. 802387a: 461c mov r4, r3
  5038. 802387c: f814 5b01 ldrb.w r5, [r4], #1
  5039. 8023880: eb08 0105 add.w r1, r8, r5
  5040. 8023884: 4623 mov r3, r4
  5041. 8023886: 7849 ldrb r1, [r1, #1]
  5042. 8023888: f001 0108 and.w r1, r1, #8
  5043. 802388c: b2c9 uxtb r1, r1
  5044. 802388e: 2900 cmp r1, #0
  5045. 8023890: d1f3 bne.n 802387a <_strtol_r+0x1a>
  5046. 8023892: 2d2d cmp r5, #45 ; 0x2d
  5047. 8023894: d07b beq.n 802398e <_strtol_r+0x12e>
  5048. 8023896: 2d2b cmp r5, #43 ; 0x2b
  5049. 8023898: bf05 ittet eq
  5050. 802389a: 4624 moveq r4, r4
  5051. 802389c: 460b moveq r3, r1
  5052. 802389e: 460b movne r3, r1
  5053. 80238a0: f814 5b01 ldrbeq.w r5, [r4], #1
  5054. 80238a4: f039 0110 bics.w r1, r9, #16
  5055. 80238a8: d112 bne.n 80238d0 <_strtol_r+0x70>
  5056. 80238aa: f1d9 0001 rsbs r0, r9, #1
  5057. 80238ae: bf38 it cc
  5058. 80238b0: 2000 movcc r0, #0
  5059. 80238b2: 2d30 cmp r5, #48 ; 0x30
  5060. 80238b4: d004 beq.n 80238c0 <_strtol_r+0x60>
  5061. 80238b6: b158 cbz r0, 80238d0 <_strtol_r+0x70>
  5062. 80238b8: f04f 090a mov.w r9, #10
  5063. 80238bc: 46cb mov fp, r9
  5064. 80238be: e008 b.n 80238d2 <_strtol_r+0x72>
  5065. 80238c0: 7821 ldrb r1, [r4, #0]
  5066. 80238c2: f001 01df and.w r1, r1, #223 ; 0xdf
  5067. 80238c6: 2958 cmp r1, #88 ; 0x58
  5068. 80238c8: d065 beq.n 8023996 <_strtol_r+0x136>
  5069. 80238ca: b108 cbz r0, 80238d0 <_strtol_r+0x70>
  5070. 80238cc: f04f 0908 mov.w r9, #8
  5071. 80238d0: 46cb mov fp, r9
  5072. 80238d2: 2b00 cmp r3, #0
  5073. 80238d4: 4659 mov r1, fp
  5074. 80238d6: bf0c ite eq
  5075. 80238d8: f06f 4600 mvneq.w r6, #2147483648 ; 0x80000000
  5076. 80238dc: f04f 4600 movne.w r6, #2147483648 ; 0x80000000
  5077. 80238e0: e88d 000c stmia.w sp, {r2, r3}
  5078. 80238e4: 4630 mov r0, r6
  5079. 80238e6: 2700 movs r7, #0
  5080. 80238e8: f7fe f964 bl 8021bb4 <__aeabi_uidivmod>
  5081. 80238ec: 4630 mov r0, r6
  5082. 80238ee: 468a mov sl, r1
  5083. 80238f0: 4659 mov r1, fp
  5084. 80238f2: f7fe f831 bl 8021958 <__aeabi_uidiv>
  5085. 80238f6: 46bc mov ip, r7
  5086. 80238f8: e89d 000c ldmia.w sp, {r2, r3}
  5087. 80238fc: e016 b.n 802392c <_strtol_r+0xcc>
  5088. 80238fe: 3d30 subs r5, #48 ; 0x30
  5089. 8023900: 45a9 cmp r9, r5
  5090. 8023902: dd25 ble.n 8023950 <_strtol_r+0xf0>
  5091. 8023904: 4584 cmp ip, r0
  5092. 8023906: bf94 ite ls
  5093. 8023908: 2100 movls r1, #0
  5094. 802390a: 2101 movhi r1, #1
  5095. 802390c: ea51 77d7 orrs.w r7, r1, r7, lsr #31
  5096. 8023910: d129 bne.n 8023966 <_strtol_r+0x106>
  5097. 8023912: 4555 cmp r5, sl
  5098. 8023914: bfd4 ite le
  5099. 8023916: 2100 movle r1, #0
  5100. 8023918: 2101 movgt r1, #1
  5101. 802391a: 4584 cmp ip, r0
  5102. 802391c: bf18 it ne
  5103. 802391e: 2100 movne r1, #0
  5104. 8023920: bb09 cbnz r1, 8023966 <_strtol_r+0x106>
  5105. 8023922: fb0b 5c0c mla ip, fp, ip, r5
  5106. 8023926: 2701 movs r7, #1
  5107. 8023928: f814 5b01 ldrb.w r5, [r4], #1
  5108. 802392c: eb08 0105 add.w r1, r8, r5
  5109. 8023930: 7849 ldrb r1, [r1, #1]
  5110. 8023932: f001 0604 and.w r6, r1, #4
  5111. 8023936: b2f6 uxtb r6, r6
  5112. 8023938: 2e00 cmp r6, #0
  5113. 802393a: d1e0 bne.n 80238fe <_strtol_r+0x9e>
  5114. 802393c: f011 0103 ands.w r1, r1, #3
  5115. 8023940: d006 beq.n 8023950 <_strtol_r+0xf0>
  5116. 8023942: 2901 cmp r1, #1
  5117. 8023944: bf14 ite ne
  5118. 8023946: 2157 movne r1, #87 ; 0x57
  5119. 8023948: 2137 moveq r1, #55 ; 0x37
  5120. 802394a: 1a6d subs r5, r5, r1
  5121. 802394c: 45a9 cmp r9, r5
  5122. 802394e: dcd9 bgt.n 8023904 <_strtol_r+0xa4>
  5123. 8023950: 1c79 adds r1, r7, #1
  5124. 8023952: d00b beq.n 802396c <_strtol_r+0x10c>
  5125. 8023954: b9c3 cbnz r3, 8023988 <_strtol_r+0x128>
  5126. 8023956: 4660 mov r0, ip
  5127. 8023958: b112 cbz r2, 8023960 <_strtol_r+0x100>
  5128. 802395a: b997 cbnz r7, 8023982 <_strtol_r+0x122>
  5129. 802395c: 9b02 ldr r3, [sp, #8]
  5130. 802395e: 6013 str r3, [r2, #0]
  5131. 8023960: b005 add sp, #20
  5132. 8023962: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  5133. 8023966: f04f 37ff mov.w r7, #4294967295
  5134. 802396a: e7dd b.n 8023928 <_strtol_r+0xc8>
  5135. 802396c: 9903 ldr r1, [sp, #12]
  5136. 802396e: 2b00 cmp r3, #0
  5137. 8023970: bf0c ite eq
  5138. 8023972: f06f 4000 mvneq.w r0, #2147483648 ; 0x80000000
  5139. 8023976: f04f 4000 movne.w r0, #2147483648 ; 0x80000000
  5140. 802397a: 2322 movs r3, #34 ; 0x22
  5141. 802397c: 600b str r3, [r1, #0]
  5142. 802397e: 2a00 cmp r2, #0
  5143. 8023980: d0ee beq.n 8023960 <_strtol_r+0x100>
  5144. 8023982: 3c01 subs r4, #1
  5145. 8023984: 9402 str r4, [sp, #8]
  5146. 8023986: e7e9 b.n 802395c <_strtol_r+0xfc>
  5147. 8023988: f1cc 0c00 rsb ip, ip, #0
  5148. 802398c: e7e3 b.n 8023956 <_strtol_r+0xf6>
  5149. 802398e: f814 5b01 ldrb.w r5, [r4], #1
  5150. 8023992: 2301 movs r3, #1
  5151. 8023994: e786 b.n 80238a4 <_strtol_r+0x44>
  5152. 8023996: f04f 0910 mov.w r9, #16
  5153. 802399a: 7865 ldrb r5, [r4, #1]
  5154. 802399c: 46cb mov fp, r9
  5155. 802399e: 3402 adds r4, #2
  5156. 80239a0: e797 b.n 80238d2 <_strtol_r+0x72>
  5157. 80239a2: bf00 nop
  5158. 080239a4 <strtol>:
  5159. 80239a4: b430 push {r4, r5}
  5160. 80239a6: f240 042c movw r4, #44 ; 0x2c
  5161. 80239aa: f2c2 0400 movt r4, #8192 ; 0x2000
  5162. 80239ae: 460d mov r5, r1
  5163. 80239b0: 4613 mov r3, r2
  5164. 80239b2: 4601 mov r1, r0
  5165. 80239b4: 462a mov r2, r5
  5166. 80239b6: 6820 ldr r0, [r4, #0]
  5167. 80239b8: bc30 pop {r4, r5}
  5168. 80239ba: f7ff bf51 b.w 8023860 <_strtol_r>
  5169. 80239be: bf00 nop
  5170. 080239c0 <_malloc_trim_r>:
  5171. 80239c0: b5f8 push {r3, r4, r5, r6, r7, lr}
  5172. 80239c2: f240 149c movw r4, #412 ; 0x19c
  5173. 80239c6: f2c2 0400 movt r4, #8192 ; 0x2000
  5174. 80239ca: 460f mov r7, r1
  5175. 80239cc: 4605 mov r5, r0
  5176. 80239ce: f001 f895 bl 8024afc <__malloc_lock>
  5177. 80239d2: 68a3 ldr r3, [r4, #8]
  5178. 80239d4: 685e ldr r6, [r3, #4]
  5179. 80239d6: f026 0603 bic.w r6, r6, #3
  5180. 80239da: f606 73ef addw r3, r6, #4079 ; 0xfef
  5181. 80239de: 1bdf subs r7, r3, r7
  5182. 80239e0: 0b3f lsrs r7, r7, #12
  5183. 80239e2: 3f01 subs r7, #1
  5184. 80239e4: 033f lsls r7, r7, #12
  5185. 80239e6: f5b7 5f80 cmp.w r7, #4096 ; 0x1000
  5186. 80239ea: db07 blt.n 80239fc <_malloc_trim_r+0x3c>
  5187. 80239ec: 2100 movs r1, #0
  5188. 80239ee: 4628 mov r0, r5
  5189. 80239f0: f001 fd10 bl 8025414 <_sbrk_r>
  5190. 80239f4: 68a3 ldr r3, [r4, #8]
  5191. 80239f6: 199b adds r3, r3, r6
  5192. 80239f8: 4298 cmp r0, r3
  5193. 80239fa: d004 beq.n 8023a06 <_malloc_trim_r+0x46>
  5194. 80239fc: 4628 mov r0, r5
  5195. 80239fe: f001 f87f bl 8024b00 <__malloc_unlock>
  5196. 8023a02: 2000 movs r0, #0
  5197. 8023a04: bdf8 pop {r3, r4, r5, r6, r7, pc}
  5198. 8023a06: 4279 negs r1, r7
  5199. 8023a08: 4628 mov r0, r5
  5200. 8023a0a: f001 fd03 bl 8025414 <_sbrk_r>
  5201. 8023a0e: 3001 adds r0, #1
  5202. 8023a10: d010 beq.n 8023a34 <_malloc_trim_r+0x74>
  5203. 8023a12: f640 23e4 movw r3, #2788 ; 0xae4
  5204. 8023a16: 68a1 ldr r1, [r4, #8]
  5205. 8023a18: f2c2 0300 movt r3, #8192 ; 0x2000
  5206. 8023a1c: 1bf6 subs r6, r6, r7
  5207. 8023a1e: 4628 mov r0, r5
  5208. 8023a20: f046 0601 orr.w r6, r6, #1
  5209. 8023a24: 681a ldr r2, [r3, #0]
  5210. 8023a26: 604e str r6, [r1, #4]
  5211. 8023a28: 1bd7 subs r7, r2, r7
  5212. 8023a2a: 601f str r7, [r3, #0]
  5213. 8023a2c: f001 f868 bl 8024b00 <__malloc_unlock>
  5214. 8023a30: 2001 movs r0, #1
  5215. 8023a32: bdf8 pop {r3, r4, r5, r6, r7, pc}
  5216. 8023a34: 2100 movs r1, #0
  5217. 8023a36: 4628 mov r0, r5
  5218. 8023a38: f001 fcec bl 8025414 <_sbrk_r>
  5219. 8023a3c: 68a3 ldr r3, [r4, #8]
  5220. 8023a3e: 1ac2 subs r2, r0, r3
  5221. 8023a40: 2a0f cmp r2, #15
  5222. 8023a42: dddb ble.n 80239fc <_malloc_trim_r+0x3c>
  5223. 8023a44: f240 54a4 movw r4, #1444 ; 0x5a4
  5224. 8023a48: f640 21e4 movw r1, #2788 ; 0xae4
  5225. 8023a4c: f2c2 0400 movt r4, #8192 ; 0x2000
  5226. 8023a50: f2c2 0100 movt r1, #8192 ; 0x2000
  5227. 8023a54: f042 0201 orr.w r2, r2, #1
  5228. 8023a58: 605a str r2, [r3, #4]
  5229. 8023a5a: 6823 ldr r3, [r4, #0]
  5230. 8023a5c: 1ac0 subs r0, r0, r3
  5231. 8023a5e: 6008 str r0, [r1, #0]
  5232. 8023a60: e7cc b.n 80239fc <_malloc_trim_r+0x3c>
  5233. 8023a62: bf00 nop
  5234. 08023a64 <_free_r>:
  5235. 8023a64: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  5236. 8023a68: 460e mov r6, r1
  5237. 8023a6a: 4680 mov r8, r0
  5238. 8023a6c: 2900 cmp r1, #0
  5239. 8023a6e: d05c beq.n 8023b2a <_free_r+0xc6>
  5240. 8023a70: f001 f844 bl 8024afc <__malloc_lock>
  5241. 8023a74: f240 159c movw r5, #412 ; 0x19c
  5242. 8023a78: f856 1c04 ldr.w r1, [r6, #-4]
  5243. 8023a7c: f2c2 0500 movt r5, #8192 ; 0x2000
  5244. 8023a80: f1a6 0408 sub.w r4, r6, #8
  5245. 8023a84: f021 0301 bic.w r3, r1, #1
  5246. 8023a88: 68af ldr r7, [r5, #8]
  5247. 8023a8a: 18e2 adds r2, r4, r3
  5248. 8023a8c: 4297 cmp r7, r2
  5249. 8023a8e: 6850 ldr r0, [r2, #4]
  5250. 8023a90: f020 0003 bic.w r0, r0, #3
  5251. 8023a94: d067 beq.n 8023b66 <_free_r+0x102>
  5252. 8023a96: f011 0101 ands.w r1, r1, #1
  5253. 8023a9a: 6050 str r0, [r2, #4]
  5254. 8023a9c: d035 beq.n 8023b0a <_free_r+0xa6>
  5255. 8023a9e: 2100 movs r1, #0
  5256. 8023aa0: 1816 adds r6, r2, r0
  5257. 8023aa2: 6876 ldr r6, [r6, #4]
  5258. 8023aa4: f016 0f01 tst.w r6, #1
  5259. 8023aa8: d106 bne.n 8023ab8 <_free_r+0x54>
  5260. 8023aaa: 181b adds r3, r3, r0
  5261. 8023aac: 6890 ldr r0, [r2, #8]
  5262. 8023aae: 2900 cmp r1, #0
  5263. 8023ab0: d04d beq.n 8023b4e <_free_r+0xea>
  5264. 8023ab2: 68d2 ldr r2, [r2, #12]
  5265. 8023ab4: 60c2 str r2, [r0, #12]
  5266. 8023ab6: 6090 str r0, [r2, #8]
  5267. 8023ab8: f043 0201 orr.w r2, r3, #1
  5268. 8023abc: 50e3 str r3, [r4, r3]
  5269. 8023abe: 6062 str r2, [r4, #4]
  5270. 8023ac0: b9f1 cbnz r1, 8023b00 <_free_r+0x9c>
  5271. 8023ac2: f5b3 7f00 cmp.w r3, #512 ; 0x200
  5272. 8023ac6: d332 bcc.n 8023b2e <_free_r+0xca>
  5273. 8023ac8: 0a5a lsrs r2, r3, #9
  5274. 8023aca: 2a04 cmp r2, #4
  5275. 8023acc: d86c bhi.n 8023ba8 <_free_r+0x144>
  5276. 8023ace: 0998 lsrs r0, r3, #6
  5277. 8023ad0: 3038 adds r0, #56 ; 0x38
  5278. 8023ad2: 0041 lsls r1, r0, #1
  5279. 8023ad4: eb05 0581 add.w r5, r5, r1, lsl #2
  5280. 8023ad8: f240 119c movw r1, #412 ; 0x19c
  5281. 8023adc: f2c2 0100 movt r1, #8192 ; 0x2000
  5282. 8023ae0: 68aa ldr r2, [r5, #8]
  5283. 8023ae2: 42aa cmp r2, r5
  5284. 8023ae4: d06b beq.n 8023bbe <_free_r+0x15a>
  5285. 8023ae6: 6851 ldr r1, [r2, #4]
  5286. 8023ae8: f021 0103 bic.w r1, r1, #3
  5287. 8023aec: 428b cmp r3, r1
  5288. 8023aee: d202 bcs.n 8023af6 <_free_r+0x92>
  5289. 8023af0: 6892 ldr r2, [r2, #8]
  5290. 8023af2: 4295 cmp r5, r2
  5291. 8023af4: d1f7 bne.n 8023ae6 <_free_r+0x82>
  5292. 8023af6: 68d3 ldr r3, [r2, #12]
  5293. 8023af8: 60e3 str r3, [r4, #12]
  5294. 8023afa: 60a2 str r2, [r4, #8]
  5295. 8023afc: 60d4 str r4, [r2, #12]
  5296. 8023afe: 609c str r4, [r3, #8]
  5297. 8023b00: 4640 mov r0, r8
  5298. 8023b02: e8bd 41f0 ldmia.w sp!, {r4, r5, r6, r7, r8, lr}
  5299. 8023b06: f000 bffb b.w 8024b00 <__malloc_unlock>
  5300. 8023b0a: f856 6c08 ldr.w r6, [r6, #-8]
  5301. 8023b0e: f105 0c08 add.w ip, r5, #8
  5302. 8023b12: 1ba4 subs r4, r4, r6
  5303. 8023b14: 199b adds r3, r3, r6
  5304. 8023b16: 68a6 ldr r6, [r4, #8]
  5305. 8023b18: 4566 cmp r6, ip
  5306. 8023b1a: d043 beq.n 8023ba4 <_free_r+0x140>
  5307. 8023b1c: f8d4 c00c ldr.w ip, [r4, #12]
  5308. 8023b20: f8c6 c00c str.w ip, [r6, #12]
  5309. 8023b24: f8cc 6008 str.w r6, [ip, #8]
  5310. 8023b28: e7ba b.n 8023aa0 <_free_r+0x3c>
  5311. 8023b2a: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  5312. 8023b2e: 08db lsrs r3, r3, #3
  5313. 8023b30: 2101 movs r1, #1
  5314. 8023b32: 6868 ldr r0, [r5, #4]
  5315. 8023b34: eb05 02c3 add.w r2, r5, r3, lsl #3
  5316. 8023b38: 109b asrs r3, r3, #2
  5317. 8023b3a: fa01 f303 lsl.w r3, r1, r3
  5318. 8023b3e: 60e2 str r2, [r4, #12]
  5319. 8023b40: 6891 ldr r1, [r2, #8]
  5320. 8023b42: 4318 orrs r0, r3
  5321. 8023b44: 6068 str r0, [r5, #4]
  5322. 8023b46: 60a1 str r1, [r4, #8]
  5323. 8023b48: 60cc str r4, [r1, #12]
  5324. 8023b4a: 6094 str r4, [r2, #8]
  5325. 8023b4c: e7d8 b.n 8023b00 <_free_r+0x9c>
  5326. 8023b4e: 4e29 ldr r6, [pc, #164] ; (8023bf4 <_free_r+0x190>)
  5327. 8023b50: 42b0 cmp r0, r6
  5328. 8023b52: d1ae bne.n 8023ab2 <_free_r+0x4e>
  5329. 8023b54: 616c str r4, [r5, #20]
  5330. 8023b56: f043 0201 orr.w r2, r3, #1
  5331. 8023b5a: 612c str r4, [r5, #16]
  5332. 8023b5c: 60e0 str r0, [r4, #12]
  5333. 8023b5e: 60a0 str r0, [r4, #8]
  5334. 8023b60: 6062 str r2, [r4, #4]
  5335. 8023b62: 50e3 str r3, [r4, r3]
  5336. 8023b64: e7cc b.n 8023b00 <_free_r+0x9c>
  5337. 8023b66: 18c0 adds r0, r0, r3
  5338. 8023b68: 07cb lsls r3, r1, #31
  5339. 8023b6a: d407 bmi.n 8023b7c <_free_r+0x118>
  5340. 8023b6c: f856 3c08 ldr.w r3, [r6, #-8]
  5341. 8023b70: 1ae4 subs r4, r4, r3
  5342. 8023b72: 18c0 adds r0, r0, r3
  5343. 8023b74: 68a2 ldr r2, [r4, #8]
  5344. 8023b76: 68e3 ldr r3, [r4, #12]
  5345. 8023b78: 60d3 str r3, [r2, #12]
  5346. 8023b7a: 609a str r2, [r3, #8]
  5347. 8023b7c: f240 52a8 movw r2, #1448 ; 0x5a8
  5348. 8023b80: f040 0301 orr.w r3, r0, #1
  5349. 8023b84: f2c2 0200 movt r2, #8192 ; 0x2000
  5350. 8023b88: 6063 str r3, [r4, #4]
  5351. 8023b8a: 60ac str r4, [r5, #8]
  5352. 8023b8c: 6813 ldr r3, [r2, #0]
  5353. 8023b8e: 4298 cmp r0, r3
  5354. 8023b90: d3b6 bcc.n 8023b00 <_free_r+0x9c>
  5355. 8023b92: f640 23e0 movw r3, #2784 ; 0xae0
  5356. 8023b96: 4640 mov r0, r8
  5357. 8023b98: f2c2 0300 movt r3, #8192 ; 0x2000
  5358. 8023b9c: 6819 ldr r1, [r3, #0]
  5359. 8023b9e: f7ff ff0f bl 80239c0 <_malloc_trim_r>
  5360. 8023ba2: e7ad b.n 8023b00 <_free_r+0x9c>
  5361. 8023ba4: 2101 movs r1, #1
  5362. 8023ba6: e77b b.n 8023aa0 <_free_r+0x3c>
  5363. 8023ba8: f102 005b add.w r0, r2, #91 ; 0x5b
  5364. 8023bac: 0041 lsls r1, r0, #1
  5365. 8023bae: 2a14 cmp r2, #20
  5366. 8023bb0: d990 bls.n 8023ad4 <_free_r+0x70>
  5367. 8023bb2: 2a54 cmp r2, #84 ; 0x54
  5368. 8023bb4: d80c bhi.n 8023bd0 <_free_r+0x16c>
  5369. 8023bb6: 0b18 lsrs r0, r3, #12
  5370. 8023bb8: 306e adds r0, #110 ; 0x6e
  5371. 8023bba: 0041 lsls r1, r0, #1
  5372. 8023bbc: e78a b.n 8023ad4 <_free_r+0x70>
  5373. 8023bbe: 2601 movs r6, #1
  5374. 8023bc0: 684d ldr r5, [r1, #4]
  5375. 8023bc2: 1080 asrs r0, r0, #2
  5376. 8023bc4: 4613 mov r3, r2
  5377. 8023bc6: fa06 f000 lsl.w r0, r6, r0
  5378. 8023bca: 4305 orrs r5, r0
  5379. 8023bcc: 604d str r5, [r1, #4]
  5380. 8023bce: e793 b.n 8023af8 <_free_r+0x94>
  5381. 8023bd0: f5b2 7faa cmp.w r2, #340 ; 0x154
  5382. 8023bd4: d803 bhi.n 8023bde <_free_r+0x17a>
  5383. 8023bd6: 0bd8 lsrs r0, r3, #15
  5384. 8023bd8: 3077 adds r0, #119 ; 0x77
  5385. 8023bda: 0041 lsls r1, r0, #1
  5386. 8023bdc: e77a b.n 8023ad4 <_free_r+0x70>
  5387. 8023bde: f240 5154 movw r1, #1364 ; 0x554
  5388. 8023be2: 428a cmp r2, r1
  5389. 8023be4: d803 bhi.n 8023bee <_free_r+0x18a>
  5390. 8023be6: 0c98 lsrs r0, r3, #18
  5391. 8023be8: 307c adds r0, #124 ; 0x7c
  5392. 8023bea: 0041 lsls r1, r0, #1
  5393. 8023bec: e772 b.n 8023ad4 <_free_r+0x70>
  5394. 8023bee: 21fc movs r1, #252 ; 0xfc
  5395. 8023bf0: 207e movs r0, #126 ; 0x7e
  5396. 8023bf2: e76f b.n 8023ad4 <_free_r+0x70>
  5397. 8023bf4: 200001a4 .word 0x200001a4
  5398. 08023bf8 <rshift>:
  5399. 8023bf8: 6902 ldr r2, [r0, #16]
  5400. 8023bfa: 114b asrs r3, r1, #5
  5401. 8023bfc: e92d 01f0 stmdb sp!, {r4, r5, r6, r7, r8}
  5402. 8023c00: 4293 cmp r3, r2
  5403. 8023c02: f100 0714 add.w r7, r0, #20
  5404. 8023c06: da2d bge.n 8023c64 <rshift+0x6c>
  5405. 8023c08: 3304 adds r3, #4
  5406. 8023c0a: eb00 0282 add.w r2, r0, r2, lsl #2
  5407. 8023c0e: 3214 adds r2, #20
  5408. 8023c10: f011 011f ands.w r1, r1, #31
  5409. 8023c14: eb00 0383 add.w r3, r0, r3, lsl #2
  5410. 8023c18: f103 0c04 add.w ip, r3, #4
  5411. 8023c1c: d029 beq.n 8023c72 <rshift+0x7a>
  5412. 8023c1e: 685c ldr r4, [r3, #4]
  5413. 8023c20: f10c 0304 add.w r3, ip, #4
  5414. 8023c24: 429a cmp r2, r3
  5415. 8023c26: f1c1 0820 rsb r8, r1, #32
  5416. 8023c2a: fa24 f401 lsr.w r4, r4, r1
  5417. 8023c2e: d938 bls.n 8023ca2 <rshift+0xaa>
  5418. 8023c30: 463d mov r5, r7
  5419. 8023c32: 681e ldr r6, [r3, #0]
  5420. 8023c34: fa06 f608 lsl.w r6, r6, r8
  5421. 8023c38: 4334 orrs r4, r6
  5422. 8023c3a: f845 4b04 str.w r4, [r5], #4
  5423. 8023c3e: f853 4b04 ldr.w r4, [r3], #4
  5424. 8023c42: 429a cmp r2, r3
  5425. 8023c44: fa24 f401 lsr.w r4, r4, r1
  5426. 8023c48: d8f3 bhi.n 8023c32 <rshift+0x3a>
  5427. 8023c4a: ebcc 0302 rsb r3, ip, r2
  5428. 8023c4e: 3b05 subs r3, #5
  5429. 8023c50: f023 0303 bic.w r3, r3, #3
  5430. 8023c54: 18c3 adds r3, r0, r3
  5431. 8023c56: 3318 adds r3, #24
  5432. 8023c58: 601c str r4, [r3, #0]
  5433. 8023c5a: b1e4 cbz r4, 8023c96 <rshift+0x9e>
  5434. 8023c5c: 3304 adds r3, #4
  5435. 8023c5e: 1bdf subs r7, r3, r7
  5436. 8023c60: 10bf asrs r7, r7, #2
  5437. 8023c62: e01a b.n 8023c9a <rshift+0xa2>
  5438. 8023c64: 2300 movs r3, #0
  5439. 8023c66: 6103 str r3, [r0, #16]
  5440. 8023c68: 2300 movs r3, #0
  5441. 8023c6a: 6143 str r3, [r0, #20]
  5442. 8023c6c: e8bd 01f0 ldmia.w sp!, {r4, r5, r6, r7, r8}
  5443. 8023c70: 4770 bx lr
  5444. 8023c72: 4562 cmp r2, ip
  5445. 8023c74: bf84 itt hi
  5446. 8023c76: 4663 movhi r3, ip
  5447. 8023c78: 4639 movhi r1, r7
  5448. 8023c7a: d9f3 bls.n 8023c64 <rshift+0x6c>
  5449. 8023c7c: f853 4b04 ldr.w r4, [r3], #4
  5450. 8023c80: 429a cmp r2, r3
  5451. 8023c82: f841 4b04 str.w r4, [r1], #4
  5452. 8023c86: d8f9 bhi.n 8023c7c <rshift+0x84>
  5453. 8023c88: ea6f 030c mvn.w r3, ip
  5454. 8023c8c: 189b adds r3, r3, r2
  5455. 8023c8e: f023 0303 bic.w r3, r3, #3
  5456. 8023c92: 18c3 adds r3, r0, r3
  5457. 8023c94: 3318 adds r3, #24
  5458. 8023c96: 1bdf subs r7, r3, r7
  5459. 8023c98: 10bf asrs r7, r7, #2
  5460. 8023c9a: 6107 str r7, [r0, #16]
  5461. 8023c9c: 2f00 cmp r7, #0
  5462. 8023c9e: d1e5 bne.n 8023c6c <rshift+0x74>
  5463. 8023ca0: e7e2 b.n 8023c68 <rshift+0x70>
  5464. 8023ca2: 463b mov r3, r7
  5465. 8023ca4: e7d8 b.n 8023c58 <rshift+0x60>
  5466. 8023ca6: bf00 nop
  5467. 08023ca8 <__hexdig_init>:
  5468. 8023ca8: f245 2094 movw r0, #21140 ; 0x5294
  5469. 8023cac: f244 03b0 movw r3, #16560 ; 0x40b0
  5470. 8023cb0: f6c0 0004 movt r0, #2052 ; 0x804
  5471. 8023cb4: 2110 movs r1, #16
  5472. 8023cb6: 2230 movs r2, #48 ; 0x30
  5473. 8023cb8: f2c2 0301 movt r3, #8193 ; 0x2001
  5474. 8023cbc: 5499 strb r1, [r3, r2]
  5475. 8023cbe: 3101 adds r1, #1
  5476. 8023cc0: f810 2f01 ldrb.w r2, [r0, #1]!
  5477. 8023cc4: b2c9 uxtb r1, r1
  5478. 8023cc6: 2a00 cmp r2, #0
  5479. 8023cc8: d1f8 bne.n 8023cbc <__hexdig_init+0x14>
  5480. 8023cca: f245 208c movw r0, #21132 ; 0x528c
  5481. 8023cce: 211a movs r1, #26
  5482. 8023cd0: f6c0 0004 movt r0, #2052 ; 0x804
  5483. 8023cd4: 2261 movs r2, #97 ; 0x61
  5484. 8023cd6: 5499 strb r1, [r3, r2]
  5485. 8023cd8: 3101 adds r1, #1
  5486. 8023cda: f810 2f01 ldrb.w r2, [r0, #1]!
  5487. 8023cde: b2c9 uxtb r1, r1
  5488. 8023ce0: 2a00 cmp r2, #0
  5489. 8023ce2: d1f8 bne.n 8023cd6 <__hexdig_init+0x2e>
  5490. 8023ce4: f245 2084 movw r0, #21124 ; 0x5284
  5491. 8023ce8: 211a movs r1, #26
  5492. 8023cea: f6c0 0004 movt r0, #2052 ; 0x804
  5493. 8023cee: 2241 movs r2, #65 ; 0x41
  5494. 8023cf0: 5499 strb r1, [r3, r2]
  5495. 8023cf2: 3101 adds r1, #1
  5496. 8023cf4: f810 2f01 ldrb.w r2, [r0, #1]!
  5497. 8023cf8: b2c9 uxtb r1, r1
  5498. 8023cfa: 2a00 cmp r2, #0
  5499. 8023cfc: d1f8 bne.n 8023cf0 <__hexdig_init+0x48>
  5500. 8023cfe: 4770 bx lr
  5501. 08023d00 <__gethex>:
  5502. 8023d00: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  5503. 8023d04: b08b sub sp, #44 ; 0x2c
  5504. 8023d06: 4688 mov r8, r1
  5505. 8023d08: f244 06b0 movw r6, #16560 ; 0x40b0
  5506. 8023d0c: 9206 str r2, [sp, #24]
  5507. 8023d0e: f2c2 0601 movt r6, #8193 ; 0x2001
  5508. 8023d12: 9309 str r3, [sp, #36] ; 0x24
  5509. 8023d14: 9007 str r0, [sp, #28]
  5510. 8023d16: f000 fbb9 bl 802448c <_localeconv_r>
  5511. 8023d1a: 6800 ldr r0, [r0, #0]
  5512. 8023d1c: 9002 str r0, [sp, #8]
  5513. 8023d1e: f7fe fa53 bl 80221c8 <strlen>
  5514. 8023d22: 9b02 ldr r3, [sp, #8]
  5515. 8023d24: 181a adds r2, r3, r0
  5516. 8023d26: f896 3030 ldrb.w r3, [r6, #48] ; 0x30
  5517. 8023d2a: 9003 str r0, [sp, #12]
  5518. 8023d2c: f812 ac01 ldrb.w sl, [r2, #-1]
  5519. 8023d30: 2b00 cmp r3, #0
  5520. 8023d32: f000 810e beq.w 8023f52 <__gethex+0x252>
  5521. 8023d36: f8d8 3000 ldr.w r3, [r8]
  5522. 8023d3a: 1c9d adds r5, r3, #2
  5523. 8023d3c: 789a ldrb r2, [r3, #2]
  5524. 8023d3e: 2a30 cmp r2, #48 ; 0x30
  5525. 8023d40: f040 8200 bne.w 8024144 <__gethex+0x444>
  5526. 8023d44: 3303 adds r3, #3
  5527. 8023d46: 2700 movs r7, #0
  5528. 8023d48: 461d mov r5, r3
  5529. 8023d4a: f813 2b01 ldrb.w r2, [r3], #1
  5530. 8023d4e: 3701 adds r7, #1
  5531. 8023d50: 2a30 cmp r2, #48 ; 0x30
  5532. 8023d52: d0f9 beq.n 8023d48 <__gethex+0x48>
  5533. 8023d54: f816 b002 ldrb.w fp, [r6, r2]
  5534. 8023d58: f244 09b0 movw r9, #16560 ; 0x40b0
  5535. 8023d5c: f2c2 0901 movt r9, #8193 ; 0x2001
  5536. 8023d60: f1bb 0f00 cmp.w fp, #0
  5537. 8023d64: f000 80f8 beq.w 8023f58 <__gethex+0x258>
  5538. 8023d68: 782b ldrb r3, [r5, #0]
  5539. 8023d6a: f04f 0b00 mov.w fp, #0
  5540. 8023d6e: f819 4003 ldrb.w r4, [r9, r3]
  5541. 8023d72: 2c00 cmp r4, #0
  5542. 8023d74: f000 8200 beq.w 8024178 <__gethex+0x478>
  5543. 8023d78: 1c6a adds r2, r5, #1
  5544. 8023d7a: 4614 mov r4, r2
  5545. 8023d7c: 3201 adds r2, #1
  5546. 8023d7e: 7823 ldrb r3, [r4, #0]
  5547. 8023d80: 5cf3 ldrb r3, [r6, r3]
  5548. 8023d82: 2b00 cmp r3, #0
  5549. 8023d84: d1f9 bne.n 8023d7a <__gethex+0x7a>
  5550. 8023d86: 4699 mov r9, r3
  5551. 8023d88: 4620 mov r0, r4
  5552. 8023d8a: 9902 ldr r1, [sp, #8]
  5553. 8023d8c: 9a03 ldr r2, [sp, #12]
  5554. 8023d8e: f7fe fa7d bl 802228c <strncmp>
  5555. 8023d92: b1e8 cbz r0, 8023dd0 <__gethex+0xd0>
  5556. 8023d94: 7823 ldrb r3, [r4, #0]
  5557. 8023d96: f1bb 0f00 cmp.w fp, #0
  5558. 8023d9a: f000 81c1 beq.w 8024120 <__gethex+0x420>
  5559. 8023d9e: ebc4 0b0b rsb fp, r4, fp
  5560. 8023da2: ea4f 028b mov.w r2, fp, lsl #2
  5561. 8023da6: 9205 str r2, [sp, #20]
  5562. 8023da8: 2b50 cmp r3, #80 ; 0x50
  5563. 8023daa: f000 809b beq.w 8023ee4 <__gethex+0x1e4>
  5564. 8023dae: 2b70 cmp r3, #112 ; 0x70
  5565. 8023db0: f000 8098 beq.w 8023ee4 <__gethex+0x1e4>
  5566. 8023db4: 4622 mov r2, r4
  5567. 8023db6: f8c8 2000 str.w r2, [r8]
  5568. 8023dba: f1b9 0f00 cmp.w r9, #0
  5569. 8023dbe: d00d beq.n 8023ddc <__gethex+0xdc>
  5570. 8023dc0: 2f00 cmp r7, #0
  5571. 8023dc2: bf0c ite eq
  5572. 8023dc4: 2706 moveq r7, #6
  5573. 8023dc6: 2700 movne r7, #0
  5574. 8023dc8: 4638 mov r0, r7
  5575. 8023dca: b00b add sp, #44 ; 0x2c
  5576. 8023dcc: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  5577. 8023dd0: f1bb 0f00 cmp.w fp, #0
  5578. 8023dd4: f000 81be beq.w 8024154 <__gethex+0x454>
  5579. 8023dd8: 7823 ldrb r3, [r4, #0]
  5580. 8023dda: e7e0 b.n 8023d9e <__gethex+0x9e>
  5581. 8023ddc: 1b63 subs r3, r4, r5
  5582. 8023dde: 4649 mov r1, r9
  5583. 8023de0: 3b01 subs r3, #1
  5584. 8023de2: 2b07 cmp r3, #7
  5585. 8023de4: dd03 ble.n 8023dee <__gethex+0xee>
  5586. 8023de6: 105b asrs r3, r3, #1
  5587. 8023de8: 3101 adds r1, #1
  5588. 8023dea: 2b07 cmp r3, #7
  5589. 8023dec: dcfb bgt.n 8023de6 <__gethex+0xe6>
  5590. 8023dee: 9807 ldr r0, [sp, #28]
  5591. 8023df0: f000 fe88 bl 8024b04 <_Balloc>
  5592. 8023df4: 42a5 cmp r5, r4
  5593. 8023df6: f100 0314 add.w r3, r0, #20
  5594. 8023dfa: 9004 str r0, [sp, #16]
  5595. 8023dfc: 9308 str r3, [sp, #32]
  5596. 8023dfe: f080 81db bcs.w 80241b8 <__gethex+0x4b8>
  5597. 8023e02: 469b mov fp, r3
  5598. 8023e04: 9b03 ldr r3, [sp, #12]
  5599. 8023e06: f04f 0800 mov.w r8, #0
  5600. 8023e0a: 4647 mov r7, r8
  5601. 8023e0c: f1c3 0c01 rsb ip, r3, #1
  5602. 8023e10: e00f b.n 8023e32 <__gethex+0x132>
  5603. 8023e12: 2f20 cmp r7, #32
  5604. 8023e14: d05f beq.n 8023ed6 <__gethex+0x1d6>
  5605. 8023e16: 463a mov r2, r7
  5606. 8023e18: 3704 adds r7, #4
  5607. 8023e1a: f814 3c01 ldrb.w r3, [r4, #-1]
  5608. 8023e1e: 464c mov r4, r9
  5609. 8023e20: 42a5 cmp r5, r4
  5610. 8023e22: 5cf3 ldrb r3, [r6, r3]
  5611. 8023e24: f003 030f and.w r3, r3, #15
  5612. 8023e28: fa03 f302 lsl.w r3, r3, r2
  5613. 8023e2c: ea48 0803 orr.w r8, r8, r3
  5614. 8023e30: d219 bcs.n 8023e66 <__gethex+0x166>
  5615. 8023e32: f814 3c01 ldrb.w r3, [r4, #-1]
  5616. 8023e36: f104 39ff add.w r9, r4, #4294967295
  5617. 8023e3a: 4553 cmp r3, sl
  5618. 8023e3c: d1e9 bne.n 8023e12 <__gethex+0x112>
  5619. 8023e3e: eb09 030c add.w r3, r9, ip
  5620. 8023e42: 429d cmp r5, r3
  5621. 8023e44: d8e5 bhi.n 8023e12 <__gethex+0x112>
  5622. 8023e46: 4618 mov r0, r3
  5623. 8023e48: 9902 ldr r1, [sp, #8]
  5624. 8023e4a: 9a03 ldr r2, [sp, #12]
  5625. 8023e4c: 9301 str r3, [sp, #4]
  5626. 8023e4e: f8cd c000 str.w ip, [sp]
  5627. 8023e52: f7fe fa1b bl 802228c <strncmp>
  5628. 8023e56: 9b01 ldr r3, [sp, #4]
  5629. 8023e58: f8dd c000 ldr.w ip, [sp]
  5630. 8023e5c: 2800 cmp r0, #0
  5631. 8023e5e: d1d8 bne.n 8023e12 <__gethex+0x112>
  5632. 8023e60: 461c mov r4, r3
  5633. 8023e62: 42a5 cmp r5, r4
  5634. 8023e64: d3e5 bcc.n 8023e32 <__gethex+0x132>
  5635. 8023e66: 9b08 ldr r3, [sp, #32]
  5636. 8023e68: 4640 mov r0, r8
  5637. 8023e6a: f84b 8b04 str.w r8, [fp], #4
  5638. 8023e6e: 9904 ldr r1, [sp, #16]
  5639. 8023e70: ebc3 0b0b rsb fp, r3, fp
  5640. 8023e74: ea4f 03ab mov.w r3, fp, asr #2
  5641. 8023e78: 610b str r3, [r1, #16]
  5642. 8023e7a: 015d lsls r5, r3, #5
  5643. 8023e7c: f000 ff24 bl 8024cc8 <__hi0bits>
  5644. 8023e80: 9a06 ldr r2, [sp, #24]
  5645. 8023e82: 6814 ldr r4, [r2, #0]
  5646. 8023e84: 1a28 subs r0, r5, r0
  5647. 8023e86: 42a0 cmp r0, r4
  5648. 8023e88: f300 8125 bgt.w 80240d6 <__gethex+0x3d6>
  5649. 8023e8c: f2c0 814b blt.w 8024126 <__gethex+0x426>
  5650. 8023e90: 2500 movs r5, #0
  5651. 8023e92: 9806 ldr r0, [sp, #24]
  5652. 8023e94: 9905 ldr r1, [sp, #20]
  5653. 8023e96: 6883 ldr r3, [r0, #8]
  5654. 8023e98: 4299 cmp r1, r3
  5655. 8023e9a: f300 80f6 bgt.w 802408a <__gethex+0x38a>
  5656. 8023e9e: 9806 ldr r0, [sp, #24]
  5657. 8023ea0: 9905 ldr r1, [sp, #20]
  5658. 8023ea2: 6843 ldr r3, [r0, #4]
  5659. 8023ea4: 4299 cmp r1, r3
  5660. 8023ea6: f280 8100 bge.w 80240aa <__gethex+0x3aa>
  5661. 8023eaa: 1a5e subs r6, r3, r1
  5662. 8023eac: 42b4 cmp r4, r6
  5663. 8023eae: dc76 bgt.n 8023f9e <__gethex+0x29e>
  5664. 8023eb0: 68c2 ldr r2, [r0, #12]
  5665. 8023eb2: 2a02 cmp r2, #2
  5666. 8023eb4: f000 816f beq.w 8024196 <__gethex+0x496>
  5667. 8023eb8: 2a03 cmp r2, #3
  5668. 8023eba: f000 8198 beq.w 80241ee <__gethex+0x4ee>
  5669. 8023ebe: 2a01 cmp r2, #1
  5670. 8023ec0: f000 8186 beq.w 80241d0 <__gethex+0x4d0>
  5671. 8023ec4: 9807 ldr r0, [sp, #28]
  5672. 8023ec6: 2750 movs r7, #80 ; 0x50
  5673. 8023ec8: 9904 ldr r1, [sp, #16]
  5674. 8023eca: f000 fe51 bl 8024b70 <_Bfree>
  5675. 8023ece: 9814 ldr r0, [sp, #80] ; 0x50
  5676. 8023ed0: 2300 movs r3, #0
  5677. 8023ed2: 6003 str r3, [r0, #0]
  5678. 8023ed4: e778 b.n 8023dc8 <__gethex+0xc8>
  5679. 8023ed6: f84b 8b04 str.w r8, [fp], #4
  5680. 8023eda: f04f 0800 mov.w r8, #0
  5681. 8023ede: 2704 movs r7, #4
  5682. 8023ee0: 4642 mov r2, r8
  5683. 8023ee2: e79a b.n 8023e1a <__gethex+0x11a>
  5684. 8023ee4: 7863 ldrb r3, [r4, #1]
  5685. 8023ee6: 2b2b cmp r3, #43 ; 0x2b
  5686. 8023ee8: f000 80f2 beq.w 80240d0 <__gethex+0x3d0>
  5687. 8023eec: 2b2d cmp r3, #45 ; 0x2d
  5688. 8023eee: f000 80ea beq.w 80240c6 <__gethex+0x3c6>
  5689. 8023ef2: 1c60 adds r0, r4, #1
  5690. 8023ef4: f04f 0b00 mov.w fp, #0
  5691. 8023ef8: 5cf1 ldrb r1, [r6, r3]
  5692. 8023efa: f244 03b0 movw r3, #16560 ; 0x40b0
  5693. 8023efe: f2c2 0301 movt r3, #8193 ; 0x2001
  5694. 8023f02: 2900 cmp r1, #0
  5695. 8023f04: f43f af56 beq.w 8023db4 <__gethex+0xb4>
  5696. 8023f08: 2919 cmp r1, #25
  5697. 8023f0a: f73f af53 bgt.w 8023db4 <__gethex+0xb4>
  5698. 8023f0e: f890 c001 ldrb.w ip, [r0, #1]
  5699. 8023f12: 3910 subs r1, #16
  5700. 8023f14: 1c42 adds r2, r0, #1
  5701. 8023f16: f813 300c ldrb.w r3, [r3, ip]
  5702. 8023f1a: b193 cbz r3, 8023f42 <__gethex+0x242>
  5703. 8023f1c: 2b19 cmp r3, #25
  5704. 8023f1e: dc10 bgt.n 8023f42 <__gethex+0x242>
  5705. 8023f20: 3002 adds r0, #2
  5706. 8023f22: e001 b.n 8023f28 <__gethex+0x228>
  5707. 8023f24: 2b19 cmp r3, #25
  5708. 8023f26: dc0c bgt.n 8023f42 <__gethex+0x242>
  5709. 8023f28: 4602 mov r2, r0
  5710. 8023f2a: eb01 0181 add.w r1, r1, r1, lsl #2
  5711. 8023f2e: 3001 adds r0, #1
  5712. 8023f30: f892 c000 ldrb.w ip, [r2]
  5713. 8023f34: eb03 0141 add.w r1, r3, r1, lsl #1
  5714. 8023f38: 3910 subs r1, #16
  5715. 8023f3a: f816 300c ldrb.w r3, [r6, ip]
  5716. 8023f3e: 2b00 cmp r3, #0
  5717. 8023f40: d1f0 bne.n 8023f24 <__gethex+0x224>
  5718. 8023f42: f1bb 0f00 cmp.w fp, #0
  5719. 8023f46: d000 beq.n 8023f4a <__gethex+0x24a>
  5720. 8023f48: 4249 negs r1, r1
  5721. 8023f4a: 9b05 ldr r3, [sp, #20]
  5722. 8023f4c: 185b adds r3, r3, r1
  5723. 8023f4e: 9305 str r3, [sp, #20]
  5724. 8023f50: e731 b.n 8023db6 <__gethex+0xb6>
  5725. 8023f52: f7ff fea9 bl 8023ca8 <__hexdig_init>
  5726. 8023f56: e6ee b.n 8023d36 <__gethex+0x36>
  5727. 8023f58: 4628 mov r0, r5
  5728. 8023f5a: 9902 ldr r1, [sp, #8]
  5729. 8023f5c: 9a03 ldr r2, [sp, #12]
  5730. 8023f5e: f7fe f995 bl 802228c <strncmp>
  5731. 8023f62: 2800 cmp r0, #0
  5732. 8023f64: f040 809a bne.w 802409c <__gethex+0x39c>
  5733. 8023f68: 9803 ldr r0, [sp, #12]
  5734. 8023f6a: 182c adds r4, r5, r0
  5735. 8023f6c: 5c2b ldrb r3, [r5, r0]
  5736. 8023f6e: f819 2003 ldrb.w r2, [r9, r3]
  5737. 8023f72: 2a00 cmp r2, #0
  5738. 8023f74: f000 80e8 beq.w 8024148 <__gethex+0x448>
  5739. 8023f78: 2b30 cmp r3, #48 ; 0x30
  5740. 8023f7a: f040 8108 bne.w 802418e <__gethex+0x48e>
  5741. 8023f7e: 1c63 adds r3, r4, #1
  5742. 8023f80: 461d mov r5, r3
  5743. 8023f82: f813 2b01 ldrb.w r2, [r3], #1
  5744. 8023f86: 2a30 cmp r2, #48 ; 0x30
  5745. 8023f88: d0fa beq.n 8023f80 <__gethex+0x280>
  5746. 8023f8a: 5cb3 ldrb r3, [r6, r2]
  5747. 8023f8c: 2b00 cmp r3, #0
  5748. 8023f8e: f040 80ff bne.w 8024190 <__gethex+0x490>
  5749. 8023f92: f04f 0901 mov.w r9, #1
  5750. 8023f96: 46a3 mov fp, r4
  5751. 8023f98: 464f mov r7, r9
  5752. 8023f9a: 462c mov r4, r5
  5753. 8023f9c: e6f4 b.n 8023d88 <__gethex+0x88>
  5754. 8023f9e: 1e77 subs r7, r6, #1
  5755. 8023fa0: 2d00 cmp r5, #0
  5756. 8023fa2: f040 80e7 bne.w 8024174 <__gethex+0x474>
  5757. 8023fa6: 2f00 cmp r7, #0
  5758. 8023fa8: dd04 ble.n 8023fb4 <__gethex+0x2b4>
  5759. 8023faa: 9804 ldr r0, [sp, #16]
  5760. 8023fac: 4639 mov r1, r7
  5761. 8023fae: f001 fa05 bl 80253bc <__any_on>
  5762. 8023fb2: 4605 mov r5, r0
  5763. 8023fb4: 9908 ldr r1, [sp, #32]
  5764. 8023fb6: 117b asrs r3, r7, #5
  5765. 8023fb8: 2201 movs r2, #1
  5766. 8023fba: f007 071f and.w r7, r7, #31
  5767. 8023fbe: 9804 ldr r0, [sp, #16]
  5768. 8023fc0: 1ba4 subs r4, r4, r6
  5769. 8023fc2: f851 3023 ldr.w r3, [r1, r3, lsl #2]
  5770. 8023fc6: fa02 f207 lsl.w r2, r2, r7
  5771. 8023fca: 4631 mov r1, r6
  5772. 8023fcc: 421a tst r2, r3
  5773. 8023fce: bf18 it ne
  5774. 8023fd0: f045 0502 orrne.w r5, r5, #2
  5775. 8023fd4: f7ff fe10 bl 8023bf8 <rshift>
  5776. 8023fd8: 9b06 ldr r3, [sp, #24]
  5777. 8023fda: 2702 movs r7, #2
  5778. 8023fdc: 685b ldr r3, [r3, #4]
  5779. 8023fde: 9305 str r3, [sp, #20]
  5780. 8023fe0: 2d00 cmp r5, #0
  5781. 8023fe2: d069 beq.n 80240b8 <__gethex+0x3b8>
  5782. 8023fe4: 9806 ldr r0, [sp, #24]
  5783. 8023fe6: 68c3 ldr r3, [r0, #12]
  5784. 8023fe8: 2b02 cmp r3, #2
  5785. 8023fea: f000 80ea beq.w 80241c2 <__gethex+0x4c2>
  5786. 8023fee: 2b03 cmp r3, #3
  5787. 8023ff0: d05d beq.n 80240ae <__gethex+0x3ae>
  5788. 8023ff2: 2b01 cmp r3, #1
  5789. 8023ff4: d15e bne.n 80240b4 <__gethex+0x3b4>
  5790. 8023ff6: 07aa lsls r2, r5, #30
  5791. 8023ff8: d55c bpl.n 80240b4 <__gethex+0x3b4>
  5792. 8023ffa: 9908 ldr r1, [sp, #32]
  5793. 8023ffc: 680b ldr r3, [r1, #0]
  5794. 8023ffe: 432b orrs r3, r5
  5795. 8024000: 07db lsls r3, r3, #31
  5796. 8024002: d557 bpl.n 80240b4 <__gethex+0x3b4>
  5797. 8024004: 9b04 ldr r3, [sp, #16]
  5798. 8024006: 2600 movs r6, #0
  5799. 8024008: 9904 ldr r1, [sp, #16]
  5800. 802400a: 691d ldr r5, [r3, #16]
  5801. 802400c: 9b08 ldr r3, [sp, #32]
  5802. 802400e: eb01 0085 add.w r0, r1, r5, lsl #2
  5803. 8024012: 3014 adds r0, #20
  5804. 8024014: 4619 mov r1, r3
  5805. 8024016: f853 2b04 ldr.w r2, [r3], #4
  5806. 802401a: f1b2 3fff cmp.w r2, #4294967295
  5807. 802401e: f040 80eb bne.w 80241f8 <__gethex+0x4f8>
  5808. 8024022: 4298 cmp r0, r3
  5809. 8024024: f843 6c04 str.w r6, [r3, #-4]
  5810. 8024028: d8f4 bhi.n 8024014 <__gethex+0x314>
  5811. 802402a: 9a04 ldr r2, [sp, #16]
  5812. 802402c: 6893 ldr r3, [r2, #8]
  5813. 802402e: 429d cmp r5, r3
  5814. 8024030: bfb8 it lt
  5815. 8024032: 462b movlt r3, r5
  5816. 8024034: f280 80f9 bge.w 802422a <__gethex+0x52a>
  5817. 8024038: 9904 ldr r1, [sp, #16]
  5818. 802403a: eb01 0283 add.w r2, r1, r3, lsl #2
  5819. 802403e: 3301 adds r3, #1
  5820. 8024040: 610b str r3, [r1, #16]
  5821. 8024042: 2301 movs r3, #1
  5822. 8024044: 6153 str r3, [r2, #20]
  5823. 8024046: 2f02 cmp r7, #2
  5824. 8024048: f000 80d9 beq.w 80241fe <__gethex+0x4fe>
  5825. 802404c: 9904 ldr r1, [sp, #16]
  5826. 802404e: 690b ldr r3, [r1, #16]
  5827. 8024050: 429d cmp r5, r3
  5828. 8024052: db0e blt.n 8024072 <__gethex+0x372>
  5829. 8024054: f014 041f ands.w r4, r4, #31
  5830. 8024058: f000 80ac beq.w 80241b4 <__gethex+0x4b4>
  5831. 802405c: 9b04 ldr r3, [sp, #16]
  5832. 802405e: eb03 0585 add.w r5, r3, r5, lsl #2
  5833. 8024062: 6928 ldr r0, [r5, #16]
  5834. 8024064: f000 fe30 bl 8024cc8 <__hi0bits>
  5835. 8024068: f1c4 0320 rsb r3, r4, #32
  5836. 802406c: 4298 cmp r0, r3
  5837. 802406e: f280 80a1 bge.w 80241b4 <__gethex+0x4b4>
  5838. 8024072: 9804 ldr r0, [sp, #16]
  5839. 8024074: 2101 movs r1, #1
  5840. 8024076: f7ff fdbf bl 8023bf8 <rshift>
  5841. 802407a: 9a06 ldr r2, [sp, #24]
  5842. 802407c: 9805 ldr r0, [sp, #20]
  5843. 802407e: 6893 ldr r3, [r2, #8]
  5844. 8024080: 3001 adds r0, #1
  5845. 8024082: 9005 str r0, [sp, #20]
  5846. 8024084: 4298 cmp r0, r3
  5847. 8024086: f340 8095 ble.w 80241b4 <__gethex+0x4b4>
  5848. 802408a: 9807 ldr r0, [sp, #28]
  5849. 802408c: 27a3 movs r7, #163 ; 0xa3
  5850. 802408e: 9904 ldr r1, [sp, #16]
  5851. 8024090: f000 fd6e bl 8024b70 <_Bfree>
  5852. 8024094: 9a14 ldr r2, [sp, #80] ; 0x50
  5853. 8024096: 2300 movs r3, #0
  5854. 8024098: 6013 str r3, [r2, #0]
  5855. 802409a: e695 b.n 8023dc8 <__gethex+0xc8>
  5856. 802409c: 782b ldrb r3, [r5, #0]
  5857. 802409e: 462c mov r4, r5
  5858. 80240a0: f8cd b014 str.w fp, [sp, #20]
  5859. 80240a4: f04f 0901 mov.w r9, #1
  5860. 80240a8: e67e b.n 8023da8 <__gethex+0xa8>
  5861. 80240aa: 2701 movs r7, #1
  5862. 80240ac: e798 b.n 8023fe0 <__gethex+0x2e0>
  5863. 80240ae: 9b15 ldr r3, [sp, #84] ; 0x54
  5864. 80240b0: 2b00 cmp r3, #0
  5865. 80240b2: d1a7 bne.n 8024004 <__gethex+0x304>
  5866. 80240b4: f047 0710 orr.w r7, r7, #16
  5867. 80240b8: 9b04 ldr r3, [sp, #16]
  5868. 80240ba: 9814 ldr r0, [sp, #80] ; 0x50
  5869. 80240bc: 6003 str r3, [r0, #0]
  5870. 80240be: 9b05 ldr r3, [sp, #20]
  5871. 80240c0: 9809 ldr r0, [sp, #36] ; 0x24
  5872. 80240c2: 6003 str r3, [r0, #0]
  5873. 80240c4: e680 b.n 8023dc8 <__gethex+0xc8>
  5874. 80240c6: f04f 0b01 mov.w fp, #1
  5875. 80240ca: 78a3 ldrb r3, [r4, #2]
  5876. 80240cc: 1ca0 adds r0, r4, #2
  5877. 80240ce: e713 b.n 8023ef8 <__gethex+0x1f8>
  5878. 80240d0: f04f 0b00 mov.w fp, #0
  5879. 80240d4: e7f9 b.n 80240ca <__gethex+0x3ca>
  5880. 80240d6: 1b06 subs r6, r0, r4
  5881. 80240d8: 9804 ldr r0, [sp, #16]
  5882. 80240da: 4631 mov r1, r6
  5883. 80240dc: f001 f96e bl 80253bc <__any_on>
  5884. 80240e0: 4605 mov r5, r0
  5885. 80240e2: b1a8 cbz r0, 8024110 <__gethex+0x410>
  5886. 80240e4: 1e73 subs r3, r6, #1
  5887. 80240e6: 9804 ldr r0, [sp, #16]
  5888. 80240e8: 2501 movs r5, #1
  5889. 80240ea: f003 011f and.w r1, r3, #31
  5890. 80240ee: 115a asrs r2, r3, #5
  5891. 80240f0: fa05 f101 lsl.w r1, r5, r1
  5892. 80240f4: eb00 0282 add.w r2, r0, r2, lsl #2
  5893. 80240f8: 6952 ldr r2, [r2, #20]
  5894. 80240fa: 4211 tst r1, r2
  5895. 80240fc: d008 beq.n 8024110 <__gethex+0x410>
  5896. 80240fe: 42ab cmp r3, r5
  5897. 8024100: dd05 ble.n 802410e <__gethex+0x40e>
  5898. 8024102: 9804 ldr r0, [sp, #16]
  5899. 8024104: 1eb1 subs r1, r6, #2
  5900. 8024106: f001 f959 bl 80253bc <__any_on>
  5901. 802410a: 2503 movs r5, #3
  5902. 802410c: b900 cbnz r0, 8024110 <__gethex+0x410>
  5903. 802410e: 2502 movs r5, #2
  5904. 8024110: 9804 ldr r0, [sp, #16]
  5905. 8024112: 4631 mov r1, r6
  5906. 8024114: f7ff fd70 bl 8023bf8 <rshift>
  5907. 8024118: 9b05 ldr r3, [sp, #20]
  5908. 802411a: 199b adds r3, r3, r6
  5909. 802411c: 9305 str r3, [sp, #20]
  5910. 802411e: e6b8 b.n 8023e92 <__gethex+0x192>
  5911. 8024120: f8cd b014 str.w fp, [sp, #20]
  5912. 8024124: e640 b.n 8023da8 <__gethex+0xa8>
  5913. 8024126: 1a25 subs r5, r4, r0
  5914. 8024128: 9904 ldr r1, [sp, #16]
  5915. 802412a: 462a mov r2, r5
  5916. 802412c: 9807 ldr r0, [sp, #28]
  5917. 802412e: f000 ff11 bl 8024f54 <__lshift>
  5918. 8024132: 9b05 ldr r3, [sp, #20]
  5919. 8024134: 1b5b subs r3, r3, r5
  5920. 8024136: 2500 movs r5, #0
  5921. 8024138: 9305 str r3, [sp, #20]
  5922. 802413a: 9004 str r0, [sp, #16]
  5923. 802413c: f100 0314 add.w r3, r0, #20
  5924. 8024140: 9308 str r3, [sp, #32]
  5925. 8024142: e6a6 b.n 8023e92 <__gethex+0x192>
  5926. 8024144: 2700 movs r7, #0
  5927. 8024146: e605 b.n 8023d54 <__gethex+0x54>
  5928. 8024148: 9205 str r2, [sp, #20]
  5929. 802414a: f04f 0901 mov.w r9, #1
  5930. 802414e: e62b b.n 8023da8 <__gethex+0xa8>
  5931. 8024150: 462c mov r4, r5
  5932. 8024152: 4681 mov r9, r0
  5933. 8024154: 9903 ldr r1, [sp, #12]
  5934. 8024156: eb04 0b01 add.w fp, r4, r1
  5935. 802415a: 5c63 ldrb r3, [r4, r1]
  5936. 802415c: 5cf2 ldrb r2, [r6, r3]
  5937. 802415e: 2a00 cmp r2, #0
  5938. 8024160: d07a beq.n 8024258 <__gethex+0x558>
  5939. 8024162: f10b 0201 add.w r2, fp, #1
  5940. 8024166: 4614 mov r4, r2
  5941. 8024168: f812 3b01 ldrb.w r3, [r2], #1
  5942. 802416c: 5cf1 ldrb r1, [r6, r3]
  5943. 802416e: 2900 cmp r1, #0
  5944. 8024170: d1f9 bne.n 8024166 <__gethex+0x466>
  5945. 8024172: e614 b.n 8023d9e <__gethex+0x9e>
  5946. 8024174: 2501 movs r5, #1
  5947. 8024176: e71d b.n 8023fb4 <__gethex+0x2b4>
  5948. 8024178: 4628 mov r0, r5
  5949. 802417a: 9902 ldr r1, [sp, #8]
  5950. 802417c: 9a03 ldr r2, [sp, #12]
  5951. 802417e: f7fe f885 bl 802228c <strncmp>
  5952. 8024182: 2800 cmp r0, #0
  5953. 8024184: d0e4 beq.n 8024150 <__gethex+0x450>
  5954. 8024186: 46a1 mov r9, r4
  5955. 8024188: 462c mov r4, r5
  5956. 802418a: 46cb mov fp, r9
  5957. 802418c: e602 b.n 8023d94 <__gethex+0x94>
  5958. 802418e: 4625 mov r5, r4
  5959. 8024190: 46a3 mov fp, r4
  5960. 8024192: 2701 movs r7, #1
  5961. 8024194: e5f0 b.n 8023d78 <__gethex+0x78>
  5962. 8024196: 9815 ldr r0, [sp, #84] ; 0x54
  5963. 8024198: 2800 cmp r0, #0
  5964. 802419a: f47f ae93 bne.w 8023ec4 <__gethex+0x1c4>
  5965. 802419e: 9a09 ldr r2, [sp, #36] ; 0x24
  5966. 80241a0: 2762 movs r7, #98 ; 0x62
  5967. 80241a2: 9804 ldr r0, [sp, #16]
  5968. 80241a4: 9908 ldr r1, [sp, #32]
  5969. 80241a6: 6013 str r3, [r2, #0]
  5970. 80241a8: 2301 movs r3, #1
  5971. 80241aa: 9a14 ldr r2, [sp, #80] ; 0x50
  5972. 80241ac: 6103 str r3, [r0, #16]
  5973. 80241ae: 600b str r3, [r1, #0]
  5974. 80241b0: 6010 str r0, [r2, #0]
  5975. 80241b2: e609 b.n 8023dc8 <__gethex+0xc8>
  5976. 80241b4: 2721 movs r7, #33 ; 0x21
  5977. 80241b6: e77f b.n 80240b8 <__gethex+0x3b8>
  5978. 80241b8: f8dd b020 ldr.w fp, [sp, #32]
  5979. 80241bc: f04f 0800 mov.w r8, #0
  5980. 80241c0: e651 b.n 8023e66 <__gethex+0x166>
  5981. 80241c2: 9a15 ldr r2, [sp, #84] ; 0x54
  5982. 80241c4: f1c2 0301 rsb r3, r2, #1
  5983. 80241c8: 2b00 cmp r3, #0
  5984. 80241ca: f43f af73 beq.w 80240b4 <__gethex+0x3b4>
  5985. 80241ce: e719 b.n 8024004 <__gethex+0x304>
  5986. 80241d0: 42a6 cmp r6, r4
  5987. 80241d2: f47f ae77 bne.w 8023ec4 <__gethex+0x1c4>
  5988. 80241d6: 2c01 cmp r4, #1
  5989. 80241d8: dde1 ble.n 802419e <__gethex+0x49e>
  5990. 80241da: 9804 ldr r0, [sp, #16]
  5991. 80241dc: 1e61 subs r1, r4, #1
  5992. 80241de: f001 f8ed bl 80253bc <__any_on>
  5993. 80241e2: 2800 cmp r0, #0
  5994. 80241e4: f43f ae6e beq.w 8023ec4 <__gethex+0x1c4>
  5995. 80241e8: 9a06 ldr r2, [sp, #24]
  5996. 80241ea: 6853 ldr r3, [r2, #4]
  5997. 80241ec: e7d7 b.n 802419e <__gethex+0x49e>
  5998. 80241ee: 9915 ldr r1, [sp, #84] ; 0x54
  5999. 80241f0: 2900 cmp r1, #0
  6000. 80241f2: f43f ae67 beq.w 8023ec4 <__gethex+0x1c4>
  6001. 80241f6: e7d2 b.n 802419e <__gethex+0x49e>
  6002. 80241f8: 3201 adds r2, #1
  6003. 80241fa: 600a str r2, [r1, #0]
  6004. 80241fc: e723 b.n 8024046 <__gethex+0x346>
  6005. 80241fe: 9a06 ldr r2, [sp, #24]
  6006. 8024200: 2722 movs r7, #34 ; 0x22
  6007. 8024202: 6813 ldr r3, [r2, #0]
  6008. 8024204: 3b01 subs r3, #1
  6009. 8024206: 42a3 cmp r3, r4
  6010. 8024208: f47f af56 bne.w 80240b8 <__gethex+0x3b8>
  6011. 802420c: 1163 asrs r3, r4, #5
  6012. 802420e: 9804 ldr r0, [sp, #16]
  6013. 8024210: 2201 movs r2, #1
  6014. 8024212: f004 041f and.w r4, r4, #31
  6015. 8024216: eb00 0383 add.w r3, r0, r3, lsl #2
  6016. 802421a: fa02 f204 lsl.w r2, r2, r4
  6017. 802421e: 695b ldr r3, [r3, #20]
  6018. 8024220: 421a tst r2, r3
  6019. 8024222: bf14 ite ne
  6020. 8024224: 2721 movne r7, #33 ; 0x21
  6021. 8024226: 2722 moveq r7, #34 ; 0x22
  6022. 8024228: e746 b.n 80240b8 <__gethex+0x3b8>
  6023. 802422a: 6851 ldr r1, [r2, #4]
  6024. 802422c: 9807 ldr r0, [sp, #28]
  6025. 802422e: 3101 adds r1, #1
  6026. 8024230: f000 fc68 bl 8024b04 <_Balloc>
  6027. 8024234: 4606 mov r6, r0
  6028. 8024236: 9804 ldr r0, [sp, #16]
  6029. 8024238: f100 010c add.w r1, r0, #12
  6030. 802423c: 6903 ldr r3, [r0, #16]
  6031. 802423e: f106 000c add.w r0, r6, #12
  6032. 8024242: 1c9a adds r2, r3, #2
  6033. 8024244: 0092 lsls r2, r2, #2
  6034. 8024246: f7fd fd2d bl 8021ca4 <memcpy>
  6035. 802424a: 9904 ldr r1, [sp, #16]
  6036. 802424c: 9807 ldr r0, [sp, #28]
  6037. 802424e: 9604 str r6, [sp, #16]
  6038. 8024250: f000 fc8e bl 8024b70 <_Bfree>
  6039. 8024254: 6933 ldr r3, [r6, #16]
  6040. 8024256: e6ef b.n 8024038 <__gethex+0x338>
  6041. 8024258: 465c mov r4, fp
  6042. 802425a: e5a0 b.n 8023d9e <__gethex+0x9e>
  6043. 0802425c <__hexnan>:
  6044. 802425c: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  6045. 8024260: f244 08b0 movw r8, #16560 ; 0x40b0
  6046. 8024264: f2c2 0801 movt r8, #8193 ; 0x2001
  6047. 8024268: b085 sub sp, #20
  6048. 802426a: 460c mov r4, r1
  6049. 802426c: 4692 mov sl, r2
  6050. 802426e: f898 3030 ldrb.w r3, [r8, #48] ; 0x30
  6051. 8024272: 9002 str r0, [sp, #8]
  6052. 8024274: 2b00 cmp r3, #0
  6053. 8024276: f000 80ad beq.w 80243d4 <__hexnan+0x178>
  6054. 802427a: 6823 ldr r3, [r4, #0]
  6055. 802427c: 115a asrs r2, r3, #5
  6056. 802427e: f013 031f ands.w r3, r3, #31
  6057. 8024282: 9303 str r3, [sp, #12]
  6058. 8024284: eb0a 0282 add.w r2, sl, r2, lsl #2
  6059. 8024288: 9200 str r2, [sp, #0]
  6060. 802428a: d001 beq.n 8024290 <__hexnan+0x34>
  6061. 802428c: 3204 adds r2, #4
  6062. 802428e: 9200 str r2, [sp, #0]
  6063. 8024290: 9a00 ldr r2, [sp, #0]
  6064. 8024292: 2300 movs r3, #0
  6065. 8024294: 4699 mov r9, r3
  6066. 8024296: 9900 ldr r1, [sp, #0]
  6067. 8024298: 46cb mov fp, r9
  6068. 802429a: 464e mov r6, r9
  6069. 802429c: f842 3c04 str.w r3, [r2, #-4]
  6070. 80242a0: 3904 subs r1, #4
  6071. 80242a2: 9b02 ldr r3, [sp, #8]
  6072. 80242a4: 9101 str r1, [sp, #4]
  6073. 80242a6: f8dd c004 ldr.w ip, [sp, #4]
  6074. 80242aa: 6819 ldr r1, [r3, #0]
  6075. 80242ac: 4664 mov r4, ip
  6076. 80242ae: 784b ldrb r3, [r1, #1]
  6077. 80242b0: 2b00 cmp r3, #0
  6078. 80242b2: d033 beq.n 802431c <__hexnan+0xc0>
  6079. 80242b4: f818 2003 ldrb.w r2, [r8, r3]
  6080. 80242b8: 2a00 cmp r2, #0
  6081. 80242ba: d16f bne.n 802439c <__hexnan+0x140>
  6082. 80242bc: 2b20 cmp r3, #32
  6083. 80242be: f200 8083 bhi.w 80243c8 <__hexnan+0x16c>
  6084. 80242c2: 455e cmp r6, fp
  6085. 80242c4: dd26 ble.n 8024314 <__hexnan+0xb8>
  6086. 80242c6: f1b9 0f07 cmp.w r9, #7
  6087. 80242ca: bfcc ite gt
  6088. 80242cc: 2300 movgt r3, #0
  6089. 80242ce: 2301 movle r3, #1
  6090. 80242d0: 4564 cmp r4, ip
  6091. 80242d2: bf28 it cs
  6092. 80242d4: 2300 movcs r3, #0
  6093. 80242d6: b193 cbz r3, 80242fe <__hexnan+0xa2>
  6094. 80242d8: f1c9 0908 rsb r9, r9, #8
  6095. 80242dc: 6822 ldr r2, [r4, #0]
  6096. 80242de: 4623 mov r3, r4
  6097. 80242e0: ea4f 0989 mov.w r9, r9, lsl #2
  6098. 80242e4: f1c9 0720 rsb r7, r9, #32
  6099. 80242e8: 6858 ldr r0, [r3, #4]
  6100. 80242ea: fa00 f507 lsl.w r5, r0, r7
  6101. 80242ee: 4315 orrs r5, r2
  6102. 80242f0: fa20 f209 lsr.w r2, r0, r9
  6103. 80242f4: 601d str r5, [r3, #0]
  6104. 80242f6: f843 2f04 str.w r2, [r3, #4]!
  6105. 80242fa: 459c cmp ip, r3
  6106. 80242fc: d8f4 bhi.n 80242e8 <__hexnan+0x8c>
  6107. 80242fe: 4554 cmp r4, sl
  6108. 8024300: bf98 it ls
  6109. 8024302: f04f 0908 movls.w r9, #8
  6110. 8024306: d905 bls.n 8024314 <__hexnan+0xb8>
  6111. 8024308: 2200 movs r2, #0
  6112. 802430a: 3c04 subs r4, #4
  6113. 802430c: 6022 str r2, [r4, #0]
  6114. 802430e: 46b3 mov fp, r6
  6115. 8024310: 46a4 mov ip, r4
  6116. 8024312: 4691 mov r9, r2
  6117. 8024314: 3101 adds r1, #1
  6118. 8024316: 784b ldrb r3, [r1, #1]
  6119. 8024318: 2b00 cmp r3, #0
  6120. 802431a: d1cb bne.n 80242b4 <__hexnan+0x58>
  6121. 802431c: 2e00 cmp r6, #0
  6122. 802431e: d055 beq.n 80243cc <__hexnan+0x170>
  6123. 8024320: f1b9 0f07 cmp.w r9, #7
  6124. 8024324: bfcc ite gt
  6125. 8024326: 2300 movgt r3, #0
  6126. 8024328: 2301 movle r3, #1
  6127. 802432a: 4564 cmp r4, ip
  6128. 802432c: bf28 it cs
  6129. 802432e: 2300 movcs r3, #0
  6130. 8024330: b193 cbz r3, 8024358 <__hexnan+0xfc>
  6131. 8024332: f1c9 0908 rsb r9, r9, #8
  6132. 8024336: 6822 ldr r2, [r4, #0]
  6133. 8024338: 4623 mov r3, r4
  6134. 802433a: ea4f 0989 mov.w r9, r9, lsl #2
  6135. 802433e: f1c9 0520 rsb r5, r9, #32
  6136. 8024342: 6859 ldr r1, [r3, #4]
  6137. 8024344: fa01 f005 lsl.w r0, r1, r5
  6138. 8024348: 4310 orrs r0, r2
  6139. 802434a: fa21 f209 lsr.w r2, r1, r9
  6140. 802434e: 6018 str r0, [r3, #0]
  6141. 8024350: f843 2f04 str.w r2, [r3, #4]!
  6142. 8024354: 4563 cmp r3, ip
  6143. 8024356: d3f4 bcc.n 8024342 <__hexnan+0xe6>
  6144. 8024358: 45a2 cmp sl, r4
  6145. 802435a: d23e bcs.n 80243da <__hexnan+0x17e>
  6146. 802435c: 9801 ldr r0, [sp, #4]
  6147. 802435e: 4652 mov r2, sl
  6148. 8024360: f854 1b04 ldr.w r1, [r4], #4
  6149. 8024364: 4613 mov r3, r2
  6150. 8024366: 42a0 cmp r0, r4
  6151. 8024368: f843 1b04 str.w r1, [r3], #4
  6152. 802436c: 461a mov r2, r3
  6153. 802436e: d2f7 bcs.n 8024360 <__hexnan+0x104>
  6154. 8024370: 9901 ldr r1, [sp, #4]
  6155. 8024372: 2200 movs r2, #0
  6156. 8024374: f843 2b04 str.w r2, [r3], #4
  6157. 8024378: 4299 cmp r1, r3
  6158. 802437a: d2fb bcs.n 8024374 <__hexnan+0x118>
  6159. 802437c: 9900 ldr r1, [sp, #0]
  6160. 802437e: f851 3c04 ldr.w r3, [r1, #-4]
  6161. 8024382: b94b cbnz r3, 8024398 <__hexnan+0x13c>
  6162. 8024384: 9b01 ldr r3, [sp, #4]
  6163. 8024386: 459a cmp sl, r3
  6164. 8024388: d102 bne.n 8024390 <__hexnan+0x134>
  6165. 802438a: e038 b.n 80243fe <__hexnan+0x1a2>
  6166. 802438c: 459a cmp sl, r3
  6167. 802438e: d037 beq.n 8024400 <__hexnan+0x1a4>
  6168. 8024390: f853 2d04 ldr.w r2, [r3, #-4]!
  6169. 8024394: 2a00 cmp r2, #0
  6170. 8024396: d0f9 beq.n 802438c <__hexnan+0x130>
  6171. 8024398: 2005 movs r0, #5
  6172. 802439a: e018 b.n 80243ce <__hexnan+0x172>
  6173. 802439c: f109 0901 add.w r9, r9, #1
  6174. 80243a0: 3601 adds r6, #1
  6175. 80243a2: f1b9 0f08 cmp.w r9, #8
  6176. 80243a6: dc07 bgt.n 80243b8 <__hexnan+0x15c>
  6177. 80243a8: 6823 ldr r3, [r4, #0]
  6178. 80243aa: 011b lsls r3, r3, #4
  6179. 80243ac: f002 020f and.w r2, r2, #15
  6180. 80243b0: 3101 adds r1, #1
  6181. 80243b2: 431a orrs r2, r3
  6182. 80243b4: 6022 str r2, [r4, #0]
  6183. 80243b6: e7ae b.n 8024316 <__hexnan+0xba>
  6184. 80243b8: 4554 cmp r4, sl
  6185. 80243ba: d9ab bls.n 8024314 <__hexnan+0xb8>
  6186. 80243bc: 2300 movs r3, #0
  6187. 80243be: 3c04 subs r4, #4
  6188. 80243c0: 6023 str r3, [r4, #0]
  6189. 80243c2: f04f 0901 mov.w r9, #1
  6190. 80243c6: e7f1 b.n 80243ac <__hexnan+0x150>
  6191. 80243c8: 2b29 cmp r3, #41 ; 0x29
  6192. 80243ca: d01d beq.n 8024408 <__hexnan+0x1ac>
  6193. 80243cc: 2004 movs r0, #4
  6194. 80243ce: b005 add sp, #20
  6195. 80243d0: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  6196. 80243d4: f7ff fc68 bl 8023ca8 <__hexdig_init>
  6197. 80243d8: e74f b.n 802427a <__hexnan+0x1e>
  6198. 80243da: 9a03 ldr r2, [sp, #12]
  6199. 80243dc: 2a00 cmp r2, #0
  6200. 80243de: d0cd beq.n 802437c <__hexnan+0x120>
  6201. 80243e0: 9a00 ldr r2, [sp, #0]
  6202. 80243e2: 9903 ldr r1, [sp, #12]
  6203. 80243e4: f852 3c04 ldr.w r3, [r2, #-4]
  6204. 80243e8: f1c1 0220 rsb r2, r1, #32
  6205. 80243ec: f04f 31ff mov.w r1, #4294967295
  6206. 80243f0: fa21 f202 lsr.w r2, r1, r2
  6207. 80243f4: 4013 ands r3, r2
  6208. 80243f6: 9a00 ldr r2, [sp, #0]
  6209. 80243f8: f842 3c04 str.w r3, [r2, #-4]
  6210. 80243fc: e7c1 b.n 8024382 <__hexnan+0x126>
  6211. 80243fe: 4653 mov r3, sl
  6212. 8024400: 2201 movs r2, #1
  6213. 8024402: 2005 movs r0, #5
  6214. 8024404: 601a str r2, [r3, #0]
  6215. 8024406: e7e2 b.n 80243ce <__hexnan+0x172>
  6216. 8024408: 9b02 ldr r3, [sp, #8]
  6217. 802440a: 3102 adds r1, #2
  6218. 802440c: 6019 str r1, [r3, #0]
  6219. 802440e: 2e00 cmp r6, #0
  6220. 8024410: d186 bne.n 8024320 <__hexnan+0xc4>
  6221. 8024412: e7db b.n 80243cc <__hexnan+0x170>
  6222. 08024414 <_setlocale_r>:
  6223. 8024414: b510 push {r4, lr}
  6224. 8024416: 4614 mov r4, r2
  6225. 8024418: b13a cbz r2, 802442a <_setlocale_r+0x16>
  6226. 802441a: f245 21a4 movw r1, #21156 ; 0x52a4
  6227. 802441e: 4610 mov r0, r2
  6228. 8024420: f6c0 0104 movt r1, #2052 ; 0x804
  6229. 8024424: f7fd fd84 bl 8021f30 <strcmp>
  6230. 8024428: b920 cbnz r0, 8024434 <_setlocale_r+0x20>
  6231. 802442a: f245 20a0 movw r0, #21152 ; 0x52a0
  6232. 802442e: f6c0 0004 movt r0, #2052 ; 0x804
  6233. 8024432: bd10 pop {r4, pc}
  6234. 8024434: f245 21a0 movw r1, #21152 ; 0x52a0
  6235. 8024438: 4620 mov r0, r4
  6236. 802443a: f6c0 0104 movt r1, #2052 ; 0x804
  6237. 802443e: f7fd fd77 bl 8021f30 <strcmp>
  6238. 8024442: 2800 cmp r0, #0
  6239. 8024444: d0f1 beq.n 802442a <_setlocale_r+0x16>
  6240. 8024446: f245 21ac movw r1, #21164 ; 0x52ac
  6241. 802444a: 4620 mov r0, r4
  6242. 802444c: f6c0 0104 movt r1, #2052 ; 0x804
  6243. 8024450: f7fd fd6e bl 8021f30 <strcmp>
  6244. 8024454: f245 23a0 movw r3, #21152 ; 0x52a0
  6245. 8024458: f6c0 0304 movt r3, #2052 ; 0x804
  6246. 802445c: 2800 cmp r0, #0
  6247. 802445e: bf0c ite eq
  6248. 8024460: 4618 moveq r0, r3
  6249. 8024462: 2000 movne r0, #0
  6250. 8024464: bd10 pop {r4, pc}
  6251. 8024466: bf00 nop
  6252. 08024468 <__locale_charset>:
  6253. 8024468: f240 1020 movw r0, #288 ; 0x120
  6254. 802446c: f2c2 0000 movt r0, #8192 ; 0x2000
  6255. 8024470: 4770 bx lr
  6256. 8024472: bf00 nop
  6257. 08024474 <__locale_mb_cur_max>:
  6258. 8024474: f240 1320 movw r3, #288 ; 0x120
  6259. 8024478: f2c2 0300 movt r3, #8192 ; 0x2000
  6260. 802447c: 6a18 ldr r0, [r3, #32]
  6261. 802447e: 4770 bx lr
  6262. 08024480 <__locale_msgcharset>:
  6263. 8024480: 4800 ldr r0, [pc, #0] ; (8024484 <__locale_msgcharset+0x4>)
  6264. 8024482: 4770 bx lr
  6265. 8024484: 20000144 .word 0x20000144
  6266. 08024488 <__locale_cjk_lang>:
  6267. 8024488: 2000 movs r0, #0
  6268. 802448a: 4770 bx lr
  6269. 0802448c <_localeconv_r>:
  6270. 802448c: 4800 ldr r0, [pc, #0] ; (8024490 <_localeconv_r+0x4>)
  6271. 802448e: 4770 bx lr
  6272. 8024490: 20000164 .word 0x20000164
  6273. 08024494 <setlocale>:
  6274. 8024494: f240 032c movw r3, #44 ; 0x2c
  6275. 8024498: 460a mov r2, r1
  6276. 802449a: f2c2 0300 movt r3, #8192 ; 0x2000
  6277. 802449e: 4601 mov r1, r0
  6278. 80244a0: 6818 ldr r0, [r3, #0]
  6279. 80244a2: f7ff bfb7 b.w 8024414 <_setlocale_r>
  6280. 80244a6: bf00 nop
  6281. 080244a8 <localeconv>:
  6282. 80244a8: 4800 ldr r0, [pc, #0] ; (80244ac <localeconv+0x4>)
  6283. 80244aa: 4770 bx lr
  6284. 80244ac: 20000164 .word 0x20000164
  6285. 080244b0 <malloc>:
  6286. 80244b0: f240 032c movw r3, #44 ; 0x2c
  6287. 80244b4: 4601 mov r1, r0
  6288. 80244b6: f2c2 0300 movt r3, #8192 ; 0x2000
  6289. 80244ba: 6818 ldr r0, [r3, #0]
  6290. 80244bc: f000 b808 b.w 80244d0 <_malloc_r>
  6291. 080244c0 <free>:
  6292. 80244c0: f240 032c movw r3, #44 ; 0x2c
  6293. 80244c4: 4601 mov r1, r0
  6294. 80244c6: f2c2 0300 movt r3, #8192 ; 0x2000
  6295. 80244ca: 6818 ldr r0, [r3, #0]
  6296. 80244cc: f7ff baca b.w 8023a64 <_free_r>
  6297. 080244d0 <_malloc_r>:
  6298. 80244d0: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  6299. 80244d4: f101 040b add.w r4, r1, #11
  6300. 80244d8: 2c16 cmp r4, #22
  6301. 80244da: b083 sub sp, #12
  6302. 80244dc: 4607 mov r7, r0
  6303. 80244de: d930 bls.n 8024542 <_malloc_r+0x72>
  6304. 80244e0: f024 0407 bic.w r4, r4, #7
  6305. 80244e4: 0fe3 lsrs r3, r4, #31
  6306. 80244e6: 428c cmp r4, r1
  6307. 80244e8: bf2c ite cs
  6308. 80244ea: 4619 movcs r1, r3
  6309. 80244ec: f043 0101 orrcc.w r1, r3, #1
  6310. 80244f0: 2900 cmp r1, #0
  6311. 80244f2: d12f bne.n 8024554 <_malloc_r+0x84>
  6312. 80244f4: 4638 mov r0, r7
  6313. 80244f6: f000 fb01 bl 8024afc <__malloc_lock>
  6314. 80244fa: f5b4 7ffc cmp.w r4, #504 ; 0x1f8
  6315. 80244fe: d22e bcs.n 802455e <_malloc_r+0x8e>
  6316. 8024500: ea4f 0cd4 mov.w ip, r4, lsr #3
  6317. 8024504: f240 169c movw r6, #412 ; 0x19c
  6318. 8024508: f2c2 0600 movt r6, #8192 ; 0x2000
  6319. 802450c: eb06 02cc add.w r2, r6, ip, lsl #3
  6320. 8024510: 68d3 ldr r3, [r2, #12]
  6321. 8024512: 4293 cmp r3, r2
  6322. 8024514: f000 8211 beq.w 802493a <_malloc_r+0x46a>
  6323. 8024518: 6859 ldr r1, [r3, #4]
  6324. 802451a: f103 0808 add.w r8, r3, #8
  6325. 802451e: 68da ldr r2, [r3, #12]
  6326. 8024520: 4638 mov r0, r7
  6327. 8024522: f021 0403 bic.w r4, r1, #3
  6328. 8024526: 6899 ldr r1, [r3, #8]
  6329. 8024528: 191b adds r3, r3, r4
  6330. 802452a: 685c ldr r4, [r3, #4]
  6331. 802452c: 60ca str r2, [r1, #12]
  6332. 802452e: f044 0401 orr.w r4, r4, #1
  6333. 8024532: 6091 str r1, [r2, #8]
  6334. 8024534: 605c str r4, [r3, #4]
  6335. 8024536: f000 fae3 bl 8024b00 <__malloc_unlock>
  6336. 802453a: 4640 mov r0, r8
  6337. 802453c: b003 add sp, #12
  6338. 802453e: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  6339. 8024542: 2300 movs r3, #0
  6340. 8024544: 2410 movs r4, #16
  6341. 8024546: 428c cmp r4, r1
  6342. 8024548: bf2c ite cs
  6343. 802454a: 4619 movcs r1, r3
  6344. 802454c: f043 0101 orrcc.w r1, r3, #1
  6345. 8024550: 2900 cmp r1, #0
  6346. 8024552: d0cf beq.n 80244f4 <_malloc_r+0x24>
  6347. 8024554: 230c movs r3, #12
  6348. 8024556: f04f 0800 mov.w r8, #0
  6349. 802455a: 603b str r3, [r7, #0]
  6350. 802455c: e7ed b.n 802453a <_malloc_r+0x6a>
  6351. 802455e: ea5f 2c54 movs.w ip, r4, lsr #9
  6352. 8024562: bf04 itt eq
  6353. 8024564: ea4f 0cd4 moveq.w ip, r4, lsr #3
  6354. 8024568: ea4f 054c moveq.w r5, ip, lsl #1
  6355. 802456c: f040 808f bne.w 802468e <_malloc_r+0x1be>
  6356. 8024570: f240 169c movw r6, #412 ; 0x19c
  6357. 8024574: f2c2 0600 movt r6, #8192 ; 0x2000
  6358. 8024578: eb06 0585 add.w r5, r6, r5, lsl #2
  6359. 802457c: 68eb ldr r3, [r5, #12]
  6360. 802457e: 429d cmp r5, r3
  6361. 8024580: d106 bne.n 8024590 <_malloc_r+0xc0>
  6362. 8024582: e00d b.n 80245a0 <_malloc_r+0xd0>
  6363. 8024584: 2a00 cmp r2, #0
  6364. 8024586: f280 8155 bge.w 8024834 <_malloc_r+0x364>
  6365. 802458a: 68db ldr r3, [r3, #12]
  6366. 802458c: 429d cmp r5, r3
  6367. 802458e: d007 beq.n 80245a0 <_malloc_r+0xd0>
  6368. 8024590: 6859 ldr r1, [r3, #4]
  6369. 8024592: f021 0103 bic.w r1, r1, #3
  6370. 8024596: 1b0a subs r2, r1, r4
  6371. 8024598: 2a0f cmp r2, #15
  6372. 802459a: ddf3 ble.n 8024584 <_malloc_r+0xb4>
  6373. 802459c: f10c 3cff add.w ip, ip, #4294967295
  6374. 80245a0: f10c 0c01 add.w ip, ip, #1
  6375. 80245a4: f240 129c movw r2, #412 ; 0x19c
  6376. 80245a8: 6933 ldr r3, [r6, #16]
  6377. 80245aa: f2c2 0200 movt r2, #8192 ; 0x2000
  6378. 80245ae: f102 0e08 add.w lr, r2, #8
  6379. 80245b2: 4573 cmp r3, lr
  6380. 80245b4: bf08 it eq
  6381. 80245b6: f8d2 9004 ldreq.w r9, [r2, #4]
  6382. 80245ba: d022 beq.n 8024602 <_malloc_r+0x132>
  6383. 80245bc: 6858 ldr r0, [r3, #4]
  6384. 80245be: f020 0003 bic.w r0, r0, #3
  6385. 80245c2: 1b01 subs r1, r0, r4
  6386. 80245c4: 290f cmp r1, #15
  6387. 80245c6: f300 8184 bgt.w 80248d2 <_malloc_r+0x402>
  6388. 80245ca: 2900 cmp r1, #0
  6389. 80245cc: f8c2 e014 str.w lr, [r2, #20]
  6390. 80245d0: f8c2 e010 str.w lr, [r2, #16]
  6391. 80245d4: da66 bge.n 80246a4 <_malloc_r+0x1d4>
  6392. 80245d6: f5b0 7f00 cmp.w r0, #512 ; 0x200
  6393. 80245da: f080 814e bcs.w 802487a <_malloc_r+0x3aa>
  6394. 80245de: 08c1 lsrs r1, r0, #3
  6395. 80245e0: f04f 0801 mov.w r8, #1
  6396. 80245e4: eb02 00c1 add.w r0, r2, r1, lsl #3
  6397. 80245e8: 1089 asrs r1, r1, #2
  6398. 80245ea: fa08 f801 lsl.w r8, r8, r1
  6399. 80245ee: 6851 ldr r1, [r2, #4]
  6400. 80245f0: 6885 ldr r5, [r0, #8]
  6401. 80245f2: 60d8 str r0, [r3, #12]
  6402. 80245f4: ea48 0901 orr.w r9, r8, r1
  6403. 80245f8: f8c2 9004 str.w r9, [r2, #4]
  6404. 80245fc: 609d str r5, [r3, #8]
  6405. 80245fe: 60eb str r3, [r5, #12]
  6406. 8024600: 6083 str r3, [r0, #8]
  6407. 8024602: 2201 movs r2, #1
  6408. 8024604: ea4f 03ac mov.w r3, ip, asr #2
  6409. 8024608: fa02 f303 lsl.w r3, r2, r3
  6410. 802460c: 454b cmp r3, r9
  6411. 802460e: d854 bhi.n 80246ba <_malloc_r+0x1ea>
  6412. 8024610: ea19 0f03 tst.w r9, r3
  6413. 8024614: d10d bne.n 8024632 <_malloc_r+0x162>
  6414. 8024616: 4093 lsls r3, r2
  6415. 8024618: f02c 0c03 bic.w ip, ip, #3
  6416. 802461c: ea19 0f03 tst.w r9, r3
  6417. 8024620: f10c 0c04 add.w ip, ip, #4
  6418. 8024624: d105 bne.n 8024632 <_malloc_r+0x162>
  6419. 8024626: 005b lsls r3, r3, #1
  6420. 8024628: f10c 0c04 add.w ip, ip, #4
  6421. 802462c: ea19 0f03 tst.w r9, r3
  6422. 8024630: d0f9 beq.n 8024626 <_malloc_r+0x156>
  6423. 8024632: eb06 09cc add.w r9, r6, ip, lsl #3
  6424. 8024636: 46e0 mov r8, ip
  6425. 8024638: 4648 mov r0, r9
  6426. 802463a: 68c2 ldr r2, [r0, #12]
  6427. 802463c: 4290 cmp r0, r2
  6428. 802463e: d107 bne.n 8024650 <_malloc_r+0x180>
  6429. 8024640: e15b b.n 80248fa <_malloc_r+0x42a>
  6430. 8024642: 2900 cmp r1, #0
  6431. 8024644: f280 8183 bge.w 802494e <_malloc_r+0x47e>
  6432. 8024648: 68d2 ldr r2, [r2, #12]
  6433. 802464a: 4290 cmp r0, r2
  6434. 802464c: f000 8155 beq.w 80248fa <_malloc_r+0x42a>
  6435. 8024650: 6855 ldr r5, [r2, #4]
  6436. 8024652: f025 0503 bic.w r5, r5, #3
  6437. 8024656: 1b29 subs r1, r5, r4
  6438. 8024658: 290f cmp r1, #15
  6439. 802465a: ddf2 ble.n 8024642 <_malloc_r+0x172>
  6440. 802465c: 4690 mov r8, r2
  6441. 802465e: 1913 adds r3, r2, r4
  6442. 8024660: 68d5 ldr r5, [r2, #12]
  6443. 8024662: f044 0001 orr.w r0, r4, #1
  6444. 8024666: f858 4f08 ldr.w r4, [r8, #8]!
  6445. 802466a: f041 0c01 orr.w ip, r1, #1
  6446. 802466e: 6050 str r0, [r2, #4]
  6447. 8024670: 4638 mov r0, r7
  6448. 8024672: f8c3 c004 str.w ip, [r3, #4]
  6449. 8024676: 60e5 str r5, [r4, #12]
  6450. 8024678: 60ac str r4, [r5, #8]
  6451. 802467a: 6173 str r3, [r6, #20]
  6452. 802467c: 6133 str r3, [r6, #16]
  6453. 802467e: f8c3 e00c str.w lr, [r3, #12]
  6454. 8024682: f8c3 e008 str.w lr, [r3, #8]
  6455. 8024686: 5059 str r1, [r3, r1]
  6456. 8024688: f000 fa3a bl 8024b00 <__malloc_unlock>
  6457. 802468c: e755 b.n 802453a <_malloc_r+0x6a>
  6458. 802468e: f1bc 0f04 cmp.w ip, #4
  6459. 8024692: f200 80de bhi.w 8024852 <_malloc_r+0x382>
  6460. 8024696: ea4f 1c94 mov.w ip, r4, lsr #6
  6461. 802469a: f10c 0c38 add.w ip, ip, #56 ; 0x38
  6462. 802469e: ea4f 054c mov.w r5, ip, lsl #1
  6463. 80246a2: e765 b.n 8024570 <_malloc_r+0xa0>
  6464. 80246a4: 181a adds r2, r3, r0
  6465. 80246a6: f103 0808 add.w r8, r3, #8
  6466. 80246aa: 4638 mov r0, r7
  6467. 80246ac: 6853 ldr r3, [r2, #4]
  6468. 80246ae: f043 0301 orr.w r3, r3, #1
  6469. 80246b2: 6053 str r3, [r2, #4]
  6470. 80246b4: f000 fa24 bl 8024b00 <__malloc_unlock>
  6471. 80246b8: e73f b.n 802453a <_malloc_r+0x6a>
  6472. 80246ba: 68b5 ldr r5, [r6, #8]
  6473. 80246bc: 686b ldr r3, [r5, #4]
  6474. 80246be: f023 0a03 bic.w sl, r3, #3
  6475. 80246c2: 4554 cmp r4, sl
  6476. 80246c4: d804 bhi.n 80246d0 <_malloc_r+0x200>
  6477. 80246c6: ebc4 030a rsb r3, r4, sl
  6478. 80246ca: 2b0f cmp r3, #15
  6479. 80246cc: f300 80a4 bgt.w 8024818 <_malloc_r+0x348>
  6480. 80246d0: f640 29e0 movw r9, #2784 ; 0xae0
  6481. 80246d4: f8d6 1408 ldr.w r1, [r6, #1032] ; 0x408
  6482. 80246d8: f2c2 0900 movt r9, #8192 ; 0x2000
  6483. 80246dc: eb05 020a add.w r2, r5, sl
  6484. 80246e0: 3101 adds r1, #1
  6485. 80246e2: f8d9 3000 ldr.w r3, [r9]
  6486. 80246e6: 4423 add r3, r4
  6487. 80246e8: bf08 it eq
  6488. 80246ea: f103 0b10 addeq.w fp, r3, #16
  6489. 80246ee: d006 beq.n 80246fe <_malloc_r+0x22e>
  6490. 80246f0: f503 5380 add.w r3, r3, #4096 ; 0x1000
  6491. 80246f4: 330f adds r3, #15
  6492. 80246f6: f423 637f bic.w r3, r3, #4080 ; 0xff0
  6493. 80246fa: f023 0b0f bic.w fp, r3, #15
  6494. 80246fe: 4638 mov r0, r7
  6495. 8024700: 4659 mov r1, fp
  6496. 8024702: 9201 str r2, [sp, #4]
  6497. 8024704: f000 fe86 bl 8025414 <_sbrk_r>
  6498. 8024708: 9a01 ldr r2, [sp, #4]
  6499. 802470a: 1c41 adds r1, r0, #1
  6500. 802470c: 4680 mov r8, r0
  6501. 802470e: f000 8168 beq.w 80249e2 <_malloc_r+0x512>
  6502. 8024712: 4282 cmp r2, r0
  6503. 8024714: f200 8131 bhi.w 802497a <_malloc_r+0x4aa>
  6504. 8024718: f8d9 3004 ldr.w r3, [r9, #4]
  6505. 802471c: 4542 cmp r2, r8
  6506. 802471e: 445b add r3, fp
  6507. 8024720: f8c9 3004 str.w r3, [r9, #4]
  6508. 8024724: f000 8166 beq.w 80249f4 <_malloc_r+0x524>
  6509. 8024728: f8d6 1408 ldr.w r1, [r6, #1032] ; 0x408
  6510. 802472c: f240 109c movw r0, #412 ; 0x19c
  6511. 8024730: f2c2 0000 movt r0, #8192 ; 0x2000
  6512. 8024734: 3101 adds r1, #1
  6513. 8024736: bf17 itett ne
  6514. 8024738: ebc2 0208 rsbne r2, r2, r8
  6515. 802473c: f8c0 8408 streq.w r8, [r0, #1032] ; 0x408
  6516. 8024740: 189b addne r3, r3, r2
  6517. 8024742: f8c9 3004 strne.w r3, [r9, #4]
  6518. 8024746: f018 0307 ands.w r3, r8, #7
  6519. 802474a: 4638 mov r0, r7
  6520. 802474c: bf1f itttt ne
  6521. 802474e: f1c3 0208 rsbne r2, r3, #8
  6522. 8024752: f5c3 5380 rsbne r3, r3, #4096 ; 0x1000
  6523. 8024756: 4490 addne r8, r2
  6524. 8024758: f103 0208 addne.w r2, r3, #8
  6525. 802475c: eb08 030b add.w r3, r8, fp
  6526. 8024760: bf08 it eq
  6527. 8024762: f44f 5280 moveq.w r2, #4096 ; 0x1000
  6528. 8024766: 051b lsls r3, r3, #20
  6529. 8024768: 0d1b lsrs r3, r3, #20
  6530. 802476a: ebc3 0b02 rsb fp, r3, r2
  6531. 802476e: 4659 mov r1, fp
  6532. 8024770: f000 fe50 bl 8025414 <_sbrk_r>
  6533. 8024774: 1c43 adds r3, r0, #1
  6534. 8024776: f000 8149 beq.w 8024a0c <_malloc_r+0x53c>
  6535. 802477a: ebc8 0100 rsb r1, r8, r0
  6536. 802477e: 4459 add r1, fp
  6537. 8024780: f041 0101 orr.w r1, r1, #1
  6538. 8024784: f8d9 3004 ldr.w r3, [r9, #4]
  6539. 8024788: 42b5 cmp r5, r6
  6540. 802478a: f640 22e0 movw r2, #2784 ; 0xae0
  6541. 802478e: f8c6 8008 str.w r8, [r6, #8]
  6542. 8024792: 445b add r3, fp
  6543. 8024794: f2c2 0200 movt r2, #8192 ; 0x2000
  6544. 8024798: f8c8 1004 str.w r1, [r8, #4]
  6545. 802479c: f8c9 3004 str.w r3, [r9, #4]
  6546. 80247a0: d018 beq.n 80247d4 <_malloc_r+0x304>
  6547. 80247a2: f1ba 0f0f cmp.w sl, #15
  6548. 80247a6: f240 810b bls.w 80249c0 <_malloc_r+0x4f0>
  6549. 80247aa: f1aa 000c sub.w r0, sl, #12
  6550. 80247ae: 6869 ldr r1, [r5, #4]
  6551. 80247b0: f020 0007 bic.w r0, r0, #7
  6552. 80247b4: f04f 0c05 mov.w ip, #5
  6553. 80247b8: eb05 0e00 add.w lr, r5, r0
  6554. 80247bc: 280f cmp r0, #15
  6555. 80247be: f001 0101 and.w r1, r1, #1
  6556. 80247c2: ea40 0101 orr.w r1, r0, r1
  6557. 80247c6: 6069 str r1, [r5, #4]
  6558. 80247c8: f8ce c004 str.w ip, [lr, #4]
  6559. 80247cc: f8ce c008 str.w ip, [lr, #8]
  6560. 80247d0: f200 8120 bhi.w 8024a14 <_malloc_r+0x544>
  6561. 80247d4: f640 22e0 movw r2, #2784 ; 0xae0
  6562. 80247d8: f8d9 102c ldr.w r1, [r9, #44] ; 0x2c
  6563. 80247dc: f2c2 0200 movt r2, #8192 ; 0x2000
  6564. 80247e0: 68b5 ldr r5, [r6, #8]
  6565. 80247e2: 428b cmp r3, r1
  6566. 80247e4: f8d9 1030 ldr.w r1, [r9, #48] ; 0x30
  6567. 80247e8: bf88 it hi
  6568. 80247ea: 62d3 strhi r3, [r2, #44] ; 0x2c
  6569. 80247ec: f640 22e0 movw r2, #2784 ; 0xae0
  6570. 80247f0: f2c2 0200 movt r2, #8192 ; 0x2000
  6571. 80247f4: 428b cmp r3, r1
  6572. 80247f6: bf88 it hi
  6573. 80247f8: 6313 strhi r3, [r2, #48] ; 0x30
  6574. 80247fa: 686a ldr r2, [r5, #4]
  6575. 80247fc: f022 0203 bic.w r2, r2, #3
  6576. 8024800: 4294 cmp r4, r2
  6577. 8024802: ebc4 0302 rsb r3, r4, r2
  6578. 8024806: d801 bhi.n 802480c <_malloc_r+0x33c>
  6579. 8024808: 2b0f cmp r3, #15
  6580. 802480a: dc05 bgt.n 8024818 <_malloc_r+0x348>
  6581. 802480c: 4638 mov r0, r7
  6582. 802480e: f04f 0800 mov.w r8, #0
  6583. 8024812: f000 f975 bl 8024b00 <__malloc_unlock>
  6584. 8024816: e690 b.n 802453a <_malloc_r+0x6a>
  6585. 8024818: 192a adds r2, r5, r4
  6586. 802481a: f043 0301 orr.w r3, r3, #1
  6587. 802481e: f044 0401 orr.w r4, r4, #1
  6588. 8024822: 4638 mov r0, r7
  6589. 8024824: 606c str r4, [r5, #4]
  6590. 8024826: f105 0808 add.w r8, r5, #8
  6591. 802482a: 6053 str r3, [r2, #4]
  6592. 802482c: 60b2 str r2, [r6, #8]
  6593. 802482e: f000 f967 bl 8024b00 <__malloc_unlock>
  6594. 8024832: e682 b.n 802453a <_malloc_r+0x6a>
  6595. 8024834: 1859 adds r1, r3, r1
  6596. 8024836: 68da ldr r2, [r3, #12]
  6597. 8024838: 689c ldr r4, [r3, #8]
  6598. 802483a: 4638 mov r0, r7
  6599. 802483c: 684d ldr r5, [r1, #4]
  6600. 802483e: f103 0808 add.w r8, r3, #8
  6601. 8024842: f045 0501 orr.w r5, r5, #1
  6602. 8024846: 60e2 str r2, [r4, #12]
  6603. 8024848: 6094 str r4, [r2, #8]
  6604. 802484a: 604d str r5, [r1, #4]
  6605. 802484c: f000 f958 bl 8024b00 <__malloc_unlock>
  6606. 8024850: e673 b.n 802453a <_malloc_r+0x6a>
  6607. 8024852: f1bc 0f14 cmp.w ip, #20
  6608. 8024856: bf9c itt ls
  6609. 8024858: f10c 0c5b addls.w ip, ip, #91 ; 0x5b
  6610. 802485c: ea4f 054c movls.w r5, ip, lsl #1
  6611. 8024860: f67f ae86 bls.w 8024570 <_malloc_r+0xa0>
  6612. 8024864: f1bc 0f54 cmp.w ip, #84 ; 0x54
  6613. 8024868: f200 8093 bhi.w 8024992 <_malloc_r+0x4c2>
  6614. 802486c: ea4f 3c14 mov.w ip, r4, lsr #12
  6615. 8024870: f10c 0c6e add.w ip, ip, #110 ; 0x6e
  6616. 8024874: ea4f 054c mov.w r5, ip, lsl #1
  6617. 8024878: e67a b.n 8024570 <_malloc_r+0xa0>
  6618. 802487a: 0a42 lsrs r2, r0, #9
  6619. 802487c: 2a04 cmp r2, #4
  6620. 802487e: d975 bls.n 802496c <_malloc_r+0x49c>
  6621. 8024880: 2a14 cmp r2, #20
  6622. 8024882: bf9c itt ls
  6623. 8024884: f102 095b addls.w r9, r2, #91 ; 0x5b
  6624. 8024888: ea4f 0549 movls.w r5, r9, lsl #1
  6625. 802488c: d908 bls.n 80248a0 <_malloc_r+0x3d0>
  6626. 802488e: 2a54 cmp r2, #84 ; 0x54
  6627. 8024890: f200 80c9 bhi.w 8024a26 <_malloc_r+0x556>
  6628. 8024894: ea4f 3910 mov.w r9, r0, lsr #12
  6629. 8024898: f109 096e add.w r9, r9, #110 ; 0x6e
  6630. 802489c: ea4f 0549 mov.w r5, r9, lsl #1
  6631. 80248a0: eb06 0585 add.w r5, r6, r5, lsl #2
  6632. 80248a4: f240 189c movw r8, #412 ; 0x19c
  6633. 80248a8: f2c2 0800 movt r8, #8192 ; 0x2000
  6634. 80248ac: 68aa ldr r2, [r5, #8]
  6635. 80248ae: 42aa cmp r2, r5
  6636. 80248b0: d079 beq.n 80249a6 <_malloc_r+0x4d6>
  6637. 80248b2: 6851 ldr r1, [r2, #4]
  6638. 80248b4: f021 0103 bic.w r1, r1, #3
  6639. 80248b8: 4288 cmp r0, r1
  6640. 80248ba: d202 bcs.n 80248c2 <_malloc_r+0x3f2>
  6641. 80248bc: 6892 ldr r2, [r2, #8]
  6642. 80248be: 4295 cmp r5, r2
  6643. 80248c0: d1f7 bne.n 80248b2 <_malloc_r+0x3e2>
  6644. 80248c2: 68d0 ldr r0, [r2, #12]
  6645. 80248c4: f8d6 9004 ldr.w r9, [r6, #4]
  6646. 80248c8: 60d8 str r0, [r3, #12]
  6647. 80248ca: 609a str r2, [r3, #8]
  6648. 80248cc: 60d3 str r3, [r2, #12]
  6649. 80248ce: 6083 str r3, [r0, #8]
  6650. 80248d0: e697 b.n 8024602 <_malloc_r+0x132>
  6651. 80248d2: 191d adds r5, r3, r4
  6652. 80248d4: f041 0601 orr.w r6, r1, #1
  6653. 80248d8: 6155 str r5, [r2, #20]
  6654. 80248da: f044 0401 orr.w r4, r4, #1
  6655. 80248de: 6115 str r5, [r2, #16]
  6656. 80248e0: 4638 mov r0, r7
  6657. 80248e2: 605c str r4, [r3, #4]
  6658. 80248e4: f103 0808 add.w r8, r3, #8
  6659. 80248e8: f8c5 e00c str.w lr, [r5, #12]
  6660. 80248ec: f8c5 e008 str.w lr, [r5, #8]
  6661. 80248f0: 606e str r6, [r5, #4]
  6662. 80248f2: 5069 str r1, [r5, r1]
  6663. 80248f4: f000 f904 bl 8024b00 <__malloc_unlock>
  6664. 80248f8: e61f b.n 802453a <_malloc_r+0x6a>
  6665. 80248fa: f108 0801 add.w r8, r8, #1
  6666. 80248fe: 3008 adds r0, #8
  6667. 8024900: f018 0f03 tst.w r8, #3
  6668. 8024904: f47f ae99 bne.w 802463a <_malloc_r+0x16a>
  6669. 8024908: 464a mov r2, r9
  6670. 802490a: f01c 0f03 tst.w ip, #3
  6671. 802490e: f1a2 0108 sub.w r1, r2, #8
  6672. 8024912: f10c 3cff add.w ip, ip, #4294967295
  6673. 8024916: f000 809e beq.w 8024a56 <_malloc_r+0x586>
  6674. 802491a: 6812 ldr r2, [r2, #0]
  6675. 802491c: 428a cmp r2, r1
  6676. 802491e: d0f4 beq.n 802490a <_malloc_r+0x43a>
  6677. 8024920: 6872 ldr r2, [r6, #4]
  6678. 8024922: 005b lsls r3, r3, #1
  6679. 8024924: 4293 cmp r3, r2
  6680. 8024926: f63f aec8 bhi.w 80246ba <_malloc_r+0x1ea>
  6681. 802492a: 2b00 cmp r3, #0
  6682. 802492c: f43f aec5 beq.w 80246ba <_malloc_r+0x1ea>
  6683. 8024930: 421a tst r2, r3
  6684. 8024932: f000 8095 beq.w 8024a60 <_malloc_r+0x590>
  6685. 8024936: 46c4 mov ip, r8
  6686. 8024938: e67b b.n 8024632 <_malloc_r+0x162>
  6687. 802493a: f103 0208 add.w r2, r3, #8
  6688. 802493e: 695b ldr r3, [r3, #20]
  6689. 8024940: 429a cmp r2, r3
  6690. 8024942: bf08 it eq
  6691. 8024944: f10c 0c02 addeq.w ip, ip, #2
  6692. 8024948: f43f ae2c beq.w 80245a4 <_malloc_r+0xd4>
  6693. 802494c: e5e4 b.n 8024518 <_malloc_r+0x48>
  6694. 802494e: 4690 mov r8, r2
  6695. 8024950: 1955 adds r5, r2, r5
  6696. 8024952: 68d3 ldr r3, [r2, #12]
  6697. 8024954: 4638 mov r0, r7
  6698. 8024956: f858 2f08 ldr.w r2, [r8, #8]!
  6699. 802495a: 6869 ldr r1, [r5, #4]
  6700. 802495c: 60d3 str r3, [r2, #12]
  6701. 802495e: f041 0101 orr.w r1, r1, #1
  6702. 8024962: 609a str r2, [r3, #8]
  6703. 8024964: 6069 str r1, [r5, #4]
  6704. 8024966: f000 f8cb bl 8024b00 <__malloc_unlock>
  6705. 802496a: e5e6 b.n 802453a <_malloc_r+0x6a>
  6706. 802496c: ea4f 1990 mov.w r9, r0, lsr #6
  6707. 8024970: f109 0938 add.w r9, r9, #56 ; 0x38
  6708. 8024974: ea4f 0549 mov.w r5, r9, lsl #1
  6709. 8024978: e792 b.n 80248a0 <_malloc_r+0x3d0>
  6710. 802497a: 42b5 cmp r5, r6
  6711. 802497c: f240 139c movw r3, #412 ; 0x19c
  6712. 8024980: f2c2 0300 movt r3, #8192 ; 0x2000
  6713. 8024984: f43f aec8 beq.w 8024718 <_malloc_r+0x248>
  6714. 8024988: 689d ldr r5, [r3, #8]
  6715. 802498a: 686a ldr r2, [r5, #4]
  6716. 802498c: f022 0203 bic.w r2, r2, #3
  6717. 8024990: e736 b.n 8024800 <_malloc_r+0x330>
  6718. 8024992: f5bc 7faa cmp.w ip, #340 ; 0x154
  6719. 8024996: d819 bhi.n 80249cc <_malloc_r+0x4fc>
  6720. 8024998: ea4f 3cd4 mov.w ip, r4, lsr #15
  6721. 802499c: f10c 0c77 add.w ip, ip, #119 ; 0x77
  6722. 80249a0: ea4f 054c mov.w r5, ip, lsl #1
  6723. 80249a4: e5e4 b.n 8024570 <_malloc_r+0xa0>
  6724. 80249a6: 2501 movs r5, #1
  6725. 80249a8: f8d8 1004 ldr.w r1, [r8, #4]
  6726. 80249ac: ea4f 09a9 mov.w r9, r9, asr #2
  6727. 80249b0: 4610 mov r0, r2
  6728. 80249b2: fa05 f509 lsl.w r5, r5, r9
  6729. 80249b6: ea45 0901 orr.w r9, r5, r1
  6730. 80249ba: f8c8 9004 str.w r9, [r8, #4]
  6731. 80249be: e783 b.n 80248c8 <_malloc_r+0x3f8>
  6732. 80249c0: 2301 movs r3, #1
  6733. 80249c2: 4645 mov r5, r8
  6734. 80249c4: f8c8 3004 str.w r3, [r8, #4]
  6735. 80249c8: 2200 movs r2, #0
  6736. 80249ca: e719 b.n 8024800 <_malloc_r+0x330>
  6737. 80249cc: f240 5354 movw r3, #1364 ; 0x554
  6738. 80249d0: 459c cmp ip, r3
  6739. 80249d2: d80b bhi.n 80249ec <_malloc_r+0x51c>
  6740. 80249d4: ea4f 4c94 mov.w ip, r4, lsr #18
  6741. 80249d8: f10c 0c7c add.w ip, ip, #124 ; 0x7c
  6742. 80249dc: ea4f 054c mov.w r5, ip, lsl #1
  6743. 80249e0: e5c6 b.n 8024570 <_malloc_r+0xa0>
  6744. 80249e2: 68b5 ldr r5, [r6, #8]
  6745. 80249e4: 686a ldr r2, [r5, #4]
  6746. 80249e6: f022 0203 bic.w r2, r2, #3
  6747. 80249ea: e709 b.n 8024800 <_malloc_r+0x330>
  6748. 80249ec: 25fc movs r5, #252 ; 0xfc
  6749. 80249ee: f04f 0c7e mov.w ip, #126 ; 0x7e
  6750. 80249f2: e5bd b.n 8024570 <_malloc_r+0xa0>
  6751. 80249f4: 0511 lsls r1, r2, #20
  6752. 80249f6: 0d09 lsrs r1, r1, #20
  6753. 80249f8: 2900 cmp r1, #0
  6754. 80249fa: f47f ae95 bne.w 8024728 <_malloc_r+0x258>
  6755. 80249fe: 68b2 ldr r2, [r6, #8]
  6756. 8024a00: eb0b 010a add.w r1, fp, sl
  6757. 8024a04: f041 0101 orr.w r1, r1, #1
  6758. 8024a08: 6051 str r1, [r2, #4]
  6759. 8024a0a: e6e3 b.n 80247d4 <_malloc_r+0x304>
  6760. 8024a0c: 2101 movs r1, #1
  6761. 8024a0e: f04f 0b00 mov.w fp, #0
  6762. 8024a12: e6b7 b.n 8024784 <_malloc_r+0x2b4>
  6763. 8024a14: 4638 mov r0, r7
  6764. 8024a16: f105 0108 add.w r1, r5, #8
  6765. 8024a1a: 9201 str r2, [sp, #4]
  6766. 8024a1c: f7ff f822 bl 8023a64 <_free_r>
  6767. 8024a20: 9a01 ldr r2, [sp, #4]
  6768. 8024a22: 6853 ldr r3, [r2, #4]
  6769. 8024a24: e6d6 b.n 80247d4 <_malloc_r+0x304>
  6770. 8024a26: f5b2 7faa cmp.w r2, #340 ; 0x154
  6771. 8024a2a: d806 bhi.n 8024a3a <_malloc_r+0x56a>
  6772. 8024a2c: ea4f 39d0 mov.w r9, r0, lsr #15
  6773. 8024a30: f109 0977 add.w r9, r9, #119 ; 0x77
  6774. 8024a34: ea4f 0549 mov.w r5, r9, lsl #1
  6775. 8024a38: e732 b.n 80248a0 <_malloc_r+0x3d0>
  6776. 8024a3a: f240 5154 movw r1, #1364 ; 0x554
  6777. 8024a3e: 25fc movs r5, #252 ; 0xfc
  6778. 8024a40: 428a cmp r2, r1
  6779. 8024a42: f04f 097e mov.w r9, #126 ; 0x7e
  6780. 8024a46: bf9e ittt ls
  6781. 8024a48: ea4f 4990 movls.w r9, r0, lsr #18
  6782. 8024a4c: f109 097c addls.w r9, r9, #124 ; 0x7c
  6783. 8024a50: ea4f 0549 movls.w r5, r9, lsl #1
  6784. 8024a54: e724 b.n 80248a0 <_malloc_r+0x3d0>
  6785. 8024a56: 6872 ldr r2, [r6, #4]
  6786. 8024a58: ea22 0203 bic.w r2, r2, r3
  6787. 8024a5c: 6072 str r2, [r6, #4]
  6788. 8024a5e: e760 b.n 8024922 <_malloc_r+0x452>
  6789. 8024a60: 005b lsls r3, r3, #1
  6790. 8024a62: f108 0804 add.w r8, r8, #4
  6791. 8024a66: e763 b.n 8024930 <_malloc_r+0x460>
  6792. 08024a68 <memchr>:
  6793. 8024a68: 0783 lsls r3, r0, #30
  6794. 8024a6a: b2c9 uxtb r1, r1
  6795. 8024a6c: b470 push {r4, r5, r6}
  6796. 8024a6e: d040 beq.n 8024af2 <memchr+0x8a>
  6797. 8024a70: 1e54 subs r4, r2, #1
  6798. 8024a72: 2a00 cmp r2, #0
  6799. 8024a74: d03f beq.n 8024af6 <memchr+0x8e>
  6800. 8024a76: 7803 ldrb r3, [r0, #0]
  6801. 8024a78: 428b cmp r3, r1
  6802. 8024a7a: d021 beq.n 8024ac0 <memchr+0x58>
  6803. 8024a7c: 1c43 adds r3, r0, #1
  6804. 8024a7e: e004 b.n 8024a8a <memchr+0x22>
  6805. 8024a80: b304 cbz r4, 8024ac4 <memchr+0x5c>
  6806. 8024a82: 7802 ldrb r2, [r0, #0]
  6807. 8024a84: 3c01 subs r4, #1
  6808. 8024a86: 428a cmp r2, r1
  6809. 8024a88: d01a beq.n 8024ac0 <memchr+0x58>
  6810. 8024a8a: f013 0f03 tst.w r3, #3
  6811. 8024a8e: 4618 mov r0, r3
  6812. 8024a90: f103 0301 add.w r3, r3, #1
  6813. 8024a94: d1f4 bne.n 8024a80 <memchr+0x18>
  6814. 8024a96: 2c03 cmp r4, #3
  6815. 8024a98: d816 bhi.n 8024ac8 <memchr+0x60>
  6816. 8024a9a: 1e65 subs r5, r4, #1
  6817. 8024a9c: b194 cbz r4, 8024ac4 <memchr+0x5c>
  6818. 8024a9e: 7803 ldrb r3, [r0, #0]
  6819. 8024aa0: 428b cmp r3, r1
  6820. 8024aa2: d00d beq.n 8024ac0 <memchr+0x58>
  6821. 8024aa4: 1c42 adds r2, r0, #1
  6822. 8024aa6: 2300 movs r3, #0
  6823. 8024aa8: e002 b.n 8024ab0 <memchr+0x48>
  6824. 8024aaa: 7804 ldrb r4, [r0, #0]
  6825. 8024aac: 428c cmp r4, r1
  6826. 8024aae: d007 beq.n 8024ac0 <memchr+0x58>
  6827. 8024ab0: 429d cmp r5, r3
  6828. 8024ab2: 4610 mov r0, r2
  6829. 8024ab4: f103 0301 add.w r3, r3, #1
  6830. 8024ab8: f102 0201 add.w r2, r2, #1
  6831. 8024abc: d1f5 bne.n 8024aaa <memchr+0x42>
  6832. 8024abe: 2000 movs r0, #0
  6833. 8024ac0: bc70 pop {r4, r5, r6}
  6834. 8024ac2: 4770 bx lr
  6835. 8024ac4: 4620 mov r0, r4
  6836. 8024ac6: e7fb b.n 8024ac0 <memchr+0x58>
  6837. 8024ac8: ea41 2601 orr.w r6, r1, r1, lsl #8
  6838. 8024acc: ea46 4606 orr.w r6, r6, r6, lsl #16
  6839. 8024ad0: 4602 mov r2, r0
  6840. 8024ad2: 3004 adds r0, #4
  6841. 8024ad4: 6813 ldr r3, [r2, #0]
  6842. 8024ad6: 4073 eors r3, r6
  6843. 8024ad8: f1a3 3501 sub.w r5, r3, #16843009 ; 0x1010101
  6844. 8024adc: ea25 0303 bic.w r3, r5, r3
  6845. 8024ae0: f013 3f80 tst.w r3, #2155905152 ; 0x80808080
  6846. 8024ae4: d103 bne.n 8024aee <memchr+0x86>
  6847. 8024ae6: 3c04 subs r4, #4
  6848. 8024ae8: 2c03 cmp r4, #3
  6849. 8024aea: d8f1 bhi.n 8024ad0 <memchr+0x68>
  6850. 8024aec: e7d5 b.n 8024a9a <memchr+0x32>
  6851. 8024aee: 4610 mov r0, r2
  6852. 8024af0: e7d3 b.n 8024a9a <memchr+0x32>
  6853. 8024af2: 4614 mov r4, r2
  6854. 8024af4: e7cf b.n 8024a96 <memchr+0x2e>
  6855. 8024af6: 4610 mov r0, r2
  6856. 8024af8: e7e2 b.n 8024ac0 <memchr+0x58>
  6857. 8024afa: bf00 nop
  6858. 08024afc <__malloc_lock>:
  6859. 8024afc: 4770 bx lr
  6860. 8024afe: bf00 nop
  6861. 08024b00 <__malloc_unlock>:
  6862. 8024b00: 4770 bx lr
  6863. 8024b02: bf00 nop
  6864. 08024b04 <_Balloc>:
  6865. 8024b04: b570 push {r4, r5, r6, lr}
  6866. 8024b06: 4606 mov r6, r0
  6867. 8024b08: 6a44 ldr r4, [r0, #36] ; 0x24
  6868. 8024b0a: 460d mov r5, r1
  6869. 8024b0c: b15c cbz r4, 8024b26 <_Balloc+0x22>
  6870. 8024b0e: 68e2 ldr r2, [r4, #12]
  6871. 8024b10: b19a cbz r2, 8024b3a <_Balloc+0x36>
  6872. 8024b12: f852 0025 ldr.w r0, [r2, r5, lsl #2]
  6873. 8024b16: b1e0 cbz r0, 8024b52 <_Balloc+0x4e>
  6874. 8024b18: 6801 ldr r1, [r0, #0]
  6875. 8024b1a: f842 1025 str.w r1, [r2, r5, lsl #2]
  6876. 8024b1e: 2200 movs r2, #0
  6877. 8024b20: 6102 str r2, [r0, #16]
  6878. 8024b22: 60c2 str r2, [r0, #12]
  6879. 8024b24: bd70 pop {r4, r5, r6, pc}
  6880. 8024b26: 2010 movs r0, #16
  6881. 8024b28: f7ff fcc2 bl 80244b0 <malloc>
  6882. 8024b2c: 2300 movs r3, #0
  6883. 8024b2e: 4604 mov r4, r0
  6884. 8024b30: 6270 str r0, [r6, #36] ; 0x24
  6885. 8024b32: 6043 str r3, [r0, #4]
  6886. 8024b34: 6083 str r3, [r0, #8]
  6887. 8024b36: 6003 str r3, [r0, #0]
  6888. 8024b38: 60c3 str r3, [r0, #12]
  6889. 8024b3a: 2221 movs r2, #33 ; 0x21
  6890. 8024b3c: 4630 mov r0, r6
  6891. 8024b3e: 2104 movs r1, #4
  6892. 8024b40: f000 fcfc bl 802553c <_calloc_r>
  6893. 8024b44: 6a73 ldr r3, [r6, #36] ; 0x24
  6894. 8024b46: 60e0 str r0, [r4, #12]
  6895. 8024b48: 68da ldr r2, [r3, #12]
  6896. 8024b4a: 2a00 cmp r2, #0
  6897. 8024b4c: d1e1 bne.n 8024b12 <_Balloc+0xe>
  6898. 8024b4e: 2000 movs r0, #0
  6899. 8024b50: bd70 pop {r4, r5, r6, pc}
  6900. 8024b52: 2301 movs r3, #1
  6901. 8024b54: 4630 mov r0, r6
  6902. 8024b56: 4619 mov r1, r3
  6903. 8024b58: fa03 f405 lsl.w r4, r3, r5
  6904. 8024b5c: 1d62 adds r2, r4, #5
  6905. 8024b5e: 0092 lsls r2, r2, #2
  6906. 8024b60: f000 fcec bl 802553c <_calloc_r>
  6907. 8024b64: 2800 cmp r0, #0
  6908. 8024b66: d0f2 beq.n 8024b4e <_Balloc+0x4a>
  6909. 8024b68: 6045 str r5, [r0, #4]
  6910. 8024b6a: 6084 str r4, [r0, #8]
  6911. 8024b6c: e7d7 b.n 8024b1e <_Balloc+0x1a>
  6912. 8024b6e: bf00 nop
  6913. 08024b70 <_Bfree>:
  6914. 8024b70: b530 push {r4, r5, lr}
  6915. 8024b72: 4604 mov r4, r0
  6916. 8024b74: 6a45 ldr r5, [r0, #36] ; 0x24
  6917. 8024b76: b083 sub sp, #12
  6918. 8024b78: b155 cbz r5, 8024b90 <_Bfree+0x20>
  6919. 8024b7a: b139 cbz r1, 8024b8c <_Bfree+0x1c>
  6920. 8024b7c: 6a63 ldr r3, [r4, #36] ; 0x24
  6921. 8024b7e: 684a ldr r2, [r1, #4]
  6922. 8024b80: 68db ldr r3, [r3, #12]
  6923. 8024b82: f853 0022 ldr.w r0, [r3, r2, lsl #2]
  6924. 8024b86: 6008 str r0, [r1, #0]
  6925. 8024b88: f843 1022 str.w r1, [r3, r2, lsl #2]
  6926. 8024b8c: b003 add sp, #12
  6927. 8024b8e: bd30 pop {r4, r5, pc}
  6928. 8024b90: 2010 movs r0, #16
  6929. 8024b92: 9101 str r1, [sp, #4]
  6930. 8024b94: f7ff fc8c bl 80244b0 <malloc>
  6931. 8024b98: 9901 ldr r1, [sp, #4]
  6932. 8024b9a: 6260 str r0, [r4, #36] ; 0x24
  6933. 8024b9c: 6045 str r5, [r0, #4]
  6934. 8024b9e: 6085 str r5, [r0, #8]
  6935. 8024ba0: 6005 str r5, [r0, #0]
  6936. 8024ba2: 60c5 str r5, [r0, #12]
  6937. 8024ba4: e7e9 b.n 8024b7a <_Bfree+0xa>
  6938. 8024ba6: bf00 nop
  6939. 08024ba8 <__multadd>:
  6940. 8024ba8: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
  6941. 8024bac: 4688 mov r8, r1
  6942. 8024bae: f8d1 a010 ldr.w sl, [r1, #16]
  6943. 8024bb2: b082 sub sp, #8
  6944. 8024bb4: 4681 mov r9, r0
  6945. 8024bb6: f101 0514 add.w r5, r1, #20
  6946. 8024bba: 2400 movs r4, #0
  6947. 8024bbc: 682f ldr r7, [r5, #0]
  6948. 8024bbe: 3401 adds r4, #1
  6949. 8024bc0: b2be uxth r6, r7
  6950. 8024bc2: 0c3f lsrs r7, r7, #16
  6951. 8024bc4: fb02 3606 mla r6, r2, r6, r3
  6952. 8024bc8: fb02 f307 mul.w r3, r2, r7
  6953. 8024bcc: eb03 4316 add.w r3, r3, r6, lsr #16
  6954. 8024bd0: b2b6 uxth r6, r6
  6955. 8024bd2: eb06 4603 add.w r6, r6, r3, lsl #16
  6956. 8024bd6: 0c1b lsrs r3, r3, #16
  6957. 8024bd8: 45a2 cmp sl, r4
  6958. 8024bda: f845 6b04 str.w r6, [r5], #4
  6959. 8024bde: dced bgt.n 8024bbc <__multadd+0x14>
  6960. 8024be0: b153 cbz r3, 8024bf8 <__multadd+0x50>
  6961. 8024be2: f8d8 2008 ldr.w r2, [r8, #8]
  6962. 8024be6: 4592 cmp sl, r2
  6963. 8024be8: da0a bge.n 8024c00 <__multadd+0x58>
  6964. 8024bea: eb08 028a add.w r2, r8, sl, lsl #2
  6965. 8024bee: f10a 0101 add.w r1, sl, #1
  6966. 8024bf2: f8c8 1010 str.w r1, [r8, #16]
  6967. 8024bf6: 6153 str r3, [r2, #20]
  6968. 8024bf8: 4640 mov r0, r8
  6969. 8024bfa: b002 add sp, #8
  6970. 8024bfc: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc}
  6971. 8024c00: f8d8 1004 ldr.w r1, [r8, #4]
  6972. 8024c04: 4648 mov r0, r9
  6973. 8024c06: 9301 str r3, [sp, #4]
  6974. 8024c08: 3101 adds r1, #1
  6975. 8024c0a: f7ff ff7b bl 8024b04 <_Balloc>
  6976. 8024c0e: f8d8 2010 ldr.w r2, [r8, #16]
  6977. 8024c12: f108 010c add.w r1, r8, #12
  6978. 8024c16: 3202 adds r2, #2
  6979. 8024c18: 0092 lsls r2, r2, #2
  6980. 8024c1a: 4604 mov r4, r0
  6981. 8024c1c: 300c adds r0, #12
  6982. 8024c1e: f7fd f841 bl 8021ca4 <memcpy>
  6983. 8024c22: 4641 mov r1, r8
  6984. 8024c24: 4648 mov r0, r9
  6985. 8024c26: 46a0 mov r8, r4
  6986. 8024c28: f7ff ffa2 bl 8024b70 <_Bfree>
  6987. 8024c2c: 9b01 ldr r3, [sp, #4]
  6988. 8024c2e: e7dc b.n 8024bea <__multadd+0x42>
  6989. 08024c30 <__s2b>:
  6990. 8024c30: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr}
  6991. 8024c34: f648 6539 movw r5, #36409 ; 0x8e39
  6992. 8024c38: 461f mov r7, r3
  6993. 8024c3a: f6c3 05e3 movt r5, #14563 ; 0x38e3
  6994. 8024c3e: 3308 adds r3, #8
  6995. 8024c40: 4606 mov r6, r0
  6996. 8024c42: 460c mov r4, r1
  6997. 8024c44: 4690 mov r8, r2
  6998. 8024c46: fb85 1003 smull r1, r0, r5, r3
  6999. 8024c4a: 17db asrs r3, r3, #31
  7000. 8024c4c: ebc3 0060 rsb r0, r3, r0, asr #1
  7001. 8024c50: 2801 cmp r0, #1
  7002. 8024c52: dd37 ble.n 8024cc4 <__s2b+0x94>
  7003. 8024c54: 2501 movs r5, #1
  7004. 8024c56: 2100 movs r1, #0
  7005. 8024c58: 006d lsls r5, r5, #1
  7006. 8024c5a: 3101 adds r1, #1
  7007. 8024c5c: 42a8 cmp r0, r5
  7008. 8024c5e: dcfb bgt.n 8024c58 <__s2b+0x28>
  7009. 8024c60: 4630 mov r0, r6
  7010. 8024c62: f7ff ff4f bl 8024b04 <_Balloc>
  7011. 8024c66: 9b08 ldr r3, [sp, #32]
  7012. 8024c68: 6143 str r3, [r0, #20]
  7013. 8024c6a: 2301 movs r3, #1
  7014. 8024c6c: f1b8 0f09 cmp.w r8, #9
  7015. 8024c70: 4601 mov r1, r0
  7016. 8024c72: 6103 str r3, [r0, #16]
  7017. 8024c74: dd22 ble.n 8024cbc <__s2b+0x8c>
  7018. 8024c76: f104 0909 add.w r9, r4, #9
  7019. 8024c7a: 4444 add r4, r8
  7020. 8024c7c: 464d mov r5, r9
  7021. 8024c7e: f815 3b01 ldrb.w r3, [r5], #1
  7022. 8024c82: 220a movs r2, #10
  7023. 8024c84: 4630 mov r0, r6
  7024. 8024c86: 3b30 subs r3, #48 ; 0x30
  7025. 8024c88: f7ff ff8e bl 8024ba8 <__multadd>
  7026. 8024c8c: 42a5 cmp r5, r4
  7027. 8024c8e: 4601 mov r1, r0
  7028. 8024c90: d1f5 bne.n 8024c7e <__s2b+0x4e>
  7029. 8024c92: eb09 0408 add.w r4, r9, r8
  7030. 8024c96: 3c08 subs r4, #8
  7031. 8024c98: 4547 cmp r7, r8
  7032. 8024c9a: dd0c ble.n 8024cb6 <__s2b+0x86>
  7033. 8024c9c: ebc8 0707 rsb r7, r8, r7
  7034. 8024ca0: 19e7 adds r7, r4, r7
  7035. 8024ca2: f814 3b01 ldrb.w r3, [r4], #1
  7036. 8024ca6: 220a movs r2, #10
  7037. 8024ca8: 4630 mov r0, r6
  7038. 8024caa: 3b30 subs r3, #48 ; 0x30
  7039. 8024cac: f7ff ff7c bl 8024ba8 <__multadd>
  7040. 8024cb0: 42bc cmp r4, r7
  7041. 8024cb2: 4601 mov r1, r0
  7042. 8024cb4: d1f5 bne.n 8024ca2 <__s2b+0x72>
  7043. 8024cb6: 4608 mov r0, r1
  7044. 8024cb8: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc}
  7045. 8024cbc: 340a adds r4, #10
  7046. 8024cbe: f04f 0809 mov.w r8, #9
  7047. 8024cc2: e7e9 b.n 8024c98 <__s2b+0x68>
  7048. 8024cc4: 2100 movs r1, #0
  7049. 8024cc6: e7cb b.n 8024c60 <__s2b+0x30>
  7050. 08024cc8 <__hi0bits>:
  7051. 8024cc8: 4603 mov r3, r0
  7052. 8024cca: 2000 movs r0, #0
  7053. 8024ccc: 0c1a lsrs r2, r3, #16
  7054. 8024cce: d101 bne.n 8024cd4 <__hi0bits+0xc>
  7055. 8024cd0: 041b lsls r3, r3, #16
  7056. 8024cd2: 2010 movs r0, #16
  7057. 8024cd4: f013 4f7f tst.w r3, #4278190080 ; 0xff000000
  7058. 8024cd8: d101 bne.n 8024cde <__hi0bits+0x16>
  7059. 8024cda: 3008 adds r0, #8
  7060. 8024cdc: 021b lsls r3, r3, #8
  7061. 8024cde: f013 4f70 tst.w r3, #4026531840 ; 0xf0000000
  7062. 8024ce2: d101 bne.n 8024ce8 <__hi0bits+0x20>
  7063. 8024ce4: 3004 adds r0, #4
  7064. 8024ce6: 011b lsls r3, r3, #4
  7065. 8024ce8: f013 4f40 tst.w r3, #3221225472 ; 0xc0000000
  7066. 8024cec: d101 bne.n 8024cf2 <__hi0bits+0x2a>
  7067. 8024cee: 3002 adds r0, #2
  7068. 8024cf0: 009b lsls r3, r3, #2
  7069. 8024cf2: 2b00 cmp r3, #0
  7070. 8024cf4: db02 blt.n 8024cfc <__hi0bits+0x34>
  7071. 8024cf6: 005b lsls r3, r3, #1
  7072. 8024cf8: d401 bmi.n 8024cfe <__hi0bits+0x36>
  7073. 8024cfa: 2020 movs r0, #32
  7074. 8024cfc: 4770 bx lr
  7075. 8024cfe: 3001 adds r0, #1
  7076. 8024d00: 4770 bx lr
  7077. 8024d02: bf00 nop
  7078. 08024d04 <__lo0bits>:
  7079. 8024d04: 6803 ldr r3, [r0, #0]
  7080. 8024d06: 4602 mov r2, r0
  7081. 8024d08: f013 0007 ands.w r0, r3, #7
  7082. 8024d0c: d007 beq.n 8024d1e <__lo0bits+0x1a>
  7083. 8024d0e: 07d9 lsls r1, r3, #31
  7084. 8024d10: d41f bmi.n 8024d52 <__lo0bits+0x4e>
  7085. 8024d12: 0798 lsls r0, r3, #30
  7086. 8024d14: d41f bmi.n 8024d56 <__lo0bits+0x52>
  7087. 8024d16: 089b lsrs r3, r3, #2
  7088. 8024d18: 2002 movs r0, #2
  7089. 8024d1a: 6013 str r3, [r2, #0]
  7090. 8024d1c: 4770 bx lr
  7091. 8024d1e: b299 uxth r1, r3
  7092. 8024d20: b909 cbnz r1, 8024d26 <__lo0bits+0x22>
  7093. 8024d22: 0c1b lsrs r3, r3, #16
  7094. 8024d24: 2010 movs r0, #16
  7095. 8024d26: f013 0fff tst.w r3, #255 ; 0xff
  7096. 8024d2a: d101 bne.n 8024d30 <__lo0bits+0x2c>
  7097. 8024d2c: 3008 adds r0, #8
  7098. 8024d2e: 0a1b lsrs r3, r3, #8
  7099. 8024d30: 0719 lsls r1, r3, #28
  7100. 8024d32: d101 bne.n 8024d38 <__lo0bits+0x34>
  7101. 8024d34: 3004 adds r0, #4
  7102. 8024d36: 091b lsrs r3, r3, #4
  7103. 8024d38: 0799 lsls r1, r3, #30
  7104. 8024d3a: d101 bne.n 8024d40 <__lo0bits+0x3c>
  7105. 8024d3c: 3002 adds r0, #2
  7106. 8024d3e: 089b lsrs r3, r3, #2
  7107. 8024d40: 07d9 lsls r1, r3, #31
  7108. 8024d42: d404 bmi.n 8024d4e <__lo0bits+0x4a>
  7109. 8024d44: 085b lsrs r3, r3, #1
  7110. 8024d46: d101 bne.n 8024d4c <__lo0bits+0x48>
  7111. 8024d48: 2020 movs r0, #32
  7112. 8024d4a: 4770 bx lr
  7113. 8024d4c: 3001 adds r0, #1
  7114. 8024d4e: 6013 str r3, [r2, #0]
  7115. 8024d50: 4770 bx lr
  7116. 8024d52: 2000 movs r0, #0
  7117. 8024d54: 4770 bx lr
  7118. 8024d56: 085b lsrs r3, r3, #1
  7119. 8024d58: 2001 movs r0, #1
  7120. 8024d5a: 6013 str r3, [r2, #0]
  7121. 8024d5c: 4770 bx lr
  7122. 8024d5e: bf00 nop
  7123. 08024d60 <__i2b>:
  7124. 8024d60: b510 push {r4, lr}
  7125. 8024d62: 460c mov r4, r1
  7126. 8024d64: 2101 movs r1, #1
  7127. 8024d66: f7ff fecd bl 8024b04 <_Balloc>
  7128. 8024d6a: 2201 movs r2, #1
  7129. 8024d6c: 6144 str r4, [r0, #20]
  7130. 8024d6e: 6102 str r2, [r0, #16]
  7131. 8024d70: bd10 pop {r4, pc}
  7132. 8024d72: bf00 nop
  7133. 08024d74 <__multiply>:
  7134. 8024d74: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  7135. 8024d78: 460c mov r4, r1
  7136. 8024d7a: 690e ldr r6, [r1, #16]
  7137. 8024d7c: b085 sub sp, #20
  7138. 8024d7e: 6915 ldr r5, [r2, #16]
  7139. 8024d80: 4617 mov r7, r2
  7140. 8024d82: 42ae cmp r6, r5
  7141. 8024d84: da04 bge.n 8024d90 <__multiply+0x1c>
  7142. 8024d86: 4632 mov r2, r6
  7143. 8024d88: 463c mov r4, r7
  7144. 8024d8a: 462e mov r6, r5
  7145. 8024d8c: 460f mov r7, r1
  7146. 8024d8e: 4615 mov r5, r2
  7147. 8024d90: 68a3 ldr r3, [r4, #8]
  7148. 8024d92: eb06 0805 add.w r8, r6, r5
  7149. 8024d96: 6861 ldr r1, [r4, #4]
  7150. 8024d98: 4598 cmp r8, r3
  7151. 8024d9a: bfc8 it gt
  7152. 8024d9c: 3101 addgt r1, #1
  7153. 8024d9e: f7ff feb1 bl 8024b04 <_Balloc>
  7154. 8024da2: eb00 0988 add.w r9, r0, r8, lsl #2
  7155. 8024da6: f100 0314 add.w r3, r0, #20
  7156. 8024daa: f109 0914 add.w r9, r9, #20
  7157. 8024dae: 9001 str r0, [sp, #4]
  7158. 8024db0: 2000 movs r0, #0
  7159. 8024db2: 454b cmp r3, r9
  7160. 8024db4: d203 bcs.n 8024dbe <__multiply+0x4a>
  7161. 8024db6: f843 0b04 str.w r0, [r3], #4
  7162. 8024dba: 4599 cmp r9, r3
  7163. 8024dbc: d8fb bhi.n 8024db6 <__multiply+0x42>
  7164. 8024dbe: eb07 0585 add.w r5, r7, r5, lsl #2
  7165. 8024dc2: eb04 0686 add.w r6, r4, r6, lsl #2
  7166. 8024dc6: 3714 adds r7, #20
  7167. 8024dc8: 3514 adds r5, #20
  7168. 8024dca: 3414 adds r4, #20
  7169. 8024dcc: 3614 adds r6, #20
  7170. 8024dce: 42af cmp r7, r5
  7171. 8024dd0: d257 bcs.n 8024e82 <__multiply+0x10e>
  7172. 8024dd2: 9a01 ldr r2, [sp, #4]
  7173. 8024dd4: f8cd 9008 str.w r9, [sp, #8]
  7174. 8024dd8: 46a9 mov r9, r5
  7175. 8024dda: f8cd 800c str.w r8, [sp, #12]
  7176. 8024dde: f102 0c18 add.w ip, r2, #24
  7177. 8024de2: 46a0 mov r8, r4
  7178. 8024de4: f857 4b04 ldr.w r4, [r7], #4
  7179. 8024de8: b2a0 uxth r0, r4
  7180. 8024dea: b1f0 cbz r0, 8024e2a <__multiply+0xb6>
  7181. 8024dec: 4642 mov r2, r8
  7182. 8024dee: f1ac 0304 sub.w r3, ip, #4
  7183. 8024df2: 2400 movs r4, #0
  7184. 8024df4: f852 1b04 ldr.w r1, [r2], #4
  7185. 8024df8: 681d ldr r5, [r3, #0]
  7186. 8024dfa: fa1f fa81 uxth.w sl, r1
  7187. 8024dfe: 0c09 lsrs r1, r1, #16
  7188. 8024e00: fa1f fb85 uxth.w fp, r5
  7189. 8024e04: 0c2d lsrs r5, r5, #16
  7190. 8024e06: fb00 ba0a mla sl, r0, sl, fp
  7191. 8024e0a: fb00 5101 mla r1, r0, r1, r5
  7192. 8024e0e: 4454 add r4, sl
  7193. 8024e10: eb01 4114 add.w r1, r1, r4, lsr #16
  7194. 8024e14: b2a4 uxth r4, r4
  7195. 8024e16: ea44 4501 orr.w r5, r4, r1, lsl #16
  7196. 8024e1a: 0c0c lsrs r4, r1, #16
  7197. 8024e1c: 4296 cmp r6, r2
  7198. 8024e1e: f843 5b04 str.w r5, [r3], #4
  7199. 8024e22: d8e7 bhi.n 8024df4 <__multiply+0x80>
  7200. 8024e24: 601c str r4, [r3, #0]
  7201. 8024e26: f857 4c04 ldr.w r4, [r7, #-4]
  7202. 8024e2a: 0c24 lsrs r4, r4, #16
  7203. 8024e2c: d021 beq.n 8024e72 <__multiply+0xfe>
  7204. 8024e2e: f85c 1c04 ldr.w r1, [ip, #-4]
  7205. 8024e32: 4642 mov r2, r8
  7206. 8024e34: 4663 mov r3, ip
  7207. 8024e36: 2500 movs r5, #0
  7208. 8024e38: 4608 mov r0, r1
  7209. 8024e3a: f8b2 a000 ldrh.w sl, [r2]
  7210. 8024e3e: 0c00 lsrs r0, r0, #16
  7211. 8024e40: b289 uxth r1, r1
  7212. 8024e42: 469b mov fp, r3
  7213. 8024e44: fb04 000a mla r0, r4, sl, r0
  7214. 8024e48: 1945 adds r5, r0, r5
  7215. 8024e4a: ea41 4105 orr.w r1, r1, r5, lsl #16
  7216. 8024e4e: f843 1c04 str.w r1, [r3, #-4]
  7217. 8024e52: f853 0b04 ldr.w r0, [r3], #4
  7218. 8024e56: f852 1b04 ldr.w r1, [r2], #4
  7219. 8024e5a: fa1f fa80 uxth.w sl, r0
  7220. 8024e5e: 0c09 lsrs r1, r1, #16
  7221. 8024e60: fb04 a101 mla r1, r4, r1, sl
  7222. 8024e64: eb01 4115 add.w r1, r1, r5, lsr #16
  7223. 8024e68: 0c0d lsrs r5, r1, #16
  7224. 8024e6a: 4296 cmp r6, r2
  7225. 8024e6c: d8e5 bhi.n 8024e3a <__multiply+0xc6>
  7226. 8024e6e: f8cb 1000 str.w r1, [fp]
  7227. 8024e72: 45b9 cmp r9, r7
  7228. 8024e74: f10c 0c04 add.w ip, ip, #4
  7229. 8024e78: d8b4 bhi.n 8024de4 <__multiply+0x70>
  7230. 8024e7a: f8dd 9008 ldr.w r9, [sp, #8]
  7231. 8024e7e: f8dd 800c ldr.w r8, [sp, #12]
  7232. 8024e82: f1b8 0f00 cmp.w r8, #0
  7233. 8024e86: dd0b ble.n 8024ea0 <__multiply+0x12c>
  7234. 8024e88: f859 3c04 ldr.w r3, [r9, #-4]
  7235. 8024e8c: f1a9 0904 sub.w r9, r9, #4
  7236. 8024e90: b11b cbz r3, 8024e9a <__multiply+0x126>
  7237. 8024e92: e005 b.n 8024ea0 <__multiply+0x12c>
  7238. 8024e94: f859 3d04 ldr.w r3, [r9, #-4]!
  7239. 8024e98: b913 cbnz r3, 8024ea0 <__multiply+0x12c>
  7240. 8024e9a: f1b8 0801 subs.w r8, r8, #1
  7241. 8024e9e: d1f9 bne.n 8024e94 <__multiply+0x120>
  7242. 8024ea0: 9b01 ldr r3, [sp, #4]
  7243. 8024ea2: 4618 mov r0, r3
  7244. 8024ea4: f8c3 8010 str.w r8, [r3, #16]
  7245. 8024ea8: b005 add sp, #20
  7246. 8024eaa: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  7247. 8024eae: bf00 nop
  7248. 08024eb0 <__pow5mult>:
  7249. 8024eb0: f012 0303 ands.w r3, r2, #3
  7250. 8024eb4: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  7251. 8024eb8: 4614 mov r4, r2
  7252. 8024eba: 4680 mov r8, r0
  7253. 8024ebc: 460f mov r7, r1
  7254. 8024ebe: d128 bne.n 8024f12 <__pow5mult+0x62>
  7255. 8024ec0: 10a4 asrs r4, r4, #2
  7256. 8024ec2: d01a beq.n 8024efa <__pow5mult+0x4a>
  7257. 8024ec4: f8d8 5024 ldr.w r5, [r8, #36] ; 0x24
  7258. 8024ec8: 2d00 cmp r5, #0
  7259. 8024eca: d02e beq.n 8024f2a <__pow5mult+0x7a>
  7260. 8024ecc: 68ae ldr r6, [r5, #8]
  7261. 8024ece: b92e cbnz r6, 8024edc <__pow5mult+0x2c>
  7262. 8024ed0: e036 b.n 8024f40 <__pow5mult+0x90>
  7263. 8024ed2: 1064 asrs r4, r4, #1
  7264. 8024ed4: d011 beq.n 8024efa <__pow5mult+0x4a>
  7265. 8024ed6: 6835 ldr r5, [r6, #0]
  7266. 8024ed8: b195 cbz r5, 8024f00 <__pow5mult+0x50>
  7267. 8024eda: 462e mov r6, r5
  7268. 8024edc: 07e0 lsls r0, r4, #31
  7269. 8024ede: d5f8 bpl.n 8024ed2 <__pow5mult+0x22>
  7270. 8024ee0: 4639 mov r1, r7
  7271. 8024ee2: 4632 mov r2, r6
  7272. 8024ee4: 4640 mov r0, r8
  7273. 8024ee6: f7ff ff45 bl 8024d74 <__multiply>
  7274. 8024eea: 4639 mov r1, r7
  7275. 8024eec: 4605 mov r5, r0
  7276. 8024eee: 4640 mov r0, r8
  7277. 8024ef0: f7ff fe3e bl 8024b70 <_Bfree>
  7278. 8024ef4: 1064 asrs r4, r4, #1
  7279. 8024ef6: 462f mov r7, r5
  7280. 8024ef8: d1ed bne.n 8024ed6 <__pow5mult+0x26>
  7281. 8024efa: 4638 mov r0, r7
  7282. 8024efc: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  7283. 8024f00: 4631 mov r1, r6
  7284. 8024f02: 4632 mov r2, r6
  7285. 8024f04: 4640 mov r0, r8
  7286. 8024f06: f7ff ff35 bl 8024d74 <__multiply>
  7287. 8024f0a: 6030 str r0, [r6, #0]
  7288. 8024f0c: 4606 mov r6, r0
  7289. 8024f0e: 6005 str r5, [r0, #0]
  7290. 8024f10: e7e4 b.n 8024edc <__pow5mult+0x2c>
  7291. 8024f12: f648 62d8 movw r2, #36568 ; 0x8ed8
  7292. 8024f16: 1e5d subs r5, r3, #1
  7293. 8024f18: f6c0 0203 movt r2, #2051 ; 0x803
  7294. 8024f1c: 2300 movs r3, #0
  7295. 8024f1e: f852 2025 ldr.w r2, [r2, r5, lsl #2]
  7296. 8024f22: f7ff fe41 bl 8024ba8 <__multadd>
  7297. 8024f26: 4607 mov r7, r0
  7298. 8024f28: e7ca b.n 8024ec0 <__pow5mult+0x10>
  7299. 8024f2a: 2010 movs r0, #16
  7300. 8024f2c: f7ff fac0 bl 80244b0 <malloc>
  7301. 8024f30: 2300 movs r3, #0
  7302. 8024f32: 4605 mov r5, r0
  7303. 8024f34: f8c8 0024 str.w r0, [r8, #36] ; 0x24
  7304. 8024f38: 6043 str r3, [r0, #4]
  7305. 8024f3a: 6083 str r3, [r0, #8]
  7306. 8024f3c: 6003 str r3, [r0, #0]
  7307. 8024f3e: 60c3 str r3, [r0, #12]
  7308. 8024f40: 4640 mov r0, r8
  7309. 8024f42: f240 2171 movw r1, #625 ; 0x271
  7310. 8024f46: f7ff ff0b bl 8024d60 <__i2b>
  7311. 8024f4a: 2300 movs r3, #0
  7312. 8024f4c: 60a8 str r0, [r5, #8]
  7313. 8024f4e: 4606 mov r6, r0
  7314. 8024f50: 6003 str r3, [r0, #0]
  7315. 8024f52: e7c3 b.n 8024edc <__pow5mult+0x2c>
  7316. 08024f54 <__lshift>:
  7317. 8024f54: e92d 4ff8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, lr}
  7318. 8024f58: 4693 mov fp, r2
  7319. 8024f5a: 690a ldr r2, [r1, #16]
  7320. 8024f5c: 460f mov r7, r1
  7321. 8024f5e: ea4f 156b mov.w r5, fp, asr #5
  7322. 8024f62: 688b ldr r3, [r1, #8]
  7323. 8024f64: eb05 0a02 add.w sl, r5, r2
  7324. 8024f68: 4681 mov r9, r0
  7325. 8024f6a: f10a 0601 add.w r6, sl, #1
  7326. 8024f6e: 6849 ldr r1, [r1, #4]
  7327. 8024f70: 429e cmp r6, r3
  7328. 8024f72: dd03 ble.n 8024f7c <__lshift+0x28>
  7329. 8024f74: 005b lsls r3, r3, #1
  7330. 8024f76: 3101 adds r1, #1
  7331. 8024f78: 429e cmp r6, r3
  7332. 8024f7a: dcfb bgt.n 8024f74 <__lshift+0x20>
  7333. 8024f7c: 4648 mov r0, r9
  7334. 8024f7e: f7ff fdc1 bl 8024b04 <_Balloc>
  7335. 8024f82: 2d00 cmp r5, #0
  7336. 8024f84: 4680 mov r8, r0
  7337. 8024f86: f100 0414 add.w r4, r0, #20
  7338. 8024f8a: dd0a ble.n 8024fa2 <__lshift+0x4e>
  7339. 8024f8c: 2300 movs r3, #0
  7340. 8024f8e: 461a mov r2, r3
  7341. 8024f90: 3301 adds r3, #1
  7342. 8024f92: f844 2b04 str.w r2, [r4], #4
  7343. 8024f96: 42ab cmp r3, r5
  7344. 8024f98: d1fa bne.n 8024f90 <__lshift+0x3c>
  7345. 8024f9a: eb08 0383 add.w r3, r8, r3, lsl #2
  7346. 8024f9e: f103 0414 add.w r4, r3, #20
  7347. 8024fa2: 6938 ldr r0, [r7, #16]
  7348. 8024fa4: f107 0514 add.w r5, r7, #20
  7349. 8024fa8: eb07 0080 add.w r0, r7, r0, lsl #2
  7350. 8024fac: 3014 adds r0, #20
  7351. 8024fae: f01b 0b1f ands.w fp, fp, #31
  7352. 8024fb2: d01c beq.n 8024fee <__lshift+0x9a>
  7353. 8024fb4: f1cb 0320 rsb r3, fp, #32
  7354. 8024fb8: 2200 movs r2, #0
  7355. 8024fba: 6829 ldr r1, [r5, #0]
  7356. 8024fbc: fa01 f10b lsl.w r1, r1, fp
  7357. 8024fc0: 430a orrs r2, r1
  7358. 8024fc2: f844 2b04 str.w r2, [r4], #4
  7359. 8024fc6: f855 2b04 ldr.w r2, [r5], #4
  7360. 8024fca: 42a8 cmp r0, r5
  7361. 8024fcc: fa22 f203 lsr.w r2, r2, r3
  7362. 8024fd0: d8f3 bhi.n 8024fba <__lshift+0x66>
  7363. 8024fd2: 6022 str r2, [r4, #0]
  7364. 8024fd4: b10a cbz r2, 8024fda <__lshift+0x86>
  7365. 8024fd6: f10a 0602 add.w r6, sl, #2
  7366. 8024fda: 4648 mov r0, r9
  7367. 8024fdc: 3e01 subs r6, #1
  7368. 8024fde: 4639 mov r1, r7
  7369. 8024fe0: f8c8 6010 str.w r6, [r8, #16]
  7370. 8024fe4: f7ff fdc4 bl 8024b70 <_Bfree>
  7371. 8024fe8: 4640 mov r0, r8
  7372. 8024fea: e8bd 8ff8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc}
  7373. 8024fee: f855 3b04 ldr.w r3, [r5], #4
  7374. 8024ff2: 42a8 cmp r0, r5
  7375. 8024ff4: f844 3b04 str.w r3, [r4], #4
  7376. 8024ff8: d9ef bls.n 8024fda <__lshift+0x86>
  7377. 8024ffa: f855 3b04 ldr.w r3, [r5], #4
  7378. 8024ffe: 42a8 cmp r0, r5
  7379. 8025000: f844 3b04 str.w r3, [r4], #4
  7380. 8025004: d8f3 bhi.n 8024fee <__lshift+0x9a>
  7381. 8025006: e7e8 b.n 8024fda <__lshift+0x86>
  7382. 08025008 <__mcmp>:
  7383. 8025008: 4603 mov r3, r0
  7384. 802500a: 690a ldr r2, [r1, #16]
  7385. 802500c: 6900 ldr r0, [r0, #16]
  7386. 802500e: b430 push {r4, r5}
  7387. 8025010: 1a80 subs r0, r0, r2
  7388. 8025012: d10f bne.n 8025034 <__mcmp+0x2c>
  7389. 8025014: 3204 adds r2, #4
  7390. 8025016: f103 0514 add.w r5, r3, #20
  7391. 802501a: 0092 lsls r2, r2, #2
  7392. 802501c: 189b adds r3, r3, r2
  7393. 802501e: 1889 adds r1, r1, r2
  7394. 8025020: 3304 adds r3, #4
  7395. 8025022: 3104 adds r1, #4
  7396. 8025024: f853 2d04 ldr.w r2, [r3, #-4]!
  7397. 8025028: f851 4d04 ldr.w r4, [r1, #-4]!
  7398. 802502c: 42a2 cmp r2, r4
  7399. 802502e: d103 bne.n 8025038 <__mcmp+0x30>
  7400. 8025030: 429d cmp r5, r3
  7401. 8025032: d3f7 bcc.n 8025024 <__mcmp+0x1c>
  7402. 8025034: bc30 pop {r4, r5}
  7403. 8025036: 4770 bx lr
  7404. 8025038: 4294 cmp r4, r2
  7405. 802503a: bf94 ite ls
  7406. 802503c: 2001 movls r0, #1
  7407. 802503e: f04f 30ff movhi.w r0, #4294967295
  7408. 8025042: e7f7 b.n 8025034 <__mcmp+0x2c>
  7409. 08025044 <__mdiff>:
  7410. 8025044: e92d 4ff8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, lr}
  7411. 8025048: 468b mov fp, r1
  7412. 802504a: 4604 mov r4, r0
  7413. 802504c: 4611 mov r1, r2
  7414. 802504e: 4658 mov r0, fp
  7415. 8025050: 4691 mov r9, r2
  7416. 8025052: f7ff ffd9 bl 8025008 <__mcmp>
  7417. 8025056: 1e05 subs r5, r0, #0
  7418. 8025058: d061 beq.n 802511e <__mdiff+0xda>
  7419. 802505a: bfbc itt lt
  7420. 802505c: 465b movlt r3, fp
  7421. 802505e: 46cb movlt fp, r9
  7422. 8025060: 4620 mov r0, r4
  7423. 8025062: bfb8 it lt
  7424. 8025064: 4699 movlt r9, r3
  7425. 8025066: f8db 1004 ldr.w r1, [fp, #4]
  7426. 802506a: bfac ite ge
  7427. 802506c: f04f 0800 movge.w r8, #0
  7428. 8025070: f04f 0801 movlt.w r8, #1
  7429. 8025074: f7ff fd46 bl 8024b04 <_Balloc>
  7430. 8025078: f8db 7010 ldr.w r7, [fp, #16]
  7431. 802507c: f109 0514 add.w r5, r9, #20
  7432. 8025080: f8d9 3010 ldr.w r3, [r9, #16]
  7433. 8025084: f10b 0614 add.w r6, fp, #20
  7434. 8025088: 2400 movs r4, #0
  7435. 802508a: eb0b 0c87 add.w ip, fp, r7, lsl #2
  7436. 802508e: eb09 0983 add.w r9, r9, r3, lsl #2
  7437. 8025092: f10c 0c14 add.w ip, ip, #20
  7438. 8025096: f109 0914 add.w r9, r9, #20
  7439. 802509a: f100 0a14 add.w sl, r0, #20
  7440. 802509e: f8c0 800c str.w r8, [r0, #12]
  7441. 80250a2: f856 8b04 ldr.w r8, [r6], #4
  7442. 80250a6: 4653 mov r3, sl
  7443. 80250a8: f855 ab04 ldr.w sl, [r5], #4
  7444. 80250ac: 4632 mov r2, r6
  7445. 80250ae: fa1f f188 uxth.w r1, r8
  7446. 80250b2: 1909 adds r1, r1, r4
  7447. 80250b4: fa1f fb8a uxth.w fp, sl
  7448. 80250b8: ebcb 0101 rsb r1, fp, r1
  7449. 80250bc: ea4f 441a mov.w r4, sl, lsr #16
  7450. 80250c0: ebc4 4418 rsb r4, r4, r8, lsr #16
  7451. 80250c4: eb04 4421 add.w r4, r4, r1, asr #16
  7452. 80250c8: b289 uxth r1, r1
  7453. 80250ca: ea41 4104 orr.w r1, r1, r4, lsl #16
  7454. 80250ce: 1424 asrs r4, r4, #16
  7455. 80250d0: 45a9 cmp r9, r5
  7456. 80250d2: f843 1b04 str.w r1, [r3], #4
  7457. 80250d6: 469a mov sl, r3
  7458. 80250d8: d8e3 bhi.n 80250a2 <__mdiff+0x5e>
  7459. 80250da: 45b4 cmp ip, r6
  7460. 80250dc: 4698 mov r8, r3
  7461. 80250de: d914 bls.n 802510a <__mdiff+0xc6>
  7462. 80250e0: f852 5b04 ldr.w r5, [r2], #4
  7463. 80250e4: b2a9 uxth r1, r5
  7464. 80250e6: 0c2d lsrs r5, r5, #16
  7465. 80250e8: 190c adds r4, r1, r4
  7466. 80250ea: eb05 4524 add.w r5, r5, r4, asr #16
  7467. 80250ee: b2a4 uxth r4, r4
  7468. 80250f0: ea44 4105 orr.w r1, r4, r5, lsl #16
  7469. 80250f4: 142c asrs r4, r5, #16
  7470. 80250f6: 4594 cmp ip, r2
  7471. 80250f8: f843 1b04 str.w r1, [r3], #4
  7472. 80250fc: d8f0 bhi.n 80250e0 <__mdiff+0x9c>
  7473. 80250fe: 43f3 mvns r3, r6
  7474. 8025100: 4463 add r3, ip
  7475. 8025102: f023 0303 bic.w r3, r3, #3
  7476. 8025106: 3304 adds r3, #4
  7477. 8025108: 4443 add r3, r8
  7478. 802510a: 3b04 subs r3, #4
  7479. 802510c: b921 cbnz r1, 8025118 <__mdiff+0xd4>
  7480. 802510e: f853 2d04 ldr.w r2, [r3, #-4]!
  7481. 8025112: 3f01 subs r7, #1
  7482. 8025114: 2a00 cmp r2, #0
  7483. 8025116: d0fa beq.n 802510e <__mdiff+0xca>
  7484. 8025118: 6107 str r7, [r0, #16]
  7485. 802511a: e8bd 8ff8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc}
  7486. 802511e: 4620 mov r0, r4
  7487. 8025120: 4629 mov r1, r5
  7488. 8025122: f7ff fcef bl 8024b04 <_Balloc>
  7489. 8025126: 2301 movs r3, #1
  7490. 8025128: 6145 str r5, [r0, #20]
  7491. 802512a: 6103 str r3, [r0, #16]
  7492. 802512c: e8bd 8ff8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc}
  7493. 08025130 <__ulp>:
  7494. 8025130: 2300 movs r3, #0
  7495. 8025132: f6c7 73f0 movt r3, #32752 ; 0x7ff0
  7496. 8025136: 400b ands r3, r1
  7497. 8025138: f1a3 7350 sub.w r3, r3, #54525952 ; 0x3400000
  7498. 802513c: 2b00 cmp r3, #0
  7499. 802513e: dd02 ble.n 8025146 <__ulp+0x16>
  7500. 8025140: 4619 mov r1, r3
  7501. 8025142: 2000 movs r0, #0
  7502. 8025144: 4770 bx lr
  7503. 8025146: 425b negs r3, r3
  7504. 8025148: 2100 movs r1, #0
  7505. 802514a: 151b asrs r3, r3, #20
  7506. 802514c: 2b13 cmp r3, #19
  7507. 802514e: dd0b ble.n 8025168 <__ulp+0x38>
  7508. 8025150: 2b32 cmp r3, #50 ; 0x32
  7509. 8025152: dd02 ble.n 802515a <__ulp+0x2a>
  7510. 8025154: 2301 movs r3, #1
  7511. 8025156: 4618 mov r0, r3
  7512. 8025158: 4770 bx lr
  7513. 802515a: 2201 movs r2, #1
  7514. 802515c: f1c3 0333 rsb r3, r3, #51 ; 0x33
  7515. 8025160: fa02 f303 lsl.w r3, r2, r3
  7516. 8025164: 4618 mov r0, r3
  7517. 8025166: 4770 bx lr
  7518. 8025168: f44f 2200 mov.w r2, #524288 ; 0x80000
  7519. 802516c: 2000 movs r0, #0
  7520. 802516e: fa42 f103 asr.w r1, r2, r3
  7521. 8025172: 4770 bx lr
  7522. 08025174 <__b2d>:
  7523. 8025174: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr}
  7524. 8025178: f100 0814 add.w r8, r0, #20
  7525. 802517c: 6906 ldr r6, [r0, #16]
  7526. 802517e: 4689 mov r9, r1
  7527. 8025180: 3604 adds r6, #4
  7528. 8025182: eb00 0686 add.w r6, r0, r6, lsl #2
  7529. 8025186: 4634 mov r4, r6
  7530. 8025188: 4637 mov r7, r6
  7531. 802518a: f854 5b04 ldr.w r5, [r4], #4
  7532. 802518e: 4628 mov r0, r5
  7533. 8025190: f7ff fd9a bl 8024cc8 <__hi0bits>
  7534. 8025194: 280a cmp r0, #10
  7535. 8025196: f1c0 0320 rsb r3, r0, #32
  7536. 802519a: f8c9 3000 str.w r3, [r9]
  7537. 802519e: dc18 bgt.n 80251d2 <__b2d+0x5e>
  7538. 80251a0: 45b0 cmp r8, r6
  7539. 80251a2: f1c0 010b rsb r1, r0, #11
  7540. 80251a6: fa25 f701 lsr.w r7, r5, r1
  7541. 80251aa: bf38 it cc
  7542. 80251ac: f854 4c08 ldrcc.w r4, [r4, #-8]
  7543. 80251b0: f047 577f orr.w r7, r7, #1069547520 ; 0x3fc00000
  7544. 80251b4: f447 1340 orr.w r3, r7, #3145728 ; 0x300000
  7545. 80251b8: bf34 ite cc
  7546. 80251ba: fa24 f101 lsrcc.w r1, r4, r1
  7547. 80251be: 2100 movcs r1, #0
  7548. 80251c0: 3015 adds r0, #21
  7549. 80251c2: fa05 f500 lsl.w r5, r5, r0
  7550. 80251c6: ea41 0205 orr.w r2, r1, r5
  7551. 80251ca: 4610 mov r0, r2
  7552. 80251cc: 4619 mov r1, r3
  7553. 80251ce: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc}
  7554. 80251d2: 2100 movs r1, #0
  7555. 80251d4: 45b0 cmp r8, r6
  7556. 80251d6: d202 bcs.n 80251de <__b2d+0x6a>
  7557. 80251d8: f854 1c08 ldr.w r1, [r4, #-8]
  7558. 80251dc: 1f37 subs r7, r6, #4
  7559. 80251de: f1b0 040b subs.w r4, r0, #11
  7560. 80251e2: d018 beq.n 8025216 <__b2d+0xa2>
  7561. 80251e4: fa05 f504 lsl.w r5, r5, r4
  7562. 80251e8: f1c0 002b rsb r0, r0, #43 ; 0x2b
  7563. 80251ec: 4547 cmp r7, r8
  7564. 80251ee: f045 557f orr.w r5, r5, #1069547520 ; 0x3fc00000
  7565. 80251f2: fa21 f600 lsr.w r6, r1, r0
  7566. 80251f6: f445 1540 orr.w r5, r5, #3145728 ; 0x300000
  7567. 80251fa: ea45 0306 orr.w r3, r5, r6
  7568. 80251fe: bf88 it hi
  7569. 8025200: f857 5c04 ldrhi.w r5, [r7, #-4]
  7570. 8025204: fa01 f104 lsl.w r1, r1, r4
  7571. 8025208: bf8c ite hi
  7572. 802520a: fa25 f000 lsrhi.w r0, r5, r0
  7573. 802520e: 2000 movls r0, #0
  7574. 8025210: ea40 0201 orr.w r2, r0, r1
  7575. 8025214: e7d9 b.n 80251ca <__b2d+0x56>
  7576. 8025216: f045 557f orr.w r5, r5, #1069547520 ; 0x3fc00000
  7577. 802521a: 460a mov r2, r1
  7578. 802521c: f445 1340 orr.w r3, r5, #3145728 ; 0x300000
  7579. 8025220: e7d3 b.n 80251ca <__b2d+0x56>
  7580. 8025222: bf00 nop
  7581. 08025224 <__d2b>:
  7582. 8025224: e92d 43f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, lr}
  7583. 8025228: b083 sub sp, #12
  7584. 802522a: 2101 movs r1, #1
  7585. 802522c: 461d mov r5, r3
  7586. 802522e: 4614 mov r4, r2
  7587. 8025230: 9f0a ldr r7, [sp, #40] ; 0x28
  7588. 8025232: f7ff fc67 bl 8024b04 <_Balloc>
  7589. 8025236: f3c5 560a ubfx r6, r5, #20, #11
  7590. 802523a: f025 437f bic.w r3, r5, #4278190080 ; 0xff000000
  7591. 802523e: 46a9 mov r9, r5
  7592. 8025240: f423 0370 bic.w r3, r3, #15728640 ; 0xf00000
  7593. 8025244: 4680 mov r8, r0
  7594. 8025246: b10e cbz r6, 802524c <__d2b+0x28>
  7595. 8025248: f443 1380 orr.w r3, r3, #1048576 ; 0x100000
  7596. 802524c: 9301 str r3, [sp, #4]
  7597. 802524e: 2c00 cmp r4, #0
  7598. 8025250: d024 beq.n 802529c <__d2b+0x78>
  7599. 8025252: a802 add r0, sp, #8
  7600. 8025254: f840 4d08 str.w r4, [r0, #-8]!
  7601. 8025258: 4668 mov r0, sp
  7602. 802525a: f7ff fd53 bl 8024d04 <__lo0bits>
  7603. 802525e: 9b01 ldr r3, [sp, #4]
  7604. 8025260: 2800 cmp r0, #0
  7605. 8025262: d131 bne.n 80252c8 <__d2b+0xa4>
  7606. 8025264: 9a00 ldr r2, [sp, #0]
  7607. 8025266: f8c8 2014 str.w r2, [r8, #20]
  7608. 802526a: 2b00 cmp r3, #0
  7609. 802526c: bf0c ite eq
  7610. 802526e: 2401 moveq r4, #1
  7611. 8025270: 2402 movne r4, #2
  7612. 8025272: f8c8 3018 str.w r3, [r8, #24]
  7613. 8025276: f8c8 4010 str.w r4, [r8, #16]
  7614. 802527a: b9e6 cbnz r6, 80252b6 <__d2b+0x92>
  7615. 802527c: eb08 0384 add.w r3, r8, r4, lsl #2
  7616. 8025280: f2a0 4032 subw r0, r0, #1074 ; 0x432
  7617. 8025284: 6038 str r0, [r7, #0]
  7618. 8025286: 6918 ldr r0, [r3, #16]
  7619. 8025288: f7ff fd1e bl 8024cc8 <__hi0bits>
  7620. 802528c: 9b0b ldr r3, [sp, #44] ; 0x2c
  7621. 802528e: ebc0 1044 rsb r0, r0, r4, lsl #5
  7622. 8025292: 6018 str r0, [r3, #0]
  7623. 8025294: 4640 mov r0, r8
  7624. 8025296: b003 add sp, #12
  7625. 8025298: e8bd 83f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, pc}
  7626. 802529c: a801 add r0, sp, #4
  7627. 802529e: f7ff fd31 bl 8024d04 <__lo0bits>
  7628. 80252a2: 2301 movs r3, #1
  7629. 80252a4: 461c mov r4, r3
  7630. 80252a6: f8c8 3010 str.w r3, [r8, #16]
  7631. 80252aa: 9b01 ldr r3, [sp, #4]
  7632. 80252ac: f8c8 3014 str.w r3, [r8, #20]
  7633. 80252b0: 3020 adds r0, #32
  7634. 80252b2: 2e00 cmp r6, #0
  7635. 80252b4: d0e2 beq.n 802527c <__d2b+0x58>
  7636. 80252b6: 9a0b ldr r2, [sp, #44] ; 0x2c
  7637. 80252b8: f2a6 4933 subw r9, r6, #1075 ; 0x433
  7638. 80252bc: f1c0 0335 rsb r3, r0, #53 ; 0x35
  7639. 80252c0: 4448 add r0, r9
  7640. 80252c2: 6038 str r0, [r7, #0]
  7641. 80252c4: 6013 str r3, [r2, #0]
  7642. 80252c6: e7e5 b.n 8025294 <__d2b+0x70>
  7643. 80252c8: f1c0 0120 rsb r1, r0, #32
  7644. 80252cc: 9a00 ldr r2, [sp, #0]
  7645. 80252ce: fa03 f101 lsl.w r1, r3, r1
  7646. 80252d2: fa23 f300 lsr.w r3, r3, r0
  7647. 80252d6: 430a orrs r2, r1
  7648. 80252d8: 9301 str r3, [sp, #4]
  7649. 80252da: f8c8 2014 str.w r2, [r8, #20]
  7650. 80252de: e7c4 b.n 802526a <__d2b+0x46>
  7651. 080252e0 <__ratio>:
  7652. 80252e0: e92d 43f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, lr}
  7653. 80252e4: b083 sub sp, #12
  7654. 80252e6: 4688 mov r8, r1
  7655. 80252e8: 4669 mov r1, sp
  7656. 80252ea: 4606 mov r6, r0
  7657. 80252ec: f7ff ff42 bl 8025174 <__b2d>
  7658. 80252f0: 460d mov r5, r1
  7659. 80252f2: 4604 mov r4, r0
  7660. 80252f4: a901 add r1, sp, #4
  7661. 80252f6: 4640 mov r0, r8
  7662. 80252f8: f7ff ff3c bl 8025174 <__b2d>
  7663. 80252fc: 462f mov r7, r5
  7664. 80252fe: 460b mov r3, r1
  7665. 8025300: 4602 mov r2, r0
  7666. 8025302: f8d8 1010 ldr.w r1, [r8, #16]
  7667. 8025306: 4699 mov r9, r3
  7668. 8025308: 6930 ldr r0, [r6, #16]
  7669. 802530a: 4626 mov r6, r4
  7670. 802530c: 4690 mov r8, r2
  7671. 802530e: ebc1 0e00 rsb lr, r1, r0
  7672. 8025312: e89d 0003 ldmia.w sp, {r0, r1}
  7673. 8025316: 1a40 subs r0, r0, r1
  7674. 8025318: eb00 114e add.w r1, r0, lr, lsl #5
  7675. 802531c: 2900 cmp r1, #0
  7676. 802531e: bfc9 itett gt
  7677. 8025320: eb05 5701 addgt.w r7, r5, r1, lsl #20
  7678. 8025324: eba3 5901 suble.w r9, r3, r1, lsl #20
  7679. 8025328: 4624 movgt r4, r4
  7680. 802532a: 463d movgt r5, r7
  7681. 802532c: bfdc itt le
  7682. 802532e: 4612 movle r2, r2
  7683. 8025330: 464b movle r3, r9
  7684. 8025332: 4620 mov r0, r4
  7685. 8025334: 4629 mov r1, r5
  7686. 8025336: f7fb faa9 bl 802088c <__aeabi_ddiv>
  7687. 802533a: b003 add sp, #12
  7688. 802533c: e8bd 83f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, pc}
  7689. 08025340 <_mprec_log10>:
  7690. 8025340: 2817 cmp r0, #23
  7691. 8025342: b510 push {r4, lr}
  7692. 8025344: 4604 mov r4, r0
  7693. 8025346: dd0c ble.n 8025362 <_mprec_log10+0x22>
  7694. 8025348: 2100 movs r1, #0
  7695. 802534a: 2000 movs r0, #0
  7696. 802534c: f6c3 71f0 movt r1, #16368 ; 0x3ff0
  7697. 8025350: 2300 movs r3, #0
  7698. 8025352: 2200 movs r2, #0
  7699. 8025354: f2c4 0324 movt r3, #16420 ; 0x4024
  7700. 8025358: f7fb f96e bl 8020638 <__aeabi_dmul>
  7701. 802535c: 3c01 subs r4, #1
  7702. 802535e: d1f7 bne.n 8025350 <_mprec_log10+0x10>
  7703. 8025360: bd10 pop {r4, pc}
  7704. 8025362: f648 63d8 movw r3, #36568 ; 0x8ed8
  7705. 8025366: f6c0 0303 movt r3, #2051 ; 0x803
  7706. 802536a: eb03 03c0 add.w r3, r3, r0, lsl #3
  7707. 802536e: e9d3 0104 ldrd r0, r1, [r3, #16]
  7708. 8025372: bd10 pop {r4, pc}
  7709. 08025374 <__copybits>:
  7710. 8025374: b470 push {r4, r5, r6}
  7711. 8025376: 3901 subs r1, #1
  7712. 8025378: 6915 ldr r5, [r2, #16]
  7713. 802537a: f102 0314 add.w r3, r2, #20
  7714. 802537e: 114e asrs r6, r1, #5
  7715. 8025380: 3601 adds r6, #1
  7716. 8025382: eb02 0585 add.w r5, r2, r5, lsl #2
  7717. 8025386: 3514 adds r5, #20
  7718. 8025388: eb00 0686 add.w r6, r0, r6, lsl #2
  7719. 802538c: 42ab cmp r3, r5
  7720. 802538e: d20c bcs.n 80253aa <__copybits+0x36>
  7721. 8025390: 4601 mov r1, r0
  7722. 8025392: f853 4b04 ldr.w r4, [r3], #4
  7723. 8025396: 429d cmp r5, r3
  7724. 8025398: f841 4b04 str.w r4, [r1], #4
  7725. 802539c: d8f9 bhi.n 8025392 <__copybits+0x1e>
  7726. 802539e: 1aab subs r3, r5, r2
  7727. 80253a0: 3b15 subs r3, #21
  7728. 80253a2: f023 0303 bic.w r3, r3, #3
  7729. 80253a6: 3304 adds r3, #4
  7730. 80253a8: 18c0 adds r0, r0, r3
  7731. 80253aa: 4286 cmp r6, r0
  7732. 80253ac: d904 bls.n 80253b8 <__copybits+0x44>
  7733. 80253ae: 2300 movs r3, #0
  7734. 80253b0: f840 3b04 str.w r3, [r0], #4
  7735. 80253b4: 4286 cmp r6, r0
  7736. 80253b6: d8fb bhi.n 80253b0 <__copybits+0x3c>
  7737. 80253b8: bc70 pop {r4, r5, r6}
  7738. 80253ba: 4770 bx lr
  7739. 080253bc <__any_on>:
  7740. 80253bc: b430 push {r4, r5}
  7741. 80253be: 114b asrs r3, r1, #5
  7742. 80253c0: 6904 ldr r4, [r0, #16]
  7743. 80253c2: f100 0214 add.w r2, r0, #20
  7744. 80253c6: 429c cmp r4, r3
  7745. 80253c8: bfb8 it lt
  7746. 80253ca: 4623 movlt r3, r4
  7747. 80253cc: db00 blt.n 80253d0 <__any_on+0x14>
  7748. 80253ce: dc11 bgt.n 80253f4 <__any_on+0x38>
  7749. 80253d0: 3304 adds r3, #4
  7750. 80253d2: eb00 0083 add.w r0, r0, r3, lsl #2
  7751. 80253d6: 1d03 adds r3, r0, #4
  7752. 80253d8: 429a cmp r2, r3
  7753. 80253da: d218 bcs.n 802540e <__any_on+0x52>
  7754. 80253dc: f853 3c04 ldr.w r3, [r3, #-4]
  7755. 80253e0: b92b cbnz r3, 80253ee <__any_on+0x32>
  7756. 80253e2: 4282 cmp r2, r0
  7757. 80253e4: d213 bcs.n 802540e <__any_on+0x52>
  7758. 80253e6: f850 3d04 ldr.w r3, [r0, #-4]!
  7759. 80253ea: 2b00 cmp r3, #0
  7760. 80253ec: d0f9 beq.n 80253e2 <__any_on+0x26>
  7761. 80253ee: 2001 movs r0, #1
  7762. 80253f0: bc30 pop {r4, r5}
  7763. 80253f2: 4770 bx lr
  7764. 80253f4: f011 011f ands.w r1, r1, #31
  7765. 80253f8: d0ea beq.n 80253d0 <__any_on+0x14>
  7766. 80253fa: eb00 0483 add.w r4, r0, r3, lsl #2
  7767. 80253fe: 6964 ldr r4, [r4, #20]
  7768. 8025400: fa24 f501 lsr.w r5, r4, r1
  7769. 8025404: fa05 f101 lsl.w r1, r5, r1
  7770. 8025408: 42a1 cmp r1, r4
  7771. 802540a: d1f0 bne.n 80253ee <__any_on+0x32>
  7772. 802540c: e7e0 b.n 80253d0 <__any_on+0x14>
  7773. 802540e: 2000 movs r0, #0
  7774. 8025410: e7ee b.n 80253f0 <__any_on+0x34>
  7775. 8025412: bf00 nop
  7776. 08025414 <_sbrk_r>:
  7777. 8025414: b538 push {r3, r4, r5, lr}
  7778. 8025416: f244 04ac movw r4, #16556 ; 0x40ac
  7779. 802541a: f2c2 0401 movt r4, #8193 ; 0x2001
  7780. 802541e: 4605 mov r5, r0
  7781. 8025420: 4608 mov r0, r1
  7782. 8025422: 2300 movs r3, #0
  7783. 8025424: 6023 str r3, [r4, #0]
  7784. 8025426: f013 fc71 bl 8038d0c <_sbrk>
  7785. 802542a: 1c43 adds r3, r0, #1
  7786. 802542c: d000 beq.n 8025430 <_sbrk_r+0x1c>
  7787. 802542e: bd38 pop {r3, r4, r5, pc}
  7788. 8025430: 6823 ldr r3, [r4, #0]
  7789. 8025432: 2b00 cmp r3, #0
  7790. 8025434: d0fb beq.n 802542e <_sbrk_r+0x1a>
  7791. 8025436: 602b str r3, [r5, #0]
  7792. 8025438: bd38 pop {r3, r4, r5, pc}
  7793. 802543a: bf00 nop
  7794. 0802543c <strchr>:
  7795. 802543c: b2c9 uxtb r1, r1
  7796. 802543e: b4f0 push {r4, r5, r6, r7}
  7797. 8025440: 2900 cmp r1, #0
  7798. 8025442: d04b beq.n 80254dc <strchr+0xa0>
  7799. 8025444: 0783 lsls r3, r0, #30
  7800. 8025446: d00f beq.n 8025468 <strchr+0x2c>
  7801. 8025448: 7803 ldrb r3, [r0, #0]
  7802. 802544a: 2b00 cmp r3, #0
  7803. 802544c: d073 beq.n 8025536 <strchr+0xfa>
  7804. 802544e: 4299 cmp r1, r3
  7805. 8025450: d042 beq.n 80254d8 <strchr+0x9c>
  7806. 8025452: 1c43 adds r3, r0, #1
  7807. 8025454: e005 b.n 8025462 <strchr+0x26>
  7808. 8025456: f813 2b01 ldrb.w r2, [r3], #1
  7809. 802545a: 2a00 cmp r2, #0
  7810. 802545c: d03b beq.n 80254d6 <strchr+0x9a>
  7811. 802545e: 4291 cmp r1, r2
  7812. 8025460: d03a beq.n 80254d8 <strchr+0x9c>
  7813. 8025462: 079a lsls r2, r3, #30
  7814. 8025464: 4618 mov r0, r3
  7815. 8025466: d1f6 bne.n 8025456 <strchr+0x1a>
  7816. 8025468: 6803 ldr r3, [r0, #0]
  7817. 802546a: ea41 2701 orr.w r7, r1, r1, lsl #8
  7818. 802546e: f1a3 3201 sub.w r2, r3, #16843009 ; 0x1010101
  7819. 8025472: ea47 4707 orr.w r7, r7, r7, lsl #16
  7820. 8025476: ea22 0203 bic.w r2, r2, r3
  7821. 802547a: f012 3f80 tst.w r2, #2155905152 ; 0x80808080
  7822. 802547e: d11c bne.n 80254ba <strchr+0x7e>
  7823. 8025480: 407b eors r3, r7
  7824. 8025482: f1a3 3201 sub.w r2, r3, #16843009 ; 0x1010101
  7825. 8025486: ea22 0303 bic.w r3, r2, r3
  7826. 802548a: f013 3f80 tst.w r3, #2155905152 ; 0x80808080
  7827. 802548e: d114 bne.n 80254ba <strchr+0x7e>
  7828. 8025490: 1d02 adds r2, r0, #4
  7829. 8025492: e002 b.n 802549a <strchr+0x5e>
  7830. 8025494: f014 3f80 tst.w r4, #2155905152 ; 0x80808080
  7831. 8025498: d10f bne.n 80254ba <strchr+0x7e>
  7832. 802549a: 4610 mov r0, r2
  7833. 802549c: f852 3b04 ldr.w r3, [r2], #4
  7834. 80254a0: f1a3 3601 sub.w r6, r3, #16843009 ; 0x1010101
  7835. 80254a4: ea87 0403 eor.w r4, r7, r3
  7836. 80254a8: ea26 0303 bic.w r3, r6, r3
  7837. 80254ac: f1a4 3501 sub.w r5, r4, #16843009 ; 0x1010101
  7838. 80254b0: f013 3f80 tst.w r3, #2155905152 ; 0x80808080
  7839. 80254b4: ea25 0404 bic.w r4, r5, r4
  7840. 80254b8: d0ec beq.n 8025494 <strchr+0x58>
  7841. 80254ba: 7803 ldrb r3, [r0, #0]
  7842. 80254bc: 2b00 cmp r3, #0
  7843. 80254be: d03a beq.n 8025536 <strchr+0xfa>
  7844. 80254c0: 4299 cmp r1, r3
  7845. 80254c2: d009 beq.n 80254d8 <strchr+0x9c>
  7846. 80254c4: 1c43 adds r3, r0, #1
  7847. 80254c6: e001 b.n 80254cc <strchr+0x90>
  7848. 80254c8: 4291 cmp r1, r2
  7849. 80254ca: d005 beq.n 80254d8 <strchr+0x9c>
  7850. 80254cc: 4618 mov r0, r3
  7851. 80254ce: f813 2b01 ldrb.w r2, [r3], #1
  7852. 80254d2: 2a00 cmp r2, #0
  7853. 80254d4: d1f8 bne.n 80254c8 <strchr+0x8c>
  7854. 80254d6: 4610 mov r0, r2
  7855. 80254d8: bcf0 pop {r4, r5, r6, r7}
  7856. 80254da: 4770 bx lr
  7857. 80254dc: 0781 lsls r1, r0, #30
  7858. 80254de: d00d beq.n 80254fc <strchr+0xc0>
  7859. 80254e0: 7803 ldrb r3, [r0, #0]
  7860. 80254e2: 2b00 cmp r3, #0
  7861. 80254e4: d0f8 beq.n 80254d8 <strchr+0x9c>
  7862. 80254e6: 1c43 adds r3, r0, #1
  7863. 80254e8: e002 b.n 80254f0 <strchr+0xb4>
  7864. 80254ea: 7802 ldrb r2, [r0, #0]
  7865. 80254ec: 2a00 cmp r2, #0
  7866. 80254ee: d0f3 beq.n 80254d8 <strchr+0x9c>
  7867. 80254f0: f013 0f03 tst.w r3, #3
  7868. 80254f4: 4618 mov r0, r3
  7869. 80254f6: f103 0301 add.w r3, r3, #1
  7870. 80254fa: d1f6 bne.n 80254ea <strchr+0xae>
  7871. 80254fc: 6803 ldr r3, [r0, #0]
  7872. 80254fe: f1a3 3201 sub.w r2, r3, #16843009 ; 0x1010101
  7873. 8025502: ea22 0303 bic.w r3, r2, r3
  7874. 8025506: f013 3f80 tst.w r3, #2155905152 ; 0x80808080
  7875. 802550a: d10a bne.n 8025522 <strchr+0xe6>
  7876. 802550c: 1d02 adds r2, r0, #4
  7877. 802550e: 4610 mov r0, r2
  7878. 8025510: f852 1b04 ldr.w r1, [r2], #4
  7879. 8025514: f1a1 3401 sub.w r4, r1, #16843009 ; 0x1010101
  7880. 8025518: ea24 0101 bic.w r1, r4, r1
  7881. 802551c: f011 3f80 tst.w r1, #2155905152 ; 0x80808080
  7882. 8025520: d0f5 beq.n 802550e <strchr+0xd2>
  7883. 8025522: 7803 ldrb r3, [r0, #0]
  7884. 8025524: 2b00 cmp r3, #0
  7885. 8025526: d0d7 beq.n 80254d8 <strchr+0x9c>
  7886. 8025528: 1c43 adds r3, r0, #1
  7887. 802552a: 4618 mov r0, r3
  7888. 802552c: 3301 adds r3, #1
  7889. 802552e: 7802 ldrb r2, [r0, #0]
  7890. 8025530: 2a00 cmp r2, #0
  7891. 8025532: d1fa bne.n 802552a <strchr+0xee>
  7892. 8025534: e7d0 b.n 80254d8 <strchr+0x9c>
  7893. 8025536: 4618 mov r0, r3
  7894. 8025538: e7ce b.n 80254d8 <strchr+0x9c>
  7895. 802553a: bf00 nop
  7896. 0802553c <_calloc_r>:
  7897. 802553c: b510 push {r4, lr}
  7898. 802553e: fb01 f102 mul.w r1, r1, r2
  7899. 8025542: f7fe ffc5 bl 80244d0 <_malloc_r>
  7900. 8025546: 4604 mov r4, r0
  7901. 8025548: b170 cbz r0, 8025568 <_calloc_r+0x2c>
  7902. 802554a: f850 2c04 ldr.w r2, [r0, #-4]
  7903. 802554e: f022 0203 bic.w r2, r2, #3
  7904. 8025552: 3a04 subs r2, #4
  7905. 8025554: 2a24 cmp r2, #36 ; 0x24
  7906. 8025556: d81c bhi.n 8025592 <_calloc_r+0x56>
  7907. 8025558: 2a13 cmp r2, #19
  7908. 802555a: bf98 it ls
  7909. 802555c: 4603 movls r3, r0
  7910. 802555e: d805 bhi.n 802556c <_calloc_r+0x30>
  7911. 8025560: 2200 movs r2, #0
  7912. 8025562: 601a str r2, [r3, #0]
  7913. 8025564: 605a str r2, [r3, #4]
  7914. 8025566: 609a str r2, [r3, #8]
  7915. 8025568: 4620 mov r0, r4
  7916. 802556a: bd10 pop {r4, pc}
  7917. 802556c: 2100 movs r1, #0
  7918. 802556e: 2a1b cmp r2, #27
  7919. 8025570: 6001 str r1, [r0, #0]
  7920. 8025572: bf98 it ls
  7921. 8025574: f100 0308 addls.w r3, r0, #8
  7922. 8025578: 6041 str r1, [r0, #4]
  7923. 802557a: d9f1 bls.n 8025560 <_calloc_r+0x24>
  7924. 802557c: 2a24 cmp r2, #36 ; 0x24
  7925. 802557e: 6081 str r1, [r0, #8]
  7926. 8025580: 60c1 str r1, [r0, #12]
  7927. 8025582: bf11 iteee ne
  7928. 8025584: f100 0310 addne.w r3, r0, #16
  7929. 8025588: 6101 streq r1, [r0, #16]
  7930. 802558a: f100 0318 addeq.w r3, r0, #24
  7931. 802558e: 6141 streq r1, [r0, #20]
  7932. 8025590: e7e6 b.n 8025560 <_calloc_r+0x24>
  7933. 8025592: 2100 movs r1, #0
  7934. 8025594: f7fc fc40 bl 8021e18 <memset>
  7935. 8025598: 4620 mov r0, r4
  7936. 802559a: bd10 pop {r4, pc}
  7937. 0802559c <fabs>:
  7938. 802559c: f021 4100 bic.w r1, r1, #2147483648 ; 0x80000000
  7939. 80255a0: 4770 bx lr
  7940. 80255a2: bf00 nop
  7941. 080255a4 <NVIC_PriorityGroupConfig>:
  7942. {
  7943. /* Check the parameters */
  7944. assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));
  7945. /* Set the PRIGROUP[10:8] bits according to NVIC_PriorityGroup value */
  7946. SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup;
  7947. 80255a4: f040 60bf orr.w r0, r0, #100139008 ; 0x5f80000
  7948. 80255a8: 4b02 ldr r3, [pc, #8] ; (80255b4 <NVIC_PriorityGroupConfig+0x10>)
  7949. 80255aa: f440 3000 orr.w r0, r0, #131072 ; 0x20000
  7950. 80255ae: 60d8 str r0, [r3, #12]
  7951. 80255b0: 4770 bx lr
  7952. 80255b2: bf00 nop
  7953. 80255b4: e000ed00 .word 0xe000ed00
  7954. 080255b8 <NVIC_Init>:
  7955. /* Check the parameters */
  7956. assert_param(IS_FUNCTIONAL_STATE(NVIC_InitStruct->NVIC_IRQChannelCmd));
  7957. assert_param(IS_NVIC_PREEMPTION_PRIORITY(NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority));
  7958. assert_param(IS_NVIC_SUB_PRIORITY(NVIC_InitStruct->NVIC_IRQChannelSubPriority));
  7959. if (NVIC_InitStruct->NVIC_IRQChannelCmd != DISABLE)
  7960. 80255b8: 78c3 ldrb r3, [r0, #3]
  7961. 80255ba: b30b cbz r3, 8025600 <NVIC_Init+0x48>
  7962. {
  7963. /* Compute the Corresponding IRQ Priority --------------------------------*/
  7964. tmppriority = (0x700 - ((SCB->AIRCR) & (uint32_t)0x700))>> 0x08;
  7965. 80255bc: 4b16 ldr r3, [pc, #88] ; (8025618 <NVIC_Init+0x60>)
  7966. tmppre = (0x4 - tmppriority);
  7967. tmpsub = tmpsub >> tmppriority;
  7968. tmppriority = NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority << tmppre;
  7969. 80255be: 7841 ldrb r1, [r0, #1]
  7970. assert_param(IS_NVIC_SUB_PRIORITY(NVIC_InitStruct->NVIC_IRQChannelSubPriority));
  7971. if (NVIC_InitStruct->NVIC_IRQChannelCmd != DISABLE)
  7972. {
  7973. /* Compute the Corresponding IRQ Priority --------------------------------*/
  7974. tmppriority = (0x700 - ((SCB->AIRCR) & (uint32_t)0x700))>> 0x08;
  7975. 80255c0: 68db ldr r3, [r3, #12]
  7976. 80255c2: 43db mvns r3, r3
  7977. 80255c4: f3c3 2302 ubfx r3, r3, #8, #3
  7978. tmppre = (0x4 - tmppriority);
  7979. 80255c8: f1c3 0204 rsb r2, r3, #4
  7980. tmpsub = tmpsub >> tmppriority;
  7981. tmppriority = NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority << tmppre;
  7982. 80255cc: b2d2 uxtb r2, r2
  7983. 80255ce: fa01 f202 lsl.w r2, r1, r2
  7984. if (NVIC_InitStruct->NVIC_IRQChannelCmd != DISABLE)
  7985. {
  7986. /* Compute the Corresponding IRQ Priority --------------------------------*/
  7987. tmppriority = (0x700 - ((SCB->AIRCR) & (uint32_t)0x700))>> 0x08;
  7988. tmppre = (0x4 - tmppriority);
  7989. tmpsub = tmpsub >> tmppriority;
  7990. 80255d2: 210f movs r1, #15
  7991. 80255d4: fa41 f303 asr.w r3, r1, r3
  7992. tmppriority = NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority << tmppre;
  7993. tmppriority |= (uint8_t)(NVIC_InitStruct->NVIC_IRQChannelSubPriority & tmpsub);
  7994. 80255d8: 7881 ldrb r1, [r0, #2]
  7995. /* Compute the Corresponding IRQ Priority --------------------------------*/
  7996. tmppriority = (0x700 - ((SCB->AIRCR) & (uint32_t)0x700))>> 0x08;
  7997. tmppre = (0x4 - tmppriority);
  7998. tmpsub = tmpsub >> tmppriority;
  7999. tmppriority = NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority << tmppre;
  8000. 80255da: b2d2 uxtb r2, r2
  8001. tmppriority |= (uint8_t)(NVIC_InitStruct->NVIC_IRQChannelSubPriority & tmpsub);
  8002. 80255dc: 400b ands r3, r1
  8003. 80255de: 431a orrs r2, r3
  8004. tmppriority = tmppriority << 0x04;
  8005. NVIC->IP[NVIC_InitStruct->NVIC_IRQChannel] = tmppriority;
  8006. 80255e0: 7803 ldrb r3, [r0, #0]
  8007. 80255e2: f103 4360 add.w r3, r3, #3758096384 ; 0xe0000000
  8008. 80255e6: f503 4361 add.w r3, r3, #57600 ; 0xe100
  8009. tmpsub = tmpsub >> tmppriority;
  8010. tmppriority = NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority << tmppre;
  8011. tmppriority |= (uint8_t)(NVIC_InitStruct->NVIC_IRQChannelSubPriority & tmpsub);
  8012. tmppriority = tmppriority << 0x04;
  8013. 80255ea: 0112 lsls r2, r2, #4
  8014. NVIC->IP[NVIC_InitStruct->NVIC_IRQChannel] = tmppriority;
  8015. 80255ec: f883 2300 strb.w r2, [r3, #768] ; 0x300
  8016. /* Enable the Selected IRQ Channels --------------------------------------*/
  8017. NVIC->ISER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] =
  8018. 80255f0: 7803 ldrb r3, [r0, #0]
  8019. (uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F);
  8020. 80255f2: 2201 movs r2, #1
  8021. tmppriority = tmppriority << 0x04;
  8022. NVIC->IP[NVIC_InitStruct->NVIC_IRQChannel] = tmppriority;
  8023. /* Enable the Selected IRQ Channels --------------------------------------*/
  8024. NVIC->ISER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] =
  8025. 80255f4: 0959 lsrs r1, r3, #5
  8026. (uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F);
  8027. 80255f6: f003 031f and.w r3, r3, #31
  8028. 80255fa: fa02 f303 lsl.w r3, r2, r3
  8029. 80255fe: e007 b.n 8025610 <NVIC_Init+0x58>
  8030. }
  8031. else
  8032. {
  8033. /* Disable the Selected IRQ Channels -------------------------------------*/
  8034. NVIC->ICER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] =
  8035. 8025600: 7803 ldrb r3, [r0, #0]
  8036. (uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F);
  8037. 8025602: 2201 movs r2, #1
  8038. (uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F);
  8039. }
  8040. else
  8041. {
  8042. /* Disable the Selected IRQ Channels -------------------------------------*/
  8043. NVIC->ICER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] =
  8044. 8025604: 0959 lsrs r1, r3, #5
  8045. (uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F);
  8046. 8025606: f003 031f and.w r3, r3, #31
  8047. 802560a: fa02 f303 lsl.w r3, r2, r3
  8048. (uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F);
  8049. }
  8050. else
  8051. {
  8052. /* Disable the Selected IRQ Channels -------------------------------------*/
  8053. NVIC->ICER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] =
  8054. 802560e: 3120 adds r1, #32
  8055. 8025610: 4a02 ldr r2, [pc, #8] ; (802561c <NVIC_Init+0x64>)
  8056. 8025612: f842 3021 str.w r3, [r2, r1, lsl #2]
  8057. 8025616: 4770 bx lr
  8058. 8025618: e000ed00 .word 0xe000ed00
  8059. 802561c: e000e100 .word 0xe000e100
  8060. 08025620 <NVIC_SetVectorTable>:
  8061. {
  8062. /* Check the parameters */
  8063. assert_param(IS_NVIC_VECTTAB(NVIC_VectTab));
  8064. assert_param(IS_NVIC_OFFSET(Offset));
  8065. SCB->VTOR = NVIC_VectTab | (Offset & (uint32_t)0x1FFFFF80);
  8066. 8025620: f021 4160 bic.w r1, r1, #3758096384 ; 0xe0000000
  8067. 8025624: f021 017f bic.w r1, r1, #127 ; 0x7f
  8068. 8025628: 4b01 ldr r3, [pc, #4] ; (8025630 <NVIC_SetVectorTable+0x10>)
  8069. 802562a: 4308 orrs r0, r1
  8070. 802562c: 6098 str r0, [r3, #8]
  8071. 802562e: 4770 bx lr
  8072. 8025630: e000ed00 .word 0xe000ed00
  8073. 08025634 <CRC_ResetDR>:
  8074. * @retval None
  8075. */
  8076. void CRC_ResetDR(void)
  8077. {
  8078. /* Reset CRC generator */
  8079. CRC->CR = CRC_CR_RESET;
  8080. 8025634: 4b01 ldr r3, [pc, #4] ; (802563c <CRC_ResetDR+0x8>)
  8081. 8025636: 2201 movs r2, #1
  8082. 8025638: 609a str r2, [r3, #8]
  8083. 802563a: 4770 bx lr
  8084. 802563c: 40023000 .word 0x40023000
  8085. 08025640 <CRC_CalcBlockCRC>:
  8086. * @param pBuffer: pointer to the buffer containing the data to be computed
  8087. * @param BufferLength: length of the buffer to be computed
  8088. * @retval 32-bit CRC
  8089. */
  8090. uint32_t CRC_CalcBlockCRC(uint32_t pBuffer[], uint32_t BufferLength)
  8091. {
  8092. 8025640: b510 push {r4, lr}
  8093. uint32_t index = 0;
  8094. for(index = 0; index < BufferLength; index++)
  8095. 8025642: 2300 movs r3, #0
  8096. 8025644: 4c05 ldr r4, [pc, #20] ; (802565c <CRC_CalcBlockCRC+0x1c>)
  8097. 8025646: e003 b.n 8025650 <CRC_CalcBlockCRC+0x10>
  8098. {
  8099. CRC->DR = pBuffer[index];
  8100. 8025648: f850 2023 ldr.w r2, [r0, r3, lsl #2]
  8101. */
  8102. uint32_t CRC_CalcBlockCRC(uint32_t pBuffer[], uint32_t BufferLength)
  8103. {
  8104. uint32_t index = 0;
  8105. for(index = 0; index < BufferLength; index++)
  8106. 802564c: 3301 adds r3, #1
  8107. {
  8108. CRC->DR = pBuffer[index];
  8109. 802564e: 6022 str r2, [r4, #0]
  8110. */
  8111. uint32_t CRC_CalcBlockCRC(uint32_t pBuffer[], uint32_t BufferLength)
  8112. {
  8113. uint32_t index = 0;
  8114. for(index = 0; index < BufferLength; index++)
  8115. 8025650: 428b cmp r3, r1
  8116. 8025652: d1f9 bne.n 8025648 <CRC_CalcBlockCRC+0x8>
  8117. {
  8118. CRC->DR = pBuffer[index];
  8119. }
  8120. return (CRC->DR);
  8121. 8025654: 4b01 ldr r3, [pc, #4] ; (802565c <CRC_CalcBlockCRC+0x1c>)
  8122. 8025656: 6818 ldr r0, [r3, #0]
  8123. }
  8124. 8025658: bd10 pop {r4, pc}
  8125. 802565a: bf00 nop
  8126. 802565c: 40023000 .word 0x40023000
  8127. 08025660 <FLASH_Unlock>:
  8128. * @param None
  8129. * @retval None
  8130. */
  8131. void FLASH_Unlock(void)
  8132. {
  8133. if((FLASH->CR & FLASH_CR_LOCK) != RESET)
  8134. 8025660: 4b04 ldr r3, [pc, #16] ; (8025674 <FLASH_Unlock+0x14>)
  8135. 8025662: 691a ldr r2, [r3, #16]
  8136. 8025664: 2a00 cmp r2, #0
  8137. 8025666: da04 bge.n 8025672 <FLASH_Unlock+0x12>
  8138. {
  8139. /* Authorize the FLASH Registers access */
  8140. FLASH->KEYR = FLASH_KEY1;
  8141. 8025668: 4a03 ldr r2, [pc, #12] ; (8025678 <FLASH_Unlock+0x18>)
  8142. 802566a: 605a str r2, [r3, #4]
  8143. FLASH->KEYR = FLASH_KEY2;
  8144. 802566c: f102 3288 add.w r2, r2, #2290649224 ; 0x88888888
  8145. 8025670: 605a str r2, [r3, #4]
  8146. 8025672: 4770 bx lr
  8147. 8025674: 40023c00 .word 0x40023c00
  8148. 8025678: 45670123 .word 0x45670123
  8149. 0802567c <FLASH_Lock>:
  8150. * @retval None
  8151. */
  8152. void FLASH_Lock(void)
  8153. {
  8154. /* Set the LOCK Bit to lock the FLASH Registers access */
  8155. FLASH->CR |= FLASH_CR_LOCK;
  8156. 802567c: 4b02 ldr r3, [pc, #8] ; (8025688 <FLASH_Lock+0xc>)
  8157. 802567e: 691a ldr r2, [r3, #16]
  8158. 8025680: f042 4200 orr.w r2, r2, #2147483648 ; 0x80000000
  8159. 8025684: 611a str r2, [r3, #16]
  8160. 8025686: 4770 bx lr
  8161. 8025688: 40023c00 .word 0x40023c00
  8162. 0802568c <FLASH_ClearFlag>:
  8163. {
  8164. /* Check the parameters */
  8165. assert_param(IS_FLASH_CLEAR_FLAG(FLASH_FLAG));
  8166. /* Clear the flags */
  8167. FLASH->SR = FLASH_FLAG;
  8168. 802568c: 4b01 ldr r3, [pc, #4] ; (8025694 <FLASH_ClearFlag+0x8>)
  8169. 802568e: 60d8 str r0, [r3, #12]
  8170. 8025690: 4770 bx lr
  8171. 8025692: bf00 nop
  8172. 8025694: 40023c00 .word 0x40023c00
  8173. 08025698 <FLASH_GetStatus>:
  8174. */
  8175. FLASH_Status FLASH_GetStatus(void)
  8176. {
  8177. FLASH_Status flashstatus = FLASH_COMPLETE;
  8178. if((FLASH->SR & FLASH_FLAG_BSY) == FLASH_FLAG_BSY)
  8179. 8025698: 4b0b ldr r3, [pc, #44] ; (80256c8 <FLASH_GetStatus+0x30>)
  8180. 802569a: 68da ldr r2, [r3, #12]
  8181. 802569c: 03d0 lsls r0, r2, #15
  8182. 802569e: d40d bmi.n 80256bc <FLASH_GetStatus+0x24>
  8183. {
  8184. flashstatus = FLASH_BUSY;
  8185. }
  8186. else
  8187. {
  8188. if((FLASH->SR & FLASH_FLAG_WRPERR) != (uint32_t)0x00)
  8189. 80256a0: 68da ldr r2, [r3, #12]
  8190. 80256a2: 06d1 lsls r1, r2, #27
  8191. 80256a4: d40c bmi.n 80256c0 <FLASH_GetStatus+0x28>
  8192. {
  8193. flashstatus = FLASH_ERROR_WRP;
  8194. }
  8195. else
  8196. {
  8197. if((FLASH->SR & (uint32_t)0xEF) != (uint32_t)0x00)
  8198. 80256a6: 68da ldr r2, [r3, #12]
  8199. 80256a8: f012 0fef tst.w r2, #239 ; 0xef
  8200. 80256ac: d10a bne.n 80256c4 <FLASH_GetStatus+0x2c>
  8201. {
  8202. flashstatus = FLASH_ERROR_PROGRAM;
  8203. }
  8204. else
  8205. {
  8206. if((FLASH->SR & FLASH_FLAG_OPERR) != (uint32_t)0x00)
  8207. 80256ae: 68db ldr r3, [r3, #12]
  8208. 80256b0: f013 0f02 tst.w r3, #2
  8209. {
  8210. flashstatus = FLASH_ERROR_OPERATION;
  8211. 80256b4: bf0c ite eq
  8212. 80256b6: 2008 moveq r0, #8
  8213. 80256b8: 2007 movne r0, #7
  8214. 80256ba: 4770 bx lr
  8215. {
  8216. FLASH_Status flashstatus = FLASH_COMPLETE;
  8217. if((FLASH->SR & FLASH_FLAG_BSY) == FLASH_FLAG_BSY)
  8218. {
  8219. flashstatus = FLASH_BUSY;
  8220. 80256bc: 2001 movs r0, #1
  8221. 80256be: 4770 bx lr
  8222. }
  8223. else
  8224. {
  8225. if((FLASH->SR & FLASH_FLAG_WRPERR) != (uint32_t)0x00)
  8226. {
  8227. flashstatus = FLASH_ERROR_WRP;
  8228. 80256c0: 2005 movs r0, #5
  8229. 80256c2: 4770 bx lr
  8230. }
  8231. else
  8232. {
  8233. if((FLASH->SR & (uint32_t)0xEF) != (uint32_t)0x00)
  8234. {
  8235. flashstatus = FLASH_ERROR_PROGRAM;
  8236. 80256c4: 2006 movs r0, #6
  8237. }
  8238. }
  8239. }
  8240. /* Return the FLASH Status */
  8241. return flashstatus;
  8242. }
  8243. 80256c6: 4770 bx lr
  8244. 80256c8: 40023c00 .word 0x40023c00
  8245. 080256cc <FLASH_WaitForLastOperation>:
  8246. * @param None
  8247. * @retval FLASH Status: The returned value can be: FLASH_BUSY, FLASH_ERROR_PROGRAM,
  8248. * FLASH_ERROR_WRP, FLASH_ERROR_OPERATION or FLASH_COMPLETE.
  8249. */
  8250. FLASH_Status FLASH_WaitForLastOperation(void)
  8251. {
  8252. 80256cc: b507 push {r0, r1, r2, lr}
  8253. __IO FLASH_Status status = FLASH_COMPLETE;
  8254. 80256ce: 2308 movs r3, #8
  8255. 80256d0: f88d 3007 strb.w r3, [sp, #7]
  8256. /* Wait for the FLASH operation to complete by polling on BUSY flag to be reset.
  8257. Even if the FLASH operation fails, the BUSY flag will be reset and an error
  8258. flag will be set */
  8259. while(status == FLASH_BUSY)
  8260. {
  8261. status = FLASH_GetStatus();
  8262. 80256d4: f7ff ffe0 bl 8025698 <FLASH_GetStatus>
  8263. 80256d8: f88d 0007 strb.w r0, [sp, #7]
  8264. status = FLASH_GetStatus();
  8265. /* Wait for the FLASH operation to complete by polling on BUSY flag to be reset.
  8266. Even if the FLASH operation fails, the BUSY flag will be reset and an error
  8267. flag will be set */
  8268. while(status == FLASH_BUSY)
  8269. 80256dc: f89d 3007 ldrb.w r3, [sp, #7]
  8270. 80256e0: 2b01 cmp r3, #1
  8271. 80256e2: d0f7 beq.n 80256d4 <FLASH_WaitForLastOperation+0x8>
  8272. {
  8273. status = FLASH_GetStatus();
  8274. }
  8275. /* Return the operation status */
  8276. return status;
  8277. 80256e4: f89d 0007 ldrb.w r0, [sp, #7]
  8278. }
  8279. 80256e8: bd0e pop {r1, r2, r3, pc}
  8280. 80256ea: 0000 movs r0, r0
  8281. 080256ec <FLASH_ProgramByte>:
  8282. * @param Data: specifies the data to be programmed.
  8283. * @retval FLASH Status: The returned value can be: FLASH_BUSY, FLASH_ERROR_PROGRAM,
  8284. * FLASH_ERROR_WRP, FLASH_ERROR_OPERATION or FLASH_COMPLETE.
  8285. */
  8286. FLASH_Status FLASH_ProgramByte(uint32_t Address, uint8_t Data)
  8287. {
  8288. 80256ec: b570 push {r4, r5, r6, lr}
  8289. 80256ee: 4605 mov r5, r0
  8290. 80256f0: 460e mov r6, r1
  8291. /* Check the parameters */
  8292. assert_param(IS_FLASH_ADDRESS(Address));
  8293. /* Wait for last operation to be completed */
  8294. status = FLASH_WaitForLastOperation();
  8295. 80256f2: f7ff ffeb bl 80256cc <FLASH_WaitForLastOperation>
  8296. if(status == FLASH_COMPLETE)
  8297. 80256f6: 2808 cmp r0, #8
  8298. 80256f8: d111 bne.n 802571e <FLASH_ProgramByte+0x32>
  8299. {
  8300. /* if the previous operation is completed, proceed to program the new data */
  8301. FLASH->CR &= CR_PSIZE_MASK;
  8302. 80256fa: 4c09 ldr r4, [pc, #36] ; (8025720 <FLASH_ProgramByte+0x34>)
  8303. 80256fc: 6923 ldr r3, [r4, #16]
  8304. 80256fe: f423 7340 bic.w r3, r3, #768 ; 0x300
  8305. 8025702: 6123 str r3, [r4, #16]
  8306. FLASH->CR |= FLASH_PSIZE_BYTE;
  8307. 8025704: 6923 ldr r3, [r4, #16]
  8308. 8025706: 6123 str r3, [r4, #16]
  8309. FLASH->CR |= FLASH_CR_PG;
  8310. 8025708: 6923 ldr r3, [r4, #16]
  8311. 802570a: f043 0301 orr.w r3, r3, #1
  8312. 802570e: 6123 str r3, [r4, #16]
  8313. *(__IO uint8_t*)Address = Data;
  8314. 8025710: 702e strb r6, [r5, #0]
  8315. /* Wait for last operation to be completed */
  8316. status = FLASH_WaitForLastOperation();
  8317. 8025712: f7ff ffdb bl 80256cc <FLASH_WaitForLastOperation>
  8318. /* if the program operation is completed, disable the PG Bit */
  8319. FLASH->CR &= (~FLASH_CR_PG);
  8320. 8025716: 6923 ldr r3, [r4, #16]
  8321. 8025718: f023 0301 bic.w r3, r3, #1
  8322. 802571c: 6123 str r3, [r4, #16]
  8323. }
  8324. /* Return the Program Status */
  8325. return status;
  8326. }
  8327. 802571e: bd70 pop {r4, r5, r6, pc}
  8328. 8025720: 40023c00 .word 0x40023c00
  8329. 08025724 <FLASH_ProgramWord>:
  8330. * @param Data: specifies the data to be programmed.
  8331. * @retval FLASH Status: The returned value can be: FLASH_BUSY, FLASH_ERROR_PROGRAM,
  8332. * FLASH_ERROR_WRP, FLASH_ERROR_OPERATION or FLASH_COMPLETE.
  8333. */
  8334. FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data)
  8335. {
  8336. 8025724: b570 push {r4, r5, r6, lr}
  8337. 8025726: 4605 mov r5, r0
  8338. 8025728: 460e mov r6, r1
  8339. /* Check the parameters */
  8340. assert_param(IS_FLASH_ADDRESS(Address));
  8341. /* Wait for last operation to be completed */
  8342. status = FLASH_WaitForLastOperation();
  8343. 802572a: f7ff ffcf bl 80256cc <FLASH_WaitForLastOperation>
  8344. if(status == FLASH_COMPLETE)
  8345. 802572e: 2808 cmp r0, #8
  8346. 8025730: d113 bne.n 802575a <FLASH_ProgramWord+0x36>
  8347. {
  8348. /* if the previous operation is completed, proceed to program the new data */
  8349. FLASH->CR &= CR_PSIZE_MASK;
  8350. 8025732: 4c0a ldr r4, [pc, #40] ; (802575c <FLASH_ProgramWord+0x38>)
  8351. 8025734: 6923 ldr r3, [r4, #16]
  8352. 8025736: f423 7340 bic.w r3, r3, #768 ; 0x300
  8353. 802573a: 6123 str r3, [r4, #16]
  8354. FLASH->CR |= FLASH_PSIZE_WORD;
  8355. 802573c: 6923 ldr r3, [r4, #16]
  8356. 802573e: f443 7300 orr.w r3, r3, #512 ; 0x200
  8357. 8025742: 6123 str r3, [r4, #16]
  8358. FLASH->CR |= FLASH_CR_PG;
  8359. 8025744: 6923 ldr r3, [r4, #16]
  8360. 8025746: f043 0301 orr.w r3, r3, #1
  8361. 802574a: 6123 str r3, [r4, #16]
  8362. *(__IO uint32_t*)Address = Data;
  8363. 802574c: 602e str r6, [r5, #0]
  8364. /* Wait for last operation to be completed */
  8365. status = FLASH_WaitForLastOperation();
  8366. 802574e: f7ff ffbd bl 80256cc <FLASH_WaitForLastOperation>
  8367. /* if the program operation is completed, disable the PG Bit */
  8368. FLASH->CR &= (~FLASH_CR_PG);
  8369. 8025752: 6923 ldr r3, [r4, #16]
  8370. 8025754: f023 0301 bic.w r3, r3, #1
  8371. 8025758: 6123 str r3, [r4, #16]
  8372. }
  8373. /* Return the Program Status */
  8374. return status;
  8375. }
  8376. 802575a: bd70 pop {r4, r5, r6, pc}
  8377. 802575c: 40023c00 .word 0x40023c00
  8378. 08025760 <FLASH_EraseSector>:
  8379. *
  8380. * @retval FLASH Status: The returned value can be: FLASH_BUSY, FLASH_ERROR_PROGRAM,
  8381. * FLASH_ERROR_WRP, FLASH_ERROR_OPERATION or FLASH_COMPLETE.
  8382. */
  8383. FLASH_Status FLASH_EraseSector(uint32_t FLASH_Sector, uint8_t VoltageRange)
  8384. {
  8385. 8025760: b570 push {r4, r5, r6, lr}
  8386. 8025762: 4606 mov r6, r0
  8387. /* Check the parameters */
  8388. assert_param(IS_FLASH_SECTOR(FLASH_Sector));
  8389. assert_param(IS_VOLTAGERANGE(VoltageRange));
  8390. if(VoltageRange == VoltageRange_1)
  8391. 8025764: b141 cbz r1, 8025778 <FLASH_EraseSector+0x18>
  8392. {
  8393. tmp_psize = FLASH_PSIZE_BYTE;
  8394. }
  8395. else if(VoltageRange == VoltageRange_2)
  8396. 8025766: 2901 cmp r1, #1
  8397. 8025768: d008 beq.n 802577c <FLASH_EraseSector+0x1c>
  8398. {
  8399. tmp_psize = FLASH_PSIZE_HALF_WORD;
  8400. }
  8401. else if(VoltageRange == VoltageRange_3)
  8402. {
  8403. tmp_psize = FLASH_PSIZE_WORD;
  8404. 802576a: 2902 cmp r1, #2
  8405. 802576c: bf14 ite ne
  8406. 802576e: f44f 7540 movne.w r5, #768 ; 0x300
  8407. 8025772: f44f 7500 moveq.w r5, #512 ; 0x200
  8408. 8025776: e003 b.n 8025780 <FLASH_EraseSector+0x20>
  8409. assert_param(IS_FLASH_SECTOR(FLASH_Sector));
  8410. assert_param(IS_VOLTAGERANGE(VoltageRange));
  8411. if(VoltageRange == VoltageRange_1)
  8412. {
  8413. tmp_psize = FLASH_PSIZE_BYTE;
  8414. 8025778: 460d mov r5, r1
  8415. 802577a: e001 b.n 8025780 <FLASH_EraseSector+0x20>
  8416. }
  8417. else if(VoltageRange == VoltageRange_2)
  8418. {
  8419. tmp_psize = FLASH_PSIZE_HALF_WORD;
  8420. 802577c: f44f 7580 mov.w r5, #256 ; 0x100
  8421. else
  8422. {
  8423. tmp_psize = FLASH_PSIZE_DOUBLE_WORD;
  8424. }
  8425. /* Wait for last operation to be completed */
  8426. status = FLASH_WaitForLastOperation();
  8427. 8025780: f7ff ffa4 bl 80256cc <FLASH_WaitForLastOperation>
  8428. if(status == FLASH_COMPLETE)
  8429. 8025784: 2808 cmp r0, #8
  8430. 8025786: d11e bne.n 80257c6 <FLASH_EraseSector+0x66>
  8431. {
  8432. /* if the previous operation is completed, proceed to erase the sector */
  8433. FLASH->CR &= CR_PSIZE_MASK;
  8434. 8025788: 4c0f ldr r4, [pc, #60] ; (80257c8 <FLASH_EraseSector+0x68>)
  8435. 802578a: 6923 ldr r3, [r4, #16]
  8436. 802578c: f423 7340 bic.w r3, r3, #768 ; 0x300
  8437. 8025790: 6123 str r3, [r4, #16]
  8438. FLASH->CR |= tmp_psize;
  8439. 8025792: 6921 ldr r1, [r4, #16]
  8440. 8025794: 430d orrs r5, r1
  8441. 8025796: 6125 str r5, [r4, #16]
  8442. FLASH->CR &= SECTOR_MASK;
  8443. 8025798: 6923 ldr r3, [r4, #16]
  8444. 802579a: f023 03f8 bic.w r3, r3, #248 ; 0xf8
  8445. 802579e: 6123 str r3, [r4, #16]
  8446. FLASH->CR |= FLASH_CR_SER | FLASH_Sector;
  8447. 80257a0: 6923 ldr r3, [r4, #16]
  8448. 80257a2: f043 0302 orr.w r3, r3, #2
  8449. 80257a6: 431e orrs r6, r3
  8450. 80257a8: 6126 str r6, [r4, #16]
  8451. FLASH->CR |= FLASH_CR_STRT;
  8452. 80257aa: 6923 ldr r3, [r4, #16]
  8453. 80257ac: f443 3380 orr.w r3, r3, #65536 ; 0x10000
  8454. 80257b0: 6123 str r3, [r4, #16]
  8455. /* Wait for last operation to be completed */
  8456. status = FLASH_WaitForLastOperation();
  8457. 80257b2: f7ff ff8b bl 80256cc <FLASH_WaitForLastOperation>
  8458. /* if the erase operation is completed, disable the SER Bit */
  8459. FLASH->CR &= (~FLASH_CR_SER);
  8460. 80257b6: 6923 ldr r3, [r4, #16]
  8461. 80257b8: f023 0302 bic.w r3, r3, #2
  8462. 80257bc: 6123 str r3, [r4, #16]
  8463. FLASH->CR &= SECTOR_MASK;
  8464. 80257be: 6923 ldr r3, [r4, #16]
  8465. 80257c0: f023 03f8 bic.w r3, r3, #248 ; 0xf8
  8466. 80257c4: 6123 str r3, [r4, #16]
  8467. }
  8468. /* Return the Erase Status */
  8469. return status;
  8470. }
  8471. 80257c6: bd70 pop {r4, r5, r6, pc}
  8472. 80257c8: 40023c00 .word 0x40023c00
  8473. 080257cc <GPIO_DeInit>:
  8474. * @note By default, The GPIO pins are configured in input floating mode (except JTAG pins).
  8475. * @param GPIOx: where x can be (A..I) to select the GPIO peripheral.
  8476. * @retval None
  8477. */
  8478. void GPIO_DeInit(GPIO_TypeDef* GPIOx)
  8479. {
  8480. 80257cc: b508 push {r3, lr}
  8481. /* Check the parameters */
  8482. assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
  8483. if (GPIOx == GPIOA)
  8484. 80257ce: 4b2c ldr r3, [pc, #176] ; (8025880 <GPIO_DeInit+0xb4>)
  8485. 80257d0: 4298 cmp r0, r3
  8486. 80257d2: d105 bne.n 80257e0 <GPIO_DeInit+0x14>
  8487. {
  8488. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOA, ENABLE);
  8489. 80257d4: 2001 movs r0, #1
  8490. 80257d6: 4601 mov r1, r0
  8491. 80257d8: f000 f974 bl 8025ac4 <RCC_AHB1PeriphResetCmd>
  8492. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOA, DISABLE);
  8493. 80257dc: 2001 movs r0, #1
  8494. 80257de: e048 b.n 8025872 <GPIO_DeInit+0xa6>
  8495. }
  8496. else if (GPIOx == GPIOB)
  8497. 80257e0: 4b28 ldr r3, [pc, #160] ; (8025884 <GPIO_DeInit+0xb8>)
  8498. 80257e2: 4298 cmp r0, r3
  8499. 80257e4: d105 bne.n 80257f2 <GPIO_DeInit+0x26>
  8500. {
  8501. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOB, ENABLE);
  8502. 80257e6: 2002 movs r0, #2
  8503. 80257e8: 2101 movs r1, #1
  8504. 80257ea: f000 f96b bl 8025ac4 <RCC_AHB1PeriphResetCmd>
  8505. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOB, DISABLE);
  8506. 80257ee: 2002 movs r0, #2
  8507. 80257f0: e03f b.n 8025872 <GPIO_DeInit+0xa6>
  8508. }
  8509. else if (GPIOx == GPIOC)
  8510. 80257f2: 4b25 ldr r3, [pc, #148] ; (8025888 <GPIO_DeInit+0xbc>)
  8511. 80257f4: 4298 cmp r0, r3
  8512. 80257f6: d105 bne.n 8025804 <GPIO_DeInit+0x38>
  8513. {
  8514. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOC, ENABLE);
  8515. 80257f8: 2004 movs r0, #4
  8516. 80257fa: 2101 movs r1, #1
  8517. 80257fc: f000 f962 bl 8025ac4 <RCC_AHB1PeriphResetCmd>
  8518. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOC, DISABLE);
  8519. 8025800: 2004 movs r0, #4
  8520. 8025802: e036 b.n 8025872 <GPIO_DeInit+0xa6>
  8521. }
  8522. else if (GPIOx == GPIOD)
  8523. 8025804: 4b21 ldr r3, [pc, #132] ; (802588c <GPIO_DeInit+0xc0>)
  8524. 8025806: 4298 cmp r0, r3
  8525. 8025808: d105 bne.n 8025816 <GPIO_DeInit+0x4a>
  8526. {
  8527. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOD, ENABLE);
  8528. 802580a: 2008 movs r0, #8
  8529. 802580c: 2101 movs r1, #1
  8530. 802580e: f000 f959 bl 8025ac4 <RCC_AHB1PeriphResetCmd>
  8531. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOD, DISABLE);
  8532. 8025812: 2008 movs r0, #8
  8533. 8025814: e02d b.n 8025872 <GPIO_DeInit+0xa6>
  8534. }
  8535. else if (GPIOx == GPIOE)
  8536. 8025816: 4b1e ldr r3, [pc, #120] ; (8025890 <GPIO_DeInit+0xc4>)
  8537. 8025818: 4298 cmp r0, r3
  8538. 802581a: d105 bne.n 8025828 <GPIO_DeInit+0x5c>
  8539. {
  8540. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOE, ENABLE);
  8541. 802581c: 2010 movs r0, #16
  8542. 802581e: 2101 movs r1, #1
  8543. 8025820: f000 f950 bl 8025ac4 <RCC_AHB1PeriphResetCmd>
  8544. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOE, DISABLE);
  8545. 8025824: 2010 movs r0, #16
  8546. 8025826: e024 b.n 8025872 <GPIO_DeInit+0xa6>
  8547. }
  8548. else if (GPIOx == GPIOF)
  8549. 8025828: 4b1a ldr r3, [pc, #104] ; (8025894 <GPIO_DeInit+0xc8>)
  8550. 802582a: 4298 cmp r0, r3
  8551. 802582c: d105 bne.n 802583a <GPIO_DeInit+0x6e>
  8552. {
  8553. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOF, ENABLE);
  8554. 802582e: 2020 movs r0, #32
  8555. 8025830: 2101 movs r1, #1
  8556. 8025832: f000 f947 bl 8025ac4 <RCC_AHB1PeriphResetCmd>
  8557. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOF, DISABLE);
  8558. 8025836: 2020 movs r0, #32
  8559. 8025838: e01b b.n 8025872 <GPIO_DeInit+0xa6>
  8560. }
  8561. else if (GPIOx == GPIOG)
  8562. 802583a: 4b17 ldr r3, [pc, #92] ; (8025898 <GPIO_DeInit+0xcc>)
  8563. 802583c: 4298 cmp r0, r3
  8564. 802583e: d105 bne.n 802584c <GPIO_DeInit+0x80>
  8565. {
  8566. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOG, ENABLE);
  8567. 8025840: 2040 movs r0, #64 ; 0x40
  8568. 8025842: 2101 movs r1, #1
  8569. 8025844: f000 f93e bl 8025ac4 <RCC_AHB1PeriphResetCmd>
  8570. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOG, DISABLE);
  8571. 8025848: 2040 movs r0, #64 ; 0x40
  8572. 802584a: e012 b.n 8025872 <GPIO_DeInit+0xa6>
  8573. }
  8574. else if (GPIOx == GPIOH)
  8575. 802584c: 4b13 ldr r3, [pc, #76] ; (802589c <GPIO_DeInit+0xd0>)
  8576. 802584e: 4298 cmp r0, r3
  8577. 8025850: d105 bne.n 802585e <GPIO_DeInit+0x92>
  8578. {
  8579. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOH, ENABLE);
  8580. 8025852: 2080 movs r0, #128 ; 0x80
  8581. 8025854: 2101 movs r1, #1
  8582. 8025856: f000 f935 bl 8025ac4 <RCC_AHB1PeriphResetCmd>
  8583. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOH, DISABLE);
  8584. 802585a: 2080 movs r0, #128 ; 0x80
  8585. 802585c: e009 b.n 8025872 <GPIO_DeInit+0xa6>
  8586. }
  8587. else
  8588. {
  8589. if (GPIOx == GPIOI)
  8590. 802585e: 4b10 ldr r3, [pc, #64] ; (80258a0 <GPIO_DeInit+0xd4>)
  8591. 8025860: 4298 cmp r0, r3
  8592. 8025862: d10b bne.n 802587c <GPIO_DeInit+0xb0>
  8593. {
  8594. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOI, ENABLE);
  8595. 8025864: f44f 7080 mov.w r0, #256 ; 0x100
  8596. 8025868: 2101 movs r1, #1
  8597. 802586a: f000 f92b bl 8025ac4 <RCC_AHB1PeriphResetCmd>
  8598. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOI, DISABLE);
  8599. 802586e: f44f 7080 mov.w r0, #256 ; 0x100
  8600. 8025872: 2100 movs r1, #0
  8601. }
  8602. }
  8603. }
  8604. 8025874: e8bd 4008 ldmia.w sp!, {r3, lr}
  8605. else
  8606. {
  8607. if (GPIOx == GPIOI)
  8608. {
  8609. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOI, ENABLE);
  8610. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOI, DISABLE);
  8611. 8025878: f000 b924 b.w 8025ac4 <RCC_AHB1PeriphResetCmd>
  8612. 802587c: bd08 pop {r3, pc}
  8613. 802587e: bf00 nop
  8614. 8025880: 40020000 .word 0x40020000
  8615. 8025884: 40020400 .word 0x40020400
  8616. 8025888: 40020800 .word 0x40020800
  8617. 802588c: 40020c00 .word 0x40020c00
  8618. 8025890: 40021000 .word 0x40021000
  8619. 8025894: 40021400 .word 0x40021400
  8620. 8025898: 40021800 .word 0x40021800
  8621. 802589c: 40021c00 .word 0x40021c00
  8622. 80258a0: 40022000 .word 0x40022000
  8623. 080258a4 <GPIO_Init>:
  8624. * @param GPIO_InitStruct: pointer to a GPIO_InitTypeDef structure that contains
  8625. * the configuration information for the specified GPIO peripheral.
  8626. * @retval None
  8627. */
  8628. void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
  8629. {
  8630. 80258a4: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
  8631. /*-- GPIO Mode Configuration --*/
  8632. for (pinpos = 0x00; pinpos < 0x10; pinpos++)
  8633. {
  8634. pos = ((uint32_t)0x01) << pinpos;
  8635. /* Get the port pins position */
  8636. currentpin = (GPIO_InitStruct->GPIO_Pin) & pos;
  8637. 80258a8: 680f ldr r7, [r1, #0]
  8638. assert_param(IS_GPIO_MODE(GPIO_InitStruct->GPIO_Mode));
  8639. assert_param(IS_GPIO_PUPD(GPIO_InitStruct->GPIO_PuPd));
  8640. /* -------------------------Configure the port pins---------------- */
  8641. /*-- GPIO Mode Configuration --*/
  8642. for (pinpos = 0x00; pinpos < 0x10; pinpos++)
  8643. 80258aa: 2300 movs r3, #0
  8644. {
  8645. pos = ((uint32_t)0x01) << pinpos;
  8646. 80258ac: f04f 0c01 mov.w ip, #1
  8647. /* Get the port pins position */
  8648. currentpin = (GPIO_InitStruct->GPIO_Pin) & pos;
  8649. if (currentpin == pos)
  8650. {
  8651. GPIOx->MODER &= ~(GPIO_MODER_MODER0 << (pinpos * 2));
  8652. 80258b0: f04f 0803 mov.w r8, #3
  8653. /* -------------------------Configure the port pins---------------- */
  8654. /*-- GPIO Mode Configuration --*/
  8655. for (pinpos = 0x00; pinpos < 0x10; pinpos++)
  8656. {
  8657. pos = ((uint32_t)0x01) << pinpos;
  8658. 80258b4: fa0c f203 lsl.w r2, ip, r3
  8659. /* Get the port pins position */
  8660. currentpin = (GPIO_InitStruct->GPIO_Pin) & pos;
  8661. 80258b8: ea02 0507 and.w r5, r2, r7
  8662. if (currentpin == pos)
  8663. 80258bc: 4295 cmp r5, r2
  8664. 80258be: d131 bne.n 8025924 <GPIO_Init+0x80>
  8665. * @param GPIOx: where x can be (A..I) to select the GPIO peripheral.
  8666. * @param GPIO_InitStruct: pointer to a GPIO_InitTypeDef structure that contains
  8667. * the configuration information for the specified GPIO peripheral.
  8668. * @retval None
  8669. */
  8670. void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
  8671. 80258c0: 005a lsls r2, r3, #1
  8672. /* Get the port pins position */
  8673. currentpin = (GPIO_InitStruct->GPIO_Pin) & pos;
  8674. if (currentpin == pos)
  8675. {
  8676. GPIOx->MODER &= ~(GPIO_MODER_MODER0 << (pinpos * 2));
  8677. 80258c2: 6806 ldr r6, [r0, #0]
  8678. 80258c4: fa08 f402 lsl.w r4, r8, r2
  8679. 80258c8: 43e4 mvns r4, r4
  8680. 80258ca: 4026 ands r6, r4
  8681. 80258cc: 6006 str r6, [r0, #0]
  8682. GPIOx->MODER |= (((uint32_t)GPIO_InitStruct->GPIO_Mode) << (pinpos * 2));
  8683. 80258ce: 790e ldrb r6, [r1, #4]
  8684. 80258d0: f8d0 9000 ldr.w r9, [r0]
  8685. 80258d4: fa06 fa02 lsl.w sl, r6, r2
  8686. if ((GPIO_InitStruct->GPIO_Mode == GPIO_Mode_OUT) || (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_AF))
  8687. 80258d8: 3e01 subs r6, #1
  8688. currentpin = (GPIO_InitStruct->GPIO_Pin) & pos;
  8689. if (currentpin == pos)
  8690. {
  8691. GPIOx->MODER &= ~(GPIO_MODER_MODER0 << (pinpos * 2));
  8692. GPIOx->MODER |= (((uint32_t)GPIO_InitStruct->GPIO_Mode) << (pinpos * 2));
  8693. 80258da: ea4a 0909 orr.w r9, sl, r9
  8694. if ((GPIO_InitStruct->GPIO_Mode == GPIO_Mode_OUT) || (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_AF))
  8695. 80258de: 2e01 cmp r6, #1
  8696. currentpin = (GPIO_InitStruct->GPIO_Pin) & pos;
  8697. if (currentpin == pos)
  8698. {
  8699. GPIOx->MODER &= ~(GPIO_MODER_MODER0 << (pinpos * 2));
  8700. GPIOx->MODER |= (((uint32_t)GPIO_InitStruct->GPIO_Mode) << (pinpos * 2));
  8701. 80258e0: f8c0 9000 str.w r9, [r0]
  8702. if ((GPIO_InitStruct->GPIO_Mode == GPIO_Mode_OUT) || (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_AF))
  8703. 80258e4: d815 bhi.n 8025912 <GPIO_Init+0x6e>
  8704. {
  8705. /* Check Speed mode parameters */
  8706. assert_param(IS_GPIO_SPEED(GPIO_InitStruct->GPIO_Speed));
  8707. /* Speed mode configuration */
  8708. GPIOx->OSPEEDR &= ~(GPIO_OSPEEDER_OSPEEDR0 << (pinpos * 2));
  8709. 80258e6: 6886 ldr r6, [r0, #8]
  8710. GPIOx->OSPEEDR |= ((uint32_t)(GPIO_InitStruct->GPIO_Speed) << (pinpos * 2));
  8711. 80258e8: f891 9005 ldrb.w r9, [r1, #5]
  8712. {
  8713. /* Check Speed mode parameters */
  8714. assert_param(IS_GPIO_SPEED(GPIO_InitStruct->GPIO_Speed));
  8715. /* Speed mode configuration */
  8716. GPIOx->OSPEEDR &= ~(GPIO_OSPEEDER_OSPEEDR0 << (pinpos * 2));
  8717. 80258ec: 4026 ands r6, r4
  8718. 80258ee: 6086 str r6, [r0, #8]
  8719. GPIOx->OSPEEDR |= ((uint32_t)(GPIO_InitStruct->GPIO_Speed) << (pinpos * 2));
  8720. 80258f0: 6886 ldr r6, [r0, #8]
  8721. 80258f2: fa09 f902 lsl.w r9, r9, r2
  8722. 80258f6: ea49 0606 orr.w r6, r9, r6
  8723. 80258fa: 6086 str r6, [r0, #8]
  8724. /* Check Output mode parameters */
  8725. assert_param(IS_GPIO_OTYPE(GPIO_InitStruct->GPIO_OType));
  8726. /* Output mode configuration*/
  8727. GPIOx->OTYPER &= ~((GPIO_OTYPER_OT_0) << ((uint16_t)pinpos)) ;
  8728. 80258fc: 6846 ldr r6, [r0, #4]
  8729. 80258fe: ea26 0505 bic.w r5, r6, r5
  8730. 8025902: 6045 str r5, [r0, #4]
  8731. GPIOx->OTYPER |= (uint16_t)(((uint16_t)GPIO_InitStruct->GPIO_OType) << ((uint16_t)pinpos));
  8732. 8025904: 798d ldrb r5, [r1, #6]
  8733. 8025906: 6846 ldr r6, [r0, #4]
  8734. 8025908: fa05 f503 lsl.w r5, r5, r3
  8735. temp = ((uint32_t)(GPIO_AF) << ((uint32_t)((uint32_t)GPIO_PinSource & (uint32_t)0x07) * 4)) ;
  8736. GPIOx->AFR[GPIO_PinSource >> 0x03] &= ~((uint32_t)0xF << ((uint32_t)((uint32_t)GPIO_PinSource & (uint32_t)0x07) * 4)) ;
  8737. temp_2 = GPIOx->AFR[GPIO_PinSource >> 0x03] | temp;
  8738. GPIOx->AFR[GPIO_PinSource >> 0x03] = temp_2;
  8739. }
  8740. 802590c: b2ad uxth r5, r5
  8741. /* Check Output mode parameters */
  8742. assert_param(IS_GPIO_OTYPE(GPIO_InitStruct->GPIO_OType));
  8743. /* Output mode configuration*/
  8744. GPIOx->OTYPER &= ~((GPIO_OTYPER_OT_0) << ((uint16_t)pinpos)) ;
  8745. GPIOx->OTYPER |= (uint16_t)(((uint16_t)GPIO_InitStruct->GPIO_OType) << ((uint16_t)pinpos));
  8746. 802590e: 4335 orrs r5, r6
  8747. 8025910: 6045 str r5, [r0, #4]
  8748. }
  8749. /* Pull-up Pull down resistor configuration*/
  8750. GPIOx->PUPDR &= ~(GPIO_PUPDR_PUPDR0 << ((uint16_t)pinpos * 2));
  8751. 8025912: 68c5 ldr r5, [r0, #12]
  8752. 8025914: 402c ands r4, r5
  8753. 8025916: 60c4 str r4, [r0, #12]
  8754. GPIOx->PUPDR |= (((uint32_t)GPIO_InitStruct->GPIO_PuPd) << (pinpos * 2));
  8755. 8025918: 79cd ldrb r5, [r1, #7]
  8756. 802591a: 68c4 ldr r4, [r0, #12]
  8757. 802591c: fa05 f202 lsl.w r2, r5, r2
  8758. 8025920: 4322 orrs r2, r4
  8759. 8025922: 60c2 str r2, [r0, #12]
  8760. assert_param(IS_GPIO_MODE(GPIO_InitStruct->GPIO_Mode));
  8761. assert_param(IS_GPIO_PUPD(GPIO_InitStruct->GPIO_PuPd));
  8762. /* -------------------------Configure the port pins---------------- */
  8763. /*-- GPIO Mode Configuration --*/
  8764. for (pinpos = 0x00; pinpos < 0x10; pinpos++)
  8765. 8025924: 3301 adds r3, #1
  8766. 8025926: 2b10 cmp r3, #16
  8767. 8025928: d1c4 bne.n 80258b4 <GPIO_Init+0x10>
  8768. /* Pull-up Pull down resistor configuration*/
  8769. GPIOx->PUPDR &= ~(GPIO_PUPDR_PUPDR0 << ((uint16_t)pinpos * 2));
  8770. GPIOx->PUPDR |= (((uint32_t)GPIO_InitStruct->GPIO_PuPd) << (pinpos * 2));
  8771. }
  8772. }
  8773. }
  8774. 802592a: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc}
  8775. 0802592e <GPIO_SetBits>:
  8776. {
  8777. /* Check the parameters */
  8778. assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
  8779. assert_param(IS_GPIO_PIN(GPIO_Pin));
  8780. GPIOx->BSRRL = GPIO_Pin;
  8781. 802592e: 8301 strh r1, [r0, #24]
  8782. 8025930: 4770 bx lr
  8783. 08025932 <GPIO_ResetBits>:
  8784. {
  8785. /* Check the parameters */
  8786. assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
  8787. assert_param(IS_GPIO_PIN(GPIO_Pin));
  8788. GPIOx->BSRRH = GPIO_Pin;
  8789. 8025932: 8341 strh r1, [r0, #26]
  8790. 8025934: 4770 bx lr
  8791. 08025936 <GPIO_PinAFConfig>:
  8792. /* Check the parameters */
  8793. assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
  8794. assert_param(IS_GPIO_PIN_SOURCE(GPIO_PinSource));
  8795. assert_param(IS_GPIO_AF(GPIO_AF));
  8796. temp = ((uint32_t)(GPIO_AF) << ((uint32_t)((uint32_t)GPIO_PinSource & (uint32_t)0x07) * 4)) ;
  8797. 8025936: f001 0307 and.w r3, r1, #7
  8798. GPIOx->AFR[GPIO_PinSource >> 0x03] &= ~((uint32_t)0xF << ((uint32_t)((uint32_t)GPIO_PinSource & (uint32_t)0x07) * 4)) ;
  8799. 802593a: 08c9 lsrs r1, r1, #3
  8800. 802593c: 3108 adds r1, #8
  8801. * @arg GPIO_AF_DCMI: Connect DCMI pins to AF13
  8802. * @arg GPIO_AF_EVENTOUT: Connect EVENTOUT pins to AF15
  8803. * @retval None
  8804. */
  8805. void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF)
  8806. {
  8807. 802593e: b530 push {r4, r5, lr}
  8808. /* Check the parameters */
  8809. assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
  8810. assert_param(IS_GPIO_PIN_SOURCE(GPIO_PinSource));
  8811. assert_param(IS_GPIO_AF(GPIO_AF));
  8812. temp = ((uint32_t)(GPIO_AF) << ((uint32_t)((uint32_t)GPIO_PinSource & (uint32_t)0x07) * 4)) ;
  8813. 8025940: 009b lsls r3, r3, #2
  8814. GPIOx->AFR[GPIO_PinSource >> 0x03] &= ~((uint32_t)0xF << ((uint32_t)((uint32_t)GPIO_PinSource & (uint32_t)0x07) * 4)) ;
  8815. 8025942: f850 5021 ldr.w r5, [r0, r1, lsl #2]
  8816. 8025946: 240f movs r4, #15
  8817. 8025948: fa04 f403 lsl.w r4, r4, r3
  8818. 802594c: ea25 0404 bic.w r4, r5, r4
  8819. 8025950: f840 4021 str.w r4, [r0, r1, lsl #2]
  8820. temp_2 = GPIOx->AFR[GPIO_PinSource >> 0x03] | temp;
  8821. 8025954: f850 4021 ldr.w r4, [r0, r1, lsl #2]
  8822. /* Check the parameters */
  8823. assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
  8824. assert_param(IS_GPIO_PIN_SOURCE(GPIO_PinSource));
  8825. assert_param(IS_GPIO_AF(GPIO_AF));
  8826. temp = ((uint32_t)(GPIO_AF) << ((uint32_t)((uint32_t)GPIO_PinSource & (uint32_t)0x07) * 4)) ;
  8827. 8025958: fa02 f203 lsl.w r2, r2, r3
  8828. GPIOx->AFR[GPIO_PinSource >> 0x03] &= ~((uint32_t)0xF << ((uint32_t)((uint32_t)GPIO_PinSource & (uint32_t)0x07) * 4)) ;
  8829. temp_2 = GPIOx->AFR[GPIO_PinSource >> 0x03] | temp;
  8830. 802595c: 4314 orrs r4, r2
  8831. GPIOx->AFR[GPIO_PinSource >> 0x03] = temp_2;
  8832. 802595e: f840 4021 str.w r4, [r0, r1, lsl #2]
  8833. 8025962: bd30 pop {r4, r5, pc}
  8834. 08025964 <PWR_BackupAccessCmd>:
  8835. void PWR_BackupAccessCmd(FunctionalState NewState)
  8836. {
  8837. /* Check the parameters */
  8838. assert_param(IS_FUNCTIONAL_STATE(NewState));
  8839. *(__IO uint32_t *) CR_DBP_BB = (uint32_t)NewState;
  8840. 8025964: 4b01 ldr r3, [pc, #4] ; (802596c <PWR_BackupAccessCmd+0x8>)
  8841. 8025966: 6018 str r0, [r3, #0]
  8842. 8025968: 4770 bx lr
  8843. 802596a: bf00 nop
  8844. 802596c: 420e0020 .word 0x420e0020
  8845. 08025970 <RCC_LSEConfig>:
  8846. /* Check the parameters */
  8847. assert_param(IS_RCC_LSE(RCC_LSE));
  8848. /* Reset LSEON and LSEBYP bits before configuring the LSE ------------------*/
  8849. /* Reset LSEON bit */
  8850. *(__IO uint8_t *) BDCR_ADDRESS = RCC_LSE_OFF;
  8851. 8025970: 4b06 ldr r3, [pc, #24] ; (802598c <RCC_LSEConfig+0x1c>)
  8852. 8025972: 2200 movs r2, #0
  8853. /* Reset LSEBYP bit */
  8854. *(__IO uint8_t *) BDCR_ADDRESS = RCC_LSE_OFF;
  8855. /* Configure LSE (RCC_LSE_OFF is already covered by the code section above) */
  8856. switch (RCC_LSE)
  8857. 8025974: 2801 cmp r0, #1
  8858. /* Check the parameters */
  8859. assert_param(IS_RCC_LSE(RCC_LSE));
  8860. /* Reset LSEON and LSEBYP bits before configuring the LSE ------------------*/
  8861. /* Reset LSEON bit */
  8862. *(__IO uint8_t *) BDCR_ADDRESS = RCC_LSE_OFF;
  8863. 8025976: 701a strb r2, [r3, #0]
  8864. /* Reset LSEBYP bit */
  8865. *(__IO uint8_t *) BDCR_ADDRESS = RCC_LSE_OFF;
  8866. 8025978: 701a strb r2, [r3, #0]
  8867. /* Configure LSE (RCC_LSE_OFF is already covered by the code section above) */
  8868. switch (RCC_LSE)
  8869. 802597a: d002 beq.n 8025982 <RCC_LSEConfig+0x12>
  8870. 802597c: 2804 cmp r0, #4
  8871. 802597e: d104 bne.n 802598a <RCC_LSEConfig+0x1a>
  8872. 8025980: e001 b.n 8025986 <RCC_LSEConfig+0x16>
  8873. {
  8874. case RCC_LSE_ON:
  8875. /* Set LSEON bit */
  8876. *(__IO uint8_t *) BDCR_ADDRESS = RCC_LSE_ON;
  8877. 8025982: 7018 strb r0, [r3, #0]
  8878. break;
  8879. 8025984: 4770 bx lr
  8880. case RCC_LSE_Bypass:
  8881. /* Set LSEBYP and LSEON bits */
  8882. *(__IO uint8_t *) BDCR_ADDRESS = RCC_LSE_Bypass | RCC_LSE_ON;
  8883. 8025986: 2205 movs r2, #5
  8884. 8025988: 701a strb r2, [r3, #0]
  8885. 802598a: 4770 bx lr
  8886. 802598c: 40023870 .word 0x40023870
  8887. 08025990 <RCC_LSICmd>:
  8888. void RCC_LSICmd(FunctionalState NewState)
  8889. {
  8890. /* Check the parameters */
  8891. assert_param(IS_FUNCTIONAL_STATE(NewState));
  8892. *(__IO uint32_t *) CSR_LSION_BB = (uint32_t)NewState;
  8893. 8025990: 4b01 ldr r3, [pc, #4] ; (8025998 <RCC_LSICmd+0x8>)
  8894. 8025992: 6018 str r0, [r3, #0]
  8895. 8025994: 4770 bx lr
  8896. 8025996: bf00 nop
  8897. 8025998: 42470e80 .word 0x42470e80
  8898. 0802599c <RCC_GetClocksFreq>:
  8899. void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks)
  8900. {
  8901. uint32_t tmp = 0, presc = 0, pllvco = 0, pllp = 2, pllsource = 0, pllm = 2;
  8902. /* Get SYSCLK source -------------------------------------------------------*/
  8903. tmp = RCC->CFGR & RCC_CFGR_SWS;
  8904. 802599c: 4b1e ldr r3, [pc, #120] ; (8025a18 <RCC_GetClocksFreq+0x7c>)
  8905. 802599e: 689a ldr r2, [r3, #8]
  8906. 80259a0: f002 020c and.w r2, r2, #12
  8907. switch (tmp)
  8908. 80259a4: 2a04 cmp r2, #4
  8909. * configuration based on this function will be incorrect.
  8910. *
  8911. * @retval None
  8912. */
  8913. void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks)
  8914. {
  8915. 80259a6: b510 push {r4, lr}
  8916. uint32_t tmp = 0, presc = 0, pllvco = 0, pllp = 2, pllsource = 0, pllm = 2;
  8917. /* Get SYSCLK source -------------------------------------------------------*/
  8918. tmp = RCC->CFGR & RCC_CFGR_SWS;
  8919. switch (tmp)
  8920. 80259a8: d003 beq.n 80259b2 <RCC_GetClocksFreq+0x16>
  8921. 80259aa: 2a08 cmp r2, #8
  8922. 80259ac: d003 beq.n 80259b6 <RCC_GetClocksFreq+0x1a>
  8923. 80259ae: 4b1b ldr r3, [pc, #108] ; (8025a1c <RCC_GetClocksFreq+0x80>)
  8924. 80259b0: e018 b.n 80259e4 <RCC_GetClocksFreq+0x48>
  8925. {
  8926. case 0x00: /* HSI used as system clock source */
  8927. RCC_Clocks->SYSCLK_Frequency = HSI_VALUE;
  8928. break;
  8929. case 0x04: /* HSE used as system clock source */
  8930. RCC_Clocks->SYSCLK_Frequency = HSE_VALUE;
  8931. 80259b2: 4b1b ldr r3, [pc, #108] ; (8025a20 <RCC_GetClocksFreq+0x84>)
  8932. 80259b4: e016 b.n 80259e4 <RCC_GetClocksFreq+0x48>
  8933. case 0x08: /* PLL used as system clock source */
  8934. /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN
  8935. SYSCLK = PLL_VCO / PLLP
  8936. */
  8937. pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> 22;
  8938. 80259b6: 6859 ldr r1, [r3, #4]
  8939. pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM;
  8940. 80259b8: 685a ldr r2, [r3, #4]
  8941. if (pllsource != 0)
  8942. 80259ba: f411 0f80 tst.w r1, #4194304 ; 0x400000
  8943. {
  8944. /* HSE used as PLL clock source */
  8945. pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6);
  8946. 80259be: 6859 ldr r1, [r3, #4]
  8947. 80259c0: bf14 ite ne
  8948. 80259c2: 4b17 ldrne r3, [pc, #92] ; (8025a20 <RCC_GetClocksFreq+0x84>)
  8949. }
  8950. else
  8951. {
  8952. /* HSI used as PLL clock source */
  8953. pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6);
  8954. 80259c4: 4b15 ldreq r3, [pc, #84] ; (8025a1c <RCC_GetClocksFreq+0x80>)
  8955. /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN
  8956. SYSCLK = PLL_VCO / PLLP
  8957. */
  8958. pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> 22;
  8959. pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM;
  8960. 80259c6: f002 023f and.w r2, r2, #63 ; 0x3f
  8961. pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6);
  8962. }
  8963. else
  8964. {
  8965. /* HSI used as PLL clock source */
  8966. pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6);
  8967. 80259ca: fbb3 f3f2 udiv r3, r3, r2
  8968. }
  8969. pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2;
  8970. 80259ce: 4a12 ldr r2, [pc, #72] ; (8025a18 <RCC_GetClocksFreq+0x7c>)
  8971. 80259d0: 6852 ldr r2, [r2, #4]
  8972. 80259d2: f3c2 4201 ubfx r2, r2, #16, #2
  8973. pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM;
  8974. if (pllsource != 0)
  8975. {
  8976. /* HSE used as PLL clock source */
  8977. pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6);
  8978. 80259d6: f3c1 1188 ubfx r1, r1, #6, #9
  8979. {
  8980. /* HSI used as PLL clock source */
  8981. pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6);
  8982. }
  8983. pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2;
  8984. 80259da: 3201 adds r2, #1
  8985. pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6);
  8986. }
  8987. else
  8988. {
  8989. /* HSI used as PLL clock source */
  8990. pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6);
  8991. 80259dc: 434b muls r3, r1
  8992. }
  8993. pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2;
  8994. 80259de: 0052 lsls r2, r2, #1
  8995. RCC_Clocks->SYSCLK_Frequency = pllvco/pllp;
  8996. 80259e0: fbb3 f3f2 udiv r3, r3, r2
  8997. break;
  8998. }
  8999. /* Compute HCLK, PCLK1 and PCLK2 clocks frequencies ------------------------*/
  9000. /* Get HCLK prescaler */
  9001. tmp = RCC->CFGR & RCC_CFGR_HPRE;
  9002. 80259e4: 490c ldr r1, [pc, #48] ; (8025a18 <RCC_GetClocksFreq+0x7c>)
  9003. /* HSI used as PLL clock source */
  9004. pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6);
  9005. }
  9006. pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2;
  9007. RCC_Clocks->SYSCLK_Frequency = pllvco/pllp;
  9008. 80259e6: 6003 str r3, [r0, #0]
  9009. break;
  9010. }
  9011. /* Compute HCLK, PCLK1 and PCLK2 clocks frequencies ------------------------*/
  9012. /* Get HCLK prescaler */
  9013. tmp = RCC->CFGR & RCC_CFGR_HPRE;
  9014. 80259e8: 688b ldr r3, [r1, #8]
  9015. tmp = tmp >> 4;
  9016. presc = APBAHBPrescTable[tmp];
  9017. 80259ea: 4a0e ldr r2, [pc, #56] ; (8025a24 <RCC_GetClocksFreq+0x88>)
  9018. }
  9019. /* Compute HCLK, PCLK1 and PCLK2 clocks frequencies ------------------------*/
  9020. /* Get HCLK prescaler */
  9021. tmp = RCC->CFGR & RCC_CFGR_HPRE;
  9022. tmp = tmp >> 4;
  9023. 80259ec: f3c3 1303 ubfx r3, r3, #4, #4
  9024. presc = APBAHBPrescTable[tmp];
  9025. 80259f0: 5cd4 ldrb r4, [r2, r3]
  9026. /* HCLK clock frequency */
  9027. RCC_Clocks->HCLK_Frequency = RCC_Clocks->SYSCLK_Frequency >> presc;
  9028. 80259f2: 6803 ldr r3, [r0, #0]
  9029. 80259f4: fa23 f304 lsr.w r3, r3, r4
  9030. 80259f8: 6043 str r3, [r0, #4]
  9031. /* Get PCLK1 prescaler */
  9032. tmp = RCC->CFGR & RCC_CFGR_PPRE1;
  9033. 80259fa: 688c ldr r4, [r1, #8]
  9034. tmp = tmp >> 10;
  9035. 80259fc: f3c4 2482 ubfx r4, r4, #10, #3
  9036. presc = APBAHBPrescTable[tmp];
  9037. 8025a00: 5d14 ldrb r4, [r2, r4]
  9038. /* PCLK1 clock frequency */
  9039. RCC_Clocks->PCLK1_Frequency = RCC_Clocks->HCLK_Frequency >> presc;
  9040. 8025a02: fa23 f404 lsr.w r4, r3, r4
  9041. 8025a06: 6084 str r4, [r0, #8]
  9042. /* Get PCLK2 prescaler */
  9043. tmp = RCC->CFGR & RCC_CFGR_PPRE2;
  9044. 8025a08: 6889 ldr r1, [r1, #8]
  9045. tmp = tmp >> 13;
  9046. 8025a0a: f3c1 3142 ubfx r1, r1, #13, #3
  9047. presc = APBAHBPrescTable[tmp];
  9048. 8025a0e: 5c52 ldrb r2, [r2, r1]
  9049. /* PCLK2 clock frequency */
  9050. RCC_Clocks->PCLK2_Frequency = RCC_Clocks->HCLK_Frequency >> presc;
  9051. 8025a10: fa23 f302 lsr.w r3, r3, r2
  9052. 8025a14: 60c3 str r3, [r0, #12]
  9053. 8025a16: bd10 pop {r4, pc}
  9054. 8025a18: 40023800 .word 0x40023800
  9055. 8025a1c: 00f42400 .word 0x00f42400
  9056. 8025a20: 017d7840 .word 0x017d7840
  9057. 8025a24: 200005ac .word 0x200005ac
  9058. 08025a28 <RCC_RTCCLKConfig>:
  9059. uint32_t tmpreg = 0;
  9060. /* Check the parameters */
  9061. assert_param(IS_RCC_RTCCLK_SOURCE(RCC_RTCCLKSource));
  9062. if ((RCC_RTCCLKSource & 0x00000300) == 0x00000300)
  9063. 8025a28: f400 7340 and.w r3, r0, #768 ; 0x300
  9064. 8025a2c: f5b3 7f40 cmp.w r3, #768 ; 0x300
  9065. 8025a30: 4b08 ldr r3, [pc, #32] ; (8025a54 <RCC_RTCCLKConfig+0x2c>)
  9066. 8025a32: d108 bne.n 8025a46 <RCC_RTCCLKConfig+0x1e>
  9067. { /* If HSE is selected as RTC clock source, configure HSE division factor for RTC clock */
  9068. tmpreg = RCC->CFGR;
  9069. 8025a34: 6899 ldr r1, [r3, #8]
  9070. /* Clear RTCPRE[4:0] bits */
  9071. tmpreg &= ~RCC_CFGR_RTCPRE;
  9072. /* Configure HSE division factor for RTC clock */
  9073. tmpreg |= (RCC_RTCCLKSource & 0xFFFFCFF);
  9074. 8025a36: f020 4270 bic.w r2, r0, #4026531840 ; 0xf0000000
  9075. if ((RCC_RTCCLKSource & 0x00000300) == 0x00000300)
  9076. { /* If HSE is selected as RTC clock source, configure HSE division factor for RTC clock */
  9077. tmpreg = RCC->CFGR;
  9078. /* Clear RTCPRE[4:0] bits */
  9079. tmpreg &= ~RCC_CFGR_RTCPRE;
  9080. 8025a3a: f421 11f8 bic.w r1, r1, #2031616 ; 0x1f0000
  9081. /* Configure HSE division factor for RTC clock */
  9082. tmpreg |= (RCC_RTCCLKSource & 0xFFFFCFF);
  9083. 8025a3e: f422 7240 bic.w r2, r2, #768 ; 0x300
  9084. 8025a42: 430a orrs r2, r1
  9085. /* Store the new value */
  9086. RCC->CFGR = tmpreg;
  9087. 8025a44: 609a str r2, [r3, #8]
  9088. }
  9089. /* Select the RTC clock source */
  9090. RCC->BDCR |= (RCC_RTCCLKSource & 0x00000FFF);
  9091. 8025a46: 6f1a ldr r2, [r3, #112] ; 0x70
  9092. 8025a48: 0500 lsls r0, r0, #20
  9093. 8025a4a: ea42 5010 orr.w r0, r2, r0, lsr #20
  9094. 8025a4e: 6718 str r0, [r3, #112] ; 0x70
  9095. 8025a50: 4770 bx lr
  9096. 8025a52: bf00 nop
  9097. 8025a54: 40023800 .word 0x40023800
  9098. 08025a58 <RCC_RTCCLKCmd>:
  9099. void RCC_RTCCLKCmd(FunctionalState NewState)
  9100. {
  9101. /* Check the parameters */
  9102. assert_param(IS_FUNCTIONAL_STATE(NewState));
  9103. *(__IO uint32_t *) BDCR_RTCEN_BB = (uint32_t)NewState;
  9104. 8025a58: 4b01 ldr r3, [pc, #4] ; (8025a60 <RCC_RTCCLKCmd+0x8>)
  9105. 8025a5a: 6018 str r0, [r3, #0]
  9106. 8025a5c: 4770 bx lr
  9107. 8025a5e: bf00 nop
  9108. 8025a60: 42470e3c .word 0x42470e3c
  9109. 08025a64 <RCC_AHB1PeriphClockCmd>:
  9110. * @param NewState: new state of the specified peripheral clock.
  9111. * This parameter can be: ENABLE or DISABLE.
  9112. * @retval None
  9113. */
  9114. void RCC_AHB1PeriphClockCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState)
  9115. {
  9116. 8025a64: 4b04 ldr r3, [pc, #16] ; (8025a78 <RCC_AHB1PeriphClockCmd+0x14>)
  9117. assert_param(IS_RCC_AHB1_CLOCK_PERIPH(RCC_AHB1Periph));
  9118. assert_param(IS_FUNCTIONAL_STATE(NewState));
  9119. if (NewState != DISABLE)
  9120. {
  9121. RCC->AHB1ENR |= RCC_AHB1Periph;
  9122. 8025a66: 6b1a ldr r2, [r3, #48] ; 0x30
  9123. {
  9124. /* Check the parameters */
  9125. assert_param(IS_RCC_AHB1_CLOCK_PERIPH(RCC_AHB1Periph));
  9126. assert_param(IS_FUNCTIONAL_STATE(NewState));
  9127. if (NewState != DISABLE)
  9128. 8025a68: b109 cbz r1, 8025a6e <RCC_AHB1PeriphClockCmd+0xa>
  9129. {
  9130. RCC->AHB1ENR |= RCC_AHB1Periph;
  9131. 8025a6a: 4310 orrs r0, r2
  9132. 8025a6c: e001 b.n 8025a72 <RCC_AHB1PeriphClockCmd+0xe>
  9133. }
  9134. else
  9135. {
  9136. RCC->AHB1ENR &= ~RCC_AHB1Periph;
  9137. 8025a6e: ea22 0000 bic.w r0, r2, r0
  9138. 8025a72: 6318 str r0, [r3, #48] ; 0x30
  9139. 8025a74: 4770 bx lr
  9140. 8025a76: bf00 nop
  9141. 8025a78: 40023800 .word 0x40023800
  9142. 08025a7c <RCC_AHB2PeriphClockCmd>:
  9143. * @param NewState: new state of the specified peripheral clock.
  9144. * This parameter can be: ENABLE or DISABLE.
  9145. * @retval None
  9146. */
  9147. void RCC_AHB2PeriphClockCmd(uint32_t RCC_AHB2Periph, FunctionalState NewState)
  9148. {
  9149. 8025a7c: 4b04 ldr r3, [pc, #16] ; (8025a90 <RCC_AHB2PeriphClockCmd+0x14>)
  9150. assert_param(IS_RCC_AHB2_PERIPH(RCC_AHB2Periph));
  9151. assert_param(IS_FUNCTIONAL_STATE(NewState));
  9152. if (NewState != DISABLE)
  9153. {
  9154. RCC->AHB2ENR |= RCC_AHB2Periph;
  9155. 8025a7e: 6b5a ldr r2, [r3, #52] ; 0x34
  9156. {
  9157. /* Check the parameters */
  9158. assert_param(IS_RCC_AHB2_PERIPH(RCC_AHB2Periph));
  9159. assert_param(IS_FUNCTIONAL_STATE(NewState));
  9160. if (NewState != DISABLE)
  9161. 8025a80: b109 cbz r1, 8025a86 <RCC_AHB2PeriphClockCmd+0xa>
  9162. {
  9163. RCC->AHB2ENR |= RCC_AHB2Periph;
  9164. 8025a82: 4310 orrs r0, r2
  9165. 8025a84: e001 b.n 8025a8a <RCC_AHB2PeriphClockCmd+0xe>
  9166. }
  9167. else
  9168. {
  9169. RCC->AHB2ENR &= ~RCC_AHB2Periph;
  9170. 8025a86: ea22 0000 bic.w r0, r2, r0
  9171. 8025a8a: 6358 str r0, [r3, #52] ; 0x34
  9172. 8025a8c: 4770 bx lr
  9173. 8025a8e: bf00 nop
  9174. 8025a90: 40023800 .word 0x40023800
  9175. 08025a94 <RCC_APB1PeriphClockCmd>:
  9176. * @param NewState: new state of the specified peripheral clock.
  9177. * This parameter can be: ENABLE or DISABLE.
  9178. * @retval None
  9179. */
  9180. void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState)
  9181. {
  9182. 8025a94: 4b04 ldr r3, [pc, #16] ; (8025aa8 <RCC_APB1PeriphClockCmd+0x14>)
  9183. assert_param(IS_RCC_APB1_PERIPH(RCC_APB1Periph));
  9184. assert_param(IS_FUNCTIONAL_STATE(NewState));
  9185. if (NewState != DISABLE)
  9186. {
  9187. RCC->APB1ENR |= RCC_APB1Periph;
  9188. 8025a96: 6c1a ldr r2, [r3, #64] ; 0x40
  9189. {
  9190. /* Check the parameters */
  9191. assert_param(IS_RCC_APB1_PERIPH(RCC_APB1Periph));
  9192. assert_param(IS_FUNCTIONAL_STATE(NewState));
  9193. if (NewState != DISABLE)
  9194. 8025a98: b109 cbz r1, 8025a9e <RCC_APB1PeriphClockCmd+0xa>
  9195. {
  9196. RCC->APB1ENR |= RCC_APB1Periph;
  9197. 8025a9a: 4310 orrs r0, r2
  9198. 8025a9c: e001 b.n 8025aa2 <RCC_APB1PeriphClockCmd+0xe>
  9199. }
  9200. else
  9201. {
  9202. RCC->APB1ENR &= ~RCC_APB1Periph;
  9203. 8025a9e: ea22 0000 bic.w r0, r2, r0
  9204. 8025aa2: 6418 str r0, [r3, #64] ; 0x40
  9205. 8025aa4: 4770 bx lr
  9206. 8025aa6: bf00 nop
  9207. 8025aa8: 40023800 .word 0x40023800
  9208. 08025aac <RCC_APB2PeriphClockCmd>:
  9209. * @param NewState: new state of the specified peripheral clock.
  9210. * This parameter can be: ENABLE or DISABLE.
  9211. * @retval None
  9212. */
  9213. void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
  9214. {
  9215. 8025aac: 4b04 ldr r3, [pc, #16] ; (8025ac0 <RCC_APB2PeriphClockCmd+0x14>)
  9216. assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph));
  9217. assert_param(IS_FUNCTIONAL_STATE(NewState));
  9218. if (NewState != DISABLE)
  9219. {
  9220. RCC->APB2ENR |= RCC_APB2Periph;
  9221. 8025aae: 6c5a ldr r2, [r3, #68] ; 0x44
  9222. {
  9223. /* Check the parameters */
  9224. assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph));
  9225. assert_param(IS_FUNCTIONAL_STATE(NewState));
  9226. if (NewState != DISABLE)
  9227. 8025ab0: b109 cbz r1, 8025ab6 <RCC_APB2PeriphClockCmd+0xa>
  9228. {
  9229. RCC->APB2ENR |= RCC_APB2Periph;
  9230. 8025ab2: 4310 orrs r0, r2
  9231. 8025ab4: e001 b.n 8025aba <RCC_APB2PeriphClockCmd+0xe>
  9232. }
  9233. else
  9234. {
  9235. RCC->APB2ENR &= ~RCC_APB2Periph;
  9236. 8025ab6: ea22 0000 bic.w r0, r2, r0
  9237. 8025aba: 6458 str r0, [r3, #68] ; 0x44
  9238. 8025abc: 4770 bx lr
  9239. 8025abe: bf00 nop
  9240. 8025ac0: 40023800 .word 0x40023800
  9241. 08025ac4 <RCC_AHB1PeriphResetCmd>:
  9242. * @param NewState: new state of the specified peripheral reset.
  9243. * This parameter can be: ENABLE or DISABLE.
  9244. * @retval None
  9245. */
  9246. void RCC_AHB1PeriphResetCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState)
  9247. {
  9248. 8025ac4: 4b04 ldr r3, [pc, #16] ; (8025ad8 <RCC_AHB1PeriphResetCmd+0x14>)
  9249. assert_param(IS_RCC_AHB1_RESET_PERIPH(RCC_AHB1Periph));
  9250. assert_param(IS_FUNCTIONAL_STATE(NewState));
  9251. if (NewState != DISABLE)
  9252. {
  9253. RCC->AHB1RSTR |= RCC_AHB1Periph;
  9254. 8025ac6: 691a ldr r2, [r3, #16]
  9255. {
  9256. /* Check the parameters */
  9257. assert_param(IS_RCC_AHB1_RESET_PERIPH(RCC_AHB1Periph));
  9258. assert_param(IS_FUNCTIONAL_STATE(NewState));
  9259. if (NewState != DISABLE)
  9260. 8025ac8: b109 cbz r1, 8025ace <RCC_AHB1PeriphResetCmd+0xa>
  9261. {
  9262. RCC->AHB1RSTR |= RCC_AHB1Periph;
  9263. 8025aca: 4310 orrs r0, r2
  9264. 8025acc: e001 b.n 8025ad2 <RCC_AHB1PeriphResetCmd+0xe>
  9265. }
  9266. else
  9267. {
  9268. RCC->AHB1RSTR &= ~RCC_AHB1Periph;
  9269. 8025ace: ea22 0000 bic.w r0, r2, r0
  9270. 8025ad2: 6118 str r0, [r3, #16]
  9271. 8025ad4: 4770 bx lr
  9272. 8025ad6: bf00 nop
  9273. 8025ad8: 40023800 .word 0x40023800
  9274. 08025adc <RCC_APB1PeriphResetCmd>:
  9275. * @param NewState: new state of the specified peripheral reset.
  9276. * This parameter can be: ENABLE or DISABLE.
  9277. * @retval None
  9278. */
  9279. void RCC_APB1PeriphResetCmd(uint32_t RCC_APB1Periph, FunctionalState NewState)
  9280. {
  9281. 8025adc: 4b04 ldr r3, [pc, #16] ; (8025af0 <RCC_APB1PeriphResetCmd+0x14>)
  9282. /* Check the parameters */
  9283. assert_param(IS_RCC_APB1_PERIPH(RCC_APB1Periph));
  9284. assert_param(IS_FUNCTIONAL_STATE(NewState));
  9285. if (NewState != DISABLE)
  9286. {
  9287. RCC->APB1RSTR |= RCC_APB1Periph;
  9288. 8025ade: 6a1a ldr r2, [r3, #32]
  9289. void RCC_APB1PeriphResetCmd(uint32_t RCC_APB1Periph, FunctionalState NewState)
  9290. {
  9291. /* Check the parameters */
  9292. assert_param(IS_RCC_APB1_PERIPH(RCC_APB1Periph));
  9293. assert_param(IS_FUNCTIONAL_STATE(NewState));
  9294. if (NewState != DISABLE)
  9295. 8025ae0: b109 cbz r1, 8025ae6 <RCC_APB1PeriphResetCmd+0xa>
  9296. {
  9297. RCC->APB1RSTR |= RCC_APB1Periph;
  9298. 8025ae2: 4310 orrs r0, r2
  9299. 8025ae4: e001 b.n 8025aea <RCC_APB1PeriphResetCmd+0xe>
  9300. }
  9301. else
  9302. {
  9303. RCC->APB1RSTR &= ~RCC_APB1Periph;
  9304. 8025ae6: ea22 0000 bic.w r0, r2, r0
  9305. 8025aea: 6218 str r0, [r3, #32]
  9306. 8025aec: 4770 bx lr
  9307. 8025aee: bf00 nop
  9308. 8025af0: 40023800 .word 0x40023800
  9309. 08025af4 <RCC_APB2PeriphResetCmd>:
  9310. * @param NewState: new state of the specified peripheral reset.
  9311. * This parameter can be: ENABLE or DISABLE.
  9312. * @retval None
  9313. */
  9314. void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
  9315. {
  9316. 8025af4: 4b04 ldr r3, [pc, #16] ; (8025b08 <RCC_APB2PeriphResetCmd+0x14>)
  9317. /* Check the parameters */
  9318. assert_param(IS_RCC_APB2_RESET_PERIPH(RCC_APB2Periph));
  9319. assert_param(IS_FUNCTIONAL_STATE(NewState));
  9320. if (NewState != DISABLE)
  9321. {
  9322. RCC->APB2RSTR |= RCC_APB2Periph;
  9323. 8025af6: 6a5a ldr r2, [r3, #36] ; 0x24
  9324. void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
  9325. {
  9326. /* Check the parameters */
  9327. assert_param(IS_RCC_APB2_RESET_PERIPH(RCC_APB2Periph));
  9328. assert_param(IS_FUNCTIONAL_STATE(NewState));
  9329. if (NewState != DISABLE)
  9330. 8025af8: b109 cbz r1, 8025afe <RCC_APB2PeriphResetCmd+0xa>
  9331. {
  9332. RCC->APB2RSTR |= RCC_APB2Periph;
  9333. 8025afa: 4310 orrs r0, r2
  9334. 8025afc: e001 b.n 8025b02 <RCC_APB2PeriphResetCmd+0xe>
  9335. }
  9336. else
  9337. {
  9338. RCC->APB2RSTR &= ~RCC_APB2Periph;
  9339. 8025afe: ea22 0000 bic.w r0, r2, r0
  9340. 8025b02: 6258 str r0, [r3, #36] ; 0x24
  9341. 8025b04: 4770 bx lr
  9342. 8025b06: bf00 nop
  9343. 8025b08: 40023800 .word 0x40023800
  9344. 08025b0c <RCC_GetFlagStatus>:
  9345. /* Check the parameters */
  9346. assert_param(IS_RCC_FLAG(RCC_FLAG));
  9347. /* Get the RCC register index */
  9348. tmp = RCC_FLAG >> 5;
  9349. 8025b0c: 0943 lsrs r3, r0, #5
  9350. if (tmp == 1) /* The flag to check is in CR register */
  9351. 8025b0e: 2b01 cmp r3, #1
  9352. 8025b10: 4a07 ldr r2, [pc, #28] ; (8025b30 <RCC_GetFlagStatus+0x24>)
  9353. 8025b12: d101 bne.n 8025b18 <RCC_GetFlagStatus+0xc>
  9354. {
  9355. statusreg = RCC->CR;
  9356. 8025b14: 6813 ldr r3, [r2, #0]
  9357. 8025b16: e003 b.n 8025b20 <RCC_GetFlagStatus+0x14>
  9358. }
  9359. else if (tmp == 2) /* The flag to check is in BDCR register */
  9360. 8025b18: 2b02 cmp r3, #2
  9361. {
  9362. statusreg = RCC->BDCR;
  9363. 8025b1a: bf0c ite eq
  9364. 8025b1c: 6f13 ldreq r3, [r2, #112] ; 0x70
  9365. }
  9366. else /* The flag to check is in CSR register */
  9367. {
  9368. statusreg = RCC->CSR;
  9369. 8025b1e: 6f53 ldrne r3, [r2, #116] ; 0x74
  9370. }
  9371. /* Get the flag position */
  9372. tmp = RCC_FLAG & FLAG_MASK;
  9373. if ((statusreg & ((uint32_t)1 << tmp)) != (uint32_t)RESET)
  9374. 8025b20: f000 001f and.w r0, r0, #31
  9375. 8025b24: fa23 f000 lsr.w r0, r3, r0
  9376. {
  9377. bitstatus = RESET;
  9378. }
  9379. /* Return the flag status */
  9380. return bitstatus;
  9381. }
  9382. 8025b28: f000 0001 and.w r0, r0, #1
  9383. 8025b2c: 4770 bx lr
  9384. 8025b2e: bf00 nop
  9385. 8025b30: 40023800 .word 0x40023800
  9386. 08025b34 <RNG_Cmd>:
  9387. * @param NewState: new state of the RNG peripheral.
  9388. * This parameter can be: ENABLE or DISABLE.
  9389. * @retval None
  9390. */
  9391. void RNG_Cmd(FunctionalState NewState)
  9392. {
  9393. 8025b34: 4b04 ldr r3, [pc, #16] ; (8025b48 <RNG_Cmd+0x14>)
  9394. assert_param(IS_FUNCTIONAL_STATE(NewState));
  9395. if (NewState != DISABLE)
  9396. {
  9397. /* Enable the RNG */
  9398. RNG->CR |= RNG_CR_RNGEN;
  9399. 8025b36: 681a ldr r2, [r3, #0]
  9400. void RNG_Cmd(FunctionalState NewState)
  9401. {
  9402. /* Check the parameters */
  9403. assert_param(IS_FUNCTIONAL_STATE(NewState));
  9404. if (NewState != DISABLE)
  9405. 8025b38: b110 cbz r0, 8025b40 <RNG_Cmd+0xc>
  9406. {
  9407. /* Enable the RNG */
  9408. RNG->CR |= RNG_CR_RNGEN;
  9409. 8025b3a: f042 0204 orr.w r2, r2, #4
  9410. 8025b3e: e001 b.n 8025b44 <RNG_Cmd+0x10>
  9411. }
  9412. else
  9413. {
  9414. /* Disable the RNG */
  9415. RNG->CR &= ~RNG_CR_RNGEN;
  9416. 8025b40: f022 0204 bic.w r2, r2, #4
  9417. 8025b44: 601a str r2, [r3, #0]
  9418. 8025b46: 4770 bx lr
  9419. 8025b48: 50060800 .word 0x50060800
  9420. 08025b4c <RNG_GetRandomNumber>:
  9421. * @retval 32-bit random number.
  9422. */
  9423. uint32_t RNG_GetRandomNumber(void)
  9424. {
  9425. /* Return the 32 bit random number from the DR register */
  9426. return RNG->DR;
  9427. 8025b4c: 4b01 ldr r3, [pc, #4] ; (8025b54 <RNG_GetRandomNumber+0x8>)
  9428. 8025b4e: 6898 ldr r0, [r3, #8]
  9429. }
  9430. 8025b50: 4770 bx lr
  9431. 8025b52: bf00 nop
  9432. 8025b54: 50060800 .word 0x50060800
  9433. 08025b58 <RTC_ByteToBcd2>:
  9434. * @param Value: Byte to be converted.
  9435. * @retval Converted byte
  9436. */
  9437. static uint8_t RTC_ByteToBcd2(uint8_t Value)
  9438. {
  9439. uint8_t bcdhigh = 0;
  9440. 8025b58: 2300 movs r3, #0
  9441. while (Value >= 10)
  9442. 8025b5a: e003 b.n 8025b64 <RTC_ByteToBcd2+0xc>
  9443. {
  9444. bcdhigh++;
  9445. 8025b5c: 3301 adds r3, #1
  9446. Value -= 10;
  9447. 8025b5e: 380a subs r0, #10
  9448. {
  9449. uint8_t bcdhigh = 0;
  9450. while (Value >= 10)
  9451. {
  9452. bcdhigh++;
  9453. 8025b60: b2db uxtb r3, r3
  9454. Value -= 10;
  9455. 8025b62: b2c0 uxtb r0, r0
  9456. */
  9457. static uint8_t RTC_ByteToBcd2(uint8_t Value)
  9458. {
  9459. uint8_t bcdhigh = 0;
  9460. while (Value >= 10)
  9461. 8025b64: 2809 cmp r0, #9
  9462. 8025b66: d8f9 bhi.n 8025b5c <RTC_ByteToBcd2+0x4>
  9463. {
  9464. bcdhigh++;
  9465. Value -= 10;
  9466. }
  9467. return ((uint8_t)(bcdhigh << 4) | Value);
  9468. 8025b68: ea40 1003 orr.w r0, r0, r3, lsl #4
  9469. }
  9470. 8025b6c: b2c0 uxtb r0, r0
  9471. 8025b6e: 4770 bx lr
  9472. 08025b70 <RTC_Bcd2ToByte>:
  9473. * @retval Converted word
  9474. */
  9475. static uint8_t RTC_Bcd2ToByte(uint8_t Value)
  9476. {
  9477. uint8_t tmp = 0;
  9478. tmp = ((uint8_t)(Value & (uint8_t)0xF0) >> (uint8_t)0x4) * 10;
  9479. 8025b70: 0902 lsrs r2, r0, #4
  9480. return (tmp + (Value & (uint8_t)0x0F));
  9481. 8025b72: f000 030f and.w r3, r0, #15
  9482. 8025b76: 200a movs r0, #10
  9483. 8025b78: fb00 3002 mla r0, r0, r2, r3
  9484. }
  9485. 8025b7c: b2c0 uxtb r0, r0
  9486. 8025b7e: 4770 bx lr
  9487. 08025b80 <RTC_EnterInitMode>:
  9488. * @retval An ErrorStatus enumeration value:
  9489. * - SUCCESS: RTC is in Init mode
  9490. * - ERROR: RTC is not in Init mode
  9491. */
  9492. ErrorStatus RTC_EnterInitMode(void)
  9493. {
  9494. 8025b80: b082 sub sp, #8
  9495. __IO uint32_t initcounter = 0x00;
  9496. 8025b82: 2300 movs r3, #0
  9497. 8025b84: 9301 str r3, [sp, #4]
  9498. ErrorStatus status = ERROR;
  9499. uint32_t initstatus = 0x00;
  9500. /* Check if the Initialization mode is set */
  9501. if ((RTC->ISR & RTC_ISR_INITF) == (uint32_t)RESET)
  9502. 8025b86: 4b0d ldr r3, [pc, #52] ; (8025bbc <RTC_EnterInitMode+0x3c>)
  9503. 8025b88: 68da ldr r2, [r3, #12]
  9504. 8025b8a: 0650 lsls r0, r2, #25
  9505. 8025b8c: d413 bmi.n 8025bb6 <RTC_EnterInitMode+0x36>
  9506. {
  9507. /* Set the Initialization mode */
  9508. RTC->ISR = (uint32_t)RTC_INIT_MASK;
  9509. 8025b8e: f04f 32ff mov.w r2, #4294967295
  9510. 8025b92: 60da str r2, [r3, #12]
  9511. /* Wait till RTC is in INIT state and if Time out is reached exit */
  9512. do
  9513. {
  9514. initstatus = RTC->ISR & RTC_ISR_INITF;
  9515. 8025b94: 68da ldr r2, [r3, #12]
  9516. initcounter++;
  9517. 8025b96: 9901 ldr r1, [sp, #4]
  9518. 8025b98: 3101 adds r1, #1
  9519. 8025b9a: 9101 str r1, [sp, #4]
  9520. } while((initcounter != INITMODE_TIMEOUT) && (initstatus == 0x00));
  9521. 8025b9c: 9901 ldr r1, [sp, #4]
  9522. 8025b9e: f5b1 3f80 cmp.w r1, #65536 ; 0x10000
  9523. RTC->ISR = (uint32_t)RTC_INIT_MASK;
  9524. /* Wait till RTC is in INIT state and if Time out is reached exit */
  9525. do
  9526. {
  9527. initstatus = RTC->ISR & RTC_ISR_INITF;
  9528. 8025ba2: f002 0240 and.w r2, r2, #64 ; 0x40
  9529. initcounter++;
  9530. } while((initcounter != INITMODE_TIMEOUT) && (initstatus == 0x00));
  9531. 8025ba6: d001 beq.n 8025bac <RTC_EnterInitMode+0x2c>
  9532. 8025ba8: 2a00 cmp r2, #0
  9533. 8025baa: d0f3 beq.n 8025b94 <RTC_EnterInitMode+0x14>
  9534. if ((RTC->ISR & RTC_ISR_INITF) != RESET)
  9535. 8025bac: 4b03 ldr r3, [pc, #12] ; (8025bbc <RTC_EnterInitMode+0x3c>)
  9536. 8025bae: 68d8 ldr r0, [r3, #12]
  9537. {
  9538. status = SUCCESS;
  9539. 8025bb0: f3c0 1080 ubfx r0, r0, #6, #1
  9540. 8025bb4: e000 b.n 8025bb8 <RTC_EnterInitMode+0x38>
  9541. status = ERROR;
  9542. }
  9543. }
  9544. else
  9545. {
  9546. status = SUCCESS;
  9547. 8025bb6: 2001 movs r0, #1
  9548. }
  9549. return (status);
  9550. }
  9551. 8025bb8: b002 add sp, #8
  9552. 8025bba: 4770 bx lr
  9553. 8025bbc: 40002800 .word 0x40002800
  9554. 08025bc0 <RTC_ExitInitMode>:
  9555. * @retval None
  9556. */
  9557. void RTC_ExitInitMode(void)
  9558. {
  9559. /* Exit Initialization mode */
  9560. RTC->ISR &= (uint32_t)~RTC_ISR_INIT;
  9561. 8025bc0: 4b02 ldr r3, [pc, #8] ; (8025bcc <RTC_ExitInitMode+0xc>)
  9562. 8025bc2: 68da ldr r2, [r3, #12]
  9563. 8025bc4: f022 0280 bic.w r2, r2, #128 ; 0x80
  9564. 8025bc8: 60da str r2, [r3, #12]
  9565. 8025bca: 4770 bx lr
  9566. 8025bcc: 40002800 .word 0x40002800
  9567. 08025bd0 <RTC_Init>:
  9568. * @retval An ErrorStatus enumeration value:
  9569. * - SUCCESS: RTC registers are initialized
  9570. * - ERROR: RTC registers are not initialized
  9571. */
  9572. ErrorStatus RTC_Init(RTC_InitTypeDef* RTC_InitStruct)
  9573. {
  9574. 8025bd0: b538 push {r3, r4, r5, lr}
  9575. assert_param(IS_RTC_HOUR_FORMAT(RTC_InitStruct->RTC_HourFormat));
  9576. assert_param(IS_RTC_ASYNCH_PREDIV(RTC_InitStruct->RTC_AsynchPrediv));
  9577. assert_param(IS_RTC_SYNCH_PREDIV(RTC_InitStruct->RTC_SynchPrediv));
  9578. /* Disable the write protection for RTC registers */
  9579. RTC->WPR = 0xCA;
  9580. 8025bd2: 4c0f ldr r4, [pc, #60] ; (8025c10 <RTC_Init+0x40>)
  9581. 8025bd4: 23ca movs r3, #202 ; 0xca
  9582. 8025bd6: 6263 str r3, [r4, #36] ; 0x24
  9583. RTC->WPR = 0x53;
  9584. 8025bd8: 2353 movs r3, #83 ; 0x53
  9585. 8025bda: 6263 str r3, [r4, #36] ; 0x24
  9586. * @retval An ErrorStatus enumeration value:
  9587. * - SUCCESS: RTC registers are initialized
  9588. * - ERROR: RTC registers are not initialized
  9589. */
  9590. ErrorStatus RTC_Init(RTC_InitTypeDef* RTC_InitStruct)
  9591. {
  9592. 8025bdc: 4605 mov r5, r0
  9593. /* Disable the write protection for RTC registers */
  9594. RTC->WPR = 0xCA;
  9595. RTC->WPR = 0x53;
  9596. /* Set Initialization mode */
  9597. if (RTC_EnterInitMode() == ERROR)
  9598. 8025bde: f7ff ffcf bl 8025b80 <RTC_EnterInitMode>
  9599. 8025be2: b188 cbz r0, 8025c08 <RTC_Init+0x38>
  9600. status = ERROR;
  9601. }
  9602. else
  9603. {
  9604. /* Clear RTC CR FMT Bit */
  9605. RTC->CR &= ((uint32_t)~(RTC_CR_FMT));
  9606. 8025be4: 68a3 ldr r3, [r4, #8]
  9607. 8025be6: f023 0340 bic.w r3, r3, #64 ; 0x40
  9608. 8025bea: 60a3 str r3, [r4, #8]
  9609. /* Set RTC_CR register */
  9610. RTC->CR |= ((uint32_t)(RTC_InitStruct->RTC_HourFormat));
  9611. 8025bec: 68a2 ldr r2, [r4, #8]
  9612. 8025bee: 682b ldr r3, [r5, #0]
  9613. 8025bf0: 4313 orrs r3, r2
  9614. 8025bf2: 60a3 str r3, [r4, #8]
  9615. /* Configure the RTC PRER */
  9616. RTC->PRER = (uint32_t)(RTC_InitStruct->RTC_SynchPrediv);
  9617. 8025bf4: 68ab ldr r3, [r5, #8]
  9618. 8025bf6: 6123 str r3, [r4, #16]
  9619. RTC->PRER |= (uint32_t)(RTC_InitStruct->RTC_AsynchPrediv << 16);
  9620. 8025bf8: 6923 ldr r3, [r4, #16]
  9621. 8025bfa: 686a ldr r2, [r5, #4]
  9622. 8025bfc: ea43 4302 orr.w r3, r3, r2, lsl #16
  9623. 8025c00: 6123 str r3, [r4, #16]
  9624. /* Exit Initialization mode */
  9625. RTC_ExitInitMode();
  9626. 8025c02: f7ff ffdd bl 8025bc0 <RTC_ExitInitMode>
  9627. status = SUCCESS;
  9628. 8025c06: 2001 movs r0, #1
  9629. }
  9630. /* Enable the write protection for RTC registers */
  9631. RTC->WPR = 0xFF;
  9632. 8025c08: 4b01 ldr r3, [pc, #4] ; (8025c10 <RTC_Init+0x40>)
  9633. 8025c0a: 22ff movs r2, #255 ; 0xff
  9634. 8025c0c: 625a str r2, [r3, #36] ; 0x24
  9635. return status;
  9636. }
  9637. 8025c0e: bd38 pop {r3, r4, r5, pc}
  9638. 8025c10: 40002800 .word 0x40002800
  9639. 08025c14 <RTC_WaitForSynchro>:
  9640. * @retval An ErrorStatus enumeration value:
  9641. * - SUCCESS: RTC registers are synchronised
  9642. * - ERROR: RTC registers are not synchronised
  9643. */
  9644. ErrorStatus RTC_WaitForSynchro(void)
  9645. {
  9646. 8025c14: b082 sub sp, #8
  9647. __IO uint32_t synchrocounter = 0;
  9648. 8025c16: 2300 movs r3, #0
  9649. 8025c18: 9301 str r3, [sp, #4]
  9650. ErrorStatus status = ERROR;
  9651. uint32_t synchrostatus = 0x00;
  9652. /* Disable the write protection for RTC registers */
  9653. RTC->WPR = 0xCA;
  9654. 8025c1a: 4b0e ldr r3, [pc, #56] ; (8025c54 <RTC_WaitForSynchro+0x40>)
  9655. 8025c1c: 22ca movs r2, #202 ; 0xca
  9656. 8025c1e: 625a str r2, [r3, #36] ; 0x24
  9657. RTC->WPR = 0x53;
  9658. 8025c20: 2253 movs r2, #83 ; 0x53
  9659. 8025c22: 625a str r2, [r3, #36] ; 0x24
  9660. /* Clear RSF flag */
  9661. RTC->ISR &= (uint32_t)RTC_RSF_MASK;
  9662. 8025c24: 68da ldr r2, [r3, #12]
  9663. 8025c26: f022 02a0 bic.w r2, r2, #160 ; 0xa0
  9664. 8025c2a: 60da str r2, [r3, #12]
  9665. /* Wait the registers to be synchronised */
  9666. do
  9667. {
  9668. synchrostatus = RTC->ISR & RTC_ISR_RSF;
  9669. 8025c2c: 68d9 ldr r1, [r3, #12]
  9670. synchrocounter++;
  9671. 8025c2e: 9a01 ldr r2, [sp, #4]
  9672. 8025c30: 3201 adds r2, #1
  9673. 8025c32: 9201 str r2, [sp, #4]
  9674. } while((synchrocounter != SYNCHRO_TIMEOUT) && (synchrostatus == 0x00));
  9675. 8025c34: 9a01 ldr r2, [sp, #4]
  9676. 8025c36: f5b2 3f00 cmp.w r2, #131072 ; 0x20000
  9677. RTC->ISR &= (uint32_t)RTC_RSF_MASK;
  9678. /* Wait the registers to be synchronised */
  9679. do
  9680. {
  9681. synchrostatus = RTC->ISR & RTC_ISR_RSF;
  9682. 8025c3a: f001 0120 and.w r1, r1, #32
  9683. 8025c3e: 4a05 ldr r2, [pc, #20] ; (8025c54 <RTC_WaitForSynchro+0x40>)
  9684. synchrocounter++;
  9685. } while((synchrocounter != SYNCHRO_TIMEOUT) && (synchrostatus == 0x00));
  9686. 8025c40: d001 beq.n 8025c46 <RTC_WaitForSynchro+0x32>
  9687. 8025c42: 2900 cmp r1, #0
  9688. 8025c44: d0f2 beq.n 8025c2c <RTC_WaitForSynchro+0x18>
  9689. if ((RTC->ISR & RTC_ISR_RSF) != RESET)
  9690. 8025c46: 68d0 ldr r0, [r2, #12]
  9691. {
  9692. status = ERROR;
  9693. }
  9694. /* Enable the write protection for RTC registers */
  9695. RTC->WPR = 0xFF;
  9696. 8025c48: 23ff movs r3, #255 ; 0xff
  9697. 8025c4a: 6253 str r3, [r2, #36] ; 0x24
  9698. return (status);
  9699. }
  9700. 8025c4c: f3c0 1040 ubfx r0, r0, #5, #1
  9701. 8025c50: b002 add sp, #8
  9702. 8025c52: 4770 bx lr
  9703. 8025c54: 40002800 .word 0x40002800
  9704. 08025c58 <RTC_SetTime>:
  9705. * @retval An ErrorStatus enumeration value:
  9706. * - SUCCESS: RTC Time register is configured
  9707. * - ERROR: RTC Time register is not configured
  9708. */
  9709. ErrorStatus RTC_SetTime(uint32_t RTC_Format, RTC_TimeTypeDef* RTC_TimeStruct)
  9710. {
  9711. 8025c58: b5f8 push {r3, r4, r5, r6, r7, lr}
  9712. 8025c5a: 4b24 ldr r3, [pc, #144] ; (8025cec <RTC_SetTime+0x94>)
  9713. 8025c5c: 460c mov r4, r1
  9714. /* Check the parameters */
  9715. assert_param(IS_RTC_FORMAT(RTC_Format));
  9716. if (RTC_Format == RTC_Format_BIN)
  9717. {
  9718. if ((RTC->CR & RTC_CR_FMT) != (uint32_t)RESET)
  9719. 8025c5e: 689b ldr r3, [r3, #8]
  9720. ErrorStatus status = ERROR;
  9721. /* Check the parameters */
  9722. assert_param(IS_RTC_FORMAT(RTC_Format));
  9723. if (RTC_Format == RTC_Format_BIN)
  9724. 8025c60: b920 cbnz r0, 8025c6c <RTC_SetTime+0x14>
  9725. {
  9726. if ((RTC->CR & RTC_CR_FMT) != (uint32_t)RESET)
  9727. 8025c62: f013 0340 ands.w r3, r3, #64 ; 0x40
  9728. 8025c66: d12e bne.n 8025cc6 <RTC_SetTime+0x6e>
  9729. assert_param(IS_RTC_HOUR12(RTC_TimeStruct->RTC_Hours));
  9730. assert_param(IS_RTC_H12(RTC_TimeStruct->RTC_H12));
  9731. }
  9732. else
  9733. {
  9734. RTC_TimeStruct->RTC_H12 = 0x00;
  9735. 8025c68: 70cb strb r3, [r1, #3]
  9736. 8025c6a: e02c b.n 8025cc6 <RTC_SetTime+0x6e>
  9737. assert_param(IS_RTC_MINUTES(RTC_TimeStruct->RTC_Minutes));
  9738. assert_param(IS_RTC_SECONDS(RTC_TimeStruct->RTC_Seconds));
  9739. }
  9740. else
  9741. {
  9742. if ((RTC->CR & RTC_CR_FMT) != (uint32_t)RESET)
  9743. 8025c6c: f013 0340 ands.w r3, r3, #64 ; 0x40
  9744. 8025c70: d11e bne.n 8025cb0 <RTC_SetTime+0x58>
  9745. assert_param(IS_RTC_HOUR12(tmpreg));
  9746. assert_param(IS_RTC_H12(RTC_TimeStruct->RTC_H12));
  9747. }
  9748. else
  9749. {
  9750. RTC_TimeStruct->RTC_H12 = 0x00;
  9751. 8025c72: 70cb strb r3, [r1, #3]
  9752. 8025c74: e01c b.n 8025cb0 <RTC_SetTime+0x58>
  9753. ((uint32_t)RTC_ByteToBcd2(RTC_TimeStruct->RTC_Seconds)) | \
  9754. (((uint32_t)RTC_TimeStruct->RTC_H12) << 16));
  9755. }
  9756. /* Disable the write protection for RTC registers */
  9757. RTC->WPR = 0xCA;
  9758. 8025c76: 4c1d ldr r4, [pc, #116] ; (8025cec <RTC_SetTime+0x94>)
  9759. 8025c78: 23ca movs r3, #202 ; 0xca
  9760. 8025c7a: 6263 str r3, [r4, #36] ; 0x24
  9761. RTC->WPR = 0x53;
  9762. 8025c7c: 2353 movs r3, #83 ; 0x53
  9763. 8025c7e: 6263 str r3, [r4, #36] ; 0x24
  9764. /* Set Initialization mode */
  9765. if (RTC_EnterInitMode() == ERROR)
  9766. 8025c80: f7ff ff7e bl 8025b80 <RTC_EnterInitMode>
  9767. 8025c84: b180 cbz r0, 8025ca8 <RTC_SetTime+0x50>
  9768. status = ERROR;
  9769. }
  9770. else
  9771. {
  9772. /* Set the RTC_TR register */
  9773. RTC->TR = (uint32_t)(tmpreg & RTC_TR_RESERVED_MASK);
  9774. 8025c86: f005 357f and.w r5, r5, #2139062143 ; 0x7f7f7f7f
  9775. 8025c8a: f025 45fe bic.w r5, r5, #2130706432 ; 0x7f000000
  9776. 8025c8e: 6025 str r5, [r4, #0]
  9777. /* Exit Initialization mode */
  9778. RTC_ExitInitMode();
  9779. 8025c90: f7ff ff96 bl 8025bc0 <RTC_ExitInitMode>
  9780. /* If RTC_CR_BYPSHAD bit = 0, wait for synchro else this check is not needed */
  9781. if ((RTC->CR & RTC_CR_BYPSHAD) == RESET)
  9782. 8025c94: 68a3 ldr r3, [r4, #8]
  9783. 8025c96: 0699 lsls r1, r3, #26
  9784. 8025c98: d405 bmi.n 8025ca6 <RTC_SetTime+0x4e>
  9785. {
  9786. if (RTC_WaitForSynchro() == ERROR)
  9787. 8025c9a: f7ff ffbb bl 8025c14 <RTC_WaitForSynchro>
  9788. RTC->WPR = 0x53;
  9789. /* Set Initialization mode */
  9790. if (RTC_EnterInitMode() == ERROR)
  9791. {
  9792. status = ERROR;
  9793. 8025c9e: 3000 adds r0, #0
  9794. 8025ca0: bf18 it ne
  9795. 8025ca2: 2001 movne r0, #1
  9796. 8025ca4: e000 b.n 8025ca8 <RTC_SetTime+0x50>
  9797. status = SUCCESS;
  9798. }
  9799. }
  9800. else
  9801. {
  9802. status = SUCCESS;
  9803. 8025ca6: 2001 movs r0, #1
  9804. }
  9805. }
  9806. /* Enable the write protection for RTC registers */
  9807. RTC->WPR = 0xFF;
  9808. 8025ca8: 4b10 ldr r3, [pc, #64] ; (8025cec <RTC_SetTime+0x94>)
  9809. 8025caa: 22ff movs r2, #255 ; 0xff
  9810. 8025cac: 625a str r2, [r3, #36] ; 0x24
  9811. 8025cae: bdf8 pop {r3, r4, r5, r6, r7, pc}
  9812. /* Check the input parameters format */
  9813. if (RTC_Format != RTC_Format_BIN)
  9814. {
  9815. tmpreg = (((uint32_t)(RTC_TimeStruct->RTC_Hours) << 16) | \
  9816. ((uint32_t)(RTC_TimeStruct->RTC_Minutes) << 8) | \
  9817. 8025cb0: 7865 ldrb r5, [r4, #1]
  9818. }
  9819. /* Check the input parameters format */
  9820. if (RTC_Format != RTC_Format_BIN)
  9821. {
  9822. tmpreg = (((uint32_t)(RTC_TimeStruct->RTC_Hours) << 16) | \
  9823. 8025cb2: 7823 ldrb r3, [r4, #0]
  9824. ((uint32_t)(RTC_TimeStruct->RTC_Minutes) << 8) | \
  9825. 8025cb4: 022d lsls r5, r5, #8
  9826. }
  9827. /* Check the input parameters format */
  9828. if (RTC_Format != RTC_Format_BIN)
  9829. {
  9830. tmpreg = (((uint32_t)(RTC_TimeStruct->RTC_Hours) << 16) | \
  9831. 8025cb6: ea45 4503 orr.w r5, r5, r3, lsl #16
  9832. ((uint32_t)(RTC_TimeStruct->RTC_Minutes) << 8) | \
  9833. ((uint32_t)RTC_TimeStruct->RTC_Seconds) | \
  9834. 8025cba: 78a3 ldrb r3, [r4, #2]
  9835. /* Check the input parameters format */
  9836. if (RTC_Format != RTC_Format_BIN)
  9837. {
  9838. tmpreg = (((uint32_t)(RTC_TimeStruct->RTC_Hours) << 16) | \
  9839. ((uint32_t)(RTC_TimeStruct->RTC_Minutes) << 8) | \
  9840. 8025cbc: 431d orrs r5, r3
  9841. ((uint32_t)RTC_TimeStruct->RTC_Seconds) | \
  9842. ((uint32_t)(RTC_TimeStruct->RTC_H12) << 16));
  9843. 8025cbe: 78e3 ldrb r3, [r4, #3]
  9844. }
  9845. /* Check the input parameters format */
  9846. if (RTC_Format != RTC_Format_BIN)
  9847. {
  9848. tmpreg = (((uint32_t)(RTC_TimeStruct->RTC_Hours) << 16) | \
  9849. 8025cc0: ea45 4503 orr.w r5, r5, r3, lsl #16
  9850. 8025cc4: e7d7 b.n 8025c76 <RTC_SetTime+0x1e>
  9851. ((uint32_t)RTC_TimeStruct->RTC_Seconds) | \
  9852. ((uint32_t)(RTC_TimeStruct->RTC_H12) << 16));
  9853. }
  9854. else
  9855. {
  9856. tmpreg = (uint32_t)(((uint32_t)RTC_ByteToBcd2(RTC_TimeStruct->RTC_Hours) << 16) | \
  9857. 8025cc6: 7820 ldrb r0, [r4, #0]
  9858. 8025cc8: f7ff ff46 bl 8025b58 <RTC_ByteToBcd2>
  9859. 8025ccc: 4607 mov r7, r0
  9860. ((uint32_t)RTC_ByteToBcd2(RTC_TimeStruct->RTC_Minutes) << 8) | \
  9861. 8025cce: 7860 ldrb r0, [r4, #1]
  9862. 8025cd0: f7ff ff42 bl 8025b58 <RTC_ByteToBcd2>
  9863. 8025cd4: 4606 mov r6, r0
  9864. ((uint32_t)RTC_ByteToBcd2(RTC_TimeStruct->RTC_Seconds)) | \
  9865. 8025cd6: 78a0 ldrb r0, [r4, #2]
  9866. 8025cd8: f7ff ff3e bl 8025b58 <RTC_ByteToBcd2>
  9867. (((uint32_t)RTC_TimeStruct->RTC_H12) << 16));
  9868. 8025cdc: 78e5 ldrb r5, [r4, #3]
  9869. ((uint32_t)RTC_TimeStruct->RTC_Seconds) | \
  9870. ((uint32_t)(RTC_TimeStruct->RTC_H12) << 16));
  9871. }
  9872. else
  9873. {
  9874. tmpreg = (uint32_t)(((uint32_t)RTC_ByteToBcd2(RTC_TimeStruct->RTC_Hours) << 16) | \
  9875. 8025cde: ea40 4005 orr.w r0, r0, r5, lsl #16
  9876. ((uint32_t)RTC_ByteToBcd2(RTC_TimeStruct->RTC_Minutes) << 8) | \
  9877. 8025ce2: ea40 4507 orr.w r5, r0, r7, lsl #16
  9878. ((uint32_t)RTC_TimeStruct->RTC_Seconds) | \
  9879. ((uint32_t)(RTC_TimeStruct->RTC_H12) << 16));
  9880. }
  9881. else
  9882. {
  9883. tmpreg = (uint32_t)(((uint32_t)RTC_ByteToBcd2(RTC_TimeStruct->RTC_Hours) << 16) | \
  9884. 8025ce6: ea45 2506 orr.w r5, r5, r6, lsl #8
  9885. 8025cea: e7c4 b.n 8025c76 <RTC_SetTime+0x1e>
  9886. 8025cec: 40002800 .word 0x40002800
  9887. 08025cf0 <RTC_GetTime>:
  9888. /* Check the parameters */
  9889. assert_param(IS_RTC_FORMAT(RTC_Format));
  9890. /* Get the RTC_TR register */
  9891. tmpreg = (uint32_t)(RTC->TR & RTC_TR_RESERVED_MASK);
  9892. 8025cf0: 4b0f ldr r3, [pc, #60] ; (8025d30 <RTC_GetTime+0x40>)
  9893. 8025cf2: 681b ldr r3, [r3, #0]
  9894. * @param RTC_TimeStruct: pointer to a RTC_TimeTypeDef structure that will
  9895. * contain the returned current time configuration.
  9896. * @retval None
  9897. */
  9898. void RTC_GetTime(uint32_t RTC_Format, RTC_TimeTypeDef* RTC_TimeStruct)
  9899. {
  9900. 8025cf4: b570 push {r4, r5, r6, lr}
  9901. /* Get the RTC_TR register */
  9902. tmpreg = (uint32_t)(RTC->TR & RTC_TR_RESERVED_MASK);
  9903. /* Fill the structure fields with the read parameters */
  9904. RTC_TimeStruct->RTC_Hours = (uint8_t)((tmpreg & (RTC_TR_HT | RTC_TR_HU)) >> 16);
  9905. 8025cf6: f3c3 4205 ubfx r2, r3, #16, #6
  9906. RTC_TimeStruct->RTC_Minutes = (uint8_t)((tmpreg & (RTC_TR_MNT | RTC_TR_MNU)) >>8);
  9907. 8025cfa: f3c3 2606 ubfx r6, r3, #8, #7
  9908. RTC_TimeStruct->RTC_Seconds = (uint8_t)(tmpreg & (RTC_TR_ST | RTC_TR_SU));
  9909. 8025cfe: f003 057f and.w r5, r3, #127 ; 0x7f
  9910. RTC_TimeStruct->RTC_H12 = (uint8_t)((tmpreg & (RTC_TR_PM)) >> 16);
  9911. 8025d02: f403 0380 and.w r3, r3, #4194304 ; 0x400000
  9912. 8025d06: 0c1b lsrs r3, r3, #16
  9913. * @param RTC_TimeStruct: pointer to a RTC_TimeTypeDef structure that will
  9914. * contain the returned current time configuration.
  9915. * @retval None
  9916. */
  9917. void RTC_GetTime(uint32_t RTC_Format, RTC_TimeTypeDef* RTC_TimeStruct)
  9918. {
  9919. 8025d08: 460c mov r4, r1
  9920. /* Get the RTC_TR register */
  9921. tmpreg = (uint32_t)(RTC->TR & RTC_TR_RESERVED_MASK);
  9922. /* Fill the structure fields with the read parameters */
  9923. RTC_TimeStruct->RTC_Hours = (uint8_t)((tmpreg & (RTC_TR_HT | RTC_TR_HU)) >> 16);
  9924. 8025d0a: 700a strb r2, [r1, #0]
  9925. RTC_TimeStruct->RTC_Minutes = (uint8_t)((tmpreg & (RTC_TR_MNT | RTC_TR_MNU)) >>8);
  9926. 8025d0c: 704e strb r6, [r1, #1]
  9927. RTC_TimeStruct->RTC_Seconds = (uint8_t)(tmpreg & (RTC_TR_ST | RTC_TR_SU));
  9928. 8025d0e: 708d strb r5, [r1, #2]
  9929. RTC_TimeStruct->RTC_H12 = (uint8_t)((tmpreg & (RTC_TR_PM)) >> 16);
  9930. 8025d10: 70cb strb r3, [r1, #3]
  9931. /* Check the input parameters format */
  9932. if (RTC_Format == RTC_Format_BIN)
  9933. 8025d12: b958 cbnz r0, 8025d2c <RTC_GetTime+0x3c>
  9934. {
  9935. /* Convert the structure parameters to Binary format */
  9936. RTC_TimeStruct->RTC_Hours = (uint8_t)RTC_Bcd2ToByte(RTC_TimeStruct->RTC_Hours);
  9937. 8025d14: 4610 mov r0, r2
  9938. 8025d16: f7ff ff2b bl 8025b70 <RTC_Bcd2ToByte>
  9939. 8025d1a: 7020 strb r0, [r4, #0]
  9940. RTC_TimeStruct->RTC_Minutes = (uint8_t)RTC_Bcd2ToByte(RTC_TimeStruct->RTC_Minutes);
  9941. 8025d1c: 4630 mov r0, r6
  9942. 8025d1e: f7ff ff27 bl 8025b70 <RTC_Bcd2ToByte>
  9943. 8025d22: 7060 strb r0, [r4, #1]
  9944. RTC_TimeStruct->RTC_Seconds = (uint8_t)RTC_Bcd2ToByte(RTC_TimeStruct->RTC_Seconds);
  9945. 8025d24: 4628 mov r0, r5
  9946. 8025d26: f7ff ff23 bl 8025b70 <RTC_Bcd2ToByte>
  9947. 8025d2a: 70a0 strb r0, [r4, #2]
  9948. 8025d2c: bd70 pop {r4, r5, r6, pc}
  9949. 8025d2e: bf00 nop
  9950. 8025d30: 40002800 .word 0x40002800
  9951. 08025d34 <RTC_SetDate>:
  9952. * @retval An ErrorStatus enumeration value:
  9953. * - SUCCESS: RTC Date register is configured
  9954. * - ERROR: RTC Date register is not configured
  9955. */
  9956. ErrorStatus RTC_SetDate(uint32_t RTC_Format, RTC_DateTypeDef* RTC_DateStruct)
  9957. {
  9958. 8025d34: b5f8 push {r3, r4, r5, r6, r7, lr}
  9959. 8025d36: 460c mov r4, r1
  9960. 8025d38: 784b ldrb r3, [r1, #1]
  9961. ErrorStatus status = ERROR;
  9962. /* Check the parameters */
  9963. assert_param(IS_RTC_FORMAT(RTC_Format));
  9964. if ((RTC_Format == RTC_Format_BIN) && ((RTC_DateStruct->RTC_Month & 0x10) == 0x10))
  9965. 8025d3a: 2800 cmp r0, #0
  9966. 8025d3c: d138 bne.n 8025db0 <RTC_SetDate+0x7c>
  9967. 8025d3e: f003 0210 and.w r2, r3, #16
  9968. 8025d42: b2d2 uxtb r2, r2
  9969. 8025d44: b30a cbz r2, 8025d8a <RTC_SetDate+0x56>
  9970. {
  9971. RTC_DateStruct->RTC_Month = (RTC_DateStruct->RTC_Month & (uint32_t)~(0x10)) + 0x0A;
  9972. 8025d46: f023 0310 bic.w r3, r3, #16
  9973. 8025d4a: 330a adds r3, #10
  9974. 8025d4c: 704b strb r3, [r1, #1]
  9975. 8025d4e: e01c b.n 8025d8a <RTC_SetDate+0x56>
  9976. ((uint32_t)RTC_ByteToBcd2(RTC_DateStruct->RTC_Date)) | \
  9977. ((uint32_t)RTC_DateStruct->RTC_WeekDay << 13));
  9978. }
  9979. /* Disable the write protection for RTC registers */
  9980. RTC->WPR = 0xCA;
  9981. 8025d50: 4c1c ldr r4, [pc, #112] ; (8025dc4 <RTC_SetDate+0x90>)
  9982. 8025d52: 23ca movs r3, #202 ; 0xca
  9983. 8025d54: 6263 str r3, [r4, #36] ; 0x24
  9984. RTC->WPR = 0x53;
  9985. 8025d56: 2353 movs r3, #83 ; 0x53
  9986. 8025d58: 6263 str r3, [r4, #36] ; 0x24
  9987. /* Set Initialization mode */
  9988. if (RTC_EnterInitMode() == ERROR)
  9989. 8025d5a: f7ff ff11 bl 8025b80 <RTC_EnterInitMode>
  9990. 8025d5e: b180 cbz r0, 8025d82 <RTC_SetDate+0x4e>
  9991. status = ERROR;
  9992. }
  9993. else
  9994. {
  9995. /* Set the RTC_DR register */
  9996. RTC->DR = (uint32_t)(tmpreg & RTC_DR_RESERVED_MASK);
  9997. 8025d60: f025 457f bic.w r5, r5, #4278190080 ; 0xff000000
  9998. 8025d64: f025 05c0 bic.w r5, r5, #192 ; 0xc0
  9999. 8025d68: 6065 str r5, [r4, #4]
  10000. /* Exit Initialization mode */
  10001. RTC_ExitInitMode();
  10002. 8025d6a: f7ff ff29 bl 8025bc0 <RTC_ExitInitMode>
  10003. /* If RTC_CR_BYPSHAD bit = 0, wait for synchro else this check is not needed */
  10004. if ((RTC->CR & RTC_CR_BYPSHAD) == RESET)
  10005. 8025d6e: 68a3 ldr r3, [r4, #8]
  10006. 8025d70: 0698 lsls r0, r3, #26
  10007. 8025d72: d405 bmi.n 8025d80 <RTC_SetDate+0x4c>
  10008. {
  10009. if (RTC_WaitForSynchro() == ERROR)
  10010. 8025d74: f7ff ff4e bl 8025c14 <RTC_WaitForSynchro>
  10011. RTC->WPR = 0x53;
  10012. /* Set Initialization mode */
  10013. if (RTC_EnterInitMode() == ERROR)
  10014. {
  10015. status = ERROR;
  10016. 8025d78: 3000 adds r0, #0
  10017. 8025d7a: bf18 it ne
  10018. 8025d7c: 2001 movne r0, #1
  10019. 8025d7e: e000 b.n 8025d82 <RTC_SetDate+0x4e>
  10020. status = SUCCESS;
  10021. }
  10022. }
  10023. else
  10024. {
  10025. status = SUCCESS;
  10026. 8025d80: 2001 movs r0, #1
  10027. }
  10028. }
  10029. /* Enable the write protection for RTC registers */
  10030. RTC->WPR = 0xFF;
  10031. 8025d82: 4b10 ldr r3, [pc, #64] ; (8025dc4 <RTC_SetDate+0x90>)
  10032. 8025d84: 22ff movs r2, #255 ; 0xff
  10033. 8025d86: 625a str r2, [r3, #36] ; 0x24
  10034. 8025d88: bdf8 pop {r3, r4, r5, r6, r7, pc}
  10035. ((uint32_t)RTC_DateStruct->RTC_Date) | \
  10036. (((uint32_t)RTC_DateStruct->RTC_WeekDay) << 13));
  10037. }
  10038. else
  10039. {
  10040. tmpreg = (((uint32_t)RTC_ByteToBcd2(RTC_DateStruct->RTC_Year) << 16) | \
  10041. 8025d8a: 78e0 ldrb r0, [r4, #3]
  10042. 8025d8c: f7ff fee4 bl 8025b58 <RTC_ByteToBcd2>
  10043. 8025d90: 4607 mov r7, r0
  10044. ((uint32_t)RTC_ByteToBcd2(RTC_DateStruct->RTC_Month) << 8) | \
  10045. 8025d92: 7860 ldrb r0, [r4, #1]
  10046. 8025d94: f7ff fee0 bl 8025b58 <RTC_ByteToBcd2>
  10047. 8025d98: 4606 mov r6, r0
  10048. ((uint32_t)RTC_ByteToBcd2(RTC_DateStruct->RTC_Date)) | \
  10049. 8025d9a: 78a0 ldrb r0, [r4, #2]
  10050. 8025d9c: f7ff fedc bl 8025b58 <RTC_ByteToBcd2>
  10051. ((uint32_t)RTC_DateStruct->RTC_WeekDay << 13));
  10052. 8025da0: 7825 ldrb r5, [r4, #0]
  10053. ((uint32_t)RTC_DateStruct->RTC_Date) | \
  10054. (((uint32_t)RTC_DateStruct->RTC_WeekDay) << 13));
  10055. }
  10056. else
  10057. {
  10058. tmpreg = (((uint32_t)RTC_ByteToBcd2(RTC_DateStruct->RTC_Year) << 16) | \
  10059. 8025da2: ea40 3045 orr.w r0, r0, r5, lsl #13
  10060. ((uint32_t)RTC_ByteToBcd2(RTC_DateStruct->RTC_Month) << 8) | \
  10061. 8025da6: ea40 4507 orr.w r5, r0, r7, lsl #16
  10062. ((uint32_t)RTC_DateStruct->RTC_Date) | \
  10063. (((uint32_t)RTC_DateStruct->RTC_WeekDay) << 13));
  10064. }
  10065. else
  10066. {
  10067. tmpreg = (((uint32_t)RTC_ByteToBcd2(RTC_DateStruct->RTC_Year) << 16) | \
  10068. 8025daa: ea45 2506 orr.w r5, r5, r6, lsl #8
  10069. 8025dae: e7cf b.n 8025d50 <RTC_SetDate+0x1c>
  10070. assert_param(IS_RTC_WEEKDAY(RTC_DateStruct->RTC_WeekDay));
  10071. /* Check the input parameters format */
  10072. if (RTC_Format != RTC_Format_BIN)
  10073. {
  10074. tmpreg = ((((uint32_t)RTC_DateStruct->RTC_Year) << 16) | \
  10075. 8025db0: 78cd ldrb r5, [r1, #3]
  10076. (((uint32_t)RTC_DateStruct->RTC_Month) << 8) | \
  10077. ((uint32_t)RTC_DateStruct->RTC_Date) | \
  10078. 8025db2: 788a ldrb r2, [r1, #2]
  10079. /* Check the input parameters format */
  10080. if (RTC_Format != RTC_Format_BIN)
  10081. {
  10082. tmpreg = ((((uint32_t)RTC_DateStruct->RTC_Year) << 16) | \
  10083. (((uint32_t)RTC_DateStruct->RTC_Month) << 8) | \
  10084. 8025db4: 021b lsls r3, r3, #8
  10085. assert_param(IS_RTC_WEEKDAY(RTC_DateStruct->RTC_WeekDay));
  10086. /* Check the input parameters format */
  10087. if (RTC_Format != RTC_Format_BIN)
  10088. {
  10089. tmpreg = ((((uint32_t)RTC_DateStruct->RTC_Year) << 16) | \
  10090. 8025db6: ea43 4505 orr.w r5, r3, r5, lsl #16
  10091. (((uint32_t)RTC_DateStruct->RTC_Month) << 8) | \
  10092. ((uint32_t)RTC_DateStruct->RTC_Date) | \
  10093. (((uint32_t)RTC_DateStruct->RTC_WeekDay) << 13));
  10094. 8025dba: 780b ldrb r3, [r1, #0]
  10095. /* Check the input parameters format */
  10096. if (RTC_Format != RTC_Format_BIN)
  10097. {
  10098. tmpreg = ((((uint32_t)RTC_DateStruct->RTC_Year) << 16) | \
  10099. (((uint32_t)RTC_DateStruct->RTC_Month) << 8) | \
  10100. 8025dbc: 4315 orrs r5, r2
  10101. assert_param(IS_RTC_WEEKDAY(RTC_DateStruct->RTC_WeekDay));
  10102. /* Check the input parameters format */
  10103. if (RTC_Format != RTC_Format_BIN)
  10104. {
  10105. tmpreg = ((((uint32_t)RTC_DateStruct->RTC_Year) << 16) | \
  10106. 8025dbe: ea45 3543 orr.w r5, r5, r3, lsl #13
  10107. 8025dc2: e7c5 b.n 8025d50 <RTC_SetDate+0x1c>
  10108. 8025dc4: 40002800 .word 0x40002800
  10109. 08025dc8 <RTC_GetDate>:
  10110. /* Check the parameters */
  10111. assert_param(IS_RTC_FORMAT(RTC_Format));
  10112. /* Get the RTC_TR register */
  10113. tmpreg = (uint32_t)(RTC->DR & RTC_DR_RESERVED_MASK);
  10114. 8025dc8: 4b0e ldr r3, [pc, #56] ; (8025e04 <RTC_GetDate+0x3c>)
  10115. 8025dca: 685b ldr r3, [r3, #4]
  10116. * @param RTC_DateStruct: pointer to a RTC_DateTypeDef structure that will
  10117. * contain the returned current date configuration.
  10118. * @retval None
  10119. */
  10120. void RTC_GetDate(uint32_t RTC_Format, RTC_DateTypeDef* RTC_DateStruct)
  10121. {
  10122. 8025dcc: b570 push {r4, r5, r6, lr}
  10123. /* Get the RTC_TR register */
  10124. tmpreg = (uint32_t)(RTC->DR & RTC_DR_RESERVED_MASK);
  10125. /* Fill the structure fields with the read parameters */
  10126. RTC_DateStruct->RTC_Year = (uint8_t)((tmpreg & (RTC_DR_YT | RTC_DR_YU)) >> 16);
  10127. 8025dce: f3c3 4207 ubfx r2, r3, #16, #8
  10128. RTC_DateStruct->RTC_Month = (uint8_t)((tmpreg & (RTC_DR_MT | RTC_DR_MU)) >> 8);
  10129. 8025dd2: f3c3 2604 ubfx r6, r3, #8, #5
  10130. RTC_DateStruct->RTC_Date = (uint8_t)(tmpreg & (RTC_DR_DT | RTC_DR_DU));
  10131. 8025dd6: f003 053f and.w r5, r3, #63 ; 0x3f
  10132. RTC_DateStruct->RTC_WeekDay = (uint8_t)((tmpreg & (RTC_DR_WDU)) >> 13);
  10133. 8025dda: f3c3 3342 ubfx r3, r3, #13, #3
  10134. * @param RTC_DateStruct: pointer to a RTC_DateTypeDef structure that will
  10135. * contain the returned current date configuration.
  10136. * @retval None
  10137. */
  10138. void RTC_GetDate(uint32_t RTC_Format, RTC_DateTypeDef* RTC_DateStruct)
  10139. {
  10140. 8025dde: 460c mov r4, r1
  10141. /* Get the RTC_TR register */
  10142. tmpreg = (uint32_t)(RTC->DR & RTC_DR_RESERVED_MASK);
  10143. /* Fill the structure fields with the read parameters */
  10144. RTC_DateStruct->RTC_Year = (uint8_t)((tmpreg & (RTC_DR_YT | RTC_DR_YU)) >> 16);
  10145. 8025de0: 70ca strb r2, [r1, #3]
  10146. RTC_DateStruct->RTC_Month = (uint8_t)((tmpreg & (RTC_DR_MT | RTC_DR_MU)) >> 8);
  10147. 8025de2: 704e strb r6, [r1, #1]
  10148. RTC_DateStruct->RTC_Date = (uint8_t)(tmpreg & (RTC_DR_DT | RTC_DR_DU));
  10149. 8025de4: 708d strb r5, [r1, #2]
  10150. RTC_DateStruct->RTC_WeekDay = (uint8_t)((tmpreg & (RTC_DR_WDU)) >> 13);
  10151. 8025de6: 700b strb r3, [r1, #0]
  10152. /* Check the input parameters format */
  10153. if (RTC_Format == RTC_Format_BIN)
  10154. 8025de8: b958 cbnz r0, 8025e02 <RTC_GetDate+0x3a>
  10155. {
  10156. /* Convert the structure parameters to Binary format */
  10157. RTC_DateStruct->RTC_Year = (uint8_t)RTC_Bcd2ToByte(RTC_DateStruct->RTC_Year);
  10158. 8025dea: 4610 mov r0, r2
  10159. 8025dec: f7ff fec0 bl 8025b70 <RTC_Bcd2ToByte>
  10160. 8025df0: 70e0 strb r0, [r4, #3]
  10161. RTC_DateStruct->RTC_Month = (uint8_t)RTC_Bcd2ToByte(RTC_DateStruct->RTC_Month);
  10162. 8025df2: 4630 mov r0, r6
  10163. 8025df4: f7ff febc bl 8025b70 <RTC_Bcd2ToByte>
  10164. 8025df8: 7060 strb r0, [r4, #1]
  10165. RTC_DateStruct->RTC_Date = (uint8_t)RTC_Bcd2ToByte(RTC_DateStruct->RTC_Date);
  10166. 8025dfa: 4628 mov r0, r5
  10167. 8025dfc: f7ff feb8 bl 8025b70 <RTC_Bcd2ToByte>
  10168. 8025e00: 70a0 strb r0, [r4, #2]
  10169. 8025e02: bd70 pop {r4, r5, r6, pc}
  10170. 8025e04: 40002800 .word 0x40002800
  10171. 08025e08 <RTC_WriteBackupRegister>:
  10172. * specify the register.
  10173. * @param Data: Data to be written in the specified RTC Backup data register.
  10174. * @retval None
  10175. */
  10176. void RTC_WriteBackupRegister(uint32_t RTC_BKP_DR, uint32_t Data)
  10177. {
  10178. 8025e08: b082 sub sp, #8
  10179. __IO uint32_t tmp = 0;
  10180. 8025e0a: 2300 movs r3, #0
  10181. 8025e0c: 9301 str r3, [sp, #4]
  10182. /* Check the parameters */
  10183. assert_param(IS_RTC_BKP(RTC_BKP_DR));
  10184. tmp = RTC_BASE + 0x50;
  10185. 8025e0e: 4b05 ldr r3, [pc, #20] ; (8025e24 <RTC_WriteBackupRegister+0x1c>)
  10186. 8025e10: 9301 str r3, [sp, #4]
  10187. tmp += (RTC_BKP_DR * 4);
  10188. 8025e12: 9b01 ldr r3, [sp, #4]
  10189. 8025e14: eb03 0080 add.w r0, r3, r0, lsl #2
  10190. 8025e18: 9001 str r0, [sp, #4]
  10191. /* Write the specified register */
  10192. *(__IO uint32_t *)tmp = (uint32_t)Data;
  10193. 8025e1a: 9b01 ldr r3, [sp, #4]
  10194. 8025e1c: 6019 str r1, [r3, #0]
  10195. }
  10196. 8025e1e: b002 add sp, #8
  10197. 8025e20: 4770 bx lr
  10198. 8025e22: bf00 nop
  10199. 8025e24: 40002850 .word 0x40002850
  10200. 08025e28 <RTC_ReadBackupRegister>:
  10201. * This parameter can be: RTC_BKP_DRx where x can be from 0 to 19 to
  10202. * specify the register.
  10203. * @retval None
  10204. */
  10205. uint32_t RTC_ReadBackupRegister(uint32_t RTC_BKP_DR)
  10206. {
  10207. 8025e28: b082 sub sp, #8
  10208. __IO uint32_t tmp = 0;
  10209. 8025e2a: 2300 movs r3, #0
  10210. 8025e2c: 9301 str r3, [sp, #4]
  10211. /* Check the parameters */
  10212. assert_param(IS_RTC_BKP(RTC_BKP_DR));
  10213. tmp = RTC_BASE + 0x50;
  10214. 8025e2e: 4b05 ldr r3, [pc, #20] ; (8025e44 <RTC_ReadBackupRegister+0x1c>)
  10215. 8025e30: 9301 str r3, [sp, #4]
  10216. tmp += (RTC_BKP_DR * 4);
  10217. 8025e32: 9b01 ldr r3, [sp, #4]
  10218. 8025e34: eb03 0080 add.w r0, r3, r0, lsl #2
  10219. 8025e38: 9001 str r0, [sp, #4]
  10220. /* Read the specified register */
  10221. return (*(__IO uint32_t *)tmp);
  10222. 8025e3a: 9b01 ldr r3, [sp, #4]
  10223. 8025e3c: 6818 ldr r0, [r3, #0]
  10224. }
  10225. 8025e3e: b002 add sp, #8
  10226. 8025e40: 4770 bx lr
  10227. 8025e42: bf00 nop
  10228. 8025e44: 40002850 .word 0x40002850
  10229. 08025e48 <RTC_GetITStatus>:
  10230. /* Check the parameters */
  10231. assert_param(IS_RTC_GET_IT(RTC_IT));
  10232. /* Get the TAMPER Interrupt enable bit and pending bit */
  10233. tmpreg = (uint32_t)(RTC->TAFCR & (RTC_TAFCR_TAMPIE));
  10234. 8025e48: 4b0a ldr r3, [pc, #40] ; (8025e74 <RTC_GetITStatus+0x2c>)
  10235. 8025e4a: 6c1a ldr r2, [r3, #64] ; 0x40
  10236. * @arg RTC_IT_ALRA: Alarm A interrupt
  10237. * @arg RTC_IT_TAMP1: Tamper 1 event interrupt
  10238. * @retval The new state of RTC_IT (SET or RESET).
  10239. */
  10240. ITStatus RTC_GetITStatus(uint32_t RTC_IT)
  10241. {
  10242. 8025e4c: b510 push {r4, lr}
  10243. /* Get the TAMPER Interrupt enable bit and pending bit */
  10244. tmpreg = (uint32_t)(RTC->TAFCR & (RTC_TAFCR_TAMPIE));
  10245. /* Get the Interrupt enable Status */
  10246. enablestatus = (uint32_t)((RTC->CR & RTC_IT) | (tmpreg & (RTC_IT >> 15)));
  10247. 8025e4e: 689c ldr r4, [r3, #8]
  10248. /* Get the Interrupt pending bit */
  10249. tmpreg = (uint32_t)((RTC->ISR & (uint32_t)(RTC_IT >> 4)));
  10250. 8025e50: 68d9 ldr r1, [r3, #12]
  10251. /* Check the parameters */
  10252. assert_param(IS_RTC_GET_IT(RTC_IT));
  10253. /* Get the TAMPER Interrupt enable bit and pending bit */
  10254. tmpreg = (uint32_t)(RTC->TAFCR & (RTC_TAFCR_TAMPIE));
  10255. 8025e52: f002 0204 and.w r2, r2, #4
  10256. /* Get the Interrupt enable Status */
  10257. enablestatus = (uint32_t)((RTC->CR & RTC_IT) | (tmpreg & (RTC_IT >> 15)));
  10258. 8025e56: ea02 32d0 and.w r2, r2, r0, lsr #15
  10259. 8025e5a: ea00 0304 and.w r3, r0, r4
  10260. /* Get the Interrupt pending bit */
  10261. tmpreg = (uint32_t)((RTC->ISR & (uint32_t)(RTC_IT >> 4)));
  10262. /* Get the status of the Interrupt */
  10263. if ((enablestatus != (uint32_t)RESET) && ((tmpreg & 0x0000FFFF) != (uint32_t)RESET))
  10264. 8025e5e: 4313 orrs r3, r2
  10265. 8025e60: d006 beq.n 8025e70 <RTC_GetITStatus+0x28>
  10266. /* Get the Interrupt enable Status */
  10267. enablestatus = (uint32_t)((RTC->CR & RTC_IT) | (tmpreg & (RTC_IT >> 15)));
  10268. /* Get the Interrupt pending bit */
  10269. tmpreg = (uint32_t)((RTC->ISR & (uint32_t)(RTC_IT >> 4)));
  10270. 8025e62: b28b uxth r3, r1
  10271. /* Get the status of the Interrupt */
  10272. if ((enablestatus != (uint32_t)RESET) && ((tmpreg & 0x0000FFFF) != (uint32_t)RESET))
  10273. 8025e64: ea13 1310 ands.w r3, r3, r0, lsr #4
  10274. {
  10275. bitstatus = SET;
  10276. 8025e68: bf0c ite eq
  10277. 8025e6a: 2000 moveq r0, #0
  10278. 8025e6c: 2001 movne r0, #1
  10279. 8025e6e: bd10 pop {r4, pc}
  10280. }
  10281. else
  10282. {
  10283. bitstatus = RESET;
  10284. 8025e70: 4618 mov r0, r3
  10285. }
  10286. return bitstatus;
  10287. }
  10288. 8025e72: bd10 pop {r4, pc}
  10289. 8025e74: 40002800 .word 0x40002800
  10290. 08025e78 <RTC_ClearITPendingBit>:
  10291. /* Get the RTC_ISR Interrupt pending bits mask */
  10292. tmpreg = (uint32_t)(RTC_IT >> 4);
  10293. /* Clear the interrupt pending bits in the RTC_ISR register */
  10294. RTC->ISR = (uint32_t)((uint32_t)(~((tmpreg | RTC_ISR_INIT)& 0x0000FFFF) | (uint32_t)(RTC->ISR & RTC_ISR_INIT)));
  10295. 8025e78: 4b05 ldr r3, [pc, #20] ; (8025e90 <RTC_ClearITPendingBit+0x18>)
  10296. 8025e7a: 68da ldr r2, [r3, #12]
  10297. 8025e7c: f3c0 100f ubfx r0, r0, #4, #16
  10298. 8025e80: f040 0080 orr.w r0, r0, #128 ; 0x80
  10299. 8025e84: f002 0280 and.w r2, r2, #128 ; 0x80
  10300. 8025e88: ea62 0200 orn r2, r2, r0
  10301. 8025e8c: 60da str r2, [r3, #12]
  10302. 8025e8e: 4770 bx lr
  10303. 8025e90: 40002800 .word 0x40002800
  10304. 08025e94 <SYSCFG_ETH_MediaInterfaceConfig>:
  10305. */
  10306. void SYSCFG_ETH_MediaInterfaceConfig(uint32_t SYSCFG_ETH_MediaInterface)
  10307. {
  10308. assert_param(IS_SYSCFG_ETH_MEDIA_INTERFACE(SYSCFG_ETH_MediaInterface));
  10309. /* Configure MII_RMII selection bit */
  10310. *(__IO uint32_t *) PMC_MII_RMII_SEL_BB = SYSCFG_ETH_MediaInterface;
  10311. 8025e94: 4b01 ldr r3, [pc, #4] ; (8025e9c <SYSCFG_ETH_MediaInterfaceConfig+0x8>)
  10312. 8025e96: 6018 str r0, [r3, #0]
  10313. 8025e98: 4770 bx lr
  10314. 8025e9a: bf00 nop
  10315. 8025e9c: 422700dc .word 0x422700dc
  10316. 08025ea0 <TIM_TimeBaseInit>:
  10317. assert_param(IS_TIM_COUNTER_MODE(TIM_TimeBaseInitStruct->TIM_CounterMode));
  10318. assert_param(IS_TIM_CKD_DIV(TIM_TimeBaseInitStruct->TIM_ClockDivision));
  10319. tmpcr1 = TIMx->CR1;
  10320. if((TIMx == TIM1) || (TIMx == TIM8)||
  10321. 8025ea0: 4a1c ldr r2, [pc, #112] ; (8025f14 <TIM_TimeBaseInit+0x74>)
  10322. /* Check the parameters */
  10323. assert_param(IS_TIM_ALL_PERIPH(TIMx));
  10324. assert_param(IS_TIM_COUNTER_MODE(TIM_TimeBaseInitStruct->TIM_CounterMode));
  10325. assert_param(IS_TIM_CKD_DIV(TIM_TimeBaseInitStruct->TIM_ClockDivision));
  10326. tmpcr1 = TIMx->CR1;
  10327. 8025ea2: 8803 ldrh r3, [r0, #0]
  10328. if((TIMx == TIM1) || (TIMx == TIM8)||
  10329. 8025ea4: 4290 cmp r0, r2
  10330. /* Check the parameters */
  10331. assert_param(IS_TIM_ALL_PERIPH(TIMx));
  10332. assert_param(IS_TIM_COUNTER_MODE(TIM_TimeBaseInitStruct->TIM_CounterMode));
  10333. assert_param(IS_TIM_CKD_DIV(TIM_TimeBaseInitStruct->TIM_ClockDivision));
  10334. tmpcr1 = TIMx->CR1;
  10335. 8025ea6: b29b uxth r3, r3
  10336. if((TIMx == TIM1) || (TIMx == TIM8)||
  10337. 8025ea8: d012 beq.n 8025ed0 <TIM_TimeBaseInit+0x30>
  10338. 8025eaa: f502 6280 add.w r2, r2, #1024 ; 0x400
  10339. 8025eae: 4290 cmp r0, r2
  10340. 8025eb0: d00e beq.n 8025ed0 <TIM_TimeBaseInit+0x30>
  10341. 8025eb2: f1b0 4f80 cmp.w r0, #1073741824 ; 0x40000000
  10342. 8025eb6: d00b beq.n 8025ed0 <TIM_TimeBaseInit+0x30>
  10343. (TIMx == TIM2) || (TIMx == TIM3)||
  10344. 8025eb8: f5a2 3280 sub.w r2, r2, #65536 ; 0x10000
  10345. 8025ebc: 4290 cmp r0, r2
  10346. 8025ebe: d007 beq.n 8025ed0 <TIM_TimeBaseInit+0x30>
  10347. 8025ec0: f502 6280 add.w r2, r2, #1024 ; 0x400
  10348. 8025ec4: 4290 cmp r0, r2
  10349. 8025ec6: d003 beq.n 8025ed0 <TIM_TimeBaseInit+0x30>
  10350. (TIMx == TIM4) || (TIMx == TIM5))
  10351. 8025ec8: f502 6280 add.w r2, r2, #1024 ; 0x400
  10352. 8025ecc: 4290 cmp r0, r2
  10353. 8025ece: d103 bne.n 8025ed8 <TIM_TimeBaseInit+0x38>
  10354. {
  10355. /* Select the Counter Mode */
  10356. tmpcr1 &= (uint16_t)(~(TIM_CR1_DIR | TIM_CR1_CMS));
  10357. tmpcr1 |= (uint32_t)TIM_TimeBaseInitStruct->TIM_CounterMode;
  10358. 8025ed0: 884a ldrh r2, [r1, #2]
  10359. if((TIMx == TIM1) || (TIMx == TIM8)||
  10360. (TIMx == TIM2) || (TIMx == TIM3)||
  10361. (TIMx == TIM4) || (TIMx == TIM5))
  10362. {
  10363. /* Select the Counter Mode */
  10364. tmpcr1 &= (uint16_t)(~(TIM_CR1_DIR | TIM_CR1_CMS));
  10365. 8025ed2: f023 0370 bic.w r3, r3, #112 ; 0x70
  10366. tmpcr1 |= (uint32_t)TIM_TimeBaseInitStruct->TIM_CounterMode;
  10367. 8025ed6: 4313 orrs r3, r2
  10368. }
  10369. if((TIMx != TIM6) && (TIMx != TIM7))
  10370. 8025ed8: 4a0f ldr r2, [pc, #60] ; (8025f18 <TIM_TimeBaseInit+0x78>)
  10371. 8025eda: 4290 cmp r0, r2
  10372. 8025edc: d008 beq.n 8025ef0 <TIM_TimeBaseInit+0x50>
  10373. 8025ede: f502 6280 add.w r2, r2, #1024 ; 0x400
  10374. 8025ee2: 4290 cmp r0, r2
  10375. 8025ee4: d004 beq.n 8025ef0 <TIM_TimeBaseInit+0x50>
  10376. {
  10377. /* Set the clock division */
  10378. tmpcr1 &= (uint16_t)(~TIM_CR1_CKD);
  10379. 8025ee6: f423 7340 bic.w r3, r3, #768 ; 0x300
  10380. tmpcr1 |= (uint32_t)TIM_TimeBaseInitStruct->TIM_ClockDivision;
  10381. 8025eea: 890a ldrh r2, [r1, #8]
  10382. }
  10383. if((TIMx != TIM6) && (TIMx != TIM7))
  10384. {
  10385. /* Set the clock division */
  10386. tmpcr1 &= (uint16_t)(~TIM_CR1_CKD);
  10387. 8025eec: b29b uxth r3, r3
  10388. tmpcr1 |= (uint32_t)TIM_TimeBaseInitStruct->TIM_ClockDivision;
  10389. 8025eee: 4313 orrs r3, r2
  10390. }
  10391. TIMx->CR1 = tmpcr1;
  10392. 8025ef0: 8003 strh r3, [r0, #0]
  10393. /* Set the Autoreload value */
  10394. TIMx->ARR = TIM_TimeBaseInitStruct->TIM_Period ;
  10395. 8025ef2: 684b ldr r3, [r1, #4]
  10396. 8025ef4: 62c3 str r3, [r0, #44] ; 0x2c
  10397. /* Set the Prescaler value */
  10398. TIMx->PSC = TIM_TimeBaseInitStruct->TIM_Prescaler;
  10399. 8025ef6: 880b ldrh r3, [r1, #0]
  10400. 8025ef8: 8503 strh r3, [r0, #40] ; 0x28
  10401. if ((TIMx == TIM1) || (TIMx == TIM8))
  10402. 8025efa: 4b06 ldr r3, [pc, #24] ; (8025f14 <TIM_TimeBaseInit+0x74>)
  10403. 8025efc: 4298 cmp r0, r3
  10404. 8025efe: d003 beq.n 8025f08 <TIM_TimeBaseInit+0x68>
  10405. 8025f00: f503 6380 add.w r3, r3, #1024 ; 0x400
  10406. 8025f04: 4298 cmp r0, r3
  10407. 8025f06: d101 bne.n 8025f0c <TIM_TimeBaseInit+0x6c>
  10408. {
  10409. /* Set the Repetition Counter value */
  10410. TIMx->RCR = TIM_TimeBaseInitStruct->TIM_RepetitionCounter;
  10411. 8025f08: 7a8b ldrb r3, [r1, #10]
  10412. 8025f0a: 8603 strh r3, [r0, #48] ; 0x30
  10413. }
  10414. /* Generate an update event to reload the Prescaler
  10415. and the repetition counter(only for TIM1 and TIM8) value immediatly */
  10416. TIMx->EGR = TIM_PSCReloadMode_Immediate;
  10417. 8025f0c: 2301 movs r3, #1
  10418. 8025f0e: 8283 strh r3, [r0, #20]
  10419. 8025f10: 4770 bx lr
  10420. 8025f12: bf00 nop
  10421. 8025f14: 40010000 .word 0x40010000
  10422. 8025f18: 40001000 .word 0x40001000
  10423. 08025f1c <TIM_Cmd>:
  10424. assert_param(IS_FUNCTIONAL_STATE(NewState));
  10425. if (NewState != DISABLE)
  10426. {
  10427. /* Enable the TIM Counter */
  10428. TIMx->CR1 |= TIM_CR1_CEN;
  10429. 8025f1c: 8803 ldrh r3, [r0, #0]
  10430. {
  10431. /* Check the parameters */
  10432. assert_param(IS_TIM_ALL_PERIPH(TIMx));
  10433. assert_param(IS_FUNCTIONAL_STATE(NewState));
  10434. if (NewState != DISABLE)
  10435. 8025f1e: b119 cbz r1, 8025f28 <TIM_Cmd+0xc>
  10436. {
  10437. /* Enable the TIM Counter */
  10438. TIMx->CR1 |= TIM_CR1_CEN;
  10439. 8025f20: b29b uxth r3, r3
  10440. 8025f22: f043 0301 orr.w r3, r3, #1
  10441. 8025f26: e003 b.n 8025f30 <TIM_Cmd+0x14>
  10442. }
  10443. else
  10444. {
  10445. /* Disable the TIM Counter */
  10446. TIMx->CR1 &= (uint16_t)~TIM_CR1_CEN;
  10447. 8025f28: f023 0301 bic.w r3, r3, #1
  10448. 8025f2c: 041b lsls r3, r3, #16
  10449. 8025f2e: 0c1b lsrs r3, r3, #16
  10450. 8025f30: 8003 strh r3, [r0, #0]
  10451. 8025f32: 4770 bx lr
  10452. 08025f34 <TIM_ITConfig>:
  10453. assert_param(IS_FUNCTIONAL_STATE(NewState));
  10454. if (NewState != DISABLE)
  10455. {
  10456. /* Enable the Interrupt sources */
  10457. TIMx->DIER |= TIM_IT;
  10458. 8025f34: 8983 ldrh r3, [r0, #12]
  10459. 8025f36: b29b uxth r3, r3
  10460. /* Check the parameters */
  10461. assert_param(IS_TIM_ALL_PERIPH(TIMx));
  10462. assert_param(IS_TIM_IT(TIM_IT));
  10463. assert_param(IS_FUNCTIONAL_STATE(NewState));
  10464. if (NewState != DISABLE)
  10465. 8025f38: b10a cbz r2, 8025f3e <TIM_ITConfig+0xa>
  10466. {
  10467. /* Enable the Interrupt sources */
  10468. TIMx->DIER |= TIM_IT;
  10469. 8025f3a: 4319 orrs r1, r3
  10470. 8025f3c: e001 b.n 8025f42 <TIM_ITConfig+0xe>
  10471. }
  10472. else
  10473. {
  10474. /* Disable the Interrupt sources */
  10475. TIMx->DIER &= (uint16_t)~TIM_IT;
  10476. 8025f3e: ea23 0101 bic.w r1, r3, r1
  10477. 8025f42: 8181 strh r1, [r0, #12]
  10478. 8025f44: 4770 bx lr
  10479. 08025f46 <TIM_ClearITPendingBit>:
  10480. {
  10481. /* Check the parameters */
  10482. assert_param(IS_TIM_ALL_PERIPH(TIMx));
  10483. /* Clear the IT pending Bit */
  10484. TIMx->SR = (uint16_t)~TIM_IT;
  10485. 8025f46: 43c9 mvns r1, r1
  10486. 8025f48: 8201 strh r1, [r0, #16]
  10487. 8025f4a: 4770 bx lr
  10488. 08025f4c <USART_DeInit>:
  10489. * @param USARTx: where x can be 1, 2, 3, 4, 5 or 6 to select the USART or
  10490. * UART peripheral.
  10491. * @retval None
  10492. */
  10493. void USART_DeInit(USART_TypeDef* USARTx)
  10494. {
  10495. 8025f4c: b508 push {r3, lr}
  10496. /* Check the parameters */
  10497. assert_param(IS_USART_ALL_PERIPH(USARTx));
  10498. if (USARTx == USART1)
  10499. 8025f4e: 4b23 ldr r3, [pc, #140] ; (8025fdc <USART_DeInit+0x90>)
  10500. 8025f50: 4298 cmp r0, r3
  10501. 8025f52: d105 bne.n 8025f60 <USART_DeInit+0x14>
  10502. {
  10503. RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, ENABLE);
  10504. 8025f54: 2010 movs r0, #16
  10505. 8025f56: 2101 movs r1, #1
  10506. 8025f58: f7ff fdcc bl 8025af4 <RCC_APB2PeriphResetCmd>
  10507. RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, DISABLE);
  10508. 8025f5c: 2010 movs r0, #16
  10509. 8025f5e: e037 b.n 8025fd0 <USART_DeInit+0x84>
  10510. }
  10511. else if (USARTx == USART2)
  10512. 8025f60: 4b1f ldr r3, [pc, #124] ; (8025fe0 <USART_DeInit+0x94>)
  10513. 8025f62: 4298 cmp r0, r3
  10514. 8025f64: d107 bne.n 8025f76 <USART_DeInit+0x2a>
  10515. {
  10516. RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2, ENABLE);
  10517. 8025f66: f44f 3000 mov.w r0, #131072 ; 0x20000
  10518. 8025f6a: 2101 movs r1, #1
  10519. 8025f6c: f7ff fdb6 bl 8025adc <RCC_APB1PeriphResetCmd>
  10520. RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2, DISABLE);
  10521. 8025f70: f44f 3000 mov.w r0, #131072 ; 0x20000
  10522. 8025f74: e009 b.n 8025f8a <USART_DeInit+0x3e>
  10523. }
  10524. else if (USARTx == USART3)
  10525. 8025f76: 4b1b ldr r3, [pc, #108] ; (8025fe4 <USART_DeInit+0x98>)
  10526. 8025f78: 4298 cmp r0, r3
  10527. 8025f7a: d10b bne.n 8025f94 <USART_DeInit+0x48>
  10528. {
  10529. RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3, ENABLE);
  10530. 8025f7c: f44f 2080 mov.w r0, #262144 ; 0x40000
  10531. 8025f80: 2101 movs r1, #1
  10532. 8025f82: f7ff fdab bl 8025adc <RCC_APB1PeriphResetCmd>
  10533. RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3, DISABLE);
  10534. 8025f86: f44f 2080 mov.w r0, #262144 ; 0x40000
  10535. 8025f8a: 2100 movs r1, #0
  10536. {
  10537. RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART6, ENABLE);
  10538. RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART6, DISABLE);
  10539. }
  10540. }
  10541. }
  10542. 8025f8c: e8bd 4008 ldmia.w sp!, {r3, lr}
  10543. RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2, DISABLE);
  10544. }
  10545. else if (USARTx == USART3)
  10546. {
  10547. RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3, ENABLE);
  10548. RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3, DISABLE);
  10549. 8025f90: f7ff bda4 b.w 8025adc <RCC_APB1PeriphResetCmd>
  10550. }
  10551. else if (USARTx == UART4)
  10552. 8025f94: 4b14 ldr r3, [pc, #80] ; (8025fe8 <USART_DeInit+0x9c>)
  10553. 8025f96: 4298 cmp r0, r3
  10554. 8025f98: d107 bne.n 8025faa <USART_DeInit+0x5e>
  10555. {
  10556. RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART4, ENABLE);
  10557. 8025f9a: f44f 2000 mov.w r0, #524288 ; 0x80000
  10558. 8025f9e: 2101 movs r1, #1
  10559. 8025fa0: f7ff fd9c bl 8025adc <RCC_APB1PeriphResetCmd>
  10560. RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART4, DISABLE);
  10561. 8025fa4: f44f 2000 mov.w r0, #524288 ; 0x80000
  10562. 8025fa8: e7ef b.n 8025f8a <USART_DeInit+0x3e>
  10563. }
  10564. else if (USARTx == UART5)
  10565. 8025faa: 4b10 ldr r3, [pc, #64] ; (8025fec <USART_DeInit+0xa0>)
  10566. 8025fac: 4298 cmp r0, r3
  10567. 8025fae: d107 bne.n 8025fc0 <USART_DeInit+0x74>
  10568. {
  10569. RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART5, ENABLE);
  10570. 8025fb0: f44f 1080 mov.w r0, #1048576 ; 0x100000
  10571. 8025fb4: 2101 movs r1, #1
  10572. 8025fb6: f7ff fd91 bl 8025adc <RCC_APB1PeriphResetCmd>
  10573. RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART5, DISABLE);
  10574. 8025fba: f44f 1080 mov.w r0, #1048576 ; 0x100000
  10575. 8025fbe: e7e4 b.n 8025f8a <USART_DeInit+0x3e>
  10576. }
  10577. else
  10578. {
  10579. if (USARTx == USART6)
  10580. 8025fc0: 4b0b ldr r3, [pc, #44] ; (8025ff0 <USART_DeInit+0xa4>)
  10581. 8025fc2: 4298 cmp r0, r3
  10582. 8025fc4: d109 bne.n 8025fda <USART_DeInit+0x8e>
  10583. {
  10584. RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART6, ENABLE);
  10585. 8025fc6: 2020 movs r0, #32
  10586. 8025fc8: 2101 movs r1, #1
  10587. 8025fca: f7ff fd93 bl 8025af4 <RCC_APB2PeriphResetCmd>
  10588. RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART6, DISABLE);
  10589. 8025fce: 2020 movs r0, #32
  10590. 8025fd0: 2100 movs r1, #0
  10591. }
  10592. }
  10593. }
  10594. 8025fd2: e8bd 4008 ldmia.w sp!, {r3, lr}
  10595. else
  10596. {
  10597. if (USARTx == USART6)
  10598. {
  10599. RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART6, ENABLE);
  10600. RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART6, DISABLE);
  10601. 8025fd6: f7ff bd8d b.w 8025af4 <RCC_APB2PeriphResetCmd>
  10602. 8025fda: bd08 pop {r3, pc}
  10603. 8025fdc: 40011000 .word 0x40011000
  10604. 8025fe0: 40004400 .word 0x40004400
  10605. 8025fe4: 40004800 .word 0x40004800
  10606. 8025fe8: 40004c00 .word 0x40004c00
  10607. 8025fec: 40005000 .word 0x40005000
  10608. 8025ff0: 40011400 .word 0x40011400
  10609. 08025ff4 <USART_Init>:
  10610. {
  10611. assert_param(IS_USART_1236_PERIPH(USARTx));
  10612. }
  10613. /*---------------------------- USART CR2 Configuration -----------------------*/
  10614. tmpreg = USARTx->CR2;
  10615. 8025ff4: 8a03 ldrh r3, [r0, #16]
  10616. /* Clear STOP[13:12] bits */
  10617. tmpreg &= (uint32_t)~((uint32_t)USART_CR2_STOP);
  10618. /* Configure the USART Stop Bits, Clock, CPOL, CPHA and LastBit :
  10619. Set STOP[13:12] bits according to USART_StopBits value */
  10620. tmpreg |= (uint32_t)USART_InitStruct->USART_StopBits;
  10621. 8025ff6: 88ca ldrh r2, [r1, #6]
  10622. {
  10623. assert_param(IS_USART_1236_PERIPH(USARTx));
  10624. }
  10625. /*---------------------------- USART CR2 Configuration -----------------------*/
  10626. tmpreg = USARTx->CR2;
  10627. 8025ff8: b29b uxth r3, r3
  10628. /* Clear STOP[13:12] bits */
  10629. tmpreg &= (uint32_t)~((uint32_t)USART_CR2_STOP);
  10630. 8025ffa: f423 5340 bic.w r3, r3, #12288 ; 0x3000
  10631. * @param USART_InitStruct: pointer to a USART_InitTypeDef structure that contains
  10632. * the configuration information for the specified USART peripheral.
  10633. * @retval None
  10634. */
  10635. void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct)
  10636. {
  10637. 8025ffe: b530 push {r4, r5, lr}
  10638. /* Configure the USART Stop Bits, Clock, CPOL, CPHA and LastBit :
  10639. Set STOP[13:12] bits according to USART_StopBits value */
  10640. tmpreg |= (uint32_t)USART_InitStruct->USART_StopBits;
  10641. /* Write to USART CR2 */
  10642. USARTx->CR2 = (uint16_t)tmpreg;
  10643. 8026000: 4313 orrs r3, r2
  10644. * @param USART_InitStruct: pointer to a USART_InitTypeDef structure that contains
  10645. * the configuration information for the specified USART peripheral.
  10646. * @retval None
  10647. */
  10648. void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct)
  10649. {
  10650. 8026002: 460d mov r5, r1
  10651. /* Configure the USART Stop Bits, Clock, CPOL, CPHA and LastBit :
  10652. Set STOP[13:12] bits according to USART_StopBits value */
  10653. tmpreg |= (uint32_t)USART_InitStruct->USART_StopBits;
  10654. /* Write to USART CR2 */
  10655. USARTx->CR2 = (uint16_t)tmpreg;
  10656. 8026004: 8203 strh r3, [r0, #16]
  10657. /*---------------------------- USART CR1 Configuration -----------------------*/
  10658. tmpreg = USARTx->CR1;
  10659. 8026006: 8983 ldrh r3, [r0, #12]
  10660. /* Configure the USART Word Length, Parity and mode:
  10661. Set the M bits according to USART_WordLength value
  10662. Set PCE and PS bits according to USART_Parity value
  10663. Set TE and RE bits according to USART_Mode value */
  10664. tmpreg |= (uint32_t)USART_InitStruct->USART_WordLength | USART_InitStruct->USART_Parity |
  10665. 8026008: 8909 ldrh r1, [r1, #8]
  10666. 802600a: 88aa ldrh r2, [r5, #4]
  10667. /*---------------------------- USART CR1 Configuration -----------------------*/
  10668. tmpreg = USARTx->CR1;
  10669. /* Clear M, PCE, PS, TE and RE bits */
  10670. tmpreg &= (uint32_t)~((uint32_t)CR1_CLEAR_MASK);
  10671. 802600c: f423 53b0 bic.w r3, r3, #5632 ; 0x1600
  10672. /* Configure the USART Word Length, Parity and mode:
  10673. Set the M bits according to USART_WordLength value
  10674. Set PCE and PS bits according to USART_Parity value
  10675. Set TE and RE bits according to USART_Mode value */
  10676. tmpreg |= (uint32_t)USART_InitStruct->USART_WordLength | USART_InitStruct->USART_Parity |
  10677. 8026010: 430a orrs r2, r1
  10678. 8026012: 8969 ldrh r1, [r5, #10]
  10679. /*---------------------------- USART CR1 Configuration -----------------------*/
  10680. tmpreg = USARTx->CR1;
  10681. /* Clear M, PCE, PS, TE and RE bits */
  10682. tmpreg &= (uint32_t)~((uint32_t)CR1_CLEAR_MASK);
  10683. 8026014: f023 030c bic.w r3, r3, #12
  10684. 8026018: 041b lsls r3, r3, #16
  10685. /* Configure the USART Word Length, Parity and mode:
  10686. Set the M bits according to USART_WordLength value
  10687. Set PCE and PS bits according to USART_Parity value
  10688. Set TE and RE bits according to USART_Mode value */
  10689. tmpreg |= (uint32_t)USART_InitStruct->USART_WordLength | USART_InitStruct->USART_Parity |
  10690. 802601a: 430a orrs r2, r1
  10691. /*---------------------------- USART CR1 Configuration -----------------------*/
  10692. tmpreg = USARTx->CR1;
  10693. /* Clear M, PCE, PS, TE and RE bits */
  10694. tmpreg &= (uint32_t)~((uint32_t)CR1_CLEAR_MASK);
  10695. 802601c: 0c1b lsrs r3, r3, #16
  10696. /* Configure the USART Word Length, Parity and mode:
  10697. Set the M bits according to USART_WordLength value
  10698. Set PCE and PS bits according to USART_Parity value
  10699. Set TE and RE bits according to USART_Mode value */
  10700. tmpreg |= (uint32_t)USART_InitStruct->USART_WordLength | USART_InitStruct->USART_Parity |
  10701. 802601e: b292 uxth r2, r2
  10702. USART_InitStruct->USART_Mode;
  10703. /* Write to USART CR1 */
  10704. USARTx->CR1 = (uint16_t)tmpreg;
  10705. 8026020: 4313 orrs r3, r2
  10706. 8026022: 8183 strh r3, [r0, #12]
  10707. /*---------------------------- USART CR3 Configuration -----------------------*/
  10708. tmpreg = USARTx->CR3;
  10709. 8026024: 8a83 ldrh r3, [r0, #20]
  10710. /* Clear CTSE and RTSE bits */
  10711. tmpreg &= (uint32_t)~((uint32_t)CR3_CLEAR_MASK);
  10712. /* Configure the USART HFC :
  10713. Set CTSE and RTSE bits according to USART_HardwareFlowControl value */
  10714. tmpreg |= USART_InitStruct->USART_HardwareFlowControl;
  10715. 8026026: 89aa ldrh r2, [r5, #12]
  10716. /* Write to USART CR1 */
  10717. USARTx->CR1 = (uint16_t)tmpreg;
  10718. /*---------------------------- USART CR3 Configuration -----------------------*/
  10719. tmpreg = USARTx->CR3;
  10720. 8026028: b29b uxth r3, r3
  10721. /* Clear CTSE and RTSE bits */
  10722. tmpreg &= (uint32_t)~((uint32_t)CR3_CLEAR_MASK);
  10723. 802602a: f423 7340 bic.w r3, r3, #768 ; 0x300
  10724. /* Configure the USART HFC :
  10725. Set CTSE and RTSE bits according to USART_HardwareFlowControl value */
  10726. tmpreg |= USART_InitStruct->USART_HardwareFlowControl;
  10727. /* Write to USART CR3 */
  10728. USARTx->CR3 = (uint16_t)tmpreg;
  10729. 802602e: 4313 orrs r3, r2
  10730. * @param USART_InitStruct: pointer to a USART_InitTypeDef structure that contains
  10731. * the configuration information for the specified USART peripheral.
  10732. * @retval None
  10733. */
  10734. void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct)
  10735. {
  10736. 8026030: b085 sub sp, #20
  10737. /* Configure the USART HFC :
  10738. Set CTSE and RTSE bits according to USART_HardwareFlowControl value */
  10739. tmpreg |= USART_InitStruct->USART_HardwareFlowControl;
  10740. /* Write to USART CR3 */
  10741. USARTx->CR3 = (uint16_t)tmpreg;
  10742. 8026032: 8283 strh r3, [r0, #20]
  10743. * @param USART_InitStruct: pointer to a USART_InitTypeDef structure that contains
  10744. * the configuration information for the specified USART peripheral.
  10745. * @retval None
  10746. */
  10747. void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct)
  10748. {
  10749. 8026034: 4604 mov r4, r0
  10750. /* Write to USART CR3 */
  10751. USARTx->CR3 = (uint16_t)tmpreg;
  10752. /*---------------------------- USART BRR Configuration -----------------------*/
  10753. /* Configure the USART Baud Rate */
  10754. RCC_GetClocksFreq(&RCC_ClocksStatus);
  10755. 8026036: 4668 mov r0, sp
  10756. 8026038: f7ff fcb0 bl 802599c <RCC_GetClocksFreq>
  10757. if ((USARTx == USART1) || (USARTx == USART6))
  10758. 802603c: 4b19 ldr r3, [pc, #100] ; (80260a4 <USART_Init+0xb0>)
  10759. 802603e: 429c cmp r4, r3
  10760. 8026040: d003 beq.n 802604a <USART_Init+0x56>
  10761. 8026042: f503 6380 add.w r3, r3, #1024 ; 0x400
  10762. 8026046: 429c cmp r4, r3
  10763. 8026048: d101 bne.n 802604e <USART_Init+0x5a>
  10764. {
  10765. apbclock = RCC_ClocksStatus.PCLK2_Frequency;
  10766. 802604a: 9b03 ldr r3, [sp, #12]
  10767. 802604c: e000 b.n 8026050 <USART_Init+0x5c>
  10768. }
  10769. else
  10770. {
  10771. apbclock = RCC_ClocksStatus.PCLK1_Frequency;
  10772. 802604e: 9b02 ldr r3, [sp, #8]
  10773. }
  10774. /* Determine the integer part */
  10775. if ((USARTx->CR1 & USART_CR1_OVER8) != 0)
  10776. 8026050: 89a2 ldrh r2, [r4, #12]
  10777. 8026052: b212 sxth r2, r2
  10778. 8026054: 2a00 cmp r2, #0
  10779. 8026056: f04f 0119 mov.w r1, #25
  10780. 802605a: 682a ldr r2, [r5, #0]
  10781. {
  10782. /* Integer part computing in case Oversampling mode is 8 Samples */
  10783. integerdivider = ((25 * apbclock) / (2 * (USART_InitStruct->USART_BaudRate)));
  10784. 802605c: fb01 f103 mul.w r1, r1, r3
  10785. {
  10786. apbclock = RCC_ClocksStatus.PCLK1_Frequency;
  10787. }
  10788. /* Determine the integer part */
  10789. if ((USARTx->CR1 & USART_CR1_OVER8) != 0)
  10790. 8026060: da01 bge.n 8026066 <USART_Init+0x72>
  10791. {
  10792. /* Integer part computing in case Oversampling mode is 8 Samples */
  10793. integerdivider = ((25 * apbclock) / (2 * (USART_InitStruct->USART_BaudRate)));
  10794. 8026062: 0052 lsls r2, r2, #1
  10795. 8026064: e000 b.n 8026068 <USART_Init+0x74>
  10796. }
  10797. else /* if ((USARTx->CR1 & USART_CR1_OVER8) == 0) */
  10798. {
  10799. /* Integer part computing in case Oversampling mode is 16 Samples */
  10800. integerdivider = ((25 * apbclock) / (4 * (USART_InitStruct->USART_BaudRate)));
  10801. 8026066: 0092 lsls r2, r2, #2
  10802. }
  10803. tmpreg = (integerdivider / 100) << 4;
  10804. 8026068: 2364 movs r3, #100 ; 0x64
  10805. integerdivider = ((25 * apbclock) / (2 * (USART_InitStruct->USART_BaudRate)));
  10806. }
  10807. else /* if ((USARTx->CR1 & USART_CR1_OVER8) == 0) */
  10808. {
  10809. /* Integer part computing in case Oversampling mode is 16 Samples */
  10810. integerdivider = ((25 * apbclock) / (4 * (USART_InitStruct->USART_BaudRate)));
  10811. 802606a: fbb1 f1f2 udiv r1, r1, r2
  10812. }
  10813. tmpreg = (integerdivider / 100) << 4;
  10814. 802606e: fbb1 f2f3 udiv r2, r1, r3
  10815. 8026072: 0112 lsls r2, r2, #4
  10816. /* Determine the fractional part */
  10817. fractionaldivider = integerdivider - (100 * (tmpreg >> 4));
  10818. 8026074: 0910 lsrs r0, r2, #4
  10819. 8026076: fb03 1110 mls r1, r3, r0, r1
  10820. /* Implement the fractional part in the register */
  10821. if ((USARTx->CR1 & USART_CR1_OVER8) != 0)
  10822. 802607a: 89a0 ldrh r0, [r4, #12]
  10823. 802607c: b200 sxth r0, r0
  10824. 802607e: 2800 cmp r0, #0
  10825. 8026080: da06 bge.n 8026090 <USART_Init+0x9c>
  10826. {
  10827. tmpreg |= ((((fractionaldivider * 8) + 50) / 100)) & ((uint8_t)0x07);
  10828. 8026082: 00c9 lsls r1, r1, #3
  10829. 8026084: 3132 adds r1, #50 ; 0x32
  10830. 8026086: fbb1 f3f3 udiv r3, r1, r3
  10831. 802608a: f003 0307 and.w r3, r3, #7
  10832. 802608e: e005 b.n 802609c <USART_Init+0xa8>
  10833. }
  10834. else /* if ((USARTx->CR1 & USART_CR1_OVER8) == 0) */
  10835. {
  10836. tmpreg |= ((((fractionaldivider * 16) + 50) / 100)) & ((uint8_t)0x0F);
  10837. 8026090: 0109 lsls r1, r1, #4
  10838. 8026092: 3132 adds r1, #50 ; 0x32
  10839. 8026094: fbb1 f3f3 udiv r3, r1, r3
  10840. 8026098: f003 030f and.w r3, r3, #15
  10841. 802609c: 431a orrs r2, r3
  10842. }
  10843. /* Write to USART BRR register */
  10844. USARTx->BRR = (uint16_t)tmpreg;
  10845. 802609e: 8122 strh r2, [r4, #8]
  10846. }
  10847. 80260a0: b005 add sp, #20
  10848. 80260a2: bd30 pop {r4, r5, pc}
  10849. 80260a4: 40011000 .word 0x40011000
  10850. 080260a8 <USART_Cmd>:
  10851. assert_param(IS_FUNCTIONAL_STATE(NewState));
  10852. if (NewState != DISABLE)
  10853. {
  10854. /* Enable the selected USART by setting the UE bit in the CR1 register */
  10855. USARTx->CR1 |= USART_CR1_UE;
  10856. 80260a8: 8983 ldrh r3, [r0, #12]
  10857. {
  10858. /* Check the parameters */
  10859. assert_param(IS_USART_ALL_PERIPH(USARTx));
  10860. assert_param(IS_FUNCTIONAL_STATE(NewState));
  10861. if (NewState != DISABLE)
  10862. 80260aa: b119 cbz r1, 80260b4 <USART_Cmd+0xc>
  10863. {
  10864. /* Enable the selected USART by setting the UE bit in the CR1 register */
  10865. USARTx->CR1 |= USART_CR1_UE;
  10866. 80260ac: b29b uxth r3, r3
  10867. 80260ae: f443 5300 orr.w r3, r3, #8192 ; 0x2000
  10868. 80260b2: e003 b.n 80260bc <USART_Cmd+0x14>
  10869. }
  10870. else
  10871. {
  10872. /* Disable the selected USART by clearing the UE bit in the CR1 register */
  10873. USARTx->CR1 &= (uint16_t)~((uint16_t)USART_CR1_UE);
  10874. 80260b4: f423 5300 bic.w r3, r3, #8192 ; 0x2000
  10875. 80260b8: 041b lsls r3, r3, #16
  10876. 80260ba: 0c1b lsrs r3, r3, #16
  10877. 80260bc: 8183 strh r3, [r0, #12]
  10878. 80260be: 4770 bx lr
  10879. 080260c0 <USART_ITConfig>:
  10880. }
  10881. usartxbase = (uint32_t)USARTx;
  10882. /* Get the USART register index */
  10883. usartreg = (((uint8_t)USART_IT) >> 0x05);
  10884. 80260c0: f3c1 1342 ubfx r3, r1, #5, #3
  10885. * @param NewState: new state of the specified USARTx interrupts.
  10886. * This parameter can be: ENABLE or DISABLE.
  10887. * @retval None
  10888. */
  10889. void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState)
  10890. {
  10891. 80260c4: b510 push {r4, lr}
  10892. /* Get the USART register index */
  10893. usartreg = (((uint8_t)USART_IT) >> 0x05);
  10894. /* Get the interrupt position */
  10895. itpos = USART_IT & IT_MASK;
  10896. itmask = (((uint32_t)0x01) << itpos);
  10897. 80260c6: 2401 movs r4, #1
  10898. 80260c8: f001 011f and.w r1, r1, #31
  10899. if (usartreg == 0x01) /* The IT is in CR1 register */
  10900. 80260cc: 42a3 cmp r3, r4
  10901. /* Get the USART register index */
  10902. usartreg = (((uint8_t)USART_IT) >> 0x05);
  10903. /* Get the interrupt position */
  10904. itpos = USART_IT & IT_MASK;
  10905. itmask = (((uint32_t)0x01) << itpos);
  10906. 80260ce: fa04 f101 lsl.w r1, r4, r1
  10907. if (usartreg == 0x01) /* The IT is in CR1 register */
  10908. 80260d2: d101 bne.n 80260d8 <USART_ITConfig+0x18>
  10909. {
  10910. usartxbase += 0x0C;
  10911. 80260d4: 300c adds r0, #12
  10912. 80260d6: e004 b.n 80260e2 <USART_ITConfig+0x22>
  10913. }
  10914. else if (usartreg == 0x02) /* The IT is in CR2 register */
  10915. 80260d8: 2b02 cmp r3, #2
  10916. 80260da: d101 bne.n 80260e0 <USART_ITConfig+0x20>
  10917. {
  10918. usartxbase += 0x10;
  10919. 80260dc: 3010 adds r0, #16
  10920. 80260de: e000 b.n 80260e2 <USART_ITConfig+0x22>
  10921. }
  10922. else /* The IT is in CR3 register */
  10923. {
  10924. usartxbase += 0x14;
  10925. 80260e0: 3014 adds r0, #20
  10926. }
  10927. if (NewState != DISABLE)
  10928. {
  10929. *(__IO uint32_t*)usartxbase |= itmask;
  10930. 80260e2: 6803 ldr r3, [r0, #0]
  10931. }
  10932. else /* The IT is in CR3 register */
  10933. {
  10934. usartxbase += 0x14;
  10935. }
  10936. if (NewState != DISABLE)
  10937. 80260e4: b10a cbz r2, 80260ea <USART_ITConfig+0x2a>
  10938. {
  10939. *(__IO uint32_t*)usartxbase |= itmask;
  10940. 80260e6: 4319 orrs r1, r3
  10941. 80260e8: e001 b.n 80260ee <USART_ITConfig+0x2e>
  10942. }
  10943. else
  10944. {
  10945. *(__IO uint32_t*)usartxbase &= ~itmask;
  10946. 80260ea: ea23 0101 bic.w r1, r3, r1
  10947. 80260ee: 6001 str r1, [r0, #0]
  10948. 80260f0: bd10 pop {r4, pc}
  10949. 080260f2 <USART_GetITStatus>:
  10950. * @arg USART_IT_FE: Framing Error interrupt
  10951. * @arg USART_IT_PE: Parity Error interrupt
  10952. * @retval The new state of USART_IT (SET or RESET).
  10953. */
  10954. ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT)
  10955. {
  10956. 80260f2: b510 push {r4, lr}
  10957. {
  10958. assert_param(IS_USART_1236_PERIPH(USARTx));
  10959. }
  10960. /* Get the USART register index */
  10961. usartreg = (((uint8_t)USART_IT) >> 0x05);
  10962. 80260f4: f3c1 1442 ubfx r4, r1, #5, #3
  10963. /* Get the interrupt position */
  10964. itmask = USART_IT & IT_MASK;
  10965. itmask = (uint32_t)0x01 << itmask;
  10966. 80260f8: 2201 movs r2, #1
  10967. 80260fa: f001 031f and.w r3, r1, #31
  10968. if (usartreg == 0x01) /* The IT is in CR1 register */
  10969. 80260fe: 2c01 cmp r4, #1
  10970. /* Get the USART register index */
  10971. usartreg = (((uint8_t)USART_IT) >> 0x05);
  10972. /* Get the interrupt position */
  10973. itmask = USART_IT & IT_MASK;
  10974. itmask = (uint32_t)0x01 << itmask;
  10975. 8026100: fa02 f203 lsl.w r2, r2, r3
  10976. if (usartreg == 0x01) /* The IT is in CR1 register */
  10977. 8026104: d101 bne.n 802610a <USART_GetITStatus+0x18>
  10978. {
  10979. itmask &= USARTx->CR1;
  10980. 8026106: 8983 ldrh r3, [r0, #12]
  10981. 8026108: e003 b.n 8026112 <USART_GetITStatus+0x20>
  10982. }
  10983. else if (usartreg == 0x02) /* The IT is in CR2 register */
  10984. 802610a: 2c02 cmp r4, #2
  10985. {
  10986. itmask &= USARTx->CR2;
  10987. 802610c: bf0c ite eq
  10988. 802610e: 8a03 ldrheq r3, [r0, #16]
  10989. }
  10990. else /* The IT is in CR3 register */
  10991. {
  10992. itmask &= USARTx->CR3;
  10993. 8026110: 8a83 ldrhne r3, [r0, #20]
  10994. 8026112: b29b uxth r3, r3
  10995. 8026114: 4013 ands r3, r2
  10996. }
  10997. bitpos = USART_IT >> 0x08;
  10998. bitpos = (uint32_t)0x01 << bitpos;
  10999. bitpos &= USARTx->SR;
  11000. 8026116: 8802 ldrh r2, [r0, #0]
  11001. 8026118: b292 uxth r2, r2
  11002. if ((itmask != (uint16_t)RESET)&&(bitpos != (uint16_t)RESET))
  11003. 802611a: b143 cbz r3, 802612e <USART_GetITStatus+0x3c>
  11004. {
  11005. itmask &= USARTx->CR3;
  11006. }
  11007. bitpos = USART_IT >> 0x08;
  11008. bitpos = (uint32_t)0x01 << bitpos;
  11009. 802611c: 2301 movs r3, #1
  11010. 802611e: 0a09 lsrs r1, r1, #8
  11011. 8026120: fa03 f101 lsl.w r1, r3, r1
  11012. bitpos &= USARTx->SR;
  11013. if ((itmask != (uint16_t)RESET)&&(bitpos != (uint16_t)RESET))
  11014. 8026124: 4211 tst r1, r2
  11015. {
  11016. bitstatus = SET;
  11017. 8026126: bf0c ite eq
  11018. 8026128: 2000 moveq r0, #0
  11019. 802612a: 2001 movne r0, #1
  11020. 802612c: bd10 pop {r4, pc}
  11021. }
  11022. else
  11023. {
  11024. bitstatus = RESET;
  11025. 802612e: 4618 mov r0, r3
  11026. }
  11027. return bitstatus;
  11028. }
  11029. 8026130: bd10 pop {r4, pc}
  11030. 08026132 <USART_ClearITPendingBit>:
  11031. {
  11032. assert_param(IS_USART_1236_PERIPH(USARTx));
  11033. }
  11034. bitpos = USART_IT >> 0x08;
  11035. itmask = ((uint16_t)0x01 << (uint16_t)bitpos);
  11036. 8026132: 0a09 lsrs r1, r1, #8
  11037. 8026134: 2301 movs r3, #1
  11038. 8026136: fa03 f301 lsl.w r3, r3, r1
  11039. USARTx->SR = (uint16_t)~itmask;
  11040. 802613a: 43db mvns r3, r3
  11041. 802613c: 8003 strh r3, [r0, #0]
  11042. 802613e: 4770 bx lr
  11043. 08026140 <SystemInit>:
  11044. SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */
  11045. #endif
  11046. /* Reset the RCC clock configuration to the default reset state ------------*/
  11047. /* Set HSION bit */
  11048. RCC->CR |= (uint32_t)0x00000001;
  11049. 8026140: 4b35 ldr r3, [pc, #212] ; (8026218 <SystemInit+0xd8>)
  11050. 8026142: 681a ldr r2, [r3, #0]
  11051. 8026144: f042 0201 orr.w r2, r2, #1
  11052. 8026148: 601a str r2, [r3, #0]
  11053. /* Reset CFGR register */
  11054. RCC->CFGR = 0x00000000;
  11055. 802614a: 2200 movs r2, #0
  11056. 802614c: 609a str r2, [r3, #8]
  11057. /* Reset HSEON, CSSON and PLLON bits */
  11058. RCC->CR &= (uint32_t)0xFEF6FFFF;
  11059. 802614e: 6819 ldr r1, [r3, #0]
  11060. 8026150: f021 7184 bic.w r1, r1, #17301504 ; 0x1080000
  11061. 8026154: f421 3180 bic.w r1, r1, #65536 ; 0x10000
  11062. 8026158: 6019 str r1, [r3, #0]
  11063. /* Reset PLLCFGR register */
  11064. RCC->PLLCFGR = 0x24003010;
  11065. 802615a: 4930 ldr r1, [pc, #192] ; (802621c <SystemInit+0xdc>)
  11066. 802615c: 6059 str r1, [r3, #4]
  11067. /* Reset HSEBYP bit */
  11068. RCC->CR &= (uint32_t)0xFFFBFFFF;
  11069. 802615e: 6819 ldr r1, [r3, #0]
  11070. * SystemFrequency variable.
  11071. * @param None
  11072. * @retval None
  11073. */
  11074. void SystemInit(void)
  11075. {
  11076. 8026160: b082 sub sp, #8
  11077. /* Reset PLLCFGR register */
  11078. RCC->PLLCFGR = 0x24003010;
  11079. /* Reset HSEBYP bit */
  11080. RCC->CR &= (uint32_t)0xFFFBFFFF;
  11081. 8026162: f421 2180 bic.w r1, r1, #262144 ; 0x40000
  11082. 8026166: 6019 str r1, [r3, #0]
  11083. /* Disable all interrupts */
  11084. RCC->CIR = 0x00000000;
  11085. 8026168: 60da str r2, [r3, #12]
  11086. static void SetSysClock(void)
  11087. {
  11088. /******************************************************************************/
  11089. /* PLL (clocked by HSE) used as System clock source */
  11090. /******************************************************************************/
  11091. __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
  11092. 802616a: 9200 str r2, [sp, #0]
  11093. 802616c: 9201 str r2, [sp, #4]
  11094. /* Enable HSE */
  11095. RCC->CR |= ((uint32_t)RCC_CR_HSEON);
  11096. 802616e: 681a ldr r2, [r3, #0]
  11097. 8026170: f442 3280 orr.w r2, r2, #65536 ; 0x10000
  11098. 8026174: 601a str r2, [r3, #0]
  11099. /* Wait till HSE is ready and if Time out is reached exit */
  11100. do
  11101. {
  11102. HSEStatus = RCC->CR & RCC_CR_HSERDY;
  11103. 8026176: 681a ldr r2, [r3, #0]
  11104. 8026178: f402 3200 and.w r2, r2, #131072 ; 0x20000
  11105. 802617c: 9201 str r2, [sp, #4]
  11106. StartUpCounter++;
  11107. 802617e: 9a00 ldr r2, [sp, #0]
  11108. 8026180: 3201 adds r2, #1
  11109. 8026182: 9200 str r2, [sp, #0]
  11110. } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
  11111. 8026184: 9a01 ldr r2, [sp, #4]
  11112. 8026186: b91a cbnz r2, 8026190 <SystemInit+0x50>
  11113. 8026188: 9a00 ldr r2, [sp, #0]
  11114. 802618a: f5b2 6fa0 cmp.w r2, #1280 ; 0x500
  11115. 802618e: d1f2 bne.n 8026176 <SystemInit+0x36>
  11116. if ((RCC->CR & RCC_CR_HSERDY) != RESET)
  11117. 8026190: 4b21 ldr r3, [pc, #132] ; (8026218 <SystemInit+0xd8>)
  11118. 8026192: 681b ldr r3, [r3, #0]
  11119. 8026194: f413 3300 ands.w r3, r3, #131072 ; 0x20000
  11120. {
  11121. HSEStatus = (uint32_t)0x01;
  11122. 8026198: bf18 it ne
  11123. 802619a: 2301 movne r3, #1
  11124. }
  11125. else
  11126. {
  11127. HSEStatus = (uint32_t)0x00;
  11128. 802619c: 9301 str r3, [sp, #4]
  11129. }
  11130. if (HSEStatus == (uint32_t)0x01)
  11131. 802619e: 9b01 ldr r3, [sp, #4]
  11132. 80261a0: 2b01 cmp r3, #1
  11133. 80261a2: d133 bne.n 802620c <SystemInit+0xcc>
  11134. {
  11135. /* Select regulator voltage output Scale 1 mode, System frequency up to 168 MHz */
  11136. RCC->APB1ENR |= RCC_APB1ENR_PWREN;
  11137. 80261a4: 4b1c ldr r3, [pc, #112] ; (8026218 <SystemInit+0xd8>)
  11138. 80261a6: 6c1a ldr r2, [r3, #64] ; 0x40
  11139. 80261a8: f042 5280 orr.w r2, r2, #268435456 ; 0x10000000
  11140. 80261ac: 641a str r2, [r3, #64] ; 0x40
  11141. PWR->CR |= PWR_CR_VOS;
  11142. 80261ae: 4a1c ldr r2, [pc, #112] ; (8026220 <SystemInit+0xe0>)
  11143. 80261b0: 6811 ldr r1, [r2, #0]
  11144. 80261b2: f441 4180 orr.w r1, r1, #16384 ; 0x4000
  11145. 80261b6: 6011 str r1, [r2, #0]
  11146. /* HCLK = SYSCLK / 1*/
  11147. RCC->CFGR |= RCC_CFGR_HPRE_DIV1;
  11148. 80261b8: 689a ldr r2, [r3, #8]
  11149. 80261ba: 609a str r2, [r3, #8]
  11150. /* PCLK2 = HCLK / 2*/
  11151. RCC->CFGR |= RCC_CFGR_PPRE2_DIV2;
  11152. 80261bc: 689a ldr r2, [r3, #8]
  11153. 80261be: f442 4200 orr.w r2, r2, #32768 ; 0x8000
  11154. 80261c2: 609a str r2, [r3, #8]
  11155. /* PCLK1 = HCLK / 4*/
  11156. RCC->CFGR |= RCC_CFGR_PPRE1_DIV4;
  11157. 80261c4: 689a ldr r2, [r3, #8]
  11158. 80261c6: f442 52a0 orr.w r2, r2, #5120 ; 0x1400
  11159. 80261ca: 609a str r2, [r3, #8]
  11160. /* Configure the main PLL */
  11161. RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) |
  11162. 80261cc: 4a15 ldr r2, [pc, #84] ; (8026224 <SystemInit+0xe4>)
  11163. 80261ce: 605a str r2, [r3, #4]
  11164. (RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24);
  11165. /* Enable the main PLL */
  11166. RCC->CR |= RCC_CR_PLLON;
  11167. 80261d0: 681a ldr r2, [r3, #0]
  11168. 80261d2: f042 7280 orr.w r2, r2, #16777216 ; 0x1000000
  11169. 80261d6: 601a str r2, [r3, #0]
  11170. /* Wait till the main PLL is ready */
  11171. while((RCC->CR & RCC_CR_PLLRDY) == 0)
  11172. 80261d8: 6819 ldr r1, [r3, #0]
  11173. 80261da: 4a0f ldr r2, [pc, #60] ; (8026218 <SystemInit+0xd8>)
  11174. 80261dc: 0189 lsls r1, r1, #6
  11175. 80261de: d5fb bpl.n 80261d8 <SystemInit+0x98>
  11176. {
  11177. }
  11178. /* Configure Flash prefetch, Instruction cache, Data cache and wait state */
  11179. FLASH->ACR = FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_5WS;
  11180. 80261e0: 4b11 ldr r3, [pc, #68] ; (8026228 <SystemInit+0xe8>)
  11181. 80261e2: f240 6105 movw r1, #1541 ; 0x605
  11182. 80261e6: 6019 str r1, [r3, #0]
  11183. /* Select the main PLL as system clock source */
  11184. RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
  11185. 80261e8: 6893 ldr r3, [r2, #8]
  11186. 80261ea: f023 0303 bic.w r3, r3, #3
  11187. 80261ee: 6093 str r3, [r2, #8]
  11188. RCC->CFGR |= RCC_CFGR_SW_PLL;
  11189. 80261f0: 6893 ldr r3, [r2, #8]
  11190. 80261f2: f043 0302 orr.w r3, r3, #2
  11191. 80261f6: 6093 str r3, [r2, #8]
  11192. /* Wait till the main PLL is used as system clock source */
  11193. while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL);
  11194. 80261f8: 6891 ldr r1, [r2, #8]
  11195. 80261fa: 4b07 ldr r3, [pc, #28] ; (8026218 <SystemInit+0xd8>)
  11196. 80261fc: f001 010c and.w r1, r1, #12
  11197. 8026200: 2908 cmp r1, #8
  11198. 8026202: d1f9 bne.n 80261f8 <SystemInit+0xb8>
  11199. {
  11200. }
  11201. /* Добавил переход на внутренний генератор в случае отказа HSE */
  11202. RCC->CR|=RCC_CR_CSSON;
  11203. 8026204: 681a ldr r2, [r3, #0]
  11204. 8026206: f442 2200 orr.w r2, r2, #524288 ; 0x80000
  11205. 802620a: 601a str r2, [r3, #0]
  11206. /* Configure the Vector Table location add offset address ------------------*/
  11207. #ifdef VECT_TAB_SRAM
  11208. SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
  11209. #else
  11210. SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
  11211. 802620c: 4b07 ldr r3, [pc, #28] ; (802622c <SystemInit+0xec>)
  11212. 802620e: f04f 6200 mov.w r2, #134217728 ; 0x8000000
  11213. 8026212: 609a str r2, [r3, #8]
  11214. #endif
  11215. }
  11216. 8026214: b002 add sp, #8
  11217. 8026216: 4770 bx lr
  11218. 8026218: 40023800 .word 0x40023800
  11219. 802621c: 24003010 .word 0x24003010
  11220. 8026220: 40007000 .word 0x40007000
  11221. 8026224: 07405419 .word 0x07405419
  11222. 8026228: 40023c00 .word 0x40023c00
  11223. 802622c: e000ed00 .word 0xe000ed00
  11224. 08026230 <gpio_hw_config_pin>:
  11225. GPIO_TABLE(EXPAND_AS_DEFS)
  11226. };
  11227. void gpio_hw_config_pin(GPIO_TypeDef *port, uint8_t pin, uint16_t conf) {
  11228. uint8_t shift;
  11229. shift = pin * 2;
  11230. 8026230: 004b lsls r3, r1, #1
  11231. port->MODER &= ~(GPIO_MODER_MASK << shift);
  11232. 8026232: b2db uxtb r3, r3
  11233. gpio_pindef_t gpio_pins[] = {
  11234. GPIO_TABLE(EXPAND_AS_DEFS)
  11235. };
  11236. void gpio_hw_config_pin(GPIO_TypeDef *port, uint8_t pin, uint16_t conf) {
  11237. 8026234: b570 push {r4, r5, r6, lr}
  11238. uint8_t shift;
  11239. shift = pin * 2;
  11240. port->MODER &= ~(GPIO_MODER_MASK << shift);
  11241. 8026236: 2403 movs r4, #3
  11242. 8026238: 6805 ldr r5, [r0, #0]
  11243. 802623a: fa04 f403 lsl.w r4, r4, r3
  11244. 802623e: 43e4 mvns r4, r4
  11245. 8026240: 4025 ands r5, r4
  11246. 8026242: 6005 str r5, [r0, #0]
  11247. port->MODER |= (uint32_t)((conf >> GPIO_MODE_CFG_SHIFT) & GPIO_MODER_MASK) << shift;
  11248. 8026244: 6806 ldr r6, [r0, #0]
  11249. 8026246: f002 0503 and.w r5, r2, #3
  11250. 802624a: fa05 f503 lsl.w r5, r5, r3
  11251. 802624e: 4335 orrs r5, r6
  11252. 8026250: 6005 str r5, [r0, #0]
  11253. port->OTYPER &= ~(GPIO_TYPER_MASK << pin);
  11254. 8026252: 6846 ldr r6, [r0, #4]
  11255. 8026254: 2501 movs r5, #1
  11256. 8026256: fa05 f501 lsl.w r5, r5, r1
  11257. 802625a: ea26 0505 bic.w r5, r6, r5
  11258. 802625e: 6045 str r5, [r0, #4]
  11259. port->OTYPER |= (uint32_t)((conf >> GPIO_TYPE_CFG_SHIFT) & GPIO_TYPER_MASK) << pin;
  11260. 8026260: 6845 ldr r5, [r0, #4]
  11261. 8026262: f3c2 0680 ubfx r6, r2, #2, #1
  11262. 8026266: fa06 f101 lsl.w r1, r6, r1
  11263. 802626a: 4329 orrs r1, r5
  11264. 802626c: 6041 str r1, [r0, #4]
  11265. port->OSPEEDR &= ~(GPIO_SPEEDR_MASK << shift);
  11266. 802626e: 6881 ldr r1, [r0, #8]
  11267. 8026270: 4021 ands r1, r4
  11268. 8026272: 6081 str r1, [r0, #8]
  11269. port->OSPEEDR |= (uint32_t)((conf >> GPIO_SPEED_CFG_SHIFT) & GPIO_SPEEDR_MASK) << shift;
  11270. 8026274: 6885 ldr r5, [r0, #8]
  11271. 8026276: f3c2 1101 ubfx r1, r2, #4, #2
  11272. 802627a: fa01 f103 lsl.w r1, r1, r3
  11273. 802627e: 4329 orrs r1, r5
  11274. 8026280: 6081 str r1, [r0, #8]
  11275. port->PUPDR &= ~(GPIO_PUPDR_MASK << shift);
  11276. 8026282: 68c1 ldr r1, [r0, #12]
  11277. 8026284: 400c ands r4, r1
  11278. 8026286: 60c4 str r4, [r0, #12]
  11279. port->PUPDR |= (uint32_t)((conf >> GPIO_PUPD_CFG_SHIFT) & GPIO_PUPDR_MASK) << shift;
  11280. 8026288: 68c1 ldr r1, [r0, #12]
  11281. 802628a: f3c2 1281 ubfx r2, r2, #6, #2
  11282. 802628e: fa02 f303 lsl.w r3, r2, r3
  11283. 8026292: 430b orrs r3, r1
  11284. 8026294: 60c3 str r3, [r0, #12]
  11285. 8026296: bd70 pop {r4, r5, r6, pc}
  11286. 08026298 <gpio_connect_af>:
  11287. }
  11288. void gpio_connect_af(gpio_t id, uint8_t af_n) {
  11289. 8026298: b510 push {r4, lr}
  11290. gpio_pindef_t *pin = &gpio_pins[id];
  11291. 802629a: 4b13 ldr r3, [pc, #76] ; (80262e8 <gpio_connect_af+0x50>)
  11292. 802629c: eb03 02c0 add.w r2, r3, r0, lsl #3
  11293. uint8_t shift;
  11294. if (pin->pin < 8) {
  11295. shift = pin->pin * 4;
  11296. pin->port->AFR[0] &= ~((uint32_t)GPIO_AFR_MASK << shift);
  11297. 80262a0: f853 3030 ldr.w r3, [r3, r0, lsl #3]
  11298. }
  11299. void gpio_connect_af(gpio_t id, uint8_t af_n) {
  11300. gpio_pindef_t *pin = &gpio_pins[id];
  11301. uint8_t shift;
  11302. if (pin->pin < 8) {
  11303. 80262a4: 7912 ldrb r2, [r2, #4]
  11304. 80262a6: 2a07 cmp r2, #7
  11305. 80262a8: d80e bhi.n 80262c8 <gpio_connect_af+0x30>
  11306. shift = pin->pin * 4;
  11307. 80262aa: 0092 lsls r2, r2, #2
  11308. pin->port->AFR[0] &= ~((uint32_t)GPIO_AFR_MASK << shift);
  11309. 80262ac: 6a1c ldr r4, [r3, #32]
  11310. 80262ae: b2d2 uxtb r2, r2
  11311. 80262b0: 200f movs r0, #15
  11312. 80262b2: fa00 f002 lsl.w r0, r0, r2
  11313. 80262b6: ea24 0000 bic.w r0, r4, r0
  11314. 80262ba: 6218 str r0, [r3, #32]
  11315. pin->port->AFR[0] |= af_n << shift;
  11316. 80262bc: 6a18 ldr r0, [r3, #32]
  11317. 80262be: fa01 f202 lsl.w r2, r1, r2
  11318. 80262c2: 4302 orrs r2, r0
  11319. 80262c4: 621a str r2, [r3, #32]
  11320. 80262c6: bd10 pop {r4, pc}
  11321. }
  11322. else {
  11323. shift = (pin->pin - 8) * 4;
  11324. 80262c8: 3a08 subs r2, #8
  11325. 80262ca: 0092 lsls r2, r2, #2
  11326. pin->port->AFR[1] &= ~((uint32_t)GPIO_AFR_MASK << shift);
  11327. 80262cc: 6a5c ldr r4, [r3, #36] ; 0x24
  11328. 80262ce: b2d2 uxtb r2, r2
  11329. 80262d0: 200f movs r0, #15
  11330. 80262d2: fa00 f002 lsl.w r0, r0, r2
  11331. 80262d6: ea24 0000 bic.w r0, r4, r0
  11332. 80262da: 6258 str r0, [r3, #36] ; 0x24
  11333. pin->port->AFR[1] |= af_n << shift;
  11334. 80262dc: 6a58 ldr r0, [r3, #36] ; 0x24
  11335. 80262de: fa01 f202 lsl.w r2, r1, r2
  11336. 80262e2: 4302 orrs r2, r0
  11337. 80262e4: 625a str r2, [r3, #36] ; 0x24
  11338. 80262e6: bd10 pop {r4, pc}
  11339. 80262e8: 200005c0 .word 0x200005c0
  11340. 080262ec <gpio_set>:
  11341. }
  11342. }
  11343. }
  11344. void gpio_set(gpio_t pin, bool value) {
  11345. if (gpio_pins[pin].flags & GPIO_INV)
  11346. 80262ec: 4b0e ldr r3, [pc, #56] ; (8026328 <gpio_set+0x3c>)
  11347. 80262ee: eb03 02c0 add.w r2, r3, r0, lsl #3
  11348. 80262f2: 88d2 ldrh r2, [r2, #6]
  11349. 80262f4: f002 0210 and.w r2, r2, #16
  11350. 80262f8: b292 uxth r2, r2
  11351. 80262fa: b10a cbz r2, 8026300 <gpio_set+0x14>
  11352. value = !value;
  11353. 80262fc: f081 0101 eor.w r1, r1, #1
  11354. 8026300: 00c2 lsls r2, r0, #3
  11355. if (value)
  11356. 8026302: b141 cbz r1, 8026316 <gpio_set+0x2a>
  11357. gpio_pins[pin].port->BSRRL = 1 << gpio_pins[pin].pin;
  11358. 8026304: f853 1030 ldr.w r1, [r3, r0, lsl #3]
  11359. 8026308: 189b adds r3, r3, r2
  11360. 802630a: 2201 movs r2, #1
  11361. 802630c: 791b ldrb r3, [r3, #4]
  11362. 802630e: fa02 f303 lsl.w r3, r2, r3
  11363. 8026312: 830b strh r3, [r1, #24]
  11364. 8026314: 4770 bx lr
  11365. else
  11366. gpio_pins[pin].port->BSRRH = 1 << gpio_pins[pin].pin;
  11367. 8026316: f853 1030 ldr.w r1, [r3, r0, lsl #3]
  11368. 802631a: 189b adds r3, r3, r2
  11369. 802631c: 2201 movs r2, #1
  11370. 802631e: 791b ldrb r3, [r3, #4]
  11371. 8026320: fa02 f303 lsl.w r3, r2, r3
  11372. 8026324: 834b strh r3, [r1, #26]
  11373. 8026326: 4770 bx lr
  11374. 8026328: 200005c0 .word 0x200005c0
  11375. 0802632c <gpio_set_config>:
  11376. }
  11377. /*
  11378. * TODO add analog flag and setup ADC pins in a proper way
  11379. */
  11380. static void gpio_set_config(gpio_t id) {
  11381. 802632c: b570 push {r4, r5, r6, lr}
  11382. gpio_pindef_t *pin = &gpio_pins[id];
  11383. 802632e: 4e1e ldr r6, [pc, #120] ; (80263a8 <gpio_set_config+0x7c>)
  11384. 8026330: eb06 05c0 add.w r5, r6, r0, lsl #3
  11385. }
  11386. /*
  11387. * TODO add analog flag and setup ADC pins in a proper way
  11388. */
  11389. static void gpio_set_config(gpio_t id) {
  11390. 8026334: 4604 mov r4, r0
  11391. gpio_pindef_t *pin = &gpio_pins[id];
  11392. if (pin->flags & GPIO_AF) {
  11393. 8026336: 88e9 ldrh r1, [r5, #6]
  11394. 8026338: f401 7300 and.w r3, r1, #512 ; 0x200
  11395. 802633c: b29b uxth r3, r3
  11396. 802633e: b13b cbz r3, 8026350 <gpio_set_config+0x24>
  11397. uint8_t af_n = (uint8_t)(pin->flags >> _GPIO_AF_SHIFT);
  11398. gpio_connect_af(id, af_n);
  11399. 8026340: 0a89 lsrs r1, r1, #10
  11400. 8026342: f7ff ffa9 bl 8026298 <gpio_connect_af>
  11401. gpio_hw_config_pin(pin->port, pin->pin, GPIO_MODE_AF_CFG |
  11402. 8026346: f856 0034 ldr.w r0, [r6, r4, lsl #3]
  11403. 802634a: 7929 ldrb r1, [r5, #4]
  11404. 802634c: 2232 movs r2, #50 ; 0x32
  11405. 802634e: e005 b.n 802635c <gpio_set_config+0x30>
  11406. GPIO_SPEED_HIGH_CFG);
  11407. }
  11408. else if (pin->flags & GPIO_IN)
  11409. 8026350: 07cb lsls r3, r1, #31
  11410. 8026352: d507 bpl.n 8026364 <gpio_set_config+0x38>
  11411. gpio_hw_config_pin(pin->port, pin->pin, GPIO_MODE_IN_CFG |
  11412. 8026354: f856 0030 ldr.w r0, [r6, r0, lsl #3]
  11413. 8026358: 7929 ldrb r1, [r5, #4]
  11414. 802635a: 2230 movs r2, #48 ; 0x30
  11415. ((pin->flags & GPIO_OD) ?
  11416. GPIO_TYPE_OD_CFG : GPIO_TYPE_PP_CFG) |
  11417. GPIO_SPEED_HIGH_CFG);
  11418. gpio_set(id, pin->flags & GPIO_SET);
  11419. }
  11420. }
  11421. 802635c: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
  11422. gpio_connect_af(id, af_n);
  11423. gpio_hw_config_pin(pin->port, pin->pin, GPIO_MODE_AF_CFG |
  11424. GPIO_SPEED_HIGH_CFG);
  11425. }
  11426. else if (pin->flags & GPIO_IN)
  11427. gpio_hw_config_pin(pin->port, pin->pin, GPIO_MODE_IN_CFG |
  11428. 8026360: f7ff bf66 b.w 8026230 <gpio_hw_config_pin>
  11429. GPIO_SPEED_HIGH_CFG);
  11430. else if (pin->flags & GPIO_IN_PU) {
  11431. 8026364: f001 0302 and.w r3, r1, #2
  11432. 8026368: b29b uxth r3, r3
  11433. 802636a: b123 cbz r3, 8026376 <gpio_set_config+0x4a>
  11434. gpio_hw_config_pin(pin->port, pin->pin, GPIO_MODE_IN_CFG | GPIO_PU_CFG |
  11435. 802636c: f856 0030 ldr.w r0, [r6, r0, lsl #3]
  11436. 8026370: 7929 ldrb r1, [r5, #4]
  11437. 8026372: 2270 movs r2, #112 ; 0x70
  11438. 8026374: e00d b.n 8026392 <gpio_set_config+0x66>
  11439. GPIO_SPEED_HIGH_CFG);
  11440. gpio_set(id, pin->flags & GPIO_SET);
  11441. }
  11442. else if (pin->flags & GPIO_OUT) {
  11443. 8026376: f001 0304 and.w r3, r1, #4
  11444. 802637a: b29b uxth r3, r3
  11445. 802637c: b19b cbz r3, 80263a6 <gpio_set_config+0x7a>
  11446. gpio_hw_config_pin(pin->port, pin->pin, GPIO_MODE_OUT_CFG |
  11447. 802637e: f001 0120 and.w r1, r1, #32
  11448. 8026382: b28a uxth r2, r1
  11449. 8026384: f856 0030 ldr.w r0, [r6, r0, lsl #3]
  11450. 8026388: 7929 ldrb r1, [r5, #4]
  11451. 802638a: 2a00 cmp r2, #0
  11452. 802638c: bf0c ite eq
  11453. 802638e: 2231 moveq r2, #49 ; 0x31
  11454. 8026390: 2235 movne r2, #53 ; 0x35
  11455. 8026392: f7ff ff4d bl 8026230 <gpio_hw_config_pin>
  11456. ((pin->flags & GPIO_OD) ?
  11457. GPIO_TYPE_OD_CFG : GPIO_TYPE_PP_CFG) |
  11458. GPIO_SPEED_HIGH_CFG);
  11459. gpio_set(id, pin->flags & GPIO_SET);
  11460. 8026396: 88e9 ldrh r1, [r5, #6]
  11461. 8026398: 4620 mov r0, r4
  11462. 802639a: f3c1 01c0 ubfx r1, r1, #3, #1
  11463. }
  11464. }
  11465. 802639e: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
  11466. else if (pin->flags & GPIO_OUT) {
  11467. gpio_hw_config_pin(pin->port, pin->pin, GPIO_MODE_OUT_CFG |
  11468. ((pin->flags & GPIO_OD) ?
  11469. GPIO_TYPE_OD_CFG : GPIO_TYPE_PP_CFG) |
  11470. GPIO_SPEED_HIGH_CFG);
  11471. gpio_set(id, pin->flags & GPIO_SET);
  11472. 80263a2: f7ff bfa3 b.w 80262ec <gpio_set>
  11473. 80263a6: bd70 pop {r4, r5, r6, pc}
  11474. 80263a8: 200005c0 .word 0x200005c0
  11475. 080263ac <gpio_init>:
  11476. }
  11477. }
  11478. void gpio_init(void) {
  11479. 80263ac: b538 push {r3, r4, r5, lr}
  11480. uint32_t i;
  11481. GPIO_DeInit(GPIOA);
  11482. 80263ae: 4812 ldr r0, [pc, #72] ; (80263f8 <gpio_init+0x4c>)
  11483. GPIO_SPEED_HIGH_CFG);
  11484. gpio_set(id, pin->flags & GPIO_SET);
  11485. }
  11486. }
  11487. void gpio_init(void) {
  11488. 80263b0: 4d12 ldr r5, [pc, #72] ; (80263fc <gpio_init+0x50>)
  11489. uint32_t i;
  11490. GPIO_DeInit(GPIOA);
  11491. 80263b2: f7ff fa0b bl 80257cc <GPIO_DeInit>
  11492. GPIO_DeInit(GPIOB);
  11493. 80263b6: 4812 ldr r0, [pc, #72] ; (8026400 <gpio_init+0x54>)
  11494. 80263b8: f7ff fa08 bl 80257cc <GPIO_DeInit>
  11495. GPIO_DeInit(GPIOC);
  11496. 80263bc: 4811 ldr r0, [pc, #68] ; (8026404 <gpio_init+0x58>)
  11497. 80263be: f7ff fa05 bl 80257cc <GPIO_DeInit>
  11498. GPIO_DeInit(GPIOD);
  11499. 80263c2: 4811 ldr r0, [pc, #68] ; (8026408 <gpio_init+0x5c>)
  11500. 80263c4: f7ff fa02 bl 80257cc <GPIO_DeInit>
  11501. GPIO_DeInit(GPIOE);
  11502. 80263c8: 4810 ldr r0, [pc, #64] ; (802640c <gpio_init+0x60>)
  11503. 80263ca: f7ff f9ff bl 80257cc <GPIO_DeInit>
  11504. // configure clocks
  11505. RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN | RCC_AHB1ENR_GPIOBEN |
  11506. 80263ce: 4b10 ldr r3, [pc, #64] ; (8026410 <gpio_init+0x64>)
  11507. 80263d0: 6b1a ldr r2, [r3, #48] ; 0x30
  11508. 80263d2: f042 021f orr.w r2, r2, #31
  11509. 80263d6: 631a str r2, [r3, #48] ; 0x30
  11510. RCC_AHB1ENR_GPIOCEN | RCC_AHB1ENR_GPIODEN |
  11511. RCC_AHB1ENR_GPIOEEN;
  11512. // configure gpios
  11513. for (i = 0; i < GPIO_TOTAL_COUNT; i++) {
  11514. 80263d8: 2400 movs r4, #0
  11515. GPIO_SPEED_HIGH_CFG);
  11516. gpio_set(id, pin->flags & GPIO_SET);
  11517. }
  11518. }
  11519. void gpio_init(void) {
  11520. 80263da: eb05 03c4 add.w r3, r5, r4, lsl #3
  11521. RCC_AHB1ENR_GPIOCEN | RCC_AHB1ENR_GPIODEN |
  11522. RCC_AHB1ENR_GPIOEEN;
  11523. // configure gpios
  11524. for (i = 0; i < GPIO_TOTAL_COUNT; i++) {
  11525. if (gpio_pins[i].flags & GPIO_NOINIT)
  11526. 80263de: 88db ldrh r3, [r3, #6]
  11527. 80263e0: f003 0380 and.w r3, r3, #128 ; 0x80
  11528. 80263e4: b29b uxth r3, r3
  11529. 80263e6: b913 cbnz r3, 80263ee <gpio_init+0x42>
  11530. continue;
  11531. else {
  11532. gpio_set_config(i);
  11533. 80263e8: b2e0 uxtb r0, r4
  11534. 80263ea: f7ff ff9f bl 802632c <gpio_set_config>
  11535. RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN | RCC_AHB1ENR_GPIOBEN |
  11536. RCC_AHB1ENR_GPIOCEN | RCC_AHB1ENR_GPIODEN |
  11537. RCC_AHB1ENR_GPIOEEN;
  11538. // configure gpios
  11539. for (i = 0; i < GPIO_TOTAL_COUNT; i++) {
  11540. 80263ee: 3401 adds r4, #1
  11541. 80263f0: 2c13 cmp r4, #19
  11542. 80263f2: d1f2 bne.n 80263da <gpio_init+0x2e>
  11543. continue;
  11544. else {
  11545. gpio_set_config(i);
  11546. }
  11547. }
  11548. }
  11549. 80263f4: bd38 pop {r3, r4, r5, pc}
  11550. 80263f6: bf00 nop
  11551. 80263f8: 40020000 .word 0x40020000
  11552. 80263fc: 200005c0 .word 0x200005c0
  11553. 8026400: 40020400 .word 0x40020400
  11554. 8026404: 40020800 .word 0x40020800
  11555. 8026408: 40020c00 .word 0x40020c00
  11556. 802640c: 40021000 .word 0x40021000
  11557. 8026410: 40023800 .word 0x40023800
  11558. 08026414 <gpio_invert_output>:
  11559. gpio_pins[pin].port->BSRRH = 1 << gpio_pins[pin].pin;
  11560. }
  11561. void gpio_invert_output(gpio_t pin) {
  11562. gpio_pins[pin].port->ODR ^= 1 << gpio_pins[pin].pin;
  11563. 8026414: 4a06 ldr r2, [pc, #24] ; (8026430 <gpio_invert_output+0x1c>)
  11564. 8026416: f852 3030 ldr.w r3, [r2, r0, lsl #3]
  11565. 802641a: eb02 02c0 add.w r2, r2, r0, lsl #3
  11566. 802641e: 6959 ldr r1, [r3, #20]
  11567. 8026420: 7912 ldrb r2, [r2, #4]
  11568. 8026422: 2001 movs r0, #1
  11569. 8026424: fa00 f202 lsl.w r2, r0, r2
  11570. 8026428: 404a eors r2, r1
  11571. 802642a: 615a str r2, [r3, #20]
  11572. 802642c: 4770 bx lr
  11573. 802642e: bf00 nop
  11574. 8026430: 200005c0 .word 0x200005c0
  11575. 08026434 <gpio_get>:
  11576. }
  11577. bool gpio_get(gpio_t pin) {
  11578. bool value;
  11579. if (gpio_pins[pin].flags & GPIO_NOINIT) {
  11580. 8026434: 490e ldr r1, [pc, #56] ; (8026470 <gpio_get+0x3c>)
  11581. 8026436: eb01 02c0 add.w r2, r1, r0, lsl #3
  11582. void gpio_invert_output(gpio_t pin) {
  11583. gpio_pins[pin].port->ODR ^= 1 << gpio_pins[pin].pin;
  11584. }
  11585. bool gpio_get(gpio_t pin) {
  11586. 802643a: b510 push {r4, lr}
  11587. bool value;
  11588. if (gpio_pins[pin].flags & GPIO_NOINIT) {
  11589. 802643c: 88d3 ldrh r3, [r2, #6]
  11590. 802643e: f003 0480 and.w r4, r3, #128 ; 0x80
  11591. 8026442: b2a4 uxth r4, r4
  11592. 8026444: b994 cbnz r4, 802646c <gpio_get+0x38>
  11593. return false;
  11594. }
  11595. else {
  11596. value = (gpio_pins[pin].port->IDR & (1 << gpio_pins[pin].pin)) >> gpio_pins[pin].pin;
  11597. 8026446: f851 1030 ldr.w r1, [r1, r0, lsl #3]
  11598. 802644a: 7912 ldrb r2, [r2, #4]
  11599. 802644c: 6908 ldr r0, [r1, #16]
  11600. 802644e: 2101 movs r1, #1
  11601. 8026450: fa01 f102 lsl.w r1, r1, r2
  11602. 8026454: 4001 ands r1, r0
  11603. return (gpio_pins[pin].flags & GPIO_INV) ? !value : value;
  11604. 8026456: f003 0310 and.w r3, r3, #16
  11605. bool value;
  11606. if (gpio_pins[pin].flags & GPIO_NOINIT) {
  11607. return false;
  11608. }
  11609. else {
  11610. value = (gpio_pins[pin].port->IDR & (1 << gpio_pins[pin].pin)) >> gpio_pins[pin].pin;
  11611. 802645a: 40d1 lsrs r1, r2
  11612. return (gpio_pins[pin].flags & GPIO_INV) ? !value : value;
  11613. 802645c: b29b uxth r3, r3
  11614. bool value;
  11615. if (gpio_pins[pin].flags & GPIO_NOINIT) {
  11616. return false;
  11617. }
  11618. else {
  11619. value = (gpio_pins[pin].port->IDR & (1 << gpio_pins[pin].pin)) >> gpio_pins[pin].pin;
  11620. 802645e: bf0c ite eq
  11621. 8026460: 2000 moveq r0, #0
  11622. 8026462: 2001 movne r0, #1
  11623. return (gpio_pins[pin].flags & GPIO_INV) ? !value : value;
  11624. 8026464: b11b cbz r3, 802646e <gpio_get+0x3a>
  11625. 8026466: f080 0001 eor.w r0, r0, #1
  11626. 802646a: bd10 pop {r4, pc}
  11627. }
  11628. bool gpio_get(gpio_t pin) {
  11629. bool value;
  11630. if (gpio_pins[pin].flags & GPIO_NOINIT) {
  11631. return false;
  11632. 802646c: 2000 movs r0, #0
  11633. }
  11634. else {
  11635. value = (gpio_pins[pin].port->IDR & (1 << gpio_pins[pin].pin)) >> gpio_pins[pin].pin;
  11636. return (gpio_pins[pin].flags & GPIO_INV) ? !value : value;
  11637. }
  11638. }
  11639. 802646e: bd10 pop {r4, pc}
  11640. 8026470: 200005c0 .word 0x200005c0
  11641. 08026474 <RNG_Init>:
  11642. #include "rng.h"
  11643. #include "stm32f4xx.h"
  11644. void RNG_Init(void)
  11645. {
  11646. 8026474: b508 push {r3, lr}
  11647. RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_RNG,ENABLE);
  11648. 8026476: 2040 movs r0, #64 ; 0x40
  11649. 8026478: 2101 movs r1, #1
  11650. 802647a: f7ff faff bl 8025a7c <RCC_AHB2PeriphClockCmd>
  11651. RNG_Cmd(ENABLE);
  11652. 802647e: 2001 movs r0, #1
  11653. }
  11654. 8026480: e8bd 4008 ldmia.w sp!, {r3, lr}
  11655. void RNG_Init(void)
  11656. {
  11657. RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_RNG,ENABLE);
  11658. RNG_Cmd(ENABLE);
  11659. 8026484: f7ff bb56 b.w 8025b34 <RNG_Cmd>
  11660. 08026488 <GetRandomNumber>:
  11661. }
  11662. uint32_t GetRandomNumber(void) {
  11663. return RNG_GetRandomNumber();;
  11664. 8026488: f7ff bb60 b.w 8025b4c <RNG_GetRandomNumber>
  11665. 0802648c <TM_RTC_SetDateTime>:
  11666. /* Устанавливаем новое время */
  11667. TM_RTC_GetDateTimeFromUnix(&newData, unixTime);
  11668. TM_RTC_SetDateTime(&newData, TM_RTC_Format_BIN);
  11669. }
  11670. TM_RTC_Result_t TM_RTC_SetDateTime(TM_RTC_t* data, TM_RTC_Format_t format) {
  11671. 802648c: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
  11672. TM_RTC_t tmp;
  11673. /* Check date and time validation */
  11674. if (format == TM_RTC_Format_BCD) {
  11675. 8026490: 2901 cmp r1, #1
  11676. /* Устанавливаем новое время */
  11677. TM_RTC_GetDateTimeFromUnix(&newData, unixTime);
  11678. TM_RTC_SetDateTime(&newData, TM_RTC_Format_BIN);
  11679. }
  11680. TM_RTC_Result_t TM_RTC_SetDateTime(TM_RTC_t* data, TM_RTC_Format_t format) {
  11681. 8026492: 4603 mov r3, r0
  11682. 8026494: 460e mov r6, r1
  11683. 8026496: 79c0 ldrb r0, [r0, #7]
  11684. TM_RTC_t tmp;
  11685. /* Check date and time validation */
  11686. if (format == TM_RTC_Format_BCD) {
  11687. 8026498: d137 bne.n 802650a <TM_RTC_SetDateTime+0x7e>
  11688. tmp.date = TM_RTC_BCD2BIN(data->date);
  11689. tmp.month = TM_RTC_BCD2BIN(data->month);
  11690. 802649a: 7a1c ldrb r4, [r3, #8]
  11691. tmp.year = TM_RTC_BCD2BIN(data->year);
  11692. 802649c: 7a5d ldrb r5, [r3, #9]
  11693. tmp.hours = TM_RTC_BCD2BIN(data->hours);
  11694. tmp.minutes = TM_RTC_BCD2BIN(data->minutes);
  11695. tmp.seconds = TM_RTC_BCD2BIN(data->seconds);
  11696. 802649e: f893 8000 ldrb.w r8, [r3]
  11697. TM_RTC_Result_t TM_RTC_SetDateTime(TM_RTC_t* data, TM_RTC_Format_t format) {
  11698. TM_RTC_t tmp;
  11699. /* Check date and time validation */
  11700. if (format == TM_RTC_Format_BCD) {
  11701. tmp.date = TM_RTC_BCD2BIN(data->date);
  11702. 80264a2: 220a movs r2, #10
  11703. 80264a4: 0901 lsrs r1, r0, #4
  11704. 80264a6: f000 000f and.w r0, r0, #15
  11705. 80264aa: fb02 0001 mla r0, r2, r1, r0
  11706. tmp.month = TM_RTC_BCD2BIN(data->month);
  11707. 80264ae: 0921 lsrs r1, r4, #4
  11708. 80264b0: f004 040f and.w r4, r4, #15
  11709. 80264b4: fb02 4101 mla r1, r2, r1, r4
  11710. tmp.year = TM_RTC_BCD2BIN(data->year);
  11711. 80264b8: 092c lsrs r4, r5, #4
  11712. 80264ba: f005 050f and.w r5, r5, #15
  11713. 80264be: fb02 5404 mla r4, r2, r4, r5
  11714. tmp.hours = TM_RTC_BCD2BIN(data->hours);
  11715. 80264c2: 795d ldrb r5, [r3, #5]
  11716. 80264c4: ea4f 1c15 mov.w ip, r5, lsr #4
  11717. 80264c8: f005 050f and.w r5, r5, #15
  11718. 80264cc: fb02 5c0c mla ip, r2, ip, r5
  11719. tmp.minutes = TM_RTC_BCD2BIN(data->minutes);
  11720. 80264d0: 791d ldrb r5, [r3, #4]
  11721. 80264d2: 092f lsrs r7, r5, #4
  11722. 80264d4: f005 050f and.w r5, r5, #15
  11723. 80264d8: fb02 5707 mla r7, r2, r7, r5
  11724. tmp.seconds = TM_RTC_BCD2BIN(data->seconds);
  11725. 80264dc: ea4f 1518 mov.w r5, r8, lsr #4
  11726. 80264e0: f008 080f and.w r8, r8, #15
  11727. 80264e4: fb02 8505 mla r5, r2, r5, r8
  11728. tmp.day = TM_RTC_BCD2BIN(data->day);
  11729. 80264e8: f893 8006 ldrb.w r8, [r3, #6]
  11730. 80264ec: ea4f 1918 mov.w r9, r8, lsr #4
  11731. 80264f0: f008 080f and.w r8, r8, #15
  11732. 80264f4: fb02 8209 mla r2, r2, r9, r8
  11733. TM_RTC_Result_t TM_RTC_SetDateTime(TM_RTC_t* data, TM_RTC_Format_t format) {
  11734. TM_RTC_t tmp;
  11735. /* Check date and time validation */
  11736. if (format == TM_RTC_Format_BCD) {
  11737. tmp.date = TM_RTC_BCD2BIN(data->date);
  11738. 80264f8: b2c0 uxtb r0, r0
  11739. tmp.month = TM_RTC_BCD2BIN(data->month);
  11740. 80264fa: b2c9 uxtb r1, r1
  11741. tmp.year = TM_RTC_BCD2BIN(data->year);
  11742. 80264fc: b2e4 uxtb r4, r4
  11743. tmp.hours = TM_RTC_BCD2BIN(data->hours);
  11744. 80264fe: fa5f fc8c uxtb.w ip, ip
  11745. tmp.minutes = TM_RTC_BCD2BIN(data->minutes);
  11746. 8026502: b2ff uxtb r7, r7
  11747. tmp.seconds = TM_RTC_BCD2BIN(data->seconds);
  11748. 8026504: b2ed uxtb r5, r5
  11749. tmp.day = TM_RTC_BCD2BIN(data->day);
  11750. 8026506: b2d2 uxtb r2, r2
  11751. 8026508: e006 b.n 8026518 <TM_RTC_SetDateTime+0x8c>
  11752. } else {
  11753. tmp.date = data->date;
  11754. tmp.month = data->month;
  11755. 802650a: 7a19 ldrb r1, [r3, #8]
  11756. tmp.year = data->year;
  11757. 802650c: 7a5c ldrb r4, [r3, #9]
  11758. tmp.hours = data->hours;
  11759. 802650e: f893 c005 ldrb.w ip, [r3, #5]
  11760. tmp.minutes = data->minutes;
  11761. 8026512: 791f ldrb r7, [r3, #4]
  11762. tmp.seconds = data->seconds;
  11763. 8026514: 781d ldrb r5, [r3, #0]
  11764. tmp.day = data->day;
  11765. 8026516: 799a ldrb r2, [r3, #6]
  11766. }
  11767. /* Check year and month */
  11768. if (
  11769. 8026518: 2c63 cmp r4, #99 ; 0x63
  11770. 802651a: d86c bhi.n 80265f6 <TM_RTC_SetDateTime+0x16a>
  11771. tmp.year > 99 ||
  11772. 802651c: 2900 cmp r1, #0
  11773. 802651e: d06a beq.n 80265f6 <TM_RTC_SetDateTime+0x16a>
  11774. tmp.month == 0 ||
  11775. 8026520: 290c cmp r1, #12
  11776. 8026522: d868 bhi.n 80265f6 <TM_RTC_SetDateTime+0x16a>
  11777. tmp.month > 12 ||
  11778. 8026524: 2800 cmp r0, #0
  11779. 8026526: d066 beq.n 80265f6 <TM_RTC_SetDateTime+0x16a>
  11780. tmp.date == 0 ||
  11781. tmp.date > TM_RTC_Months[TM_RTC_LEAP_YEAR(2000 + tmp.year) ? 1 : 0][tmp.month - 1] ||
  11782. 8026528: f014 0f03 tst.w r4, #3
  11783. 802652c: d10a bne.n 8026544 <TM_RTC_SetDateTime+0xb8>
  11784. 802652e: f504 69fa add.w r9, r4, #2000 ; 0x7d0
  11785. 8026532: f04f 0864 mov.w r8, #100 ; 0x64
  11786. 8026536: fb99 faf8 sdiv sl, r9, r8
  11787. 802653a: fb08 981a mls r8, r8, sl, r9
  11788. 802653e: f1b8 0f00 cmp.w r8, #0
  11789. 8026542: d10c bne.n 802655e <TM_RTC_SetDateTime+0xd2>
  11790. 8026544: f504 64fa add.w r4, r4, #2000 ; 0x7d0
  11791. 8026548: f44f 78c8 mov.w r8, #400 ; 0x190
  11792. 802654c: fb94 f9f8 sdiv r9, r4, r8
  11793. 8026550: fb08 4419 mls r4, r8, r9, r4
  11794. 8026554: f1d4 0401 rsbs r4, r4, #1
  11795. 8026558: bf38 it cc
  11796. 802655a: 2400 movcc r4, #0
  11797. 802655c: e000 b.n 8026560 <TM_RTC_SetDateTime+0xd4>
  11798. 802655e: 2401 movs r4, #1
  11799. 8026560: f8df 80a8 ldr.w r8, [pc, #168] ; 802660c <TM_RTC_SetDateTime+0x180>
  11800. 8026564: f04f 090c mov.w r9, #12
  11801. 8026568: fb09 8404 mla r4, r9, r4, r8
  11802. 802656c: 1861 adds r1, r4, r1
  11803. /* Check year and month */
  11804. if (
  11805. tmp.year > 99 ||
  11806. tmp.month == 0 ||
  11807. tmp.month > 12 ||
  11808. tmp.date == 0 ||
  11809. 802656e: f811 1c01 ldrb.w r1, [r1, #-1]
  11810. 8026572: 4281 cmp r1, r0
  11811. 8026574: d33f bcc.n 80265f6 <TM_RTC_SetDateTime+0x16a>
  11812. tmp.date > TM_RTC_Months[TM_RTC_LEAP_YEAR(2000 + tmp.year) ? 1 : 0][tmp.month - 1] ||
  11813. 8026576: f1bc 0f17 cmp.w ip, #23
  11814. 802657a: d83c bhi.n 80265f6 <TM_RTC_SetDateTime+0x16a>
  11815. tmp.hours > 23 ||
  11816. 802657c: 2f3b cmp r7, #59 ; 0x3b
  11817. 802657e: d83a bhi.n 80265f6 <TM_RTC_SetDateTime+0x16a>
  11818. tmp.minutes > 59 ||
  11819. 8026580: 2d3b cmp r5, #59 ; 0x3b
  11820. 8026582: d838 bhi.n 80265f6 <TM_RTC_SetDateTime+0x16a>
  11821. tmp.seconds > 59 ||
  11822. 8026584: 2a00 cmp r2, #0
  11823. 8026586: d036 beq.n 80265f6 <TM_RTC_SetDateTime+0x16a>
  11824. tmp.day == 0 ||
  11825. 8026588: 2a07 cmp r2, #7
  11826. 802658a: d834 bhi.n 80265f6 <TM_RTC_SetDateTime+0x16a>
  11827. /* Invalid date */
  11828. return TM_RTC_Result_Error;
  11829. }
  11830. /* Fill time */
  11831. RTC_TimeStruct.RTC_Hours = data->hours;
  11832. 802658c: 795a ldrb r2, [r3, #5]
  11833. 802658e: 4d1b ldr r5, [pc, #108] ; (80265fc <TM_RTC_SetDateTime+0x170>)
  11834. RTC_TimeStruct.RTC_Minutes = data->minutes;
  11835. RTC_TimeStruct.RTC_Seconds = data->seconds;
  11836. /* Fill date */
  11837. RTC_DateStruct.RTC_Date = data->date;
  11838. 8026590: 4c1b ldr r4, [pc, #108] ; (8026600 <TM_RTC_SetDateTime+0x174>)
  11839. /* Invalid date */
  11840. return TM_RTC_Result_Error;
  11841. }
  11842. /* Fill time */
  11843. RTC_TimeStruct.RTC_Hours = data->hours;
  11844. 8026592: 702a strb r2, [r5, #0]
  11845. RTC_TimeStruct.RTC_Minutes = data->minutes;
  11846. 8026594: 791a ldrb r2, [r3, #4]
  11847. RTC_DateStruct.RTC_Month = data->month;
  11848. RTC_DateStruct.RTC_Year = data->year;
  11849. RTC_DateStruct.RTC_WeekDay = data->day;
  11850. /* Set the RTC time base to 1s and hours format to 24h */
  11851. RTC_InitStruct.RTC_HourFormat = RTC_HourFormat_24;
  11852. 8026596: 481b ldr r0, [pc, #108] ; (8026604 <TM_RTC_SetDateTime+0x178>)
  11853. return TM_RTC_Result_Error;
  11854. }
  11855. /* Fill time */
  11856. RTC_TimeStruct.RTC_Hours = data->hours;
  11857. RTC_TimeStruct.RTC_Minutes = data->minutes;
  11858. 8026598: 706a strb r2, [r5, #1]
  11859. RTC_TimeStruct.RTC_Seconds = data->seconds;
  11860. 802659a: 781a ldrb r2, [r3, #0]
  11861. 802659c: 70aa strb r2, [r5, #2]
  11862. /* Fill date */
  11863. RTC_DateStruct.RTC_Date = data->date;
  11864. 802659e: 79da ldrb r2, [r3, #7]
  11865. 80265a0: 70a2 strb r2, [r4, #2]
  11866. RTC_DateStruct.RTC_Month = data->month;
  11867. 80265a2: 7a1a ldrb r2, [r3, #8]
  11868. 80265a4: 7062 strb r2, [r4, #1]
  11869. RTC_DateStruct.RTC_Year = data->year;
  11870. 80265a6: 7a5a ldrb r2, [r3, #9]
  11871. RTC_DateStruct.RTC_WeekDay = data->day;
  11872. 80265a8: 799b ldrb r3, [r3, #6]
  11873. RTC_TimeStruct.RTC_Minutes = data->minutes;
  11874. RTC_TimeStruct.RTC_Seconds = data->seconds;
  11875. /* Fill date */
  11876. RTC_DateStruct.RTC_Date = data->date;
  11877. RTC_DateStruct.RTC_Month = data->month;
  11878. RTC_DateStruct.RTC_Year = data->year;
  11879. 80265aa: 70e2 strb r2, [r4, #3]
  11880. RTC_DateStruct.RTC_WeekDay = data->day;
  11881. /* Set the RTC time base to 1s and hours format to 24h */
  11882. RTC_InitStruct.RTC_HourFormat = RTC_HourFormat_24;
  11883. RTC_InitStruct.RTC_AsynchPrediv = RTC_ASYNC_PREDIV;
  11884. 80265ac: 221f movs r2, #31
  11885. RTC_DateStruct.RTC_Month = data->month;
  11886. RTC_DateStruct.RTC_Year = data->year;
  11887. RTC_DateStruct.RTC_WeekDay = data->day;
  11888. /* Set the RTC time base to 1s and hours format to 24h */
  11889. RTC_InitStruct.RTC_HourFormat = RTC_HourFormat_24;
  11890. 80265ae: 2700 movs r7, #0
  11891. RTC_InitStruct.RTC_AsynchPrediv = RTC_ASYNC_PREDIV;
  11892. 80265b0: 6042 str r2, [r0, #4]
  11893. RTC_InitStruct.RTC_SynchPrediv = RTC_SYNC_PREDIV;
  11894. 80265b2: f502 7278 add.w r2, r2, #992 ; 0x3e0
  11895. RTC_TimeStruct.RTC_Seconds = data->seconds;
  11896. /* Fill date */
  11897. RTC_DateStruct.RTC_Date = data->date;
  11898. RTC_DateStruct.RTC_Month = data->month;
  11899. RTC_DateStruct.RTC_Year = data->year;
  11900. RTC_DateStruct.RTC_WeekDay = data->day;
  11901. 80265b6: 7023 strb r3, [r4, #0]
  11902. /* Set the RTC time base to 1s and hours format to 24h */
  11903. RTC_InitStruct.RTC_HourFormat = RTC_HourFormat_24;
  11904. 80265b8: 6007 str r7, [r0, #0]
  11905. RTC_InitStruct.RTC_AsynchPrediv = RTC_ASYNC_PREDIV;
  11906. RTC_InitStruct.RTC_SynchPrediv = RTC_SYNC_PREDIV;
  11907. 80265ba: 6082 str r2, [r0, #8]
  11908. RTC_Init(&RTC_InitStruct);
  11909. 80265bc: f7ff fb08 bl 8025bd0 <RTC_Init>
  11910. /* Set time */
  11911. if (format == TM_RTC_Format_BCD) {
  11912. 80265c0: 2e01 cmp r6, #1
  11913. 80265c2: d105 bne.n 80265d0 <TM_RTC_SetDateTime+0x144>
  11914. RTC_SetTime(RTC_Format_BCD, &RTC_TimeStruct);
  11915. 80265c4: 4630 mov r0, r6
  11916. 80265c6: 4629 mov r1, r5
  11917. 80265c8: f7ff fb46 bl 8025c58 <RTC_SetTime>
  11918. RTC_SetTime(RTC_Format_BIN, &RTC_TimeStruct);
  11919. }
  11920. /* Set date */
  11921. if (format == TM_RTC_Format_BCD) {
  11922. RTC_SetDate(RTC_Format_BCD, &RTC_DateStruct);
  11923. 80265cc: 4630 mov r0, r6
  11924. 80265ce: e004 b.n 80265da <TM_RTC_SetDateTime+0x14e>
  11925. /* Set time */
  11926. if (format == TM_RTC_Format_BCD) {
  11927. RTC_SetTime(RTC_Format_BCD, &RTC_TimeStruct);
  11928. } else {
  11929. RTC_SetTime(RTC_Format_BIN, &RTC_TimeStruct);
  11930. 80265d0: 4638 mov r0, r7
  11931. 80265d2: 4629 mov r1, r5
  11932. 80265d4: f7ff fb40 bl 8025c58 <RTC_SetTime>
  11933. /* Set date */
  11934. if (format == TM_RTC_Format_BCD) {
  11935. RTC_SetDate(RTC_Format_BCD, &RTC_DateStruct);
  11936. } else {
  11937. RTC_SetDate(RTC_Format_BIN, &RTC_DateStruct);
  11938. 80265d8: 4638 mov r0, r7
  11939. 80265da: 4621 mov r1, r4
  11940. 80265dc: f7ff fbaa bl 8025d34 <RTC_SetDate>
  11941. }
  11942. if (TM_RTC_Status != RTC_STATUS_ZERO) {
  11943. 80265e0: 4b09 ldr r3, [pc, #36] ; (8026608 <TM_RTC_SetDateTime+0x17c>)
  11944. 80265e2: 6818 ldr r0, [r3, #0]
  11945. 80265e4: b140 cbz r0, 80265f8 <TM_RTC_SetDateTime+0x16c>
  11946. /* Write backup registers */
  11947. RTC_WriteBackupRegister(RTC_STATUS_REG, RTC_STATUS_TIME_OK);
  11948. 80265e6: 2013 movs r0, #19
  11949. 80265e8: f244 3121 movw r1, #17185 ; 0x4321
  11950. 80265ec: f7ff fc0c bl 8025e08 <RTC_WriteBackupRegister>
  11951. }
  11952. /* Return OK */
  11953. return TM_RTC_Result_Ok;
  11954. 80265f0: 2000 movs r0, #0
  11955. 80265f2: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc}
  11956. tmp.seconds > 59 ||
  11957. tmp.day == 0 ||
  11958. tmp.day > 7
  11959. ) {
  11960. /* Invalid date */
  11961. return TM_RTC_Result_Error;
  11962. 80265f6: 2001 movs r0, #1
  11963. RTC_WriteBackupRegister(RTC_STATUS_REG, RTC_STATUS_TIME_OK);
  11964. }
  11965. /* Return OK */
  11966. return TM_RTC_Result_Ok;
  11967. }
  11968. 80265f8: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc}
  11969. 80265fc: 2000c860 .word 0x2000c860
  11970. 8026600: 2000c870 .word 0x2000c870
  11971. 8026604: 2000c864 .word 0x2000c864
  11972. 8026608: 20000b14 .word 0x20000b14
  11973. 802660c: 20000658 .word 0x20000658
  11974. 08026610 <TM_RTC_SetDateTimeString>:
  11975. TM_RTC_Result_t TM_RTC_SetDateTimeString(char* str) {
  11976. 8026610: b530 push {r4, r5, lr}
  11977. TM_RTC_t tmp;
  11978. uint8_t i = 0;
  11979. /* Get date */
  11980. tmp.date = 0;
  11981. while (TM_RTC_CHARISNUM(*(str + i))) {
  11982. 8026612: 2200 movs r2, #0
  11983. /* Return OK */
  11984. return TM_RTC_Result_Ok;
  11985. }
  11986. TM_RTC_Result_t TM_RTC_SetDateTimeString(char* str) {
  11987. 8026614: b085 sub sp, #20
  11988. TM_RTC_t tmp;
  11989. uint8_t i = 0;
  11990. 8026616: 4613 mov r3, r2
  11991. /* Get date */
  11992. tmp.date = 0;
  11993. while (TM_RTC_CHARISNUM(*(str + i))) {
  11994. tmp.date = tmp.date * 10 + TM_RTC_CHAR2NUM(*(str + i));
  11995. 8026618: 250a movs r5, #10
  11996. TM_RTC_t tmp;
  11997. uint8_t i = 0;
  11998. /* Get date */
  11999. tmp.date = 0;
  12000. while (TM_RTC_CHARISNUM(*(str + i))) {
  12001. 802661a: e006 b.n 802662a <TM_RTC_SetDateTimeString+0x1a>
  12002. tmp.date = tmp.date * 10 + TM_RTC_CHAR2NUM(*(str + i));
  12003. 802661c: fb05 1202 mla r2, r5, r2, r1
  12004. 8026620: 3a30 subs r2, #48 ; 0x30
  12005. i++;
  12006. 8026622: 3301 adds r3, #1
  12007. uint8_t i = 0;
  12008. /* Get date */
  12009. tmp.date = 0;
  12010. while (TM_RTC_CHARISNUM(*(str + i))) {
  12011. tmp.date = tmp.date * 10 + TM_RTC_CHAR2NUM(*(str + i));
  12012. 8026624: f002 02ff and.w r2, r2, #255 ; 0xff
  12013. i++;
  12014. 8026628: b2db uxtb r3, r3
  12015. TM_RTC_t tmp;
  12016. uint8_t i = 0;
  12017. /* Get date */
  12018. tmp.date = 0;
  12019. while (TM_RTC_CHARISNUM(*(str + i))) {
  12020. 802662a: 5cc1 ldrb r1, [r0, r3]
  12021. 802662c: f1a1 0430 sub.w r4, r1, #48 ; 0x30
  12022. 8026630: 2c09 cmp r4, #9
  12023. 8026632: d9f3 bls.n 802661c <TM_RTC_SetDateTimeString+0xc>
  12024. tmp.date = tmp.date * 10 + TM_RTC_CHAR2NUM(*(str + i));
  12025. i++;
  12026. }
  12027. i++;
  12028. 8026634: 3301 adds r3, #1
  12029. 8026636: f88d 2007 strb.w r2, [sp, #7]
  12030. 802663a: b2db uxtb r3, r3
  12031. /* Get month */
  12032. tmp.month = 0;
  12033. while (TM_RTC_CHARISNUM(*(str + i))) {
  12034. 802663c: 2200 movs r2, #0
  12035. tmp.month = tmp.month * 10 + TM_RTC_CHAR2NUM(*(str + i));
  12036. 802663e: 250a movs r5, #10
  12037. }
  12038. i++;
  12039. /* Get month */
  12040. tmp.month = 0;
  12041. while (TM_RTC_CHARISNUM(*(str + i))) {
  12042. 8026640: e006 b.n 8026650 <TM_RTC_SetDateTimeString+0x40>
  12043. tmp.month = tmp.month * 10 + TM_RTC_CHAR2NUM(*(str + i));
  12044. 8026642: fb05 1202 mla r2, r5, r2, r1
  12045. 8026646: 3a30 subs r2, #48 ; 0x30
  12046. i++;
  12047. 8026648: 3301 adds r3, #1
  12048. i++;
  12049. /* Get month */
  12050. tmp.month = 0;
  12051. while (TM_RTC_CHARISNUM(*(str + i))) {
  12052. tmp.month = tmp.month * 10 + TM_RTC_CHAR2NUM(*(str + i));
  12053. 802664a: f002 02ff and.w r2, r2, #255 ; 0xff
  12054. i++;
  12055. 802664e: b2db uxtb r3, r3
  12056. }
  12057. i++;
  12058. /* Get month */
  12059. tmp.month = 0;
  12060. while (TM_RTC_CHARISNUM(*(str + i))) {
  12061. 8026650: 5cc1 ldrb r1, [r0, r3]
  12062. 8026652: f1a1 0430 sub.w r4, r1, #48 ; 0x30
  12063. 8026656: 2c09 cmp r4, #9
  12064. 8026658: d9f3 bls.n 8026642 <TM_RTC_SetDateTimeString+0x32>
  12065. tmp.month = tmp.month * 10 + TM_RTC_CHAR2NUM(*(str + i));
  12066. i++;
  12067. }
  12068. i++;
  12069. 802665a: 3301 adds r3, #1
  12070. 802665c: f88d 2008 strb.w r2, [sp, #8]
  12071. 8026660: b2db uxtb r3, r3
  12072. /* Get year */
  12073. tmp.year = 0;
  12074. while (TM_RTC_CHARISNUM(*(str + i))) {
  12075. 8026662: 2200 movs r2, #0
  12076. tmp.year = tmp.year * 10 + TM_RTC_CHAR2NUM(*(str + i));
  12077. 8026664: 250a movs r5, #10
  12078. }
  12079. i++;
  12080. /* Get year */
  12081. tmp.year = 0;
  12082. while (TM_RTC_CHARISNUM(*(str + i))) {
  12083. 8026666: e006 b.n 8026676 <TM_RTC_SetDateTimeString+0x66>
  12084. tmp.year = tmp.year * 10 + TM_RTC_CHAR2NUM(*(str + i));
  12085. 8026668: fb05 1202 mla r2, r5, r2, r1
  12086. 802666c: 3a30 subs r2, #48 ; 0x30
  12087. i++;
  12088. 802666e: 3301 adds r3, #1
  12089. i++;
  12090. /* Get year */
  12091. tmp.year = 0;
  12092. while (TM_RTC_CHARISNUM(*(str + i))) {
  12093. tmp.year = tmp.year * 10 + TM_RTC_CHAR2NUM(*(str + i));
  12094. 8026670: f002 02ff and.w r2, r2, #255 ; 0xff
  12095. i++;
  12096. 8026674: b2db uxtb r3, r3
  12097. }
  12098. i++;
  12099. /* Get year */
  12100. tmp.year = 0;
  12101. while (TM_RTC_CHARISNUM(*(str + i))) {
  12102. 8026676: 5cc1 ldrb r1, [r0, r3]
  12103. 8026678: f1a1 0430 sub.w r4, r1, #48 ; 0x30
  12104. 802667c: 2c09 cmp r4, #9
  12105. 802667e: d9f3 bls.n 8026668 <TM_RTC_SetDateTimeString+0x58>
  12106. tmp.year = tmp.year * 10 + TM_RTC_CHAR2NUM(*(str + i));
  12107. i++;
  12108. }
  12109. i++;
  12110. 8026680: 3301 adds r3, #1
  12111. 8026682: f88d 2009 strb.w r2, [sp, #9]
  12112. 8026686: b2db uxtb r3, r3
  12113. /* Get day in a week */
  12114. tmp.day = 0;
  12115. while (TM_RTC_CHARISNUM(*(str + i))) {
  12116. 8026688: 2200 movs r2, #0
  12117. tmp.day = tmp.day * 10 + TM_RTC_CHAR2NUM(*(str + i));
  12118. 802668a: 250a movs r5, #10
  12119. }
  12120. i++;
  12121. /* Get day in a week */
  12122. tmp.day = 0;
  12123. while (TM_RTC_CHARISNUM(*(str + i))) {
  12124. 802668c: e006 b.n 802669c <TM_RTC_SetDateTimeString+0x8c>
  12125. tmp.day = tmp.day * 10 + TM_RTC_CHAR2NUM(*(str + i));
  12126. 802668e: fb05 1202 mla r2, r5, r2, r1
  12127. 8026692: 3a30 subs r2, #48 ; 0x30
  12128. i++;
  12129. 8026694: 3301 adds r3, #1
  12130. i++;
  12131. /* Get day in a week */
  12132. tmp.day = 0;
  12133. while (TM_RTC_CHARISNUM(*(str + i))) {
  12134. tmp.day = tmp.day * 10 + TM_RTC_CHAR2NUM(*(str + i));
  12135. 8026696: f002 02ff and.w r2, r2, #255 ; 0xff
  12136. i++;
  12137. 802669a: b2db uxtb r3, r3
  12138. }
  12139. i++;
  12140. /* Get day in a week */
  12141. tmp.day = 0;
  12142. while (TM_RTC_CHARISNUM(*(str + i))) {
  12143. 802669c: 5cc1 ldrb r1, [r0, r3]
  12144. 802669e: f1a1 0430 sub.w r4, r1, #48 ; 0x30
  12145. 80266a2: 2c09 cmp r4, #9
  12146. 80266a4: d9f3 bls.n 802668e <TM_RTC_SetDateTimeString+0x7e>
  12147. tmp.day = tmp.day * 10 + TM_RTC_CHAR2NUM(*(str + i));
  12148. i++;
  12149. }
  12150. i++;
  12151. 80266a6: 3301 adds r3, #1
  12152. 80266a8: f88d 2006 strb.w r2, [sp, #6]
  12153. 80266ac: b2db uxtb r3, r3
  12154. /* Get hours */
  12155. tmp.hours = 0;
  12156. while (TM_RTC_CHARISNUM(*(str + i))) {
  12157. 80266ae: 2200 movs r2, #0
  12158. tmp.hours = tmp.hours * 10 + TM_RTC_CHAR2NUM(*(str + i));
  12159. 80266b0: 250a movs r5, #10
  12160. }
  12161. i++;
  12162. /* Get hours */
  12163. tmp.hours = 0;
  12164. while (TM_RTC_CHARISNUM(*(str + i))) {
  12165. 80266b2: e006 b.n 80266c2 <TM_RTC_SetDateTimeString+0xb2>
  12166. tmp.hours = tmp.hours * 10 + TM_RTC_CHAR2NUM(*(str + i));
  12167. 80266b4: fb05 1202 mla r2, r5, r2, r1
  12168. 80266b8: 3a30 subs r2, #48 ; 0x30
  12169. i++;
  12170. 80266ba: 3301 adds r3, #1
  12171. i++;
  12172. /* Get hours */
  12173. tmp.hours = 0;
  12174. while (TM_RTC_CHARISNUM(*(str + i))) {
  12175. tmp.hours = tmp.hours * 10 + TM_RTC_CHAR2NUM(*(str + i));
  12176. 80266bc: f002 02ff and.w r2, r2, #255 ; 0xff
  12177. i++;
  12178. 80266c0: b2db uxtb r3, r3
  12179. }
  12180. i++;
  12181. /* Get hours */
  12182. tmp.hours = 0;
  12183. while (TM_RTC_CHARISNUM(*(str + i))) {
  12184. 80266c2: 5cc1 ldrb r1, [r0, r3]
  12185. 80266c4: f1a1 0430 sub.w r4, r1, #48 ; 0x30
  12186. 80266c8: 2c09 cmp r4, #9
  12187. 80266ca: d9f3 bls.n 80266b4 <TM_RTC_SetDateTimeString+0xa4>
  12188. tmp.hours = tmp.hours * 10 + TM_RTC_CHAR2NUM(*(str + i));
  12189. i++;
  12190. }
  12191. i++;
  12192. 80266cc: 3301 adds r3, #1
  12193. 80266ce: f88d 2005 strb.w r2, [sp, #5]
  12194. 80266d2: b2db uxtb r3, r3
  12195. /* Get minutes */
  12196. tmp.minutes = 0;
  12197. while (TM_RTC_CHARISNUM(*(str + i))) {
  12198. 80266d4: 2200 movs r2, #0
  12199. tmp.minutes = tmp.minutes * 10 + TM_RTC_CHAR2NUM(*(str + i));
  12200. 80266d6: 250a movs r5, #10
  12201. }
  12202. i++;
  12203. /* Get minutes */
  12204. tmp.minutes = 0;
  12205. while (TM_RTC_CHARISNUM(*(str + i))) {
  12206. 80266d8: e006 b.n 80266e8 <TM_RTC_SetDateTimeString+0xd8>
  12207. tmp.minutes = tmp.minutes * 10 + TM_RTC_CHAR2NUM(*(str + i));
  12208. 80266da: fb05 1202 mla r2, r5, r2, r1
  12209. 80266de: 3a30 subs r2, #48 ; 0x30
  12210. i++;
  12211. 80266e0: 3301 adds r3, #1
  12212. i++;
  12213. /* Get minutes */
  12214. tmp.minutes = 0;
  12215. while (TM_RTC_CHARISNUM(*(str + i))) {
  12216. tmp.minutes = tmp.minutes * 10 + TM_RTC_CHAR2NUM(*(str + i));
  12217. 80266e2: f002 02ff and.w r2, r2, #255 ; 0xff
  12218. i++;
  12219. 80266e6: b2db uxtb r3, r3
  12220. }
  12221. i++;
  12222. /* Get minutes */
  12223. tmp.minutes = 0;
  12224. while (TM_RTC_CHARISNUM(*(str + i))) {
  12225. 80266e8: 5cc1 ldrb r1, [r0, r3]
  12226. 80266ea: f1a1 0430 sub.w r4, r1, #48 ; 0x30
  12227. 80266ee: 2c09 cmp r4, #9
  12228. 80266f0: d9f3 bls.n 80266da <TM_RTC_SetDateTimeString+0xca>
  12229. tmp.minutes = tmp.minutes * 10 + TM_RTC_CHAR2NUM(*(str + i));
  12230. i++;
  12231. }
  12232. i++;
  12233. 80266f2: 3301 adds r3, #1
  12234. 80266f4: f88d 2004 strb.w r2, [sp, #4]
  12235. 80266f8: b2db uxtb r3, r3
  12236. /* Get seconds */
  12237. tmp.seconds = 0;
  12238. while (TM_RTC_CHARISNUM(*(str + i))) {
  12239. 80266fa: 2200 movs r2, #0
  12240. tmp.seconds = tmp.seconds * 10 + TM_RTC_CHAR2NUM(*(str + i));
  12241. 80266fc: 250a movs r5, #10
  12242. }
  12243. i++;
  12244. /* Get seconds */
  12245. tmp.seconds = 0;
  12246. while (TM_RTC_CHARISNUM(*(str + i))) {
  12247. 80266fe: e006 b.n 802670e <TM_RTC_SetDateTimeString+0xfe>
  12248. tmp.seconds = tmp.seconds * 10 + TM_RTC_CHAR2NUM(*(str + i));
  12249. 8026700: fb05 1202 mla r2, r5, r2, r1
  12250. 8026704: 3a30 subs r2, #48 ; 0x30
  12251. i++;
  12252. 8026706: 3301 adds r3, #1
  12253. i++;
  12254. /* Get seconds */
  12255. tmp.seconds = 0;
  12256. while (TM_RTC_CHARISNUM(*(str + i))) {
  12257. tmp.seconds = tmp.seconds * 10 + TM_RTC_CHAR2NUM(*(str + i));
  12258. 8026708: f002 02ff and.w r2, r2, #255 ; 0xff
  12259. i++;
  12260. 802670c: b2db uxtb r3, r3
  12261. }
  12262. i++;
  12263. /* Get seconds */
  12264. tmp.seconds = 0;
  12265. while (TM_RTC_CHARISNUM(*(str + i))) {
  12266. 802670e: 5cc1 ldrb r1, [r0, r3]
  12267. 8026710: f1a1 0430 sub.w r4, r1, #48 ; 0x30
  12268. 8026714: 2c09 cmp r4, #9
  12269. 8026716: d9f3 bls.n 8026700 <TM_RTC_SetDateTimeString+0xf0>
  12270. 8026718: a804 add r0, sp, #16
  12271. i++;
  12272. }
  12273. i++;
  12274. /* Return status from set date time function */
  12275. return TM_RTC_SetDateTime(&tmp, TM_RTC_Format_BIN);
  12276. 802671a: 2100 movs r1, #0
  12277. 802671c: f800 2d10 strb.w r2, [r0, #-16]!
  12278. 8026720: 4668 mov r0, sp
  12279. 8026722: f7ff feb3 bl 802648c <TM_RTC_SetDateTime>
  12280. }
  12281. 8026726: b005 add sp, #20
  12282. 8026728: bd30 pop {r4, r5, pc}
  12283. 0802672a <TM_RTC_Config>:
  12284. uint16_t TM_RTC_GetDaysInYear(uint8_t year) {
  12285. /* Return days in year */
  12286. return TM_RTC_DAYS_IN_YEAR(2000 + year);
  12287. }
  12288. void TM_RTC_Config(TM_RTC_ClockSource_t source) {
  12289. 802672a: b508 push {r3, lr}
  12290. if (source == TM_RTC_ClockSource_Internal) {
  12291. 802672c: b950 cbnz r0, 8026744 <TM_RTC_Config+0x1a>
  12292. /* Enable the LSI OSC */
  12293. RCC_LSICmd(ENABLE);
  12294. 802672e: 2001 movs r0, #1
  12295. 8026730: f7ff f92e bl 8025990 <RCC_LSICmd>
  12296. /* Wait till LSI is ready */
  12297. while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET);
  12298. 8026734: 2061 movs r0, #97 ; 0x61
  12299. 8026736: f7ff f9e9 bl 8025b0c <RCC_GetFlagStatus>
  12300. 802673a: 2800 cmp r0, #0
  12301. 802673c: d0fa beq.n 8026734 <TM_RTC_Config+0xa>
  12302. /* Select the RTC Clock Source */
  12303. RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
  12304. 802673e: f44f 7000 mov.w r0, #512 ; 0x200
  12305. 8026742: e00a b.n 802675a <TM_RTC_Config+0x30>
  12306. } else if (source == TM_RTC_ClockSource_External) {
  12307. 8026744: 2801 cmp r0, #1
  12308. 8026746: d10a bne.n 802675e <TM_RTC_Config+0x34>
  12309. /* Enable the LSE OSC */
  12310. RCC_LSEConfig(RCC_LSE_ON);
  12311. 8026748: f7ff f912 bl 8025970 <RCC_LSEConfig>
  12312. /* Wait till LSE is ready */
  12313. while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);
  12314. 802674c: 2041 movs r0, #65 ; 0x41
  12315. 802674e: f7ff f9dd bl 8025b0c <RCC_GetFlagStatus>
  12316. 8026752: 2800 cmp r0, #0
  12317. 8026754: d0fa beq.n 802674c <TM_RTC_Config+0x22>
  12318. /* Select the RTC Clock Source */
  12319. RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
  12320. 8026756: f44f 7080 mov.w r0, #256 ; 0x100
  12321. 802675a: f7ff f965 bl 8025a28 <RCC_RTCCLKConfig>
  12322. }
  12323. /* Enable the RTC Clock */
  12324. RCC_RTCCLKCmd(ENABLE);
  12325. 802675e: 2001 movs r0, #1
  12326. 8026760: f7ff f97a bl 8025a58 <RCC_RTCCLKCmd>
  12327. /* Wait for register synchronization */
  12328. RTC_WaitForSynchro();
  12329. 8026764: f7ff fa56 bl 8025c14 <RTC_WaitForSynchro>
  12330. /* Write status */
  12331. RTC_WriteBackupRegister(RTC_STATUS_REG, RTC_STATUS_INIT_OK);
  12332. 8026768: 2013 movs r0, #19
  12333. 802676a: f241 2134 movw r1, #4660 ; 0x1234
  12334. }
  12335. 802676e: e8bd 4008 ldmia.w sp!, {r3, lr}
  12336. /* Wait for register synchronization */
  12337. RTC_WaitForSynchro();
  12338. /* Write status */
  12339. RTC_WriteBackupRegister(RTC_STATUS_REG, RTC_STATUS_INIT_OK);
  12340. 8026772: f7ff bb49 b.w 8025e08 <RTC_WriteBackupRegister>
  12341. 8026776: 0000 movs r0, r0
  12342. 08026778 <TM_RTC_GetUnixTimeStamp>:
  12343. /* Enable wakeup command */
  12344. RTC_WakeUpCmd(ENABLE);
  12345. }
  12346. }
  12347. uint32_t TM_RTC_GetUnixTimeStamp(TM_RTC_t* data) {
  12348. 8026778: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  12349. uint32_t days = 0, seconds = 0;
  12350. uint16_t i;
  12351. uint16_t year = (uint16_t) (data->year + 2000);
  12352. 802677c: 7a42 ldrb r2, [r0, #9]
  12353. 802677e: f240 73b2 movw r3, #1970 ; 0x7b2
  12354. 8026782: f502 62fa add.w r2, r2, #2000 ; 0x7d0
  12355. 8026786: 2100 movs r1, #0
  12356. if (year < TM_RTC_OFFSET_YEAR) {
  12357. return 0;
  12358. }
  12359. /* Days in back years */
  12360. for (i = TM_RTC_OFFSET_YEAR; i < year; i++) {
  12361. days += TM_RTC_DAYS_IN_YEAR(i);
  12362. 8026788: f44f 75c8 mov.w r5, #400 ; 0x190
  12363. 802678c: 2664 movs r6, #100 ; 0x64
  12364. 802678e: 079c lsls r4, r3, #30
  12365. 8026790: d108 bne.n 80267a4 <TM_RTC_GetUnixTimeStamp+0x2c>
  12366. 8026792: fbb3 f4f6 udiv r4, r3, r6
  12367. 8026796: fb06 3414 mls r4, r6, r4, r3
  12368. 802679a: b2a4 uxth r4, r4
  12369. 802679c: b114 cbz r4, 80267a4 <TM_RTC_GetUnixTimeStamp+0x2c>
  12370. 802679e: f44f 74b7 mov.w r4, #366 ; 0x16e
  12371. 80267a2: e008 b.n 80267b6 <TM_RTC_GetUnixTimeStamp+0x3e>
  12372. 80267a4: fbb3 f4f5 udiv r4, r3, r5
  12373. 80267a8: fb05 3414 mls r4, r5, r4, r3
  12374. 80267ac: b2a4 uxth r4, r4
  12375. 80267ae: 2c00 cmp r4, #0
  12376. 80267b0: d0f5 beq.n 802679e <TM_RTC_GetUnixTimeStamp+0x26>
  12377. 80267b2: f240 146d movw r4, #365 ; 0x16d
  12378. /* Year is below offset year */
  12379. if (year < TM_RTC_OFFSET_YEAR) {
  12380. return 0;
  12381. }
  12382. /* Days in back years */
  12383. for (i = TM_RTC_OFFSET_YEAR; i < year; i++) {
  12384. 80267b6: 3301 adds r3, #1
  12385. 80267b8: b29b uxth r3, r3
  12386. 80267ba: 4293 cmp r3, r2
  12387. days += TM_RTC_DAYS_IN_YEAR(i);
  12388. 80267bc: 4421 add r1, r4
  12389. /* Year is below offset year */
  12390. if (year < TM_RTC_OFFSET_YEAR) {
  12391. return 0;
  12392. }
  12393. /* Days in back years */
  12394. for (i = TM_RTC_OFFSET_YEAR; i < year; i++) {
  12395. 80267be: d3e6 bcc.n 802678e <TM_RTC_GetUnixTimeStamp+0x16>
  12396. days += TM_RTC_DAYS_IN_YEAR(i);
  12397. }
  12398. /* Days in current year */
  12399. for (i = 1; i < data->month; i++) {
  12400. days += TM_RTC_Months[TM_RTC_LEAP_YEAR(year)][i - 1];
  12401. 80267c0: 2364 movs r3, #100 ; 0x64
  12402. 80267c2: fbb2 f7f3 udiv r7, r2, r3
  12403. 80267c6: fb03 2317 mls r3, r3, r7, r2
  12404. 80267ca: b29f uxth r7, r3
  12405. 80267cc: f44f 73c8 mov.w r3, #400 ; 0x190
  12406. 80267d0: fbb2 f4f3 udiv r4, r2, r3
  12407. 80267d4: fb03 2414 mls r4, r3, r4, r2
  12408. 80267d8: b2a4 uxth r4, r4
  12409. 80267da: f1d4 0401 rsbs r4, r4, #1
  12410. 80267de: bf38 it cc
  12411. 80267e0: 2400 movcc r4, #0
  12412. /* Days in back years */
  12413. for (i = TM_RTC_OFFSET_YEAR; i < year; i++) {
  12414. days += TM_RTC_DAYS_IN_YEAR(i);
  12415. }
  12416. /* Days in current year */
  12417. for (i = 1; i < data->month; i++) {
  12418. 80267e2: 7a06 ldrb r6, [r0, #8]
  12419. days += TM_RTC_Months[TM_RTC_LEAP_YEAR(year)][i - 1];
  12420. 80267e4: f8df c058 ldr.w ip, [pc, #88] ; 8026840 <TM_RTC_GetUnixTimeStamp+0xc8>
  12421. 80267e8: 2300 movs r3, #0
  12422. 80267ea: f002 0203 and.w r2, r2, #3
  12423. 80267ee: f04f 080c mov.w r8, #12
  12424. 80267f2: e00c b.n 802680e <TM_RTC_GetUnixTimeStamp+0x96>
  12425. 80267f4: b922 cbnz r2, 8026800 <TM_RTC_GetUnixTimeStamp+0x88>
  12426. 80267f6: 2f00 cmp r7, #0
  12427. 80267f8: bf0c ite eq
  12428. 80267fa: 4625 moveq r5, r4
  12429. 80267fc: 2501 movne r5, #1
  12430. 80267fe: e000 b.n 8026802 <TM_RTC_GetUnixTimeStamp+0x8a>
  12431. 8026800: 4625 mov r5, r4
  12432. 8026802: fb08 3505 mla r5, r8, r5, r3
  12433. 8026806: 3301 adds r3, #1
  12434. 8026808: f81c 5005 ldrb.w r5, [ip, r5]
  12435. 802680c: 1949 adds r1, r1, r5
  12436. /* Days in back years */
  12437. for (i = TM_RTC_OFFSET_YEAR; i < year; i++) {
  12438. days += TM_RTC_DAYS_IN_YEAR(i);
  12439. }
  12440. /* Days in current year */
  12441. for (i = 1; i < data->month; i++) {
  12442. 802680e: 1c5d adds r5, r3, #1
  12443. 8026810: b2ad uxth r5, r5
  12444. 8026812: 42b5 cmp r5, r6
  12445. 8026814: d3ee bcc.n 80267f4 <TM_RTC_GetUnixTimeStamp+0x7c>
  12446. days += TM_RTC_Months[TM_RTC_LEAP_YEAR(year)][i - 1];
  12447. }
  12448. /* Day starts with 1 */
  12449. days += data->date - 1;
  12450. 8026816: 79c3 ldrb r3, [r0, #7]
  12451. seconds = days * TM_RTC_SECONDS_PER_DAY;
  12452. seconds += data->hours * TM_RTC_SECONDS_PER_HOUR;
  12453. 8026818: 7944 ldrb r4, [r0, #5]
  12454. /* Days in current year */
  12455. for (i = 1; i < data->month; i++) {
  12456. days += TM_RTC_Months[TM_RTC_LEAP_YEAR(year)][i - 1];
  12457. }
  12458. /* Day starts with 1 */
  12459. days += data->date - 1;
  12460. 802681a: 3b01 subs r3, #1
  12461. 802681c: 1859 adds r1, r3, r1
  12462. seconds = days * TM_RTC_SECONDS_PER_DAY;
  12463. seconds += data->hours * TM_RTC_SECONDS_PER_HOUR;
  12464. seconds += data->minutes * TM_RTC_SECONDS_PER_MINUTE;
  12465. 802681e: 7903 ldrb r3, [r0, #4]
  12466. 8026820: 009a lsls r2, r3, #2
  12467. 8026822: 019b lsls r3, r3, #6
  12468. 8026824: 1a9a subs r2, r3, r2
  12469. days += TM_RTC_Months[TM_RTC_LEAP_YEAR(year)][i - 1];
  12470. }
  12471. /* Day starts with 1 */
  12472. days += data->date - 1;
  12473. seconds = days * TM_RTC_SECONDS_PER_DAY;
  12474. seconds += data->hours * TM_RTC_SECONDS_PER_HOUR;
  12475. 8026826: f44f 6361 mov.w r3, #3600 ; 0xe10
  12476. 802682a: fb03 2304 mla r3, r3, r4, r2
  12477. seconds += data->minutes * TM_RTC_SECONDS_PER_MINUTE;
  12478. seconds += data->seconds;
  12479. 802682e: 7802 ldrb r2, [r0, #0]
  12480. /* seconds = days * 86400; */
  12481. return seconds;
  12482. }
  12483. 8026830: 4802 ldr r0, [pc, #8] ; (802683c <TM_RTC_GetUnixTimeStamp+0xc4>)
  12484. }
  12485. /* Day starts with 1 */
  12486. days += data->date - 1;
  12487. seconds = days * TM_RTC_SECONDS_PER_DAY;
  12488. seconds += data->hours * TM_RTC_SECONDS_PER_HOUR;
  12489. seconds += data->minutes * TM_RTC_SECONDS_PER_MINUTE;
  12490. 8026832: 189b adds r3, r3, r2
  12491. seconds += data->seconds;
  12492. /* seconds = days * 86400; */
  12493. return seconds;
  12494. }
  12495. 8026834: fb00 3001 mla r0, r0, r1, r3
  12496. 8026838: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  12497. 802683c: 00015180 .word 0x00015180
  12498. 8026840: 20000658 .word 0x20000658
  12499. 08026844 <TM_RTC_GetDateTime>:
  12500. /* Return status from set date time function */
  12501. return TM_RTC_SetDateTime(&tmp, TM_RTC_Format_BIN);
  12502. }
  12503. void TM_RTC_GetDateTime(TM_RTC_t* data, TM_RTC_Format_t format) {
  12504. 8026844: b538 push {r3, r4, r5, lr}
  12505. 8026846: 4604 mov r4, r0
  12506. uint32_t unix;
  12507. /* Get time */
  12508. if (format == TM_RTC_Format_BIN) {
  12509. 8026848: 460d mov r5, r1
  12510. 802684a: b909 cbnz r1, 8026850 <TM_RTC_GetDateTime+0xc>
  12511. RTC_GetTime(RTC_Format_BIN, &RTC_TimeStruct);
  12512. 802684c: 4608 mov r0, r1
  12513. 802684e: e000 b.n 8026852 <TM_RTC_GetDateTime+0xe>
  12514. } else {
  12515. RTC_GetTime(RTC_Format_BCD, &RTC_TimeStruct);
  12516. 8026850: 2001 movs r0, #1
  12517. 8026852: 4911 ldr r1, [pc, #68] ; (8026898 <TM_RTC_GetDateTime+0x54>)
  12518. 8026854: f7ff fa4c bl 8025cf0 <RTC_GetTime>
  12519. }
  12520. /* Format hours */
  12521. data->hours = RTC_TimeStruct.RTC_Hours;
  12522. 8026858: 4b0f ldr r3, [pc, #60] ; (8026898 <TM_RTC_GetDateTime+0x54>)
  12523. 802685a: 781a ldrb r2, [r3, #0]
  12524. 802685c: 7162 strb r2, [r4, #5]
  12525. data->minutes = RTC_TimeStruct.RTC_Minutes;
  12526. 802685e: 785a ldrb r2, [r3, #1]
  12527. data->seconds = RTC_TimeStruct.RTC_Seconds;
  12528. 8026860: 789b ldrb r3, [r3, #2]
  12529. RTC_GetTime(RTC_Format_BCD, &RTC_TimeStruct);
  12530. }
  12531. /* Format hours */
  12532. data->hours = RTC_TimeStruct.RTC_Hours;
  12533. data->minutes = RTC_TimeStruct.RTC_Minutes;
  12534. 8026862: 7122 strb r2, [r4, #4]
  12535. data->seconds = RTC_TimeStruct.RTC_Seconds;
  12536. 8026864: 7023 strb r3, [r4, #0]
  12537. /* Get subseconds */
  12538. data->subseconds = RTC->SSR;
  12539. 8026866: 4b0d ldr r3, [pc, #52] ; (802689c <TM_RTC_GetDateTime+0x58>)
  12540. 8026868: 6a9b ldr r3, [r3, #40] ; 0x28
  12541. 802686a: 8063 strh r3, [r4, #2]
  12542. /* Get date */
  12543. if (format == TM_RTC_Format_BIN) {
  12544. 802686c: b90d cbnz r5, 8026872 <TM_RTC_GetDateTime+0x2e>
  12545. RTC_GetDate(RTC_Format_BIN, &RTC_DateStruct);
  12546. 802686e: 4628 mov r0, r5
  12547. 8026870: e000 b.n 8026874 <TM_RTC_GetDateTime+0x30>
  12548. } else {
  12549. RTC_GetDate(RTC_Format_BCD, &RTC_DateStruct);
  12550. 8026872: 2001 movs r0, #1
  12551. 8026874: 490a ldr r1, [pc, #40] ; (80268a0 <TM_RTC_GetDateTime+0x5c>)
  12552. 8026876: f7ff faa7 bl 8025dc8 <RTC_GetDate>
  12553. }
  12554. /* Format date */
  12555. data->year = RTC_DateStruct.RTC_Year;
  12556. 802687a: 4b09 ldr r3, [pc, #36] ; (80268a0 <TM_RTC_GetDateTime+0x5c>)
  12557. 802687c: 78da ldrb r2, [r3, #3]
  12558. 802687e: 7262 strb r2, [r4, #9]
  12559. data->month = RTC_DateStruct.RTC_Month;
  12560. 8026880: 785a ldrb r2, [r3, #1]
  12561. 8026882: 7222 strb r2, [r4, #8]
  12562. data->date = RTC_DateStruct.RTC_Date;
  12563. 8026884: 789a ldrb r2, [r3, #2]
  12564. data->day = RTC_DateStruct.RTC_WeekDay;
  12565. 8026886: 781b ldrb r3, [r3, #0]
  12566. }
  12567. /* Format date */
  12568. data->year = RTC_DateStruct.RTC_Year;
  12569. data->month = RTC_DateStruct.RTC_Month;
  12570. data->date = RTC_DateStruct.RTC_Date;
  12571. 8026888: 71e2 strb r2, [r4, #7]
  12572. data->day = RTC_DateStruct.RTC_WeekDay;
  12573. 802688a: 71a3 strb r3, [r4, #6]
  12574. /* Calculate unix offset */
  12575. unix = TM_RTC_GetUnixTimeStamp(data);
  12576. 802688c: 4620 mov r0, r4
  12577. 802688e: f7ff ff73 bl 8026778 <TM_RTC_GetUnixTimeStamp>
  12578. data->unix = unix;
  12579. 8026892: 60e0 str r0, [r4, #12]
  12580. 8026894: bd38 pop {r3, r4, r5, pc}
  12581. 8026896: bf00 nop
  12582. 8026898: 2000c860 .word 0x2000c860
  12583. 802689c: 40002800 .word 0x40002800
  12584. 80268a0: 2000c870 .word 0x2000c870
  12585. 080268a4 <TM_RTC_Init>:
  12586. }
  12587. }
  12588. uint32_t TM_RTC_Init(TM_RTC_ClockSource_t source)
  12589. {
  12590. 80268a4: b5f0 push {r4, r5, r6, r7, lr}
  12591. uint32_t status;
  12592. uint8_t stat = 1;
  12593. TM_RTC_t datatime;
  12594. /* Enable PWR peripheral clock */
  12595. RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
  12596. 80268a6: 2101 movs r1, #1
  12597. }
  12598. }
  12599. uint32_t TM_RTC_Init(TM_RTC_ClockSource_t source)
  12600. {
  12601. 80268a8: b085 sub sp, #20
  12602. 80268aa: 4605 mov r5, r0
  12603. uint32_t status;
  12604. uint8_t stat = 1;
  12605. TM_RTC_t datatime;
  12606. /* Enable PWR peripheral clock */
  12607. RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
  12608. 80268ac: f04f 5080 mov.w r0, #268435456 ; 0x10000000
  12609. 80268b0: f7ff f8f0 bl 8025a94 <RCC_APB1PeriphClockCmd>
  12610. /* Allow access to BKP Domain */
  12611. PWR_BackupAccessCmd(ENABLE);
  12612. 80268b4: 2001 movs r0, #1
  12613. 80268b6: f7ff f855 bl 8025964 <PWR_BackupAccessCmd>
  12614. /* Get RTC status */
  12615. status = RTC_ReadBackupRegister(RTC_STATUS_REG);
  12616. 80268ba: 2013 movs r0, #19
  12617. 80268bc: f7ff fab4 bl 8025e28 <RTC_ReadBackupRegister>
  12618. if (status == RTC_STATUS_TIME_OK)
  12619. 80268c0: f244 3321 movw r3, #17185 ; 0x4321
  12620. 80268c4: 4298 cmp r0, r3
  12621. 80268c6: 4e25 ldr r6, [pc, #148] ; (802695c <TM_RTC_Init+0xb8>)
  12622. 80268c8: d113 bne.n 80268f2 <TM_RTC_Init+0x4e>
  12623. {
  12624. TM_RTC_Status = RTC_STATUS_TIME_OK;
  12625. 80268ca: 6030 str r0, [r6, #0]
  12626. /* Start internal clock if we choose internal clock */
  12627. if (source == TM_RTC_ClockSource_Internal)
  12628. 80268cc: b915 cbnz r5, 80268d4 <TM_RTC_Init+0x30>
  12629. TM_RTC_Config(TM_RTC_ClockSource_Internal);
  12630. 80268ce: 4628 mov r0, r5
  12631. 80268d0: f7ff ff2b bl 802672a <TM_RTC_Config>
  12632. /* Wait for RTC APB registers synchronisation (needed after start-up from Reset) */
  12633. RTC_WaitForSynchro();
  12634. 80268d4: f7ff f99e bl 8025c14 <RTC_WaitForSynchro>
  12635. /* Clear interrupt flags */
  12636. RTC_ClearITPendingBit(RTC_IT_WUT);
  12637. 80268d8: f44f 4080 mov.w r0, #16384 ; 0x4000
  12638. 80268dc: f7ff facc bl 8025e78 <RTC_ClearITPendingBit>
  12639. EXTI->PR = 0x00400000;
  12640. 80268e0: 4b1f ldr r3, [pc, #124] ; (8026960 <TM_RTC_Init+0xbc>)
  12641. 80268e2: f44f 0280 mov.w r2, #4194304 ; 0x400000
  12642. 80268e6: 615a str r2, [r3, #20]
  12643. /* Get date and time */
  12644. TM_RTC_GetDateTime(&datatime, TM_RTC_Format_BIN);
  12645. 80268e8: 4668 mov r0, sp
  12646. 80268ea: 2100 movs r1, #0
  12647. 80268ec: f7ff ffaa bl 8026844 <TM_RTC_GetDateTime>
  12648. 80268f0: e02f b.n 8026952 <TM_RTC_Init+0xae>
  12649. }
  12650. else if (status == RTC_STATUS_INIT_OK)
  12651. 80268f2: f241 2734 movw r7, #4660 ; 0x1234
  12652. 80268f6: 42b8 cmp r0, r7
  12653. 80268f8: d10f bne.n 802691a <TM_RTC_Init+0x76>
  12654. {
  12655. TM_RTC_Status = RTC_STATUS_INIT_OK;
  12656. 80268fa: 6030 str r0, [r6, #0]
  12657. /* Start internal clock if we choose internal clock */
  12658. if (source == TM_RTC_ClockSource_Internal)
  12659. 80268fc: b915 cbnz r5, 8026904 <TM_RTC_Init+0x60>
  12660. TM_RTC_Config(TM_RTC_ClockSource_Internal);
  12661. 80268fe: 4628 mov r0, r5
  12662. 8026900: f7ff ff13 bl 802672a <TM_RTC_Config>
  12663. /* Wait for RTC APB registers synchronisation (needed after start-up from Reset) */
  12664. RTC_WaitForSynchro();
  12665. 8026904: f7ff f986 bl 8025c14 <RTC_WaitForSynchro>
  12666. /* Clear interrupt flags */
  12667. RTC_ClearITPendingBit(RTC_IT_WUT);
  12668. 8026908: f44f 4080 mov.w r0, #16384 ; 0x4000
  12669. 802690c: f7ff fab4 bl 8025e78 <RTC_ClearITPendingBit>
  12670. EXTI->PR = 0x00400000;
  12671. 8026910: 4b13 ldr r3, [pc, #76] ; (8026960 <TM_RTC_Init+0xbc>)
  12672. 8026912: f44f 0280 mov.w r2, #4194304 ; 0x400000
  12673. 8026916: 615a str r2, [r3, #20]
  12674. 8026918: e01b b.n 8026952 <TM_RTC_Init+0xae>
  12675. /* Get date and time */
  12676. //TM_RTC_GetDateTime(&datatime, TM_RTC_Format_BIN);
  12677. }
  12678. else
  12679. {
  12680. TM_RTC_Status = RTC_STATUS_ZERO;
  12681. 802691a: 2400 movs r4, #0
  12682. /* Return status = 0 -> RTC Never initialized before */
  12683. stat = RTC_STATUS_ZERO;
  12684. /* Config RTC */
  12685. TM_RTC_Config(source);
  12686. 802691c: 4628 mov r0, r5
  12687. /* Get date and time */
  12688. //TM_RTC_GetDateTime(&datatime, TM_RTC_Format_BIN);
  12689. }
  12690. else
  12691. {
  12692. TM_RTC_Status = RTC_STATUS_ZERO;
  12693. 802691e: 6034 str r4, [r6, #0]
  12694. /* Return status = 0 -> RTC Never initialized before */
  12695. stat = RTC_STATUS_ZERO;
  12696. /* Config RTC */
  12697. TM_RTC_Config(source);
  12698. 8026920: f7ff ff03 bl 802672a <TM_RTC_Config>
  12699. datatime.day = 1;
  12700. datatime.month = 1;
  12701. datatime.year = 0;
  12702. datatime.hours = 0;
  12703. datatime.minutes = 0;
  12704. datatime.seconds = 0;
  12705. 8026924: a804 add r0, sp, #16
  12706. stat = RTC_STATUS_ZERO;
  12707. /* Config RTC */
  12708. TM_RTC_Config(source);
  12709. /* Set date and time */
  12710. datatime.date = 1;
  12711. 8026926: 2301 movs r3, #1
  12712. datatime.day = 1;
  12713. datatime.month = 1;
  12714. datatime.year = 0;
  12715. datatime.hours = 0;
  12716. datatime.minutes = 0;
  12717. datatime.seconds = 0;
  12718. 8026928: f800 4d10 strb.w r4, [r0, #-16]!
  12719. /* Set date and time */
  12720. TM_RTC_SetDateTime(&datatime, TM_RTC_Format_BIN);
  12721. 802692c: 4621 mov r1, r4
  12722. 802692e: 4668 mov r0, sp
  12723. stat = RTC_STATUS_ZERO;
  12724. /* Config RTC */
  12725. TM_RTC_Config(source);
  12726. /* Set date and time */
  12727. datatime.date = 1;
  12728. 8026930: f88d 3007 strb.w r3, [sp, #7]
  12729. datatime.day = 1;
  12730. 8026934: f88d 3006 strb.w r3, [sp, #6]
  12731. datatime.month = 1;
  12732. 8026938: f88d 3008 strb.w r3, [sp, #8]
  12733. datatime.year = 0;
  12734. 802693c: f88d 4009 strb.w r4, [sp, #9]
  12735. datatime.hours = 0;
  12736. 8026940: f88d 4005 strb.w r4, [sp, #5]
  12737. datatime.minutes = 0;
  12738. 8026944: f88d 4004 strb.w r4, [sp, #4]
  12739. datatime.seconds = 0;
  12740. /* Set date and time */
  12741. TM_RTC_SetDateTime(&datatime, TM_RTC_Format_BIN);
  12742. 8026948: f7ff fda0 bl 802648c <TM_RTC_SetDateTime>
  12743. /* Initialized OK */
  12744. TM_RTC_Status = RTC_STATUS_INIT_OK;
  12745. 802694c: 6037 str r7, [r6, #0]
  12746. }
  12747. /* If first time initialized */
  12748. if (stat == RTC_STATUS_ZERO)
  12749. return 0;
  12750. 802694e: 4620 mov r0, r4
  12751. 8026950: e001 b.n 8026956 <TM_RTC_Init+0xb2>
  12752. return TM_RTC_Status;
  12753. 8026952: 4b02 ldr r3, [pc, #8] ; (802695c <TM_RTC_Init+0xb8>)
  12754. 8026954: 6818 ldr r0, [r3, #0]
  12755. }
  12756. 8026956: b005 add sp, #20
  12757. 8026958: bdf0 pop {r4, r5, r6, r7, pc}
  12758. 802695a: bf00 nop
  12759. 802695c: 20000b14 .word 0x20000b14
  12760. 8026960: 40013c00 .word 0x40013c00
  12761. 08026964 <TM_RTC_GetDateTimeFromUnix>:
  12762. uint16_t year;
  12763. /* Store unix time to unix in struct */
  12764. data->unix = unix;
  12765. /* Get seconds from unix */
  12766. data->seconds = unix % 60;
  12767. 8026964: 233c movs r3, #60 ; 0x3c
  12768. /* seconds = days * 86400; */
  12769. return seconds;
  12770. }
  12771. void TM_RTC_GetDateTimeFromUnix(TM_RTC_t* data, uint32_t unix) {
  12772. 8026966: b5f0 push {r4, r5, r6, r7, lr}
  12773. uint16_t year;
  12774. /* Store unix time to unix in struct */
  12775. data->unix = unix;
  12776. /* Get seconds from unix */
  12777. data->seconds = unix % 60;
  12778. 8026968: fbb1 f4f3 udiv r4, r1, r3
  12779. /* Go to minutes */
  12780. unix /= 60;
  12781. /* Get minutes */
  12782. data->minutes = unix % 60;
  12783. 802696c: fbb4 f2f3 udiv r2, r4, r3
  12784. void TM_RTC_GetDateTimeFromUnix(TM_RTC_t* data, uint32_t unix) {
  12785. uint16_t year;
  12786. /* Store unix time to unix in struct */
  12787. data->unix = unix;
  12788. 8026970: 60c1 str r1, [r0, #12]
  12789. /* Get seconds from unix */
  12790. data->seconds = unix % 60;
  12791. 8026972: fb03 1114 mls r1, r3, r4, r1
  12792. 8026976: 7001 strb r1, [r0, #0]
  12793. /* Go to minutes */
  12794. unix /= 60;
  12795. /* Get minutes */
  12796. data->minutes = unix % 60;
  12797. 8026978: fb03 4312 mls r3, r3, r2, r4
  12798. /* Go to hours */
  12799. unix /= 60;
  12800. /* Get hours */
  12801. data->hours = unix % 24;
  12802. 802697c: 2118 movs r1, #24
  12803. /* Get seconds from unix */
  12804. data->seconds = unix % 60;
  12805. /* Go to minutes */
  12806. unix /= 60;
  12807. /* Get minutes */
  12808. data->minutes = unix % 60;
  12809. 802697e: 7103 strb r3, [r0, #4]
  12810. /* Go to hours */
  12811. unix /= 60;
  12812. /* Get hours */
  12813. data->hours = unix % 24;
  12814. 8026980: fbb2 f3f1 udiv r3, r2, r1
  12815. 8026984: fb01 2213 mls r2, r1, r3, r2
  12816. 8026988: 7142 strb r2, [r0, #5]
  12817. /* Go to days */
  12818. unix /= 24;
  12819. /* Get week day */
  12820. /* Monday is day one */
  12821. data->day = (unix + 3) % 7 + 1;
  12822. 802698a: 1cd9 adds r1, r3, #3
  12823. 802698c: 2207 movs r2, #7
  12824. 802698e: fbb1 f4f2 udiv r4, r1, r2
  12825. 8026992: fb02 1214 mls r2, r2, r4, r1
  12826. 8026996: 3201 adds r2, #1
  12827. 8026998: 7182 strb r2, [r0, #6]
  12828. /* Get year */
  12829. year = 1970;
  12830. while (1) {
  12831. if (TM_RTC_LEAP_YEAR(year)) {
  12832. if (unix >= 366) {
  12833. 802699a: f240 156d movw r5, #365 ; 0x16d
  12834. /* Get week day */
  12835. /* Monday is day one */
  12836. data->day = (unix + 3) % 7 + 1;
  12837. /* Get year */
  12838. year = 1970;
  12839. 802699e: f240 72b2 movw r2, #1970 ; 0x7b2
  12840. while (1) {
  12841. if (TM_RTC_LEAP_YEAR(year)) {
  12842. 80269a2: f44f 71c8 mov.w r1, #400 ; 0x190
  12843. 80269a6: 2464 movs r4, #100 ; 0x64
  12844. 80269a8: f012 0603 ands.w r6, r2, #3
  12845. 80269ac: d105 bne.n 80269ba <TM_RTC_GetDateTimeFromUnix+0x56>
  12846. 80269ae: fbb2 f7f4 udiv r7, r2, r4
  12847. 80269b2: fb04 2717 mls r7, r4, r7, r2
  12848. 80269b6: b2bf uxth r7, r7
  12849. 80269b8: b92f cbnz r7, 80269c6 <TM_RTC_GetDateTimeFromUnix+0x62>
  12850. 80269ba: fbb2 f7f1 udiv r7, r2, r1
  12851. 80269be: fb01 2717 mls r7, r1, r7, r2
  12852. 80269c2: b2bf uxth r7, r7
  12853. 80269c4: b927 cbnz r7, 80269d0 <TM_RTC_GetDateTimeFromUnix+0x6c>
  12854. if (unix >= 366) {
  12855. 80269c6: 42ab cmp r3, r5
  12856. 80269c8: d90b bls.n 80269e2 <TM_RTC_GetDateTimeFromUnix+0x7e>
  12857. unix -= 366;
  12858. 80269ca: f5a3 73b7 sub.w r3, r3, #366 ; 0x16e
  12859. /* Get year */
  12860. year = 1970;
  12861. while (1) {
  12862. if (TM_RTC_LEAP_YEAR(year)) {
  12863. if (unix >= 366) {
  12864. 80269ce: e005 b.n 80269dc <TM_RTC_GetDateTimeFromUnix+0x78>
  12865. unix -= 366;
  12866. } else {
  12867. break;
  12868. }
  12869. } else if (unix >= 365) {
  12870. 80269d0: f5b3 7fb6 cmp.w r3, #364 ; 0x16c
  12871. 80269d4: d905 bls.n 80269e2 <TM_RTC_GetDateTimeFromUnix+0x7e>
  12872. unix -= 365;
  12873. 80269d6: f46f 76b6 mvn.w r6, #364 ; 0x16c
  12874. 80269da: 199b adds r3, r3, r6
  12875. } else {
  12876. break;
  12877. }
  12878. year++;
  12879. 80269dc: 3201 adds r2, #1
  12880. 80269de: b292 uxth r2, r2
  12881. }
  12882. 80269e0: e7e2 b.n 80269a8 <TM_RTC_GetDateTimeFromUnix+0x44>
  12883. /* Get year in xx format */
  12884. data->year = (uint8_t) (year - 2000);
  12885. 80269e2: f102 0130 add.w r1, r2, #48 ; 0x30
  12886. 80269e6: 7241 strb r1, [r0, #9]
  12887. /* Get month */
  12888. for (data->month = 0; data->month < 12; data->month++) {
  12889. 80269e8: 2100 movs r1, #0
  12890. 80269ea: 7201 strb r1, [r0, #8]
  12891. if (TM_RTC_LEAP_YEAR(year) && unix >= (uint32_t)TM_RTC_Months[1][data->month]) {
  12892. 80269ec: 2164 movs r1, #100 ; 0x64
  12893. 80269ee: fbb2 f7f1 udiv r7, r2, r1
  12894. 80269f2: fb01 2117 mls r1, r1, r7, r2
  12895. 80269f6: b28f uxth r7, r1
  12896. 80269f8: f44f 71c8 mov.w r1, #400 ; 0x190
  12897. 80269fc: fbb2 f4f1 udiv r4, r2, r1
  12898. 8026a00: fb01 2214 mls r2, r1, r4, r2
  12899. 8026a04: b292 uxth r2, r2
  12900. unix -= TM_RTC_Months[1][data->month];
  12901. } else if (unix >= (uint32_t)TM_RTC_Months[0][data->month]) {
  12902. 8026a06: 4c0c ldr r4, [pc, #48] ; (8026a38 <TM_RTC_GetDateTimeFromUnix+0xd4>)
  12903. year++;
  12904. }
  12905. /* Get year in xx format */
  12906. data->year = (uint8_t) (year - 2000);
  12907. /* Get month */
  12908. for (data->month = 0; data->month < 12; data->month++) {
  12909. 8026a08: e012 b.n 8026a30 <TM_RTC_GetDateTimeFromUnix+0xcc>
  12910. if (TM_RTC_LEAP_YEAR(year) && unix >= (uint32_t)TM_RTC_Months[1][data->month]) {
  12911. 8026a0a: b906 cbnz r6, 8026a0e <TM_RTC_GetDateTimeFromUnix+0xaa>
  12912. 8026a0c: b907 cbnz r7, 8026a10 <TM_RTC_GetDateTimeFromUnix+0xac>
  12913. 8026a0e: b922 cbnz r2, 8026a1a <TM_RTC_GetDateTimeFromUnix+0xb6>
  12914. 8026a10: 1865 adds r5, r4, r1
  12915. 8026a12: 7b2d ldrb r5, [r5, #12]
  12916. 8026a14: 42ab cmp r3, r5
  12917. 8026a16: d300 bcc.n 8026a1a <TM_RTC_GetDateTimeFromUnix+0xb6>
  12918. 8026a18: e007 b.n 8026a2a <TM_RTC_GetDateTimeFromUnix+0xc6>
  12919. unix -= TM_RTC_Months[1][data->month];
  12920. } else if (unix >= (uint32_t)TM_RTC_Months[0][data->month]) {
  12921. 8026a1a: 5c65 ldrb r5, [r4, r1]
  12922. 8026a1c: 42ab cmp r3, r5
  12923. 8026a1e: d204 bcs.n 8026a2a <TM_RTC_GetDateTimeFromUnix+0xc6>
  12924. break;
  12925. }
  12926. }
  12927. /* Get month */
  12928. /* Month starts with 1 */
  12929. data->month++;
  12930. 8026a20: 3101 adds r1, #1
  12931. /* Get date */
  12932. /* Date starts with 1 */
  12933. data->date = unix + 1;
  12934. 8026a22: 3301 adds r3, #1
  12935. break;
  12936. }
  12937. }
  12938. /* Get month */
  12939. /* Month starts with 1 */
  12940. data->month++;
  12941. 8026a24: 7201 strb r1, [r0, #8]
  12942. /* Get date */
  12943. /* Date starts with 1 */
  12944. data->date = unix + 1;
  12945. 8026a26: 71c3 strb r3, [r0, #7]
  12946. 8026a28: bdf0 pop {r4, r5, r6, r7, pc}
  12947. year++;
  12948. }
  12949. /* Get year in xx format */
  12950. data->year = (uint8_t) (year - 2000);
  12951. /* Get month */
  12952. for (data->month = 0; data->month < 12; data->month++) {
  12953. 8026a2a: 3101 adds r1, #1
  12954. if (TM_RTC_LEAP_YEAR(year) && unix >= (uint32_t)TM_RTC_Months[1][data->month]) {
  12955. unix -= TM_RTC_Months[1][data->month];
  12956. } else if (unix >= (uint32_t)TM_RTC_Months[0][data->month]) {
  12957. unix -= TM_RTC_Months[0][data->month];
  12958. 8026a2c: 1b5b subs r3, r3, r5
  12959. year++;
  12960. }
  12961. /* Get year in xx format */
  12962. data->year = (uint8_t) (year - 2000);
  12963. /* Get month */
  12964. for (data->month = 0; data->month < 12; data->month++) {
  12965. 8026a2e: 7201 strb r1, [r0, #8]
  12966. 8026a30: 7a01 ldrb r1, [r0, #8]
  12967. 8026a32: 290b cmp r1, #11
  12968. 8026a34: d9e9 bls.n 8026a0a <TM_RTC_GetDateTimeFromUnix+0xa6>
  12969. 8026a36: e7f3 b.n 8026a20 <TM_RTC_GetDateTimeFromUnix+0xbc>
  12970. 8026a38: 20000658 .word 0x20000658
  12971. 8026a3c: 00000000 .word 0x00000000
  12972. 08026a40 <TM_RTC_Correction>:
  12973. * @brief Кореектировака времени.
  12974. * @param Часовой пояс
  12975. * @retval
  12976. */
  12977. void TM_RTC_Correction(float utc)
  12978. {
  12979. 8026a40: b510 push {r4, lr}
  12980. 8026a42: b088 sub sp, #32
  12981. 8026a44: 4604 mov r4, r0
  12982. TM_RTC_t newData;
  12983. int utcSec;
  12984. uint32_t unixTime;
  12985. /* Получаем текущее время */
  12986. TM_RTC_GetDateTime(&data, TM_RTC_Format_BIN);
  12987. 8026a46: 2100 movs r1, #0
  12988. 8026a48: 4668 mov r0, sp
  12989. 8026a4a: f7ff fefb bl 8026844 <TM_RTC_GetDateTime>
  12990. /* Рассчитываем поправку */
  12991. utcSec = (int)(3600.0*utc);
  12992. 8026a4e: 4620 mov r0, r4
  12993. 8026a50: f7f9 fd9e bl 8020590 <__aeabi_f2d>
  12994. 8026a54: a308 add r3, pc, #32 ; (adr r3, 8026a78 <TM_RTC_Correction+0x38>)
  12995. 8026a56: e9d3 2300 ldrd r2, r3, [r3]
  12996. 8026a5a: f7f9 fded bl 8020638 <__aeabi_dmul>
  12997. 8026a5e: f7fa f885 bl 8020b6c <__aeabi_d2iz>
  12998. unixTime = data.unix + utcSec;
  12999. 8026a62: 9903 ldr r1, [sp, #12]
  13000. 8026a64: 1841 adds r1, r0, r1
  13001. /* Устанавливаем новое время */
  13002. TM_RTC_GetDateTimeFromUnix(&newData, unixTime);
  13003. 8026a66: a804 add r0, sp, #16
  13004. 8026a68: f7ff ff7c bl 8026964 <TM_RTC_GetDateTimeFromUnix>
  13005. TM_RTC_SetDateTime(&newData, TM_RTC_Format_BIN);
  13006. 8026a6c: a804 add r0, sp, #16
  13007. 8026a6e: 2100 movs r1, #0
  13008. 8026a70: f7ff fd0c bl 802648c <TM_RTC_SetDateTime>
  13009. }
  13010. 8026a74: b008 add sp, #32
  13011. 8026a76: bd10 pop {r4, pc}
  13012. 8026a78: 00000000 .word 0x00000000
  13013. 8026a7c: 40ac2000 .word 0x40ac2000
  13014. 08026a80 <TM_RTC_SetDataTimeUnix>:
  13015. return TM_RTC_Status;
  13016. }
  13017. void TM_RTC_SetDataTimeUnix(uint32_t unixTime)
  13018. {
  13019. 8026a80: b51f push {r0, r1, r2, r3, r4, lr}
  13020. 8026a82: 4601 mov r1, r0
  13021. TM_RTC_t data;
  13022. TM_RTC_GetDateTimeFromUnix(&data, unixTime);
  13023. 8026a84: 4668 mov r0, sp
  13024. 8026a86: f7ff ff6d bl 8026964 <TM_RTC_GetDateTimeFromUnix>
  13025. TM_RTC_SetDateTime(&data, TM_RTC_Format_BIN);
  13026. 8026a8a: 4668 mov r0, sp
  13027. 8026a8c: 2100 movs r1, #0
  13028. 8026a8e: f7ff fcfd bl 802648c <TM_RTC_SetDateTime>
  13029. }
  13030. 8026a92: b005 add sp, #20
  13031. 8026a94: bd00 pop {pc}
  13032. 08026a96 <TM_RTC_RequestHandler>:
  13033. /* Read data from backup register */
  13034. return *(uint32_t *)((&RTC->BKP0R) + 4 * location);
  13035. }
  13036. /* Callbacks */
  13037. __weak void TM_RTC_RequestHandler(void) {
  13038. 8026a96: 4770 bx lr
  13039. 08026a98 <TM_RTC_AlarmAHandler>:
  13040. /* If user needs this function, then they should be defined separatelly in your project */
  13041. }
  13042. __weak void TM_RTC_AlarmAHandler(void) {
  13043. 8026a98: 4770 bx lr
  13044. 08026a9a <TM_RTC_AlarmBHandler>:
  13045. /* If user needs this function, then they should be defined separatelly in your project */
  13046. }
  13047. __weak void TM_RTC_AlarmBHandler(void) {
  13048. 8026a9a: 4770 bx lr
  13049. 08026a9c <RTC_WKUP_IRQHandler>:
  13050. /* If user needs this function, then they should be defined separatelly in your project */
  13051. }
  13052. /* Private RTC IRQ handlers */
  13053. void RTC_WKUP_IRQHandler(void) {
  13054. 8026a9c: b508 push {r3, lr}
  13055. /* Check for RTC interrupt */
  13056. if (RTC_GetITStatus(RTC_IT_WUT) != RESET) {
  13057. 8026a9e: f44f 4080 mov.w r0, #16384 ; 0x4000
  13058. 8026aa2: f7ff f9d1 bl 8025e48 <RTC_GetITStatus>
  13059. 8026aa6: b128 cbz r0, 8026ab4 <RTC_WKUP_IRQHandler+0x18>
  13060. /* Clear interrupt flags */
  13061. RTC_ClearITPendingBit(RTC_IT_WUT);
  13062. 8026aa8: f44f 4080 mov.w r0, #16384 ; 0x4000
  13063. 8026aac: f7ff f9e4 bl 8025e78 <RTC_ClearITPendingBit>
  13064. /* Call user function */
  13065. TM_RTC_RequestHandler();
  13066. 8026ab0: f7ff fff1 bl 8026a96 <TM_RTC_RequestHandler>
  13067. }
  13068. /* Clear EXTI line 22 bit */
  13069. EXTI->PR = 0x00400000;
  13070. 8026ab4: 4b02 ldr r3, [pc, #8] ; (8026ac0 <RTC_WKUP_IRQHandler+0x24>)
  13071. 8026ab6: f44f 0280 mov.w r2, #4194304 ; 0x400000
  13072. 8026aba: 615a str r2, [r3, #20]
  13073. 8026abc: bd08 pop {r3, pc}
  13074. 8026abe: bf00 nop
  13075. 8026ac0: 40013c00 .word 0x40013c00
  13076. 08026ac4 <RTC_Alarm_IRQHandler>:
  13077. }
  13078. void RTC_Alarm_IRQHandler(void) {
  13079. 8026ac4: b508 push {r3, lr}
  13080. /* RTC Alarm A check */
  13081. if (RTC_GetITStatus(RTC_IT_ALRA) != RESET) {
  13082. 8026ac6: f44f 5080 mov.w r0, #4096 ; 0x1000
  13083. 8026aca: f7ff f9bd bl 8025e48 <RTC_GetITStatus>
  13084. 8026ace: b128 cbz r0, 8026adc <RTC_Alarm_IRQHandler+0x18>
  13085. /* Clear RTC Alarm A interrupt flag */
  13086. RTC_ClearITPendingBit(RTC_IT_ALRA);
  13087. 8026ad0: f44f 5080 mov.w r0, #4096 ; 0x1000
  13088. 8026ad4: f7ff f9d0 bl 8025e78 <RTC_ClearITPendingBit>
  13089. /* Call user function for Alarm A */
  13090. TM_RTC_AlarmAHandler();
  13091. 8026ad8: f7ff ffde bl 8026a98 <TM_RTC_AlarmAHandler>
  13092. }
  13093. /* RTC Alarm B check */
  13094. if (RTC_GetITStatus(RTC_IT_ALRB) != RESET) {
  13095. 8026adc: f44f 5000 mov.w r0, #8192 ; 0x2000
  13096. 8026ae0: f7ff f9b2 bl 8025e48 <RTC_GetITStatus>
  13097. 8026ae4: b128 cbz r0, 8026af2 <RTC_Alarm_IRQHandler+0x2e>
  13098. /* Clear RTC Alarm A interrupt flag */
  13099. RTC_ClearITPendingBit(RTC_IT_ALRB);
  13100. 8026ae6: f44f 5000 mov.w r0, #8192 ; 0x2000
  13101. 8026aea: f7ff f9c5 bl 8025e78 <RTC_ClearITPendingBit>
  13102. /* Call user function for Alarm B */
  13103. TM_RTC_AlarmBHandler();
  13104. 8026aee: f7ff ffd4 bl 8026a9a <TM_RTC_AlarmBHandler>
  13105. }
  13106. /* Clear EXTI line 17 bit */
  13107. EXTI->PR = 0x00020000;
  13108. 8026af2: 4b02 ldr r3, [pc, #8] ; (8026afc <RTC_Alarm_IRQHandler+0x38>)
  13109. 8026af4: f44f 3200 mov.w r2, #131072 ; 0x20000
  13110. 8026af8: 615a str r2, [r3, #20]
  13111. 8026afa: bd08 pop {r3, pc}
  13112. 8026afc: 40013c00 .word 0x40013c00
  13113. 08026b00 <RTC_SetProfTime>:
  13114. /**
  13115. * @brief Установливает время срабатывания профилактики сульфатации
  13116. */
  13117. void RTC_SetProfTime(char *str)
  13118. {
  13119. 8026b00: b530 push {r4, r5, lr}
  13120. uint32_t unixTime;
  13121. uint8_t i = 0;
  13122. /* Get date */
  13123. tmp.date = 0;
  13124. while (TM_RTC_CHARISNUM(*(str + i))) {
  13125. 8026b02: 2200 movs r2, #0
  13126. /**
  13127. * @brief Установливает время срабатывания профилактики сульфатации
  13128. */
  13129. void RTC_SetProfTime(char *str)
  13130. {
  13131. 8026b04: b085 sub sp, #20
  13132. TM_RTC_t tmp;
  13133. uint32_t unixTime;
  13134. uint8_t i = 0;
  13135. 8026b06: 4613 mov r3, r2
  13136. /* Get date */
  13137. tmp.date = 0;
  13138. while (TM_RTC_CHARISNUM(*(str + i))) {
  13139. tmp.date = tmp.date * 10 + TM_RTC_CHAR2NUM(*(str + i));
  13140. 8026b08: 250a movs r5, #10
  13141. uint32_t unixTime;
  13142. uint8_t i = 0;
  13143. /* Get date */
  13144. tmp.date = 0;
  13145. while (TM_RTC_CHARISNUM(*(str + i))) {
  13146. 8026b0a: e006 b.n 8026b1a <RTC_SetProfTime+0x1a>
  13147. tmp.date = tmp.date * 10 + TM_RTC_CHAR2NUM(*(str + i));
  13148. 8026b0c: fb05 1202 mla r2, r5, r2, r1
  13149. 8026b10: 3a30 subs r2, #48 ; 0x30
  13150. i++;
  13151. 8026b12: 3301 adds r3, #1
  13152. uint8_t i = 0;
  13153. /* Get date */
  13154. tmp.date = 0;
  13155. while (TM_RTC_CHARISNUM(*(str + i))) {
  13156. tmp.date = tmp.date * 10 + TM_RTC_CHAR2NUM(*(str + i));
  13157. 8026b14: f002 02ff and.w r2, r2, #255 ; 0xff
  13158. i++;
  13159. 8026b18: b2db uxtb r3, r3
  13160. uint32_t unixTime;
  13161. uint8_t i = 0;
  13162. /* Get date */
  13163. tmp.date = 0;
  13164. while (TM_RTC_CHARISNUM(*(str + i))) {
  13165. 8026b1a: 5cc1 ldrb r1, [r0, r3]
  13166. 8026b1c: f1a1 0430 sub.w r4, r1, #48 ; 0x30
  13167. 8026b20: 2c09 cmp r4, #9
  13168. 8026b22: d9f3 bls.n 8026b0c <RTC_SetProfTime+0xc>
  13169. tmp.date = tmp.date * 10 + TM_RTC_CHAR2NUM(*(str + i));
  13170. i++;
  13171. }
  13172. i++;
  13173. 8026b24: 3301 adds r3, #1
  13174. 8026b26: f88d 2007 strb.w r2, [sp, #7]
  13175. 8026b2a: b2db uxtb r3, r3
  13176. /* Get month */
  13177. tmp.month = 0;
  13178. while (TM_RTC_CHARISNUM(*(str + i))) {
  13179. 8026b2c: 2200 movs r2, #0
  13180. tmp.month = tmp.month * 10 + TM_RTC_CHAR2NUM(*(str + i));
  13181. 8026b2e: 250a movs r5, #10
  13182. }
  13183. i++;
  13184. /* Get month */
  13185. tmp.month = 0;
  13186. while (TM_RTC_CHARISNUM(*(str + i))) {
  13187. 8026b30: e006 b.n 8026b40 <RTC_SetProfTime+0x40>
  13188. tmp.month = tmp.month * 10 + TM_RTC_CHAR2NUM(*(str + i));
  13189. 8026b32: fb05 1202 mla r2, r5, r2, r1
  13190. 8026b36: 3a30 subs r2, #48 ; 0x30
  13191. i++;
  13192. 8026b38: 3301 adds r3, #1
  13193. i++;
  13194. /* Get month */
  13195. tmp.month = 0;
  13196. while (TM_RTC_CHARISNUM(*(str + i))) {
  13197. tmp.month = tmp.month * 10 + TM_RTC_CHAR2NUM(*(str + i));
  13198. 8026b3a: f002 02ff and.w r2, r2, #255 ; 0xff
  13199. i++;
  13200. 8026b3e: b2db uxtb r3, r3
  13201. }
  13202. i++;
  13203. /* Get month */
  13204. tmp.month = 0;
  13205. while (TM_RTC_CHARISNUM(*(str + i))) {
  13206. 8026b40: 5cc1 ldrb r1, [r0, r3]
  13207. 8026b42: f1a1 0430 sub.w r4, r1, #48 ; 0x30
  13208. 8026b46: 2c09 cmp r4, #9
  13209. 8026b48: d9f3 bls.n 8026b32 <RTC_SetProfTime+0x32>
  13210. tmp.month = tmp.month * 10 + TM_RTC_CHAR2NUM(*(str + i));
  13211. i++;
  13212. }
  13213. //i++;
  13214. i+=3;
  13215. 8026b4a: 3303 adds r3, #3
  13216. 8026b4c: f88d 2008 strb.w r2, [sp, #8]
  13217. 8026b50: b2db uxtb r3, r3
  13218. /* Get year */
  13219. tmp.year = 0;
  13220. while (TM_RTC_CHARISNUM(*(str + i))) {
  13221. 8026b52: 2200 movs r2, #0
  13222. tmp.year = tmp.year * 10 + TM_RTC_CHAR2NUM(*(str + i));
  13223. 8026b54: 250a movs r5, #10
  13224. //i++;
  13225. i+=3;
  13226. /* Get year */
  13227. tmp.year = 0;
  13228. while (TM_RTC_CHARISNUM(*(str + i))) {
  13229. 8026b56: e006 b.n 8026b66 <RTC_SetProfTime+0x66>
  13230. tmp.year = tmp.year * 10 + TM_RTC_CHAR2NUM(*(str + i));
  13231. 8026b58: fb05 1202 mla r2, r5, r2, r1
  13232. 8026b5c: 3a30 subs r2, #48 ; 0x30
  13233. i++;
  13234. 8026b5e: 3301 adds r3, #1
  13235. i+=3;
  13236. /* Get year */
  13237. tmp.year = 0;
  13238. while (TM_RTC_CHARISNUM(*(str + i))) {
  13239. tmp.year = tmp.year * 10 + TM_RTC_CHAR2NUM(*(str + i));
  13240. 8026b60: f002 02ff and.w r2, r2, #255 ; 0xff
  13241. i++;
  13242. 8026b64: b2db uxtb r3, r3
  13243. //i++;
  13244. i+=3;
  13245. /* Get year */
  13246. tmp.year = 0;
  13247. while (TM_RTC_CHARISNUM(*(str + i))) {
  13248. 8026b66: 5cc1 ldrb r1, [r0, r3]
  13249. 8026b68: f1a1 0430 sub.w r4, r1, #48 ; 0x30
  13250. 8026b6c: 2c09 cmp r4, #9
  13251. 8026b6e: d9f3 bls.n 8026b58 <RTC_SetProfTime+0x58>
  13252. tmp.year = tmp.year * 10 + TM_RTC_CHAR2NUM(*(str + i));
  13253. i++;
  13254. }
  13255. i++;
  13256. i++;
  13257. 8026b70: 3302 adds r3, #2
  13258. 8026b72: f88d 2009 strb.w r2, [sp, #9]
  13259. 8026b76: b2db uxtb r3, r3
  13260. /* Get hours */
  13261. tmp.hours = 0;
  13262. while (TM_RTC_CHARISNUM(*(str + i))) {
  13263. 8026b78: 2200 movs r2, #0
  13264. tmp.hours = tmp.hours * 10 + TM_RTC_CHAR2NUM(*(str + i));
  13265. 8026b7a: 250a movs r5, #10
  13266. i++;
  13267. i++;
  13268. /* Get hours */
  13269. tmp.hours = 0;
  13270. while (TM_RTC_CHARISNUM(*(str + i))) {
  13271. 8026b7c: e006 b.n 8026b8c <RTC_SetProfTime+0x8c>
  13272. tmp.hours = tmp.hours * 10 + TM_RTC_CHAR2NUM(*(str + i));
  13273. 8026b7e: fb05 1202 mla r2, r5, r2, r1
  13274. 8026b82: 3a30 subs r2, #48 ; 0x30
  13275. i++;
  13276. 8026b84: 3301 adds r3, #1
  13277. i++;
  13278. /* Get hours */
  13279. tmp.hours = 0;
  13280. while (TM_RTC_CHARISNUM(*(str + i))) {
  13281. tmp.hours = tmp.hours * 10 + TM_RTC_CHAR2NUM(*(str + i));
  13282. 8026b86: f002 02ff and.w r2, r2, #255 ; 0xff
  13283. i++;
  13284. 8026b8a: b2db uxtb r3, r3
  13285. i++;
  13286. i++;
  13287. /* Get hours */
  13288. tmp.hours = 0;
  13289. while (TM_RTC_CHARISNUM(*(str + i))) {
  13290. 8026b8c: 5cc1 ldrb r1, [r0, r3]
  13291. 8026b8e: f1a1 0430 sub.w r4, r1, #48 ; 0x30
  13292. 8026b92: 2c09 cmp r4, #9
  13293. 8026b94: d9f3 bls.n 8026b7e <RTC_SetProfTime+0x7e>
  13294. tmp.hours = tmp.hours * 10 + TM_RTC_CHAR2NUM(*(str + i));
  13295. i++;
  13296. }
  13297. i++;
  13298. 8026b96: 3301 adds r3, #1
  13299. 8026b98: f88d 2005 strb.w r2, [sp, #5]
  13300. 8026b9c: b2db uxtb r3, r3
  13301. /* Get minutes */
  13302. tmp.minutes = 0;
  13303. while (TM_RTC_CHARISNUM(*(str + i))) {
  13304. 8026b9e: 2200 movs r2, #0
  13305. tmp.minutes = tmp.minutes * 10 + TM_RTC_CHAR2NUM(*(str + i));
  13306. 8026ba0: 250a movs r5, #10
  13307. }
  13308. i++;
  13309. /* Get minutes */
  13310. tmp.minutes = 0;
  13311. while (TM_RTC_CHARISNUM(*(str + i))) {
  13312. 8026ba2: e006 b.n 8026bb2 <RTC_SetProfTime+0xb2>
  13313. tmp.minutes = tmp.minutes * 10 + TM_RTC_CHAR2NUM(*(str + i));
  13314. 8026ba4: fb05 1202 mla r2, r5, r2, r1
  13315. 8026ba8: 3a30 subs r2, #48 ; 0x30
  13316. i++;
  13317. 8026baa: 3301 adds r3, #1
  13318. i++;
  13319. /* Get minutes */
  13320. tmp.minutes = 0;
  13321. while (TM_RTC_CHARISNUM(*(str + i))) {
  13322. tmp.minutes = tmp.minutes * 10 + TM_RTC_CHAR2NUM(*(str + i));
  13323. 8026bac: f002 02ff and.w r2, r2, #255 ; 0xff
  13324. i++;
  13325. 8026bb0: b2db uxtb r3, r3
  13326. }
  13327. i++;
  13328. /* Get minutes */
  13329. tmp.minutes = 0;
  13330. while (TM_RTC_CHARISNUM(*(str + i))) {
  13331. 8026bb2: 5cc1 ldrb r1, [r0, r3]
  13332. 8026bb4: f1a1 0430 sub.w r4, r1, #48 ; 0x30
  13333. 8026bb8: 2c09 cmp r4, #9
  13334. 8026bba: d9f3 bls.n 8026ba4 <RTC_SetProfTime+0xa4>
  13335. i++;
  13336. }
  13337. i++;
  13338. /* Get seconds */
  13339. tmp.seconds = 0;
  13340. 8026bbc: 2300 movs r3, #0
  13341. 8026bbe: f88d 3000 strb.w r3, [sp]
  13342. /* Устанавливаем +1 для профилактики */
  13343. tmp.year += 1;
  13344. 8026bc2: f89d 3009 ldrb.w r3, [sp, #9]
  13345. 8026bc6: f88d 2004 strb.w r2, [sp, #4]
  13346. 8026bca: 3301 adds r3, #1
  13347. unixTime = TM_RTC_GetUnixTimeStamp(&tmp);
  13348. 8026bcc: 4668 mov r0, sp
  13349. /* Get seconds */
  13350. tmp.seconds = 0;
  13351. /* Устанавливаем +1 для профилактики */
  13352. tmp.year += 1;
  13353. 8026bce: f88d 3009 strb.w r3, [sp, #9]
  13354. unixTime = TM_RTC_GetUnixTimeStamp(&tmp);
  13355. 8026bd2: f7ff fdd1 bl 8026778 <TM_RTC_GetUnixTimeStamp>
  13356. if (location > 18) {
  13357. return;
  13358. }
  13359. /* Write data to backup register */
  13360. *(uint32_t *)((&RTC->BKP0R) + 4 * location) = value;
  13361. 8026bd6: 4b02 ldr r3, [pc, #8] ; (8026be0 <RTC_SetProfTime+0xe0>)
  13362. 8026bd8: 6018 str r0, [r3, #0]
  13363. /* Устанавливаем +1 для профилактики */
  13364. tmp.year += 1;
  13365. unixTime = TM_RTC_GetUnixTimeStamp(&tmp);
  13366. TM_RTC_WriteBackupRegister(RTC_BKP_DR0, unixTime);
  13367. 8026bda: b005 add sp, #20
  13368. 8026bdc: bd30 pop {r4, r5, pc}
  13369. 8026bde: bf00 nop
  13370. 8026be0: 40002850 .word 0x40002850
  13371. 08026be4 <spi_tx_rx>:
  13372. //static TN_MUTEX spi_mutex;
  13373. static uint8_t spi_tx_rx(uint8_t byte) {
  13374. while (!(SPI2->SR & SPI_SR_TXE)) {}
  13375. 8026be4: 4907 ldr r1, [pc, #28] ; (8026c04 <spi_tx_rx+0x20>)
  13376. 8026be6: 890a ldrh r2, [r1, #8]
  13377. 8026be8: 4b06 ldr r3, [pc, #24] ; (8026c04 <spi_tx_rx+0x20>)
  13378. 8026bea: f002 0202 and.w r2, r2, #2
  13379. 8026bee: b292 uxth r2, r2
  13380. 8026bf0: 2a00 cmp r2, #0
  13381. 8026bf2: d0f8 beq.n 8026be6 <spi_tx_rx+0x2>
  13382. SPI2->DR = byte;
  13383. 8026bf4: 8198 strh r0, [r3, #12]
  13384. while (!(SPI2->SR & SPI_SR_RXNE)) {}
  13385. 8026bf6: 891a ldrh r2, [r3, #8]
  13386. 8026bf8: 07d2 lsls r2, r2, #31
  13387. 8026bfa: d5fc bpl.n 8026bf6 <spi_tx_rx+0x12>
  13388. return SPI2->DR;
  13389. 8026bfc: 4b01 ldr r3, [pc, #4] ; (8026c04 <spi_tx_rx+0x20>)
  13390. 8026bfe: 8998 ldrh r0, [r3, #12]
  13391. }
  13392. 8026c00: b2c0 uxtb r0, r0
  13393. 8026c02: 4770 bx lr
  13394. 8026c04: 40003800 .word 0x40003800
  13395. 08026c08 <send_addr>:
  13396. status = spi_tx_rx(0);
  13397. } while (status & SR_WIP);
  13398. SPI_FLASH_CS_H();
  13399. }
  13400. static inline void send_addr(int addr) {
  13401. 8026c08: b510 push {r4, lr}
  13402. 8026c0a: 4604 mov r4, r0
  13403. spi_tx_rx((addr >> 16) & 0xFF);
  13404. 8026c0c: f3c0 4007 ubfx r0, r0, #16, #8
  13405. 8026c10: f7ff ffe8 bl 8026be4 <spi_tx_rx>
  13406. spi_tx_rx((addr >> 8) & 0xFF);
  13407. 8026c14: f3c4 2007 ubfx r0, r4, #8, #8
  13408. 8026c18: f7ff ffe4 bl 8026be4 <spi_tx_rx>
  13409. spi_tx_rx(addr & 0xFF);
  13410. 8026c1c: b2e0 uxtb r0, r4
  13411. }
  13412. 8026c1e: e8bd 4010 ldmia.w sp!, {r4, lr}
  13413. }
  13414. static inline void send_addr(int addr) {
  13415. spi_tx_rx((addr >> 16) & 0xFF);
  13416. spi_tx_rx((addr >> 8) & 0xFF);
  13417. spi_tx_rx(addr & 0xFF);
  13418. 8026c22: f7ff bfdf b.w 8026be4 <spi_tx_rx>
  13419. 08026c26 <spi_flash_read_sfdp>:
  13420. }
  13421. static int spi_flash_read_sfdp(int addr, void *buf, size_t len) {
  13422. 8026c26: b570 push {r4, r5, r6, lr}
  13423. 8026c28: 4605 mov r5, r0
  13424. 8026c2a: 460c mov r4, r1
  13425. uint8_t* foo = (uint8_t *)buf;
  13426. SPI_FLASH_CS_L();
  13427. 8026c2c: 2007 movs r0, #7
  13428. 8026c2e: 2100 movs r1, #0
  13429. spi_tx_rx((addr >> 16) & 0xFF);
  13430. spi_tx_rx((addr >> 8) & 0xFF);
  13431. spi_tx_rx(addr & 0xFF);
  13432. }
  13433. static int spi_flash_read_sfdp(int addr, void *buf, size_t len) {
  13434. 8026c30: 4616 mov r6, r2
  13435. uint8_t* foo = (uint8_t *)buf;
  13436. SPI_FLASH_CS_L();
  13437. 8026c32: f7ff fb5b bl 80262ec <gpio_set>
  13438. spi_tx_rx(CMD_RDSFDP);
  13439. 8026c36: 205a movs r0, #90 ; 0x5a
  13440. 8026c38: f7ff ffd4 bl 8026be4 <spi_tx_rx>
  13441. send_addr(addr);
  13442. 8026c3c: 4628 mov r0, r5
  13443. 8026c3e: f7ff ffe3 bl 8026c08 <send_addr>
  13444. spi_tx_rx(0);
  13445. 8026c42: 2000 movs r0, #0
  13446. 8026c44: f7ff ffce bl 8026be4 <spi_tx_rx>
  13447. spi_tx_rx((addr >> 16) & 0xFF);
  13448. spi_tx_rx((addr >> 8) & 0xFF);
  13449. spi_tx_rx(addr & 0xFF);
  13450. }
  13451. static int spi_flash_read_sfdp(int addr, void *buf, size_t len) {
  13452. 8026c48: 19a6 adds r6, r4, r6
  13453. uint8_t* foo = (uint8_t *)buf;
  13454. SPI_FLASH_CS_L();
  13455. spi_tx_rx(CMD_RDSFDP);
  13456. send_addr(addr);
  13457. spi_tx_rx(0);
  13458. while (len--)
  13459. 8026c4a: e004 b.n 8026c56 <spi_flash_read_sfdp+0x30>
  13460. //*((uint8_t *)buf++) = spi_tx_rx(0);
  13461. *(foo++) = spi_tx_rx(0);
  13462. 8026c4c: 2000 movs r0, #0
  13463. 8026c4e: f7ff ffc9 bl 8026be4 <spi_tx_rx>
  13464. 8026c52: f804 0b01 strb.w r0, [r4], #1
  13465. uint8_t* foo = (uint8_t *)buf;
  13466. SPI_FLASH_CS_L();
  13467. spi_tx_rx(CMD_RDSFDP);
  13468. send_addr(addr);
  13469. spi_tx_rx(0);
  13470. while (len--)
  13471. 8026c56: 42b4 cmp r4, r6
  13472. 8026c58: d1f8 bne.n 8026c4c <spi_flash_read_sfdp+0x26>
  13473. //*((uint8_t *)buf++) = spi_tx_rx(0);
  13474. *(foo++) = spi_tx_rx(0);
  13475. SPI_FLASH_CS_H();
  13476. 8026c5a: 2007 movs r0, #7
  13477. 8026c5c: 2101 movs r1, #1
  13478. 8026c5e: f7ff fb45 bl 80262ec <gpio_set>
  13479. return 0;
  13480. }
  13481. 8026c62: 2000 movs r0, #0
  13482. 8026c64: bd70 pop {r4, r5, r6, pc}
  13483. 08026c66 <wait_write_enable>:
  13484. spi_flash_desc_t spi_flash_desc;
  13485. static inline void wait_write_enable(void) {
  13486. uint8_t status;
  13487. // spi_cs_down();
  13488. SPI_FLASH_CS_L();
  13489. 8026c66: 2007 movs r0, #7
  13490. #define SR_WEL (1 << 1)
  13491. #define SR_SRWD (1 << 7)
  13492. spi_flash_desc_t spi_flash_desc;
  13493. static inline void wait_write_enable(void) {
  13494. 8026c68: b508 push {r3, lr}
  13495. uint8_t status;
  13496. // spi_cs_down();
  13497. SPI_FLASH_CS_L();
  13498. 8026c6a: 2100 movs r1, #0
  13499. 8026c6c: f7ff fb3e bl 80262ec <gpio_set>
  13500. spi_tx_rx(CMD_RDSR);
  13501. 8026c70: 2005 movs r0, #5
  13502. 8026c72: f7ff ffb7 bl 8026be4 <spi_tx_rx>
  13503. do {
  13504. status = spi_tx_rx(0);
  13505. 8026c76: 2000 movs r0, #0
  13506. 8026c78: f7ff ffb4 bl 8026be4 <spi_tx_rx>
  13507. } while (!(status & SR_WEL));
  13508. 8026c7c: f000 0002 and.w r0, r0, #2
  13509. 8026c80: b2c0 uxtb r0, r0
  13510. 8026c82: 2800 cmp r0, #0
  13511. 8026c84: d0f7 beq.n 8026c76 <wait_write_enable+0x10>
  13512. // spi_cs_up();
  13513. SPI_FLASH_CS_H();
  13514. 8026c86: 2007 movs r0, #7
  13515. 8026c88: 2101 movs r1, #1
  13516. }
  13517. 8026c8a: e8bd 4008 ldmia.w sp!, {r3, lr}
  13518. spi_tx_rx(CMD_RDSR);
  13519. do {
  13520. status = spi_tx_rx(0);
  13521. } while (!(status & SR_WEL));
  13522. // spi_cs_up();
  13523. SPI_FLASH_CS_H();
  13524. 8026c8e: f7ff bb2d b.w 80262ec <gpio_set>
  13525. 08026c92 <wait_write_end>:
  13526. }
  13527. static inline void wait_write_end(void) {
  13528. uint8_t status;
  13529. SPI_FLASH_CS_L();
  13530. 8026c92: 2007 movs r0, #7
  13531. } while (!(status & SR_WEL));
  13532. // spi_cs_up();
  13533. SPI_FLASH_CS_H();
  13534. }
  13535. static inline void wait_write_end(void) {
  13536. 8026c94: b508 push {r3, lr}
  13537. uint8_t status;
  13538. SPI_FLASH_CS_L();
  13539. 8026c96: 2100 movs r1, #0
  13540. 8026c98: f7ff fb28 bl 80262ec <gpio_set>
  13541. spi_tx_rx(CMD_RDSR);
  13542. 8026c9c: 2005 movs r0, #5
  13543. 8026c9e: f7ff ffa1 bl 8026be4 <spi_tx_rx>
  13544. do {
  13545. status = spi_tx_rx(0);
  13546. 8026ca2: 2000 movs r0, #0
  13547. 8026ca4: f7ff ff9e bl 8026be4 <spi_tx_rx>
  13548. } while (status & SR_WIP);
  13549. 8026ca8: 07c1 lsls r1, r0, #31
  13550. 8026caa: d4fa bmi.n 8026ca2 <wait_write_end+0x10>
  13551. SPI_FLASH_CS_H();
  13552. 8026cac: 2007 movs r0, #7
  13553. 8026cae: 2101 movs r1, #1
  13554. }
  13555. 8026cb0: e8bd 4008 ldmia.w sp!, {r3, lr}
  13556. SPI_FLASH_CS_L();
  13557. spi_tx_rx(CMD_RDSR);
  13558. do {
  13559. status = spi_tx_rx(0);
  13560. } while (status & SR_WIP);
  13561. SPI_FLASH_CS_H();
  13562. 8026cb4: f7ff bb1a b.w 80262ec <gpio_set>
  13563. 08026cb8 <spi_flash_read>:
  13564. *(foo++) = spi_tx_rx(0);
  13565. SPI_FLASH_CS_H();
  13566. return 0;
  13567. }
  13568. ssize_t spi_flash_read(int addr, void *buf, size_t len, uint32_t timeout) {
  13569. 8026cb8: b570 push {r4, r5, r6, lr}
  13570. 8026cba: 4605 mov r5, r0
  13571. 8026cbc: 460c mov r4, r1
  13572. ssize_t ret = 0;
  13573. // ret = tn_mutex_lock(&spi_mutex, timeout);
  13574. // if (ret != TERR_NO_ERR)
  13575. // return ret;
  13576. SPI_FLASH_CS_L();
  13577. 8026cbe: 2007 movs r0, #7
  13578. 8026cc0: 2100 movs r1, #0
  13579. *(foo++) = spi_tx_rx(0);
  13580. SPI_FLASH_CS_H();
  13581. return 0;
  13582. }
  13583. ssize_t spi_flash_read(int addr, void *buf, size_t len, uint32_t timeout) {
  13584. 8026cc2: 4616 mov r6, r2
  13585. ssize_t ret = 0;
  13586. // ret = tn_mutex_lock(&spi_mutex, timeout);
  13587. // if (ret != TERR_NO_ERR)
  13588. // return ret;
  13589. SPI_FLASH_CS_L();
  13590. 8026cc4: f7ff fb12 bl 80262ec <gpio_set>
  13591. spi_tx_rx(CMD_READ);
  13592. 8026cc8: 2003 movs r0, #3
  13593. 8026cca: f7ff ff8b bl 8026be4 <spi_tx_rx>
  13594. send_addr(addr);
  13595. 8026cce: 4628 mov r0, r5
  13596. 8026cd0: f7ff ff9a bl 8026c08 <send_addr>
  13597. *(foo++) = spi_tx_rx(0);
  13598. SPI_FLASH_CS_H();
  13599. return 0;
  13600. }
  13601. ssize_t spi_flash_read(int addr, void *buf, size_t len, uint32_t timeout) {
  13602. 8026cd4: 19a6 adds r6, r4, r6
  13603. // return ret;
  13604. SPI_FLASH_CS_L();
  13605. spi_tx_rx(CMD_READ);
  13606. send_addr(addr);
  13607. while (len--)
  13608. 8026cd6: e004 b.n 8026ce2 <spi_flash_read+0x2a>
  13609. //*((uint8_t *)buf++) = spi_tx_rx(0);
  13610. *(foo++) = spi_tx_rx(0);
  13611. 8026cd8: 2000 movs r0, #0
  13612. 8026cda: f7ff ff83 bl 8026be4 <spi_tx_rx>
  13613. 8026cde: f804 0b01 strb.w r0, [r4], #1
  13614. // return ret;
  13615. SPI_FLASH_CS_L();
  13616. spi_tx_rx(CMD_READ);
  13617. send_addr(addr);
  13618. while (len--)
  13619. 8026ce2: 42b4 cmp r4, r6
  13620. 8026ce4: d1f8 bne.n 8026cd8 <spi_flash_read+0x20>
  13621. //*((uint8_t *)buf++) = spi_tx_rx(0);
  13622. *(foo++) = spi_tx_rx(0);
  13623. SPI_FLASH_CS_H();
  13624. 8026ce6: 2007 movs r0, #7
  13625. 8026ce8: 2101 movs r1, #1
  13626. 8026cea: f7ff faff bl 80262ec <gpio_set>
  13627. // tn_mutex_unlock(&spi_mutex);
  13628. return len;
  13629. }
  13630. 8026cee: f04f 30ff mov.w r0, #4294967295
  13631. 8026cf2: bd70 pop {r4, r5, r6, pc}
  13632. 08026cf4 <spi_flash_pp>:
  13633. // ret = tn_mutex_lock(&spi_mutex, timeout);
  13634. // if (ret != TERR_NO_ERR)
  13635. // return ret;
  13636. // don't allow page wrapping
  13637. ssize_t ret = 0;
  13638. if ((addr & 0xFF) + len > 0xFF)
  13639. 8026cf4: b2c3 uxtb r3, r0
  13640. return len;
  13641. }
  13642. #define TIMEOUT 10000
  13643. uint16_t spi_flash_pp(int addr, const void *buf, size_t len, uint32_t timeout) {
  13644. 8026cf6: b570 push {r4, r5, r6, lr}
  13645. 8026cf8: 4614 mov r4, r2
  13646. // ret = tn_mutex_lock(&spi_mutex, timeout);
  13647. // if (ret != TERR_NO_ERR)
  13648. // return ret;
  13649. // don't allow page wrapping
  13650. ssize_t ret = 0;
  13651. if ((addr & 0xFF) + len > 0xFF)
  13652. 8026cfa: 18d2 adds r2, r2, r3
  13653. 8026cfc: 2aff cmp r2, #255 ; 0xff
  13654. len = 0x100 - (addr & 0xFF);
  13655. 8026cfe: bf88 it hi
  13656. 8026d00: f5c3 7480 rsbhi r4, r3, #256 ; 0x100
  13657. return len;
  13658. }
  13659. #define TIMEOUT 10000
  13660. uint16_t spi_flash_pp(int addr, const void *buf, size_t len, uint32_t timeout) {
  13661. 8026d04: 4606 mov r6, r0
  13662. 8026d06: 460d mov r5, r1
  13663. ssize_t ret = 0;
  13664. if ((addr & 0xFF) + len > 0xFF)
  13665. len = 0x100 - (addr & 0xFF);
  13666. ret = len;
  13667. SPI_FLASH_CS_L();
  13668. 8026d08: 2007 movs r0, #7
  13669. 8026d0a: 2100 movs r1, #0
  13670. 8026d0c: f7ff faee bl 80262ec <gpio_set>
  13671. spi_tx_rx(CMD_WREN);
  13672. 8026d10: 2006 movs r0, #6
  13673. 8026d12: f7ff ff67 bl 8026be4 <spi_tx_rx>
  13674. SPI_FLASH_CS_H();
  13675. 8026d16: 2007 movs r0, #7
  13676. 8026d18: 2101 movs r1, #1
  13677. 8026d1a: f7ff fae7 bl 80262ec <gpio_set>
  13678. wait_write_enable();
  13679. 8026d1e: f7ff ffa2 bl 8026c66 <wait_write_enable>
  13680. SPI_FLASH_CS_L();
  13681. 8026d22: 2100 movs r1, #0
  13682. 8026d24: 2007 movs r0, #7
  13683. 8026d26: f7ff fae1 bl 80262ec <gpio_set>
  13684. spi_tx_rx(CMD_PP);
  13685. 8026d2a: 2002 movs r0, #2
  13686. 8026d2c: f7ff ff5a bl 8026be4 <spi_tx_rx>
  13687. send_addr(addr);
  13688. 8026d30: 4630 mov r0, r6
  13689. 8026d32: f7ff ff69 bl 8026c08 <send_addr>
  13690. return len;
  13691. }
  13692. #define TIMEOUT 10000
  13693. uint16_t spi_flash_pp(int addr, const void *buf, size_t len, uint32_t timeout) {
  13694. 8026d36: 192e adds r6, r5, r4
  13695. wait_write_enable();
  13696. SPI_FLASH_CS_L();
  13697. spi_tx_rx(CMD_PP);
  13698. send_addr(addr);
  13699. while (len--)
  13700. 8026d38: e003 b.n 8026d42 <spi_flash_pp+0x4e>
  13701. //spi_tx_rx(*((uint8_t *)buf++));
  13702. spi_tx_rx(*(foo++));
  13703. 8026d3a: f815 0b01 ldrb.w r0, [r5], #1
  13704. 8026d3e: f7ff ff51 bl 8026be4 <spi_tx_rx>
  13705. wait_write_enable();
  13706. SPI_FLASH_CS_L();
  13707. spi_tx_rx(CMD_PP);
  13708. send_addr(addr);
  13709. while (len--)
  13710. 8026d42: 42b5 cmp r5, r6
  13711. 8026d44: d1f9 bne.n 8026d3a <spi_flash_pp+0x46>
  13712. //spi_tx_rx(*((uint8_t *)buf++));
  13713. spi_tx_rx(*(foo++));
  13714. SPI_FLASH_CS_H();
  13715. 8026d46: 2007 movs r0, #7
  13716. 8026d48: 2101 movs r1, #1
  13717. 8026d4a: f7ff facf bl 80262ec <gpio_set>
  13718. wait_write_end();
  13719. 8026d4e: f7ff ffa0 bl 8026c92 <wait_write_end>
  13720. // tn_mutex_unlock(&spi_mutex);
  13721. return ret;
  13722. }
  13723. 8026d52: b2a0 uxth r0, r4
  13724. 8026d54: bd70 pop {r4, r5, r6, pc}
  13725. 08026d56 <spi_flash_write>:
  13726. ssize_t spi_flash_write(int addr, const void *buf, size_t len, uint32_t timeout) {
  13727. 8026d56: b5f8 push {r3, r4, r5, r6, r7, lr}
  13728. 8026d58: 4607 mov r7, r0
  13729. 8026d5a: 460e mov r6, r1
  13730. 8026d5c: 4615 mov r5, r2
  13731. uint8_t* foo = (uint8_t *)buf;
  13732. int ret = 0, offset = 0;
  13733. 8026d5e: 2400 movs r4, #0
  13734. do {
  13735. //ret = spi_flash_pp(addr + offset, buf + offset, len - offset, 0);
  13736. ret = spi_flash_pp(addr + offset, foo + offset, len - offset, 0);
  13737. 8026d60: 1938 adds r0, r7, r4
  13738. 8026d62: 1931 adds r1, r6, r4
  13739. 8026d64: 1b2a subs r2, r5, r4
  13740. 8026d66: 2300 movs r3, #0
  13741. 8026d68: f7ff ffc4 bl 8026cf4 <spi_flash_pp>
  13742. offset += ret;
  13743. 8026d6c: 1824 adds r4, r4, r0
  13744. } while (len - offset);
  13745. 8026d6e: 42a5 cmp r5, r4
  13746. 8026d70: d1f6 bne.n 8026d60 <spi_flash_write+0xa>
  13747. return 0;
  13748. }
  13749. 8026d72: 2000 movs r0, #0
  13750. 8026d74: bdf8 pop {r3, r4, r5, r6, r7, pc}
  13751. 08026d76 <spi_flash_erase_sector>:
  13752. wait_write_end();
  13753. return 0;
  13754. }
  13755. int spi_flash_erase_sector(int addr, uint32_t timeout) {
  13756. 8026d76: b510 push {r4, lr}
  13757. int ret = 0;
  13758. // ret = tn_mutex_lock(&spi_mutex, timeout);
  13759. // if (ret != TERR_NO_ERR)
  13760. // return ret;
  13761. SPI_FLASH_CS_L();
  13762. 8026d78: 2100 movs r1, #0
  13763. wait_write_end();
  13764. return 0;
  13765. }
  13766. int spi_flash_erase_sector(int addr, uint32_t timeout) {
  13767. 8026d7a: 4604 mov r4, r0
  13768. int ret = 0;
  13769. // ret = tn_mutex_lock(&spi_mutex, timeout);
  13770. // if (ret != TERR_NO_ERR)
  13771. // return ret;
  13772. SPI_FLASH_CS_L();
  13773. 8026d7c: 2007 movs r0, #7
  13774. 8026d7e: f7ff fab5 bl 80262ec <gpio_set>
  13775. spi_tx_rx(CMD_WREN);
  13776. 8026d82: 2006 movs r0, #6
  13777. 8026d84: f7ff ff2e bl 8026be4 <spi_tx_rx>
  13778. SPI_FLASH_CS_H();
  13779. 8026d88: 2007 movs r0, #7
  13780. 8026d8a: 2101 movs r1, #1
  13781. 8026d8c: f7ff faae bl 80262ec <gpio_set>
  13782. wait_write_enable();
  13783. 8026d90: f7ff ff69 bl 8026c66 <wait_write_enable>
  13784. SPI_FLASH_CS_L();
  13785. 8026d94: 2100 movs r1, #0
  13786. 8026d96: 2007 movs r0, #7
  13787. 8026d98: f7ff faa8 bl 80262ec <gpio_set>
  13788. spi_tx_rx(CMD_SE);
  13789. 8026d9c: 2020 movs r0, #32
  13790. 8026d9e: f7ff ff21 bl 8026be4 <spi_tx_rx>
  13791. send_addr(addr);
  13792. 8026da2: 4620 mov r0, r4
  13793. 8026da4: f7ff ff30 bl 8026c08 <send_addr>
  13794. SPI_FLASH_CS_H();
  13795. 8026da8: 2007 movs r0, #7
  13796. 8026daa: 2101 movs r1, #1
  13797. 8026dac: f7ff fa9e bl 80262ec <gpio_set>
  13798. wait_write_end();
  13799. 8026db0: f7ff ff6f bl 8026c92 <wait_write_end>
  13800. // tn_mutex_unlock(&spi_mutex);
  13801. return 0;
  13802. }
  13803. 8026db4: 2000 movs r0, #0
  13804. 8026db6: bd10 pop {r4, pc}
  13805. 08026db8 <spi_flash_init>:
  13806. bool spi_flash_init(void) {
  13807. 8026db8: b530 push {r4, r5, lr}
  13808. uint32_t i, ptable, bitsize = 0;
  13809. uint8_t tmp[4];
  13810. spi_flash_desc.present = false;
  13811. 8026dba: 4b48 ldr r3, [pc, #288] ; (8026edc <spi_flash_init+0x124>)
  13812. // tn_mutex_unlock(&spi_mutex);
  13813. return 0;
  13814. }
  13815. bool spi_flash_init(void) {
  13816. uint32_t i, ptable, bitsize = 0;
  13817. 8026dbc: 2400 movs r4, #0
  13818. // tn_mutex_unlock(&spi_mutex);
  13819. return 0;
  13820. }
  13821. bool spi_flash_init(void) {
  13822. 8026dbe: b085 sub sp, #20
  13823. uint32_t i, ptable, bitsize = 0;
  13824. uint8_t tmp[4];
  13825. spi_flash_desc.present = false;
  13826. 8026dc0: 701c strb r4, [r3, #0]
  13827. static void spi_init_(void) {
  13828. // tn_mutex_create(&spi_mutex, TN_MUTEX_ATTR_INHERIT, 0);
  13829. //tn_sem_create(&xact.ready, 0, 1);
  13830. RCC->APB1ENR |= RCC_APB1ENR_SPI2EN;
  13831. 8026dc2: 4b47 ldr r3, [pc, #284] ; (8026ee0 <spi_flash_init+0x128>)
  13832. // tn_mutex_unlock(&spi_mutex);
  13833. return 0;
  13834. }
  13835. bool spi_flash_init(void) {
  13836. uint32_t i, ptable, bitsize = 0;
  13837. 8026dc4: 9402 str r4, [sp, #8]
  13838. static void spi_init_(void) {
  13839. // tn_mutex_create(&spi_mutex, TN_MUTEX_ATTR_INHERIT, 0);
  13840. //tn_sem_create(&xact.ready, 0, 1);
  13841. RCC->APB1ENR |= RCC_APB1ENR_SPI2EN;
  13842. 8026dc6: 6c1a ldr r2, [r3, #64] ; 0x40
  13843. 8026dc8: f442 4280 orr.w r2, r2, #16384 ; 0x4000
  13844. 8026dcc: 641a str r2, [r3, #64] ; 0x40
  13845. RCC->APB1RSTR |= RCC_APB1RSTR_SPI2RST;
  13846. 8026dce: 6a1a ldr r2, [r3, #32]
  13847. 8026dd0: f442 4200 orr.w r2, r2, #32768 ; 0x8000
  13848. 8026dd4: 621a str r2, [r3, #32]
  13849. RCC->APB1RSTR &= ~RCC_APB1RSTR_SPI2RST;
  13850. 8026dd6: 6a1a ldr r2, [r3, #32]
  13851. 8026dd8: f422 4200 bic.w r2, r2, #32768 ; 0x8000
  13852. 8026ddc: 621a str r2, [r3, #32]
  13853. SPI2->CR1 &= ~SPI_CR1_SPE;
  13854. 8026dde: f5a3 3300 sub.w r3, r3, #131072 ; 0x20000
  13855. spi_flash_desc.present = false;
  13856. spi_init_();
  13857. // check SFDP magic
  13858. spi_flash_read_sfdp(0, tmp, 4);
  13859. 8026de2: ad03 add r5, sp, #12
  13860. RCC->APB1ENR |= RCC_APB1ENR_SPI2EN;
  13861. RCC->APB1RSTR |= RCC_APB1RSTR_SPI2RST;
  13862. RCC->APB1RSTR &= ~RCC_APB1RSTR_SPI2RST;
  13863. SPI2->CR1 &= ~SPI_CR1_SPE;
  13864. 8026de4: 881a ldrh r2, [r3, #0]
  13865. 8026de6: f022 0240 bic.w r2, r2, #64 ; 0x40
  13866. 8026dea: 0412 lsls r2, r2, #16
  13867. 8026dec: 0c12 lsrs r2, r2, #16
  13868. 8026dee: 801a strh r2, [r3, #0]
  13869. //SPI2->CR1 = SPI_CR1_MSTR | SPI_CR1_BR_1 | SPI_CR1_SSM | SPI_CR1_SSI;
  13870. SPI2->CR1 = SPI_CR1_MSTR | SPI_CR1_SSM | SPI_CR1_SSI;
  13871. 8026df0: f44f 7241 mov.w r2, #772 ; 0x304
  13872. 8026df4: 801a strh r2, [r3, #0]
  13873. SPI2->CR2 = 0;//SPI_CR2_SSOE;
  13874. 8026df6: 809c strh r4, [r3, #4]
  13875. SPI2->CR1 |= SPI_CR1_SPE;
  13876. 8026df8: 881a ldrh r2, [r3, #0]
  13877. 8026dfa: b292 uxth r2, r2
  13878. 8026dfc: f042 0240 orr.w r2, r2, #64 ; 0x40
  13879. 8026e00: 801a strh r2, [r3, #0]
  13880. spi_flash_desc.present = false;
  13881. spi_init_();
  13882. // check SFDP magic
  13883. spi_flash_read_sfdp(0, tmp, 4);
  13884. 8026e02: 4620 mov r0, r4
  13885. 8026e04: 2204 movs r2, #4
  13886. 8026e06: 4629 mov r1, r5
  13887. 8026e08: f7ff ff0d bl 8026c26 <spi_flash_read_sfdp>
  13888. if (!(tmp[0] == 0x53 && tmp[1] == 0x46 &&
  13889. 8026e0c: f89d 300c ldrb.w r3, [sp, #12]
  13890. 8026e10: 2b53 cmp r3, #83 ; 0x53
  13891. 8026e12: d001 beq.n 8026e18 <spi_flash_init+0x60>
  13892. tmp[2] == 0x44 && tmp[3] == 0x50))
  13893. return 0;
  13894. 8026e14: 2000 movs r0, #0
  13895. 8026e16: e05e b.n 8026ed6 <spi_flash_init+0x11e>
  13896. spi_init_();
  13897. // check SFDP magic
  13898. spi_flash_read_sfdp(0, tmp, 4);
  13899. if (!(tmp[0] == 0x53 && tmp[1] == 0x46 &&
  13900. 8026e18: f89d 300d ldrb.w r3, [sp, #13]
  13901. 8026e1c: 2b46 cmp r3, #70 ; 0x46
  13902. 8026e1e: d1f9 bne.n 8026e14 <spi_flash_init+0x5c>
  13903. 8026e20: f89d 300e ldrb.w r3, [sp, #14]
  13904. 8026e24: 2b44 cmp r3, #68 ; 0x44
  13905. 8026e26: d1f5 bne.n 8026e14 <spi_flash_init+0x5c>
  13906. 8026e28: f89d 300f ldrb.w r3, [sp, #15]
  13907. 8026e2c: 2b50 cmp r3, #80 ; 0x50
  13908. 8026e2e: d1f1 bne.n 8026e14 <spi_flash_init+0x5c>
  13909. tmp[2] == 0x44 && tmp[3] == 0x50))
  13910. return 0;
  13911. // get parameter headers count
  13912. spi_flash_read_sfdp(0x06, tmp, 1);
  13913. 8026e30: 2006 movs r0, #6
  13914. 8026e32: 4629 mov r1, r5
  13915. 8026e34: 2201 movs r2, #1
  13916. 8026e36: f7ff fef6 bl 8026c26 <spi_flash_read_sfdp>
  13917. // find first jedec pheader (with ID == 0)
  13918. for (ptable = 0x08, i = 0; i <= tmp[0]; i++, ptable += 8) {
  13919. 8026e3a: 2308 movs r3, #8
  13920. 8026e3c: e01a b.n 8026e74 <spi_flash_init+0xbc>
  13921. spi_flash_read_sfdp(ptable, tmp, 1);
  13922. 8026e3e: 9801 ldr r0, [sp, #4]
  13923. 8026e40: 4629 mov r1, r5
  13924. 8026e42: 2201 movs r2, #1
  13925. 8026e44: f7ff feef bl 8026c26 <spi_flash_read_sfdp>
  13926. if (tmp[0] == 0)
  13927. 8026e48: f89d 300c ldrb.w r3, [sp, #12]
  13928. 8026e4c: b97b cbnz r3, 8026e6e <spi_flash_init+0xb6>
  13929. break;
  13930. }
  13931. // read ptable pointer from pheader
  13932. spi_flash_read_sfdp(ptable + 4, &ptable, 3);
  13933. 8026e4e: a904 add r1, sp, #16
  13934. 8026e50: 2203 movs r2, #3
  13935. 8026e52: f851 0d0c ldr.w r0, [r1, #-12]!
  13936. 8026e56: 3004 adds r0, #4
  13937. 8026e58: f7ff fee5 bl 8026c26 <spi_flash_read_sfdp>
  13938. // get flash density (size in bits)
  13939. if (spi_flash_read_sfdp(ptable + 4, &bitsize, 4) < 0 || !bitsize)
  13940. 8026e5c: 9801 ldr r0, [sp, #4]
  13941. 8026e5e: 2204 movs r2, #4
  13942. 8026e60: 3004 adds r0, #4
  13943. 8026e62: a902 add r1, sp, #8
  13944. 8026e64: f7ff fedf bl 8026c26 <spi_flash_read_sfdp>
  13945. 8026e68: 2800 cmp r0, #0
  13946. 8026e6a: da09 bge.n 8026e80 <spi_flash_init+0xc8>
  13947. 8026e6c: e7d2 b.n 8026e14 <spi_flash_init+0x5c>
  13948. // get parameter headers count
  13949. spi_flash_read_sfdp(0x06, tmp, 1);
  13950. // find first jedec pheader (with ID == 0)
  13951. for (ptable = 0x08, i = 0; i <= tmp[0]; i++, ptable += 8) {
  13952. 8026e6e: 9b01 ldr r3, [sp, #4]
  13953. 8026e70: 3401 adds r4, #1
  13954. 8026e72: 3308 adds r3, #8
  13955. 8026e74: 9301 str r3, [sp, #4]
  13956. 8026e76: f89d 300c ldrb.w r3, [sp, #12]
  13957. 8026e7a: 429c cmp r4, r3
  13958. 8026e7c: d9df bls.n 8026e3e <spi_flash_init+0x86>
  13959. 8026e7e: e7e6 b.n 8026e4e <spi_flash_init+0x96>
  13960. // read ptable pointer from pheader
  13961. spi_flash_read_sfdp(ptable + 4, &ptable, 3);
  13962. // get flash density (size in bits)
  13963. if (spi_flash_read_sfdp(ptable + 4, &bitsize, 4) < 0 || !bitsize)
  13964. 8026e80: 9b02 ldr r3, [sp, #8]
  13965. 8026e82: 2b00 cmp r3, #0
  13966. 8026e84: d0c6 beq.n 8026e14 <spi_flash_init+0x5c>
  13967. 8026e86: 2400 movs r4, #0
  13968. return 0;
  13969. // find smallest available sector
  13970. for (i = 0; i < 4; i++) {
  13971. tmp[0] = 0;
  13972. 8026e88: 4625 mov r5, r4
  13973. if (spi_flash_read_sfdp(ptable + 0x1C + i*2, &tmp, 2) >= 0 &&
  13974. 8026e8a: 9801 ldr r0, [sp, #4]
  13975. if (spi_flash_read_sfdp(ptable + 4, &bitsize, 4) < 0 || !bitsize)
  13976. return 0;
  13977. // find smallest available sector
  13978. for (i = 0; i < 4; i++) {
  13979. tmp[0] = 0;
  13980. 8026e8c: f88d 500c strb.w r5, [sp, #12]
  13981. if (spi_flash_read_sfdp(ptable + 0x1C + i*2, &tmp, 2) >= 0 &&
  13982. 8026e90: 301c adds r0, #28
  13983. 8026e92: 2202 movs r2, #2
  13984. 8026e94: 1900 adds r0, r0, r4
  13985. 8026e96: a903 add r1, sp, #12
  13986. 8026e98: f7ff fec5 bl 8026c26 <spi_flash_read_sfdp>
  13987. 8026e9c: 2800 cmp r0, #0
  13988. 8026e9e: db11 blt.n 8026ec4 <spi_flash_init+0x10c>
  13989. tmp[0]) {
  13990. 8026ea0: f89d 200c ldrb.w r2, [sp, #12]
  13991. return 0;
  13992. // find smallest available sector
  13993. for (i = 0; i < 4; i++) {
  13994. tmp[0] = 0;
  13995. if (spi_flash_read_sfdp(ptable + 0x1C + i*2, &tmp, 2) >= 0 &&
  13996. 8026ea4: b172 cbz r2, 8026ec4 <spi_flash_init+0x10c>
  13997. tmp[0]) {
  13998. spi_flash_desc.sector_size = 1 << tmp[0];
  13999. 8026ea6: 4b0d ldr r3, [pc, #52] ; (8026edc <spi_flash_init+0x124>)
  14000. 8026ea8: 2101 movs r1, #1
  14001. 8026eaa: fa01 f102 lsl.w r1, r1, r2
  14002. 8026eae: 6059 str r1, [r3, #4]
  14003. spi_flash_desc.sector_erase_op = tmp[1];
  14004. 8026eb0: f89d 100d ldrb.w r1, [sp, #13]
  14005. 8026eb4: 7219 strb r1, [r3, #8]
  14006. spi_flash_desc.sector_count = (bitsize + 1) >> (3 + tmp[0]);
  14007. 8026eb6: 9902 ldr r1, [sp, #8]
  14008. 8026eb8: 3203 adds r2, #3
  14009. 8026eba: 3101 adds r1, #1
  14010. 8026ebc: fa21 f202 lsr.w r2, r1, r2
  14011. 8026ec0: 815a strh r2, [r3, #10]
  14012. break;
  14013. 8026ec2: e002 b.n 8026eca <spi_flash_init+0x112>
  14014. 8026ec4: 3402 adds r4, #2
  14015. // get flash density (size in bits)
  14016. if (spi_flash_read_sfdp(ptable + 4, &bitsize, 4) < 0 || !bitsize)
  14017. return 0;
  14018. // find smallest available sector
  14019. for (i = 0; i < 4; i++) {
  14020. 8026ec6: 2c08 cmp r4, #8
  14021. 8026ec8: d1df bne.n 8026e8a <spi_flash_init+0xd2>
  14022. spi_flash_desc.sector_erase_op = tmp[1];
  14023. spi_flash_desc.sector_count = (bitsize + 1) >> (3 + tmp[0]);
  14024. break;
  14025. }
  14026. }
  14027. if (!spi_flash_desc.sector_size)
  14028. 8026eca: 4b04 ldr r3, [pc, #16] ; (8026edc <spi_flash_init+0x124>)
  14029. 8026ecc: 685a ldr r2, [r3, #4]
  14030. 8026ece: 2a00 cmp r2, #0
  14031. 8026ed0: d0a0 beq.n 8026e14 <spi_flash_init+0x5c>
  14032. return 0;
  14033. spi_flash_desc.present = true;
  14034. 8026ed2: 2001 movs r0, #1
  14035. 8026ed4: 7018 strb r0, [r3, #0]
  14036. return 1;
  14037. }
  14038. 8026ed6: b005 add sp, #20
  14039. 8026ed8: bd30 pop {r4, r5, pc}
  14040. 8026eda: bf00 nop
  14041. 8026edc: 2000c890 .word 0x2000c890
  14042. 8026ee0: 40023800 .word 0x40023800
  14043. 08026ee4 <NVIC_EncodePriority.constprop.0>:
  14044. \param [in] SubPriority Subpriority value (starting from 0).
  14045. \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority().
  14046. */
  14047. __STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority)
  14048. {
  14049. uint32_t PriorityGroupTmp = (PriorityGroup & 0x07); /* only values 0..7 are used */
  14050. 8026ee4: f000 0007 and.w r0, r0, #7
  14051. uint32_t PreemptPriorityBits;
  14052. uint32_t SubPriorityBits;
  14053. PreemptPriorityBits = ((7 - PriorityGroupTmp) > __NVIC_PRIO_BITS) ? __NVIC_PRIO_BITS : 7 - PriorityGroupTmp;
  14054. 8026ee8: f1c0 0307 rsb r3, r0, #7
  14055. SubPriorityBits = ((PriorityGroupTmp + __NVIC_PRIO_BITS) < 7) ? 0 : PriorityGroupTmp - 7 + __NVIC_PRIO_BITS;
  14056. 8026eec: 1d02 adds r2, r0, #4
  14057. {
  14058. uint32_t PriorityGroupTmp = (PriorityGroup & 0x07); /* only values 0..7 are used */
  14059. uint32_t PreemptPriorityBits;
  14060. uint32_t SubPriorityBits;
  14061. PreemptPriorityBits = ((7 - PriorityGroupTmp) > __NVIC_PRIO_BITS) ? __NVIC_PRIO_BITS : 7 - PriorityGroupTmp;
  14062. 8026eee: 2b04 cmp r3, #4
  14063. 8026ef0: bf28 it cs
  14064. 8026ef2: 2304 movcs r3, #4
  14065. SubPriorityBits = ((PriorityGroupTmp + __NVIC_PRIO_BITS) < 7) ? 0 : PriorityGroupTmp - 7 + __NVIC_PRIO_BITS;
  14066. 8026ef4: 2a06 cmp r2, #6
  14067. 8026ef6: d901 bls.n 8026efc <NVIC_EncodePriority.constprop.0+0x18>
  14068. 8026ef8: 3803 subs r0, #3
  14069. 8026efa: e000 b.n 8026efe <NVIC_EncodePriority.constprop.0+0x1a>
  14070. 8026efc: 2000 movs r0, #0
  14071. return (
  14072. ((PreemptPriority & ((1 << (PreemptPriorityBits)) - 1)) << SubPriorityBits) |
  14073. 8026efe: 2201 movs r2, #1
  14074. 8026f00: fa02 f303 lsl.w r3, r2, r3
  14075. 8026f04: 3b01 subs r3, #1
  14076. 8026f06: f003 0305 and.w r3, r3, #5
  14077. ((SubPriority & ((1 << (SubPriorityBits )) - 1)))
  14078. );
  14079. }
  14080. 8026f0a: fa03 f000 lsl.w r0, r3, r0
  14081. 8026f0e: 4770 bx lr
  14082. 08026f10 <uart_hw_init>:
  14083. uint32_t user_tx_fifo[USER_RBUF_SIZE];
  14084. SemaphoreHandle_t xSem_user_rx_buf;
  14085. USART_InitTypeDef USART_InitStructure;
  14086. void uart_hw_init(USART_TypeDef *uart, uint32_t baud, uint16_t wordlen, uint16_t parity, uint16_t stop) {
  14087. 8026f10: b570 push {r4, r5, r6, lr}
  14088. if (wordlen == 8)
  14089. wordlen_tmp = USART_WordLength_8b;
  14090. if (wordlen == 9)
  14091. wordlen_tmp = USART_WordLength_9b;
  14092. USART_InitStructure.USART_BaudRate = baud;
  14093. 8026f12: 4d34 ldr r5, [pc, #208] ; (8026fe4 <uart_hw_init+0xd4>)
  14094. uint32_t user_tx_fifo[USER_RBUF_SIZE];
  14095. SemaphoreHandle_t xSem_user_rx_buf;
  14096. USART_InitTypeDef USART_InitStructure;
  14097. void uart_hw_init(USART_TypeDef *uart, uint32_t baud, uint16_t wordlen, uint16_t parity, uint16_t stop) {
  14098. 8026f14: f8bd 6010 ldrh.w r6, [sp, #16]
  14099. wordlen_tmp = USART_WordLength_9b;
  14100. USART_InitStructure.USART_BaudRate = baud;
  14101. USART_InitStructure.USART_WordLength = wordlen_tmp;
  14102. USART_InitStructure.USART_StopBits = stop;
  14103. USART_InitStructure.USART_Parity = parity;
  14104. 8026f18: 812b strh r3, [r5, #8]
  14105. void uart_hw_init(USART_TypeDef *uart, uint32_t baud, uint16_t wordlen, uint16_t parity, uint16_t stop) {
  14106. uint16_t wordlen_tmp;
  14107. if (wordlen == 8)
  14108. wordlen_tmp = USART_WordLength_8b;
  14109. if (wordlen == 9)
  14110. 8026f1a: 2a09 cmp r2, #9
  14111. 8026f1c: bf0c ite eq
  14112. 8026f1e: f44f 5280 moveq.w r2, #4096 ; 0x1000
  14113. 8026f22: 2200 movne r2, #0
  14114. USART_InitStructure.USART_BaudRate = baud;
  14115. USART_InitStructure.USART_WordLength = wordlen_tmp;
  14116. USART_InitStructure.USART_StopBits = stop;
  14117. USART_InitStructure.USART_Parity = parity;
  14118. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  14119. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  14120. 8026f24: 230c movs r3, #12
  14121. if (wordlen == 9)
  14122. wordlen_tmp = USART_WordLength_9b;
  14123. USART_InitStructure.USART_BaudRate = baud;
  14124. USART_InitStructure.USART_WordLength = wordlen_tmp;
  14125. USART_InitStructure.USART_StopBits = stop;
  14126. 8026f26: 80ee strh r6, [r5, #6]
  14127. USART_InitStructure.USART_Parity = parity;
  14128. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  14129. 8026f28: 2600 movs r6, #0
  14130. uint32_t user_tx_fifo[USER_RBUF_SIZE];
  14131. SemaphoreHandle_t xSem_user_rx_buf;
  14132. USART_InitTypeDef USART_InitStructure;
  14133. void uart_hw_init(USART_TypeDef *uart, uint32_t baud, uint16_t wordlen, uint16_t parity, uint16_t stop) {
  14134. 8026f2a: 4604 mov r4, r0
  14135. USART_InitStructure.USART_BaudRate = baud;
  14136. USART_InitStructure.USART_WordLength = wordlen_tmp;
  14137. USART_InitStructure.USART_StopBits = stop;
  14138. USART_InitStructure.USART_Parity = parity;
  14139. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  14140. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  14141. 8026f2c: 816b strh r3, [r5, #10]
  14142. if (wordlen == 8)
  14143. wordlen_tmp = USART_WordLength_8b;
  14144. if (wordlen == 9)
  14145. wordlen_tmp = USART_WordLength_9b;
  14146. USART_InitStructure.USART_BaudRate = baud;
  14147. 8026f2e: 6029 str r1, [r5, #0]
  14148. USART_InitStructure.USART_WordLength = wordlen_tmp;
  14149. 8026f30: 80aa strh r2, [r5, #4]
  14150. USART_InitStructure.USART_StopBits = stop;
  14151. USART_InitStructure.USART_Parity = parity;
  14152. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  14153. 8026f32: 81ae strh r6, [r5, #12]
  14154. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  14155. USART_DeInit(uart);
  14156. 8026f34: f7ff f80a bl 8025f4c <USART_DeInit>
  14157. if (uart == USART1) {
  14158. 8026f38: 4b2b ldr r3, [pc, #172] ; (8026fe8 <uart_hw_init+0xd8>)
  14159. 8026f3a: 429c cmp r4, r3
  14160. 8026f3c: d111 bne.n 8026f62 <uart_hw_init+0x52>
  14161. RCC->APB2ENR |= RCC_APB2Periph_USART1;
  14162. 8026f3e: f503 3394 add.w r3, r3, #75776 ; 0x12800
  14163. 8026f42: 6c5a ldr r2, [r3, #68] ; 0x44
  14164. 8026f44: f042 0210 orr.w r2, r2, #16
  14165. 8026f48: 645a str r2, [r3, #68] ; 0x44
  14166. \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field).
  14167. */
  14168. __STATIC_INLINE uint32_t NVIC_GetPriorityGrouping(void)
  14169. {
  14170. return ((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos); /* read priority grouping field */
  14171. 8026f4a: 4b28 ldr r3, [pc, #160] ; (8026fec <uart_hw_init+0xdc>)
  14172. 8026f4c: 68d8 ldr r0, [r3, #12]
  14173. NVIC_SetPriority(USART1_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 0x05, 0));
  14174. 8026f4e: f3c0 2002 ubfx r0, r0, #8, #3
  14175. 8026f52: f7ff ffc7 bl 8026ee4 <NVIC_EncodePriority.constprop.0>
  14176. __STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
  14177. {
  14178. if(IRQn < 0) {
  14179. SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for Cortex-M System Interrupts */
  14180. else {
  14181. NVIC->IP[(uint32_t)(IRQn)] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for device specific Interrupts */
  14182. 8026f56: 4b26 ldr r3, [pc, #152] ; (8026ff0 <uart_hw_init+0xe0>)
  14183. 8026f58: 0100 lsls r0, r0, #4
  14184. 8026f5a: f883 0325 strb.w r0, [r3, #805] ; 0x325
  14185. \param [in] IRQn External interrupt number. Value cannot be negative.
  14186. */
  14187. __STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn)
  14188. {
  14189. /* NVIC->ISER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); enable interrupt */
  14190. NVIC->ISER[(uint32_t)((int32_t)IRQn) >> 5] = (uint32_t)(1 << ((uint32_t)((int32_t)IRQn) & (uint32_t)0x1F)); /* enable interrupt */
  14191. 8026f5e: 2220 movs r2, #32
  14192. 8026f60: e028 b.n 8026fb4 <uart_hw_init+0xa4>
  14193. USART_Cmd(USART1, ENABLE);
  14194. USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
  14195. USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
  14196. }
  14197. if (uart == USART2) {
  14198. 8026f62: 4b24 ldr r3, [pc, #144] ; (8026ff4 <uart_hw_init+0xe4>)
  14199. 8026f64: 429c cmp r4, r3
  14200. 8026f66: d111 bne.n 8026f8c <uart_hw_init+0x7c>
  14201. RCC->APB1ENR |= RCC_APB1Periph_USART2;
  14202. 8026f68: f503 33fa add.w r3, r3, #128000 ; 0x1f400
  14203. 8026f6c: 6c1a ldr r2, [r3, #64] ; 0x40
  14204. 8026f6e: f442 3200 orr.w r2, r2, #131072 ; 0x20000
  14205. 8026f72: 641a str r2, [r3, #64] ; 0x40
  14206. \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field).
  14207. */
  14208. __STATIC_INLINE uint32_t NVIC_GetPriorityGrouping(void)
  14209. {
  14210. return ((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos); /* read priority grouping field */
  14211. 8026f74: 4b1d ldr r3, [pc, #116] ; (8026fec <uart_hw_init+0xdc>)
  14212. 8026f76: 68d8 ldr r0, [r3, #12]
  14213. NVIC_SetPriority(USART2_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 0x05, 0));
  14214. 8026f78: f3c0 2002 ubfx r0, r0, #8, #3
  14215. 8026f7c: f7ff ffb2 bl 8026ee4 <NVIC_EncodePriority.constprop.0>
  14216. __STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
  14217. {
  14218. if(IRQn < 0) {
  14219. SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for Cortex-M System Interrupts */
  14220. else {
  14221. NVIC->IP[(uint32_t)(IRQn)] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for device specific Interrupts */
  14222. 8026f80: 4b1b ldr r3, [pc, #108] ; (8026ff0 <uart_hw_init+0xe0>)
  14223. 8026f82: 0100 lsls r0, r0, #4
  14224. 8026f84: f883 0326 strb.w r0, [r3, #806] ; 0x326
  14225. \param [in] IRQn External interrupt number. Value cannot be negative.
  14226. */
  14227. __STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn)
  14228. {
  14229. /* NVIC->ISER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); enable interrupt */
  14230. NVIC->ISER[(uint32_t)((int32_t)IRQn) >> 5] = (uint32_t)(1 << ((uint32_t)((int32_t)IRQn) & (uint32_t)0x1F)); /* enable interrupt */
  14231. 8026f88: 2240 movs r2, #64 ; 0x40
  14232. 8026f8a: e013 b.n 8026fb4 <uart_hw_init+0xa4>
  14233. USART_Cmd(USART2, ENABLE);
  14234. USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
  14235. USART_ITConfig(USART2, USART_IT_TXE, DISABLE);
  14236. }
  14237. if (uart == USART3) {
  14238. 8026f8c: 4b1a ldr r3, [pc, #104] ; (8026ff8 <uart_hw_init+0xe8>)
  14239. 8026f8e: 429c cmp r4, r3
  14240. 8026f90: d127 bne.n 8026fe2 <uart_hw_init+0xd2>
  14241. RCC->APB1ENR |= RCC_APB1Periph_USART3;
  14242. 8026f92: f503 33f8 add.w r3, r3, #126976 ; 0x1f000
  14243. 8026f96: 6c1a ldr r2, [r3, #64] ; 0x40
  14244. 8026f98: f442 2280 orr.w r2, r2, #262144 ; 0x40000
  14245. 8026f9c: 641a str r2, [r3, #64] ; 0x40
  14246. \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field).
  14247. */
  14248. __STATIC_INLINE uint32_t NVIC_GetPriorityGrouping(void)
  14249. {
  14250. return ((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos); /* read priority grouping field */
  14251. 8026f9e: 4b13 ldr r3, [pc, #76] ; (8026fec <uart_hw_init+0xdc>)
  14252. 8026fa0: 68d8 ldr r0, [r3, #12]
  14253. NVIC_SetPriority(USART3_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 0x05, 0));
  14254. 8026fa2: f3c0 2002 ubfx r0, r0, #8, #3
  14255. 8026fa6: f7ff ff9d bl 8026ee4 <NVIC_EncodePriority.constprop.0>
  14256. __STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
  14257. {
  14258. if(IRQn < 0) {
  14259. SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for Cortex-M System Interrupts */
  14260. else {
  14261. NVIC->IP[(uint32_t)(IRQn)] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for device specific Interrupts */
  14262. 8026faa: 4b11 ldr r3, [pc, #68] ; (8026ff0 <uart_hw_init+0xe0>)
  14263. 8026fac: 0100 lsls r0, r0, #4
  14264. 8026fae: f883 0327 strb.w r0, [r3, #807] ; 0x327
  14265. \param [in] IRQn External interrupt number. Value cannot be negative.
  14266. */
  14267. __STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn)
  14268. {
  14269. /* NVIC->ISER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); enable interrupt */
  14270. NVIC->ISER[(uint32_t)((int32_t)IRQn) >> 5] = (uint32_t)(1 << ((uint32_t)((int32_t)IRQn) & (uint32_t)0x1F)); /* enable interrupt */
  14271. 8026fb2: 2280 movs r2, #128 ; 0x80
  14272. 8026fb4: 605a str r2, [r3, #4]
  14273. NVIC_EnableIRQ(USART3_IRQn);
  14274. USART_Init(USART3, &USART_InitStructure);
  14275. 8026fb6: 4620 mov r0, r4
  14276. 8026fb8: 4629 mov r1, r5
  14277. 8026fba: f7ff f81b bl 8025ff4 <USART_Init>
  14278. USART_Cmd(USART3, ENABLE);
  14279. 8026fbe: 4620 mov r0, r4
  14280. 8026fc0: 2101 movs r1, #1
  14281. 8026fc2: f7ff f871 bl 80260a8 <USART_Cmd>
  14282. USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
  14283. 8026fc6: 4620 mov r0, r4
  14284. 8026fc8: 2201 movs r2, #1
  14285. 8026fca: f240 5125 movw r1, #1317 ; 0x525
  14286. 8026fce: f7ff f877 bl 80260c0 <USART_ITConfig>
  14287. USART_ITConfig(USART3, USART_IT_TXE, DISABLE);
  14288. 8026fd2: 4620 mov r0, r4
  14289. 8026fd4: f240 7127 movw r1, #1831 ; 0x727
  14290. 8026fd8: 4632 mov r2, r6
  14291. }
  14292. }
  14293. 8026fda: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
  14294. NVIC_SetPriority(USART3_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 0x05, 0));
  14295. NVIC_EnableIRQ(USART3_IRQn);
  14296. USART_Init(USART3, &USART_InitStructure);
  14297. USART_Cmd(USART3, ENABLE);
  14298. USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
  14299. USART_ITConfig(USART3, USART_IT_TXE, DISABLE);
  14300. 8026fde: f7ff b86f b.w 80260c0 <USART_ITConfig>
  14301. 8026fe2: bd70 pop {r4, r5, r6, pc}
  14302. 8026fe4: 2000d3ec .word 0x2000d3ec
  14303. 8026fe8: 40011000 .word 0x40011000
  14304. 8026fec: e000ed00 .word 0xe000ed00
  14305. 8026ff0: e000e100 .word 0xe000e100
  14306. 8026ff4: 40004400 .word 0x40004400
  14307. 8026ff8: 40004800 .word 0x40004800
  14308. 08026ffc <InitUSART>:
  14309. }
  14310. }
  14311. void InitUSART(void) {
  14312. 8026ffc: b513 push {r0, r1, r4, lr}
  14313. xSem_rx_buf = xSemaphoreCreateCounting( UPS_RBUF_SIZE, 0 );
  14314. 8026ffe: 2100 movs r1, #0
  14315. 8027000: 2064 movs r0, #100 ; 0x64
  14316. 8027002: f004 f85b bl 802b0bc <xQueueCreateCountingSemaphore>
  14317. 8027006: 4b1b ldr r3, [pc, #108] ; (8027074 <InitUSART+0x78>)
  14318. rbuf32_init(&ups_tx_rbuf, ups_tx_fifo, UPS_RBUF_SIZE);
  14319. 8027008: 491b ldr r1, [pc, #108] ; (8027078 <InitUSART+0x7c>)
  14320. USART_ITConfig(USART3, USART_IT_TXE, DISABLE);
  14321. }
  14322. }
  14323. void InitUSART(void) {
  14324. xSem_rx_buf = xSemaphoreCreateCounting( UPS_RBUF_SIZE, 0 );
  14325. 802700a: 6018 str r0, [r3, #0]
  14326. rbuf32_init(&ups_tx_rbuf, ups_tx_fifo, UPS_RBUF_SIZE);
  14327. 802700c: 2264 movs r2, #100 ; 0x64
  14328. 802700e: 481b ldr r0, [pc, #108] ; (802707c <InitUSART+0x80>)
  14329. rbuf32_init(&ups_rx_rbuf, ups_rx_fifo, UPS_RBUF_SIZE);
  14330. uart_hw_init(UPS_USART, UPS_USART_BAUD, UPS_USART_WORD_LEN, UPS_USART_PARITY, UPS_USART_STOP_BIT);
  14331. 8027010: 2400 movs r4, #0
  14332. }
  14333. }
  14334. void InitUSART(void) {
  14335. xSem_rx_buf = xSemaphoreCreateCounting( UPS_RBUF_SIZE, 0 );
  14336. rbuf32_init(&ups_tx_rbuf, ups_tx_fifo, UPS_RBUF_SIZE);
  14337. 8027012: f002 fc4d bl 80298b0 <rbuf32_init>
  14338. rbuf32_init(&ups_rx_rbuf, ups_rx_fifo, UPS_RBUF_SIZE);
  14339. 8027016: 2264 movs r2, #100 ; 0x64
  14340. 8027018: 4819 ldr r0, [pc, #100] ; (8027080 <InitUSART+0x84>)
  14341. 802701a: 491a ldr r1, [pc, #104] ; (8027084 <InitUSART+0x88>)
  14342. 802701c: f002 fc48 bl 80298b0 <rbuf32_init>
  14343. uart_hw_init(UPS_USART, UPS_USART_BAUD, UPS_USART_WORD_LEN, UPS_USART_PARITY, UPS_USART_STOP_BIT);
  14344. 8027020: 2208 movs r2, #8
  14345. 8027022: 4623 mov r3, r4
  14346. 8027024: 9400 str r4, [sp, #0]
  14347. 8027026: 4818 ldr r0, [pc, #96] ; (8027088 <InitUSART+0x8c>)
  14348. 8027028: f44f 6116 mov.w r1, #2400 ; 0x960
  14349. 802702c: f7ff ff70 bl 8026f10 <uart_hw_init>
  14350. xSem_user_rx_buf = xSemaphoreCreateCounting( USER_RBUF_SIZE, 0 );
  14351. 8027030: 4621 mov r1, r4
  14352. 8027032: f44f 7080 mov.w r0, #256 ; 0x100
  14353. 8027036: f004 f841 bl 802b0bc <xQueueCreateCountingSemaphore>
  14354. 802703a: 4b14 ldr r3, [pc, #80] ; (802708c <InitUSART+0x90>)
  14355. rbuf32_init(&user_tx_rbuf, user_tx_fifo, USER_RBUF_SIZE);
  14356. 802703c: 4914 ldr r1, [pc, #80] ; (8027090 <InitUSART+0x94>)
  14357. xSem_rx_buf = xSemaphoreCreateCounting( UPS_RBUF_SIZE, 0 );
  14358. rbuf32_init(&ups_tx_rbuf, ups_tx_fifo, UPS_RBUF_SIZE);
  14359. rbuf32_init(&ups_rx_rbuf, ups_rx_fifo, UPS_RBUF_SIZE);
  14360. uart_hw_init(UPS_USART, UPS_USART_BAUD, UPS_USART_WORD_LEN, UPS_USART_PARITY, UPS_USART_STOP_BIT);
  14361. xSem_user_rx_buf = xSemaphoreCreateCounting( USER_RBUF_SIZE, 0 );
  14362. 802703e: 6018 str r0, [r3, #0]
  14363. rbuf32_init(&user_tx_rbuf, user_tx_fifo, USER_RBUF_SIZE);
  14364. 8027040: f44f 7280 mov.w r2, #256 ; 0x100
  14365. 8027044: 4813 ldr r0, [pc, #76] ; (8027094 <InitUSART+0x98>)
  14366. 8027046: f002 fc33 bl 80298b0 <rbuf32_init>
  14367. rbuf32_init(&user_rx_rbuf, user_rx_fifo, USER_RBUF_SIZE);
  14368. 802704a: 4813 ldr r0, [pc, #76] ; (8027098 <InitUSART+0x9c>)
  14369. 802704c: 4913 ldr r1, [pc, #76] ; (802709c <InitUSART+0xa0>)
  14370. 802704e: f44f 7280 mov.w r2, #256 ; 0x100
  14371. 8027052: f002 fc2d bl 80298b0 <rbuf32_init>
  14372. uart_hw_init(USER_USART, USER_USART_BAUD, USER_USART_WORD_LEN, USER_USART_PARITY, USER_USART_STOP_BIT);
  14373. 8027056: 9400 str r4, [sp, #0]
  14374. 8027058: 4811 ldr r0, [pc, #68] ; (80270a0 <InitUSART+0xa4>)
  14375. 802705a: f44f 31e1 mov.w r1, #115200 ; 0x1c200
  14376. 802705e: 2208 movs r2, #8
  14377. 8027060: 4623 mov r3, r4
  14378. 8027062: f7ff ff55 bl 8026f10 <uart_hw_init>
  14379. init_printf(NULL, putc_);
  14380. 8027066: 490f ldr r1, [pc, #60] ; (80270a4 <InitUSART+0xa8>)
  14381. 8027068: 4620 mov r0, r4
  14382. }
  14383. 802706a: b002 add sp, #8
  14384. 802706c: e8bd 4010 ldmia.w sp!, {r4, lr}
  14385. xSem_user_rx_buf = xSemaphoreCreateCounting( USER_RBUF_SIZE, 0 );
  14386. rbuf32_init(&user_tx_rbuf, user_tx_fifo, USER_RBUF_SIZE);
  14387. rbuf32_init(&user_rx_rbuf, user_rx_fifo, USER_RBUF_SIZE);
  14388. uart_hw_init(USER_USART, USER_USART_BAUD, USER_USART_WORD_LEN, USER_USART_PARITY, USER_USART_STOP_BIT);
  14389. init_printf(NULL, putc_);
  14390. 8027070: f000 bde4 b.w 8027c3c <init_printf>
  14391. 8027074: 2000d40c .word 0x2000d40c
  14392. 8027078: 2000c8bc .word 0x2000c8bc
  14393. 802707c: 2000d3dc .word 0x2000d3dc
  14394. 8027080: 2000c8ac .word 0x2000c8ac
  14395. 8027084: 2000d24c .word 0x2000d24c
  14396. 8027088: 40004400 .word 0x40004400
  14397. 802708c: 2000d410 .word 0x2000d410
  14398. 8027090: 2000ca4c .word 0x2000ca4c
  14399. 8027094: 2000d3fc .word 0x2000d3fc
  14400. 8027098: 2000c89c .word 0x2000c89c
  14401. 802709c: 2000ce4c .word 0x2000ce4c
  14402. 80270a0: 40011000 .word 0x40011000
  14403. 80270a4: 08027139 .word 0x08027139
  14404. 080270a8 <ups_send_block>:
  14405. }
  14406. int ups_send_block(void *data, uint8_t len) {
  14407. int i = 0;
  14408. uint32_t s_temp = 0;
  14409. UPS_USART->CR1 &= ~USART_CR1_TXEIE;
  14410. 80270a8: 4a0f ldr r2, [pc, #60] ; (80270e8 <ups_send_block+0x40>)
  14411. 80270aa: 8993 ldrh r3, [r2, #12]
  14412. 80270ac: f023 0380 bic.w r3, r3, #128 ; 0x80
  14413. 80270b0: 041b lsls r3, r3, #16
  14414. 80270b2: 0c1b lsrs r3, r3, #16
  14415. rbuf32_put(&ups_tx_rbuf, (uint32_t)(byte));
  14416. }
  14417. UPS_USART->CR1 |= USART_CR1_TXEIE;
  14418. }
  14419. int ups_send_block(void *data, uint8_t len) {
  14420. 80270b4: b570 push {r4, r5, r6, lr}
  14421. 80270b6: 4606 mov r6, r0
  14422. 80270b8: 460d mov r5, r1
  14423. int i = 0;
  14424. uint32_t s_temp = 0;
  14425. UPS_USART->CR1 &= ~USART_CR1_TXEIE;
  14426. 80270ba: 8193 strh r3, [r2, #12]
  14427. }
  14428. UPS_USART->CR1 |= USART_CR1_TXEIE;
  14429. }
  14430. int ups_send_block(void *data, uint8_t len) {
  14431. int i = 0;
  14432. 80270bc: 2400 movs r4, #0
  14433. uint32_t s_temp = 0;
  14434. UPS_USART->CR1 &= ~USART_CR1_TXEIE;
  14435. //DBG printf("STOP \r\n");
  14436. while (i < len) {
  14437. 80270be: e008 b.n 80270d2 <ups_send_block+0x2a>
  14438. if (!rbuf_isfull(&ups_tx_rbuf)) {
  14439. 80270c0: 480a ldr r0, [pc, #40] ; (80270ec <ups_send_block+0x44>)
  14440. 80270c2: f002 fbfb bl 80298bc <rbuf_isfull>
  14441. 80270c6: b930 cbnz r0, 80270d6 <ups_send_block+0x2e>
  14442. s_temp = ((uint8_t *)data)[i++];
  14443. 80270c8: 5d31 ldrb r1, [r6, r4]
  14444. rbuf32_put(&ups_tx_rbuf, s_temp);
  14445. 80270ca: 4808 ldr r0, [pc, #32] ; (80270ec <ups_send_block+0x44>)
  14446. uint32_t s_temp = 0;
  14447. UPS_USART->CR1 &= ~USART_CR1_TXEIE;
  14448. //DBG printf("STOP \r\n");
  14449. while (i < len) {
  14450. if (!rbuf_isfull(&ups_tx_rbuf)) {
  14451. s_temp = ((uint8_t *)data)[i++];
  14452. 80270cc: 3401 adds r4, #1
  14453. rbuf32_put(&ups_tx_rbuf, s_temp);
  14454. 80270ce: f002 fc16 bl 80298fe <rbuf32_put>
  14455. int ups_send_block(void *data, uint8_t len) {
  14456. int i = 0;
  14457. uint32_t s_temp = 0;
  14458. UPS_USART->CR1 &= ~USART_CR1_TXEIE;
  14459. //DBG printf("STOP \r\n");
  14460. while (i < len) {
  14461. 80270d2: 42ac cmp r4, r5
  14462. 80270d4: dbf4 blt.n 80270c0 <ups_send_block+0x18>
  14463. rbuf32_put(&ups_tx_rbuf, s_temp);
  14464. }
  14465. else
  14466. break;
  14467. }
  14468. UPS_USART->CR1 |= USART_CR1_TXEIE;
  14469. 80270d6: 4b04 ldr r3, [pc, #16] ; (80270e8 <ups_send_block+0x40>)
  14470. 80270d8: 899a ldrh r2, [r3, #12]
  14471. 80270da: b292 uxth r2, r2
  14472. 80270dc: f042 0280 orr.w r2, r2, #128 ; 0x80
  14473. 80270e0: 819a strh r2, [r3, #12]
  14474. return i;
  14475. }
  14476. 80270e2: 4620 mov r0, r4
  14477. 80270e4: bd70 pop {r4, r5, r6, pc}
  14478. 80270e6: bf00 nop
  14479. 80270e8: 40004400 .word 0x40004400
  14480. 80270ec: 2000d3dc .word 0x2000d3dc
  14481. 080270f0 <ups_getchar>:
  14482. int ups_getchar(unsigned int timeout) {
  14483. int res;
  14484. res = xSemaphoreTake( xSem_rx_buf, (TickType_t)timeout );
  14485. 80270f0: 4b09 ldr r3, [pc, #36] ; (8027118 <ups_getchar+0x28>)
  14486. }
  14487. UPS_USART->CR1 |= USART_CR1_TXEIE;
  14488. return i;
  14489. }
  14490. int ups_getchar(unsigned int timeout) {
  14491. 80270f2: b507 push {r0, r1, r2, lr}
  14492. int res;
  14493. res = xSemaphoreTake( xSem_rx_buf, (TickType_t)timeout );
  14494. 80270f4: 2100 movs r1, #0
  14495. }
  14496. UPS_USART->CR1 |= USART_CR1_TXEIE;
  14497. return i;
  14498. }
  14499. int ups_getchar(unsigned int timeout) {
  14500. 80270f6: 4602 mov r2, r0
  14501. int res;
  14502. res = xSemaphoreTake( xSem_rx_buf, (TickType_t)timeout );
  14503. 80270f8: 6818 ldr r0, [r3, #0]
  14504. 80270fa: 460b mov r3, r1
  14505. 80270fc: f004 f934 bl 802b368 <xQueueGenericReceive>
  14506. 8027100: 9001 str r0, [sp, #4]
  14507. if (res == pdFALSE) {
  14508. 8027102: b128 cbz r0, 8027110 <ups_getchar+0x20>
  14509. return -1;
  14510. }
  14511. rbuf32_get(&ups_rx_rbuf, (uint32_t*)&res);
  14512. 8027104: 4805 ldr r0, [pc, #20] ; (802711c <ups_getchar+0x2c>)
  14513. 8027106: a901 add r1, sp, #4
  14514. 8027108: f002 fbe4 bl 80298d4 <rbuf32_get>
  14515. // DBG printf("STOP \r\n");
  14516. // DBG printf("wr: %d 0x%x\r\n", rs485_rx_rbuf.read_index,res);
  14517. return res;
  14518. 802710c: 9801 ldr r0, [sp, #4]
  14519. 802710e: e001 b.n 8027114 <ups_getchar+0x24>
  14520. int ups_getchar(unsigned int timeout) {
  14521. int res;
  14522. res = xSemaphoreTake( xSem_rx_buf, (TickType_t)timeout );
  14523. if (res == pdFALSE) {
  14524. return -1;
  14525. 8027110: f04f 30ff mov.w r0, #4294967295
  14526. }
  14527. rbuf32_get(&ups_rx_rbuf, (uint32_t*)&res);
  14528. // DBG printf("STOP \r\n");
  14529. // DBG printf("wr: %d 0x%x\r\n", rs485_rx_rbuf.read_index,res);
  14530. return res;
  14531. }
  14532. 8027114: bd0e pop {r1, r2, r3, pc}
  14533. 8027116: bf00 nop
  14534. 8027118: 2000d40c .word 0x2000d40c
  14535. 802711c: 2000c8ac .word 0x2000c8ac
  14536. 08027120 <putchar_>:
  14537. // DBG printf("wr: %d 0x%x\r\n", rs485_rx_rbuf.read_index,res);
  14538. return res;
  14539. }
  14540. void putchar_(uint8_t c) {
  14541. while (!(USER_USART->SR & USART_FLAG_TXE));
  14542. 8027120: 4a04 ldr r2, [pc, #16] ; (8027134 <putchar_+0x14>)
  14543. 8027122: 8813 ldrh r3, [r2, #0]
  14544. 8027124: f003 0380 and.w r3, r3, #128 ; 0x80
  14545. 8027128: b29b uxth r3, r3
  14546. 802712a: 2b00 cmp r3, #0
  14547. 802712c: d0f9 beq.n 8027122 <putchar_+0x2>
  14548. USER_USART->DR = (uint16_t)c;
  14549. 802712e: 4b01 ldr r3, [pc, #4] ; (8027134 <putchar_+0x14>)
  14550. 8027130: 8098 strh r0, [r3, #4]
  14551. 8027132: 4770 bx lr
  14552. 8027134: 40011000 .word 0x40011000
  14553. 08027138 <putc_>:
  14554. }
  14555. void putc_(void* p, char c) {
  14556. (void)p;
  14557. putchar_(c);
  14558. 8027138: 4608 mov r0, r1
  14559. 802713a: f7ff bff1 b.w 8027120 <putchar_>
  14560. 802713e: 0000 movs r0, r0
  14561. 08027140 <service_rs232_irq_handler>:
  14562. }
  14563. //inline void rs232_irq_handler(void)
  14564. void service_rs232_irq_handler(void)
  14565. {
  14566. 8027140: b513 push {r0, r1, r4, lr}
  14567. uint32_t c = 0;
  14568. 8027142: 2300 movs r3, #0
  14569. 8027144: 9301 str r3, [sp, #4]
  14570. static BaseType_t xHigherPriorityTaskWoken = pdFALSE;
  14571. if ((USER_USART->SR & USART_SR_ORE)) {
  14572. 8027146: 4b26 ldr r3, [pc, #152] ; (80271e0 <service_rs232_irq_handler+0xa0>)
  14573. 8027148: 881a ldrh r2, [r3, #0]
  14574. 802714a: f002 0208 and.w r2, r2, #8
  14575. 802714e: b292 uxth r2, r2
  14576. 8027150: b112 cbz r2, 8027158 <service_rs232_irq_handler+0x18>
  14577. c = (uint32_t)USER_USART->DR;
  14578. 8027152: 889b ldrh r3, [r3, #4]
  14579. 8027154: b29b uxth r3, r3
  14580. 8027156: 9301 str r3, [sp, #4]
  14581. //DBG printf("overrunRS485\r\n");
  14582. }
  14583. if (USART_GetITStatus(USER_USART, USART_IT_TXE) != RESET) {
  14584. 8027158: 4c21 ldr r4, [pc, #132] ; (80271e0 <service_rs232_irq_handler+0xa0>)
  14585. 802715a: f240 7127 movw r1, #1831 ; 0x727
  14586. 802715e: 4620 mov r0, r4
  14587. 8027160: f7fe ffc7 bl 80260f2 <USART_GetITStatus>
  14588. 8027164: b1c0 cbz r0, 8027198 <service_rs232_irq_handler+0x58>
  14589. if(rbuf32_get(&user_tx_rbuf, &c)) {
  14590. 8027166: 481f ldr r0, [pc, #124] ; (80271e4 <service_rs232_irq_handler+0xa4>)
  14591. 8027168: a901 add r1, sp, #4
  14592. 802716a: f002 fbb3 bl 80298d4 <rbuf32_get>
  14593. 802716e: b118 cbz r0, 8027178 <service_rs232_irq_handler+0x38>
  14594. USER_USART->DR = (uint16_t)c;
  14595. 8027170: f8bd 3004 ldrh.w r3, [sp, #4]
  14596. 8027174: 80a3 strh r3, [r4, #4]
  14597. 8027176: e00a b.n 802718e <service_rs232_irq_handler+0x4e>
  14598. //DBG printf("wr: %d 0x%x\r\n", rs485_tx_rbuf.read_index,c);
  14599. }
  14600. else {
  14601. USER_USART->CR1 &= ~USART_CR1_TXEIE;
  14602. 8027178: 89a3 ldrh r3, [r4, #12]
  14603. 802717a: f023 0380 bic.w r3, r3, #128 ; 0x80
  14604. 802717e: 041b lsls r3, r3, #16
  14605. 8027180: 0c1b lsrs r3, r3, #16
  14606. 8027182: 81a3 strh r3, [r4, #12]
  14607. USER_USART->CR1 |= USART_CR1_RXNEIE;
  14608. 8027184: 89a3 ldrh r3, [r4, #12]
  14609. 8027186: b29b uxth r3, r3
  14610. 8027188: f043 0320 orr.w r3, r3, #32
  14611. 802718c: 81a3 strh r3, [r4, #12]
  14612. }
  14613. USART_ClearITPendingBit(USER_USART, USART_IT_TXE);
  14614. 802718e: 4814 ldr r0, [pc, #80] ; (80271e0 <service_rs232_irq_handler+0xa0>)
  14615. 8027190: f240 7127 movw r1, #1831 ; 0x727
  14616. 8027194: f7fe ffcd bl 8026132 <USART_ClearITPendingBit>
  14617. }
  14618. if(USART_GetITStatus(USER_USART, USART_IT_RXNE) != RESET)
  14619. 8027198: 4c11 ldr r4, [pc, #68] ; (80271e0 <service_rs232_irq_handler+0xa0>)
  14620. 802719a: f240 5125 movw r1, #1317 ; 0x525
  14621. 802719e: 4620 mov r0, r4
  14622. 80271a0: f7fe ffa7 bl 80260f2 <USART_GetITStatus>
  14623. 80271a4: b1d8 cbz r0, 80271de <service_rs232_irq_handler+0x9e>
  14624. {
  14625. c = (uint32_t)USER_USART->DR;
  14626. 80271a6: 88a3 ldrh r3, [r4, #4]
  14627. //DBG printf("read: %d 0x%x\r\n", rs485_rx_rbuf.write_index,c);
  14628. if (!rbuf_isfull(&user_rx_rbuf))
  14629. 80271a8: 480f ldr r0, [pc, #60] ; (80271e8 <service_rs232_irq_handler+0xa8>)
  14630. }
  14631. USART_ClearITPendingBit(USER_USART, USART_IT_TXE);
  14632. }
  14633. if(USART_GetITStatus(USER_USART, USART_IT_RXNE) != RESET)
  14634. {
  14635. c = (uint32_t)USER_USART->DR;
  14636. 80271aa: b29b uxth r3, r3
  14637. 80271ac: 9301 str r3, [sp, #4]
  14638. //DBG printf("read: %d 0x%x\r\n", rs485_rx_rbuf.write_index,c);
  14639. if (!rbuf_isfull(&user_rx_rbuf))
  14640. 80271ae: f002 fb85 bl 80298bc <rbuf_isfull>
  14641. 80271b2: b918 cbnz r0, 80271bc <service_rs232_irq_handler+0x7c>
  14642. rbuf32_put(&user_rx_rbuf, c);
  14643. 80271b4: 480c ldr r0, [pc, #48] ; (80271e8 <service_rs232_irq_handler+0xa8>)
  14644. 80271b6: 9901 ldr r1, [sp, #4]
  14645. 80271b8: f002 fba1 bl 80298fe <rbuf32_put>
  14646. USART_ClearITPendingBit(USER_USART, USART_IT_RXNE);
  14647. 80271bc: 4808 ldr r0, [pc, #32] ; (80271e0 <service_rs232_irq_handler+0xa0>)
  14648. xSemaphoreGiveFromISR(xSem_user_rx_buf, &xHigherPriorityTaskWoken);
  14649. 80271be: 4c0b ldr r4, [pc, #44] ; (80271ec <service_rs232_irq_handler+0xac>)
  14650. {
  14651. c = (uint32_t)USER_USART->DR;
  14652. //DBG printf("read: %d 0x%x\r\n", rs485_rx_rbuf.write_index,c);
  14653. if (!rbuf_isfull(&user_rx_rbuf))
  14654. rbuf32_put(&user_rx_rbuf, c);
  14655. USART_ClearITPendingBit(USER_USART, USART_IT_RXNE);
  14656. 80271c0: f240 5125 movw r1, #1317 ; 0x525
  14657. 80271c4: f7fe ffb5 bl 8026132 <USART_ClearITPendingBit>
  14658. xSemaphoreGiveFromISR(xSem_user_rx_buf, &xHigherPriorityTaskWoken);
  14659. 80271c8: 4b09 ldr r3, [pc, #36] ; (80271f0 <service_rs232_irq_handler+0xb0>)
  14660. 80271ca: 4621 mov r1, r4
  14661. 80271cc: 6818 ldr r0, [r3, #0]
  14662. 80271ce: f004 f899 bl 802b304 <xQueueGiveFromISR>
  14663. portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
  14664. 80271d2: 6823 ldr r3, [r4, #0]
  14665. 80271d4: b11b cbz r3, 80271de <service_rs232_irq_handler+0x9e>
  14666. 80271d6: 4b07 ldr r3, [pc, #28] ; (80271f4 <service_rs232_irq_handler+0xb4>)
  14667. 80271d8: f04f 5280 mov.w r2, #268435456 ; 0x10000000
  14668. 80271dc: 601a str r2, [r3, #0]
  14669. }
  14670. }
  14671. 80271de: bd1c pop {r2, r3, r4, pc}
  14672. 80271e0: 40011000 .word 0x40011000
  14673. 80271e4: 2000d3fc .word 0x2000d3fc
  14674. 80271e8: 2000c89c .word 0x2000c89c
  14675. 80271ec: 20000b18 .word 0x20000b18
  14676. 80271f0: 2000d410 .word 0x2000d410
  14677. 80271f4: e000ed04 .word 0xe000ed04
  14678. 080271f8 <rs232_irq_handler>:
  14679. //inline void rs232_irq_handler(void)
  14680. void rs232_irq_handler(void)
  14681. {
  14682. 80271f8: b513 push {r0, r1, r4, lr}
  14683. uint32_t c = 0;
  14684. 80271fa: 2300 movs r3, #0
  14685. 80271fc: 9301 str r3, [sp, #4]
  14686. static BaseType_t xHigherPriorityTaskWoken = pdFALSE;
  14687. if ((UPS_USART->SR & USART_SR_ORE)) {
  14688. 80271fe: 4b26 ldr r3, [pc, #152] ; (8027298 <rs232_irq_handler+0xa0>)
  14689. 8027200: 881a ldrh r2, [r3, #0]
  14690. 8027202: f002 0208 and.w r2, r2, #8
  14691. 8027206: b292 uxth r2, r2
  14692. 8027208: b112 cbz r2, 8027210 <rs232_irq_handler+0x18>
  14693. c = (uint32_t)UPS_USART->DR;
  14694. 802720a: 889b ldrh r3, [r3, #4]
  14695. 802720c: b29b uxth r3, r3
  14696. 802720e: 9301 str r3, [sp, #4]
  14697. //DBG printf("overrunRS485\r\n");
  14698. }
  14699. if (USART_GetITStatus(UPS_USART, USART_IT_TXE) != RESET) {
  14700. 8027210: 4c21 ldr r4, [pc, #132] ; (8027298 <rs232_irq_handler+0xa0>)
  14701. 8027212: f240 7127 movw r1, #1831 ; 0x727
  14702. 8027216: 4620 mov r0, r4
  14703. 8027218: f7fe ff6b bl 80260f2 <USART_GetITStatus>
  14704. 802721c: b1c0 cbz r0, 8027250 <rs232_irq_handler+0x58>
  14705. if(rbuf32_get(&ups_tx_rbuf, &c)) {
  14706. 802721e: 481f ldr r0, [pc, #124] ; (802729c <rs232_irq_handler+0xa4>)
  14707. 8027220: a901 add r1, sp, #4
  14708. 8027222: f002 fb57 bl 80298d4 <rbuf32_get>
  14709. 8027226: b118 cbz r0, 8027230 <rs232_irq_handler+0x38>
  14710. UPS_USART->DR = (uint16_t)c;
  14711. 8027228: f8bd 3004 ldrh.w r3, [sp, #4]
  14712. 802722c: 80a3 strh r3, [r4, #4]
  14713. 802722e: e00a b.n 8027246 <rs232_irq_handler+0x4e>
  14714. //DBG printf("wr: %d 0x%x\r\n", rs485_tx_rbuf.read_index,c);
  14715. }
  14716. else {
  14717. UPS_USART->CR1 &= ~USART_CR1_TXEIE;
  14718. 8027230: 89a3 ldrh r3, [r4, #12]
  14719. 8027232: f023 0380 bic.w r3, r3, #128 ; 0x80
  14720. 8027236: 041b lsls r3, r3, #16
  14721. 8027238: 0c1b lsrs r3, r3, #16
  14722. 802723a: 81a3 strh r3, [r4, #12]
  14723. UPS_USART->CR1 |= USART_CR1_RXNEIE;
  14724. 802723c: 89a3 ldrh r3, [r4, #12]
  14725. 802723e: b29b uxth r3, r3
  14726. 8027240: f043 0320 orr.w r3, r3, #32
  14727. 8027244: 81a3 strh r3, [r4, #12]
  14728. }
  14729. USART_ClearITPendingBit(UPS_USART, USART_IT_TXE);
  14730. 8027246: 4814 ldr r0, [pc, #80] ; (8027298 <rs232_irq_handler+0xa0>)
  14731. 8027248: f240 7127 movw r1, #1831 ; 0x727
  14732. 802724c: f7fe ff71 bl 8026132 <USART_ClearITPendingBit>
  14733. }
  14734. if(USART_GetITStatus(UPS_USART, USART_IT_RXNE) != RESET)
  14735. 8027250: 4c11 ldr r4, [pc, #68] ; (8027298 <rs232_irq_handler+0xa0>)
  14736. 8027252: f240 5125 movw r1, #1317 ; 0x525
  14737. 8027256: 4620 mov r0, r4
  14738. 8027258: f7fe ff4b bl 80260f2 <USART_GetITStatus>
  14739. 802725c: b1d8 cbz r0, 8027296 <rs232_irq_handler+0x9e>
  14740. {
  14741. c = (uint32_t)UPS_USART->DR;
  14742. 802725e: 88a3 ldrh r3, [r4, #4]
  14743. //DBG printf("read: %d 0x%x\r\n", rs485_rx_rbuf.write_index,c);
  14744. if (!rbuf_isfull(&ups_rx_rbuf))
  14745. 8027260: 480f ldr r0, [pc, #60] ; (80272a0 <rs232_irq_handler+0xa8>)
  14746. }
  14747. USART_ClearITPendingBit(UPS_USART, USART_IT_TXE);
  14748. }
  14749. if(USART_GetITStatus(UPS_USART, USART_IT_RXNE) != RESET)
  14750. {
  14751. c = (uint32_t)UPS_USART->DR;
  14752. 8027262: b29b uxth r3, r3
  14753. 8027264: 9301 str r3, [sp, #4]
  14754. //DBG printf("read: %d 0x%x\r\n", rs485_rx_rbuf.write_index,c);
  14755. if (!rbuf_isfull(&ups_rx_rbuf))
  14756. 8027266: f002 fb29 bl 80298bc <rbuf_isfull>
  14757. 802726a: b918 cbnz r0, 8027274 <rs232_irq_handler+0x7c>
  14758. rbuf32_put(&ups_rx_rbuf, c);
  14759. 802726c: 480c ldr r0, [pc, #48] ; (80272a0 <rs232_irq_handler+0xa8>)
  14760. 802726e: 9901 ldr r1, [sp, #4]
  14761. 8027270: f002 fb45 bl 80298fe <rbuf32_put>
  14762. USART_ClearITPendingBit(UPS_USART, USART_IT_RXNE);
  14763. 8027274: 4808 ldr r0, [pc, #32] ; (8027298 <rs232_irq_handler+0xa0>)
  14764. xSemaphoreGiveFromISR(xSem_rx_buf, &xHigherPriorityTaskWoken);
  14765. 8027276: 4c0b ldr r4, [pc, #44] ; (80272a4 <rs232_irq_handler+0xac>)
  14766. {
  14767. c = (uint32_t)UPS_USART->DR;
  14768. //DBG printf("read: %d 0x%x\r\n", rs485_rx_rbuf.write_index,c);
  14769. if (!rbuf_isfull(&ups_rx_rbuf))
  14770. rbuf32_put(&ups_rx_rbuf, c);
  14771. USART_ClearITPendingBit(UPS_USART, USART_IT_RXNE);
  14772. 8027278: f240 5125 movw r1, #1317 ; 0x525
  14773. 802727c: f7fe ff59 bl 8026132 <USART_ClearITPendingBit>
  14774. xSemaphoreGiveFromISR(xSem_rx_buf, &xHigherPriorityTaskWoken);
  14775. 8027280: 4b09 ldr r3, [pc, #36] ; (80272a8 <rs232_irq_handler+0xb0>)
  14776. 8027282: 4621 mov r1, r4
  14777. 8027284: 6818 ldr r0, [r3, #0]
  14778. 8027286: f004 f83d bl 802b304 <xQueueGiveFromISR>
  14779. portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
  14780. 802728a: 6823 ldr r3, [r4, #0]
  14781. 802728c: b11b cbz r3, 8027296 <rs232_irq_handler+0x9e>
  14782. 802728e: 4b07 ldr r3, [pc, #28] ; (80272ac <rs232_irq_handler+0xb4>)
  14783. 8027290: f04f 5280 mov.w r2, #268435456 ; 0x10000000
  14784. 8027294: 601a str r2, [r3, #0]
  14785. }
  14786. }
  14787. 8027296: bd1c pop {r2, r3, r4, pc}
  14788. 8027298: 40004400 .word 0x40004400
  14789. 802729c: 2000d3dc .word 0x2000d3dc
  14790. 80272a0: 2000c8ac .word 0x2000c8ac
  14791. 80272a4: 20000b1c .word 0x20000b1c
  14792. 80272a8: 2000d40c .word 0x2000d40c
  14793. 80272ac: e000ed04 .word 0xe000ed04
  14794. 080272b0 <USART1_IRQHandler>:
  14795. void USART1_IRQHandler(void) {
  14796. service_rs232_irq_handler();
  14797. 80272b0: f7ff bf46 b.w 8027140 <service_rs232_irq_handler>
  14798. 080272b4 <USART2_IRQHandler>:
  14799. }
  14800. void USART2_IRQHandler(void) {
  14801. rs232_irq_handler();
  14802. 80272b4: f7ff bfa0 b.w 80271f8 <rs232_irq_handler>
  14803. 080272b8 <USART3_IRQHandler>:
  14804. }
  14805. void USART3_IRQHandler(void) {
  14806. 80272b8: 4770 bx lr
  14807. 80272ba: 0000 movs r0, r0
  14808. 080272bc <InitTask>:
  14809. /**
  14810. * @brief Задача инициализации. Запускает основные задачи девайса и умирает.
  14811. * @retval
  14812. */
  14813. void InitTask(void *params)
  14814. {
  14815. 80272bc: b51f push {r0, r1, r2, r3, r4, lr}
  14816. // -----------------------------------------------------------------------------
  14817. // xTaskCreate(vTaskWdt, "WDT", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
  14818. // -----------------------------------------------------------------------------
  14819. InitUSART();
  14820. 80272be: f7ff fe9d bl 8026ffc <InitUSART>
  14821. ups_megatec_init();
  14822. 80272c2: f002 fabb bl 802983c <ups_megatec_init>
  14823. // -----------------------------------------------------------------------------
  14824. // RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_CRC, ENABLE);
  14825. //SETTINGS_SetDefaultDebug();
  14826. //SETTINGS_Save();
  14827. SETTINGS_Load();
  14828. 80272c6: f001 fd79 bl 8028dbc <SETTINGS_Load>
  14829. if(set_mode_jumper()){
  14830. 80272ca: f001 ffd9 bl 8029280 <set_mode_jumper>
  14831. 80272ce: b138 cbz r0, 80272e0 <InitTask+0x24>
  14832. SETTINGS_SetServiceDef();
  14833. 80272d0: f001 fc36 bl 8028b40 <SETTINGS_SetServiceDef>
  14834. SETTINGS_Save();
  14835. 80272d4: f001 fd1e bl 8028d14 <SETTINGS_Save>
  14836. log_event_data(LOG_PSW_CHANGE, "Сброс к заводскому");
  14837. 80272d8: 2003 movs r0, #3
  14838. 80272da: 4937 ldr r1, [pc, #220] ; (80273b8 <InitTask+0xfc>)
  14839. 80272dc: f002 ffc2 bl 802a264 <log_event_data>
  14840. // -----------------------------------------------------------------------------
  14841. #ifdef LED_ENABLE
  14842. LED_Init();
  14843. /* Простая мигалка для подтверждения живучести контроллера */
  14844. xTaskCreate(vTaskLedBlink, "LED_Blink", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);//&xTaskToKill
  14845. 80272e0: 2400 movs r4, #0
  14846. #endif
  14847. // -----------------------------------------------------------------------------
  14848. // -----------------------------------------------------------------------------
  14849. #ifdef LED_ENABLE
  14850. LED_Init();
  14851. 80272e2: f001 ff29 bl 8029138 <LED_Init>
  14852. /* Простая мигалка для подтверждения живучести контроллера */
  14853. xTaskCreate(vTaskLedBlink, "LED_Blink", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);//&xTaskToKill
  14854. 80272e6: 2280 movs r2, #128 ; 0x80
  14855. 80272e8: 4623 mov r3, r4
  14856. 80272ea: 4934 ldr r1, [pc, #208] ; (80273bc <InitTask+0x100>)
  14857. 80272ec: 9400 str r4, [sp, #0]
  14858. 80272ee: 9401 str r4, [sp, #4]
  14859. 80272f0: 9402 str r4, [sp, #8]
  14860. 80272f2: 9403 str r4, [sp, #12]
  14861. 80272f4: 4832 ldr r0, [pc, #200] ; (80273c0 <InitTask+0x104>)
  14862. 80272f6: f004 f941 bl 802b57c <xTaskGenericCreate>
  14863. #endif
  14864. // -----------------------------------------------------------------------------
  14865. // -----------------------------------------------------------------------------
  14866. #ifdef BUTTON_ENABLE
  14867. BUTTON_Init();
  14868. 80272fa: f001 ff79 bl 80291f0 <BUTTON_Init>
  14869. xTaskCreate(vTaskButtons, "Buttons", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
  14870. 80272fe: 2280 movs r2, #128 ; 0x80
  14871. 8027300: 4623 mov r3, r4
  14872. 8027302: 4930 ldr r1, [pc, #192] ; (80273c4 <InitTask+0x108>)
  14873. 8027304: 9400 str r4, [sp, #0]
  14874. 8027306: 9401 str r4, [sp, #4]
  14875. 8027308: 9402 str r4, [sp, #8]
  14876. 802730a: 9403 str r4, [sp, #12]
  14877. 802730c: 482e ldr r0, [pc, #184] ; (80273c8 <InitTask+0x10c>)
  14878. 802730e: f004 f935 bl 802b57c <xTaskGenericCreate>
  14879. //xTaskCreate( d_inouts_task, "inouts_task", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
  14880. // xTaskCreate( d_inouts_test, "d_inouts_test", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
  14881. // -----------------------------------------------------------------------------
  14882. #ifdef RTC_ENABLE
  14883. TM_RTC_Init(TM_RTC_ClockSource_External); // Так было
  14884. 8027312: 2001 movs r0, #1
  14885. 8027314: f7ff fac6 bl 80268a4 <TM_RTC_Init>
  14886. /* UDP for net settings */
  14887. //UDP_netsetting_init();
  14888. // -----------------------------------------------------------------------------
  14889. #ifdef UPS_ENABLE
  14890. xTaskCreate(UPS_Monitor, "UPS_Monitor", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
  14891. 8027318: 2280 movs r2, #128 ; 0x80
  14892. 802731a: 4623 mov r3, r4
  14893. 802731c: 492b ldr r1, [pc, #172] ; (80273cc <InitTask+0x110>)
  14894. 802731e: 9400 str r4, [sp, #0]
  14895. 8027320: 9401 str r4, [sp, #4]
  14896. 8027322: 9402 str r4, [sp, #8]
  14897. 8027324: 9403 str r4, [sp, #12]
  14898. 8027326: 482a ldr r0, [pc, #168] ; (80273d0 <InitTask+0x114>)
  14899. 8027328: f004 f928 bl 802b57c <xTaskGenericCreate>
  14900. #endif
  14901. // -----------------------------------------------------------------------------
  14902. /* Random number generator */
  14903. RNG_Init();
  14904. 802732c: f7ff f8a2 bl 8026474 <RNG_Init>
  14905. // -----------------------------------------------------------------------------
  14906. #ifdef NET_ENABLE
  14907. ETH_BSP_Config();
  14908. 8027330: f011 f83a bl 80383a8 <ETH_BSP_Config>
  14909. LwIP_Init();
  14910. 8027334: f010 fa4a bl 80377cc <LwIP_Init>
  14911. #ifdef WEB_SERVER_ENABLE
  14912. HTTP_Init();
  14913. 8027338: f005 f982 bl 802c640 <HTTP_Init>
  14914. #endif
  14915. #ifdef SNMP_ENABLE
  14916. SNMP_Init();
  14917. 802733c: f010 fdf6 bl 8037f2c <SNMP_Init>
  14918. xTaskCreate(SNMP_SysUpTimeTask, "snmpSysUpTime", configMINIMAL_STACK_SIZE,
  14919. 8027340: 2280 movs r2, #128 ; 0x80
  14920. 8027342: 4623 mov r3, r4
  14921. 8027344: 9400 str r4, [sp, #0]
  14922. 8027346: 9401 str r4, [sp, #4]
  14923. 8027348: 9402 str r4, [sp, #8]
  14924. 802734a: 9403 str r4, [sp, #12]
  14925. 802734c: 4921 ldr r1, [pc, #132] ; (80273d4 <InitTask+0x118>)
  14926. 802734e: 4822 ldr r0, [pc, #136] ; (80273d8 <InitTask+0x11c>)
  14927. 8027350: f004 f914 bl 802b57c <xTaskGenericCreate>
  14928. NULL, tskIDLE_PRIORITY, NULL);
  14929. xTaskCreate(snmp_trap_tread, "snmpTrapTest", 3*configMINIMAL_STACK_SIZE,
  14930. 8027354: 4623 mov r3, r4
  14931. 8027356: 4921 ldr r1, [pc, #132] ; (80273dc <InitTask+0x120>)
  14932. 8027358: 9400 str r4, [sp, #0]
  14933. 802735a: f44f 72c0 mov.w r2, #384 ; 0x180
  14934. 802735e: 9401 str r4, [sp, #4]
  14935. 8027360: 9402 str r4, [sp, #8]
  14936. 8027362: 9403 str r4, [sp, #12]
  14937. 8027364: 481e ldr r0, [pc, #120] ; (80273e0 <InitTask+0x124>)
  14938. 8027366: f004 f909 bl 802b57c <xTaskGenericCreate>
  14939. #endif
  14940. #endif
  14941. // -----------------------------------------------------------------------------
  14942. /* SNTP */
  14943. SNTP_Init();
  14944. 802736a: f010 fe7b bl 8038064 <SNTP_Init>
  14945. xTaskCreate(vTaskOnceSynchro, "sntpOnceSinhro", 2*configMINIMAL_STACK_SIZE,
  14946. 802736e: 4b1d ldr r3, [pc, #116] ; (80273e4 <InitTask+0x128>)
  14947. 8027370: 9400 str r4, [sp, #0]
  14948. 8027372: 9301 str r3, [sp, #4]
  14949. 8027374: 9402 str r4, [sp, #8]
  14950. 8027376: 4623 mov r3, r4
  14951. 8027378: 9403 str r4, [sp, #12]
  14952. 802737a: 491b ldr r1, [pc, #108] ; (80273e8 <InitTask+0x12c>)
  14953. 802737c: 481b ldr r0, [pc, #108] ; (80273ec <InitTask+0x130>)
  14954. 802737e: f44f 7280 mov.w r2, #256 ; 0x100
  14955. 8027382: f004 f8fb bl 802b57c <xTaskGenericCreate>
  14956. NULL, tskIDLE_PRIORITY, &xHandleSntpOnceSinhro);
  14957. xTaskCreate(vTaskPeriodicSynchro, "sntpPeriodicSinhro", 2*configMINIMAL_STACK_SIZE,
  14958. 8027386: 491a ldr r1, [pc, #104] ; (80273f0 <InitTask+0x134>)
  14959. 8027388: 9400 str r4, [sp, #0]
  14960. 802738a: f44f 7280 mov.w r2, #256 ; 0x100
  14961. 802738e: 4623 mov r3, r4
  14962. 8027390: 9401 str r4, [sp, #4]
  14963. 8027392: 9402 str r4, [sp, #8]
  14964. 8027394: 9403 str r4, [sp, #12]
  14965. 8027396: 4817 ldr r0, [pc, #92] ; (80273f4 <InitTask+0x138>)
  14966. 8027398: f004 f8f0 bl 802b57c <xTaskGenericCreate>
  14967. //TEST_IO();
  14968. /* Контроль успешной загрузки. Сброс флага bootry */
  14969. /* Сброс флага и сохранение нового значения во флеш памяти происходт после
  14970. некоторой задержки для запуска всех задач */
  14971. vTaskDelay(4000);
  14972. 802739c: f44f 607a mov.w r0, #4000 ; 0xfa0
  14973. 80273a0: f004 fb86 bl 802bab0 <vTaskDelay>
  14974. SETTINGS_ResetBootTry();
  14975. 80273a4: f001 fd3e bl 8028e24 <SETTINGS_ResetBootTry>
  14976. /* if (!dhcp)
  14977. SNMP_SendUserTrap(DEVICE_REBOOTED);
  14978. printf("Hello world\r\n");*/
  14979. vTaskDelete(NULL);
  14980. 80273a8: 4620 mov r0, r4
  14981. 80273aa: f004 f9bf bl 802b72c <vTaskDelete>
  14982. taskYIELD();
  14983. }
  14984. 80273ae: b004 add sp, #16
  14985. 80273b0: e8bd 4010 ldmia.w sp!, {r4, lr}
  14986. SNMP_SendUserTrap(DEVICE_REBOOTED);
  14987. printf("Hello world\r\n");*/
  14988. vTaskDelete(NULL);
  14989. taskYIELD();
  14990. 80273b4: f004 bddc b.w 802bf70 <vPortYield>
  14991. 80273b8: 08039000 .word 0x08039000
  14992. 80273bc: 08039023 .word 0x08039023
  14993. 80273c0: 0802915d .word 0x0802915d
  14994. 80273c4: 0803902d .word 0x0803902d
  14995. 80273c8: 0802926d .word 0x0802926d
  14996. 80273cc: 08039035 .word 0x08039035
  14997. 80273d0: 0802a019 .word 0x0802a019
  14998. 80273d4: 08039041 .word 0x08039041
  14999. 80273d8: 08037cc5 .word 0x08037cc5
  15000. 80273dc: 0803904f .word 0x0803904f
  15001. 80273e0: 08037e25 .word 0x08037e25
  15002. 80273e4: 20000b20 .word 0x20000b20
  15003. 80273e8: 0803905c .word 0x0803905c
  15004. 80273ec: 08038131 .word 0x08038131
  15005. 80273f0: 0803906b .word 0x0803906b
  15006. 80273f4: 080380e9 .word 0x080380e9
  15007. 080273f8 <main>:
  15008. void vApplicationTickHook(void) {
  15009. }
  15010. int main()
  15011. {
  15012. 80273f8: b51f push {r0, r1, r2, r3, r4, lr}
  15013. TIM_Cmd(TIM13, DISABLE);
  15014. 80273fa: 4c22 ldr r4, [pc, #136] ; (8027484 <main+0x8c>)
  15015. 80273fc: 2100 movs r1, #0
  15016. 80273fe: 4620 mov r0, r4
  15017. 8027400: f7fe fd8c bl 8025f1c <TIM_Cmd>
  15018. TIM_ClearITPendingBit(TIM13, TIM_IT_Update);
  15019. 8027404: 4620 mov r0, r4
  15020. 8027406: 2101 movs r1, #1
  15021. 8027408: f7fe fd9d bl 8025f46 <TIM_ClearITPendingBit>
  15022. This function disables IRQ interrupts by setting the I-bit in the CPSR.
  15023. Can only be executed in Privileged modes.
  15024. */
  15025. __attribute__( ( always_inline ) ) __STATIC_INLINE void __disable_irq(void)
  15026. {
  15027. __ASM volatile ("cpsid i" : : : "memory");
  15028. 802740c: b672 cpsid i
  15029. __disable_irq();
  15030. NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x20000);
  15031. 802740e: f04f 6000 mov.w r0, #134217728 ; 0x8000000
  15032. 8027412: f44f 3100 mov.w r1, #131072 ; 0x20000
  15033. 8027416: f7fe f903 bl 8025620 <NVIC_SetVectorTable>
  15034. __STATIC_INLINE void NVIC_SetPriorityGrouping(uint32_t PriorityGroup)
  15035. {
  15036. uint32_t reg_value;
  15037. uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07); /* only values 0..7 are used */
  15038. reg_value = SCB->AIRCR; /* read old register configuration */
  15039. 802741a: 4a1b ldr r2, [pc, #108] ; (8027488 <main+0x90>)
  15040. 802741c: 68d1 ldr r1, [r2, #12]
  15041. reg_value &= ~(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk); /* clear bits to change */
  15042. 802741e: f64f 03ff movw r3, #63743 ; 0xf8ff
  15043. 8027422: 400b ands r3, r1
  15044. reg_value = (reg_value |
  15045. 8027424: f043 63bf orr.w r3, r3, #100139008 ; 0x5f80000
  15046. 8027428: f443 3300 orr.w r3, r3, #131072 ; 0x20000
  15047. ((uint32_t)0x5FA << SCB_AIRCR_VECTKEY_Pos) |
  15048. (PriorityGroupTmp << 8)); /* Insert write key and priorty group */
  15049. SCB->AIRCR = reg_value;
  15050. 802742c: 60d3 str r3, [r2, #12]
  15051. NVIC_SetPriorityGrouping(0);
  15052. NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );
  15053. 802742e: f44f 7040 mov.w r0, #768 ; 0x300
  15054. 8027432: f7fe f8b7 bl 80255a4 <NVIC_PriorityGroupConfig>
  15055. This function enables IRQ interrupts by clearing the I-bit in the CPSR.
  15056. Can only be executed in Privileged modes.
  15057. */
  15058. __attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_irq(void)
  15059. {
  15060. __ASM volatile ("cpsie i" : : : "memory");
  15061. 8027436: b662 cpsie i
  15062. __enable_irq();
  15063. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_CRC, ENABLE);
  15064. 8027438: 2101 movs r1, #1
  15065. 802743a: f44f 5080 mov.w r0, #4096 ; 0x1000
  15066. 802743e: f7fe fb11 bl 8025a64 <RCC_AHB1PeriphClockCmd>
  15067. /* Clear flash error flags if were set */
  15068. FLASH_ClearFlag(FLASH_FLAG_PGPERR);
  15069. 8027442: 2040 movs r0, #64 ; 0x40
  15070. 8027444: f7fe f922 bl 802568c <FLASH_ClearFlag>
  15071. FLASH_ClearFlag(FLASH_FLAG_PGSERR);
  15072. 8027448: 2080 movs r0, #128 ; 0x80
  15073. 802744a: f7fe f91f bl 802568c <FLASH_ClearFlag>
  15074. log_init(false);
  15075. //log_test();
  15076. //spi_flash_test();
  15077. // NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
  15078. xTaskCreate( InitTask, "InitTask", 1000, NULL, tskIDLE_PRIORITY, NULL);
  15079. 802744e: 2400 movs r4, #0
  15080. /* Clear flash error flags if were set */
  15081. FLASH_ClearFlag(FLASH_FLAG_PGPERR);
  15082. FLASH_ClearFlag(FLASH_FLAG_PGSERR);
  15083. gpio_init();
  15084. 8027450: f7fe ffac bl 80263ac <gpio_init>
  15085. WDG_Init();
  15086. 8027454: f001 fe26 bl 80290a4 <WDG_Init>
  15087. spi_flash_init();
  15088. 8027458: f7ff fcae bl 8026db8 <spi_flash_init>
  15089. log_init(false);
  15090. 802745c: 2000 movs r0, #0
  15091. 802745e: f002 fe39 bl 802a0d4 <log_init>
  15092. //log_test();
  15093. //spi_flash_test();
  15094. // NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
  15095. xTaskCreate( InitTask, "InitTask", 1000, NULL, tskIDLE_PRIORITY, NULL);
  15096. 8027462: 490a ldr r1, [pc, #40] ; (802748c <main+0x94>)
  15097. 8027464: 9400 str r4, [sp, #0]
  15098. 8027466: f44f 727a mov.w r2, #1000 ; 0x3e8
  15099. 802746a: 4623 mov r3, r4
  15100. 802746c: 9401 str r4, [sp, #4]
  15101. 802746e: 9402 str r4, [sp, #8]
  15102. 8027470: 9403 str r4, [sp, #12]
  15103. 8027472: 4807 ldr r0, [pc, #28] ; (8027490 <main+0x98>)
  15104. 8027474: f004 f882 bl 802b57c <xTaskGenericCreate>
  15105. vTaskStartScheduler();
  15106. 8027478: f004 f9b2 bl 802b7e0 <vTaskStartScheduler>
  15107. /*while(1)
  15108. {
  15109. }*/
  15110. }
  15111. 802747c: 4620 mov r0, r4
  15112. 802747e: b004 add sp, #16
  15113. 8027480: bd10 pop {r4, pc}
  15114. 8027482: bf00 nop
  15115. 8027484: 40001c00 .word 0x40001c00
  15116. 8027488: e000ed00 .word 0xe000ed00
  15117. 802748c: 0803907e .word 0x0803907e
  15118. 8027490: 080272bd .word 0x080272bd
  15119. 08027494 <NMI_Handler>:
  15120. * @brief This function handles NMI exception.
  15121. * @param None
  15122. * @retval None
  15123. */
  15124. void NMI_Handler(void)
  15125. {
  15126. 8027494: 4770 bx lr
  15127. 8027496: 0000 movs r0, r0
  15128. 08027498 <HardFault_Output>:
  15129. }
  15130. void HardFault_Output(uint32_t *sp)
  15131. {
  15132. 8027498: e92d 4ff7 stmdb sp!, {r0, r1, r2, r4, r5, r6, r7, r8, r9, sl, fp, lr}
  15133. uint32_t r0 = sp[0];
  15134. uint32_t r1 = sp[1];
  15135. 802749c: e890 0808 ldmia.w r0, {r3, fp}
  15136. uint32_t r2 = sp[2];
  15137. 80274a0: f8d0 a008 ldr.w sl, [r0, #8]
  15138. uint32_t r3 = sp[3];
  15139. 80274a4: f8d0 900c ldr.w r9, [r0, #12]
  15140. uint32_t r12 = sp[4];
  15141. 80274a8: f8d0 8010 ldr.w r8, [r0, #16]
  15142. uint32_t lr = sp[5];
  15143. 80274ac: 6947 ldr r7, [r0, #20]
  15144. uint32_t pc = sp[6];
  15145. 80274ae: 6986 ldr r6, [r0, #24]
  15146. uint32_t psr = sp[7];
  15147. 80274b0: 69c5 ldr r5, [r0, #28]
  15148. printf("HardFault:\n\r");
  15149. 80274b2: 9301 str r3, [sp, #4]
  15150. void NMI_Handler(void)
  15151. {
  15152. }
  15153. void HardFault_Output(uint32_t *sp)
  15154. {
  15155. 80274b4: 4604 mov r4, r0
  15156. uint32_t r12 = sp[4];
  15157. uint32_t lr = sp[5];
  15158. uint32_t pc = sp[6];
  15159. uint32_t psr = sp[7];
  15160. printf("HardFault:\n\r");
  15161. 80274b6: 4816 ldr r0, [pc, #88] ; (8027510 <HardFault_Output+0x78>)
  15162. 80274b8: f000 fbca bl 8027c50 <tfp_printf>
  15163. /* Print CFSR register */
  15164. /* Print CPU registers */
  15165. printf("\n\rRegisters:\n\r");
  15166. 80274bc: 4815 ldr r0, [pc, #84] ; (8027514 <HardFault_Output+0x7c>)
  15167. 80274be: f000 fbc7 bl 8027c50 <tfp_printf>
  15168. printf("SP 0x%08lx\n\r", (uint32_t)sp);
  15169. 80274c2: 4815 ldr r0, [pc, #84] ; (8027518 <HardFault_Output+0x80>)
  15170. 80274c4: 4621 mov r1, r4
  15171. 80274c6: f000 fbc3 bl 8027c50 <tfp_printf>
  15172. printf("R0 0x%08lx\n\r", r0);
  15173. 80274ca: 9b01 ldr r3, [sp, #4]
  15174. 80274cc: 4813 ldr r0, [pc, #76] ; (802751c <HardFault_Output+0x84>)
  15175. 80274ce: 4619 mov r1, r3
  15176. 80274d0: f000 fbbe bl 8027c50 <tfp_printf>
  15177. printf("R1 0x%08lx\n\r", r1);
  15178. 80274d4: 4812 ldr r0, [pc, #72] ; (8027520 <HardFault_Output+0x88>)
  15179. 80274d6: 4659 mov r1, fp
  15180. 80274d8: f000 fbba bl 8027c50 <tfp_printf>
  15181. printf("R2 0x%08lx\n\r", r2);
  15182. 80274dc: 4811 ldr r0, [pc, #68] ; (8027524 <HardFault_Output+0x8c>)
  15183. 80274de: 4651 mov r1, sl
  15184. 80274e0: f000 fbb6 bl 8027c50 <tfp_printf>
  15185. printf("R3 0x%08lx\n\r", r3);
  15186. 80274e4: 4810 ldr r0, [pc, #64] ; (8027528 <HardFault_Output+0x90>)
  15187. 80274e6: 4649 mov r1, r9
  15188. 80274e8: f000 fbb2 bl 8027c50 <tfp_printf>
  15189. printf("R12 0x%08lx\n\r", r12);
  15190. 80274ec: 480f ldr r0, [pc, #60] ; (802752c <HardFault_Output+0x94>)
  15191. 80274ee: 4641 mov r1, r8
  15192. 80274f0: f000 fbae bl 8027c50 <tfp_printf>
  15193. printf("LR 0x%08lx\n\r", lr);
  15194. 80274f4: 480e ldr r0, [pc, #56] ; (8027530 <HardFault_Output+0x98>)
  15195. 80274f6: 4639 mov r1, r7
  15196. 80274f8: f000 fbaa bl 8027c50 <tfp_printf>
  15197. printf("PC 0x%08lx\n\r", pc);
  15198. 80274fc: 480d ldr r0, [pc, #52] ; (8027534 <HardFault_Output+0x9c>)
  15199. 80274fe: 4631 mov r1, r6
  15200. 8027500: f000 fba6 bl 8027c50 <tfp_printf>
  15201. printf("PSR 0x%08lx\n\r", psr);
  15202. 8027504: 480c ldr r0, [pc, #48] ; (8027538 <HardFault_Output+0xa0>)
  15203. 8027506: 4629 mov r1, r5
  15204. 8027508: f000 fba2 bl 8027c50 <tfp_printf>
  15205. 802750c: e7fe b.n 802750c <HardFault_Output+0x74>
  15206. 802750e: bf00 nop
  15207. 8027510: 08039087 .word 0x08039087
  15208. 8027514: 08039094 .word 0x08039094
  15209. 8027518: 080390a3 .word 0x080390a3
  15210. 802751c: 080390b9 .word 0x080390b9
  15211. 8027520: 080390cf .word 0x080390cf
  15212. 8027524: 080390e5 .word 0x080390e5
  15213. 8027528: 080390fb .word 0x080390fb
  15214. 802752c: 08039111 .word 0x08039111
  15215. 8027530: 08039127 .word 0x08039127
  15216. 8027534: 0803913d .word 0x0803913d
  15217. 8027538: 08039153 .word 0x08039153
  15218. 0802753c <HardFault_Handler>:
  15219. */
  15220. #if defined ( __GNUC__ )
  15221. __attribute__( (naked) )
  15222. void HardFault_Handler(void)
  15223. {
  15224. __asm volatile
  15225. 802753c: f01e 0f04 tst.w lr, #4
  15226. 8027540: bf0c ite eq
  15227. 8027542: f3ef 8008 mrseq r0, MSP
  15228. 8027546: f3ef 8009 mrsne r0, PSP
  15229. 802754a: f8df 1004 ldr.w r1, [pc, #4] ; 8027550 <debugHardfault_address>
  15230. 802754e: 4708 bx r1
  15231. 08027550 <debugHardfault_address>:
  15232. 8027550: 08027499 .word 0x08027499
  15233. 08027554 <MemManage_Handler>:
  15234. * @brief This function handles Memory Manage exception.
  15235. * @param None
  15236. * @retval None
  15237. */
  15238. void MemManage_Handler(void)
  15239. {
  15240. 8027554: e7fe b.n 8027554 <MemManage_Handler>
  15241. 08027556 <BusFault_Handler>:
  15242. * @brief This function handles Bus Fault exception.
  15243. * @param None
  15244. * @retval None
  15245. */
  15246. void BusFault_Handler(void)
  15247. {
  15248. 8027556: e7fe b.n 8027556 <BusFault_Handler>
  15249. 08027558 <UsageFault_Handler>:
  15250. * @brief This function handles Usage Fault exception.
  15251. * @param None
  15252. * @retval None
  15253. */
  15254. void UsageFault_Handler(void)
  15255. {
  15256. 8027558: e7fe b.n 8027558 <UsageFault_Handler>
  15257. 0802755a <DebugMon_Handler>:
  15258. * @brief This function handles Debug Monitor exception.
  15259. * @param None
  15260. * @retval None
  15261. */
  15262. void DebugMon_Handler(void)
  15263. {
  15264. 802755a: 4770 bx lr
  15265. 0802755c <SDIO_IRQHandler>:
  15266. /*void PPP_IRQHandler(void)
  15267. {
  15268. }*/
  15269. void SDIO_IRQHandler(void)
  15270. {
  15271. 802755c: 4770 bx lr
  15272. 802755e: 0000 movs r0, r0
  15273. 08027560 <ETH_IRQHandler>:
  15274. * @brief This function handles ethernet DMA interrupt request.
  15275. * @param None
  15276. * @retval None
  15277. */
  15278. void ETH_IRQHandler(void)
  15279. {
  15280. 8027560: b507 push {r0, r1, r2, lr}
  15281. portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
  15282. 8027562: 2300 movs r3, #0
  15283. /* Frame received */
  15284. if ( ETH_GetDMAFlagStatus(ETH_DMA_FLAG_R) == SET)
  15285. 8027564: 2040 movs r0, #64 ; 0x40
  15286. * @param None
  15287. * @retval None
  15288. */
  15289. void ETH_IRQHandler(void)
  15290. {
  15291. portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
  15292. 8027566: 9301 str r3, [sp, #4]
  15293. /* Frame received */
  15294. if ( ETH_GetDMAFlagStatus(ETH_DMA_FLAG_R) == SET)
  15295. 8027568: f011 f9bc bl 80388e4 <ETH_GetDMAFlagStatus>
  15296. 802756c: 2801 cmp r0, #1
  15297. 802756e: d104 bne.n 802757a <ETH_IRQHandler+0x1a>
  15298. {
  15299. /* Give the semaphore to wakeup LwIP task */
  15300. xSemaphoreGiveFromISR( s_xSemaphore, &xHigherPriorityTaskWoken );
  15301. 8027570: 4b09 ldr r3, [pc, #36] ; (8027598 <ETH_IRQHandler+0x38>)
  15302. 8027572: a901 add r1, sp, #4
  15303. 8027574: 6818 ldr r0, [r3, #0]
  15304. 8027576: f003 fec5 bl 802b304 <xQueueGiveFromISR>
  15305. }
  15306. /* Clear the interrupt flags. */
  15307. /* Clear the Eth DMA Rx IT pending bits */
  15308. ETH_DMAClearITPendingBit(ETH_DMA_IT_R);
  15309. 802757a: 2040 movs r0, #64 ; 0x40
  15310. 802757c: f011 f9c8 bl 8038910 <ETH_DMAClearITPendingBit>
  15311. ETH_DMAClearITPendingBit(ETH_DMA_IT_NIS);
  15312. 8027580: f44f 3080 mov.w r0, #65536 ; 0x10000
  15313. 8027584: f011 f9c4 bl 8038910 <ETH_DMAClearITPendingBit>
  15314. // Switch tasks if necessary. */
  15315. if( xHigherPriorityTaskWoken != pdFALSE )
  15316. 8027588: 9b01 ldr r3, [sp, #4]
  15317. 802758a: b11b cbz r3, 8027594 <ETH_IRQHandler+0x34>
  15318. {
  15319. portEND_SWITCHING_ISR( xHigherPriorityTaskWoken );
  15320. 802758c: 4b03 ldr r3, [pc, #12] ; (802759c <ETH_IRQHandler+0x3c>)
  15321. 802758e: f04f 5280 mov.w r2, #268435456 ; 0x10000000
  15322. 8027592: 601a str r2, [r3, #0]
  15323. }
  15324. }
  15325. 8027594: bd0e pop {r1, r2, r3, pc}
  15326. 8027596: bf00 nop
  15327. 8027598: 2000c820 .word 0x2000c820
  15328. 802759c: e000ed04 .word 0xe000ed04
  15329. 080275a0 <ulli2a>:
  15330. #ifdef PRINTF_LONG_LONG_SUPPORT
  15331. static void _TFP_GCC_NO_INLINE_ ulli2a(
  15332. unsigned long long int num, struct param *p)
  15333. {
  15334. 80275a0: e92d 4ff8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, lr}
  15335. int n = 0;
  15336. unsigned long long int d = 1;
  15337. char *bf = p->bf;
  15338. while (num / d >= p->base)
  15339. 80275a4: 68d3 ldr r3, [r2, #12]
  15340. static void _TFP_GCC_NO_INLINE_ ulli2a(
  15341. unsigned long long int num, struct param *p)
  15342. {
  15343. int n = 0;
  15344. unsigned long long int d = 1;
  15345. char *bf = p->bf;
  15346. 80275a6: f8d2 b010 ldr.w fp, [r2, #16]
  15347. #ifdef PRINTF_LONG_LONG_SUPPORT
  15348. static void _TFP_GCC_NO_INLINE_ ulli2a(
  15349. unsigned long long int num, struct param *p)
  15350. {
  15351. 80275aa: 4681 mov r9, r0
  15352. 80275ac: 468a mov sl, r1
  15353. 80275ae: 4690 mov r8, r2
  15354. int n = 0;
  15355. unsigned long long int d = 1;
  15356. char *bf = p->bf;
  15357. while (num / d >= p->base)
  15358. 80275b0: 461e mov r6, r3
  15359. 80275b2: 2700 movs r7, #0
  15360. #ifdef PRINTF_LONG_LONG_SUPPORT
  15361. static void _TFP_GCC_NO_INLINE_ ulli2a(
  15362. unsigned long long int num, struct param *p)
  15363. {
  15364. int n = 0;
  15365. unsigned long long int d = 1;
  15366. 80275b4: 2401 movs r4, #1
  15367. 80275b6: 2500 movs r5, #0
  15368. char *bf = p->bf;
  15369. while (num / d >= p->base)
  15370. 80275b8: e006 b.n 80275c8 <ulli2a+0x28>
  15371. d *= p->base;
  15372. 80275ba: fb04 f307 mul.w r3, r4, r7
  15373. 80275be: fb06 3305 mla r3, r6, r5, r3
  15374. 80275c2: fba4 4506 umull r4, r5, r4, r6
  15375. 80275c6: 195d adds r5, r3, r5
  15376. unsigned long long int num, struct param *p)
  15377. {
  15378. int n = 0;
  15379. unsigned long long int d = 1;
  15380. char *bf = p->bf;
  15381. while (num / d >= p->base)
  15382. 80275c8: 4648 mov r0, r9
  15383. 80275ca: 4651 mov r1, sl
  15384. 80275cc: 4622 mov r2, r4
  15385. 80275ce: 462b mov r3, r5
  15386. 80275d0: f7f9 fe38 bl 8021244 <__aeabi_uldivmod>
  15387. 80275d4: 42b9 cmp r1, r7
  15388. 80275d6: bf08 it eq
  15389. 80275d8: 42b0 cmpeq r0, r6
  15390. 80275da: d2ee bcs.n 80275ba <ulli2a+0x1a>
  15391. 80275dc: 2600 movs r6, #0
  15392. 80275de: e02d b.n 802763c <ulli2a+0x9c>
  15393. d *= p->base;
  15394. while (d != 0) {
  15395. int dgt = num / d;
  15396. 80275e0: 4622 mov r2, r4
  15397. 80275e2: 462b mov r3, r5
  15398. 80275e4: 4648 mov r0, r9
  15399. 80275e6: 4651 mov r1, sl
  15400. 80275e8: f7f9 fe2c bl 8021244 <__aeabi_uldivmod>
  15401. num %= d;
  15402. 80275ec: 4651 mov r1, sl
  15403. 80275ee: 4622 mov r2, r4
  15404. 80275f0: 462b mov r3, r5
  15405. unsigned long long int d = 1;
  15406. char *bf = p->bf;
  15407. while (num / d >= p->base)
  15408. d *= p->base;
  15409. while (d != 0) {
  15410. int dgt = num / d;
  15411. 80275f2: 4607 mov r7, r0
  15412. num %= d;
  15413. 80275f4: 4648 mov r0, r9
  15414. 80275f6: f7f9 fe25 bl 8021244 <__aeabi_uldivmod>
  15415. d /= p->base;
  15416. 80275fa: 4620 mov r0, r4
  15417. 80275fc: 4629 mov r1, r5
  15418. char *bf = p->bf;
  15419. while (num / d >= p->base)
  15420. d *= p->base;
  15421. while (d != 0) {
  15422. int dgt = num / d;
  15423. num %= d;
  15424. 80275fe: 4691 mov r9, r2
  15425. 8027600: 469a mov sl, r3
  15426. d /= p->base;
  15427. 8027602: f8d8 200c ldr.w r2, [r8, #12]
  15428. 8027606: 2300 movs r3, #0
  15429. 8027608: f7f9 fe1c bl 8021244 <__aeabi_uldivmod>
  15430. 802760c: 4604 mov r4, r0
  15431. 802760e: 460d mov r5, r1
  15432. if (n || dgt > 0 || d == 0) {
  15433. 8027610: b926 cbnz r6, 802761c <ulli2a+0x7c>
  15434. 8027612: 2f00 cmp r7, #0
  15435. 8027614: dc02 bgt.n 802761c <ulli2a+0x7c>
  15436. 8027616: ea54 0305 orrs.w r3, r4, r5
  15437. 802761a: d1e1 bne.n 80275e0 <ulli2a+0x40>
  15438. *bf++ = dgt + (dgt < 10 ? '0' : (p->uc ? 'A' : 'a') - 10);
  15439. 802761c: 2f09 cmp r7, #9
  15440. 802761e: b2fa uxtb r2, r7
  15441. 8027620: dd07 ble.n 8027632 <ulli2a+0x92>
  15442. 8027622: f898 3000 ldrb.w r3, [r8]
  15443. 8027626: f013 0f04 tst.w r3, #4
  15444. 802762a: bf0c ite eq
  15445. 802762c: 2357 moveq r3, #87 ; 0x57
  15446. 802762e: 2337 movne r3, #55 ; 0x37
  15447. 8027630: e000 b.n 8027634 <ulli2a+0x94>
  15448. 8027632: 2330 movs r3, #48 ; 0x30
  15449. 8027634: 189b adds r3, r3, r2
  15450. 8027636: f80b 3b01 strb.w r3, [fp], #1
  15451. ++n;
  15452. 802763a: 3601 adds r6, #1
  15453. int n = 0;
  15454. unsigned long long int d = 1;
  15455. char *bf = p->bf;
  15456. while (num / d >= p->base)
  15457. d *= p->base;
  15458. while (d != 0) {
  15459. 802763c: ea54 0305 orrs.w r3, r4, r5
  15460. 8027640: d1ce bne.n 80275e0 <ulli2a+0x40>
  15461. if (n || dgt > 0 || d == 0) {
  15462. *bf++ = dgt + (dgt < 10 ? '0' : (p->uc ? 'A' : 'a') - 10);
  15463. ++n;
  15464. }
  15465. }
  15466. *bf = 0;
  15467. 8027642: 2300 movs r3, #0
  15468. 8027644: f88b 3000 strb.w r3, [fp]
  15469. 8027648: e8bd 8ff8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc}
  15470. 0802764c <uli2a>:
  15471. }
  15472. #endif
  15473. #ifdef PRINTF_LONG_SUPPORT
  15474. static void uli2a(unsigned long int num, struct param *p)
  15475. {
  15476. 802764c: b570 push {r4, r5, r6, lr}
  15477. int n = 0;
  15478. unsigned long int d = 1;
  15479. char *bf = p->bf;
  15480. while (num / d >= p->base)
  15481. 802764e: 68ca ldr r2, [r1, #12]
  15482. #ifdef PRINTF_LONG_SUPPORT
  15483. static void uli2a(unsigned long int num, struct param *p)
  15484. {
  15485. int n = 0;
  15486. unsigned long int d = 1;
  15487. char *bf = p->bf;
  15488. 8027650: 690c ldr r4, [r1, #16]
  15489. #ifdef PRINTF_LONG_SUPPORT
  15490. static void uli2a(unsigned long int num, struct param *p)
  15491. {
  15492. int n = 0;
  15493. unsigned long int d = 1;
  15494. 8027652: 2301 movs r3, #1
  15495. char *bf = p->bf;
  15496. while (num / d >= p->base)
  15497. 8027654: e000 b.n 8027658 <uli2a+0xc>
  15498. d *= p->base;
  15499. 8027656: 4353 muls r3, r2
  15500. static void uli2a(unsigned long int num, struct param *p)
  15501. {
  15502. int n = 0;
  15503. unsigned long int d = 1;
  15504. char *bf = p->bf;
  15505. while (num / d >= p->base)
  15506. 8027658: fbb0 f5f3 udiv r5, r0, r3
  15507. 802765c: 4295 cmp r5, r2
  15508. 802765e: d2fa bcs.n 8027656 <uli2a+0xa>
  15509. 8027660: 2500 movs r5, #0
  15510. 8027662: e01a b.n 802769a <uli2a+0x4e>
  15511. d *= p->base;
  15512. while (d != 0) {
  15513. int dgt = num / d;
  15514. num %= d;
  15515. d /= p->base;
  15516. 8027664: 68ce ldr r6, [r1, #12]
  15517. unsigned long int d = 1;
  15518. char *bf = p->bf;
  15519. while (num / d >= p->base)
  15520. d *= p->base;
  15521. while (d != 0) {
  15522. int dgt = num / d;
  15523. 8027666: fbb0 f2f3 udiv r2, r0, r3
  15524. num %= d;
  15525. 802766a: fb03 0012 mls r0, r3, r2, r0
  15526. d /= p->base;
  15527. 802766e: fbb3 f3f6 udiv r3, r3, r6
  15528. if (n || dgt > 0 || d == 0) {
  15529. 8027672: b91d cbnz r5, 802767c <uli2a+0x30>
  15530. 8027674: 2a00 cmp r2, #0
  15531. 8027676: dc01 bgt.n 802767c <uli2a+0x30>
  15532. 8027678: 2b00 cmp r3, #0
  15533. 802767a: d1f3 bne.n 8027664 <uli2a+0x18>
  15534. *bf++ = dgt + (dgt < 10 ? '0' : (p->uc ? 'A' : 'a') - 10);
  15535. 802767c: 2a09 cmp r2, #9
  15536. 802767e: b2d6 uxtb r6, r2
  15537. 8027680: dd06 ble.n 8027690 <uli2a+0x44>
  15538. 8027682: 780a ldrb r2, [r1, #0]
  15539. 8027684: f012 0f04 tst.w r2, #4
  15540. 8027688: bf0c ite eq
  15541. 802768a: 2257 moveq r2, #87 ; 0x57
  15542. 802768c: 2237 movne r2, #55 ; 0x37
  15543. 802768e: e000 b.n 8027692 <uli2a+0x46>
  15544. 8027690: 2230 movs r2, #48 ; 0x30
  15545. 8027692: 1992 adds r2, r2, r6
  15546. 8027694: f804 2b01 strb.w r2, [r4], #1
  15547. ++n;
  15548. 8027698: 3501 adds r5, #1
  15549. int n = 0;
  15550. unsigned long int d = 1;
  15551. char *bf = p->bf;
  15552. while (num / d >= p->base)
  15553. d *= p->base;
  15554. while (d != 0) {
  15555. 802769a: 2b00 cmp r3, #0
  15556. 802769c: d1e2 bne.n 8027664 <uli2a+0x18>
  15557. if (n || dgt > 0 || d == 0) {
  15558. *bf++ = dgt + (dgt < 10 ? '0' : (p->uc ? 'A' : 'a') - 10);
  15559. ++n;
  15560. }
  15561. }
  15562. *bf = 0;
  15563. 802769e: 7023 strb r3, [r4, #0]
  15564. 80276a0: bd70 pop {r4, r5, r6, pc}
  15565. 080276a2 <ui2a>:
  15566. uli2a(num, p);
  15567. }
  15568. #endif
  15569. static void ui2a(unsigned int num, struct param *p)
  15570. {
  15571. 80276a2: b570 push {r4, r5, r6, lr}
  15572. int n = 0;
  15573. unsigned int d = 1;
  15574. char *bf = p->bf;
  15575. while (num / d >= p->base)
  15576. 80276a4: 68ca ldr r2, [r1, #12]
  15577. static void ui2a(unsigned int num, struct param *p)
  15578. {
  15579. int n = 0;
  15580. unsigned int d = 1;
  15581. char *bf = p->bf;
  15582. 80276a6: 690c ldr r4, [r1, #16]
  15583. #endif
  15584. static void ui2a(unsigned int num, struct param *p)
  15585. {
  15586. int n = 0;
  15587. unsigned int d = 1;
  15588. 80276a8: 2301 movs r3, #1
  15589. char *bf = p->bf;
  15590. while (num / d >= p->base)
  15591. 80276aa: e000 b.n 80276ae <ui2a+0xc>
  15592. d *= p->base;
  15593. 80276ac: 4353 muls r3, r2
  15594. static void ui2a(unsigned int num, struct param *p)
  15595. {
  15596. int n = 0;
  15597. unsigned int d = 1;
  15598. char *bf = p->bf;
  15599. while (num / d >= p->base)
  15600. 80276ae: fbb0 f5f3 udiv r5, r0, r3
  15601. 80276b2: 4295 cmp r5, r2
  15602. 80276b4: d2fa bcs.n 80276ac <ui2a+0xa>
  15603. 80276b6: 2500 movs r5, #0
  15604. 80276b8: e01a b.n 80276f0 <ui2a+0x4e>
  15605. d *= p->base;
  15606. while (d != 0) {
  15607. int dgt = num / d;
  15608. num %= d;
  15609. d /= p->base;
  15610. 80276ba: 68ce ldr r6, [r1, #12]
  15611. unsigned int d = 1;
  15612. char *bf = p->bf;
  15613. while (num / d >= p->base)
  15614. d *= p->base;
  15615. while (d != 0) {
  15616. int dgt = num / d;
  15617. 80276bc: fbb0 f2f3 udiv r2, r0, r3
  15618. num %= d;
  15619. 80276c0: fb03 0012 mls r0, r3, r2, r0
  15620. d /= p->base;
  15621. 80276c4: fbb3 f3f6 udiv r3, r3, r6
  15622. if (n || dgt > 0 || d == 0) {
  15623. 80276c8: b91d cbnz r5, 80276d2 <ui2a+0x30>
  15624. 80276ca: 2a00 cmp r2, #0
  15625. 80276cc: dc01 bgt.n 80276d2 <ui2a+0x30>
  15626. 80276ce: 2b00 cmp r3, #0
  15627. 80276d0: d1f3 bne.n 80276ba <ui2a+0x18>
  15628. *bf++ = dgt + (dgt < 10 ? '0' : (p->uc ? 'A' : 'a') - 10);
  15629. 80276d2: 2a09 cmp r2, #9
  15630. 80276d4: b2d6 uxtb r6, r2
  15631. 80276d6: dd06 ble.n 80276e6 <ui2a+0x44>
  15632. 80276d8: 780a ldrb r2, [r1, #0]
  15633. 80276da: f012 0f04 tst.w r2, #4
  15634. 80276de: bf0c ite eq
  15635. 80276e0: 2257 moveq r2, #87 ; 0x57
  15636. 80276e2: 2237 movne r2, #55 ; 0x37
  15637. 80276e4: e000 b.n 80276e8 <ui2a+0x46>
  15638. 80276e6: 2230 movs r2, #48 ; 0x30
  15639. 80276e8: 1992 adds r2, r2, r6
  15640. 80276ea: f804 2b01 strb.w r2, [r4], #1
  15641. ++n;
  15642. 80276ee: 3501 adds r5, #1
  15643. int n = 0;
  15644. unsigned int d = 1;
  15645. char *bf = p->bf;
  15646. while (num / d >= p->base)
  15647. d *= p->base;
  15648. while (d != 0) {
  15649. 80276f0: 2b00 cmp r3, #0
  15650. 80276f2: d1e2 bne.n 80276ba <ui2a+0x18>
  15651. if (n || dgt > 0 || d == 0) {
  15652. *bf++ = dgt + (dgt < 10 ? '0' : (p->uc ? 'A' : 'a') - 10);
  15653. ++n;
  15654. }
  15655. }
  15656. *bf = 0;
  15657. 80276f4: 7023 strb r3, [r4, #0]
  15658. 80276f6: bd70 pop {r4, r5, r6, pc}
  15659. 080276f8 <putchw>:
  15660. }
  15661. static void putchw(void *putp, putcf putf, struct param *p)
  15662. {
  15663. 80276f8: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  15664. char ch;
  15665. int n = p->width;
  15666. char *bf = p->bf;
  15667. 80276fc: 6913 ldr r3, [r2, #16]
  15668. }
  15669. static void putchw(void *putp, putcf putf, struct param *p)
  15670. {
  15671. char ch;
  15672. int n = p->width;
  15673. 80276fe: 6854 ldr r4, [r2, #4]
  15674. }
  15675. static void putchw(void *putp, putcf putf, struct param *p)
  15676. {
  15677. 8027700: 4606 mov r6, r0
  15678. 8027702: 460f mov r7, r1
  15679. 8027704: 4615 mov r5, r2
  15680. char ch;
  15681. int n = p->width;
  15682. char *bf = p->bf;
  15683. /* Number of filling characters */
  15684. while (*bf++ && n > 0)
  15685. 8027706: e000 b.n 802770a <putchw+0x12>
  15686. n--;
  15687. 8027708: 3c01 subs r4, #1
  15688. char ch;
  15689. int n = p->width;
  15690. char *bf = p->bf;
  15691. /* Number of filling characters */
  15692. while (*bf++ && n > 0)
  15693. 802770a: f813 2b01 ldrb.w r2, [r3], #1
  15694. 802770e: b912 cbnz r2, 8027716 <putchw+0x1e>
  15695. n--;
  15696. if (p->sign)
  15697. 8027710: 7a2b ldrb r3, [r5, #8]
  15698. 8027712: b91b cbnz r3, 802771c <putchw+0x24>
  15699. 8027714: e003 b.n 802771e <putchw+0x26>
  15700. char ch;
  15701. int n = p->width;
  15702. char *bf = p->bf;
  15703. /* Number of filling characters */
  15704. while (*bf++ && n > 0)
  15705. 8027716: 2c00 cmp r4, #0
  15706. 8027718: dcf6 bgt.n 8027708 <putchw+0x10>
  15707. 802771a: e7f9 b.n 8027710 <putchw+0x18>
  15708. n--;
  15709. if (p->sign)
  15710. n--;
  15711. 802771c: 3c01 subs r4, #1
  15712. if (p->alt && p->base == 16)
  15713. 802771e: 782b ldrb r3, [r5, #0]
  15714. 8027720: 0799 lsls r1, r3, #30
  15715. 8027722: d507 bpl.n 8027734 <putchw+0x3c>
  15716. 8027724: 68eb ldr r3, [r5, #12]
  15717. 8027726: 2b10 cmp r3, #16
  15718. 8027728: d101 bne.n 802772e <putchw+0x36>
  15719. n -= 2;
  15720. 802772a: 3c02 subs r4, #2
  15721. 802772c: e002 b.n 8027734 <putchw+0x3c>
  15722. else if (p->alt && p->base == 8)
  15723. 802772e: 2b08 cmp r3, #8
  15724. n--;
  15725. 8027730: bf08 it eq
  15726. 8027732: 3c01 subeq r4, #1
  15727. /* Fill with space to align to the right, before alternate or sign */
  15728. if (!p->lz && !p->align_left) {
  15729. 8027734: 782b ldrb r3, [r5, #0]
  15730. 8027736: f013 0f09 tst.w r3, #9
  15731. 802773a: d10d bne.n 8027758 <putchw+0x60>
  15732. 802773c: 46a0 mov r8, r4
  15733. 802773e: e004 b.n 802774a <putchw+0x52>
  15734. while (n-- > 0)
  15735. putf(putp, ' ');
  15736. 8027740: 4630 mov r0, r6
  15737. 8027742: 2120 movs r1, #32
  15738. 8027744: 47b8 blx r7
  15739. 8027746: f108 38ff add.w r8, r8, #4294967295
  15740. else if (p->alt && p->base == 8)
  15741. n--;
  15742. /* Fill with space to align to the right, before alternate or sign */
  15743. if (!p->lz && !p->align_left) {
  15744. while (n-- > 0)
  15745. 802774a: f1b8 0f00 cmp.w r8, #0
  15746. 802774e: dcf7 bgt.n 8027740 <putchw+0x48>
  15747. return neg ? -fvalue : fvalue;
  15748. }
  15749. static void putchw(void *putp, putcf putf, struct param *p)
  15750. 8027750: 1e63 subs r3, r4, #1
  15751. 8027752: ea24 74e4 bic.w r4, r4, r4, asr #31
  15752. 8027756: 1b1c subs r4, r3, r4
  15753. while (n-- > 0)
  15754. putf(putp, ' ');
  15755. }
  15756. /* print sign */
  15757. if (p->sign)
  15758. 8027758: 7a29 ldrb r1, [r5, #8]
  15759. 802775a: b109 cbz r1, 8027760 <putchw+0x68>
  15760. putf(putp, p->sign);
  15761. 802775c: 4630 mov r0, r6
  15762. 802775e: 47b8 blx r7
  15763. /* Alternate */
  15764. if (p->alt && p->base == 16) {
  15765. 8027760: 782b ldrb r3, [r5, #0]
  15766. 8027762: 079a lsls r2, r3, #30
  15767. 8027764: d512 bpl.n 802778c <putchw+0x94>
  15768. 8027766: 68eb ldr r3, [r5, #12]
  15769. 8027768: 2b10 cmp r3, #16
  15770. 802776a: d10a bne.n 8027782 <putchw+0x8a>
  15771. putf(putp, '0');
  15772. 802776c: 2130 movs r1, #48 ; 0x30
  15773. 802776e: 4630 mov r0, r6
  15774. 8027770: 47b8 blx r7
  15775. putf(putp, (p->uc ? 'X' : 'x'));
  15776. 8027772: 782b ldrb r3, [r5, #0]
  15777. 8027774: f013 0f04 tst.w r3, #4
  15778. 8027778: 4630 mov r0, r6
  15779. 802777a: bf0c ite eq
  15780. 802777c: 2178 moveq r1, #120 ; 0x78
  15781. 802777e: 2158 movne r1, #88 ; 0x58
  15782. 8027780: e003 b.n 802778a <putchw+0x92>
  15783. } else if (p->alt && p->base == 8) {
  15784. 8027782: 2b08 cmp r3, #8
  15785. 8027784: d102 bne.n 802778c <putchw+0x94>
  15786. putf(putp, '0');
  15787. 8027786: 4630 mov r0, r6
  15788. 8027788: 2130 movs r1, #48 ; 0x30
  15789. 802778a: 47b8 blx r7
  15790. }
  15791. /* Fill with zeros, after alternate or sign */
  15792. if (p->lz) {
  15793. 802778c: 782b ldrb r3, [r5, #0]
  15794. 802778e: 07db lsls r3, r3, #31
  15795. 8027790: d50d bpl.n 80277ae <putchw+0xb6>
  15796. 8027792: 46a0 mov r8, r4
  15797. 8027794: e004 b.n 80277a0 <putchw+0xa8>
  15798. while (n-- > 0)
  15799. putf(putp, '0');
  15800. 8027796: 4630 mov r0, r6
  15801. 8027798: 2130 movs r1, #48 ; 0x30
  15802. 802779a: 47b8 blx r7
  15803. 802779c: f108 38ff add.w r8, r8, #4294967295
  15804. putf(putp, '0');
  15805. }
  15806. /* Fill with zeros, after alternate or sign */
  15807. if (p->lz) {
  15808. while (n-- > 0)
  15809. 80277a0: f1b8 0f00 cmp.w r8, #0
  15810. 80277a4: dcf7 bgt.n 8027796 <putchw+0x9e>
  15811. return neg ? -fvalue : fvalue;
  15812. }
  15813. static void putchw(void *putp, putcf putf, struct param *p)
  15814. 80277a6: 1e63 subs r3, r4, #1
  15815. 80277a8: ea24 74e4 bic.w r4, r4, r4, asr #31
  15816. 80277ac: 1b1c subs r4, r3, r4
  15817. while (n-- > 0)
  15818. putf(putp, '0');
  15819. }
  15820. /* Put actual buffer */
  15821. bf = p->bf;
  15822. 80277ae: f8d5 8010 ldr.w r8, [r5, #16]
  15823. while ((ch = *bf++))
  15824. 80277b2: e001 b.n 80277b8 <putchw+0xc0>
  15825. putf(putp, ch);
  15826. 80277b4: 4630 mov r0, r6
  15827. 80277b6: 47b8 blx r7
  15828. putf(putp, '0');
  15829. }
  15830. /* Put actual buffer */
  15831. bf = p->bf;
  15832. while ((ch = *bf++))
  15833. 80277b8: f818 1b01 ldrb.w r1, [r8], #1
  15834. 80277bc: 2900 cmp r1, #0
  15835. 80277be: d1f9 bne.n 80277b4 <putchw+0xbc>
  15836. putf(putp, ch);
  15837. /* Fill with space to align to the left, after string */
  15838. if (!p->lz && p->align_left) {
  15839. 80277c0: 782b ldrb r3, [r5, #0]
  15840. 80277c2: f003 0309 and.w r3, r3, #9
  15841. 80277c6: 2b08 cmp r3, #8
  15842. 80277c8: d106 bne.n 80277d8 <putchw+0xe0>
  15843. 80277ca: e003 b.n 80277d4 <putchw+0xdc>
  15844. while (n-- > 0)
  15845. putf(putp, ' ');
  15846. 80277cc: 4630 mov r0, r6
  15847. 80277ce: 2120 movs r1, #32
  15848. 80277d0: 47b8 blx r7
  15849. 80277d2: 3c01 subs r4, #1
  15850. while ((ch = *bf++))
  15851. putf(putp, ch);
  15852. /* Fill with space to align to the left, after string */
  15853. if (!p->lz && p->align_left) {
  15854. while (n-- > 0)
  15855. 80277d4: 2c00 cmp r4, #0
  15856. 80277d6: dcf9 bgt.n 80277cc <putchw+0xd4>
  15857. 80277d8: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  15858. 080277dc <_vsnprintf_putcf>:
  15859. };
  15860. static void _vsnprintf_putcf(void *p, char c)
  15861. {
  15862. struct _vsnprintf_putcf_data *data = (struct _vsnprintf_putcf_data*)p;
  15863. if (data->num_chars < data->dest_capacity)
  15864. 80277dc: 6883 ldr r3, [r0, #8]
  15865. 80277de: 6802 ldr r2, [r0, #0]
  15866. 80277e0: 4293 cmp r3, r2
  15867. data->dest[data->num_chars] = c;
  15868. 80277e2: bf3c itt cc
  15869. 80277e4: 6842 ldrcc r2, [r0, #4]
  15870. 80277e6: 54d1 strbcc r1, [r2, r3]
  15871. data->num_chars ++;
  15872. 80277e8: 6883 ldr r3, [r0, #8]
  15873. 80277ea: 3301 adds r3, #1
  15874. 80277ec: 6083 str r3, [r0, #8]
  15875. 80277ee: 4770 bx lr
  15876. 080277f0 <_vsprintf_putcf>:
  15877. };
  15878. static void _vsprintf_putcf(void *p, char c)
  15879. {
  15880. struct _vsprintf_putcf_data *data = (struct _vsprintf_putcf_data*)p;
  15881. data->dest[data->num_chars++] = c;
  15882. 80277f0: e890 000c ldmia.w r0, {r2, r3}
  15883. 80277f4: 54d1 strb r1, [r2, r3]
  15884. 80277f6: 3301 adds r3, #1
  15885. 80277f8: 6043 str r3, [r0, #4]
  15886. 80277fa: 4770 bx lr
  15887. 080277fc <tfp_format>:
  15888. putf(putp, ' ');
  15889. }
  15890. }
  15891. void tfp_format(void *putp, putcf putf, const char *fmt, va_list va)
  15892. {
  15893. 80277fc: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  15894. 8027800: b09b sub sp, #108 ; 0x6c
  15895. 8027802: 4617 mov r7, r2
  15896. char bf[23]; /* long = 64b on some architectures */
  15897. #else
  15898. char bf[12]; /* int = 32b on some architectures */
  15899. #endif
  15900. char ch;
  15901. p.bf = bf;
  15902. 8027804: aa04 add r2, sp, #16
  15903. putf(putp, ' ');
  15904. }
  15905. }
  15906. void tfp_format(void *putp, putcf putf, const char *fmt, va_list va)
  15907. {
  15908. 8027806: 4605 mov r5, r0
  15909. 8027808: 460e mov r6, r1
  15910. 802780a: 461c mov r4, r3
  15911. char bf[23]; /* long = 64b on some architectures */
  15912. #else
  15913. char bf[12]; /* int = 32b on some architectures */
  15914. #endif
  15915. char ch;
  15916. p.bf = bf;
  15917. 802780c: 920e str r2, [sp, #56] ; 0x38
  15918. while ((ch = *(fmt++))) {
  15919. 802780e: e208 b.n 8027c22 <tfp_format+0x426>
  15920. if (ch != '%') {
  15921. 8027810: 2925 cmp r1, #37 ; 0x25
  15922. 8027812: d000 beq.n 8027816 <tfp_format+0x1a>
  15923. 8027814: e13a b.n 8027a8c <tfp_format+0x290>
  15924. #endif
  15925. /* Init parameter struct */
  15926. p.lz = 0;
  15927. p.alt = 0;
  15928. p.width = 0;
  15929. p.align_left = 0;
  15930. 8027816: f89d 2028 ldrb.w r2, [sp, #40] ; 0x28
  15931. char lng = 0; /* 1 for long, 2 for long long */
  15932. #endif
  15933. /* Init parameter struct */
  15934. p.lz = 0;
  15935. p.alt = 0;
  15936. p.width = 0;
  15937. 802781a: 2300 movs r3, #0
  15938. p.align_left = 0;
  15939. 802781c: f002 02fc and.w r2, r2, #252 ; 0xfc
  15940. 8027820: f363 02c3 bfi r2, r3, #3, #1
  15941. 8027824: f88d 2028 strb.w r2, [sp, #40] ; 0x28
  15942. p.sign = 0;
  15943. p.prec = 2;
  15944. 8027828: 2102 movs r1, #2
  15945. } else {
  15946. #ifdef PRINTF_LONG_SUPPORT
  15947. char lng = 0; /* 1 for long, 2 for long long */
  15948. #endif
  15949. /* Init parameter struct */
  15950. p.lz = 0;
  15951. 802782a: b2d2 uxtb r2, r2
  15952. 802782c: f002 0c01 and.w ip, r2, #1
  15953. 8027830: f3c2 0040 ubfx r0, r2, #1, #1
  15954. p.alt = 0;
  15955. p.width = 0;
  15956. 8027834: 930b str r3, [sp, #44] ; 0x2c
  15957. p.align_left = 0;
  15958. p.sign = 0;
  15959. 8027836: f88d 3030 strb.w r3, [sp, #48] ; 0x30
  15960. p.prec = 2;
  15961. 802783a: f88d 103c strb.w r1, [sp, #60] ; 0x3c
  15962. 802783e: f3c2 02c0 ubfx r2, r2, #3, #1
  15963. /* Flags */
  15964. while ((ch = *(fmt++))) {
  15965. 8027842: e012 b.n 802786a <tfp_format+0x6e>
  15966. switch (ch) {
  15967. 8027844: 292d cmp r1, #45 ; 0x2d
  15968. 8027846: d00f beq.n 8027868 <tfp_format+0x6c>
  15969. 8027848: d804 bhi.n 8027854 <tfp_format+0x58>
  15970. 802784a: 2923 cmp r1, #35 ; 0x23
  15971. 802784c: d008 beq.n 8027860 <tfp_format+0x64>
  15972. 802784e: 292b cmp r1, #43 ; 0x2b
  15973. 8027850: d10f bne.n 8027872 <tfp_format+0x76>
  15974. 8027852: e007 b.n 8027864 <tfp_format+0x68>
  15975. 8027854: 2930 cmp r1, #48 ; 0x30
  15976. 8027856: d000 beq.n 802785a <tfp_format+0x5e>
  15977. 8027858: e00b b.n 8027872 <tfp_format+0x76>
  15978. case '-':
  15979. p.align_left = 1;
  15980. continue;
  15981. case '0':
  15982. p.lz = 1;
  15983. 802785a: f04f 0c01 mov.w ip, #1
  15984. continue;
  15985. 802785e: e004 b.n 802786a <tfp_format+0x6e>
  15986. case '#':
  15987. p.alt = 1;
  15988. 8027860: 2001 movs r0, #1
  15989. continue;
  15990. 8027862: e002 b.n 802786a <tfp_format+0x6e>
  15991. case '+':
  15992. p.sign = 1;
  15993. 8027864: 2301 movs r3, #1
  15994. continue;
  15995. 8027866: e000 b.n 802786a <tfp_format+0x6e>
  15996. /* Flags */
  15997. while ((ch = *(fmt++))) {
  15998. switch (ch) {
  15999. case '-':
  16000. p.align_left = 1;
  16001. 8027868: 2201 movs r2, #1
  16002. p.align_left = 0;
  16003. p.sign = 0;
  16004. p.prec = 2;
  16005. /* Flags */
  16006. while ((ch = *(fmt++))) {
  16007. 802786a: f817 1b01 ldrb.w r1, [r7], #1
  16008. 802786e: 2900 cmp r1, #0
  16009. 8027870: d1e8 bne.n 8027844 <tfp_format+0x48>
  16010. 8027872: f89d 8028 ldrb.w r8, [sp, #40] ; 0x28
  16011. 8027876: f88d 3030 strb.w r3, [sp, #48] ; 0x30
  16012. 802787a: f36c 0800 bfi r8, ip, #0, #1
  16013. 802787e: 46c4 mov ip, r8
  16014. 8027880: f360 0c41 bfi ip, r0, #1, #1
  16015. 8027884: 4660 mov r0, ip
  16016. }
  16017. break;
  16018. }
  16019. /* Width */
  16020. if (ch >= '0' && ch <= '9') {
  16021. 8027886: f1a1 0330 sub.w r3, r1, #48 ; 0x30
  16022. 802788a: f362 00c3 bfi r0, r2, #3, #1
  16023. 802788e: 2b09 cmp r3, #9
  16024. 8027890: f88d 0028 strb.w r0, [sp, #40] ; 0x28
  16025. 8027894: d81d bhi.n 80278d2 <tfp_format+0xd6>
  16026. 8027896: e004 b.n 80278a2 <tfp_format+0xa6>
  16027. unsigned int num = 0;
  16028. int digit;
  16029. while ((digit = a2d(ch)) >= 0) {
  16030. if (digit > base)
  16031. break;
  16032. num = num * base + digit;
  16033. 8027898: fb00 3202 mla r2, r0, r2, r3
  16034. ch = *p++;
  16035. 802789c: f817 1b01 ldrb.w r1, [r7], #1
  16036. 80278a0: e001 b.n 80278a6 <tfp_format+0xaa>
  16037. }
  16038. break;
  16039. }
  16040. /* Width */
  16041. if (ch >= '0' && ch <= '9') {
  16042. 80278a2: 2200 movs r2, #0
  16043. unsigned int num = 0;
  16044. int digit;
  16045. while ((digit = a2d(ch)) >= 0) {
  16046. if (digit > base)
  16047. break;
  16048. num = num * base + digit;
  16049. 80278a4: 200a movs r0, #10
  16050. ui2a(num, p);
  16051. }
  16052. static int a2d(char ch)
  16053. {
  16054. if (ch >= '0' && ch <= '9')
  16055. 80278a6: f1a1 0330 sub.w r3, r1, #48 ; 0x30
  16056. 80278aa: fa5f fc83 uxtb.w ip, r3
  16057. 80278ae: f1bc 0f09 cmp.w ip, #9
  16058. 80278b2: d9f1 bls.n 8027898 <tfp_format+0x9c>
  16059. return ch - '0';
  16060. else if (ch >= 'a' && ch <= 'f')
  16061. 80278b4: f1a1 0361 sub.w r3, r1, #97 ; 0x61
  16062. 80278b8: 2b05 cmp r3, #5
  16063. 80278ba: d802 bhi.n 80278c2 <tfp_format+0xc6>
  16064. return ch - 'a' + 10;
  16065. 80278bc: f1a1 0357 sub.w r3, r1, #87 ; 0x57
  16066. 80278c0: e1b5 b.n 8027c2e <tfp_format+0x432>
  16067. else if (ch >= 'A' && ch <= 'F')
  16068. 80278c2: f1a1 0341 sub.w r3, r1, #65 ; 0x41
  16069. 80278c6: 2b05 cmp r3, #5
  16070. 80278c8: d802 bhi.n 80278d0 <tfp_format+0xd4>
  16071. return ch - 'A' + 10;
  16072. 80278ca: f1a1 0337 sub.w r3, r1, #55 ; 0x37
  16073. 80278ce: e1ae b.n 8027c2e <tfp_format+0x432>
  16074. break;
  16075. num = num * base + digit;
  16076. ch = *p++;
  16077. }
  16078. *src = p;
  16079. *nump = num;
  16080. 80278d0: 920b str r2, [sp, #44] ; 0x2c
  16081. }
  16082. /* We accept 'x.y' format but don't support it completely:
  16083. * we ignore the 'y' digit => this ignores 0-fill
  16084. * size and makes it == width (ie. 'x') */
  16085. if (ch == '.') {
  16086. 80278d2: 292e cmp r1, #46 ; 0x2e
  16087. 80278d4: d10e bne.n 80278f4 <tfp_format+0xf8>
  16088. //p.lz = 1; /* zero-padding */
  16089. /* ignore actual 0-fill size: */
  16090. ch = *(fmt++);
  16091. if (ch >= '0' && ch <= '9')
  16092. 80278d6: 783a ldrb r2, [r7, #0]
  16093. 80278d8: 3a30 subs r2, #48 ; 0x30
  16094. 80278da: b2d2 uxtb r2, r2
  16095. * we ignore the 'y' digit => this ignores 0-fill
  16096. * size and makes it == width (ie. 'x') */
  16097. if (ch == '.') {
  16098. //p.lz = 1; /* zero-padding */
  16099. /* ignore actual 0-fill size: */
  16100. ch = *(fmt++);
  16101. 80278dc: 1c7b adds r3, r7, #1
  16102. if (ch >= '0' && ch <= '9')
  16103. 80278de: 2a09 cmp r2, #9
  16104. p.prec = ch - '0';
  16105. 80278e0: bf98 it ls
  16106. 80278e2: f88d 203c strbls.w r2, [sp, #60] ; 0x3c
  16107. do
  16108. {
  16109. ch = *(fmt++);
  16110. 80278e6: f813 1b01 ldrb.w r1, [r3], #1
  16111. } while (ch >= '0' && ch <= '9');
  16112. 80278ea: f1a1 0230 sub.w r2, r1, #48 ; 0x30
  16113. 80278ee: 2a09 cmp r2, #9
  16114. ch = *(fmt++);
  16115. if (ch >= '0' && ch <= '9')
  16116. p.prec = ch - '0';
  16117. do
  16118. {
  16119. ch = *(fmt++);
  16120. 80278f0: 461f mov r7, r3
  16121. } while (ch >= '0' && ch <= '9');
  16122. 80278f2: d9f8 bls.n 80278e6 <tfp_format+0xea>
  16123. }
  16124. #ifdef PRINTF_SIZE_T_SUPPORT
  16125. # ifdef PRINTF_LONG_SUPPORT
  16126. if (ch == 'z') {
  16127. 80278f4: 297a cmp r1, #122 ; 0x7a
  16128. 80278f6: d102 bne.n 80278fe <tfp_format+0x102>
  16129. ch = *(fmt++);
  16130. 80278f8: f817 1b01 ldrb.w r1, [r7], #1
  16131. 80278fc: e005 b.n 802790a <tfp_format+0x10e>
  16132. } else
  16133. # endif
  16134. #endif
  16135. #ifdef PRINTF_LONG_SUPPORT
  16136. if (ch == 'l') {
  16137. 80278fe: 296c cmp r1, #108 ; 0x6c
  16138. 8027900: d109 bne.n 8027916 <tfp_format+0x11a>
  16139. ch = *(fmt++);
  16140. 8027902: 7839 ldrb r1, [r7, #0]
  16141. lng = 1;
  16142. #ifdef PRINTF_LONG_LONG_SUPPORT
  16143. if (ch == 'l') {
  16144. 8027904: 296c cmp r1, #108 ; 0x6c
  16145. 8027906: d002 beq.n 802790e <tfp_format+0x112>
  16146. # endif
  16147. #endif
  16148. #ifdef PRINTF_LONG_SUPPORT
  16149. if (ch == 'l') {
  16150. ch = *(fmt++);
  16151. 8027908: 3701 adds r7, #1
  16152. lng = 1;
  16153. 802790a: 2301 movs r3, #1
  16154. 802790c: e004 b.n 8027918 <tfp_format+0x11c>
  16155. #ifdef PRINTF_LONG_LONG_SUPPORT
  16156. if (ch == 'l') {
  16157. ch = *(fmt++);
  16158. 802790e: 7879 ldrb r1, [r7, #1]
  16159. lng = 2;
  16160. 8027910: 2302 movs r3, #2
  16161. if (ch == 'l') {
  16162. ch = *(fmt++);
  16163. lng = 1;
  16164. #ifdef PRINTF_LONG_LONG_SUPPORT
  16165. if (ch == 'l') {
  16166. ch = *(fmt++);
  16167. 8027912: 3702 adds r7, #2
  16168. 8027914: e000 b.n 8027918 <tfp_format+0x11c>
  16169. while ((ch = *(fmt++))) {
  16170. if (ch != '%') {
  16171. putf(putp, ch);
  16172. } else {
  16173. #ifdef PRINTF_LONG_SUPPORT
  16174. char lng = 0; /* 1 for long, 2 for long long */
  16175. 8027916: 2300 movs r3, #0
  16176. lng = 2;
  16177. }
  16178. #endif
  16179. }
  16180. #endif
  16181. switch (ch) {
  16182. 8027918: 2969 cmp r1, #105 ; 0x69
  16183. 802791a: d036 beq.n 802798a <tfp_format+0x18e>
  16184. 802791c: d816 bhi.n 802794c <tfp_format+0x150>
  16185. 802791e: 2963 cmp r1, #99 ; 0x63
  16186. 8027920: f000 80a1 beq.w 8027a66 <tfp_format+0x26a>
  16187. 8027924: d80c bhi.n 8027940 <tfp_format+0x144>
  16188. 8027926: 2946 cmp r1, #70 ; 0x46
  16189. 8027928: f000 80b3 beq.w 8027a92 <tfp_format+0x296>
  16190. 802792c: d806 bhi.n 802793c <tfp_format+0x140>
  16191. 802792e: 2900 cmp r1, #0
  16192. 8027930: f000 8181 beq.w 8027c36 <tfp_format+0x43a>
  16193. 8027934: 2925 cmp r1, #37 ; 0x25
  16194. 8027936: f040 8174 bne.w 8027c22 <tfp_format+0x426>
  16195. 802793a: e0a7 b.n 8027a8c <tfp_format+0x290>
  16196. 802793c: 2958 cmp r1, #88 ; 0x58
  16197. 802793e: e012 b.n 8027966 <tfp_format+0x16a>
  16198. 8027940: 2964 cmp r1, #100 ; 0x64
  16199. 8027942: d022 beq.n 802798a <tfp_format+0x18e>
  16200. 8027944: 2966 cmp r1, #102 ; 0x66
  16201. 8027946: f040 816c bne.w 8027c22 <tfp_format+0x426>
  16202. 802794a: e0a2 b.n 8027a92 <tfp_format+0x296>
  16203. 802794c: 2973 cmp r1, #115 ; 0x73
  16204. 802794e: f000 8090 beq.w 8027a72 <tfp_format+0x276>
  16205. 8027952: d805 bhi.n 8027960 <tfp_format+0x164>
  16206. 8027954: 296f cmp r1, #111 ; 0x6f
  16207. 8027956: d078 beq.n 8027a4a <tfp_format+0x24e>
  16208. 8027958: 2970 cmp r1, #112 ; 0x70
  16209. 802795a: f040 8162 bne.w 8027c22 <tfp_format+0x426>
  16210. 802795e: e040 b.n 80279e2 <tfp_format+0x1e6>
  16211. 8027960: 2975 cmp r1, #117 ; 0x75
  16212. 8027962: d003 beq.n 802796c <tfp_format+0x170>
  16213. 8027964: 2978 cmp r1, #120 ; 0x78
  16214. 8027966: f040 815c bne.w 8027c22 <tfp_format+0x426>
  16215. 802796a: e041 b.n 80279f0 <tfp_format+0x1f4>
  16216. case 0:
  16217. goto abort;
  16218. case 'u':
  16219. p.base = 10;
  16220. 802796c: 220a movs r2, #10
  16221. #ifdef PRINTF_LONG_SUPPORT
  16222. #ifdef PRINTF_LONG_LONG_SUPPORT
  16223. if (2 == lng)
  16224. 802796e: 2b02 cmp r3, #2
  16225. #endif
  16226. switch (ch) {
  16227. case 0:
  16228. goto abort;
  16229. case 'u':
  16230. p.base = 10;
  16231. 8027970: 920d str r2, [sp, #52] ; 0x34
  16232. #ifdef PRINTF_LONG_SUPPORT
  16233. #ifdef PRINTF_LONG_LONG_SUPPORT
  16234. if (2 == lng)
  16235. 8027972: d107 bne.n 8027984 <tfp_format+0x188>
  16236. ulli2a(va_arg(va, unsigned long long int), &p);
  16237. 8027974: 3407 adds r4, #7
  16238. 8027976: f024 0307 bic.w r3, r4, #7
  16239. 802797a: f103 0408 add.w r4, r3, #8
  16240. 802797e: e9d3 0100 ldrd r0, r1, [r3]
  16241. 8027982: e017 b.n 80279b4 <tfp_format+0x1b8>
  16242. else
  16243. #endif
  16244. if (1 == lng)
  16245. uli2a(va_arg(va, unsigned long int), &p);
  16246. 8027984: 6820 ldr r0, [r4, #0]
  16247. 8027986: a90a add r1, sp, #40 ; 0x28
  16248. 8027988: e04f b.n 8027a2a <tfp_format+0x22e>
  16249. ui2a(va_arg(va, unsigned int), &p);
  16250. putchw(putp, putf, &p);
  16251. break;
  16252. case 'd':
  16253. case 'i':
  16254. p.base = 10;
  16255. 802798a: 220a movs r2, #10
  16256. #ifdef PRINTF_LONG_SUPPORT
  16257. #ifdef PRINTF_LONG_LONG_SUPPORT
  16258. if (2 == lng)
  16259. 802798c: 2b02 cmp r3, #2
  16260. ui2a(va_arg(va, unsigned int), &p);
  16261. putchw(putp, putf, &p);
  16262. break;
  16263. case 'd':
  16264. case 'i':
  16265. p.base = 10;
  16266. 802798e: 920d str r2, [sp, #52] ; 0x34
  16267. #ifdef PRINTF_LONG_SUPPORT
  16268. #ifdef PRINTF_LONG_LONG_SUPPORT
  16269. if (2 == lng)
  16270. 8027990: d112 bne.n 80279b8 <tfp_format+0x1bc>
  16271. lli2a(va_arg(va, long long int), &p);
  16272. 8027992: 3407 adds r4, #7
  16273. 8027994: f024 0307 bic.w r3, r4, #7
  16274. 8027998: e9d3 0100 ldrd r0, r1, [r3]
  16275. 802799c: f103 0408 add.w r4, r3, #8
  16276. *bf = 0;
  16277. }
  16278. static void lli2a(long long int num, struct param *p)
  16279. {
  16280. if (num < 0) {
  16281. 80279a0: 2800 cmp r0, #0
  16282. 80279a2: f171 0300 sbcs.w r3, r1, #0
  16283. 80279a6: da05 bge.n 80279b4 <tfp_format+0x1b8>
  16284. num = -num;
  16285. p->sign = '-';
  16286. 80279a8: 232d movs r3, #45 ; 0x2d
  16287. }
  16288. static void lli2a(long long int num, struct param *p)
  16289. {
  16290. if (num < 0) {
  16291. num = -num;
  16292. 80279aa: 4240 negs r0, r0
  16293. 80279ac: eb61 0141 sbc.w r1, r1, r1, lsl #1
  16294. p->sign = '-';
  16295. 80279b0: f88d 3030 strb.w r3, [sp, #48] ; 0x30
  16296. }
  16297. ulli2a(num, p);
  16298. 80279b4: aa0a add r2, sp, #40 ; 0x28
  16299. 80279b6: e033 b.n 8027a20 <tfp_format+0x224>
  16300. #ifdef PRINTF_LONG_LONG_SUPPORT
  16301. if (2 == lng)
  16302. lli2a(va_arg(va, long long int), &p);
  16303. else
  16304. #endif
  16305. if (1 == lng)
  16306. 80279b8: 2b01 cmp r3, #1
  16307. li2a(va_arg(va, long int), &p);
  16308. 80279ba: 6820 ldr r0, [r4, #0]
  16309. 80279bc: f104 0804 add.w r8, r4, #4
  16310. #ifdef PRINTF_LONG_LONG_SUPPORT
  16311. if (2 == lng)
  16312. lli2a(va_arg(va, long long int), &p);
  16313. else
  16314. #endif
  16315. if (1 == lng)
  16316. 80279c0: d107 bne.n 80279d2 <tfp_format+0x1d6>
  16317. *bf = 0;
  16318. }
  16319. static void li2a(long num, struct param *p)
  16320. {
  16321. if (num < 0) {
  16322. 80279c2: 2800 cmp r0, #0
  16323. 80279c4: da03 bge.n 80279ce <tfp_format+0x1d2>
  16324. num = -num;
  16325. p->sign = '-';
  16326. 80279c6: 232d movs r3, #45 ; 0x2d
  16327. }
  16328. static void li2a(long num, struct param *p)
  16329. {
  16330. if (num < 0) {
  16331. num = -num;
  16332. 80279c8: 4240 negs r0, r0
  16333. p->sign = '-';
  16334. 80279ca: f88d 3030 strb.w r3, [sp, #48] ; 0x30
  16335. }
  16336. uli2a(num, p);
  16337. 80279ce: a90a add r1, sp, #40 ; 0x28
  16338. 80279d0: e02f b.n 8027a32 <tfp_format+0x236>
  16339. *bf = 0;
  16340. }
  16341. static void i2a(int num, struct param *p)
  16342. {
  16343. if (num < 0) {
  16344. 80279d2: 2800 cmp r0, #0
  16345. 80279d4: da03 bge.n 80279de <tfp_format+0x1e2>
  16346. num = -num;
  16347. p->sign = '-';
  16348. 80279d6: 232d movs r3, #45 ; 0x2d
  16349. }
  16350. static void i2a(int num, struct param *p)
  16351. {
  16352. if (num < 0) {
  16353. num = -num;
  16354. 80279d8: 4240 negs r0, r0
  16355. p->sign = '-';
  16356. 80279da: f88d 3030 strb.w r3, [sp, #48] ; 0x30
  16357. }
  16358. ui2a(num, p);
  16359. 80279de: a90a add r1, sp, #40 ; 0x28
  16360. 80279e0: e02a b.n 8027a38 <tfp_format+0x23c>
  16361. i2a(va_arg(va, int), &p);
  16362. putchw(putp, putf, &p);
  16363. break;
  16364. #ifdef SIZEOF_POINTER
  16365. case 'p':
  16366. p.alt = 1;
  16367. 80279e2: f89d 3028 ldrb.w r3, [sp, #40] ; 0x28
  16368. 80279e6: f043 0302 orr.w r3, r3, #2
  16369. 80279ea: f88d 3028 strb.w r3, [sp, #40] ; 0x28
  16370. # if defined(SIZEOF_INT) && SIZEOF_POINTER <= SIZEOF_INT
  16371. lng = 0;
  16372. 80279ee: 2300 movs r3, #0
  16373. lng = 2;
  16374. # endif
  16375. #endif
  16376. case 'x':
  16377. case 'X':
  16378. p.base = 16;
  16379. 80279f0: 2210 movs r2, #16
  16380. p.uc = (ch == 'X')?1:0;
  16381. 80279f2: f1b1 0e58 subs.w lr, r1, #88 ; 0x58
  16382. 80279f6: f1de 0100 rsbs r1, lr, #0
  16383. 80279fa: f89d 0028 ldrb.w r0, [sp, #40] ; 0x28
  16384. lng = 2;
  16385. # endif
  16386. #endif
  16387. case 'x':
  16388. case 'X':
  16389. p.base = 16;
  16390. 80279fe: 920d str r2, [sp, #52] ; 0x34
  16391. p.uc = (ch == 'X')?1:0;
  16392. 8027a00: eb51 010e adcs.w r1, r1, lr
  16393. 8027a04: aa1a add r2, sp, #104 ; 0x68
  16394. 8027a06: f361 0082 bfi r0, r1, #2, #1
  16395. #ifdef PRINTF_LONG_SUPPORT
  16396. #ifdef PRINTF_LONG_LONG_SUPPORT
  16397. if (2 == lng)
  16398. 8027a0a: 2b02 cmp r3, #2
  16399. # endif
  16400. #endif
  16401. case 'x':
  16402. case 'X':
  16403. p.base = 16;
  16404. p.uc = (ch == 'X')?1:0;
  16405. 8027a0c: f802 0d40 strb.w r0, [r2, #-64]!
  16406. #ifdef PRINTF_LONG_SUPPORT
  16407. #ifdef PRINTF_LONG_LONG_SUPPORT
  16408. if (2 == lng)
  16409. 8027a10: d109 bne.n 8027a26 <tfp_format+0x22a>
  16410. ulli2a(va_arg(va, unsigned long long int), &p);
  16411. 8027a12: 3407 adds r4, #7
  16412. 8027a14: f024 0307 bic.w r3, r4, #7
  16413. 8027a18: e9d3 0100 ldrd r0, r1, [r3]
  16414. 8027a1c: f103 0408 add.w r4, r3, #8
  16415. 8027a20: f7ff fdbe bl 80275a0 <ulli2a>
  16416. 8027a24: e00b b.n 8027a3e <tfp_format+0x242>
  16417. else
  16418. #endif
  16419. if (1 == lng)
  16420. uli2a(va_arg(va, unsigned long int), &p);
  16421. 8027a26: 6820 ldr r0, [r4, #0]
  16422. 8027a28: 4611 mov r1, r2
  16423. #ifdef PRINTF_LONG_LONG_SUPPORT
  16424. if (2 == lng)
  16425. ulli2a(va_arg(va, unsigned long long int), &p);
  16426. else
  16427. #endif
  16428. if (1 == lng)
  16429. 8027a2a: 2b01 cmp r3, #1
  16430. 8027a2c: f104 0804 add.w r8, r4, #4
  16431. 8027a30: d102 bne.n 8027a38 <tfp_format+0x23c>
  16432. uli2a(va_arg(va, unsigned long int), &p);
  16433. 8027a32: f7ff fe0b bl 802764c <uli2a>
  16434. 8027a36: e001 b.n 8027a3c <tfp_format+0x240>
  16435. else
  16436. #endif
  16437. ui2a(va_arg(va, unsigned int), &p);
  16438. 8027a38: f7ff fe33 bl 80276a2 <ui2a>
  16439. 8027a3c: 4644 mov r4, r8
  16440. putchw(putp, putf, &p);
  16441. 8027a3e: 4628 mov r0, r5
  16442. 8027a40: 4631 mov r1, r6
  16443. 8027a42: aa0a add r2, sp, #40 ; 0x28
  16444. 8027a44: f7ff fe58 bl 80276f8 <putchw>
  16445. break;
  16446. 8027a48: e0eb b.n 8027c22 <tfp_format+0x426>
  16447. case 'o':
  16448. p.base = 8;
  16449. 8027a4a: 2308 movs r3, #8
  16450. ui2a(va_arg(va, unsigned int), &p);
  16451. 8027a4c: 6820 ldr r0, [r4, #0]
  16452. #endif
  16453. ui2a(va_arg(va, unsigned int), &p);
  16454. putchw(putp, putf, &p);
  16455. break;
  16456. case 'o':
  16457. p.base = 8;
  16458. 8027a4e: 930d str r3, [sp, #52] ; 0x34
  16459. ui2a(va_arg(va, unsigned int), &p);
  16460. 8027a50: a90a add r1, sp, #40 ; 0x28
  16461. 8027a52: f7ff fe26 bl 80276a2 <ui2a>
  16462. putchw(putp, putf, &p);
  16463. 8027a56: 4628 mov r0, r5
  16464. 8027a58: 4631 mov r1, r6
  16465. 8027a5a: aa0a add r2, sp, #40 ; 0x28
  16466. ui2a(va_arg(va, unsigned int), &p);
  16467. putchw(putp, putf, &p);
  16468. break;
  16469. case 'o':
  16470. p.base = 8;
  16471. ui2a(va_arg(va, unsigned int), &p);
  16472. 8027a5c: f104 0804 add.w r8, r4, #4
  16473. putchw(putp, putf, &p);
  16474. 8027a60: f7ff fe4a bl 80276f8 <putchw>
  16475. 8027a64: e010 b.n 8027a88 <tfp_format+0x28c>
  16476. break;
  16477. case 'c':
  16478. putf(putp, (char)(va_arg(va, int)));
  16479. 8027a66: 4628 mov r0, r5
  16480. 8027a68: 7821 ldrb r1, [r4, #0]
  16481. 8027a6a: f104 0804 add.w r8, r4, #4
  16482. 8027a6e: 47b0 blx r6
  16483. 8027a70: e00a b.n 8027a88 <tfp_format+0x28c>
  16484. break;
  16485. case 's':
  16486. p.bf = va_arg(va, char *);
  16487. 8027a72: 6823 ldr r3, [r4, #0]
  16488. putchw(putp, putf, &p);
  16489. 8027a74: aa0a add r2, sp, #40 ; 0x28
  16490. 8027a76: 4628 mov r0, r5
  16491. 8027a78: 4631 mov r1, r6
  16492. break;
  16493. case 'c':
  16494. putf(putp, (char)(va_arg(va, int)));
  16495. break;
  16496. case 's':
  16497. p.bf = va_arg(va, char *);
  16498. 8027a7a: 930e str r3, [sp, #56] ; 0x38
  16499. putchw(putp, putf, &p);
  16500. 8027a7c: f7ff fe3c bl 80276f8 <putchw>
  16501. p.bf = bf;
  16502. 8027a80: aa04 add r2, sp, #16
  16503. break;
  16504. case 'c':
  16505. putf(putp, (char)(va_arg(va, int)));
  16506. break;
  16507. case 's':
  16508. p.bf = va_arg(va, char *);
  16509. 8027a82: f104 0804 add.w r8, r4, #4
  16510. putchw(putp, putf, &p);
  16511. p.bf = bf;
  16512. 8027a86: 920e str r2, [sp, #56] ; 0x38
  16513. break;
  16514. case 'c':
  16515. putf(putp, (char)(va_arg(va, int)));
  16516. break;
  16517. case 's':
  16518. p.bf = va_arg(va, char *);
  16519. 8027a88: 4644 mov r4, r8
  16520. putchw(putp, putf, &p);
  16521. p.bf = bf;
  16522. break;
  16523. 8027a8a: e0ca b.n 8027c22 <tfp_format+0x426>
  16524. case '%':
  16525. putf(putp, ch);
  16526. 8027a8c: 4628 mov r0, r5
  16527. 8027a8e: 47b0 blx r6
  16528. break;
  16529. 8027a90: e0c7 b.n 8027c22 <tfp_format+0x426>
  16530. case 'f':
  16531. case 'F':
  16532. fval = va_arg(va, double);
  16533. 8027a92: 3407 adds r4, #7
  16534. 8027a94: f024 0307 bic.w r3, r4, #7
  16535. 8027a98: f103 0408 add.w r4, r3, #8
  16536. 8027a9c: e893 0404 ldmia.w r3, {r2, sl}
  16537. 8027aa0: 9200 str r2, [sp, #0]
  16538. sign = 0;
  16539. if (fval < 0)
  16540. 8027aa2: 4610 mov r0, r2
  16541. 8027aa4: 4651 mov r1, sl
  16542. 8027aa6: 2200 movs r2, #0
  16543. 8027aa8: 2300 movs r3, #0
  16544. 8027aaa: f7f9 f837 bl 8020b1c <__aeabi_dcmplt>
  16545. 8027aae: b138 cbz r0, 8027ac0 <tfp_format+0x2c4>
  16546. {
  16547. sign = 1;
  16548. p.width--;
  16549. 8027ab0: 9b0b ldr r3, [sp, #44] ; 0x2c
  16550. 8027ab2: 3b01 subs r3, #1
  16551. 8027ab4: 930b str r3, [sp, #44] ; 0x2c
  16552. fval = - fval;
  16553. 8027ab6: f10a 4a00 add.w sl, sl, #2147483648 ; 0x80000000
  16554. case 'F':
  16555. fval = va_arg(va, double);
  16556. sign = 0;
  16557. if (fval < 0)
  16558. {
  16559. sign = 1;
  16560. 8027aba: f04f 0b01 mov.w fp, #1
  16561. 8027abe: e009 b.n 8027ad4 <tfp_format+0x2d8>
  16562. p.width--;
  16563. fval = - fval;
  16564. }
  16565. else if (p.sign) {
  16566. 8027ac0: f89d 3030 ldrb.w r3, [sp, #48] ; 0x30
  16567. 8027ac4: b12b cbz r3, 8027ad2 <tfp_format+0x2d6>
  16568. sign = 2;
  16569. p.width--;
  16570. 8027ac6: 9b0b ldr r3, [sp, #44] ; 0x2c
  16571. 8027ac8: 3b01 subs r3, #1
  16572. 8027aca: 930b str r3, [sp, #44] ; 0x2c
  16573. sign = 1;
  16574. p.width--;
  16575. fval = - fval;
  16576. }
  16577. else if (p.sign) {
  16578. sign = 2;
  16579. 8027acc: f04f 0b02 mov.w fp, #2
  16580. 8027ad0: e000 b.n 8027ad4 <tfp_format+0x2d8>
  16581. putf(putp, ch);
  16582. break;
  16583. case 'f':
  16584. case 'F':
  16585. fval = va_arg(va, double);
  16586. sign = 0;
  16587. 8027ad2: 469b mov fp, r3
  16588. else if (p.sign) {
  16589. sign = 2;
  16590. p.width--;
  16591. }
  16592. fpart = (int)fval;
  16593. 8027ad4: 4651 mov r1, sl
  16594. 8027ad6: 9800 ldr r0, [sp, #0]
  16595. 8027ad8: f7f9 f848 bl 8020b6c <__aeabi_d2iz>
  16596. fiter = 0;
  16597. 8027adc: 2200 movs r2, #0
  16598. else if (p.sign) {
  16599. sign = 2;
  16600. p.width--;
  16601. }
  16602. fpart = (int)fval;
  16603. 8027ade: 9001 str r0, [sp, #4]
  16604. 8027ae0: 4680 mov r8, r0
  16605. fiter = 0;
  16606. while (fpart != 0)
  16607. {
  16608. temp_buffer[fiter++] = fpart % 10;
  16609. 8027ae2: 210a movs r1, #10
  16610. }
  16611. fpart = (int)fval;
  16612. fiter = 0;
  16613. while (fpart != 0)
  16614. 8027ae4: e008 b.n 8027af8 <tfp_format+0x2fc>
  16615. {
  16616. temp_buffer[fiter++] = fpart % 10;
  16617. 8027ae6: fb98 f0f1 sdiv r0, r8, r1
  16618. 8027aea: ab10 add r3, sp, #64 ; 0x40
  16619. 8027aec: fb01 8810 mls r8, r1, r0, r8
  16620. 8027af0: f843 8022 str.w r8, [r3, r2, lsl #2]
  16621. 8027af4: 3201 adds r2, #1
  16622. fpart = fpart / 10;
  16623. 8027af6: 4680 mov r8, r0
  16624. }
  16625. fpart = (int)fval;
  16626. fiter = 0;
  16627. while (fpart != 0)
  16628. 8027af8: f1b8 0f00 cmp.w r8, #0
  16629. 8027afc: d1f3 bne.n 8027ae6 <tfp_format+0x2ea>
  16630. temp_buffer[fiter++] = fpart % 10;
  16631. fpart = fpart / 10;
  16632. }
  16633. fiter--;
  16634. if (fiter == -1)
  16635. 8027afe: f102 39ff add.w r9, r2, #4294967295
  16636. 8027b02: b912 cbnz r2, 8027b0a <tfp_format+0x30e>
  16637. p.width--;
  16638. 8027b04: 9a0b ldr r2, [sp, #44] ; 0x2c
  16639. 8027b06: 3a01 subs r2, #1
  16640. 8027b08: 920b str r2, [sp, #44] ; 0x2c
  16641. /* Leading zeros */
  16642. if (p.lz) {
  16643. 8027b0a: f89d 2028 ldrb.w r2, [sp, #40] ; 0x28
  16644. 8027b0e: 07d0 lsls r0, r2, #31
  16645. 8027b10: d51b bpl.n 8027b4a <tfp_format+0x34e>
  16646. if (sign == 1)
  16647. 8027b12: f1bb 0f01 cmp.w fp, #1
  16648. 8027b16: d102 bne.n 8027b1e <tfp_format+0x322>
  16649. putf(putp, '-');
  16650. 8027b18: 4628 mov r0, r5
  16651. 8027b1a: 212d movs r1, #45 ; 0x2d
  16652. 8027b1c: e007 b.n 8027b2e <tfp_format+0x332>
  16653. else if (sign == 2)
  16654. 8027b1e: f1bb 0f02 cmp.w fp, #2
  16655. 8027b22: d105 bne.n 8027b30 <tfp_format+0x334>
  16656. putf(putp, '+');
  16657. 8027b24: 4628 mov r0, r5
  16658. 8027b26: 212b movs r1, #43 ; 0x2b
  16659. 8027b28: e001 b.n 8027b2e <tfp_format+0x332>
  16660. while (p.width-- > p.prec + fiter + 2)
  16661. {
  16662. putf(putp, '0');
  16663. 8027b2a: 4628 mov r0, r5
  16664. 8027b2c: 2130 movs r1, #48 ; 0x30
  16665. 8027b2e: 47b0 blx r6
  16666. if (sign == 1)
  16667. putf(putp, '-');
  16668. else if (sign == 2)
  16669. putf(putp, '+');
  16670. while (p.width-- > p.prec + fiter + 2)
  16671. 8027b30: f89d 203c ldrb.w r2, [sp, #60] ; 0x3c
  16672. 8027b34: 9b0b ldr r3, [sp, #44] ; 0x2c
  16673. 8027b36: 444a add r2, r9
  16674. 8027b38: 3202 adds r2, #2
  16675. 8027b3a: 1e59 subs r1, r3, #1
  16676. 8027b3c: 4293 cmp r3, r2
  16677. 8027b3e: 910b str r1, [sp, #44] ; 0x2c
  16678. 8027b40: dcf3 bgt.n 8027b2a <tfp_format+0x32e>
  16679. 8027b42: e017 b.n 8027b74 <tfp_format+0x378>
  16680. else
  16681. {
  16682. while (p.width-- > p.prec + fiter + 2)
  16683. {
  16684. putf(putp, ' ');
  16685. 8027b44: 4628 mov r0, r5
  16686. 8027b46: 2120 movs r1, #32
  16687. 8027b48: 47b0 blx r6
  16688. }
  16689. }
  16690. else
  16691. {
  16692. while (p.width-- > p.prec + fiter + 2)
  16693. 8027b4a: f89d 103c ldrb.w r1, [sp, #60] ; 0x3c
  16694. 8027b4e: 9a0b ldr r2, [sp, #44] ; 0x2c
  16695. 8027b50: 4449 add r1, r9
  16696. 8027b52: 3102 adds r1, #2
  16697. 8027b54: 1e50 subs r0, r2, #1
  16698. 8027b56: 428a cmp r2, r1
  16699. 8027b58: 900b str r0, [sp, #44] ; 0x2c
  16700. 8027b5a: dcf3 bgt.n 8027b44 <tfp_format+0x348>
  16701. {
  16702. putf(putp, ' ');
  16703. }
  16704. if (sign == 1)
  16705. 8027b5c: f1bb 0f01 cmp.w fp, #1
  16706. 8027b60: d102 bne.n 8027b68 <tfp_format+0x36c>
  16707. putf(putp, '-');
  16708. 8027b62: 4628 mov r0, r5
  16709. 8027b64: 212d movs r1, #45 ; 0x2d
  16710. 8027b66: e004 b.n 8027b72 <tfp_format+0x376>
  16711. else if (sign == 2)
  16712. 8027b68: f1bb 0f02 cmp.w fp, #2
  16713. 8027b6c: d102 bne.n 8027b74 <tfp_format+0x378>
  16714. putf(putp, '+');
  16715. 8027b6e: 4628 mov r0, r5
  16716. 8027b70: 212b movs r1, #43 ; 0x2b
  16717. 8027b72: 47b0 blx r6
  16718. }
  16719. if (fiter == -1)
  16720. 8027b74: f1b9 3fff cmp.w r9, #4294967295
  16721. 8027b78: d102 bne.n 8027b80 <tfp_format+0x384>
  16722. putf(putp, '0');
  16723. 8027b7a: 4628 mov r0, r5
  16724. 8027b7c: 2130 movs r1, #48 ; 0x30
  16725. 8027b7e: e007 b.n 8027b90 <tfp_format+0x394>
  16726. while (fiter > -1)
  16727. {
  16728. putf(putp, '0' + (temp_buffer[fiter--]));
  16729. 8027b80: ab10 add r3, sp, #64 ; 0x40
  16730. 8027b82: 4628 mov r0, r5
  16731. 8027b84: f853 1029 ldr.w r1, [r3, r9, lsl #2]
  16732. 8027b88: 3130 adds r1, #48 ; 0x30
  16733. 8027b8a: f109 39ff add.w r9, r9, #4294967295
  16734. 8027b8e: b2c9 uxtb r1, r1
  16735. 8027b90: 47b0 blx r6
  16736. }
  16737. if (fiter == -1)
  16738. putf(putp, '0');
  16739. while (fiter > -1)
  16740. 8027b92: f1b9 3fff cmp.w r9, #4294967295
  16741. 8027b96: d1f3 bne.n 8027b80 <tfp_format+0x384>
  16742. {
  16743. putf(putp, '0' + (temp_buffer[fiter--]));
  16744. }
  16745. putf(putp, '.');
  16746. 8027b98: 4628 mov r0, r5
  16747. 8027b9a: 212e movs r1, #46 ; 0x2e
  16748. 8027b9c: 47b0 blx r6
  16749. ffactor = 1;
  16750. 8027b9e: f04f 0901 mov.w r9, #1
  16751. while (p.prec-- > 0)
  16752. 8027ba2: e01d b.n 8027be0 <tfp_format+0x3e4>
  16753. {
  16754. ffactor *= 10;
  16755. 8027ba4: 230a movs r3, #10
  16756. fpart = (int)((fval - (int)fval)*ffactor);
  16757. 8027ba6: 9801 ldr r0, [sp, #4]
  16758. putf(putp, '.');
  16759. ffactor = 1;
  16760. while (p.prec-- > 0)
  16761. {
  16762. ffactor *= 10;
  16763. 8027ba8: fb03 f909 mul.w r9, r3, r9
  16764. fpart = (int)((fval - (int)fval)*ffactor);
  16765. 8027bac: f7f8 fcde bl 802056c <__aeabi_i2d>
  16766. 8027bb0: 4602 mov r2, r0
  16767. 8027bb2: 460b mov r3, r1
  16768. 8027bb4: 9800 ldr r0, [sp, #0]
  16769. 8027bb6: 4651 mov r1, sl
  16770. 8027bb8: f7f8 fb8a bl 80202d0 <__aeabi_dsub>
  16771. 8027bbc: e9cd 0102 strd r0, r1, [sp, #8]
  16772. 8027bc0: 4648 mov r0, r9
  16773. 8027bc2: f7f8 fcd3 bl 802056c <__aeabi_i2d>
  16774. 8027bc6: 4602 mov r2, r0
  16775. 8027bc8: 460b mov r3, r1
  16776. 8027bca: e9dd 0102 ldrd r0, r1, [sp, #8]
  16777. 8027bce: f7f8 fd33 bl 8020638 <__aeabi_dmul>
  16778. 8027bd2: f7f8 ffcb bl 8020b6c <__aeabi_d2iz>
  16779. if (fpart == 0)
  16780. 8027bd6: 4680 mov r8, r0
  16781. 8027bd8: b910 cbnz r0, 8027be0 <tfp_format+0x3e4>
  16782. putf(putp, '0');
  16783. 8027bda: 4628 mov r0, r5
  16784. 8027bdc: 2130 movs r1, #48 ; 0x30
  16785. 8027bde: 47b0 blx r6
  16786. putf(putp, '0' + (temp_buffer[fiter--]));
  16787. }
  16788. putf(putp, '.');
  16789. ffactor = 1;
  16790. while (p.prec-- > 0)
  16791. 8027be0: f89d 303c ldrb.w r3, [sp, #60] ; 0x3c
  16792. 8027be4: 1e5a subs r2, r3, #1
  16793. 8027be6: f88d 203c strb.w r2, [sp, #60] ; 0x3c
  16794. 8027bea: 2b00 cmp r3, #0
  16795. 8027bec: d1da bne.n 8027ba4 <tfp_format+0x3a8>
  16796. putf(putp, '0');
  16797. }
  16798. fiter = 0;
  16799. while (fpart != 0)
  16800. {
  16801. temp_buffer[fiter++] = fpart % 10;
  16802. 8027bee: 220a movs r2, #10
  16803. 8027bf0: e008 b.n 8027c04 <tfp_format+0x408>
  16804. 8027bf2: fb98 f1f2 sdiv r1, r8, r2
  16805. 8027bf6: a810 add r0, sp, #64 ; 0x40
  16806. 8027bf8: fb02 8811 mls r8, r2, r1, r8
  16807. 8027bfc: f840 8023 str.w r8, [r0, r3, lsl #2]
  16808. 8027c00: 3301 adds r3, #1
  16809. fpart = fpart / 10;
  16810. 8027c02: 4688 mov r8, r1
  16811. fpart = (int)((fval - (int)fval)*ffactor);
  16812. if (fpart == 0)
  16813. putf(putp, '0');
  16814. }
  16815. fiter = 0;
  16816. while (fpart != 0)
  16817. 8027c04: f1b8 0f00 cmp.w r8, #0
  16818. 8027c08: d1f3 bne.n 8027bf2 <tfp_format+0x3f6>
  16819. 8027c0a: 4698 mov r8, r3
  16820. temp_buffer[fiter++] = fpart % 10;
  16821. fpart = fpart / 10;
  16822. }
  16823. fiter--;
  16824. while (fiter > -1)
  16825. 8027c0c: e006 b.n 8027c1c <tfp_format+0x420>
  16826. {
  16827. putf(putp, '0' + (temp_buffer[fiter--]));
  16828. 8027c0e: ab10 add r3, sp, #64 ; 0x40
  16829. 8027c10: 4628 mov r0, r5
  16830. 8027c12: f853 1028 ldr.w r1, [r3, r8, lsl #2]
  16831. 8027c16: 3130 adds r1, #48 ; 0x30
  16832. 8027c18: b2c9 uxtb r1, r1
  16833. 8027c1a: 47b0 blx r6
  16834. temp_buffer[fiter++] = fpart % 10;
  16835. fpart = fpart / 10;
  16836. }
  16837. fiter--;
  16838. while (fiter > -1)
  16839. 8027c1c: f118 38ff adds.w r8, r8, #4294967295
  16840. 8027c20: d2f5 bcs.n 8027c0e <tfp_format+0x412>
  16841. char bf[12]; /* int = 32b on some architectures */
  16842. #endif
  16843. char ch;
  16844. p.bf = bf;
  16845. while ((ch = *(fmt++))) {
  16846. 8027c22: f817 1b01 ldrb.w r1, [r7], #1
  16847. 8027c26: 2900 cmp r1, #0
  16848. 8027c28: f47f adf2 bne.w 8027810 <tfp_format+0x14>
  16849. 8027c2c: e003 b.n 8027c36 <tfp_format+0x43a>
  16850. {
  16851. const char *p = *src;
  16852. unsigned int num = 0;
  16853. int digit;
  16854. while ((digit = a2d(ch)) >= 0) {
  16855. if (digit > base)
  16856. 8027c2e: 2b0a cmp r3, #10
  16857. 8027c30: f77f ae32 ble.w 8027898 <tfp_format+0x9c>
  16858. 8027c34: e64c b.n 80278d0 <tfp_format+0xd4>
  16859. break;
  16860. }
  16861. }
  16862. }
  16863. abort:;
  16864. }
  16865. 8027c36: b01b add sp, #108 ; 0x6c
  16866. 8027c38: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  16867. 08027c3c <init_printf>:
  16868. static putcf stdout_putf;
  16869. static void *stdout_putp;
  16870. void init_printf(void *putp, putcf putf)
  16871. {
  16872. stdout_putf = putf;
  16873. 8027c3c: 4b02 ldr r3, [pc, #8] ; (8027c48 <init_printf+0xc>)
  16874. 8027c3e: 6019 str r1, [r3, #0]
  16875. stdout_putp = putp;
  16876. 8027c40: 4b02 ldr r3, [pc, #8] ; (8027c4c <init_printf+0x10>)
  16877. 8027c42: 6018 str r0, [r3, #0]
  16878. 8027c44: 4770 bx lr
  16879. 8027c46: bf00 nop
  16880. 8027c48: 20000b24 .word 0x20000b24
  16881. 8027c4c: 20000b28 .word 0x20000b28
  16882. 08027c50 <tfp_printf>:
  16883. }
  16884. void tfp_printf(char *fmt, ...)
  16885. {
  16886. 8027c50: b40f push {r0, r1, r2, r3}
  16887. 8027c52: b507 push {r0, r1, r2, lr}
  16888. va_list va;
  16889. va_start(va, fmt);
  16890. tfp_format(stdout_putp, stdout_putf, fmt, va);
  16891. 8027c54: 4906 ldr r1, [pc, #24] ; (8027c70 <tfp_printf+0x20>)
  16892. stdout_putf = putf;
  16893. stdout_putp = putp;
  16894. }
  16895. void tfp_printf(char *fmt, ...)
  16896. {
  16897. 8027c56: ab04 add r3, sp, #16
  16898. va_list va;
  16899. va_start(va, fmt);
  16900. tfp_format(stdout_putp, stdout_putf, fmt, va);
  16901. 8027c58: 6808 ldr r0, [r1, #0]
  16902. 8027c5a: 4906 ldr r1, [pc, #24] ; (8027c74 <tfp_printf+0x24>)
  16903. stdout_putf = putf;
  16904. stdout_putp = putp;
  16905. }
  16906. void tfp_printf(char *fmt, ...)
  16907. {
  16908. 8027c5c: f853 2b04 ldr.w r2, [r3], #4
  16909. va_list va;
  16910. va_start(va, fmt);
  16911. tfp_format(stdout_putp, stdout_putf, fmt, va);
  16912. 8027c60: 6809 ldr r1, [r1, #0]
  16913. }
  16914. void tfp_printf(char *fmt, ...)
  16915. {
  16916. va_list va;
  16917. va_start(va, fmt);
  16918. 8027c62: 9301 str r3, [sp, #4]
  16919. tfp_format(stdout_putp, stdout_putf, fmt, va);
  16920. 8027c64: f7ff fdca bl 80277fc <tfp_format>
  16921. va_end(va);
  16922. }
  16923. 8027c68: e8bd 400e ldmia.w sp!, {r1, r2, r3, lr}
  16924. 8027c6c: b004 add sp, #16
  16925. 8027c6e: 4770 bx lr
  16926. 8027c70: 20000b28 .word 0x20000b28
  16927. 8027c74: 20000b24 .word 0x20000b24
  16928. 08027c78 <tfp_vsnprintf>:
  16929. data->dest[data->num_chars] = c;
  16930. data->num_chars ++;
  16931. }
  16932. int tfp_vsnprintf(char *str, size_t size, const char *format, va_list ap)
  16933. {
  16934. 8027c78: b51f push {r0, r1, r2, r3, r4, lr}
  16935. 8027c7a: 2400 movs r4, #0
  16936. struct _vsnprintf_putcf_data data;
  16937. if (size < 1)
  16938. 8027c7c: b181 cbz r1, 8027ca0 <tfp_vsnprintf+0x28>
  16939. return 0;
  16940. data.dest = str;
  16941. data.dest_capacity = size-1;
  16942. 8027c7e: 3901 subs r1, #1
  16943. struct _vsnprintf_putcf_data data;
  16944. if (size < 1)
  16945. return 0;
  16946. data.dest = str;
  16947. 8027c80: 9002 str r0, [sp, #8]
  16948. data.dest_capacity = size-1;
  16949. 8027c82: 9101 str r1, [sp, #4]
  16950. data.num_chars = 0;
  16951. tfp_format(&data, _vsnprintf_putcf, format, ap);
  16952. 8027c84: a801 add r0, sp, #4
  16953. 8027c86: 4908 ldr r1, [pc, #32] ; (8027ca8 <tfp_vsnprintf+0x30>)
  16954. if (size < 1)
  16955. return 0;
  16956. data.dest = str;
  16957. data.dest_capacity = size-1;
  16958. data.num_chars = 0;
  16959. 8027c88: 9403 str r4, [sp, #12]
  16960. tfp_format(&data, _vsnprintf_putcf, format, ap);
  16961. 8027c8a: f7ff fdb7 bl 80277fc <tfp_format>
  16962. if (data.num_chars < data.dest_capacity)
  16963. 8027c8e: 9903 ldr r1, [sp, #12]
  16964. 8027c90: 9b01 ldr r3, [sp, #4]
  16965. 8027c92: 9a02 ldr r2, [sp, #8]
  16966. 8027c94: 4299 cmp r1, r3
  16967. data.dest[data.num_chars] = '\0';
  16968. 8027c96: bf34 ite cc
  16969. 8027c98: 5454 strbcc r4, [r2, r1]
  16970. else
  16971. data.dest[data.dest_capacity] = '\0';
  16972. 8027c9a: 54d4 strbcs r4, [r2, r3]
  16973. return data.num_chars;
  16974. 8027c9c: 9803 ldr r0, [sp, #12]
  16975. 8027c9e: e000 b.n 8027ca2 <tfp_vsnprintf+0x2a>
  16976. int tfp_vsnprintf(char *str, size_t size, const char *format, va_list ap)
  16977. {
  16978. struct _vsnprintf_putcf_data data;
  16979. if (size < 1)
  16980. return 0;
  16981. 8027ca0: 4608 mov r0, r1
  16982. data.dest[data.num_chars] = '\0';
  16983. else
  16984. data.dest[data.dest_capacity] = '\0';
  16985. return data.num_chars;
  16986. }
  16987. 8027ca2: b004 add sp, #16
  16988. 8027ca4: bd10 pop {r4, pc}
  16989. 8027ca6: bf00 nop
  16990. 8027ca8: 080277dd .word 0x080277dd
  16991. 08027cac <tfp_snprintf>:
  16992. int tfp_snprintf(char *str, size_t size, const char *format, ...)
  16993. {
  16994. 8027cac: b40c push {r2, r3}
  16995. 8027cae: b507 push {r0, r1, r2, lr}
  16996. 8027cb0: ab04 add r3, sp, #16
  16997. 8027cb2: f853 2b04 ldr.w r2, [r3], #4
  16998. va_list ap;
  16999. int retval;
  17000. va_start(ap, format);
  17001. 8027cb6: 9301 str r3, [sp, #4]
  17002. retval = tfp_vsnprintf(str, size, format, ap);
  17003. 8027cb8: f7ff ffde bl 8027c78 <tfp_vsnprintf>
  17004. va_end(ap);
  17005. return retval;
  17006. }
  17007. 8027cbc: e8bd 400e ldmia.w sp!, {r1, r2, r3, lr}
  17008. 8027cc0: b002 add sp, #8
  17009. 8027cc2: 4770 bx lr
  17010. 08027cc4 <tfp_vsprintf>:
  17011. struct _vsprintf_putcf_data *data = (struct _vsprintf_putcf_data*)p;
  17012. data->dest[data->num_chars++] = c;
  17013. }
  17014. int tfp_vsprintf(char *str, const char *format, va_list ap)
  17015. {
  17016. 8027cc4: b537 push {r0, r1, r2, r4, r5, lr}
  17017. 8027cc6: 460d mov r5, r1
  17018. 8027cc8: 4613 mov r3, r2
  17019. struct _vsprintf_putcf_data data;
  17020. data.dest = str;
  17021. 8027cca: 9000 str r0, [sp, #0]
  17022. data.num_chars = 0;
  17023. 8027ccc: 2400 movs r4, #0
  17024. tfp_format(&data, _vsprintf_putcf, format, ap);
  17025. 8027cce: 4668 mov r0, sp
  17026. 8027cd0: 462a mov r2, r5
  17027. 8027cd2: 4904 ldr r1, [pc, #16] ; (8027ce4 <tfp_vsprintf+0x20>)
  17028. int tfp_vsprintf(char *str, const char *format, va_list ap)
  17029. {
  17030. struct _vsprintf_putcf_data data;
  17031. data.dest = str;
  17032. data.num_chars = 0;
  17033. 8027cd4: 9401 str r4, [sp, #4]
  17034. tfp_format(&data, _vsprintf_putcf, format, ap);
  17035. 8027cd6: f7ff fd91 bl 80277fc <tfp_format>
  17036. data.dest[data.num_chars] = '\0';
  17037. 8027cda: e89d 000c ldmia.w sp, {r2, r3}
  17038. 8027cde: 54d4 strb r4, [r2, r3]
  17039. return data.num_chars;
  17040. }
  17041. 8027ce0: 9801 ldr r0, [sp, #4]
  17042. 8027ce2: bd3e pop {r1, r2, r3, r4, r5, pc}
  17043. 8027ce4: 080277f1 .word 0x080277f1
  17044. 08027ce8 <tfp_sprintf>:
  17045. int tfp_sprintf(char *str, const char *format, ...)
  17046. {
  17047. 8027ce8: b40e push {r1, r2, r3}
  17048. 8027cea: b503 push {r0, r1, lr}
  17049. 8027cec: aa03 add r2, sp, #12
  17050. 8027cee: f852 1b04 ldr.w r1, [r2], #4
  17051. va_list ap;
  17052. int retval;
  17053. va_start(ap, format);
  17054. 8027cf2: 9201 str r2, [sp, #4]
  17055. retval = tfp_vsprintf(str, format, ap);
  17056. 8027cf4: f7ff ffe6 bl 8027cc4 <tfp_vsprintf>
  17057. va_end(ap);
  17058. return retval;
  17059. }
  17060. 8027cf8: e8bd 400c ldmia.w sp!, {r2, r3, lr}
  17061. 8027cfc: b003 add sp, #12
  17062. 8027cfe: 4770 bx lr
  17063. 08027d00 <GetInputFreqStr>:
  17064. /**
  17065. * @brief
  17066. */
  17067. void GetInputFreqStr(char *str, uint8_t *len)
  17068. {
  17069. 8027d00: b538 push {r3, r4, r5, lr}
  17070. sprintf(str, "%0.1f", UPS.Freq_in);
  17071. 8027d02: 4b08 ldr r3, [pc, #32] ; (8027d24 <GetInputFreqStr+0x24>)
  17072. /**
  17073. * @brief
  17074. */
  17075. void GetInputFreqStr(char *str, uint8_t *len)
  17076. {
  17077. 8027d04: 4604 mov r4, r0
  17078. sprintf(str, "%0.1f", UPS.Freq_in);
  17079. 8027d06: 6818 ldr r0, [r3, #0]
  17080. /**
  17081. * @brief
  17082. */
  17083. void GetInputFreqStr(char *str, uint8_t *len)
  17084. {
  17085. 8027d08: 460d mov r5, r1
  17086. sprintf(str, "%0.1f", UPS.Freq_in);
  17087. 8027d0a: f7f8 fc41 bl 8020590 <__aeabi_f2d>
  17088. 8027d0e: 4602 mov r2, r0
  17089. 8027d10: 460b mov r3, r1
  17090. 8027d12: 4620 mov r0, r4
  17091. 8027d14: 4904 ldr r1, [pc, #16] ; (8027d28 <GetInputFreqStr+0x28>)
  17092. 8027d16: f7ff ffe7 bl 8027ce8 <tfp_sprintf>
  17093. *len = strlen(str);
  17094. 8027d1a: 4620 mov r0, r4
  17095. 8027d1c: f7fa fa54 bl 80221c8 <strlen>
  17096. 8027d20: 7028 strb r0, [r5, #0]
  17097. 8027d22: bd38 pop {r3, r4, r5, pc}
  17098. 8027d24: 2000d7d8 .word 0x2000d7d8
  17099. 8027d28: 08039169 .word 0x08039169
  17100. 08027d2c <GetOutputFreqStr>:
  17101. /**
  17102. * @brief
  17103. */
  17104. void GetOutputFreqStr(char *str, uint8_t *len)
  17105. {
  17106. 8027d2c: b538 push {r3, r4, r5, lr}
  17107. sprintf(str, "%0.1f", UPS.Freq_in);
  17108. 8027d2e: 4b08 ldr r3, [pc, #32] ; (8027d50 <GetOutputFreqStr+0x24>)
  17109. /**
  17110. * @brief
  17111. */
  17112. void GetOutputFreqStr(char *str, uint8_t *len)
  17113. {
  17114. 8027d30: 4604 mov r4, r0
  17115. sprintf(str, "%0.1f", UPS.Freq_in);
  17116. 8027d32: 6818 ldr r0, [r3, #0]
  17117. /**
  17118. * @brief
  17119. */
  17120. void GetOutputFreqStr(char *str, uint8_t *len)
  17121. {
  17122. 8027d34: 460d mov r5, r1
  17123. sprintf(str, "%0.1f", UPS.Freq_in);
  17124. 8027d36: f7f8 fc2b bl 8020590 <__aeabi_f2d>
  17125. 8027d3a: 4602 mov r2, r0
  17126. 8027d3c: 460b mov r3, r1
  17127. 8027d3e: 4620 mov r0, r4
  17128. 8027d40: 4904 ldr r1, [pc, #16] ; (8027d54 <GetOutputFreqStr+0x28>)
  17129. 8027d42: f7ff ffd1 bl 8027ce8 <tfp_sprintf>
  17130. *len = strlen(str);
  17131. 8027d46: 4620 mov r0, r4
  17132. 8027d48: f7fa fa3e bl 80221c8 <strlen>
  17133. 8027d4c: 7028 strb r0, [r5, #0]
  17134. 8027d4e: bd38 pop {r3, r4, r5, pc}
  17135. 8027d50: 2000d7d8 .word 0x2000d7d8
  17136. 8027d54: 08039169 .word 0x08039169
  17137. 08027d58 <GetInputVoltageStr>:
  17138. /**
  17139. * @brief
  17140. */
  17141. void GetInputVoltageStr(char *str, uint8_t *len)
  17142. {
  17143. 8027d58: b538 push {r3, r4, r5, lr}
  17144. sprintf(str, "%0.1f", UPS.VAC_in);
  17145. 8027d5a: 4b08 ldr r3, [pc, #32] ; (8027d7c <GetInputVoltageStr+0x24>)
  17146. /**
  17147. * @brief
  17148. */
  17149. void GetInputVoltageStr(char *str, uint8_t *len)
  17150. {
  17151. 8027d5c: 4604 mov r4, r0
  17152. sprintf(str, "%0.1f", UPS.VAC_in);
  17153. 8027d5e: 6858 ldr r0, [r3, #4]
  17154. /**
  17155. * @brief
  17156. */
  17157. void GetInputVoltageStr(char *str, uint8_t *len)
  17158. {
  17159. 8027d60: 460d mov r5, r1
  17160. sprintf(str, "%0.1f", UPS.VAC_in);
  17161. 8027d62: f7f8 fc15 bl 8020590 <__aeabi_f2d>
  17162. 8027d66: 4602 mov r2, r0
  17163. 8027d68: 460b mov r3, r1
  17164. 8027d6a: 4620 mov r0, r4
  17165. 8027d6c: 4904 ldr r1, [pc, #16] ; (8027d80 <GetInputVoltageStr+0x28>)
  17166. 8027d6e: f7ff ffbb bl 8027ce8 <tfp_sprintf>
  17167. *len = strlen(str);
  17168. 8027d72: 4620 mov r0, r4
  17169. 8027d74: f7fa fa28 bl 80221c8 <strlen>
  17170. 8027d78: 7028 strb r0, [r5, #0]
  17171. 8027d7a: bd38 pop {r3, r4, r5, pc}
  17172. 8027d7c: 2000d7d8 .word 0x2000d7d8
  17173. 8027d80: 08039169 .word 0x08039169
  17174. 08027d84 <GetOutputVoltageStr>:
  17175. /**
  17176. * @brief
  17177. */
  17178. void GetOutputVoltageStr(char *str, uint8_t *len)
  17179. {
  17180. 8027d84: b538 push {r3, r4, r5, lr}
  17181. sprintf(str, "%0.1f", UPS.VAC_out);
  17182. 8027d86: 4b08 ldr r3, [pc, #32] ; (8027da8 <GetOutputVoltageStr+0x24>)
  17183. /**
  17184. * @brief
  17185. */
  17186. void GetOutputVoltageStr(char *str, uint8_t *len)
  17187. {
  17188. 8027d88: 4604 mov r4, r0
  17189. sprintf(str, "%0.1f", UPS.VAC_out);
  17190. 8027d8a: 6898 ldr r0, [r3, #8]
  17191. /**
  17192. * @brief
  17193. */
  17194. void GetOutputVoltageStr(char *str, uint8_t *len)
  17195. {
  17196. 8027d8c: 460d mov r5, r1
  17197. sprintf(str, "%0.1f", UPS.VAC_out);
  17198. 8027d8e: f7f8 fbff bl 8020590 <__aeabi_f2d>
  17199. 8027d92: 4602 mov r2, r0
  17200. 8027d94: 460b mov r3, r1
  17201. 8027d96: 4620 mov r0, r4
  17202. 8027d98: 4904 ldr r1, [pc, #16] ; (8027dac <GetOutputVoltageStr+0x28>)
  17203. 8027d9a: f7ff ffa5 bl 8027ce8 <tfp_sprintf>
  17204. *len = strlen(str);
  17205. 8027d9e: 4620 mov r0, r4
  17206. 8027da0: f7fa fa12 bl 80221c8 <strlen>
  17207. 8027da4: 7028 strb r0, [r5, #0]
  17208. 8027da6: bd38 pop {r3, r4, r5, pc}
  17209. 8027da8: 2000d7d8 .word 0x2000d7d8
  17210. 8027dac: 08039169 .word 0x08039169
  17211. 08027db0 <GetPowerStr>:
  17212. /**
  17213. * @brief
  17214. */
  17215. void GetPowerStr(char *str, uint8_t *len)
  17216. {
  17217. 8027db0: b538 push {r3, r4, r5, lr}
  17218. sprintf(str, "%d", UPS.Load);
  17219. 8027db2: 4b06 ldr r3, [pc, #24] ; (8027dcc <GetPowerStr+0x1c>)
  17220. /**
  17221. * @brief
  17222. */
  17223. void GetPowerStr(char *str, uint8_t *len)
  17224. {
  17225. 8027db4: 4605 mov r5, r0
  17226. 8027db6: 460c mov r4, r1
  17227. sprintf(str, "%d", UPS.Load);
  17228. 8027db8: 7c1a ldrb r2, [r3, #16]
  17229. 8027dba: 4905 ldr r1, [pc, #20] ; (8027dd0 <GetPowerStr+0x20>)
  17230. 8027dbc: f7ff ff94 bl 8027ce8 <tfp_sprintf>
  17231. *len = strlen(str);
  17232. 8027dc0: 4628 mov r0, r5
  17233. 8027dc2: f7fa fa01 bl 80221c8 <strlen>
  17234. 8027dc6: 7020 strb r0, [r4, #0]
  17235. 8027dc8: bd38 pop {r3, r4, r5, pc}
  17236. 8027dca: bf00 nop
  17237. 8027dcc: 2000d7d8 .word 0x2000d7d8
  17238. 8027dd0: 0803916f .word 0x0803916f
  17239. 08027dd4 <GetBatCapacityStr>:
  17240. /**
  17241. * @brief
  17242. */
  17243. void GetBatCapacityStr(char *str, uint8_t *len)
  17244. {
  17245. 8027dd4: b538 push {r3, r4, r5, lr}
  17246. sprintf(str, "%d", UPS.SOC);
  17247. 8027dd6: 4b06 ldr r3, [pc, #24] ; (8027df0 <GetBatCapacityStr+0x1c>)
  17248. /**
  17249. * @brief
  17250. */
  17251. void GetBatCapacityStr(char *str, uint8_t *len)
  17252. {
  17253. 8027dd8: 4605 mov r5, r0
  17254. 8027dda: 460c mov r4, r1
  17255. sprintf(str, "%d", UPS.SOC);
  17256. 8027ddc: 7c5a ldrb r2, [r3, #17]
  17257. 8027dde: 4905 ldr r1, [pc, #20] ; (8027df4 <GetBatCapacityStr+0x20>)
  17258. 8027de0: f7ff ff82 bl 8027ce8 <tfp_sprintf>
  17259. *len = strlen(str);
  17260. 8027de4: 4628 mov r0, r5
  17261. 8027de6: f7fa f9ef bl 80221c8 <strlen>
  17262. 8027dea: 7020 strb r0, [r4, #0]
  17263. 8027dec: bd38 pop {r3, r4, r5, pc}
  17264. 8027dee: bf00 nop
  17265. 8027df0: 2000d7d8 .word 0x2000d7d8
  17266. 8027df4: 0803916f .word 0x0803916f
  17267. 08027df8 <GetRuntimeStr>:
  17268. /**
  17269. * @brief
  17270. */
  17271. void GetRuntimeStr(char *str, uint8_t *len)
  17272. {
  17273. 8027df8: b538 push {r3, r4, r5, lr}
  17274. sprintf(str, "%d", UPS.work_time);
  17275. 8027dfa: 4b06 ldr r3, [pc, #24] ; (8027e14 <GetRuntimeStr+0x1c>)
  17276. /**
  17277. * @brief
  17278. */
  17279. void GetRuntimeStr(char *str, uint8_t *len)
  17280. {
  17281. 8027dfc: 4605 mov r5, r0
  17282. 8027dfe: 460c mov r4, r1
  17283. sprintf(str, "%d", UPS.work_time);
  17284. 8027e00: 7c9a ldrb r2, [r3, #18]
  17285. 8027e02: 4905 ldr r1, [pc, #20] ; (8027e18 <GetRuntimeStr+0x20>)
  17286. 8027e04: f7ff ff70 bl 8027ce8 <tfp_sprintf>
  17287. *len = strlen(str);
  17288. 8027e08: 4628 mov r0, r5
  17289. 8027e0a: f7fa f9dd bl 80221c8 <strlen>
  17290. 8027e0e: 7020 strb r0, [r4, #0]
  17291. 8027e10: bd38 pop {r3, r4, r5, pc}
  17292. 8027e12: bf00 nop
  17293. 8027e14: 2000d7d8 .word 0x2000d7d8
  17294. 8027e18: 0803916f .word 0x0803916f
  17295. 08027e1c <GetInternalTempStr>:
  17296. /**
  17297. * @brief
  17298. */
  17299. void GetInternalTempStr(char *str, uint8_t *len)
  17300. {
  17301. 8027e1c: b538 push {r3, r4, r5, lr}
  17302. sprintf(str, "%0.1f", UPS.Temp);
  17303. 8027e1e: 4b08 ldr r3, [pc, #32] ; (8027e40 <GetInternalTempStr+0x24>)
  17304. /**
  17305. * @brief
  17306. */
  17307. void GetInternalTempStr(char *str, uint8_t *len)
  17308. {
  17309. 8027e20: 4604 mov r4, r0
  17310. sprintf(str, "%0.1f", UPS.Temp);
  17311. 8027e22: 68d8 ldr r0, [r3, #12]
  17312. /**
  17313. * @brief
  17314. */
  17315. void GetInternalTempStr(char *str, uint8_t *len)
  17316. {
  17317. 8027e24: 460d mov r5, r1
  17318. sprintf(str, "%0.1f", UPS.Temp);
  17319. 8027e26: f7f8 fbb3 bl 8020590 <__aeabi_f2d>
  17320. 8027e2a: 4602 mov r2, r0
  17321. 8027e2c: 460b mov r3, r1
  17322. 8027e2e: 4620 mov r0, r4
  17323. 8027e30: 4904 ldr r1, [pc, #16] ; (8027e44 <GetInternalTempStr+0x28>)
  17324. 8027e32: f7ff ff59 bl 8027ce8 <tfp_sprintf>
  17325. *len = strlen(str);
  17326. 8027e36: 4620 mov r0, r4
  17327. 8027e38: f7fa f9c6 bl 80221c8 <strlen>
  17328. 8027e3c: 7028 strb r0, [r5, #0]
  17329. 8027e3e: bd38 pop {r3, r4, r5, pc}
  17330. 8027e40: 2000d7d8 .word 0x2000d7d8
  17331. 8027e44: 08039169 .word 0x08039169
  17332. 08027e48 <GetAlarmMonitorStr>:
  17333. /**
  17334. * @brief
  17335. */
  17336. void GetAlarmMonitorStr(char *str, uint8_t *len)
  17337. {
  17338. 8027e48: b538 push {r3, r4, r5, lr}
  17339. sprintf(str, "%d", UPS.Alarm);
  17340. 8027e4a: 4b06 ldr r3, [pc, #24] ; (8027e64 <GetAlarmMonitorStr+0x1c>)
  17341. /**
  17342. * @brief
  17343. */
  17344. void GetAlarmMonitorStr(char *str, uint8_t *len)
  17345. {
  17346. 8027e4c: 4605 mov r5, r0
  17347. 8027e4e: 460c mov r4, r1
  17348. sprintf(str, "%d", UPS.Alarm);
  17349. 8027e50: 7d1a ldrb r2, [r3, #20]
  17350. 8027e52: 4905 ldr r1, [pc, #20] ; (8027e68 <GetAlarmMonitorStr+0x20>)
  17351. 8027e54: f7ff ff48 bl 8027ce8 <tfp_sprintf>
  17352. *len = strlen(str);
  17353. 8027e58: 4628 mov r0, r5
  17354. 8027e5a: f7fa f9b5 bl 80221c8 <strlen>
  17355. 8027e5e: 7020 strb r0, [r4, #0]
  17356. 8027e60: bd38 pop {r3, r4, r5, pc}
  17357. 8027e62: bf00 nop
  17358. 8027e64: 2000d7d8 .word 0x2000d7d8
  17359. 8027e68: 0803916f .word 0x0803916f
  17360. 08027e6c <GetConnectMonitorStr>:
  17361. /**
  17362. * @brief
  17363. */
  17364. void GetConnectMonitorStr(char *str, uint8_t *len)
  17365. {
  17366. 8027e6c: b538 push {r3, r4, r5, lr}
  17367. if(UPS.Present)
  17368. 8027e6e: 4b08 ldr r3, [pc, #32] ; (8027e90 <GetConnectMonitorStr+0x24>)
  17369. 8027e70: f893 302d ldrb.w r3, [r3, #45] ; 0x2d
  17370. /**
  17371. * @brief
  17372. */
  17373. void GetConnectMonitorStr(char *str, uint8_t *len)
  17374. {
  17375. 8027e74: 4605 mov r5, r0
  17376. 8027e76: 460c mov r4, r1
  17377. if(UPS.Present)
  17378. 8027e78: b10b cbz r3, 8027e7e <GetConnectMonitorStr+0x12>
  17379. strcpy(str, "0");
  17380. 8027e7a: 4906 ldr r1, [pc, #24] ; (8027e94 <GetConnectMonitorStr+0x28>)
  17381. 8027e7c: e000 b.n 8027e80 <GetConnectMonitorStr+0x14>
  17382. else
  17383. strcpy(str, "1");
  17384. 8027e7e: 4906 ldr r1, [pc, #24] ; (8027e98 <GetConnectMonitorStr+0x2c>)
  17385. 8027e80: f7fa f944 bl 802210c <strcpy>
  17386. *len = strlen(str);
  17387. 8027e84: 4628 mov r0, r5
  17388. 8027e86: f7fa f99f bl 80221c8 <strlen>
  17389. 8027e8a: 7020 strb r0, [r4, #0]
  17390. 8027e8c: bd38 pop {r3, r4, r5, pc}
  17391. 8027e8e: bf00 nop
  17392. 8027e90: 2000d7d8 .word 0x2000d7d8
  17393. 8027e94: 0803921b .word 0x0803921b
  17394. 8027e98: 080394a7 .word 0x080394a7
  17395. 08027e9c <GetAlarmStr>:
  17396. /**
  17397. * @brief Индикация аварийных ситуаций
  17398. */
  17399. void GetAlarmStr(char *str, uint8_t *len)
  17400. {
  17401. 8027e9c: b538 push {r3, r4, r5, lr}
  17402. sprintf(str, "%d", UPS.Status);
  17403. 8027e9e: 4b06 ldr r3, [pc, #24] ; (8027eb8 <GetAlarmStr+0x1c>)
  17404. /**
  17405. * @brief Индикация аварийных ситуаций
  17406. */
  17407. void GetAlarmStr(char *str, uint8_t *len)
  17408. {
  17409. 8027ea0: 4605 mov r5, r0
  17410. 8027ea2: 460c mov r4, r1
  17411. sprintf(str, "%d", UPS.Status);
  17412. 8027ea4: 7cda ldrb r2, [r3, #19]
  17413. 8027ea6: 4905 ldr r1, [pc, #20] ; (8027ebc <GetAlarmStr+0x20>)
  17414. 8027ea8: f7ff ff1e bl 8027ce8 <tfp_sprintf>
  17415. *len = strlen(str);
  17416. 8027eac: 4628 mov r0, r5
  17417. 8027eae: f7fa f98b bl 80221c8 <strlen>
  17418. 8027eb2: 7020 strb r0, [r4, #0]
  17419. 8027eb4: bd38 pop {r3, r4, r5, pc}
  17420. 8027eb6: bf00 nop
  17421. 8027eb8: 2000d7d8 .word 0x2000d7d8
  17422. 8027ebc: 0803916f .word 0x0803916f
  17423. 08027ec0 <GetDateStr>:
  17424. /**
  17425. * @brief Дата (Ready for PRS!)
  17426. */
  17427. void GetDateStr(char *str, uint8_t *len)
  17428. {
  17429. 8027ec0: b530 push {r4, r5, lr}
  17430. 8027ec2: b087 sub sp, #28
  17431. 8027ec4: 4604 mov r4, r0
  17432. 8027ec6: 460d mov r5, r1
  17433. TM_RTC_t data;
  17434. uint16_t sys_year ;
  17435. TM_RTC_GetDateTime(&data, TM_RTC_Format_BIN);
  17436. 8027ec8: a802 add r0, sp, #8
  17437. 8027eca: 2100 movs r1, #0
  17438. 8027ecc: f7fe fcba bl 8026844 <TM_RTC_GetDateTime>
  17439. sys_year = 2000 + data.year;
  17440. sprintf(str, "%04i-%02i-%02i", sys_year, data.month, data.date);
  17441. 8027ed0: f89d 100f ldrb.w r1, [sp, #15]
  17442. {
  17443. TM_RTC_t data;
  17444. uint16_t sys_year ;
  17445. TM_RTC_GetDateTime(&data, TM_RTC_Format_BIN);
  17446. sys_year = 2000 + data.year;
  17447. 8027ed4: f89d 2011 ldrb.w r2, [sp, #17]
  17448. sprintf(str, "%04i-%02i-%02i", sys_year, data.month, data.date);
  17449. 8027ed8: f89d 3010 ldrb.w r3, [sp, #16]
  17450. 8027edc: 9100 str r1, [sp, #0]
  17451. 8027ede: f502 62fa add.w r2, r2, #2000 ; 0x7d0
  17452. 8027ee2: 4905 ldr r1, [pc, #20] ; (8027ef8 <GetDateStr+0x38>)
  17453. 8027ee4: 4620 mov r0, r4
  17454. 8027ee6: f7ff feff bl 8027ce8 <tfp_sprintf>
  17455. *len = strlen(str);
  17456. 8027eea: 4620 mov r0, r4
  17457. 8027eec: f7fa f96c bl 80221c8 <strlen>
  17458. 8027ef0: 7028 strb r0, [r5, #0]
  17459. }
  17460. 8027ef2: b007 add sp, #28
  17461. 8027ef4: bd30 pop {r4, r5, pc}
  17462. 8027ef6: bf00 nop
  17463. 8027ef8: 08039172 .word 0x08039172
  17464. 08027efc <GetTimeStr>:
  17465. /**
  17466. * @brief Время (Ready for PRS!)
  17467. */
  17468. void GetTimeStr(char *str, uint8_t *len)
  17469. {
  17470. 8027efc: b530 push {r4, r5, lr}
  17471. 8027efe: b085 sub sp, #20
  17472. 8027f00: 4604 mov r4, r0
  17473. 8027f02: 460d mov r5, r1
  17474. TM_RTC_t data;
  17475. TM_RTC_GetDateTime(&data, TM_RTC_Format_BIN);
  17476. 8027f04: 4668 mov r0, sp
  17477. 8027f06: 2100 movs r1, #0
  17478. 8027f08: f7fe fc9c bl 8026844 <TM_RTC_GetDateTime>
  17479. sprintf(str, "%02i:%02i", data.hours, data.minutes);
  17480. 8027f0c: 4906 ldr r1, [pc, #24] ; (8027f28 <GetTimeStr+0x2c>)
  17481. 8027f0e: f89d 2005 ldrb.w r2, [sp, #5]
  17482. 8027f12: f89d 3004 ldrb.w r3, [sp, #4]
  17483. 8027f16: 4620 mov r0, r4
  17484. 8027f18: f7ff fee6 bl 8027ce8 <tfp_sprintf>
  17485. *len = strlen(str);
  17486. 8027f1c: 4620 mov r0, r4
  17487. 8027f1e: f7fa f953 bl 80221c8 <strlen>
  17488. 8027f22: 7028 strb r0, [r5, #0]
  17489. }
  17490. 8027f24: b005 add sp, #20
  17491. 8027f26: bd30 pop {r4, r5, pc}
  17492. 8027f28: 080391b8 .word 0x080391b8
  17493. 08027f2c <GetUnixTimeStr>:
  17494. /**
  17495. * @brief Время (Ready for PRS!)
  17496. */
  17497. void GetUnixTimeStr(char *str, uint8_t *len)
  17498. {
  17499. 8027f2c: b530 push {r4, r5, lr}
  17500. 8027f2e: b085 sub sp, #20
  17501. 8027f30: 4604 mov r4, r0
  17502. 8027f32: 460d mov r5, r1
  17503. TM_RTC_t data;
  17504. TM_RTC_GetDateTime(&data, TM_RTC_Format_BIN);
  17505. 8027f34: 4668 mov r0, sp
  17506. 8027f36: 2100 movs r1, #0
  17507. 8027f38: f7fe fc84 bl 8026844 <TM_RTC_GetDateTime>
  17508. sprintf(str, "%d", data.unix);
  17509. 8027f3c: 4905 ldr r1, [pc, #20] ; (8027f54 <GetUnixTimeStr+0x28>)
  17510. 8027f3e: 9a03 ldr r2, [sp, #12]
  17511. 8027f40: 4620 mov r0, r4
  17512. 8027f42: f7ff fed1 bl 8027ce8 <tfp_sprintf>
  17513. *len = strlen(str);
  17514. 8027f46: 4620 mov r0, r4
  17515. 8027f48: f7fa f93e bl 80221c8 <strlen>
  17516. 8027f4c: 7028 strb r0, [r5, #0]
  17517. }
  17518. 8027f4e: b005 add sp, #20
  17519. 8027f50: bd30 pop {r4, r5, pc}
  17520. 8027f52: bf00 nop
  17521. 8027f54: 0803916f .word 0x0803916f
  17522. 08027f58 <GetSntpStateStr>:
  17523. /**
  17524. * @brief Состояние SNTP (Ready for PRS!)
  17525. */
  17526. void GetSntpStateStr(char *str, uint8_t *len)
  17527. {
  17528. 8027f58: b538 push {r3, r4, r5, lr}
  17529. if (sSettings.sSNTP.sntpEnable)
  17530. 8027f5a: 4b08 ldr r3, [pc, #32] ; (8027f7c <GetSntpStateStr+0x24>)
  17531. 8027f5c: f893 3340 ldrb.w r3, [r3, #832] ; 0x340
  17532. /**
  17533. * @brief Состояние SNTP (Ready for PRS!)
  17534. */
  17535. void GetSntpStateStr(char *str, uint8_t *len)
  17536. {
  17537. 8027f60: 460c mov r4, r1
  17538. 8027f62: 4605 mov r5, r0
  17539. if (sSettings.sSNTP.sntpEnable)
  17540. {
  17541. sprintf(str, "%s", "1"); //авто
  17542. 8027f64: 4906 ldr r1, [pc, #24] ; (8027f80 <GetSntpStateStr+0x28>)
  17543. /**
  17544. * @brief Состояние SNTP (Ready for PRS!)
  17545. */
  17546. void GetSntpStateStr(char *str, uint8_t *len)
  17547. {
  17548. if (sSettings.sSNTP.sntpEnable)
  17549. 8027f66: b10b cbz r3, 8027f6c <GetSntpStateStr+0x14>
  17550. {
  17551. sprintf(str, "%s", "1"); //авто
  17552. 8027f68: 4a06 ldr r2, [pc, #24] ; (8027f84 <GetSntpStateStr+0x2c>)
  17553. 8027f6a: e000 b.n 8027f6e <GetSntpStateStr+0x16>
  17554. *len = strlen(str);
  17555. }
  17556. else
  17557. {
  17558. sprintf(str, "%s", "0"); //ручной
  17559. 8027f6c: 4a06 ldr r2, [pc, #24] ; (8027f88 <GetSntpStateStr+0x30>)
  17560. 8027f6e: f7ff febb bl 8027ce8 <tfp_sprintf>
  17561. *len = strlen(str);
  17562. 8027f72: 4628 mov r0, r5
  17563. 8027f74: f7fa f928 bl 80221c8 <strlen>
  17564. 8027f78: 7020 strb r0, [r4, #0]
  17565. 8027f7a: bd38 pop {r3, r4, r5, pc}
  17566. 8027f7c: 2000d414 .word 0x2000d414
  17567. 8027f80: 080402f4 .word 0x080402f4
  17568. 8027f84: 080394a7 .word 0x080394a7
  17569. 8027f88: 0803921b .word 0x0803921b
  17570. 08027f8c <GetSntpServerIpStr>:
  17571. /**
  17572. * @brief IP адрес SNTP сервера (Ready for PRS!)
  17573. */
  17574. void GetSntpServerIpStr(char *str, uint8_t *len)
  17575. {
  17576. 8027f8c: b538 push {r3, r4, r5, lr}
  17577. sprintf(str, "%s", sSettings.sSNTP.ip);
  17578. 8027f8e: 4a05 ldr r2, [pc, #20] ; (8027fa4 <GetSntpServerIpStr+0x18>)
  17579. /**
  17580. * @brief IP адрес SNTP сервера (Ready for PRS!)
  17581. */
  17582. void GetSntpServerIpStr(char *str, uint8_t *len)
  17583. {
  17584. 8027f90: 4605 mov r5, r0
  17585. 8027f92: 460c mov r4, r1
  17586. sprintf(str, "%s", sSettings.sSNTP.ip);
  17587. 8027f94: 4904 ldr r1, [pc, #16] ; (8027fa8 <GetSntpServerIpStr+0x1c>)
  17588. 8027f96: f7ff fea7 bl 8027ce8 <tfp_sprintf>
  17589. *len = strlen(str);
  17590. 8027f9a: 4628 mov r0, r5
  17591. 8027f9c: f7fa f914 bl 80221c8 <strlen>
  17592. 8027fa0: 7020 strb r0, [r4, #0]
  17593. 8027fa2: bd38 pop {r3, r4, r5, pc}
  17594. 8027fa4: 2000d755 .word 0x2000d755
  17595. 8027fa8: 080402f4 .word 0x080402f4
  17596. 08027fac <GetSntpTimeZoneStr>:
  17597. /**
  17598. * @brief Часовой пояс контроллера (Ready for PRS!)
  17599. */
  17600. void GetSntpTimeZoneStr(char *str, uint8_t *len)
  17601. {
  17602. 8027fac: b538 push {r3, r4, r5, lr}
  17603. sprintf(str, "%0.1f", sSettings.sSNTP.timeZone);
  17604. 8027fae: 4b09 ldr r3, [pc, #36] ; (8027fd4 <GetSntpTimeZoneStr+0x28>)
  17605. /**
  17606. * @brief Часовой пояс контроллера (Ready for PRS!)
  17607. */
  17608. void GetSntpTimeZoneStr(char *str, uint8_t *len)
  17609. {
  17610. 8027fb0: 4604 mov r4, r0
  17611. sprintf(str, "%0.1f", sSettings.sSNTP.timeZone);
  17612. 8027fb2: f8d3 0370 ldr.w r0, [r3, #880] ; 0x370
  17613. /**
  17614. * @brief Часовой пояс контроллера (Ready for PRS!)
  17615. */
  17616. void GetSntpTimeZoneStr(char *str, uint8_t *len)
  17617. {
  17618. 8027fb6: 460d mov r5, r1
  17619. sprintf(str, "%0.1f", sSettings.sSNTP.timeZone);
  17620. 8027fb8: f7f8 faea bl 8020590 <__aeabi_f2d>
  17621. 8027fbc: 4602 mov r2, r0
  17622. 8027fbe: 460b mov r3, r1
  17623. 8027fc0: 4620 mov r0, r4
  17624. 8027fc2: 4905 ldr r1, [pc, #20] ; (8027fd8 <GetSntpTimeZoneStr+0x2c>)
  17625. 8027fc4: f7ff fe90 bl 8027ce8 <tfp_sprintf>
  17626. *len = strlen(str);
  17627. 8027fc8: 4620 mov r0, r4
  17628. 8027fca: f7fa f8fd bl 80221c8 <strlen>
  17629. 8027fce: 7028 strb r0, [r5, #0]
  17630. 8027fd0: bd38 pop {r3, r4, r5, pc}
  17631. 8027fd2: bf00 nop
  17632. 8027fd4: 2000d414 .word 0x2000d414
  17633. 8027fd8: 08039169 .word 0x08039169
  17634. 08027fdc <GetSntpLastDataStr>:
  17635. /**
  17636. * @brief Дата последней синхронизации SNTP (Ready for PRS!)
  17637. */
  17638. void GetSntpLastDataStr(char *str, uint8_t *len)
  17639. {
  17640. 8027fdc: b538 push {r3, r4, r5, lr}
  17641. sprintf(str, "%s", sSettings.sSNTP.data);
  17642. 8027fde: 4a05 ldr r2, [pc, #20] ; (8027ff4 <GetSntpLastDataStr+0x18>)
  17643. /**
  17644. * @brief Дата последней синхронизации SNTP (Ready for PRS!)
  17645. */
  17646. void GetSntpLastDataStr(char *str, uint8_t *len)
  17647. {
  17648. 8027fe0: 4605 mov r5, r0
  17649. 8027fe2: 460c mov r4, r1
  17650. sprintf(str, "%s", sSettings.sSNTP.data);
  17651. 8027fe4: 4904 ldr r1, [pc, #16] ; (8027ff8 <GetSntpLastDataStr+0x1c>)
  17652. 8027fe6: f7ff fe7f bl 8027ce8 <tfp_sprintf>
  17653. *len = strlen(str);
  17654. 8027fea: 4628 mov r0, r5
  17655. 8027fec: f7fa f8ec bl 80221c8 <strlen>
  17656. 8027ff0: 7020 strb r0, [r4, #0]
  17657. 8027ff2: bd38 pop {r3, r4, r5, pc}
  17658. 8027ff4: 2000d765 .word 0x2000d765
  17659. 8027ff8: 080402f4 .word 0x080402f4
  17660. 08027ffc <GetDINTypeActStr>:
  17661. /**
  17662. * @brief Тип действий при срабатывание сухих контактов
  17663. */
  17664. void GetDINTypeActStr(char *str, uint8_t *len, uint8_t num)
  17665. {
  17666. 8027ffc: b538 push {r3, r4, r5, lr}
  17667. sprintf(str, "%d", sSettings.sInOuts.din_type_act[num]);
  17668. 8027ffe: 4b07 ldr r3, [pc, #28] ; (802801c <GetDINTypeActStr+0x20>)
  17669. 8028000: 189a adds r2, r3, r2
  17670. /**
  17671. * @brief Тип действий при срабатывание сухих контактов
  17672. */
  17673. void GetDINTypeActStr(char *str, uint8_t *len, uint8_t num)
  17674. {
  17675. 8028002: 4605 mov r5, r0
  17676. 8028004: 460c mov r4, r1
  17677. sprintf(str, "%d", sSettings.sInOuts.din_type_act[num]);
  17678. 8028006: f892 2376 ldrb.w r2, [r2, #886] ; 0x376
  17679. 802800a: 4905 ldr r1, [pc, #20] ; (8028020 <GetDINTypeActStr+0x24>)
  17680. 802800c: f7ff fe6c bl 8027ce8 <tfp_sprintf>
  17681. *len = strlen(str);
  17682. 8028010: 4628 mov r0, r5
  17683. 8028012: f7fa f8d9 bl 80221c8 <strlen>
  17684. 8028016: 7020 strb r0, [r4, #0]
  17685. 8028018: bd38 pop {r3, r4, r5, pc}
  17686. 802801a: bf00 nop
  17687. 802801c: 2000d414 .word 0x2000d414
  17688. 8028020: 0803916f .word 0x0803916f
  17689. 08028024 <GetDINStatusStr>:
  17690. /**
  17691. * @brief Состояние сухого контакта
  17692. */
  17693. void GetDINStatusStr(char *str, uint8_t *len, uint8_t num)
  17694. {
  17695. sprintf(str, "%d", get_state_din_outs(DIN1+num));
  17696. 8028024: 3208 adds r2, #8
  17697. /**
  17698. * @brief Состояние сухого контакта
  17699. */
  17700. void GetDINStatusStr(char *str, uint8_t *len, uint8_t num)
  17701. {
  17702. 8028026: b538 push {r3, r4, r5, lr}
  17703. 8028028: 4604 mov r4, r0
  17704. sprintf(str, "%d", get_state_din_outs(DIN1+num));
  17705. 802802a: b2d0 uxtb r0, r2
  17706. /**
  17707. * @brief Состояние сухого контакта
  17708. */
  17709. void GetDINStatusStr(char *str, uint8_t *len, uint8_t num)
  17710. {
  17711. 802802c: 460d mov r5, r1
  17712. sprintf(str, "%d", get_state_din_outs(DIN1+num));
  17713. 802802e: f001 f92a bl 8029286 <get_state_din_outs>
  17714. 8028032: 4905 ldr r1, [pc, #20] ; (8028048 <GetDINStatusStr+0x24>)
  17715. 8028034: 4602 mov r2, r0
  17716. 8028036: 4620 mov r0, r4
  17717. 8028038: f7ff fe56 bl 8027ce8 <tfp_sprintf>
  17718. *len = strlen(str);
  17719. 802803c: 4620 mov r0, r4
  17720. 802803e: f7fa f8c3 bl 80221c8 <strlen>
  17721. 8028042: 7028 strb r0, [r5, #0]
  17722. 8028044: bd38 pop {r3, r4, r5, pc}
  17723. 8028046: bf00 nop
  17724. 8028048: 0803916f .word 0x0803916f
  17725. 0802804c <GetDIN0StatusStr>:
  17726. /**
  17727. * @brief Состояние сухого контакта
  17728. */
  17729. void GetDIN0StatusStr(char *str, uint8_t *len)
  17730. {
  17731. 802804c: b538 push {r3, r4, r5, lr}
  17732. 802804e: 4604 mov r4, r0
  17733. sprintf(str, "%d", get_state_din_outs(DIN1));
  17734. 8028050: 2008 movs r0, #8
  17735. /**
  17736. * @brief Состояние сухого контакта
  17737. */
  17738. void GetDIN0StatusStr(char *str, uint8_t *len)
  17739. {
  17740. 8028052: 460d mov r5, r1
  17741. sprintf(str, "%d", get_state_din_outs(DIN1));
  17742. 8028054: f001 f917 bl 8029286 <get_state_din_outs>
  17743. 8028058: 4904 ldr r1, [pc, #16] ; (802806c <GetDIN0StatusStr+0x20>)
  17744. 802805a: 4602 mov r2, r0
  17745. 802805c: 4620 mov r0, r4
  17746. 802805e: f7ff fe43 bl 8027ce8 <tfp_sprintf>
  17747. *len = strlen(str);
  17748. 8028062: 4620 mov r0, r4
  17749. 8028064: f7fa f8b0 bl 80221c8 <strlen>
  17750. 8028068: 7028 strb r0, [r5, #0]
  17751. 802806a: bd38 pop {r3, r4, r5, pc}
  17752. 802806c: 0803916f .word 0x0803916f
  17753. 08028070 <GetROTypeActStr>:
  17754. /**
  17755. * @brief Источник срабатывания реле
  17756. */
  17757. void GetROTypeActStr(char *str, uint8_t *len, uint8_t num)
  17758. {
  17759. 8028070: b538 push {r3, r4, r5, lr}
  17760. sprintf(str, "%d", sSettings.sInOuts.ro_type_source[num]);
  17761. 8028072: 4b07 ldr r3, [pc, #28] ; (8028090 <GetROTypeActStr+0x20>)
  17762. 8028074: 189a adds r2, r3, r2
  17763. /**
  17764. * @brief Источник срабатывания реле
  17765. */
  17766. void GetROTypeActStr(char *str, uint8_t *len, uint8_t num)
  17767. {
  17768. 8028076: 4605 mov r5, r0
  17769. 8028078: 460c mov r4, r1
  17770. sprintf(str, "%d", sSettings.sInOuts.ro_type_source[num]);
  17771. 802807a: f892 2374 ldrb.w r2, [r2, #884] ; 0x374
  17772. 802807e: 4905 ldr r1, [pc, #20] ; (8028094 <GetROTypeActStr+0x24>)
  17773. 8028080: f7ff fe32 bl 8027ce8 <tfp_sprintf>
  17774. *len = strlen(str);
  17775. 8028084: 4628 mov r0, r5
  17776. 8028086: f7fa f89f bl 80221c8 <strlen>
  17777. 802808a: 7020 strb r0, [r4, #0]
  17778. 802808c: bd38 pop {r3, r4, r5, pc}
  17779. 802808e: bf00 nop
  17780. 8028090: 2000d414 .word 0x2000d414
  17781. 8028094: 0803916f .word 0x0803916f
  17782. 08028098 <GetDOUTStatusStr>:
  17783. /**
  17784. * @brief Состояние релейного выхода
  17785. */
  17786. void GetDOUTStatusStr(char *str, uint8_t *len, uint8_t num)
  17787. {
  17788. sprintf(str, "%d", get_state_din_outs(DOUT1+num));
  17789. 8028098: 3209 adds r2, #9
  17790. /**
  17791. * @brief Состояние релейного выхода
  17792. */
  17793. void GetDOUTStatusStr(char *str, uint8_t *len, uint8_t num)
  17794. {
  17795. 802809a: b538 push {r3, r4, r5, lr}
  17796. 802809c: 4604 mov r4, r0
  17797. sprintf(str, "%d", get_state_din_outs(DOUT1+num));
  17798. 802809e: b2d0 uxtb r0, r2
  17799. /**
  17800. * @brief Состояние релейного выхода
  17801. */
  17802. void GetDOUTStatusStr(char *str, uint8_t *len, uint8_t num)
  17803. {
  17804. 80280a0: 460d mov r5, r1
  17805. sprintf(str, "%d", get_state_din_outs(DOUT1+num));
  17806. 80280a2: f001 f8f0 bl 8029286 <get_state_din_outs>
  17807. 80280a6: 4905 ldr r1, [pc, #20] ; (80280bc <GetDOUTStatusStr+0x24>)
  17808. 80280a8: 4602 mov r2, r0
  17809. 80280aa: 4620 mov r0, r4
  17810. 80280ac: f7ff fe1c bl 8027ce8 <tfp_sprintf>
  17811. *len = strlen(str);
  17812. 80280b0: 4620 mov r0, r4
  17813. 80280b2: f7fa f889 bl 80221c8 <strlen>
  17814. 80280b6: 7028 strb r0, [r5, #0]
  17815. 80280b8: bd38 pop {r3, r4, r5, pc}
  17816. 80280ba: bf00 nop
  17817. 80280bc: 0803916f .word 0x0803916f
  17818. 080280c0 <GetDOUT0StatusStr>:
  17819. /**
  17820. * @brief Состояние релейного выхода
  17821. */
  17822. void GetDOUT0StatusStr(char *str, uint8_t *len)
  17823. {
  17824. 80280c0: b538 push {r3, r4, r5, lr}
  17825. 80280c2: 4604 mov r4, r0
  17826. sprintf(str, "%d", get_state_din_outs(DOUT1));
  17827. 80280c4: 2009 movs r0, #9
  17828. /**
  17829. * @brief Состояние релейного выхода
  17830. */
  17831. void GetDOUT0StatusStr(char *str, uint8_t *len)
  17832. {
  17833. 80280c6: 460d mov r5, r1
  17834. sprintf(str, "%d", get_state_din_outs(DOUT1));
  17835. 80280c8: f001 f8dd bl 8029286 <get_state_din_outs>
  17836. 80280cc: 4904 ldr r1, [pc, #16] ; (80280e0 <GetDOUT0StatusStr+0x20>)
  17837. 80280ce: 4602 mov r2, r0
  17838. 80280d0: 4620 mov r0, r4
  17839. 80280d2: f7ff fe09 bl 8027ce8 <tfp_sprintf>
  17840. *len = strlen(str);
  17841. 80280d6: 4620 mov r0, r4
  17842. 80280d8: f7fa f876 bl 80221c8 <strlen>
  17843. 80280dc: 7028 strb r0, [r5, #0]
  17844. 80280de: bd38 pop {r3, r4, r5, pc}
  17845. 80280e0: 0803916f .word 0x0803916f
  17846. 080280e4 <GetDOUT1StatusStr>:
  17847. /**
  17848. * @brief Состояние релейного выхода
  17849. */
  17850. void GetDOUT1StatusStr(char *str, uint8_t *len)
  17851. {
  17852. 80280e4: b538 push {r3, r4, r5, lr}
  17853. 80280e6: 4604 mov r4, r0
  17854. sprintf(str, "%d", get_state_din_outs(DOUT2));
  17855. 80280e8: 200a movs r0, #10
  17856. /**
  17857. * @brief Состояние релейного выхода
  17858. */
  17859. void GetDOUT1StatusStr(char *str, uint8_t *len)
  17860. {
  17861. 80280ea: 460d mov r5, r1
  17862. sprintf(str, "%d", get_state_din_outs(DOUT2));
  17863. 80280ec: f001 f8cb bl 8029286 <get_state_din_outs>
  17864. 80280f0: 4904 ldr r1, [pc, #16] ; (8028104 <GetDOUT1StatusStr+0x20>)
  17865. 80280f2: 4602 mov r2, r0
  17866. 80280f4: 4620 mov r0, r4
  17867. 80280f6: f7ff fdf7 bl 8027ce8 <tfp_sprintf>
  17868. *len = strlen(str);
  17869. 80280fa: 4620 mov r0, r4
  17870. 80280fc: f7fa f864 bl 80221c8 <strlen>
  17871. 8028100: 7028 strb r0, [r5, #0]
  17872. 8028102: bd38 pop {r3, r4, r5, pc}
  17873. 8028104: 0803916f .word 0x0803916f
  17874. 08028108 <GetWorkTimeStr>:
  17875. #ifndef BT6702_SERVICE
  17876. /**
  17877. * @brief Время работы устройства
  17878. */
  17879. void GetWorkTimeStr(char *str, uint8_t *len)
  17880. {
  17881. 8028108: b57f push {r0, r1, r2, r3, r4, r5, r6, lr}
  17882. 802810a: 4604 mov r4, r0
  17883. u32_t tick;
  17884. uint16_t day;
  17885. uint8_t hour;
  17886. uint8_t min;
  17887. snmp_get_sysuptime(&tick);
  17888. 802810c: a803 add r0, sp, #12
  17889. #ifndef BT6702_SERVICE
  17890. /**
  17891. * @brief Время работы устройства
  17892. */
  17893. void GetWorkTimeStr(char *str, uint8_t *len)
  17894. {
  17895. 802810e: 460e mov r6, r1
  17896. u32_t tick;
  17897. uint16_t day;
  17898. uint8_t hour;
  17899. uint8_t min;
  17900. snmp_get_sysuptime(&tick);
  17901. 8028110: f00c f8be bl 8034290 <snmp_get_sysuptime>
  17902. day = tick/8640000;
  17903. 8028114: 9803 ldr r0, [sp, #12]
  17904. tick = tick%8640000;
  17905. 8028116: 4b0c ldr r3, [pc, #48] ; (8028148 <GetWorkTimeStr+0x40>)
  17906. hour = tick/360000;
  17907. tick = tick%360000;
  17908. 8028118: 4d0c ldr r5, [pc, #48] ; (802814c <GetWorkTimeStr+0x44>)
  17909. snmp_get_sysuptime(&tick);
  17910. day = tick/8640000;
  17911. tick = tick%8640000;
  17912. 802811a: fbb0 f2f3 udiv r2, r0, r3
  17913. 802811e: fb03 0012 mls r0, r3, r2, r0
  17914. hour = tick/360000;
  17915. tick = tick%360000;
  17916. 8028122: fbb0 f3f5 udiv r3, r0, r5
  17917. 8028126: fb05 0013 mls r0, r5, r3, r0
  17918. min = tick/6000;
  17919. 802812a: f241 7170 movw r1, #6000 ; 0x1770
  17920. day = tick/8640000;
  17921. tick = tick%8640000;
  17922. hour = tick/360000;
  17923. tick = tick%360000;
  17924. 802812e: 9003 str r0, [sp, #12]
  17925. min = tick/6000;
  17926. 8028130: fbb0 f0f1 udiv r0, r0, r1
  17927. sprintf(str, "%d дн. %d ч. %d мин.", day, hour, min);
  17928. 8028134: 9000 str r0, [sp, #0]
  17929. 8028136: 4906 ldr r1, [pc, #24] ; (8028150 <GetWorkTimeStr+0x48>)
  17930. 8028138: 4620 mov r0, r4
  17931. 802813a: f7ff fdd5 bl 8027ce8 <tfp_sprintf>
  17932. *len = strlen(str);
  17933. 802813e: 4620 mov r0, r4
  17934. 8028140: f7fa f842 bl 80221c8 <strlen>
  17935. 8028144: 7030 strb r0, [r6, #0]
  17936. }
  17937. 8028146: bd7f pop {r0, r1, r2, r3, r4, r5, r6, pc}
  17938. 8028148: 0083d600 .word 0x0083d600
  17939. 802814c: 00057e40 .word 0x00057e40
  17940. 8028150: 08039181 .word 0x08039181
  17941. 08028154 <GetModelStr>:
  17942. #endif
  17943. /**
  17944. * @brief Модель устройства
  17945. */
  17946. void GetModelStr(char *str, uint8_t *len)
  17947. {
  17948. 8028154: b570 push {r4, r5, r6, lr}
  17949. *len = strlen(sSettings.sSnmp.sysName);
  17950. 8028156: 4c07 ldr r4, [pc, #28] ; (8028174 <GetModelStr+0x20>)
  17951. #endif
  17952. /**
  17953. * @brief Модель устройства
  17954. */
  17955. void GetModelStr(char *str, uint8_t *len)
  17956. {
  17957. 8028158: 4605 mov r5, r0
  17958. *len = strlen(sSettings.sSnmp.sysName);
  17959. 802815a: 4620 mov r0, r4
  17960. #endif
  17961. /**
  17962. * @brief Модель устройства
  17963. */
  17964. void GetModelStr(char *str, uint8_t *len)
  17965. {
  17966. 802815c: 460e mov r6, r1
  17967. *len = strlen(sSettings.sSnmp.sysName);
  17968. 802815e: f7fa f833 bl 80221c8 <strlen>
  17969. 8028162: 4602 mov r2, r0
  17970. 8028164: 7030 strb r0, [r6, #0]
  17971. strncpy(str, sSettings.sSnmp.sysName, *len);
  17972. 8028166: 4621 mov r1, r4
  17973. 8028168: 4628 mov r0, r5
  17974. 802816a: b2d2 uxtb r2, r2
  17975. }
  17976. 802816c: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
  17977. * @brief Модель устройства
  17978. */
  17979. void GetModelStr(char *str, uint8_t *len)
  17980. {
  17981. *len = strlen(sSettings.sSnmp.sysName);
  17982. strncpy(str, sSettings.sSnmp.sysName, *len);
  17983. 8028170: f7fa b8e2 b.w 8022338 <strncpy>
  17984. 8028174: 2000d63f .word 0x2000d63f
  17985. 08028178 <GetProductionDataStr>:
  17986. /**
  17987. * @brief Дата производства
  17988. */
  17989. void GetProductionDataStr(char *str, uint8_t *len)
  17990. {
  17991. 8028178: b570 push {r4, r5, r6, lr}
  17992. *len = strlen(sSettings.sInfo.productionData);
  17993. 802817a: 4c07 ldr r4, [pc, #28] ; (8028198 <GetProductionDataStr+0x20>)
  17994. /**
  17995. * @brief Дата производства
  17996. */
  17997. void GetProductionDataStr(char *str, uint8_t *len)
  17998. {
  17999. 802817c: 4605 mov r5, r0
  18000. *len = strlen(sSettings.sInfo.productionData);
  18001. 802817e: 4620 mov r0, r4
  18002. /**
  18003. * @brief Дата производства
  18004. */
  18005. void GetProductionDataStr(char *str, uint8_t *len)
  18006. {
  18007. 8028180: 460e mov r6, r1
  18008. *len = strlen(sSettings.sInfo.productionData);
  18009. 8028182: f7fa f821 bl 80221c8 <strlen>
  18010. 8028186: 4602 mov r2, r0
  18011. 8028188: 7030 strb r0, [r6, #0]
  18012. strncpy(str, sSettings.sInfo.productionData, *len);
  18013. 802818a: 4621 mov r1, r4
  18014. 802818c: 4628 mov r0, r5
  18015. 802818e: b2d2 uxtb r2, r2
  18016. }
  18017. 8028190: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
  18018. * @brief Дата производства
  18019. */
  18020. void GetProductionDataStr(char *str, uint8_t *len)
  18021. {
  18022. *len = strlen(sSettings.sInfo.productionData);
  18023. strncpy(str, sSettings.sInfo.productionData, *len);
  18024. 8028194: f7fa b8d0 b.w 8022338 <strncpy>
  18025. 8028198: 2000d478 .word 0x2000d478
  18026. 0802819c <GetVersionStr>:
  18027. /**
  18028. * @brief Версия ПО
  18029. */
  18030. void GetVersionStr(char *str, uint8_t *len) // +
  18031. {
  18032. 802819c: b570 push {r4, r5, r6, lr}
  18033. *len = strlen(VERSION);
  18034. 802819e: 4c07 ldr r4, [pc, #28] ; (80281bc <GetVersionStr+0x20>)
  18035. /**
  18036. * @brief Версия ПО
  18037. */
  18038. void GetVersionStr(char *str, uint8_t *len) // +
  18039. {
  18040. 80281a0: 4605 mov r5, r0
  18041. *len = strlen(VERSION);
  18042. 80281a2: 4620 mov r0, r4
  18043. /**
  18044. * @brief Версия ПО
  18045. */
  18046. void GetVersionStr(char *str, uint8_t *len) // +
  18047. {
  18048. 80281a4: 460e mov r6, r1
  18049. *len = strlen(VERSION);
  18050. 80281a6: f7fa f80f bl 80221c8 <strlen>
  18051. 80281aa: 4602 mov r2, r0
  18052. 80281ac: 7030 strb r0, [r6, #0]
  18053. strncpy(str, VERSION, *len);
  18054. 80281ae: 4621 mov r1, r4
  18055. 80281b0: 4628 mov r0, r5
  18056. 80281b2: b2d2 uxtb r2, r2
  18057. }
  18058. 80281b4: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
  18059. * @brief Версия ПО
  18060. */
  18061. void GetVersionStr(char *str, uint8_t *len) // +
  18062. {
  18063. *len = strlen(VERSION);
  18064. strncpy(str, VERSION, *len);
  18065. 80281b8: f7fa b8be b.w 8022338 <strncpy>
  18066. 80281bc: 0803919c .word 0x0803919c
  18067. 080281c0 <GetMacStr>:
  18068. /**
  18069. * @brief MAC адрес устройства
  18070. */
  18071. void GetMacStr(char *str, uint8_t *len)
  18072. {
  18073. 80281c0: b570 push {r4, r5, r6, lr}
  18074. *len = strlen(sSettings.sInfo.mac);
  18075. 80281c2: 4c07 ldr r4, [pc, #28] ; (80281e0 <GetMacStr+0x20>)
  18076. /**
  18077. * @brief MAC адрес устройства
  18078. */
  18079. void GetMacStr(char *str, uint8_t *len)
  18080. {
  18081. 80281c4: 4605 mov r5, r0
  18082. *len = strlen(sSettings.sInfo.mac);
  18083. 80281c6: 4620 mov r0, r4
  18084. /**
  18085. * @brief MAC адрес устройства
  18086. */
  18087. void GetMacStr(char *str, uint8_t *len)
  18088. {
  18089. 80281c8: 460e mov r6, r1
  18090. *len = strlen(sSettings.sInfo.mac);
  18091. 80281ca: f7f9 fffd bl 80221c8 <strlen>
  18092. 80281ce: 4602 mov r2, r0
  18093. 80281d0: 7030 strb r0, [r6, #0]
  18094. strncpy(str, sSettings.sInfo.mac, *len);
  18095. 80281d2: 4621 mov r1, r4
  18096. 80281d4: 4628 mov r0, r5
  18097. 80281d6: b2d2 uxtb r2, r2
  18098. }
  18099. 80281d8: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
  18100. * @brief MAC адрес устройства
  18101. */
  18102. void GetMacStr(char *str, uint8_t *len)
  18103. {
  18104. *len = strlen(sSettings.sInfo.mac);
  18105. strncpy(str, sSettings.sInfo.mac, *len);
  18106. 80281dc: f7fa b8ac b.w 8022338 <strncpy>
  18107. 80281e0: 2000d4a0 .word 0x2000d4a0
  18108. 080281e4 <GetSerialNumberStr>:
  18109. /**
  18110. * @brief Серийный номер устройства
  18111. */
  18112. void GetSerialNumberStr(char *str, uint8_t *len)
  18113. {
  18114. 80281e4: b570 push {r4, r5, r6, lr}
  18115. *len = strlen(sSettings.sInfo.serialNumber);
  18116. 80281e6: 4c07 ldr r4, [pc, #28] ; (8028204 <GetSerialNumberStr+0x20>)
  18117. /**
  18118. * @brief Серийный номер устройства
  18119. */
  18120. void GetSerialNumberStr(char *str, uint8_t *len)
  18121. {
  18122. 80281e8: 4605 mov r5, r0
  18123. *len = strlen(sSettings.sInfo.serialNumber);
  18124. 80281ea: 4620 mov r0, r4
  18125. /**
  18126. * @brief Серийный номер устройства
  18127. */
  18128. void GetSerialNumberStr(char *str, uint8_t *len)
  18129. {
  18130. 80281ec: 460e mov r6, r1
  18131. *len = strlen(sSettings.sInfo.serialNumber);
  18132. 80281ee: f7f9 ffeb bl 80221c8 <strlen>
  18133. 80281f2: 4602 mov r2, r0
  18134. 80281f4: 7030 strb r0, [r6, #0]
  18135. strncpy(str, sSettings.sInfo.serialNumber, *len);
  18136. 80281f6: 4621 mov r1, r4
  18137. 80281f8: 4628 mov r0, r5
  18138. 80281fa: b2d2 uxtb r2, r2
  18139. }
  18140. 80281fc: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
  18141. * @brief Серийный номер устройства
  18142. */
  18143. void GetSerialNumberStr(char *str, uint8_t *len)
  18144. {
  18145. *len = strlen(sSettings.sInfo.serialNumber);
  18146. strncpy(str, sSettings.sInfo.serialNumber, *len);
  18147. 8028200: f7fa b89a b.w 8022338 <strncpy>
  18148. 8028204: 2000d4b2 .word 0x2000d4b2
  18149. 08028208 <GetOwnerStr>:
  18150. /**
  18151. * @brief Владелец устройства
  18152. */
  18153. void GetOwnerStr(char *str, uint8_t *len)
  18154. {
  18155. 8028208: b570 push {r4, r5, r6, lr}
  18156. *len = strlen(sSettings.sSnmp.sysContact);
  18157. 802820a: 4c07 ldr r4, [pc, #28] ; (8028228 <GetOwnerStr+0x20>)
  18158. /**
  18159. * @brief Владелец устройства
  18160. */
  18161. void GetOwnerStr(char *str, uint8_t *len)
  18162. {
  18163. 802820c: 4605 mov r5, r0
  18164. *len = strlen(sSettings.sSnmp.sysContact);
  18165. 802820e: 4620 mov r0, r4
  18166. /**
  18167. * @brief Владелец устройства
  18168. */
  18169. void GetOwnerStr(char *str, uint8_t *len)
  18170. {
  18171. 8028210: 460e mov r6, r1
  18172. *len = strlen(sSettings.sSnmp.sysContact);
  18173. 8028212: f7f9 ffd9 bl 80221c8 <strlen>
  18174. 8028216: 4602 mov r2, r0
  18175. 8028218: 7030 strb r0, [r6, #0]
  18176. strncpy(str, sSettings.sSnmp.sysContact, *len);
  18177. 802821a: 4621 mov r1, r4
  18178. 802821c: 4628 mov r0, r5
  18179. 802821e: b2d2 uxtb r2, r2
  18180. }
  18181. 8028220: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
  18182. * @brief Владелец устройства
  18183. */
  18184. void GetOwnerStr(char *str, uint8_t *len)
  18185. {
  18186. *len = strlen(sSettings.sSnmp.sysContact);
  18187. strncpy(str, sSettings.sSnmp.sysContact, *len);
  18188. 8028224: f7fa b888 b.w 8022338 <strncpy>
  18189. 8028228: 2000d60d .word 0x2000d60d
  18190. 0802822c <GetLocationStr>:
  18191. /**
  18192. * @brief Местоположение устройства
  18193. */
  18194. void GetLocationStr(char *str, uint8_t *len)
  18195. {
  18196. 802822c: b570 push {r4, r5, r6, lr}
  18197. *len = strlen(sSettings.sSnmp.sysLocation);
  18198. 802822e: 4c07 ldr r4, [pc, #28] ; (802824c <GetLocationStr+0x20>)
  18199. /**
  18200. * @brief Местоположение устройства
  18201. */
  18202. void GetLocationStr(char *str, uint8_t *len)
  18203. {
  18204. 8028230: 4605 mov r5, r0
  18205. *len = strlen(sSettings.sSnmp.sysLocation);
  18206. 8028232: 4620 mov r0, r4
  18207. /**
  18208. * @brief Местоположение устройства
  18209. */
  18210. void GetLocationStr(char *str, uint8_t *len)
  18211. {
  18212. 8028234: 460e mov r6, r1
  18213. *len = strlen(sSettings.sSnmp.sysLocation);
  18214. 8028236: f7f9 ffc7 bl 80221c8 <strlen>
  18215. 802823a: 4602 mov r2, r0
  18216. 802823c: 7030 strb r0, [r6, #0]
  18217. strncpy(str, sSettings.sSnmp.sysLocation, *len);
  18218. 802823e: 4621 mov r1, r4
  18219. 8028240: 4628 mov r0, r5
  18220. 8028242: b2d2 uxtb r2, r2
  18221. }
  18222. 8028244: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
  18223. * @brief Местоположение устройства
  18224. */
  18225. void GetLocationStr(char *str, uint8_t *len)
  18226. {
  18227. *len = strlen(sSettings.sSnmp.sysLocation);
  18228. strncpy(str, sSettings.sSnmp.sysLocation, *len);
  18229. 8028248: f7fa b876 b.w 8022338 <strncpy>
  18230. 802824c: 2000d653 .word 0x2000d653
  18231. 08028250 <GetCommentsStr>:
  18232. /**
  18233. * @brief Комментарии
  18234. */
  18235. void GetCommentsStr(char *str, uint8_t *len)
  18236. {
  18237. 8028250: b570 push {r4, r5, r6, lr}
  18238. *len = strlen(sSettings.sInfo.comments);
  18239. 8028252: 4c07 ldr r4, [pc, #28] ; (8028270 <GetCommentsStr+0x20>)
  18240. /**
  18241. * @brief Комментарии
  18242. */
  18243. void GetCommentsStr(char *str, uint8_t *len)
  18244. {
  18245. 8028254: 4605 mov r5, r0
  18246. *len = strlen(sSettings.sInfo.comments);
  18247. 8028256: 4620 mov r0, r4
  18248. /**
  18249. * @brief Комментарии
  18250. */
  18251. void GetCommentsStr(char *str, uint8_t *len)
  18252. {
  18253. 8028258: 460e mov r6, r1
  18254. *len = strlen(sSettings.sInfo.comments);
  18255. 802825a: f7f9 ffb5 bl 80221c8 <strlen>
  18256. 802825e: 4602 mov r2, r0
  18257. 8028260: 7030 strb r0, [r6, #0]
  18258. strncpy(str, sSettings.sInfo.comments, *len);
  18259. 8028262: 4621 mov r1, r4
  18260. 8028264: 4628 mov r0, r5
  18261. 8028266: b2d2 uxtb r2, r2
  18262. }
  18263. 8028268: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
  18264. * @brief Комментарии
  18265. */
  18266. void GetCommentsStr(char *str, uint8_t *len)
  18267. {
  18268. *len = strlen(sSettings.sInfo.comments);
  18269. strncpy(str, sSettings.sInfo.comments, *len);
  18270. 802826c: f7fa b864 b.w 8022338 <strncpy>
  18271. 8028270: 2000d4c2 .word 0x2000d4c2
  18272. 08028274 <GetUPSModelStr>:
  18273. #ifndef BT6702_SERVICE
  18274. /**
  18275. * @brief Модель UPS
  18276. */
  18277. void GetUPSModelStr(char *str, uint8_t *len)
  18278. {
  18279. 8028274: b570 push {r4, r5, r6, lr}
  18280. *len = strlen(UPS.model);
  18281. 8028276: 4c07 ldr r4, [pc, #28] ; (8028294 <GetUPSModelStr+0x20>)
  18282. #ifndef BT6702_SERVICE
  18283. /**
  18284. * @brief Модель UPS
  18285. */
  18286. void GetUPSModelStr(char *str, uint8_t *len)
  18287. {
  18288. 8028278: 4605 mov r5, r0
  18289. *len = strlen(UPS.model);
  18290. 802827a: 4620 mov r0, r4
  18291. #ifndef BT6702_SERVICE
  18292. /**
  18293. * @brief Модель UPS
  18294. */
  18295. void GetUPSModelStr(char *str, uint8_t *len)
  18296. {
  18297. 802827c: 460e mov r6, r1
  18298. *len = strlen(UPS.model);
  18299. 802827e: f7f9 ffa3 bl 80221c8 <strlen>
  18300. 8028282: 4602 mov r2, r0
  18301. 8028284: 7030 strb r0, [r6, #0]
  18302. strncpy(str, UPS.model, *len);
  18303. 8028286: 4621 mov r1, r4
  18304. 8028288: 4628 mov r0, r5
  18305. 802828a: b2d2 uxtb r2, r2
  18306. }
  18307. 802828c: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
  18308. * @brief Модель UPS
  18309. */
  18310. void GetUPSModelStr(char *str, uint8_t *len)
  18311. {
  18312. *len = strlen(UPS.model);
  18313. strncpy(str, UPS.model, *len);
  18314. 8028290: f7fa b852 b.w 8022338 <strncpy>
  18315. 8028294: 2000d7ed .word 0x2000d7ed
  18316. 08028298 <GetUPSVersionStr>:
  18317. /**
  18318. * @brief Версия UPS ПО
  18319. */
  18320. void GetUPSVersionStr(char *str, uint8_t *len) // +
  18321. {
  18322. 8028298: b570 push {r4, r5, r6, lr}
  18323. *len = strlen(UPS.vertion);
  18324. 802829a: 4c07 ldr r4, [pc, #28] ; (80282b8 <GetUPSVersionStr+0x20>)
  18325. /**
  18326. * @brief Версия UPS ПО
  18327. */
  18328. void GetUPSVersionStr(char *str, uint8_t *len) // +
  18329. {
  18330. 802829c: 4605 mov r5, r0
  18331. *len = strlen(UPS.vertion);
  18332. 802829e: 4620 mov r0, r4
  18333. /**
  18334. * @brief Версия UPS ПО
  18335. */
  18336. void GetUPSVersionStr(char *str, uint8_t *len) // +
  18337. {
  18338. 80282a0: 460e mov r6, r1
  18339. *len = strlen(UPS.vertion);
  18340. 80282a2: f7f9 ff91 bl 80221c8 <strlen>
  18341. 80282a6: 4602 mov r2, r0
  18342. 80282a8: 7030 strb r0, [r6, #0]
  18343. strncpy(str, UPS.vertion, *len);
  18344. 80282aa: 4621 mov r1, r4
  18345. 80282ac: 4628 mov r0, r5
  18346. 80282ae: b2d2 uxtb r2, r2
  18347. }
  18348. 80282b0: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
  18349. * @brief Версия UPS ПО
  18350. */
  18351. void GetUPSVersionStr(char *str, uint8_t *len) // +
  18352. {
  18353. *len = strlen(UPS.vertion);
  18354. strncpy(str, UPS.vertion, *len);
  18355. 80282b4: f7fa b840 b.w 8022338 <strncpy>
  18356. 80282b8: 2000d7f8 .word 0x2000d7f8
  18357. 080282bc <GetUserLogin>:
  18358. #endif
  18359. // ************************************************************************** //
  18360. // Настройки аутентификации
  18361. void GetUserLogin(uint8_t user_id, char *str, uint8_t *len)
  18362. {
  18363. 80282bc: b538 push {r3, r4, r5, lr}
  18364. sprintf(str, "%s", sSettings.sAuth[user_id].login);
  18365. 80282be: 4b08 ldr r3, [pc, #32] ; (80282e0 <GetUserLogin+0x24>)
  18366. #endif
  18367. // ************************************************************************** //
  18368. // Настройки аутентификации
  18369. void GetUserLogin(uint8_t user_id, char *str, uint8_t *len)
  18370. {
  18371. 80282c0: 4615 mov r5, r2
  18372. sprintf(str, "%s", sSettings.sAuth[user_id].login);
  18373. 80282c2: 2217 movs r2, #23
  18374. 80282c4: fb02 3200 mla r2, r2, r0, r3
  18375. #endif
  18376. // ************************************************************************** //
  18377. // Настройки аутентификации
  18378. void GetUserLogin(uint8_t user_id, char *str, uint8_t *len)
  18379. {
  18380. 80282c8: 460c mov r4, r1
  18381. sprintf(str, "%s", sSettings.sAuth[user_id].login);
  18382. 80282ca: 4608 mov r0, r1
  18383. 80282cc: 3202 adds r2, #2
  18384. 80282ce: 4905 ldr r1, [pc, #20] ; (80282e4 <GetUserLogin+0x28>)
  18385. 80282d0: f7ff fd0a bl 8027ce8 <tfp_sprintf>
  18386. *len = strlen(str);
  18387. 80282d4: 4620 mov r0, r4
  18388. 80282d6: f7f9 ff77 bl 80221c8 <strlen>
  18389. 80282da: 7028 strb r0, [r5, #0]
  18390. 80282dc: bd38 pop {r3, r4, r5, pc}
  18391. 80282de: bf00 nop
  18392. 80282e0: 2000d724 .word 0x2000d724
  18393. 80282e4: 080402f4 .word 0x080402f4
  18394. 080282e8 <GetUserPassword>:
  18395. }
  18396. void GetUserPassword(uint8_t user_id, char *str, uint8_t *len)
  18397. {
  18398. 80282e8: b538 push {r3, r4, r5, lr}
  18399. sprintf(str, "%s", sSettings.sAuth[user_id].password);
  18400. 80282ea: 4b08 ldr r3, [pc, #32] ; (802830c <GetUserPassword+0x24>)
  18401. sprintf(str, "%s", sSettings.sAuth[user_id].login);
  18402. *len = strlen(str);
  18403. }
  18404. void GetUserPassword(uint8_t user_id, char *str, uint8_t *len)
  18405. {
  18406. 80282ec: 4615 mov r5, r2
  18407. sprintf(str, "%s", sSettings.sAuth[user_id].password);
  18408. 80282ee: 2217 movs r2, #23
  18409. 80282f0: fb02 3200 mla r2, r2, r0, r3
  18410. sprintf(str, "%s", sSettings.sAuth[user_id].login);
  18411. *len = strlen(str);
  18412. }
  18413. void GetUserPassword(uint8_t user_id, char *str, uint8_t *len)
  18414. {
  18415. 80282f4: 460c mov r4, r1
  18416. sprintf(str, "%s", sSettings.sAuth[user_id].password);
  18417. 80282f6: 4608 mov r0, r1
  18418. 80282f8: 3205 adds r2, #5
  18419. 80282fa: 4905 ldr r1, [pc, #20] ; (8028310 <GetUserPassword+0x28>)
  18420. 80282fc: f7ff fcf4 bl 8027ce8 <tfp_sprintf>
  18421. *len = strlen(str);
  18422. 8028300: 4620 mov r0, r4
  18423. 8028302: f7f9 ff61 bl 80221c8 <strlen>
  18424. 8028306: 7028 strb r0, [r5, #0]
  18425. 8028308: bd38 pop {r3, r4, r5, pc}
  18426. 802830a: bf00 nop
  18427. 802830c: 2000d72c .word 0x2000d72c
  18428. 8028310: 080402f4 .word 0x080402f4
  18429. 08028314 <GetUserLevelInt>:
  18430. *len = strlen(str);
  18431. }
  18432. void GetUserLevelInt(uint8_t user_id, uint8_t *value)
  18433. {
  18434. *value = sSettings.sAuth[user_id].level;
  18435. 8028314: 4b03 ldr r3, [pc, #12] ; (8028324 <GetUserLevelInt+0x10>)
  18436. 8028316: 2217 movs r2, #23
  18437. 8028318: fb02 3000 mla r0, r2, r0, r3
  18438. 802831c: f890 3311 ldrb.w r3, [r0, #785] ; 0x311
  18439. 8028320: 700b strb r3, [r1, #0]
  18440. 8028322: 4770 bx lr
  18441. 8028324: 2000d414 .word 0x2000d414
  18442. 08028328 <GetIpStr>:
  18443. * @brief Текущий IP адрес
  18444. */
  18445. void GetIpStr(char *str, uint8_t *len)
  18446. {
  18447. /* Если сейчас временные настройки */
  18448. if (sSettings.sFlags.netsettingsChanged)
  18449. 8028328: 4a08 ldr r2, [pc, #32] ; (802834c <GetIpStr+0x24>)
  18450. /**
  18451. * @brief Текущий IP адрес
  18452. */
  18453. void GetIpStr(char *str, uint8_t *len)
  18454. {
  18455. 802832a: b538 push {r3, r4, r5, lr}
  18456. /* Если сейчас временные настройки */
  18457. if (sSettings.sFlags.netsettingsChanged)
  18458. 802832c: f892 3120 ldrb.w r3, [r2, #288] ; 0x120
  18459. /**
  18460. * @brief Текущий IP адрес
  18461. */
  18462. void GetIpStr(char *str, uint8_t *len)
  18463. {
  18464. 8028330: 460c mov r4, r1
  18465. 8028332: 4605 mov r5, r0
  18466. /* Если сейчас временные настройки */
  18467. if (sSettings.sFlags.netsettingsChanged)
  18468. sprintf(str, "%s", sSettings.sWebTempParams.ip);
  18469. 8028334: 4906 ldr r1, [pc, #24] ; (8028350 <GetIpStr+0x28>)
  18470. * @brief Текущий IP адрес
  18471. */
  18472. void GetIpStr(char *str, uint8_t *len)
  18473. {
  18474. /* Если сейчас временные настройки */
  18475. if (sSettings.sFlags.netsettingsChanged)
  18476. 8028336: b10b cbz r3, 802833c <GetIpStr+0x14>
  18477. sprintf(str, "%s", sSettings.sWebTempParams.ip);
  18478. 8028338: 3233 adds r2, #51 ; 0x33
  18479. 802833a: e000 b.n 802833e <GetIpStr+0x16>
  18480. else
  18481. sprintf(str, "%s", sSettings.sWebParams.ip);
  18482. 802833c: 3202 adds r2, #2
  18483. 802833e: f7ff fcd3 bl 8027ce8 <tfp_sprintf>
  18484. *len = strlen(str);
  18485. 8028342: 4628 mov r0, r5
  18486. 8028344: f7f9 ff40 bl 80221c8 <strlen>
  18487. 8028348: 7020 strb r0, [r4, #0]
  18488. 802834a: bd38 pop {r3, r4, r5, pc}
  18489. 802834c: 2000d414 .word 0x2000d414
  18490. 8028350: 080402f4 .word 0x080402f4
  18491. 08028354 <GetGatewayStr>:
  18492. * @brief Текущий шлюз
  18493. */
  18494. void GetGatewayStr(char *str, uint8_t *len)
  18495. {
  18496. /* Если сейчас временные настройки */
  18497. if (sSettings.sFlags.netsettingsChanged)
  18498. 8028354: 4a08 ldr r2, [pc, #32] ; (8028378 <GetGatewayStr+0x24>)
  18499. /**
  18500. * @brief Текущий шлюз
  18501. */
  18502. void GetGatewayStr(char *str, uint8_t *len)
  18503. {
  18504. 8028356: b538 push {r3, r4, r5, lr}
  18505. /* Если сейчас временные настройки */
  18506. if (sSettings.sFlags.netsettingsChanged)
  18507. 8028358: f892 3120 ldrb.w r3, [r2, #288] ; 0x120
  18508. /**
  18509. * @brief Текущий шлюз
  18510. */
  18511. void GetGatewayStr(char *str, uint8_t *len)
  18512. {
  18513. 802835c: 460c mov r4, r1
  18514. 802835e: 4605 mov r5, r0
  18515. /* Если сейчас временные настройки */
  18516. if (sSettings.sFlags.netsettingsChanged)
  18517. sprintf(str, "%s", sSettings.sWebTempParams.gate);
  18518. 8028360: 4906 ldr r1, [pc, #24] ; (802837c <GetGatewayStr+0x28>)
  18519. * @brief Текущий шлюз
  18520. */
  18521. void GetGatewayStr(char *str, uint8_t *len)
  18522. {
  18523. /* Если сейчас временные настройки */
  18524. if (sSettings.sFlags.netsettingsChanged)
  18525. 8028362: b10b cbz r3, 8028368 <GetGatewayStr+0x14>
  18526. sprintf(str, "%s", sSettings.sWebTempParams.gate);
  18527. 8028364: 3243 adds r2, #67 ; 0x43
  18528. 8028366: e000 b.n 802836a <GetGatewayStr+0x16>
  18529. else
  18530. sprintf(str, "%s", sSettings.sWebParams.gate);
  18531. 8028368: 3212 adds r2, #18
  18532. 802836a: f7ff fcbd bl 8027ce8 <tfp_sprintf>
  18533. *len = strlen(str);
  18534. 802836e: 4628 mov r0, r5
  18535. 8028370: f7f9 ff2a bl 80221c8 <strlen>
  18536. 8028374: 7020 strb r0, [r4, #0]
  18537. 8028376: bd38 pop {r3, r4, r5, pc}
  18538. 8028378: 2000d414 .word 0x2000d414
  18539. 802837c: 080402f4 .word 0x080402f4
  18540. 08028380 <GetMaskStr>:
  18541. * @brief Текущая маска подсети
  18542. */
  18543. void GetMaskStr(char *str, uint8_t *len)
  18544. {
  18545. /* Если сейчас временные настройки */
  18546. if (sSettings.sFlags.netsettingsChanged)
  18547. 8028380: 4a08 ldr r2, [pc, #32] ; (80283a4 <GetMaskStr+0x24>)
  18548. /**
  18549. * @brief Текущая маска подсети
  18550. */
  18551. void GetMaskStr(char *str, uint8_t *len)
  18552. {
  18553. 8028382: b538 push {r3, r4, r5, lr}
  18554. /* Если сейчас временные настройки */
  18555. if (sSettings.sFlags.netsettingsChanged)
  18556. 8028384: f892 3120 ldrb.w r3, [r2, #288] ; 0x120
  18557. /**
  18558. * @brief Текущая маска подсети
  18559. */
  18560. void GetMaskStr(char *str, uint8_t *len)
  18561. {
  18562. 8028388: 460c mov r4, r1
  18563. 802838a: 4605 mov r5, r0
  18564. /* Если сейчас временные настройки */
  18565. if (sSettings.sFlags.netsettingsChanged)
  18566. sprintf(str, "%s", sSettings.sWebTempParams.mask);
  18567. 802838c: 4906 ldr r1, [pc, #24] ; (80283a8 <GetMaskStr+0x28>)
  18568. * @brief Текущая маска подсети
  18569. */
  18570. void GetMaskStr(char *str, uint8_t *len)
  18571. {
  18572. /* Если сейчас временные настройки */
  18573. if (sSettings.sFlags.netsettingsChanged)
  18574. 802838e: b10b cbz r3, 8028394 <GetMaskStr+0x14>
  18575. sprintf(str, "%s", sSettings.sWebTempParams.mask);
  18576. 8028390: 3253 adds r2, #83 ; 0x53
  18577. 8028392: e000 b.n 8028396 <GetMaskStr+0x16>
  18578. else
  18579. sprintf(str, "%s", sSettings.sWebParams.mask);
  18580. 8028394: 3222 adds r2, #34 ; 0x22
  18581. 8028396: f7ff fca7 bl 8027ce8 <tfp_sprintf>
  18582. *len = strlen(str);
  18583. 802839a: 4628 mov r0, r5
  18584. 802839c: f7f9 ff14 bl 80221c8 <strlen>
  18585. 80283a0: 7020 strb r0, [r4, #0]
  18586. 80283a2: bd38 pop {r3, r4, r5, pc}
  18587. 80283a4: 2000d414 .word 0x2000d414
  18588. 80283a8: 080402f4 .word 0x080402f4
  18589. 080283ac <GetDhcpStateStr>:
  18590. * @brief Настройка DHCP
  18591. */
  18592. void GetDhcpStateStr(char *str, uint8_t *len)
  18593. {
  18594. /* Если сейчас временные настройки */
  18595. if (sSettings.sFlags.netsettingsChanged)
  18596. 80283ac: 4b08 ldr r3, [pc, #32] ; (80283d0 <GetDhcpStateStr+0x24>)
  18597. 80283ae: f893 2120 ldrb.w r2, [r3, #288] ; 0x120
  18598. 80283b2: b112 cbz r2, 80283ba <GetDhcpStateStr+0xe>
  18599. {
  18600. if (sSettings.sWebTempParams.dhcpEnable)
  18601. 80283b4: f893 3063 ldrb.w r3, [r3, #99] ; 0x63
  18602. 80283b8: e001 b.n 80283be <GetDhcpStateStr+0x12>
  18603. else
  18604. *str = '0';
  18605. }
  18606. else
  18607. {
  18608. if (sSettings.sWebParams.dhcpEnable)
  18609. 80283ba: f893 3032 ldrb.w r3, [r3, #50] ; 0x32
  18610. 80283be: b10b cbz r3, 80283c4 <GetDhcpStateStr+0x18>
  18611. *str = '1';
  18612. 80283c0: 2331 movs r3, #49 ; 0x31
  18613. 80283c2: e000 b.n 80283c6 <GetDhcpStateStr+0x1a>
  18614. else
  18615. *str = '0';
  18616. 80283c4: 2330 movs r3, #48 ; 0x30
  18617. 80283c6: 7003 strb r3, [r0, #0]
  18618. }
  18619. *len = 1;
  18620. 80283c8: 2301 movs r3, #1
  18621. 80283ca: 700b strb r3, [r1, #0]
  18622. 80283cc: 4770 bx lr
  18623. 80283ce: bf00 nop
  18624. 80283d0: 2000d414 .word 0x2000d414
  18625. 080283d4 <GetReadCommunity>:
  18626. /**
  18627. * @brief Текущее community для чтения
  18628. */
  18629. void GetReadCommunity(char *str, uint8_t *len)
  18630. {
  18631. 80283d4: b538 push {r3, r4, r5, lr}
  18632. sprintf(str, "%s", sSettings.sSnmp.readCommunity);
  18633. 80283d6: 4a05 ldr r2, [pc, #20] ; (80283ec <GetReadCommunity+0x18>)
  18634. /**
  18635. * @brief Текущее community для чтения
  18636. */
  18637. void GetReadCommunity(char *str, uint8_t *len)
  18638. {
  18639. 80283d8: 4605 mov r5, r0
  18640. 80283da: 460c mov r4, r1
  18641. sprintf(str, "%s", sSettings.sSnmp.readCommunity);
  18642. 80283dc: 4904 ldr r1, [pc, #16] ; (80283f0 <GetReadCommunity+0x1c>)
  18643. 80283de: f7ff fc83 bl 8027ce8 <tfp_sprintf>
  18644. *len = strlen(str);
  18645. 80283e2: 4628 mov r0, r5
  18646. 80283e4: f7f9 fef0 bl 80221c8 <strlen>
  18647. 80283e8: 7020 strb r0, [r4, #0]
  18648. 80283ea: bd38 pop {r3, r4, r5, pc}
  18649. 80283ec: 2000d5e5 .word 0x2000d5e5
  18650. 80283f0: 080402f4 .word 0x080402f4
  18651. 080283f4 <GetWriteCommunity>:
  18652. /**
  18653. * @brief Текущее community для записи
  18654. */
  18655. void GetWriteCommunity(char *str, uint8_t *len)
  18656. {
  18657. 80283f4: b538 push {r3, r4, r5, lr}
  18658. sprintf(str, "%s", sSettings.sSnmp.writeCommunity);
  18659. 80283f6: 4a05 ldr r2, [pc, #20] ; (802840c <GetWriteCommunity+0x18>)
  18660. /**
  18661. * @brief Текущее community для записи
  18662. */
  18663. void GetWriteCommunity(char *str, uint8_t *len)
  18664. {
  18665. 80283f8: 4605 mov r5, r0
  18666. 80283fa: 460c mov r4, r1
  18667. sprintf(str, "%s", sSettings.sSnmp.writeCommunity);
  18668. 80283fc: 4904 ldr r1, [pc, #16] ; (8028410 <GetWriteCommunity+0x1c>)
  18669. 80283fe: f7ff fc73 bl 8027ce8 <tfp_sprintf>
  18670. *len = strlen(str);
  18671. 8028402: 4628 mov r0, r5
  18672. 8028404: f7f9 fee0 bl 80221c8 <strlen>
  18673. 8028408: 7020 strb r0, [r4, #0]
  18674. 802840a: bd38 pop {r3, r4, r5, pc}
  18675. 802840c: 2000d5f9 .word 0x2000d5f9
  18676. 8028410: 080402f4 .word 0x080402f4
  18677. 08028414 <GetManagerIp>:
  18678. /**
  18679. * @brief IP SNMP менеджера
  18680. */
  18681. void GetManagerIp(char *str, uint8_t *len)
  18682. {
  18683. 8028414: b538 push {r3, r4, r5, lr}
  18684. sprintf(str, "%s", sSettings.sSnmp.managerIP);
  18685. 8028416: 4a05 ldr r2, [pc, #20] ; (802842c <GetManagerIp+0x18>)
  18686. /**
  18687. * @brief IP SNMP менеджера
  18688. */
  18689. void GetManagerIp(char *str, uint8_t *len)
  18690. {
  18691. 8028418: 4605 mov r5, r0
  18692. 802841a: 460c mov r4, r1
  18693. sprintf(str, "%s", sSettings.sSnmp.managerIP);
  18694. 802841c: 4904 ldr r1, [pc, #16] ; (8028430 <GetManagerIp+0x1c>)
  18695. 802841e: f7ff fc63 bl 8027ce8 <tfp_sprintf>
  18696. *len = strlen(str);
  18697. 8028422: 4628 mov r0, r5
  18698. 8028424: f7f9 fed0 bl 80221c8 <strlen>
  18699. 8028428: 7020 strb r0, [r4, #0]
  18700. 802842a: bd38 pop {r3, r4, r5, pc}
  18701. 802842c: 2000d6c1 .word 0x2000d6c1
  18702. 8028430: 080402f4 .word 0x080402f4
  18703. 08028434 <GetManagerIp2>:
  18704. }
  18705. void GetManagerIp2(char *str, uint8_t *len)
  18706. {
  18707. 8028434: b538 push {r3, r4, r5, lr}
  18708. sprintf(str, "%s", sSettings.sSnmp.managerIP2);
  18709. 8028436: 4a05 ldr r2, [pc, #20] ; (802844c <GetManagerIp2+0x18>)
  18710. sprintf(str, "%s", sSettings.sSnmp.managerIP);
  18711. *len = strlen(str);
  18712. }
  18713. void GetManagerIp2(char *str, uint8_t *len)
  18714. {
  18715. 8028438: 4605 mov r5, r0
  18716. 802843a: 460c mov r4, r1
  18717. sprintf(str, "%s", sSettings.sSnmp.managerIP2);
  18718. 802843c: 4904 ldr r1, [pc, #16] ; (8028450 <GetManagerIp2+0x1c>)
  18719. 802843e: f7ff fc53 bl 8027ce8 <tfp_sprintf>
  18720. *len = strlen(str);
  18721. 8028442: 4628 mov r0, r5
  18722. 8028444: f7f9 fec0 bl 80221c8 <strlen>
  18723. 8028448: 7020 strb r0, [r4, #0]
  18724. 802844a: bd38 pop {r3, r4, r5, pc}
  18725. 802844c: 2000d6d5 .word 0x2000d6d5
  18726. 8028450: 080402f4 .word 0x080402f4
  18727. 08028454 <GetManagerIp3>:
  18728. }
  18729. void GetManagerIp3(char *str, uint8_t *len)
  18730. {
  18731. 8028454: b538 push {r3, r4, r5, lr}
  18732. sprintf(str, "%s", sSettings.sSnmp.managerIP3);
  18733. 8028456: 4a05 ldr r2, [pc, #20] ; (802846c <GetManagerIp3+0x18>)
  18734. sprintf(str, "%s", sSettings.sSnmp.managerIP2);
  18735. *len = strlen(str);
  18736. }
  18737. void GetManagerIp3(char *str, uint8_t *len)
  18738. {
  18739. 8028458: 4605 mov r5, r0
  18740. 802845a: 460c mov r4, r1
  18741. sprintf(str, "%s", sSettings.sSnmp.managerIP3);
  18742. 802845c: 4904 ldr r1, [pc, #16] ; (8028470 <GetManagerIp3+0x1c>)
  18743. 802845e: f7ff fc43 bl 8027ce8 <tfp_sprintf>
  18744. *len = strlen(str);
  18745. 8028462: 4628 mov r0, r5
  18746. 8028464: f7f9 feb0 bl 80221c8 <strlen>
  18747. 8028468: 7020 strb r0, [r4, #0]
  18748. 802846a: bd38 pop {r3, r4, r5, pc}
  18749. 802846c: 2000d6e9 .word 0x2000d6e9
  18750. 8028470: 080402f4 .word 0x080402f4
  18751. 08028474 <GetManagerIp4>:
  18752. }
  18753. void GetManagerIp4(char *str, uint8_t *len)
  18754. {
  18755. 8028474: b538 push {r3, r4, r5, lr}
  18756. sprintf(str, "%s", sSettings.sSnmp.managerIP4);
  18757. 8028476: 4a05 ldr r2, [pc, #20] ; (802848c <GetManagerIp4+0x18>)
  18758. sprintf(str, "%s", sSettings.sSnmp.managerIP3);
  18759. *len = strlen(str);
  18760. }
  18761. void GetManagerIp4(char *str, uint8_t *len)
  18762. {
  18763. 8028478: 4605 mov r5, r0
  18764. 802847a: 460c mov r4, r1
  18765. sprintf(str, "%s", sSettings.sSnmp.managerIP4);
  18766. 802847c: 4904 ldr r1, [pc, #16] ; (8028490 <GetManagerIp4+0x1c>)
  18767. 802847e: f7ff fc33 bl 8027ce8 <tfp_sprintf>
  18768. *len = strlen(str);
  18769. 8028482: 4628 mov r0, r5
  18770. 8028484: f7f9 fea0 bl 80221c8 <strlen>
  18771. 8028488: 7020 strb r0, [r4, #0]
  18772. 802848a: bd38 pop {r3, r4, r5, pc}
  18773. 802848c: 2000d6fd .word 0x2000d6fd
  18774. 8028490: 080402f4 .word 0x080402f4
  18775. 08028494 <GetManagerIp5>:
  18776. }
  18777. void GetManagerIp5(char *str, uint8_t *len)
  18778. {
  18779. 8028494: b538 push {r3, r4, r5, lr}
  18780. sprintf(str, "%s", sSettings.sSnmp.managerIP5);
  18781. 8028496: 4a05 ldr r2, [pc, #20] ; (80284ac <GetManagerIp5+0x18>)
  18782. sprintf(str, "%s", sSettings.sSnmp.managerIP4);
  18783. *len = strlen(str);
  18784. }
  18785. void GetManagerIp5(char *str, uint8_t *len)
  18786. {
  18787. 8028498: 4605 mov r5, r0
  18788. 802849a: 460c mov r4, r1
  18789. sprintf(str, "%s", sSettings.sSnmp.managerIP5);
  18790. 802849c: 4904 ldr r1, [pc, #16] ; (80284b0 <GetManagerIp5+0x1c>)
  18791. 802849e: f7ff fc23 bl 8027ce8 <tfp_sprintf>
  18792. *len = strlen(str);
  18793. 80284a2: 4628 mov r0, r5
  18794. 80284a4: f7f9 fe90 bl 80221c8 <strlen>
  18795. 80284a8: 7020 strb r0, [r4, #0]
  18796. 80284aa: bd38 pop {r3, r4, r5, pc}
  18797. 80284ac: 2000d711 .word 0x2000d711
  18798. 80284b0: 080402f4 .word 0x080402f4
  18799. 080284b4 <GetRDSIpStr>:
  18800. /**
  18801. * @brief Текущий IP адрес
  18802. */
  18803. void GetRDSIpStr(char *str, uint8_t *len)
  18804. {
  18805. 80284b4: b538 push {r3, r4, r5, lr}
  18806. sprintf(str, "%s", sSettings.sRADIUS.ServerIP);
  18807. 80284b6: 4a05 ldr r2, [pc, #20] ; (80284cc <GetRDSIpStr+0x18>)
  18808. /**
  18809. * @brief Текущий IP адрес
  18810. */
  18811. void GetRDSIpStr(char *str, uint8_t *len)
  18812. {
  18813. 80284b8: 4605 mov r5, r0
  18814. 80284ba: 460c mov r4, r1
  18815. sprintf(str, "%s", sSettings.sRADIUS.ServerIP);
  18816. 80284bc: 4904 ldr r1, [pc, #16] ; (80284d0 <GetRDSIpStr+0x1c>)
  18817. 80284be: f7ff fc13 bl 8027ce8 <tfp_sprintf>
  18818. *len = strlen(str);
  18819. 80284c2: 4628 mov r0, r5
  18820. 80284c4: f7f9 fe80 bl 80221c8 <strlen>
  18821. 80284c8: 7020 strb r0, [r4, #0]
  18822. 80284ca: bd38 pop {r3, r4, r5, pc}
  18823. 80284cc: 2000d78d .word 0x2000d78d
  18824. 80284d0: 080402f4 .word 0x080402f4
  18825. 080284d4 <GetRDSPortStr>:
  18826. /**
  18827. * @brief Текущий Порт
  18828. */
  18829. void GetRDSPortStr(char *str, uint8_t *len)
  18830. {
  18831. 80284d4: b538 push {r3, r4, r5, lr}
  18832. sprintf(str, "%d", sSettings.sRADIUS.port);
  18833. 80284d6: 4b06 ldr r3, [pc, #24] ; (80284f0 <GetRDSPortStr+0x1c>)
  18834. /**
  18835. * @brief Текущий Порт
  18836. */
  18837. void GetRDSPortStr(char *str, uint8_t *len)
  18838. {
  18839. 80284d8: 4605 mov r5, r0
  18840. 80284da: 460c mov r4, r1
  18841. sprintf(str, "%d", sSettings.sRADIUS.port);
  18842. 80284dc: f8d3 239c ldr.w r2, [r3, #924] ; 0x39c
  18843. 80284e0: 4904 ldr r1, [pc, #16] ; (80284f4 <GetRDSPortStr+0x20>)
  18844. 80284e2: f7ff fc01 bl 8027ce8 <tfp_sprintf>
  18845. *len = strlen(str);
  18846. 80284e6: 4628 mov r0, r5
  18847. 80284e8: f7f9 fe6e bl 80221c8 <strlen>
  18848. 80284ec: 7020 strb r0, [r4, #0]
  18849. 80284ee: bd38 pop {r3, r4, r5, pc}
  18850. 80284f0: 2000d414 .word 0x2000d414
  18851. 80284f4: 0803916f .word 0x0803916f
  18852. 080284f8 <GetRDSKeyAccesstStr>:
  18853. /**
  18854. * @brief Текущий Код access
  18855. */
  18856. void GetRDSKeyAccesstStr(char *str, uint8_t *len)
  18857. {
  18858. 80284f8: b538 push {r3, r4, r5, lr}
  18859. sprintf(str, "%d", sSettings.sRADIUS.key_access);
  18860. 80284fa: 4b06 ldr r3, [pc, #24] ; (8028514 <GetRDSKeyAccesstStr+0x1c>)
  18861. /**
  18862. * @brief Текущий Код access
  18863. */
  18864. void GetRDSKeyAccesstStr(char *str, uint8_t *len)
  18865. {
  18866. 80284fc: 4605 mov r5, r0
  18867. 80284fe: 460c mov r4, r1
  18868. sprintf(str, "%d", sSettings.sRADIUS.key_access);
  18869. 8028500: f8d3 23a0 ldr.w r2, [r3, #928] ; 0x3a0
  18870. 8028504: 4904 ldr r1, [pc, #16] ; (8028518 <GetRDSKeyAccesstStr+0x20>)
  18871. 8028506: f7ff fbef bl 8027ce8 <tfp_sprintf>
  18872. *len = strlen(str);
  18873. 802850a: 4628 mov r0, r5
  18874. 802850c: f7f9 fe5c bl 80221c8 <strlen>
  18875. 8028510: 7020 strb r0, [r4, #0]
  18876. 8028512: bd38 pop {r3, r4, r5, pc}
  18877. 8028514: 2000d414 .word 0x2000d414
  18878. 8028518: 0803916f .word 0x0803916f
  18879. 0802851c <GetRDSPasswordkStr>:
  18880. /**
  18881. * @brief Текущая пароль RADIUS
  18882. */
  18883. void GetRDSPasswordkStr(char *str, uint8_t *len)
  18884. {
  18885. 802851c: b538 push {r3, r4, r5, lr}
  18886. sprintf(str, "%s", sSettings.sRADIUS.rds_password);
  18887. 802851e: 4a05 ldr r2, [pc, #20] ; (8028534 <GetRDSPasswordkStr+0x18>)
  18888. /**
  18889. * @brief Текущая пароль RADIUS
  18890. */
  18891. void GetRDSPasswordkStr(char *str, uint8_t *len)
  18892. {
  18893. 8028520: 4605 mov r5, r0
  18894. 8028522: 460c mov r4, r1
  18895. sprintf(str, "%s", sSettings.sRADIUS.rds_password);
  18896. 8028524: 4904 ldr r1, [pc, #16] ; (8028538 <GetRDSPasswordkStr+0x1c>)
  18897. 8028526: f7ff fbdf bl 8027ce8 <tfp_sprintf>
  18898. *len = strlen(str);
  18899. 802852a: 4628 mov r0, r5
  18900. 802852c: f7f9 fe4c bl 80221c8 <strlen>
  18901. 8028530: 7020 strb r0, [r4, #0]
  18902. 8028532: bd38 pop {r3, r4, r5, pc}
  18903. 8028534: 2000d79d .word 0x2000d79d
  18904. 8028538: 080402f4 .word 0x080402f4
  18905. 0802853c <GetRDSEnableStateStr>:
  18906. /**
  18907. * @brief Настройка вкл/ выкл RADIUS сервера
  18908. */
  18909. void GetRDSEnableStateStr(char *str, uint8_t *len)
  18910. {
  18911. if (sSettings.sRADIUS.RDSEnable)
  18912. 802853c: 4b05 ldr r3, [pc, #20] ; (8028554 <GetRDSEnableStateStr+0x18>)
  18913. 802853e: f893 339a ldrb.w r3, [r3, #922] ; 0x39a
  18914. 8028542: b10b cbz r3, 8028548 <GetRDSEnableStateStr+0xc>
  18915. *str = '1';
  18916. 8028544: 2331 movs r3, #49 ; 0x31
  18917. 8028546: e000 b.n 802854a <GetRDSEnableStateStr+0xe>
  18918. else
  18919. *str = '0';
  18920. 8028548: 2330 movs r3, #48 ; 0x30
  18921. 802854a: 7003 strb r3, [r0, #0]
  18922. *len = 1;
  18923. 802854c: 2301 movs r3, #1
  18924. 802854e: 700b strb r3, [r1, #0]
  18925. 8028550: 4770 bx lr
  18926. 8028552: bf00 nop
  18927. 8028554: 2000d414 .word 0x2000d414
  18928. 08028558 <GetAuthEnableStateStr>:
  18929. /**
  18930. * @brief Настройка вкл/ выкл авторизации
  18931. */
  18932. void GetAuthEnableStateStr(char *str, uint8_t *len)
  18933. {
  18934. if (sSettings.sRADIUS.Auth_enable)
  18935. 8028558: 4b05 ldr r3, [pc, #20] ; (8028570 <GetAuthEnableStateStr+0x18>)
  18936. 802855a: f893 3378 ldrb.w r3, [r3, #888] ; 0x378
  18937. 802855e: b10b cbz r3, 8028564 <GetAuthEnableStateStr+0xc>
  18938. *str = '1';
  18939. 8028560: 2331 movs r3, #49 ; 0x31
  18940. 8028562: e000 b.n 8028566 <GetAuthEnableStateStr+0xe>
  18941. else
  18942. *str = '0';
  18943. 8028564: 2330 movs r3, #48 ; 0x30
  18944. 8028566: 7003 strb r3, [r0, #0]
  18945. *len = 1;
  18946. 8028568: 2301 movs r3, #1
  18947. 802856a: 700b strb r3, [r1, #0]
  18948. 802856c: 4770 bx lr
  18949. 802856e: bf00 nop
  18950. 8028570: 2000d414 .word 0x2000d414
  18951. 08028574 <GetWebReinitFlag>:
  18952. /**
  18953. * @brief Вернуть признак изменения сетевых параметров
  18954. */
  18955. void GetWebReinitFlag(char *str, uint8_t *len)
  18956. {
  18957. 8028574: b538 push {r3, r4, r5, lr}
  18958. if (sSettings.sFlags.netsettingsChanged)
  18959. 8028576: 4b08 ldr r3, [pc, #32] ; (8028598 <GetWebReinitFlag+0x24>)
  18960. 8028578: f893 3120 ldrb.w r3, [r3, #288] ; 0x120
  18961. /**
  18962. * @brief Вернуть признак изменения сетевых параметров
  18963. */
  18964. void GetWebReinitFlag(char *str, uint8_t *len)
  18965. {
  18966. 802857c: 460c mov r4, r1
  18967. 802857e: 4605 mov r5, r0
  18968. if (sSettings.sFlags.netsettingsChanged)
  18969. {
  18970. sprintf(str, "%s", "true");
  18971. 8028580: 4906 ldr r1, [pc, #24] ; (802859c <GetWebReinitFlag+0x28>)
  18972. /**
  18973. * @brief Вернуть признак изменения сетевых параметров
  18974. */
  18975. void GetWebReinitFlag(char *str, uint8_t *len)
  18976. {
  18977. if (sSettings.sFlags.netsettingsChanged)
  18978. 8028582: b10b cbz r3, 8028588 <GetWebReinitFlag+0x14>
  18979. {
  18980. sprintf(str, "%s", "true");
  18981. 8028584: 4a06 ldr r2, [pc, #24] ; (80285a0 <GetWebReinitFlag+0x2c>)
  18982. 8028586: e000 b.n 802858a <GetWebReinitFlag+0x16>
  18983. *len = strlen(str);
  18984. }
  18985. else
  18986. {
  18987. sprintf(str, "%s", "false");
  18988. 8028588: 4a06 ldr r2, [pc, #24] ; (80285a4 <GetWebReinitFlag+0x30>)
  18989. 802858a: f7ff fbad bl 8027ce8 <tfp_sprintf>
  18990. *len = strlen(str);
  18991. 802858e: 4628 mov r0, r5
  18992. 8028590: f7f9 fe1a bl 80221c8 <strlen>
  18993. 8028594: 7020 strb r0, [r4, #0]
  18994. 8028596: bd38 pop {r3, r4, r5, pc}
  18995. 8028598: 2000d414 .word 0x2000d414
  18996. 802859c: 080402f4 .word 0x080402f4
  18997. 80285a0: 080391a6 .word 0x080391a6
  18998. 80285a4: 080391ab .word 0x080391ab
  18999. 080285a8 <SetLoadMode>:
  19000. * @brief Установить признак обновления ПО.
  19001. */
  19002. void SetLoadMode(void)
  19003. {
  19004. /* Set loadMode = 1 */
  19005. RTC_WriteBackupRegister(RTC_BKP_DR1, 1);
  19006. 80285a8: 2001 movs r0, #1
  19007. /**
  19008. * @brief Установить признак обновления ПО.
  19009. */
  19010. void SetLoadMode(void)
  19011. {
  19012. 80285aa: b508 push {r3, lr}
  19013. /* Set loadMode = 1 */
  19014. RTC_WriteBackupRegister(RTC_BKP_DR1, 1);
  19015. 80285ac: 4601 mov r1, r0
  19016. 80285ae: f7fd fc2b bl 8025e08 <RTC_WriteBackupRegister>
  19017. /* Set bootTry = 0 */
  19018. RTC_WriteBackupRegister(RTC_BKP_DR2, 0);
  19019. 80285b2: 2002 movs r0, #2
  19020. 80285b4: 2100 movs r1, #0
  19021. }
  19022. 80285b6: e8bd 4008 ldmia.w sp!, {r3, lr}
  19023. void SetLoadMode(void)
  19024. {
  19025. /* Set loadMode = 1 */
  19026. RTC_WriteBackupRegister(RTC_BKP_DR1, 1);
  19027. /* Set bootTry = 0 */
  19028. RTC_WriteBackupRegister(RTC_BKP_DR2, 0);
  19029. 80285ba: f7fd bc25 b.w 8025e08 <RTC_WriteBackupRegister>
  19030. 80285be: 0000 movs r0, r0
  19031. 080285c0 <SetWebReinitFlag>:
  19032. /**
  19033. * @brief Установить признак изменения сетевых параметров
  19034. */
  19035. void SetWebReinitFlag(bool value)
  19036. {
  19037. sSettings.sFlags.netsettingsChanged = value;
  19038. 80285c0: 4b01 ldr r3, [pc, #4] ; (80285c8 <SetWebReinitFlag+0x8>)
  19039. 80285c2: f883 0120 strb.w r0, [r3, #288] ; 0x120
  19040. 80285c6: 4770 bx lr
  19041. 80285c8: 2000d414 .word 0x2000d414
  19042. 080285cc <SetConfirmWebParamsFlag>:
  19043. /**
  19044. * @brief Установить флаг подтверждения сетевых настроек пользователем
  19045. */
  19046. void SetConfirmWebParamsFlag(void)
  19047. {
  19048. fConfirmWebParams = true;
  19049. 80285cc: 4b01 ldr r3, [pc, #4] ; (80285d4 <SetConfirmWebParamsFlag+0x8>)
  19050. 80285ce: 2201 movs r2, #1
  19051. 80285d0: 701a strb r2, [r3, #0]
  19052. 80285d2: 4770 bx lr
  19053. 80285d4: 20000b2c .word 0x20000b2c
  19054. 080285d8 <SetIPStr>:
  19055. // Сетевые параметры
  19056. /**
  19057. * @brief IP адрес
  19058. */
  19059. void SetIPStr(char *str)
  19060. {
  19061. 80285d8: 4601 mov r1, r0
  19062. //strcpy(sSettings.sWebParams.ip, str);
  19063. strcpy(sSettings.sWebTempParams.ip, str);
  19064. 80285da: 4801 ldr r0, [pc, #4] ; (80285e0 <SetIPStr+0x8>)
  19065. 80285dc: f7f9 bd96 b.w 802210c <strcpy>
  19066. 80285e0: 2000d447 .word 0x2000d447
  19067. 080285e4 <SetGatewayStr>:
  19068. /**
  19069. * @brief Шлюз
  19070. */
  19071. void SetGatewayStr(char *str)
  19072. {
  19073. 80285e4: 4601 mov r1, r0
  19074. //strcpy(sSettings.sWebParams.gate, str);
  19075. strcpy(sSettings.sWebTempParams.gate, str);
  19076. 80285e6: 4801 ldr r0, [pc, #4] ; (80285ec <SetGatewayStr+0x8>)
  19077. 80285e8: f7f9 bd90 b.w 802210c <strcpy>
  19078. 80285ec: 2000d457 .word 0x2000d457
  19079. 080285f0 <SetMaskStr>:
  19080. /**
  19081. * @brief Текущая маска подсети
  19082. */
  19083. void SetMaskStr(char *str)
  19084. {
  19085. 80285f0: 4601 mov r1, r0
  19086. //strcpy(sSettings.sWebParams.mask, str);
  19087. strcpy(sSettings.sWebTempParams.mask, str);
  19088. 80285f2: 4801 ldr r0, [pc, #4] ; (80285f8 <SetMaskStr+0x8>)
  19089. 80285f4: f7f9 bd8a b.w 802210c <strcpy>
  19090. 80285f8: 2000d467 .word 0x2000d467
  19091. 080285fc <SetDhcpStateStr>:
  19092. /**
  19093. * @brief Настройка DHCP
  19094. */
  19095. void SetDhcpStateStr(char *str)
  19096. {
  19097. 80285fc: b508 push {r3, lr}
  19098. if (strncmp(str, "on", 2) == 0)
  19099. 80285fe: 4906 ldr r1, [pc, #24] ; (8028618 <SetDhcpStateStr+0x1c>)
  19100. 8028600: 2202 movs r2, #2
  19101. 8028602: f7f9 fe43 bl 802228c <strncmp>
  19102. 8028606: 4b05 ldr r3, [pc, #20] ; (802861c <SetDhcpStateStr+0x20>)
  19103. 8028608: b908 cbnz r0, 802860e <SetDhcpStateStr+0x12>
  19104. //sSettings.sWebParams.dhcpEnable = 1;
  19105. sSettings.sWebTempParams.dhcpEnable = 1;
  19106. 802860a: 2201 movs r2, #1
  19107. 802860c: e000 b.n 8028610 <SetDhcpStateStr+0x14>
  19108. else
  19109. //sSettings.sWebParams.dhcpEnable = 0;
  19110. sSettings.sWebTempParams.dhcpEnable = 0;
  19111. 802860e: 2200 movs r2, #0
  19112. 8028610: f883 2063 strb.w r2, [r3, #99] ; 0x63
  19113. 8028614: bd08 pop {r3, pc}
  19114. 8028616: bf00 nop
  19115. 8028618: 080391b1 .word 0x080391b1
  19116. 802861c: 2000d414 .word 0x2000d414
  19117. 08028620 <SetReadCommunity>:
  19118. /**
  19119. * @brief Community для чтения
  19120. */
  19121. void SetReadCommunity(char *str)
  19122. {
  19123. 8028620: 4601 mov r1, r0
  19124. strcpy(sSettings.sSnmp.readCommunity, str);
  19125. 8028622: 4801 ldr r0, [pc, #4] ; (8028628 <SetReadCommunity+0x8>)
  19126. 8028624: f7f9 bd72 b.w 802210c <strcpy>
  19127. 8028628: 2000d5e5 .word 0x2000d5e5
  19128. 0802862c <SetWriteCommunity>:
  19129. /**
  19130. * @brief Community для записи
  19131. */
  19132. void SetWriteCommunity(char *str)
  19133. {
  19134. 802862c: 4601 mov r1, r0
  19135. strcpy(sSettings.sSnmp.writeCommunity, str);
  19136. 802862e: 4801 ldr r0, [pc, #4] ; (8028634 <SetWriteCommunity+0x8>)
  19137. 8028630: f7f9 bd6c b.w 802210c <strcpy>
  19138. 8028634: 2000d5f9 .word 0x2000d5f9
  19139. 08028638 <SetManagerIp>:
  19140. #ifndef BT6702_SERVICE
  19141. /**
  19142. * @brief IP SNMP менеджера
  19143. */
  19144. void SetManagerIp(char *str)
  19145. {
  19146. 8028638: b510 push {r4, lr}
  19147. strcpy(sSettings.sSnmp.managerIP, str);
  19148. 802863a: 4c05 ldr r4, [pc, #20] ; (8028650 <SetManagerIp+0x18>)
  19149. #ifndef BT6702_SERVICE
  19150. /**
  19151. * @brief IP SNMP менеджера
  19152. */
  19153. void SetManagerIp(char *str)
  19154. {
  19155. 802863c: 4601 mov r1, r0
  19156. strcpy(sSettings.sSnmp.managerIP, str);
  19157. 802863e: 4620 mov r0, r4
  19158. 8028640: f7f9 fd64 bl 802210c <strcpy>
  19159. SNMP_SetManagerIP(sSettings.sSnmp.managerIP);
  19160. 8028644: 4620 mov r0, r4
  19161. }
  19162. 8028646: e8bd 4010 ldmia.w sp!, {r4, lr}
  19163. * @brief IP SNMP менеджера
  19164. */
  19165. void SetManagerIp(char *str)
  19166. {
  19167. strcpy(sSettings.sSnmp.managerIP, str);
  19168. SNMP_SetManagerIP(sSettings.sSnmp.managerIP);
  19169. 802864a: f00f bbdd b.w 8037e08 <SNMP_SetManagerIP>
  19170. 802864e: bf00 nop
  19171. 8028650: 2000d6c1 .word 0x2000d6c1
  19172. 08028654 <SetManagerIp2>:
  19173. }
  19174. void SetManagerIp2(char *str)
  19175. {
  19176. 8028654: b510 push {r4, lr}
  19177. strcpy(sSettings.sSnmp.managerIP2, str);
  19178. 8028656: 4c05 ldr r4, [pc, #20] ; (802866c <SetManagerIp2+0x18>)
  19179. strcpy(sSettings.sSnmp.managerIP, str);
  19180. SNMP_SetManagerIP(sSettings.sSnmp.managerIP);
  19181. }
  19182. void SetManagerIp2(char *str)
  19183. {
  19184. 8028658: 4601 mov r1, r0
  19185. strcpy(sSettings.sSnmp.managerIP2, str);
  19186. 802865a: 4620 mov r0, r4
  19187. 802865c: f7f9 fd56 bl 802210c <strcpy>
  19188. SNMP_SetManagerIP(sSettings.sSnmp.managerIP2);
  19189. 8028660: 4620 mov r0, r4
  19190. }
  19191. 8028662: e8bd 4010 ldmia.w sp!, {r4, lr}
  19192. }
  19193. void SetManagerIp2(char *str)
  19194. {
  19195. strcpy(sSettings.sSnmp.managerIP2, str);
  19196. SNMP_SetManagerIP(sSettings.sSnmp.managerIP2);
  19197. 8028666: f00f bbcf b.w 8037e08 <SNMP_SetManagerIP>
  19198. 802866a: bf00 nop
  19199. 802866c: 2000d6d5 .word 0x2000d6d5
  19200. 08028670 <SetManagerIp3>:
  19201. }
  19202. void SetManagerIp3(char *str)
  19203. {
  19204. 8028670: b510 push {r4, lr}
  19205. strcpy(sSettings.sSnmp.managerIP3, str);
  19206. 8028672: 4c05 ldr r4, [pc, #20] ; (8028688 <SetManagerIp3+0x18>)
  19207. strcpy(sSettings.sSnmp.managerIP2, str);
  19208. SNMP_SetManagerIP(sSettings.sSnmp.managerIP2);
  19209. }
  19210. void SetManagerIp3(char *str)
  19211. {
  19212. 8028674: 4601 mov r1, r0
  19213. strcpy(sSettings.sSnmp.managerIP3, str);
  19214. 8028676: 4620 mov r0, r4
  19215. 8028678: f7f9 fd48 bl 802210c <strcpy>
  19216. SNMP_SetManagerIP(sSettings.sSnmp.managerIP3);
  19217. 802867c: 4620 mov r0, r4
  19218. }
  19219. 802867e: e8bd 4010 ldmia.w sp!, {r4, lr}
  19220. }
  19221. void SetManagerIp3(char *str)
  19222. {
  19223. strcpy(sSettings.sSnmp.managerIP3, str);
  19224. SNMP_SetManagerIP(sSettings.sSnmp.managerIP3);
  19225. 8028682: f00f bbc1 b.w 8037e08 <SNMP_SetManagerIP>
  19226. 8028686: bf00 nop
  19227. 8028688: 2000d6e9 .word 0x2000d6e9
  19228. 0802868c <SetManagerIp4>:
  19229. }
  19230. void SetManagerIp4(char *str)
  19231. {
  19232. 802868c: b510 push {r4, lr}
  19233. strcpy(sSettings.sSnmp.managerIP4, str);
  19234. 802868e: 4c05 ldr r4, [pc, #20] ; (80286a4 <SetManagerIp4+0x18>)
  19235. strcpy(sSettings.sSnmp.managerIP3, str);
  19236. SNMP_SetManagerIP(sSettings.sSnmp.managerIP3);
  19237. }
  19238. void SetManagerIp4(char *str)
  19239. {
  19240. 8028690: 4601 mov r1, r0
  19241. strcpy(sSettings.sSnmp.managerIP4, str);
  19242. 8028692: 4620 mov r0, r4
  19243. 8028694: f7f9 fd3a bl 802210c <strcpy>
  19244. SNMP_SetManagerIP(sSettings.sSnmp.managerIP4);
  19245. 8028698: 4620 mov r0, r4
  19246. }
  19247. 802869a: e8bd 4010 ldmia.w sp!, {r4, lr}
  19248. }
  19249. void SetManagerIp4(char *str)
  19250. {
  19251. strcpy(sSettings.sSnmp.managerIP4, str);
  19252. SNMP_SetManagerIP(sSettings.sSnmp.managerIP4);
  19253. 802869e: f00f bbb3 b.w 8037e08 <SNMP_SetManagerIP>
  19254. 80286a2: bf00 nop
  19255. 80286a4: 2000d6fd .word 0x2000d6fd
  19256. 080286a8 <SetManagerIp5>:
  19257. }
  19258. void SetManagerIp5(char *str)
  19259. {
  19260. 80286a8: b510 push {r4, lr}
  19261. strcpy(sSettings.sSnmp.managerIP5, str);
  19262. 80286aa: 4c05 ldr r4, [pc, #20] ; (80286c0 <SetManagerIp5+0x18>)
  19263. strcpy(sSettings.sSnmp.managerIP4, str);
  19264. SNMP_SetManagerIP(sSettings.sSnmp.managerIP4);
  19265. }
  19266. void SetManagerIp5(char *str)
  19267. {
  19268. 80286ac: 4601 mov r1, r0
  19269. strcpy(sSettings.sSnmp.managerIP5, str);
  19270. 80286ae: 4620 mov r0, r4
  19271. 80286b0: f7f9 fd2c bl 802210c <strcpy>
  19272. SNMP_SetManagerIP(sSettings.sSnmp.managerIP5);
  19273. 80286b4: 4620 mov r0, r4
  19274. }
  19275. 80286b6: e8bd 4010 ldmia.w sp!, {r4, lr}
  19276. }
  19277. void SetManagerIp5(char *str)
  19278. {
  19279. strcpy(sSettings.sSnmp.managerIP5, str);
  19280. SNMP_SetManagerIP(sSettings.sSnmp.managerIP5);
  19281. 80286ba: f00f bba5 b.w 8037e08 <SNMP_SetManagerIP>
  19282. 80286be: bf00 nop
  19283. 80286c0: 2000d711 .word 0x2000d711
  19284. 080286c4 <SetOwner>:
  19285. /**
  19286. * @brief Установить владельца
  19287. */
  19288. void SetOwner(char *str)
  19289. {
  19290. 80286c4: b510 push {r4, lr}
  19291. strcpy(sSettings.sSnmp.sysContact, str);
  19292. 80286c6: 4c06 ldr r4, [pc, #24] ; (80286e0 <SetOwner+0x1c>)
  19293. /**
  19294. * @brief Установить владельца
  19295. */
  19296. void SetOwner(char *str)
  19297. {
  19298. 80286c8: 4601 mov r1, r0
  19299. strcpy(sSettings.sSnmp.sysContact, str);
  19300. 80286ca: 4620 mov r0, r4
  19301. 80286cc: f7f9 fd1e bl 802210c <strcpy>
  19302. SNMP_SetSysContact(sSettings.sSnmp.sysContact);
  19303. 80286d0: 4620 mov r0, r4
  19304. 80286d2: f00f fb6f bl 8037db4 <SNMP_SetSysContact>
  19305. SNMP_SetObjDescr();
  19306. }
  19307. 80286d6: e8bd 4010 ldmia.w sp!, {r4, lr}
  19308. */
  19309. void SetOwner(char *str)
  19310. {
  19311. strcpy(sSettings.sSnmp.sysContact, str);
  19312. SNMP_SetSysContact(sSettings.sSnmp.sysContact);
  19313. SNMP_SetObjDescr();
  19314. 80286da: f00f bb21 b.w 8037d20 <SNMP_SetObjDescr>
  19315. 80286de: bf00 nop
  19316. 80286e0: 2000d60d .word 0x2000d60d
  19317. 080286e4 <SetLocation>:
  19318. /**
  19319. * @brief Установить местоположение
  19320. */
  19321. void SetLocation(char *str)
  19322. {
  19323. 80286e4: b510 push {r4, lr}
  19324. strcpy(sSettings.sSnmp.sysLocation, str);
  19325. 80286e6: 4c05 ldr r4, [pc, #20] ; (80286fc <SetLocation+0x18>)
  19326. /**
  19327. * @brief Установить местоположение
  19328. */
  19329. void SetLocation(char *str)
  19330. {
  19331. 80286e8: 4601 mov r1, r0
  19332. strcpy(sSettings.sSnmp.sysLocation, str);
  19333. 80286ea: 4620 mov r0, r4
  19334. 80286ec: f7f9 fd0e bl 802210c <strcpy>
  19335. SNMP_SetSysLocation(sSettings.sSnmp.sysLocation);
  19336. 80286f0: 4620 mov r0, r4
  19337. }
  19338. 80286f2: e8bd 4010 ldmia.w sp!, {r4, lr}
  19339. * @brief Установить местоположение
  19340. */
  19341. void SetLocation(char *str)
  19342. {
  19343. strcpy(sSettings.sSnmp.sysLocation, str);
  19344. SNMP_SetSysLocation(sSettings.sSnmp.sysLocation);
  19345. 80286f6: f00f bb79 b.w 8037dec <SNMP_SetSysLocation>
  19346. 80286fa: bf00 nop
  19347. 80286fc: 2000d653 .word 0x2000d653
  19348. 08028700 <SetComment>:
  19349. #endif
  19350. /**
  19351. * @brief Установить комментарий
  19352. */
  19353. void SetComment(char *str)
  19354. {
  19355. 8028700: 4601 mov r1, r0
  19356. strcpy(sSettings.sInfo.comments, str);
  19357. 8028702: 4801 ldr r0, [pc, #4] ; (8028708 <SetComment+0x8>)
  19358. 8028704: f7f9 bd02 b.w 802210c <strcpy>
  19359. 8028708: 2000d4c2 .word 0x2000d4c2
  19360. 0802870c <SetRDSIpStr>:
  19361. // Сетевые параметры RADIUS сервера
  19362. /**
  19363. * @brief IP адрес
  19364. */
  19365. void SetRDSIpStr(char *str)
  19366. {
  19367. 802870c: 4601 mov r1, r0
  19368. strcpy(sSettings.sRADIUS.ServerIP, str);
  19369. 802870e: 4801 ldr r0, [pc, #4] ; (8028714 <SetRDSIpStr+0x8>)
  19370. 8028710: f7f9 bcfc b.w 802210c <strcpy>
  19371. 8028714: 2000d78d .word 0x2000d78d
  19372. 08028718 <SetRDSPortStr>:
  19373. /**
  19374. * @brief Порт
  19375. */
  19376. void SetRDSPortStr(char *str)
  19377. {
  19378. 8028718: b508 push {r3, lr}
  19379. sSettings.sRADIUS.port = atoi(str);
  19380. 802871a: f7f9 fa5d bl 8021bd8 <atoi>
  19381. 802871e: 4b02 ldr r3, [pc, #8] ; (8028728 <SetRDSPortStr+0x10>)
  19382. 8028720: f8c3 039c str.w r0, [r3, #924] ; 0x39c
  19383. 8028724: bd08 pop {r3, pc}
  19384. 8028726: bf00 nop
  19385. 8028728: 2000d414 .word 0x2000d414
  19386. 0802872c <SetRDSKeyAccesstStr>:
  19387. /**
  19388. * @brief Код access
  19389. */
  19390. void SetRDSKeyAccesstStr(char *str)
  19391. {
  19392. 802872c: b508 push {r3, lr}
  19393. sSettings.sRADIUS.key_access = atoi(str);
  19394. 802872e: f7f9 fa53 bl 8021bd8 <atoi>
  19395. 8028732: 4b02 ldr r3, [pc, #8] ; (802873c <SetRDSKeyAccesstStr+0x10>)
  19396. 8028734: f8c3 03a0 str.w r0, [r3, #928] ; 0x3a0
  19397. 8028738: bd08 pop {r3, pc}
  19398. 802873a: bf00 nop
  19399. 802873c: 2000d414 .word 0x2000d414
  19400. 08028740 <SetRDSPasswordkStr>:
  19401. /**
  19402. * @brief пароль RADIUS
  19403. */
  19404. void SetRDSPasswordkStr(char *str)
  19405. {
  19406. 8028740: 4601 mov r1, r0
  19407. strcpy(sSettings.sRADIUS.rds_password, str);
  19408. 8028742: 4801 ldr r0, [pc, #4] ; (8028748 <SetRDSPasswordkStr+0x8>)
  19409. 8028744: f7f9 bce2 b.w 802210c <strcpy>
  19410. 8028748: 2000d79d .word 0x2000d79d
  19411. 0802874c <SetRDSEnableStateStr>:
  19412. /**
  19413. * @brief Настройка вкл/ выкл RADIUS сервера
  19414. */
  19415. void SetRDSEnableStateStr(char *str)
  19416. {
  19417. 802874c: b508 push {r3, lr}
  19418. if (strncmp(str, "on", 2) == 0)
  19419. 802874e: 4906 ldr r1, [pc, #24] ; (8028768 <SetRDSEnableStateStr+0x1c>)
  19420. 8028750: 2202 movs r2, #2
  19421. 8028752: f7f9 fd9b bl 802228c <strncmp>
  19422. 8028756: 4b05 ldr r3, [pc, #20] ; (802876c <SetRDSEnableStateStr+0x20>)
  19423. 8028758: b908 cbnz r0, 802875e <SetRDSEnableStateStr+0x12>
  19424. sSettings.sRADIUS.RDSEnable = 1;
  19425. 802875a: 2201 movs r2, #1
  19426. 802875c: e000 b.n 8028760 <SetRDSEnableStateStr+0x14>
  19427. else
  19428. sSettings.sRADIUS.RDSEnable = 0;
  19429. 802875e: 2200 movs r2, #0
  19430. 8028760: f883 239a strb.w r2, [r3, #922] ; 0x39a
  19431. 8028764: bd08 pop {r3, pc}
  19432. 8028766: bf00 nop
  19433. 8028768: 080391b1 .word 0x080391b1
  19434. 802876c: 2000d414 .word 0x2000d414
  19435. 08028770 <SetAuthEnableStateStr>:
  19436. /**
  19437. * @brief Настройка вкл/ выкл авторизации
  19438. */
  19439. void SetAuthEnableStateStr(char *str)
  19440. {
  19441. 8028770: b508 push {r3, lr}
  19442. if (strncmp(str, "on", 2) == 0)
  19443. 8028772: 4906 ldr r1, [pc, #24] ; (802878c <SetAuthEnableStateStr+0x1c>)
  19444. 8028774: 2202 movs r2, #2
  19445. 8028776: f7f9 fd89 bl 802228c <strncmp>
  19446. 802877a: 4b05 ldr r3, [pc, #20] ; (8028790 <SetAuthEnableStateStr+0x20>)
  19447. 802877c: b908 cbnz r0, 8028782 <SetAuthEnableStateStr+0x12>
  19448. sSettings.sRADIUS.Auth_enable = 1;
  19449. 802877e: 2201 movs r2, #1
  19450. 8028780: e000 b.n 8028784 <SetAuthEnableStateStr+0x14>
  19451. else
  19452. sSettings.sRADIUS.Auth_enable = 0;
  19453. 8028782: 2200 movs r2, #0
  19454. 8028784: f883 2378 strb.w r2, [r3, #888] ; 0x378
  19455. 8028788: bd08 pop {r3, pc}
  19456. 802878a: bf00 nop
  19457. 802878c: 080391b1 .word 0x080391b1
  19458. 8028790: 2000d414 .word 0x2000d414
  19459. 08028794 <SetDateStr>:
  19460. /**
  19461. * @brief Дата
  19462. */
  19463. void SetDateStr(char *str)
  19464. {
  19465. 8028794: b510 push {r4, lr}
  19466. 8028796: b08c sub sp, #48 ; 0x30
  19467. 8028798: 4604 mov r4, r0
  19468. TM_RTC_t tmp_data;
  19469. char str_data[18];
  19470. char str_time[9];
  19471. uint8_t len;
  19472. memset(str_data, 0, 18);
  19473. 802879a: 2100 movs r1, #0
  19474. 802879c: 2212 movs r2, #18
  19475. 802879e: a807 add r0, sp, #28
  19476. 80287a0: f7f9 fb3a bl 8021e18 <memset>
  19477. memset(str_time, 0, 9);
  19478. 80287a4: 2100 movs r1, #0
  19479. 80287a6: 2209 movs r2, #9
  19480. 80287a8: 4668 mov r0, sp
  19481. 80287aa: f7f9 fb35 bl 8021e18 <memset>
  19482. str += 2;
  19483. strncpy(str_data, (str + 6), 2);
  19484. 80287ae: f104 0108 add.w r1, r4, #8
  19485. 80287b2: 2202 movs r2, #2
  19486. 80287b4: a807 add r0, sp, #28
  19487. 80287b6: f7f9 fdbf bl 8022338 <strncpy>
  19488. strncat(str_data, (str + 2), 4);
  19489. 80287ba: 1d21 adds r1, r4, #4
  19490. 80287bc: 2204 movs r2, #4
  19491. 80287be: a807 add r0, sp, #28
  19492. 80287c0: f7f9 fd32 bl 8022228 <strncat>
  19493. strncat(str_data, str, 2);
  19494. 80287c4: 2202 movs r2, #2
  19495. 80287c6: 1ca1 adds r1, r4, #2
  19496. 80287c8: a807 add r0, sp, #28
  19497. 80287ca: f7f9 fd2d bl 8022228 <strncat>
  19498. TM_RTC_GetDateTime(&tmp_data, TM_RTC_Format_BIN);
  19499. 80287ce: a803 add r0, sp, #12
  19500. 80287d0: 2100 movs r1, #0
  19501. 80287d2: f7fe f837 bl 8026844 <TM_RTC_GetDateTime>
  19502. sprintf(str_time, "-01-%02i:%02i", tmp_data.hours, tmp_data.minutes);
  19503. 80287d6: f89d 2011 ldrb.w r2, [sp, #17]
  19504. 80287da: f89d 3010 ldrb.w r3, [sp, #16]
  19505. 80287de: 4908 ldr r1, [pc, #32] ; (8028800 <SetDateStr+0x6c>)
  19506. 80287e0: 4668 mov r0, sp
  19507. 80287e2: f7ff fa81 bl 8027ce8 <tfp_sprintf>
  19508. len = strlen(str_time);
  19509. 80287e6: 4668 mov r0, sp
  19510. 80287e8: f7f9 fcee bl 80221c8 <strlen>
  19511. strncat(str_data, str_time, len);
  19512. 80287ec: 4669 mov r1, sp
  19513. 80287ee: b2c2 uxtb r2, r0
  19514. 80287f0: a807 add r0, sp, #28
  19515. 80287f2: f7f9 fd19 bl 8022228 <strncat>
  19516. //TM_RTC_SetDateTimeString(&str_data);
  19517. TM_RTC_SetDateTimeString(str_data);
  19518. 80287f6: a807 add r0, sp, #28
  19519. 80287f8: f7fd ff0a bl 8026610 <TM_RTC_SetDateTimeString>
  19520. }
  19521. 80287fc: b00c add sp, #48 ; 0x30
  19522. 80287fe: bd10 pop {r4, pc}
  19523. 8028800: 080391b4 .word 0x080391b4
  19524. 08028804 <SetTimeStr>:
  19525. /**
  19526. * @brief Время
  19527. */
  19528. void SetTimeStr(char *str)
  19529. {
  19530. 8028804: b510 push {r4, lr}
  19531. 8028806: b090 sub sp, #64 ; 0x40
  19532. 8028808: 4604 mov r4, r0
  19533. TM_RTC_t tmp_data;
  19534. char str_data[18];
  19535. char str_date[14];
  19536. uint8_t len;
  19537. memset(str_data, 0, 18);
  19538. 802880a: 2100 movs r1, #0
  19539. 802880c: 2212 movs r2, #18
  19540. 802880e: a80b add r0, sp, #44 ; 0x2c
  19541. 8028810: f7f9 fb02 bl 8021e18 <memset>
  19542. memset(str_date, 0, 14);
  19543. 8028814: 220e movs r2, #14
  19544. 8028816: 2100 movs r1, #0
  19545. 8028818: a803 add r0, sp, #12
  19546. 802881a: f7f9 fafd bl 8021e18 <memset>
  19547. TM_RTC_GetDateTime(&tmp_data, TM_RTC_Format_BIN);
  19548. 802881e: a807 add r0, sp, #28
  19549. 8028820: 2100 movs r1, #0
  19550. 8028822: f7fe f80f bl 8026844 <TM_RTC_GetDateTime>
  19551. sprintf(str_date, "%02i-%02i-%02i-01-", tmp_data.date, tmp_data.month, tmp_data.year);
  19552. 8028826: f89d 1025 ldrb.w r1, [sp, #37] ; 0x25
  19553. 802882a: f89d 3024 ldrb.w r3, [sp, #36] ; 0x24
  19554. 802882e: f89d 2023 ldrb.w r2, [sp, #35] ; 0x23
  19555. 8028832: 9100 str r1, [sp, #0]
  19556. 8028834: a803 add r0, sp, #12
  19557. 8028836: 490a ldr r1, [pc, #40] ; (8028860 <SetTimeStr+0x5c>)
  19558. 8028838: f7ff fa56 bl 8027ce8 <tfp_sprintf>
  19559. len = strlen(str_date);
  19560. 802883c: a803 add r0, sp, #12
  19561. 802883e: f7f9 fcc3 bl 80221c8 <strlen>
  19562. strncat(str_data, str_date, len);
  19563. 8028842: a903 add r1, sp, #12
  19564. 8028844: b2c2 uxtb r2, r0
  19565. 8028846: a80b add r0, sp, #44 ; 0x2c
  19566. 8028848: f7f9 fcee bl 8022228 <strncat>
  19567. strncat(str_data, str, 5);
  19568. 802884c: a80b add r0, sp, #44 ; 0x2c
  19569. 802884e: 4621 mov r1, r4
  19570. 8028850: 2205 movs r2, #5
  19571. 8028852: f7f9 fce9 bl 8022228 <strncat>
  19572. //TM_RTC_SetDateTimeString(&str_data);
  19573. TM_RTC_SetDateTimeString(str_data);
  19574. 8028856: a80b add r0, sp, #44 ; 0x2c
  19575. 8028858: f7fd feda bl 8026610 <TM_RTC_SetDateTimeString>
  19576. }
  19577. 802885c: b010 add sp, #64 ; 0x40
  19578. 802885e: bd10 pop {r4, pc}
  19579. 8028860: 080391c2 .word 0x080391c2
  19580. 08028864 <SetSntpStateStr>:
  19581. /**
  19582. * @brief Состояние SNTP
  19583. */
  19584. void SetSntpStateStr(char *str)
  19585. {
  19586. 8028864: b538 push {r3, r4, r5, lr}
  19587. bool old_sntpEnable = sSettings.sSNTP.sntpEnable;
  19588. 8028866: 4c0d ldr r4, [pc, #52] ; (802889c <SetSntpStateStr+0x38>)
  19589. if (strncmp(str, "1", 1) == 0){
  19590. 8028868: 490d ldr r1, [pc, #52] ; (80288a0 <SetSntpStateStr+0x3c>)
  19591. /**
  19592. * @brief Состояние SNTP
  19593. */
  19594. void SetSntpStateStr(char *str)
  19595. {
  19596. bool old_sntpEnable = sSettings.sSNTP.sntpEnable;
  19597. 802886a: f894 5340 ldrb.w r5, [r4, #832] ; 0x340
  19598. if (strncmp(str, "1", 1) == 0){
  19599. 802886e: 2201 movs r2, #1
  19600. 8028870: f7f9 fd0c bl 802228c <strncmp>
  19601. 8028874: b948 cbnz r0, 802888a <SetSntpStateStr+0x26>
  19602. sSettings.sSNTP.sntpEnable = true;
  19603. 8028876: 2001 movs r0, #1
  19604. 8028878: f884 0340 strb.w r0, [r4, #832] ; 0x340
  19605. if(old_sntpEnable != sSettings.sSNTP.sntpEnable){
  19606. 802887c: b965 cbnz r5, 8028898 <SetSntpStateStr+0x34>
  19607. SNTP_Enable(sSettings.sSNTP.sntpEnable);
  19608. 802887e: f00f fbbf bl 8038000 <SNTP_Enable>
  19609. }
  19610. else{
  19611. sSettings.sSNTP.sntpEnable = false;
  19612. SNTP_Enable(sSettings.sSNTP.sntpEnable);
  19613. }
  19614. }
  19615. 8028882: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr}
  19616. bool old_sntpEnable = sSettings.sSNTP.sntpEnable;
  19617. if (strncmp(str, "1", 1) == 0){
  19618. sSettings.sSNTP.sntpEnable = true;
  19619. if(old_sntpEnable != sSettings.sSNTP.sntpEnable){
  19620. SNTP_Enable(sSettings.sSNTP.sntpEnable);
  19621. SNTP_Poll();
  19622. 8028886: f00f bbfd b.w 8038084 <SNTP_Poll>
  19623. }
  19624. }
  19625. else{
  19626. sSettings.sSNTP.sntpEnable = false;
  19627. 802888a: 2000 movs r0, #0
  19628. 802888c: f884 0340 strb.w r0, [r4, #832] ; 0x340
  19629. SNTP_Enable(sSettings.sSNTP.sntpEnable);
  19630. }
  19631. }
  19632. 8028890: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr}
  19633. SNTP_Poll();
  19634. }
  19635. }
  19636. else{
  19637. sSettings.sSNTP.sntpEnable = false;
  19638. SNTP_Enable(sSettings.sSNTP.sntpEnable);
  19639. 8028894: f00f bbb4 b.w 8038000 <SNTP_Enable>
  19640. 8028898: bd38 pop {r3, r4, r5, pc}
  19641. 802889a: bf00 nop
  19642. 802889c: 2000d414 .word 0x2000d414
  19643. 80288a0: 080394a7 .word 0x080394a7
  19644. 080288a4 <SetSntpServerIpStr>:
  19645. /**
  19646. * @brief IP адрес SNTP сервера
  19647. */
  19648. void SetSntpServerIpStr(char *str)
  19649. {
  19650. 80288a4: 4601 mov r1, r0
  19651. strcpy(sSettings.sSNTP.ip, str);
  19652. 80288a6: 4801 ldr r0, [pc, #4] ; (80288ac <SetSntpServerIpStr+0x8>)
  19653. 80288a8: f7f9 bc30 b.w 802210c <strcpy>
  19654. 80288ac: 2000d755 .word 0x2000d755
  19655. 080288b0 <SetSntpTimeZoneStr>:
  19656. /**
  19657. * @brief Часовой пояс контроллера
  19658. */
  19659. void SetSntpTimeZoneStr(char *str)
  19660. {
  19661. 80288b0: b570 push {r4, r5, r6, lr}
  19662. float newUtc;
  19663. newUtc = atof(str);
  19664. 80288b2: f7f9 f98d bl 8021bd0 <atof>
  19665. 80288b6: f7f8 f9a1 bl 8020bfc <__aeabi_d2f>
  19666. if (sSettings.sSNTP.timeZone > 0)
  19667. 80288ba: 4b27 ldr r3, [pc, #156] ; (8028958 <SetSntpTimeZoneStr+0xa8>)
  19668. 80288bc: f8d3 4370 ldr.w r4, [r3, #880] ; 0x370
  19669. */
  19670. void SetSntpTimeZoneStr(char *str)
  19671. {
  19672. float newUtc;
  19673. newUtc = atof(str);
  19674. 80288c0: 4606 mov r6, r0
  19675. if (sSettings.sSNTP.timeZone > 0)
  19676. 80288c2: 2100 movs r1, #0
  19677. 80288c4: 4620 mov r0, r4
  19678. 80288c6: f7f8 fcb3 bl 8021230 <__aeabi_fcmpgt>
  19679. 80288ca: b100 cbz r0, 80288ce <SetSntpTimeZoneStr+0x1e>
  19680. 80288cc: e033 b.n 8028936 <SetSntpTimeZoneStr+0x86>
  19681. {
  19682. TM_RTC_Correction(newUtc - sSettings.sSNTP.timeZone);
  19683. }
  19684. }
  19685. else if (sSettings.sSNTP.timeZone < 0)
  19686. 80288ce: 4620 mov r0, r4
  19687. 80288d0: 2100 movs r1, #0
  19688. 80288d2: f7f8 fc8f bl 80211f4 <__aeabi_fcmplt>
  19689. 80288d6: 2800 cmp r0, #0
  19690. 80288d8: d032 beq.n 8028940 <SetSntpTimeZoneStr+0x90>
  19691. {
  19692. if (newUtc >= 0)
  19693. 80288da: 4630 mov r0, r6
  19694. 80288dc: 2100 movs r1, #0
  19695. 80288de: f7f8 fc9d bl 802121c <__aeabi_fcmpge>
  19696. 80288e2: b170 cbz r0, 8028902 <SetSntpTimeZoneStr+0x52>
  19697. {
  19698. TM_RTC_Correction(newUtc + fabs(sSettings.sSNTP.timeZone));
  19699. 80288e4: 4620 mov r0, r4
  19700. 80288e6: f7f7 fe53 bl 8020590 <__aeabi_f2d>
  19701. 80288ea: f7fc fe57 bl 802559c <fabs>
  19702. 80288ee: 4604 mov r4, r0
  19703. 80288f0: 460d mov r5, r1
  19704. 80288f2: 4630 mov r0, r6
  19705. 80288f4: f7f7 fe4c bl 8020590 <__aeabi_f2d>
  19706. 80288f8: 4622 mov r2, r4
  19707. 80288fa: 462b mov r3, r5
  19708. 80288fc: f7f7 fcea bl 80202d4 <__adddf3>
  19709. 8028900: e016 b.n 8028930 <SetSntpTimeZoneStr+0x80>
  19710. }
  19711. else
  19712. {
  19713. if (newUtc >= sSettings.sSNTP.timeZone)
  19714. 8028902: 4630 mov r0, r6
  19715. 8028904: 4621 mov r1, r4
  19716. 8028906: f7f8 fc89 bl 802121c <__aeabi_fcmpge>
  19717. 802890a: b1a0 cbz r0, 8028936 <SetSntpTimeZoneStr+0x86>
  19718. TM_RTC_Correction(fabs(sSettings.sSNTP.timeZone) - fabs(newUtc));
  19719. 802890c: 4620 mov r0, r4
  19720. 802890e: f7f7 fe3f bl 8020590 <__aeabi_f2d>
  19721. 8028912: f7fc fe43 bl 802559c <fabs>
  19722. 8028916: 4604 mov r4, r0
  19723. 8028918: 4630 mov r0, r6
  19724. 802891a: 460d mov r5, r1
  19725. 802891c: f7f7 fe38 bl 8020590 <__aeabi_f2d>
  19726. 8028920: f7fc fe3c bl 802559c <fabs>
  19727. 8028924: 4602 mov r2, r0
  19728. 8028926: 460b mov r3, r1
  19729. 8028928: 4620 mov r0, r4
  19730. 802892a: 4629 mov r1, r5
  19731. 802892c: f7f7 fcd0 bl 80202d0 <__aeabi_dsub>
  19732. 8028930: f7f8 f964 bl 8020bfc <__aeabi_d2f>
  19733. 8028934: e00a b.n 802894c <SetSntpTimeZoneStr+0x9c>
  19734. else
  19735. TM_RTC_Correction(newUtc - sSettings.sSNTP.timeZone);
  19736. 8028936: 4630 mov r0, r6
  19737. 8028938: 4621 mov r1, r4
  19738. 802893a: f7f8 f9b3 bl 8020ca4 <__aeabi_fsub>
  19739. 802893e: e005 b.n 802894c <SetSntpTimeZoneStr+0x9c>
  19740. }
  19741. }
  19742. else if (sSettings.sSNTP.timeZone == 0)
  19743. 8028940: 4620 mov r0, r4
  19744. 8028942: 2100 movs r1, #0
  19745. 8028944: f7f8 fc4c bl 80211e0 <__aeabi_fcmpeq>
  19746. 8028948: b110 cbz r0, 8028950 <SetSntpTimeZoneStr+0xa0>
  19747. {
  19748. TM_RTC_Correction(newUtc);
  19749. 802894a: 4630 mov r0, r6
  19750. 802894c: f7fe f878 bl 8026a40 <TM_RTC_Correction>
  19751. }
  19752. sSettings.sSNTP.timeZone = newUtc; // atof(str);
  19753. 8028950: 4b01 ldr r3, [pc, #4] ; (8028958 <SetSntpTimeZoneStr+0xa8>)
  19754. 8028952: f8c3 6370 str.w r6, [r3, #880] ; 0x370
  19755. 8028956: bd70 pop {r4, r5, r6, pc}
  19756. 8028958: 2000d414 .word 0x2000d414
  19757. 0802895c <SetDINTypeActStr>:
  19758. /**
  19759. * @brief Тип действий при срабатывание сухих контактов
  19760. */
  19761. void SetDINTypeActStr(char *str, uint8_t num)
  19762. {
  19763. 802895c: b510 push {r4, lr}
  19764. 802895e: 460c mov r4, r1
  19765. sSettings.sInOuts.din_type_act[num] = atoi(str);
  19766. 8028960: f7f9 f93a bl 8021bd8 <atoi>
  19767. 8028964: 4902 ldr r1, [pc, #8] ; (8028970 <SetDINTypeActStr+0x14>)
  19768. 8028966: 1909 adds r1, r1, r4
  19769. 8028968: f881 0376 strb.w r0, [r1, #886] ; 0x376
  19770. 802896c: bd10 pop {r4, pc}
  19771. 802896e: bf00 nop
  19772. 8028970: 2000d414 .word 0x2000d414
  19773. 08028974 <SetROStr>:
  19774. /**
  19775. * @brief
  19776. */
  19777. void SetROStr(char *str, uint8_t num)
  19778. {
  19779. 8028974: b510 push {r4, lr}
  19780. 8028976: 460c mov r4, r1
  19781. set_state_douts((DOUT1+num), atoi(str));
  19782. 8028978: f7f9 f92e bl 8021bd8 <atoi>
  19783. 802897c: f104 0309 add.w r3, r4, #9
  19784. 8028980: b2c1 uxtb r1, r0
  19785. 8028982: b2d8 uxtb r0, r3
  19786. }
  19787. 8028984: e8bd 4010 ldmia.w sp!, {r4, lr}
  19788. /**
  19789. * @brief
  19790. */
  19791. void SetROStr(char *str, uint8_t num)
  19792. {
  19793. set_state_douts((DOUT1+num), atoi(str));
  19794. 8028988: f000 bc7f b.w 802928a <set_state_douts>
  19795. 0802898c <SetROInt>:
  19796. /**
  19797. * @brief
  19798. */
  19799. void SetROInt(uint8_t val, uint8_t num)
  19800. {
  19801. 802898c: 4603 mov r3, r0
  19802. set_state_douts((DOUT1+num), val);
  19803. 802898e: 3109 adds r1, #9
  19804. 8028990: b2c8 uxtb r0, r1
  19805. 8028992: 4619 mov r1, r3
  19806. 8028994: f000 bc79 b.w 802928a <set_state_douts>
  19807. 08028998 <SetROTypeActStr>:
  19808. /**
  19809. * @brief Источник срабатывания реле
  19810. */
  19811. void SetROTypeActStr(char *str, uint8_t num)
  19812. {
  19813. 8028998: b510 push {r4, lr}
  19814. 802899a: 460c mov r4, r1
  19815. sSettings.sInOuts.ro_type_source[num] = atoi(str);
  19816. 802899c: f7f9 f91c bl 8021bd8 <atoi>
  19817. 80289a0: 4b04 ldr r3, [pc, #16] ; (80289b4 <SetROTypeActStr+0x1c>)
  19818. 80289a2: 191b adds r3, r3, r4
  19819. SetROInt(0, num);
  19820. 80289a4: 4621 mov r1, r4
  19821. /**
  19822. * @brief Источник срабатывания реле
  19823. */
  19824. void SetROTypeActStr(char *str, uint8_t num)
  19825. {
  19826. sSettings.sInOuts.ro_type_source[num] = atoi(str);
  19827. 80289a6: f883 0374 strb.w r0, [r3, #884] ; 0x374
  19828. SetROInt(0, num);
  19829. 80289aa: 2000 movs r0, #0
  19830. }
  19831. 80289ac: e8bd 4010 ldmia.w sp!, {r4, lr}
  19832. * @brief Источник срабатывания реле
  19833. */
  19834. void SetROTypeActStr(char *str, uint8_t num)
  19835. {
  19836. sSettings.sInOuts.ro_type_source[num] = atoi(str);
  19837. SetROInt(0, num);
  19838. 80289b0: f7ff bfec b.w 802898c <SetROInt>
  19839. 80289b4: 2000d414 .word 0x2000d414
  19840. 080289b8 <SETTINGS_SetBootParamsDef>:
  19841. /**
  19842. * @brief Установить параметры обновления ПО по умолчанию
  19843. */
  19844. void SETTINGS_SetBootParamsDef(void)
  19845. {
  19846. sSettings.bootParams.loadMode = 0;
  19847. 80289b8: 4b02 ldr r3, [pc, #8] ; (80289c4 <SETTINGS_SetBootParamsDef+0xc>)
  19848. 80289ba: 2200 movs r2, #0
  19849. 80289bc: 701a strb r2, [r3, #0]
  19850. sSettings.bootParams.bootTry = 0;
  19851. 80289be: 705a strb r2, [r3, #1]
  19852. 80289c0: 4770 bx lr
  19853. 80289c2: bf00 nop
  19854. 80289c4: 2000d414 .word 0x2000d414
  19855. 080289c8 <SETTINGS_SetWebParamsDef>:
  19856. /**
  19857. * @brief Установить параметры сетевого подключения по умолчанию
  19858. */
  19859. void SETTINGS_SetWebParamsDef(void)
  19860. {
  19861. 80289c8: b510 push {r4, lr}
  19862. strcpy(sSettings.sWebParams.ip, "192.168.1.8");
  19863. 80289ca: 4c09 ldr r4, [pc, #36] ; (80289f0 <SETTINGS_SetWebParamsDef+0x28>)
  19864. 80289cc: 4909 ldr r1, [pc, #36] ; (80289f4 <SETTINGS_SetWebParamsDef+0x2c>)
  19865. 80289ce: 4620 mov r0, r4
  19866. 80289d0: f7f9 fb9c bl 802210c <strcpy>
  19867. strcpy(sSettings.sWebParams.gate, "192.168.1.1");
  19868. 80289d4: 4908 ldr r1, [pc, #32] ; (80289f8 <SETTINGS_SetWebParamsDef+0x30>)
  19869. 80289d6: f104 0010 add.w r0, r4, #16
  19870. 80289da: f7f9 fb97 bl 802210c <strcpy>
  19871. strcpy(sSettings.sWebParams.mask, "255.255.255.0");
  19872. 80289de: f104 0020 add.w r0, r4, #32
  19873. 80289e2: 4906 ldr r1, [pc, #24] ; (80289fc <SETTINGS_SetWebParamsDef+0x34>)
  19874. 80289e4: f7f9 fb92 bl 802210c <strcpy>
  19875. sSettings.sWebParams.dhcpEnable = 1;
  19876. 80289e8: 2201 movs r2, #1
  19877. 80289ea: f884 2030 strb.w r2, [r4, #48] ; 0x30
  19878. 80289ee: bd10 pop {r4, pc}
  19879. 80289f0: 2000d416 .word 0x2000d416
  19880. 80289f4: 080391d5 .word 0x080391d5
  19881. 80289f8: 080391e1 .word 0x080391e1
  19882. 80289fc: 080391ed .word 0x080391ed
  19883. 08028a00 <SETTINGS_SetTempWebParamsDef>:
  19884. /**
  19885. * @brief Установить временные параметры сетевого подключения по умолчанию
  19886. */
  19887. void SETTINGS_SetTempWebParamsDef(void)
  19888. {
  19889. 8028a00: b510 push {r4, lr}
  19890. strcpy(sSettings.sWebParams.ip, "192.168.1.2");
  19891. 8028a02: 4c09 ldr r4, [pc, #36] ; (8028a28 <SETTINGS_SetTempWebParamsDef+0x28>)
  19892. 8028a04: 4909 ldr r1, [pc, #36] ; (8028a2c <SETTINGS_SetTempWebParamsDef+0x2c>)
  19893. 8028a06: 4620 mov r0, r4
  19894. 8028a08: f7f9 fb80 bl 802210c <strcpy>
  19895. strcpy(sSettings.sWebParams.gate, "192.168.1.1");
  19896. 8028a0c: 4908 ldr r1, [pc, #32] ; (8028a30 <SETTINGS_SetTempWebParamsDef+0x30>)
  19897. 8028a0e: f104 0010 add.w r0, r4, #16
  19898. 8028a12: f7f9 fb7b bl 802210c <strcpy>
  19899. strcpy(sSettings.sWebParams.mask, "255.255.255.0");
  19900. 8028a16: f104 0020 add.w r0, r4, #32
  19901. 8028a1a: 4906 ldr r1, [pc, #24] ; (8028a34 <SETTINGS_SetTempWebParamsDef+0x34>)
  19902. 8028a1c: f7f9 fb76 bl 802210c <strcpy>
  19903. sSettings.sWebParams.dhcpEnable = 1;
  19904. 8028a20: 2201 movs r2, #1
  19905. 8028a22: f884 2030 strb.w r2, [r4, #48] ; 0x30
  19906. 8028a26: bd10 pop {r4, pc}
  19907. 8028a28: 2000d416 .word 0x2000d416
  19908. 8028a2c: 080391fb .word 0x080391fb
  19909. 8028a30: 080391e1 .word 0x080391e1
  19910. 8028a34: 080391ed .word 0x080391ed
  19911. 08028a38 <SETTINGS_SetSnmpDef>:
  19912. /**
  19913. * @brief Установить параметры SNMP по умолчанию
  19914. */
  19915. void SETTINGS_SetSnmpDef(void)
  19916. {
  19917. 8028a38: b570 push {r4, r5, r6, lr}
  19918. strcpy(sSettings.sSnmp.sysDescr, "");
  19919. 8028a3a: 4c1e ldr r4, [pc, #120] ; (8028ab4 <SETTINGS_SetSnmpDef+0x7c>)
  19920. 8028a3c: 4d1e ldr r5, [pc, #120] ; (8028ab8 <SETTINGS_SetSnmpDef+0x80>)
  19921. strcpy(sSettings.sSnmp.readCommunity, "public");
  19922. 8028a3e: 4e1f ldr r6, [pc, #124] ; (8028abc <SETTINGS_SetSnmpDef+0x84>)
  19923. /**
  19924. * @brief Установить параметры SNMP по умолчанию
  19925. */
  19926. void SETTINGS_SetSnmpDef(void)
  19927. {
  19928. strcpy(sSettings.sSnmp.sysDescr, "");
  19929. 8028a40: 4629 mov r1, r5
  19930. 8028a42: 4620 mov r0, r4
  19931. 8028a44: f7f9 fb62 bl 802210c <strcpy>
  19932. strcpy(sSettings.sSnmp.readCommunity, "public");
  19933. 8028a48: 4631 mov r1, r6
  19934. 8028a4a: f104 00a0 add.w r0, r4, #160 ; 0xa0
  19935. 8028a4e: f7f9 fb5d bl 802210c <strcpy>
  19936. strcpy(sSettings.sSnmp.writeCommunity, "public");
  19937. 8028a52: 4631 mov r1, r6
  19938. 8028a54: f104 00b4 add.w r0, r4, #180 ; 0xb4
  19939. 8028a58: f7f9 fb58 bl 802210c <strcpy>
  19940. strcpy(sSettings.sSnmp.sysContact, "");
  19941. 8028a5c: 4629 mov r1, r5
  19942. 8028a5e: f104 00c8 add.w r0, r4, #200 ; 0xc8
  19943. 8028a62: f7f9 fb53 bl 802210c <strcpy>
  19944. strcpy(sSettings.sSnmp.sysName, "BT6702");
  19945. 8028a66: f104 00fa add.w r0, r4, #250 ; 0xfa
  19946. 8028a6a: 4915 ldr r1, [pc, #84] ; (8028ac0 <SETTINGS_SetSnmpDef+0x88>)
  19947. 8028a6c: f7f9 fb4e bl 802210c <strcpy>
  19948. strcpy(sSettings.sSnmp.sysLocation, "");
  19949. 8028a70: 4629 mov r1, r5
  19950. strcpy(sSettings.sSnmp.managerIP, "0.0.0.0");
  19951. 8028a72: 4d14 ldr r5, [pc, #80] ; (8028ac4 <SETTINGS_SetSnmpDef+0x8c>)
  19952. strcpy(sSettings.sSnmp.sysDescr, "");
  19953. strcpy(sSettings.sSnmp.readCommunity, "public");
  19954. strcpy(sSettings.sSnmp.writeCommunity, "public");
  19955. strcpy(sSettings.sSnmp.sysContact, "");
  19956. strcpy(sSettings.sSnmp.sysName, "BT6702");
  19957. strcpy(sSettings.sSnmp.sysLocation, "");
  19958. 8028a74: f504 7087 add.w r0, r4, #270 ; 0x10e
  19959. 8028a78: f7f9 fb48 bl 802210c <strcpy>
  19960. strcpy(sSettings.sSnmp.managerIP, "0.0.0.0");
  19961. 8028a7c: 4629 mov r1, r5
  19962. 8028a7e: f504 70be add.w r0, r4, #380 ; 0x17c
  19963. 8028a82: f7f9 fb43 bl 802210c <strcpy>
  19964. strcpy(sSettings.sSnmp.managerIP2, "0.0.0.0");
  19965. 8028a86: 4629 mov r1, r5
  19966. 8028a88: f504 70c8 add.w r0, r4, #400 ; 0x190
  19967. 8028a8c: f7f9 fb3e bl 802210c <strcpy>
  19968. strcpy(sSettings.sSnmp.managerIP3, "0.0.0.0");
  19969. 8028a90: 4629 mov r1, r5
  19970. 8028a92: f504 70d2 add.w r0, r4, #420 ; 0x1a4
  19971. 8028a96: f7f9 fb39 bl 802210c <strcpy>
  19972. strcpy(sSettings.sSnmp.managerIP4, "0.0.0.0");
  19973. 8028a9a: 4629 mov r1, r5
  19974. 8028a9c: f504 70dc add.w r0, r4, #440 ; 0x1b8
  19975. 8028aa0: f7f9 fb34 bl 802210c <strcpy>
  19976. strcpy(sSettings.sSnmp.managerIP5, "0.0.0.0");
  19977. 8028aa4: f504 70e6 add.w r0, r4, #460 ; 0x1cc
  19978. 8028aa8: 4629 mov r1, r5
  19979. }
  19980. 8028aaa: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
  19981. strcpy(sSettings.sSnmp.sysLocation, "");
  19982. strcpy(sSettings.sSnmp.managerIP, "0.0.0.0");
  19983. strcpy(sSettings.sSnmp.managerIP2, "0.0.0.0");
  19984. strcpy(sSettings.sSnmp.managerIP3, "0.0.0.0");
  19985. strcpy(sSettings.sSnmp.managerIP4, "0.0.0.0");
  19986. strcpy(sSettings.sSnmp.managerIP5, "0.0.0.0");
  19987. 8028aae: f7f9 bb2d b.w 802210c <strcpy>
  19988. 8028ab2: bf00 nop
  19989. 8028ab4: 2000d545 .word 0x2000d545
  19990. 8028ab8: 080405c1 .word 0x080405c1
  19991. 8028abc: 08039207 .word 0x08039207
  19992. 8028ac0: 0803920e .word 0x0803920e
  19993. 8028ac4: 08039215 .word 0x08039215
  19994. 08028ac8 <SETTINGS_SetInfoDef>:
  19995. /**
  19996. * @brief Установить Информацию об устройстве по умолчанию
  19997. */
  19998. void SETTINGS_SetInfoDef(void)
  19999. {
  20000. 8028ac8: b510 push {r4, lr}
  20001. SYS_t *sSys = NULL;
  20002. sSys = pvPortMalloc(sizeof(*sSys));
  20003. 8028aca: 2050 movs r0, #80 ; 0x50
  20004. 8028acc: f003 fb72 bl 802c1b4 <pvPortMalloc>
  20005. if (sSys) {
  20006. 8028ad0: 4604 mov r4, r0
  20007. 8028ad2: b198 cbz r0, 8028afc <SETTINGS_SetInfoDef+0x34>
  20008. SYS_Load(sSys);
  20009. 8028ad4: f000 fa74 bl 8028fc0 <SYS_Load>
  20010. strcpy(sSettings.sInfo.mac, sSys->mac);
  20011. 8028ad8: 4621 mov r1, r4
  20012. 8028ada: 4811 ldr r0, [pc, #68] ; (8028b20 <SETTINGS_SetInfoDef+0x58>)
  20013. 8028adc: f7f9 fb16 bl 802210c <strcpy>
  20014. strcpy(sSettings.sInfo.serialNumber, sSys->serial);
  20015. 8028ae0: f104 0112 add.w r1, r4, #18
  20016. 8028ae4: 480f ldr r0, [pc, #60] ; (8028b24 <SETTINGS_SetInfoDef+0x5c>)
  20017. 8028ae6: f7f9 fb11 bl 802210c <strcpy>
  20018. strcpy(sSettings.sInfo.productionData, sSys->proddate);
  20019. 8028aea: f104 0132 add.w r1, r4, #50 ; 0x32
  20020. 8028aee: 480e ldr r0, [pc, #56] ; (8028b28 <SETTINGS_SetInfoDef+0x60>)
  20021. 8028af0: f7f9 fb0c bl 802210c <strcpy>
  20022. vPortFree(sSys);
  20023. 8028af4: 4620 mov r0, r4
  20024. 8028af6: f003 fbe3 bl 802c2c0 <vPortFree>
  20025. 8028afa: e00b b.n 8028b14 <SETTINGS_SetInfoDef+0x4c>
  20026. }
  20027. else {
  20028. strcpy(sSettings.sInfo.productionData, "09.07.2017");
  20029. 8028afc: 490b ldr r1, [pc, #44] ; (8028b2c <SETTINGS_SetInfoDef+0x64>)
  20030. 8028afe: 480a ldr r0, [pc, #40] ; (8028b28 <SETTINGS_SetInfoDef+0x60>)
  20031. 8028b00: f7f9 fb04 bl 802210c <strcpy>
  20032. strcpy(sSettings.sInfo.mac, DEVICE_MAC);
  20033. 8028b04: 490a ldr r1, [pc, #40] ; (8028b30 <SETTINGS_SetInfoDef+0x68>)
  20034. 8028b06: 4806 ldr r0, [pc, #24] ; (8028b20 <SETTINGS_SetInfoDef+0x58>)
  20035. 8028b08: f7f9 fb00 bl 802210c <strcpy>
  20036. strcpy(sSettings.sInfo.serialNumber, DEVICE_SERIAL);
  20037. 8028b0c: 4805 ldr r0, [pc, #20] ; (8028b24 <SETTINGS_SetInfoDef+0x5c>)
  20038. 8028b0e: 4909 ldr r1, [pc, #36] ; (8028b34 <SETTINGS_SetInfoDef+0x6c>)
  20039. 8028b10: f7f9 fafc bl 802210c <strcpy>
  20040. }
  20041. strcpy(sSettings.sInfo.comments, "");
  20042. 8028b14: 4808 ldr r0, [pc, #32] ; (8028b38 <SETTINGS_SetInfoDef+0x70>)
  20043. 8028b16: 4909 ldr r1, [pc, #36] ; (8028b3c <SETTINGS_SetInfoDef+0x74>)
  20044. }
  20045. 8028b18: e8bd 4010 ldmia.w sp!, {r4, lr}
  20046. strcpy(sSettings.sInfo.productionData, "09.07.2017");
  20047. strcpy(sSettings.sInfo.mac, DEVICE_MAC);
  20048. strcpy(sSettings.sInfo.serialNumber, DEVICE_SERIAL);
  20049. }
  20050. strcpy(sSettings.sInfo.comments, "");
  20051. 8028b1c: f7f9 baf6 b.w 802210c <strcpy>
  20052. 8028b20: 2000d4a0 .word 0x2000d4a0
  20053. 8028b24: 2000d4b2 .word 0x2000d4b2
  20054. 8028b28: 2000d478 .word 0x2000d478
  20055. 8028b2c: 0803921d .word 0x0803921d
  20056. 8028b30: 08039228 .word 0x08039228
  20057. 8028b34: 0803923a .word 0x0803923a
  20058. 8028b38: 2000d4c2 .word 0x2000d4c2
  20059. 8028b3c: 080405c1 .word 0x080405c1
  20060. 08028b40 <SETTINGS_SetServiceDef>:
  20061. /**
  20062. * @brief Установить значение сервисных настроек по умолчанию
  20063. */
  20064. void SETTINGS_SetServiceDef(void)
  20065. {
  20066. 8028b40: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  20067. 8028b44: 4d14 ldr r5, [pc, #80] ; (8028b98 <SETTINGS_SetServiceDef+0x58>)
  20068. 8028b46: 2400 movs r4, #0
  20069. }
  20070. /**
  20071. * @brief Установить значение сервисных настроек по умолчанию
  20072. */
  20073. void SETTINGS_SetServiceDef(void)
  20074. 8028b48: 2717 movs r7, #23
  20075. strcpy(sSettings.sAuth[user_id].login, "admin");
  20076. strcpy(sSettings.sAuth[user_id].password, "12345");
  20077. break;
  20078. case 1:
  20079. default:
  20080. sSettings.sAuth[user_id].level = USER;
  20081. 8028b4a: f04f 0801 mov.w r8, #1
  20082. void SETTINGS_SetServiceDef(void)
  20083. {
  20084. uint8_t user_id;
  20085. for (user_id = 0; user_id < MAX_WEB_USERS; user_id++) {
  20086. switch (user_id) {
  20087. 8028b4e: f014 03ff ands.w r3, r4, #255 ; 0xff
  20088. 8028b52: d108 bne.n 8028b66 <SETTINGS_SetServiceDef+0x26>
  20089. /* First users in the system is always ADMIN.
  20090. * Others are USER */
  20091. case 0:
  20092. sSettings.sAuth[user_id].level = ADMIN;
  20093. strcpy(sSettings.sAuth[user_id].login, "admin");
  20094. 8028b54: 4911 ldr r1, [pc, #68] ; (8028b9c <SETTINGS_SetServiceDef+0x5c>)
  20095. 8028b56: 4812 ldr r0, [pc, #72] ; (8028ba0 <SETTINGS_SetServiceDef+0x60>)
  20096. for (user_id = 0; user_id < MAX_WEB_USERS; user_id++) {
  20097. switch (user_id) {
  20098. /* First users in the system is always ADMIN.
  20099. * Others are USER */
  20100. case 0:
  20101. sSettings.sAuth[user_id].level = ADMIN;
  20102. 8028b58: f885 3311 strb.w r3, [r5, #785] ; 0x311
  20103. strcpy(sSettings.sAuth[user_id].login, "admin");
  20104. 8028b5c: f7f9 fad6 bl 802210c <strcpy>
  20105. strcpy(sSettings.sAuth[user_id].password, "12345");
  20106. 8028b60: 4810 ldr r0, [pc, #64] ; (8028ba4 <SETTINGS_SetServiceDef+0x64>)
  20107. 8028b62: 4911 ldr r1, [pc, #68] ; (8028ba8 <SETTINGS_SetServiceDef+0x68>)
  20108. 8028b64: e010 b.n 8028b88 <SETTINGS_SetServiceDef+0x48>
  20109. }
  20110. /**
  20111. * @brief Установить значение сервисных настроек по умолчанию
  20112. */
  20113. void SETTINGS_SetServiceDef(void)
  20114. 8028b66: fb07 f604 mul.w r6, r7, r4
  20115. 8028b6a: 19ab adds r3, r5, r6
  20116. strcpy(sSettings.sAuth[user_id].password, "12345");
  20117. break;
  20118. case 1:
  20119. default:
  20120. sSettings.sAuth[user_id].level = USER;
  20121. strcpy(sSettings.sAuth[user_id].login, "user");
  20122. 8028b6c: f506 7044 add.w r0, r6, #784 ; 0x310
  20123. 8028b70: 1828 adds r0, r5, r0
  20124. 8028b72: 490e ldr r1, [pc, #56] ; (8028bac <SETTINGS_SetServiceDef+0x6c>)
  20125. strcpy(sSettings.sAuth[user_id].login, "admin");
  20126. strcpy(sSettings.sAuth[user_id].password, "12345");
  20127. break;
  20128. case 1:
  20129. default:
  20130. sSettings.sAuth[user_id].level = USER;
  20131. 8028b74: f883 8311 strb.w r8, [r3, #785] ; 0x311
  20132. strcpy(sSettings.sAuth[user_id].login, "user");
  20133. 8028b78: 3002 adds r0, #2
  20134. strcpy(sSettings.sAuth[user_id].password, "1234");
  20135. 8028b7a: f506 7646 add.w r6, r6, #792 ; 0x318
  20136. strcpy(sSettings.sAuth[user_id].password, "12345");
  20137. break;
  20138. case 1:
  20139. default:
  20140. sSettings.sAuth[user_id].level = USER;
  20141. strcpy(sSettings.sAuth[user_id].login, "user");
  20142. 8028b7e: f7f9 fac5 bl 802210c <strcpy>
  20143. strcpy(sSettings.sAuth[user_id].password, "1234");
  20144. 8028b82: 19a8 adds r0, r5, r6
  20145. 8028b84: 490a ldr r1, [pc, #40] ; (8028bb0 <SETTINGS_SetServiceDef+0x70>)
  20146. 8028b86: 3005 adds r0, #5
  20147. 8028b88: 3401 adds r4, #1
  20148. 8028b8a: f7f9 fabf bl 802210c <strcpy>
  20149. */
  20150. void SETTINGS_SetServiceDef(void)
  20151. {
  20152. uint8_t user_id;
  20153. for (user_id = 0; user_id < MAX_WEB_USERS; user_id++) {
  20154. 8028b8e: 2c02 cmp r4, #2
  20155. 8028b90: d1dd bne.n 8028b4e <SETTINGS_SetServiceDef+0xe>
  20156. strcpy(sSettings.sAuth[user_id].login, "user");
  20157. strcpy(sSettings.sAuth[user_id].password, "1234");
  20158. break;
  20159. }
  20160. }
  20161. }
  20162. 8028b92: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  20163. 8028b96: bf00 nop
  20164. 8028b98: 2000d414 .word 0x2000d414
  20165. 8028b9c: 08039242 .word 0x08039242
  20166. 8028ba0: 2000d726 .word 0x2000d726
  20167. 8028ba4: 2000d731 .word 0x2000d731
  20168. 8028ba8: 08039248 .word 0x08039248
  20169. 8028bac: 0803924e .word 0x0803924e
  20170. 8028bb0: 08039253 .word 0x08039253
  20171. 08028bb4 <SETTINGS_SetSntpDef>:
  20172. /**
  20173. * @brief Установить параметры SNTP по умолчанию
  20174. */
  20175. void SETTINGS_SetSntpDef(void)
  20176. {
  20177. 8028bb4: b510 push {r4, lr}
  20178. sSettings.sSNTP.sntpEnable = true;
  20179. 8028bb6: 4c08 ldr r4, [pc, #32] ; (8028bd8 <SETTINGS_SetSntpDef+0x24>)
  20180. strcpy(sSettings.sSNTP.ip, "88.147.254.235");
  20181. 8028bb8: 4908 ldr r1, [pc, #32] ; (8028bdc <SETTINGS_SetSntpDef+0x28>)
  20182. 8028bba: 4809 ldr r0, [pc, #36] ; (8028be0 <SETTINGS_SetSntpDef+0x2c>)
  20183. /**
  20184. * @brief Установить параметры SNTP по умолчанию
  20185. */
  20186. void SETTINGS_SetSntpDef(void)
  20187. {
  20188. sSettings.sSNTP.sntpEnable = true;
  20189. 8028bbc: 2301 movs r3, #1
  20190. 8028bbe: f884 3340 strb.w r3, [r4, #832] ; 0x340
  20191. strcpy(sSettings.sSNTP.ip, "88.147.254.235");
  20192. 8028bc2: f7f9 faa3 bl 802210c <strcpy>
  20193. sSettings.sSNTP.timeZone = 3.0;
  20194. 8028bc6: 4b07 ldr r3, [pc, #28] ; (8028be4 <SETTINGS_SetSntpDef+0x30>)
  20195. strcpy(sSettings.sSNTP.data, "none");
  20196. 8028bc8: 4807 ldr r0, [pc, #28] ; (8028be8 <SETTINGS_SetSntpDef+0x34>)
  20197. 8028bca: 4908 ldr r1, [pc, #32] ; (8028bec <SETTINGS_SetSntpDef+0x38>)
  20198. */
  20199. void SETTINGS_SetSntpDef(void)
  20200. {
  20201. sSettings.sSNTP.sntpEnable = true;
  20202. strcpy(sSettings.sSNTP.ip, "88.147.254.235");
  20203. sSettings.sSNTP.timeZone = 3.0;
  20204. 8028bcc: f8c4 3370 str.w r3, [r4, #880] ; 0x370
  20205. strcpy(sSettings.sSNTP.data, "none");
  20206. }
  20207. 8028bd0: e8bd 4010 ldmia.w sp!, {r4, lr}
  20208. void SETTINGS_SetSntpDef(void)
  20209. {
  20210. sSettings.sSNTP.sntpEnable = true;
  20211. strcpy(sSettings.sSNTP.ip, "88.147.254.235");
  20212. sSettings.sSNTP.timeZone = 3.0;
  20213. strcpy(sSettings.sSNTP.data, "none");
  20214. 8028bd4: f7f9 ba9a b.w 802210c <strcpy>
  20215. 8028bd8: 2000d414 .word 0x2000d414
  20216. 8028bdc: 08039258 .word 0x08039258
  20217. 8028be0: 2000d755 .word 0x2000d755
  20218. 8028be4: 40400000 .word 0x40400000
  20219. 8028be8: 2000d765 .word 0x2000d765
  20220. 8028bec: 08039267 .word 0x08039267
  20221. 08028bf0 <SETTINGS_SetINOUTSDef>:
  20222. /**
  20223. * @brief Установить параметры настроек сухих контактов / реле по умолчанию
  20224. */
  20225. void SETTINGS_SetINOUTSDef(void)
  20226. {
  20227. sSettings.sInOuts.ro_type_source[0] = CRITICAL;
  20228. 8028bf0: 4b04 ldr r3, [pc, #16] ; (8028c04 <SETTINGS_SetINOUTSDef+0x14>)
  20229. 8028bf2: 2201 movs r2, #1
  20230. sSettings.sInOuts.ro_type_source[1] = SNMP_SET;
  20231. 8028bf4: 2103 movs r1, #3
  20232. /**
  20233. * @brief Установить параметры настроек сухих контактов / реле по умолчанию
  20234. */
  20235. void SETTINGS_SetINOUTSDef(void)
  20236. {
  20237. sSettings.sInOuts.ro_type_source[0] = CRITICAL;
  20238. 8028bf6: f883 2374 strb.w r2, [r3, #884] ; 0x374
  20239. sSettings.sInOuts.ro_type_source[1] = SNMP_SET;
  20240. 8028bfa: f883 1375 strb.w r1, [r3, #885] ; 0x375
  20241. sSettings.sInOuts.din_type_act[0] = DI_CONN;
  20242. 8028bfe: f883 2376 strb.w r2, [r3, #886] ; 0x376
  20243. 8028c02: 4770 bx lr
  20244. 8028c04: 2000d414 .word 0x2000d414
  20245. 08028c08 <SETTINGS_SetRADIUSDef>:
  20246. /**
  20247. * @brief Установить параметры RADIUS по умолчанию
  20248. */
  20249. void SETTINGS_SetRADIUSDef(void)
  20250. {
  20251. 8028c08: b510 push {r4, lr}
  20252. sSettings.sRADIUS.Auth_enable = true;
  20253. 8028c0a: 4c0b ldr r4, [pc, #44] ; (8028c38 <SETTINGS_SetRADIUSDef+0x30>)
  20254. sSettings.sRADIUS.RDSEnable = true;
  20255. strcpy(sSettings.sRADIUS.ServerIP, "0.0.0.0");
  20256. 8028c0c: 490b ldr r1, [pc, #44] ; (8028c3c <SETTINGS_SetRADIUSDef+0x34>)
  20257. 8028c0e: 480c ldr r0, [pc, #48] ; (8028c40 <SETTINGS_SetRADIUSDef+0x38>)
  20258. /**
  20259. * @brief Установить параметры RADIUS по умолчанию
  20260. */
  20261. void SETTINGS_SetRADIUSDef(void)
  20262. {
  20263. sSettings.sRADIUS.Auth_enable = true;
  20264. 8028c10: 2301 movs r3, #1
  20265. 8028c12: f884 3378 strb.w r3, [r4, #888] ; 0x378
  20266. sSettings.sRADIUS.RDSEnable = true;
  20267. 8028c16: f884 339a strb.w r3, [r4, #922] ; 0x39a
  20268. strcpy(sSettings.sRADIUS.ServerIP, "0.0.0.0");
  20269. 8028c1a: f7f9 fa77 bl 802210c <strcpy>
  20270. sSettings.sRADIUS.port = 1812;
  20271. 8028c1e: f240 7314 movw r3, #1812 ; 0x714
  20272. sSettings.sRADIUS.key_access = 123;
  20273. strcpy(sSettings.sRADIUS.rds_password, "12345");
  20274. 8028c22: 4808 ldr r0, [pc, #32] ; (8028c44 <SETTINGS_SetRADIUSDef+0x3c>)
  20275. 8028c24: 4908 ldr r1, [pc, #32] ; (8028c48 <SETTINGS_SetRADIUSDef+0x40>)
  20276. void SETTINGS_SetRADIUSDef(void)
  20277. {
  20278. sSettings.sRADIUS.Auth_enable = true;
  20279. sSettings.sRADIUS.RDSEnable = true;
  20280. strcpy(sSettings.sRADIUS.ServerIP, "0.0.0.0");
  20281. sSettings.sRADIUS.port = 1812;
  20282. 8028c26: f8c4 339c str.w r3, [r4, #924] ; 0x39c
  20283. sSettings.sRADIUS.key_access = 123;
  20284. 8028c2a: 237b movs r3, #123 ; 0x7b
  20285. 8028c2c: f8c4 33a0 str.w r3, [r4, #928] ; 0x3a0
  20286. strcpy(sSettings.sRADIUS.rds_password, "12345");
  20287. }
  20288. 8028c30: e8bd 4010 ldmia.w sp!, {r4, lr}
  20289. sSettings.sRADIUS.Auth_enable = true;
  20290. sSettings.sRADIUS.RDSEnable = true;
  20291. strcpy(sSettings.sRADIUS.ServerIP, "0.0.0.0");
  20292. sSettings.sRADIUS.port = 1812;
  20293. sSettings.sRADIUS.key_access = 123;
  20294. strcpy(sSettings.sRADIUS.rds_password, "12345");
  20295. 8028c34: f7f9 ba6a b.w 802210c <strcpy>
  20296. 8028c38: 2000d414 .word 0x2000d414
  20297. 8028c3c: 08039215 .word 0x08039215
  20298. 8028c40: 2000d78d .word 0x2000d78d
  20299. 8028c44: 2000d79d .word 0x2000d79d
  20300. 8028c48: 08039248 .word 0x08039248
  20301. 08028c4c <SETTINGS_ReadFromFlash>:
  20302. */
  20303. void SETTINGS_ReadFromFlash(uint8_t *data, uint32_t size)
  20304. {
  20305. uint32_t baseAddress = SETTINGS_SECTOR;
  20306. for (uint32_t i = 0; i < size; i++)
  20307. 8028c4c: 2300 movs r3, #0
  20308. 8028c4e: e006 b.n 8028c5e <SETTINGS_ReadFromFlash+0x12>
  20309. *data++ = (*(uint32_t*)baseAddress++);;
  20310. 8028c50: f103 6200 add.w r2, r3, #134217728 ; 0x8000000
  20311. 8028c54: f502 4280 add.w r2, r2, #16384 ; 0x4000
  20312. 8028c58: 6812 ldr r2, [r2, #0]
  20313. 8028c5a: 54c2 strb r2, [r0, r3]
  20314. */
  20315. void SETTINGS_ReadFromFlash(uint8_t *data, uint32_t size)
  20316. {
  20317. uint32_t baseAddress = SETTINGS_SECTOR;
  20318. for (uint32_t i = 0; i < size; i++)
  20319. 8028c5c: 3301 adds r3, #1
  20320. 8028c5e: 428b cmp r3, r1
  20321. 8028c60: d1f6 bne.n 8028c50 <SETTINGS_ReadFromFlash+0x4>
  20322. *data++ = (*(uint32_t*)baseAddress++);;
  20323. }
  20324. 8028c62: 4770 bx lr
  20325. 08028c64 <SETTINGS_EraseFlashSector>:
  20326. */
  20327. void SETTINGS_EraseFlashSector(void)
  20328. {
  20329. FLASH_Status status;
  20330. if ((status = FLASH_EraseSector(FLASH_Sector_1, VoltageRange_3)) != FLASH_COMPLETE) {
  20331. 8028c64: 2008 movs r0, #8
  20332. 8028c66: 2102 movs r1, #2
  20333. 8028c68: f7fc bd7a b.w 8025760 <FLASH_EraseSector>
  20334. 08028c6c <SETTINGS_GetCRC>:
  20335. /**
  20336. * @brief
  20337. * @retval
  20338. */
  20339. uint32_t SETTINGS_GetCRC(void)
  20340. {
  20341. 8028c6c: b508 push {r3, lr}
  20342. CRC_ResetDR();
  20343. 8028c6e: f7fc fce1 bl 8025634 <CRC_ResetDR>
  20344. return CRC_CalcBlockCRC((uint32_t*)&sSettings, sizeof(sSettings)/4 - 1);
  20345. 8028c72: 4803 ldr r0, [pc, #12] ; (8028c80 <SETTINGS_GetCRC+0x14>)
  20346. 8028c74: 21e9 movs r1, #233 ; 0xe9
  20347. }
  20348. 8028c76: e8bd 4008 ldmia.w sp!, {r3, lr}
  20349. * @retval
  20350. */
  20351. uint32_t SETTINGS_GetCRC(void)
  20352. {
  20353. CRC_ResetDR();
  20354. return CRC_CalcBlockCRC((uint32_t*)&sSettings, sizeof(sSettings)/4 - 1);
  20355. 8028c7a: f7fc bce1 b.w 8025640 <CRC_CalcBlockCRC>
  20356. 8028c7e: bf00 nop
  20357. 8028c80: 2000d414 .word 0x2000d414
  20358. 08028c84 <SETTINGS_WriteToFlash>:
  20359. /**
  20360. * @brief
  20361. */
  20362. void SETTINGS_WriteToFlash(uint8_t *data, uint32_t size)
  20363. {
  20364. 8028c84: e92d 4ff8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, lr}
  20365. 8028c88: 4606 mov r6, r0
  20366. 8028c8a: 468a mov sl, r1
  20367. uint32_t baseAddress = SETTINGS_SECTOR;
  20368. uint32_t checkCrc = 0;
  20369. uint32_t crc = SETTINGS_GetCRC();
  20370. 8028c8c: f7ff ffee bl 8028c6c <SETTINGS_GetCRC>
  20371. /**
  20372. * @brief
  20373. */
  20374. void SETTINGS_WriteToFlash(uint8_t *data, uint32_t size)
  20375. {
  20376. uint32_t baseAddress = SETTINGS_SECTOR;
  20377. 8028c90: 4c17 ldr r4, [pc, #92] ; (8028cf0 <SETTINGS_WriteToFlash+0x6c>)
  20378. uint32_t checkCrc = 0;
  20379. uint32_t crc = SETTINGS_GetCRC();
  20380. 8028c92: 4680 mov r8, r0
  20381. 8028c94: 2703 movs r7, #3
  20382. FLASH_Status status;
  20383. for (uint8_t i = 0; i < 3; i++)
  20384. {
  20385. fAlarm = 0;
  20386. FLASH_Unlock();
  20387. 8028c96: f7fc fce3 bl 8025660 <FLASH_Unlock>
  20388. 8028c9a: 4635 mov r5, r6
  20389. SETTINGS_EraseFlashSector();
  20390. 8028c9c: f7ff ffe2 bl 8028c64 <SETTINGS_EraseFlashSector>
  20391. }
  20392. /**
  20393. * @brief
  20394. */
  20395. void SETTINGS_WriteToFlash(uint8_t *data, uint32_t size)
  20396. 8028ca0: eb04 0b0a add.w fp, r4, sl
  20397. fAlarm = 0;
  20398. FLASH_Unlock();
  20399. SETTINGS_EraseFlashSector();
  20400. for (uint32_t i = 0; i < size; i++)
  20401. 8028ca4: e00a b.n 8028cbc <SETTINGS_WriteToFlash+0x38>
  20402. if ((status = FLASH_ProgramByte(baseAddress++, *data++)) != FLASH_COMPLETE) {
  20403. 8028ca6: f815 1b01 ldrb.w r1, [r5], #1
  20404. 8028caa: 4620 mov r0, r4
  20405. 8028cac: f7fc fd1e bl 80256ec <FLASH_ProgramByte>
  20406. 8028cb0: f104 0901 add.w r9, r4, #1
  20407. 8028cb4: 2808 cmp r0, #8
  20408. 8028cb6: 462e mov r6, r5
  20409. 8028cb8: 464c mov r4, r9
  20410. 8028cba: d102 bne.n 8028cc2 <SETTINGS_WriteToFlash+0x3e>
  20411. fAlarm = 0;
  20412. FLASH_Unlock();
  20413. SETTINGS_EraseFlashSector();
  20414. for (uint32_t i = 0; i < size; i++)
  20415. 8028cbc: 455c cmp r4, fp
  20416. 8028cbe: 462e mov r6, r5
  20417. 8028cc0: d1f1 bne.n 8028ca6 <SETTINGS_WriteToFlash+0x22>
  20418. if ((status = FLASH_ProgramByte(baseAddress++, *data++)) != FLASH_COMPLETE) {
  20419. DBG printf("FLASH_ProgramByte error: status = %d\r\n", status);
  20420. break;
  20421. }
  20422. if ((status = FLASH_ProgramWord((uint32_t)CRC_ADDRESS, crc)) != FLASH_COMPLETE) {
  20423. 8028cc2: 4641 mov r1, r8
  20424. 8028cc4: 480b ldr r0, [pc, #44] ; (8028cf4 <SETTINGS_WriteToFlash+0x70>)
  20425. 8028cc6: f7fc fd2d bl 8025724 <FLASH_ProgramWord>
  20426. DBG printf("FLASH_ProgramWord error: status = %d\r\n", status);
  20427. }
  20428. FLASH_Lock();
  20429. 8028cca: f7fc fcd7 bl 802567c <FLASH_Lock>
  20430. /* Считываем что записали */
  20431. SETTINGS_ReadFromFlash((uint8_t*)&sSettings, sizeof(sSettings));
  20432. 8028cce: 480a ldr r0, [pc, #40] ; (8028cf8 <SETTINGS_WriteToFlash+0x74>)
  20433. 8028cd0: f44f 716a mov.w r1, #936 ; 0x3a8
  20434. 8028cd4: f7ff ffba bl 8028c4c <SETTINGS_ReadFromFlash>
  20435. checkCrc = SETTINGS_GetCRC();
  20436. 8028cd8: f7ff ffc8 bl 8028c6c <SETTINGS_GetCRC>
  20437. /* Проверяем CRC того что было записано */
  20438. if (checkCrc == crc)
  20439. 8028cdc: 4540 cmp r0, r8
  20440. 8028cde: d004 beq.n 8028cea <SETTINGS_WriteToFlash+0x66>
  20441. 8028ce0: 3f01 subs r7, #1
  20442. uint32_t checkCrc = 0;
  20443. uint32_t crc = SETTINGS_GetCRC();
  20444. bool fAlarm = 0;
  20445. FLASH_Status status;
  20446. for (uint8_t i = 0; i < 3; i++)
  20447. 8028ce2: f017 07ff ands.w r7, r7, #255 ; 0xff
  20448. 8028ce6: d1d6 bne.n 8028c96 <SETTINGS_WriteToFlash+0x12>
  20449. 8028ce8: e7fe b.n 8028ce8 <SETTINGS_WriteToFlash+0x64>
  20450. 8028cea: e8bd 8ff8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc}
  20451. 8028cee: bf00 nop
  20452. 8028cf0: 08004000 .word 0x08004000
  20453. 8028cf4: 08005f9c .word 0x08005f9c
  20454. 8028cf8: 2000d414 .word 0x2000d414
  20455. 08028cfc <SETTINGS_GetCritSecCRC>:
  20456. /**
  20457. * @brief
  20458. * @retval
  20459. */
  20460. uint32_t SETTINGS_GetCritSecCRC(void)
  20461. {
  20462. 8028cfc: b508 push {r3, lr}
  20463. CRC_ResetDR();
  20464. 8028cfe: f7fc fc99 bl 8025634 <CRC_ResetDR>
  20465. uint32_t critsec_len = (uint32_t)((uint8_t *)(&sSettings.CritSecCRC) - (uint8_t *)&sSettings) / 4;
  20466. return CRC_CalcBlockCRC((uint32_t *)&sSettings, critsec_len);
  20467. 8028d02: 4803 ldr r0, [pc, #12] ; (8028d10 <SETTINGS_GetCritSecCRC+0x14>)
  20468. 8028d04: 2147 movs r1, #71 ; 0x47
  20469. }
  20470. 8028d06: e8bd 4008 ldmia.w sp!, {r3, lr}
  20471. */
  20472. uint32_t SETTINGS_GetCritSecCRC(void)
  20473. {
  20474. CRC_ResetDR();
  20475. uint32_t critsec_len = (uint32_t)((uint8_t *)(&sSettings.CritSecCRC) - (uint8_t *)&sSettings) / 4;
  20476. return CRC_CalcBlockCRC((uint32_t *)&sSettings, critsec_len);
  20477. 8028d0a: f7fc bc99 b.w 8025640 <CRC_CalcBlockCRC>
  20478. 8028d0e: bf00 nop
  20479. 8028d10: 2000d414 .word 0x2000d414
  20480. 08028d14 <SETTINGS_Save>:
  20481. /**
  20482. * @brief Запись структуры настроек во flesh
  20483. */
  20484. void SETTINGS_Save(void)
  20485. {
  20486. 8028d14: b508 push {r3, lr}
  20487. /* Calc critical section CRC and store to the settings structure */
  20488. sSettings.CritSecCRC = SETTINGS_GetCritSecCRC();
  20489. 8028d16: f7ff fff1 bl 8028cfc <SETTINGS_GetCritSecCRC>
  20490. 8028d1a: 4b05 ldr r3, [pc, #20] ; (8028d30 <SETTINGS_Save+0x1c>)
  20491. SETTINGS_WriteToFlash((uint8_t*)&sSettings, sizeof(sSettings));
  20492. 8028d1c: f44f 716a mov.w r1, #936 ; 0x3a8
  20493. * @brief Запись структуры настроек во flesh
  20494. */
  20495. void SETTINGS_Save(void)
  20496. {
  20497. /* Calc critical section CRC and store to the settings structure */
  20498. sSettings.CritSecCRC = SETTINGS_GetCritSecCRC();
  20499. 8028d20: f8c3 011c str.w r0, [r3, #284] ; 0x11c
  20500. SETTINGS_WriteToFlash((uint8_t*)&sSettings, sizeof(sSettings));
  20501. 8028d24: 4618 mov r0, r3
  20502. }
  20503. 8028d26: e8bd 4008 ldmia.w sp!, {r3, lr}
  20504. void SETTINGS_Save(void)
  20505. {
  20506. /* Calc critical section CRC and store to the settings structure */
  20507. sSettings.CritSecCRC = SETTINGS_GetCritSecCRC();
  20508. SETTINGS_WriteToFlash((uint8_t*)&sSettings, sizeof(sSettings));
  20509. 8028d2a: f7ff bfab b.w 8028c84 <SETTINGS_WriteToFlash>
  20510. 8028d2e: bf00 nop
  20511. 8028d30: 2000d414 .word 0x2000d414
  20512. 08028d34 <SETTINGS_SetDefaultDebug>:
  20513. /**
  20514. * @brief Установка настроек для отладки
  20515. */
  20516. void SETTINGS_SetDefaultDebug(void)
  20517. {
  20518. 8028d34: b510 push {r4, lr}
  20519. /**
  20520. * @brief Установить флаги по умолчанию
  20521. */
  20522. void SETTINGS_SetFlagsDef(void)
  20523. {
  20524. sSettings.sFlags.netsettingsChanged = false;
  20525. 8028d36: 4c0d ldr r4, [pc, #52] ; (8028d6c <SETTINGS_SetDefaultDebug+0x38>)
  20526. /**
  20527. * @brief Установка настроек для отладки
  20528. */
  20529. void SETTINGS_SetDefaultDebug(void)
  20530. {
  20531. SETTINGS_SetWebParamsDef();
  20532. 8028d38: f7ff fe46 bl 80289c8 <SETTINGS_SetWebParamsDef>
  20533. SETTINGS_SetTempWebParamsDef();
  20534. 8028d3c: f7ff fe60 bl 8028a00 <SETTINGS_SetTempWebParamsDef>
  20535. SETTINGS_SetSnmpDef();
  20536. 8028d40: f7ff fe7a bl 8028a38 <SETTINGS_SetSnmpDef>
  20537. SETTINGS_SetBootParamsDef();
  20538. 8028d44: f7ff fe38 bl 80289b8 <SETTINGS_SetBootParamsDef>
  20539. /**
  20540. * @brief Установить флаги по умолчанию
  20541. */
  20542. void SETTINGS_SetFlagsDef(void)
  20543. {
  20544. sSettings.sFlags.netsettingsChanged = false;
  20545. 8028d48: 2300 movs r3, #0
  20546. 8028d4a: f884 3120 strb.w r3, [r4, #288] ; 0x120
  20547. SETTINGS_SetTempWebParamsDef();
  20548. SETTINGS_SetSnmpDef();
  20549. SETTINGS_SetBootParamsDef();
  20550. SETTINGS_SetFlagsDef();
  20551. //SETTINGS_SetServiceDef();
  20552. SETTINGS_SetSntpDef();
  20553. 8028d4e: f7ff ff31 bl 8028bb4 <SETTINGS_SetSntpDef>
  20554. SETTINGS_SetINOUTSDef();
  20555. 8028d52: f7ff ff4d bl 8028bf0 <SETTINGS_SetINOUTSDef>
  20556. SETTINGS_SetRADIUSDef();
  20557. 8028d56: f7ff ff57 bl 8028c08 <SETTINGS_SetRADIUSDef>
  20558. //SETTINGS_SetInfoDef();
  20559. sSettings.CritSecCRC = SETTINGS_GetCritSecCRC();
  20560. 8028d5a: f7ff ffcf bl 8028cfc <SETTINGS_GetCritSecCRC>
  20561. sSettings.controlWorld = SETTINGS_CONTROL_WORD;
  20562. 8028d5e: 4b04 ldr r3, [pc, #16] ; (8028d70 <SETTINGS_SetDefaultDebug+0x3c>)
  20563. SETTINGS_SetSntpDef();
  20564. SETTINGS_SetINOUTSDef();
  20565. SETTINGS_SetRADIUSDef();
  20566. //SETTINGS_SetInfoDef();
  20567. sSettings.CritSecCRC = SETTINGS_GetCritSecCRC();
  20568. 8028d60: f8c4 011c str.w r0, [r4, #284] ; 0x11c
  20569. sSettings.controlWorld = SETTINGS_CONTROL_WORD;
  20570. 8028d64: f8c4 33a4 str.w r3, [r4, #932] ; 0x3a4
  20571. 8028d68: bd10 pop {r4, pc}
  20572. 8028d6a: bf00 nop
  20573. 8028d6c: 2000d414 .word 0x2000d414
  20574. 8028d70: 075bcd15 .word 0x075bcd15
  20575. 08028d74 <SETTINGS_SetAllDefault>:
  20576. /**
  20577. * @brief Сброс всех настроек в значения по умолчанию
  20578. */
  20579. void SETTINGS_SetAllDefault(void)
  20580. {
  20581. 8028d74: b510 push {r4, lr}
  20582. /**
  20583. * @brief Установить флаги по умолчанию
  20584. */
  20585. void SETTINGS_SetFlagsDef(void)
  20586. {
  20587. sSettings.sFlags.netsettingsChanged = false;
  20588. 8028d76: 4c0f ldr r4, [pc, #60] ; (8028db4 <SETTINGS_SetAllDefault+0x40>)
  20589. /**
  20590. * @brief Сброс всех настроек в значения по умолчанию
  20591. */
  20592. void SETTINGS_SetAllDefault(void)
  20593. {
  20594. SETTINGS_SetBootParamsDef();
  20595. 8028d78: f7ff fe1e bl 80289b8 <SETTINGS_SetBootParamsDef>
  20596. SETTINGS_SetWebParamsDef();
  20597. 8028d7c: f7ff fe24 bl 80289c8 <SETTINGS_SetWebParamsDef>
  20598. SETTINGS_SetTempWebParamsDef();
  20599. 8028d80: f7ff fe3e bl 8028a00 <SETTINGS_SetTempWebParamsDef>
  20600. SETTINGS_SetSnmpDef();
  20601. 8028d84: f7ff fe58 bl 8028a38 <SETTINGS_SetSnmpDef>
  20602. SETTINGS_SetInfoDef();
  20603. 8028d88: f7ff fe9e bl 8028ac8 <SETTINGS_SetInfoDef>
  20604. /**
  20605. * @brief Установить флаги по умолчанию
  20606. */
  20607. void SETTINGS_SetFlagsDef(void)
  20608. {
  20609. sSettings.sFlags.netsettingsChanged = false;
  20610. 8028d8c: 2300 movs r3, #0
  20611. 8028d8e: f884 3120 strb.w r3, [r4, #288] ; 0x120
  20612. SETTINGS_SetWebParamsDef();
  20613. SETTINGS_SetTempWebParamsDef();
  20614. SETTINGS_SetSnmpDef();
  20615. SETTINGS_SetInfoDef();
  20616. SETTINGS_SetFlagsDef();
  20617. SETTINGS_SetServiceDef();
  20618. 8028d92: f7ff fed5 bl 8028b40 <SETTINGS_SetServiceDef>
  20619. SETTINGS_SetSntpDef();
  20620. 8028d96: f7ff ff0d bl 8028bb4 <SETTINGS_SetSntpDef>
  20621. SETTINGS_SetINOUTSDef();
  20622. 8028d9a: f7ff ff29 bl 8028bf0 <SETTINGS_SetINOUTSDef>
  20623. SETTINGS_SetRADIUSDef();
  20624. 8028d9e: f7ff ff33 bl 8028c08 <SETTINGS_SetRADIUSDef>
  20625. sSettings.CritSecCRC = SETTINGS_GetCritSecCRC();
  20626. 8028da2: f7ff ffab bl 8028cfc <SETTINGS_GetCritSecCRC>
  20627. sSettings.controlWorld = SETTINGS_CONTROL_WORD;
  20628. 8028da6: 4b04 ldr r3, [pc, #16] ; (8028db8 <SETTINGS_SetAllDefault+0x44>)
  20629. SETTINGS_SetServiceDef();
  20630. SETTINGS_SetSntpDef();
  20631. SETTINGS_SetINOUTSDef();
  20632. SETTINGS_SetRADIUSDef();
  20633. sSettings.CritSecCRC = SETTINGS_GetCritSecCRC();
  20634. 8028da8: f8c4 011c str.w r0, [r4, #284] ; 0x11c
  20635. sSettings.controlWorld = SETTINGS_CONTROL_WORD;
  20636. 8028dac: f8c4 33a4 str.w r3, [r4, #932] ; 0x3a4
  20637. 8028db0: bd10 pop {r4, pc}
  20638. 8028db2: bf00 nop
  20639. 8028db4: 2000d414 .word 0x2000d414
  20640. 8028db8: 075bcd15 .word 0x075bcd15
  20641. 08028dbc <SETTINGS_Load>:
  20642. /**
  20643. * @brief Загрузка структуры настроек из flesh
  20644. */
  20645. void SETTINGS_Load(void)
  20646. {
  20647. 8028dbc: b510 push {r4, lr}
  20648. uint32_t loadCRC; // CRC из flash
  20649. uint32_t newCRC; // CRC загруженной структуры настроек
  20650. SETTINGS_ReadFromFlash((uint8_t*)&sSettings, sizeof(sSettings));
  20651. 8028dbe: 4809 ldr r0, [pc, #36] ; (8028de4 <SETTINGS_Load+0x28>)
  20652. 8028dc0: f44f 716a mov.w r1, #936 ; 0x3a8
  20653. 8028dc4: f7ff ff42 bl 8028c4c <SETTINGS_ReadFromFlash>
  20654. /* Считываем CRC из флеш памяти */
  20655. loadCRC = (*(uint32_t*)CRC_ADDRESS);
  20656. 8028dc8: 4b07 ldr r3, [pc, #28] ; (8028de8 <SETTINGS_Load+0x2c>)
  20657. 8028dca: 681c ldr r4, [r3, #0]
  20658. /* Рассчитываем CRC для структуры настроек */
  20659. newCRC = SETTINGS_GetCRC();
  20660. 8028dcc: f7ff ff4e bl 8028c6c <SETTINGS_GetCRC>
  20661. if (loadCRC != newCRC) {
  20662. 8028dd0: 4284 cmp r4, r0
  20663. 8028dd2: d005 beq.n 8028de0 <SETTINGS_Load+0x24>
  20664. SETTINGS_SetAllDefault();
  20665. 8028dd4: f7ff ffce bl 8028d74 <SETTINGS_SetAllDefault>
  20666. SETTINGS_Save();
  20667. }
  20668. }
  20669. 8028dd8: e8bd 4010 ldmia.w sp!, {r4, lr}
  20670. /* Рассчитываем CRC для структуры настроек */
  20671. newCRC = SETTINGS_GetCRC();
  20672. if (loadCRC != newCRC) {
  20673. SETTINGS_SetAllDefault();
  20674. SETTINGS_Save();
  20675. 8028ddc: f7ff bf9a b.w 8028d14 <SETTINGS_Save>
  20676. 8028de0: bd10 pop {r4, pc}
  20677. 8028de2: bf00 nop
  20678. 8028de4: 2000d414 .word 0x2000d414
  20679. 8028de8: 08005f9c .word 0x08005f9c
  20680. 08028dec <SETTINGS_SetPartDefault>:
  20681. /**
  20682. * @brief Сброс всех настроек в значения по умолчанию кроме сетевых настроек
  20683. */
  20684. void SETTINGS_SetPartDefault(void)
  20685. {
  20686. 8028dec: b510 push {r4, lr}
  20687. /**
  20688. * @brief Установить флаги по умолчанию
  20689. */
  20690. void SETTINGS_SetFlagsDef(void)
  20691. {
  20692. sSettings.sFlags.netsettingsChanged = false;
  20693. 8028dee: 4c0b ldr r4, [pc, #44] ; (8028e1c <SETTINGS_SetPartDefault+0x30>)
  20694. /**
  20695. * @brief Сброс всех настроек в значения по умолчанию кроме сетевых настроек
  20696. */
  20697. void SETTINGS_SetPartDefault(void)
  20698. {
  20699. SETTINGS_SetBootParamsDef();
  20700. 8028df0: f7ff fde2 bl 80289b8 <SETTINGS_SetBootParamsDef>
  20701. SETTINGS_SetSnmpDef();
  20702. 8028df4: f7ff fe20 bl 8028a38 <SETTINGS_SetSnmpDef>
  20703. /**
  20704. * @brief Установить флаги по умолчанию
  20705. */
  20706. void SETTINGS_SetFlagsDef(void)
  20707. {
  20708. sSettings.sFlags.netsettingsChanged = false;
  20709. 8028df8: 2300 movs r3, #0
  20710. 8028dfa: f884 3120 strb.w r3, [r4, #288] ; 0x120
  20711. {
  20712. SETTINGS_SetBootParamsDef();
  20713. SETTINGS_SetSnmpDef();
  20714. SETTINGS_SetFlagsDef();
  20715. // SETTINGS_SetServiceDef();
  20716. SETTINGS_SetSntpDef();
  20717. 8028dfe: f7ff fed9 bl 8028bb4 <SETTINGS_SetSntpDef>
  20718. SETTINGS_SetINOUTSDef();
  20719. 8028e02: f7ff fef5 bl 8028bf0 <SETTINGS_SetINOUTSDef>
  20720. SETTINGS_SetRADIUSDef();
  20721. 8028e06: f7ff feff bl 8028c08 <SETTINGS_SetRADIUSDef>
  20722. sSettings.CritSecCRC = SETTINGS_GetCritSecCRC();
  20723. 8028e0a: f7ff ff77 bl 8028cfc <SETTINGS_GetCritSecCRC>
  20724. sSettings.controlWorld = SETTINGS_CONTROL_WORD;
  20725. 8028e0e: 4b04 ldr r3, [pc, #16] ; (8028e20 <SETTINGS_SetPartDefault+0x34>)
  20726. // SETTINGS_SetServiceDef();
  20727. SETTINGS_SetSntpDef();
  20728. SETTINGS_SetINOUTSDef();
  20729. SETTINGS_SetRADIUSDef();
  20730. sSettings.CritSecCRC = SETTINGS_GetCritSecCRC();
  20731. 8028e10: f8c4 011c str.w r0, [r4, #284] ; 0x11c
  20732. sSettings.controlWorld = SETTINGS_CONTROL_WORD;
  20733. 8028e14: f8c4 33a4 str.w r3, [r4, #932] ; 0x3a4
  20734. 8028e18: bd10 pop {r4, pc}
  20735. 8028e1a: bf00 nop
  20736. 8028e1c: 2000d414 .word 0x2000d414
  20737. 8028e20: 075bcd15 .word 0x075bcd15
  20738. 08028e24 <SETTINGS_ResetBootTry>:
  20739. /**
  20740. * @brief Сброс флага boottry в регистре RTC
  20741. */
  20742. void SETTINGS_ResetBootTry(void)
  20743. {
  20744. uint8_t bootTry = RTC_ReadBackupRegister(RTC_BKP_DR2);
  20745. 8028e24: 2002 movs r0, #2
  20746. /**
  20747. * @brief Сброс флага boottry в регистре RTC
  20748. */
  20749. void SETTINGS_ResetBootTry(void)
  20750. {
  20751. 8028e26: b508 push {r3, lr}
  20752. uint8_t bootTry = RTC_ReadBackupRegister(RTC_BKP_DR2);
  20753. 8028e28: f7fc fffe bl 8025e28 <RTC_ReadBackupRegister>
  20754. if (bootTry > 0 )
  20755. 8028e2c: f010 0fff tst.w r0, #255 ; 0xff
  20756. 8028e30: d014 beq.n 8028e5c <SETTINGS_ResetBootTry+0x38>
  20757. {
  20758. bootTry = 0;
  20759. RTC_WriteBackupRegister(RTC_BKP_DR2, 0);
  20760. 8028e32: 2002 movs r0, #2
  20761. 8028e34: 2100 movs r1, #0
  20762. 8028e36: f7fc ffe7 bl 8025e08 <RTC_WriteBackupRegister>
  20763. /* Check FW update flag */
  20764. if (RTC_ReadBackupRegister(RTC_BKP_DR3)) {
  20765. 8028e3a: 2003 movs r0, #3
  20766. 8028e3c: f7fc fff4 bl 8025e28 <RTC_ReadBackupRegister>
  20767. 8028e40: b160 cbz r0, 8028e5c <SETTINGS_ResetBootTry+0x38>
  20768. /* Отправка трапа об успешном обновлении ПО */
  20769. #ifndef BT6702_SERVICE
  20770. SNMP_SendUserTrap(FW_VERSION_UPDATED);
  20771. 8028e42: 2002 movs r0, #2
  20772. 8028e44: f00e ff4c bl 8037ce0 <SNMP_SendUserTrap>
  20773. log_event_data(LOG_UPDATE_SOFT, "Успешно");
  20774. 8028e48: 2002 movs r0, #2
  20775. 8028e4a: 4905 ldr r1, [pc, #20] ; (8028e60 <SETTINGS_ResetBootTry+0x3c>)
  20776. 8028e4c: f001 fa0a bl 802a264 <log_event_data>
  20777. #endif
  20778. /* Clear FW update flag */
  20779. RTC_WriteBackupRegister(RTC_BKP_DR3, 0);
  20780. 8028e50: 2003 movs r0, #3
  20781. 8028e52: 2100 movs r1, #0
  20782. //taskENTER_CRITICAL();
  20783. SETTINGS_Save();
  20784. //taskEXIT_CRITICAL();
  20785. } */
  20786. }
  20787. 8028e54: e8bd 4008 ldmia.w sp!, {r3, lr}
  20788. #ifndef BT6702_SERVICE
  20789. SNMP_SendUserTrap(FW_VERSION_UPDATED);
  20790. log_event_data(LOG_UPDATE_SOFT, "Успешно");
  20791. #endif
  20792. /* Clear FW update flag */
  20793. RTC_WriteBackupRegister(RTC_BKP_DR3, 0);
  20794. 8028e58: f7fc bfd6 b.w 8025e08 <RTC_WriteBackupRegister>
  20795. 8028e5c: bd08 pop {r3, pc}
  20796. 8028e5e: bf00 nop
  20797. 8028e60: 0803926c .word 0x0803926c
  20798. 08028e64 <SETTINGS_GetMac>:
  20799. /**
  20800. * @brief Преобразует mac адрес строкового формата в массив uint8_t
  20801. * @param mac - буфер для вывода mac адреса
  20802. */
  20803. void SETTINGS_GetMac(uint8_t *mac)
  20804. {
  20805. 8028e64: b573 push {r0, r1, r4, r5, r6, lr}
  20806. #if defined ( __ICCARM__ )
  20807. macPtr = DEVICE_MAC;
  20808. #endif
  20809. for (uint8_t i = 0; i < 6; i++)
  20810. {
  20811. strncpy(dummy, macPtr+i*3, 2);
  20812. 8028e66: 4e0a ldr r6, [pc, #40] ; (8028e90 <SETTINGS_GetMac+0x2c>)
  20813. /**
  20814. * @brief Преобразует mac адрес строкового формата в массив uint8_t
  20815. * @param mac - буфер для вывода mac адреса
  20816. */
  20817. void SETTINGS_GetMac(uint8_t *mac)
  20818. 8028e68: 1e45 subs r5, r0, #1
  20819. 8028e6a: 2400 movs r4, #0
  20820. #if defined ( __ICCARM__ )
  20821. macPtr = DEVICE_MAC;
  20822. #endif
  20823. for (uint8_t i = 0; i < 6; i++)
  20824. {
  20825. strncpy(dummy, macPtr+i*3, 2);
  20826. 8028e6c: 1931 adds r1, r6, r4
  20827. 8028e6e: 318c adds r1, #140 ; 0x8c
  20828. 8028e70: 2202 movs r2, #2
  20829. 8028e72: a801 add r0, sp, #4
  20830. 8028e74: f7f9 fa60 bl 8022338 <strncpy>
  20831. mac[i] = (uint8_t)strtol(dummy, NULL, 16);
  20832. 8028e78: 2100 movs r1, #0
  20833. 8028e7a: 2210 movs r2, #16
  20834. 8028e7c: a801 add r0, sp, #4
  20835. 8028e7e: f7fa fd91 bl 80239a4 <strtol>
  20836. 8028e82: 3403 adds r4, #3
  20837. char *macPtr = sSettings.sInfo.mac;
  20838. #if defined ( __ICCARM__ )
  20839. macPtr = DEVICE_MAC;
  20840. #endif
  20841. for (uint8_t i = 0; i < 6; i++)
  20842. 8028e84: 2c12 cmp r4, #18
  20843. {
  20844. strncpy(dummy, macPtr+i*3, 2);
  20845. mac[i] = (uint8_t)strtol(dummy, NULL, 16);
  20846. 8028e86: f805 0f01 strb.w r0, [r5, #1]!
  20847. char *macPtr = sSettings.sInfo.mac;
  20848. #if defined ( __ICCARM__ )
  20849. macPtr = DEVICE_MAC;
  20850. #endif
  20851. for (uint8_t i = 0; i < 6; i++)
  20852. 8028e8a: d1ef bne.n 8028e6c <SETTINGS_GetMac+0x8>
  20853. {
  20854. strncpy(dummy, macPtr+i*3, 2);
  20855. mac[i] = (uint8_t)strtol(dummy, NULL, 16);
  20856. }
  20857. }
  20858. 8028e8c: bd7c pop {r2, r3, r4, r5, r6, pc}
  20859. 8028e8e: bf00 nop
  20860. 8028e90: 2000d414 .word 0x2000d414
  20861. 08028e94 <SETTINGS_SetProDate>:
  20862. /**
  20863. * @brief Установить дату производства
  20864. */
  20865. void SETTINGS_SetProDate(char *proDate, uint8_t len)
  20866. {
  20867. 8028e94: b570 push {r4, r5, r6, lr}
  20868. memset(sSettings.sInfo.productionData, 0, 40);
  20869. 8028e96: 4c07 ldr r4, [pc, #28] ; (8028eb4 <SETTINGS_SetProDate+0x20>)
  20870. /**
  20871. * @brief Установить дату производства
  20872. */
  20873. void SETTINGS_SetProDate(char *proDate, uint8_t len)
  20874. {
  20875. 8028e98: 4606 mov r6, r0
  20876. 8028e9a: 460d mov r5, r1
  20877. memset(sSettings.sInfo.productionData, 0, 40);
  20878. 8028e9c: 2228 movs r2, #40 ; 0x28
  20879. 8028e9e: 2100 movs r1, #0
  20880. 8028ea0: 4620 mov r0, r4
  20881. 8028ea2: f7f8 ffb9 bl 8021e18 <memset>
  20882. memcpy(sSettings.sInfo.productionData, proDate, len);
  20883. 8028ea6: 4620 mov r0, r4
  20884. 8028ea8: 4631 mov r1, r6
  20885. 8028eaa: 462a mov r2, r5
  20886. }
  20887. 8028eac: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
  20888. * @brief Установить дату производства
  20889. */
  20890. void SETTINGS_SetProDate(char *proDate, uint8_t len)
  20891. {
  20892. memset(sSettings.sInfo.productionData, 0, 40);
  20893. memcpy(sSettings.sInfo.productionData, proDate, len);
  20894. 8028eb0: f7f8 bef8 b.w 8021ca4 <memcpy>
  20895. 8028eb4: 2000d478 .word 0x2000d478
  20896. 08028eb8 <SYS_BackupInfo>:
  20897. * @brief Общая структура настроек
  20898. */
  20899. extern SETTINGS_t sSettings;
  20900. #ifdef BACKUP_OLD_SYS
  20901. bool SYS_BackupInfo(char *mac, char *serial) {
  20902. 8028eb8: b510 push {r4, lr}
  20903. 8028eba: 4602 mov r2, r0
  20904. 8028ebc: 460c mov r4, r1
  20905. snprintf(mac_backup, MAC_LEN, mac);
  20906. 8028ebe: 4806 ldr r0, [pc, #24] ; (8028ed8 <SYS_BackupInfo+0x20>)
  20907. 8028ec0: 2112 movs r1, #18
  20908. 8028ec2: f7fe fef3 bl 8027cac <tfp_snprintf>
  20909. snprintf(serial_backup, SER_LEN, serial);
  20910. 8028ec6: 2110 movs r1, #16
  20911. 8028ec8: 4622 mov r2, r4
  20912. 8028eca: 4804 ldr r0, [pc, #16] ; (8028edc <SYS_BackupInfo+0x24>)
  20913. 8028ecc: f7fe feee bl 8027cac <tfp_snprintf>
  20914. backup_done = true;
  20915. 8028ed0: 4b03 ldr r3, [pc, #12] ; (8028ee0 <SYS_BackupInfo+0x28>)
  20916. 8028ed2: 2001 movs r0, #1
  20917. 8028ed4: 7018 strb r0, [r3, #0]
  20918. return backup_done;
  20919. }
  20920. 8028ed6: bd10 pop {r4, pc}
  20921. 8028ed8: 20000b2d .word 0x20000b2d
  20922. 8028edc: 20000b3f .word 0x20000b3f
  20923. 8028ee0: 20000b51 .word 0x20000b51
  20924. 08028ee4 <SYS_RestoreInfo>:
  20925. bool SYS_RestoreInfo(SYS_t *settings) {
  20926. if (backup_done) {
  20927. 8028ee4: 4b09 ldr r3, [pc, #36] ; (8028f0c <SYS_RestoreInfo+0x28>)
  20928. 8028ee6: 781b ldrb r3, [r3, #0]
  20929. return backup_done;
  20930. }
  20931. bool SYS_RestoreInfo(SYS_t *settings) {
  20932. 8028ee8: b510 push {r4, lr}
  20933. 8028eea: 4604 mov r4, r0
  20934. if (backup_done) {
  20935. 8028eec: b15b cbz r3, 8028f06 <SYS_RestoreInfo+0x22>
  20936. snprintf(settings->mac, MAC_LEN, mac_backup);
  20937. 8028eee: 2112 movs r1, #18
  20938. 8028ef0: 4a07 ldr r2, [pc, #28] ; (8028f10 <SYS_RestoreInfo+0x2c>)
  20939. 8028ef2: f7fe fedb bl 8027cac <tfp_snprintf>
  20940. snprintf(settings->serial, SER_LEN, serial_backup);
  20941. 8028ef6: f104 0012 add.w r0, r4, #18
  20942. 8028efa: 2110 movs r1, #16
  20943. 8028efc: 4a05 ldr r2, [pc, #20] ; (8028f14 <SYS_RestoreInfo+0x30>)
  20944. 8028efe: f7fe fed5 bl 8027cac <tfp_snprintf>
  20945. return true;
  20946. 8028f02: 2001 movs r0, #1
  20947. 8028f04: bd10 pop {r4, pc}
  20948. }
  20949. return false;
  20950. 8028f06: 4618 mov r0, r3
  20951. }
  20952. 8028f08: bd10 pop {r4, pc}
  20953. 8028f0a: bf00 nop
  20954. 8028f0c: 20000b51 .word 0x20000b51
  20955. 8028f10: 20000b2d .word 0x20000b2d
  20956. 8028f14: 20000b3f .word 0x20000b3f
  20957. 08028f18 <SYS_SetDefault>:
  20958. #endif
  20959. bool SYS_SetDefault(SYS_t *settings) {
  20960. 8028f18: b570 push {r4, r5, r6, lr}
  20961. if (!settings)
  20962. 8028f1a: 4604 mov r4, r0
  20963. 8028f1c: b358 cbz r0, 8028f76 <SYS_SetDefault+0x5e>
  20964. return false;
  20965. #ifdef BACKUP_OLD_SYS
  20966. /* Try to backup device MAC and serial. */
  20967. if (sSettings.CritSecCRC == SETTINGS_GetCritSecCRC()) {
  20968. 8028f1e: 4d16 ldr r5, [pc, #88] ; (8028f78 <SYS_SetDefault+0x60>)
  20969. 8028f20: f8d5 611c ldr.w r6, [r5, #284] ; 0x11c
  20970. 8028f24: f7ff feea bl 8028cfc <SETTINGS_GetCritSecCRC>
  20971. 8028f28: 4286 cmp r6, r0
  20972. 8028f2a: d105 bne.n 8028f38 <SYS_SetDefault+0x20>
  20973. if (SYS_BackupInfo(sSettings.sInfo.mac, sSettings.sInfo.serialNumber)) {
  20974. 8028f2c: f105 008c add.w r0, r5, #140 ; 0x8c
  20975. 8028f30: f105 019e add.w r1, r5, #158 ; 0x9e
  20976. 8028f34: f7ff ffc0 bl 8028eb8 <SYS_BackupInfo>
  20977. }
  20978. }
  20979. /* Try to restore device MAC and serial.
  20980. * If not, store defaults */
  20981. if (!SYS_RestoreInfo(settings)) {
  20982. 8028f38: 4620 mov r0, r4
  20983. 8028f3a: f7ff ffd3 bl 8028ee4 <SYS_RestoreInfo>
  20984. 8028f3e: b950 cbnz r0, 8028f56 <SYS_SetDefault+0x3e>
  20985. snprintf(settings->mac, MAC_LEN, SYS_MAC);
  20986. 8028f40: 2112 movs r1, #18
  20987. 8028f42: 4a0e ldr r2, [pc, #56] ; (8028f7c <SYS_SetDefault+0x64>)
  20988. 8028f44: 4620 mov r0, r4
  20989. 8028f46: f7fe feb1 bl 8027cac <tfp_snprintf>
  20990. snprintf(settings->serial, SER_LEN, SYS_SERIAL);
  20991. 8028f4a: f104 0012 add.w r0, r4, #18
  20992. 8028f4e: 2110 movs r1, #16
  20993. 8028f50: 4a0b ldr r2, [pc, #44] ; (8028f80 <SYS_SetDefault+0x68>)
  20994. 8028f52: f7fe feab bl 8027cac <tfp_snprintf>
  20995. else {
  20996. DBG printf("Sys info restored!\r\n");
  20997. }
  20998. #endif
  20999. snprintf(settings->customer, CUST_LEN, SYS_CUSTOMER);
  21000. 8028f56: 2110 movs r1, #16
  21001. 8028f58: f104 0022 add.w r0, r4, #34 ; 0x22
  21002. 8028f5c: 4a09 ldr r2, [pc, #36] ; (8028f84 <SYS_SetDefault+0x6c>)
  21003. 8028f5e: f7fe fea5 bl 8027cac <tfp_snprintf>
  21004. snprintf(settings->proddate, PROD_LEN, "00.00.00");
  21005. 8028f62: f104 0032 add.w r0, r4, #50 ; 0x32
  21006. 8028f66: 2114 movs r1, #20
  21007. 8028f68: 4a07 ldr r2, [pc, #28] ; (8028f88 <SYS_SetDefault+0x70>)
  21008. 8028f6a: f7fe fe9f bl 8027cac <tfp_snprintf>
  21009. settings->controlword = SETTINGS_CONTROL_WORD;
  21010. 8028f6e: 4b07 ldr r3, [pc, #28] ; (8028f8c <SYS_SetDefault+0x74>)
  21011. return true;
  21012. 8028f70: 2001 movs r0, #1
  21013. }
  21014. #endif
  21015. snprintf(settings->customer, CUST_LEN, SYS_CUSTOMER);
  21016. snprintf(settings->proddate, PROD_LEN, "00.00.00");
  21017. settings->controlword = SETTINGS_CONTROL_WORD;
  21018. 8028f72: 64a3 str r3, [r4, #72] ; 0x48
  21019. return true;
  21020. 8028f74: bd70 pop {r4, r5, r6, pc}
  21021. }
  21022. 8028f76: bd70 pop {r4, r5, r6, pc}
  21023. 8028f78: 2000d414 .word 0x2000d414
  21024. 8028f7c: 08039228 .word 0x08039228
  21025. 8028f80: 0803923a .word 0x0803923a
  21026. 8028f84: 08039280 .word 0x08039280
  21027. 8028f88: 08039286 .word 0x08039286
  21028. 8028f8c: 075bcd15 .word 0x075bcd15
  21029. 08028f90 <SYS_GetCRC>:
  21030. /**
  21031. * @brief
  21032. * @retval
  21033. */
  21034. uint32_t SYS_GetCRC(SYS_t *settings)
  21035. {
  21036. 8028f90: b510 push {r4, lr}
  21037. 8028f92: 4604 mov r4, r0
  21038. CRC_ResetDR();
  21039. 8028f94: f7fc fb4e bl 8025634 <CRC_ResetDR>
  21040. return CRC_CalcBlockCRC((uint32_t *)settings, sizeof(*settings)/4 - 1);
  21041. 8028f98: 4620 mov r0, r4
  21042. 8028f9a: 2113 movs r1, #19
  21043. }
  21044. 8028f9c: e8bd 4010 ldmia.w sp!, {r4, lr}
  21045. * @retval
  21046. */
  21047. uint32_t SYS_GetCRC(SYS_t *settings)
  21048. {
  21049. CRC_ResetDR();
  21050. return CRC_CalcBlockCRC((uint32_t *)settings, sizeof(*settings)/4 - 1);
  21051. 8028fa0: f7fc bb4e b.w 8025640 <CRC_CalcBlockCRC>
  21052. 08028fa4 <SYS_Save>:
  21053. /**
  21054. * @brief Запись структуры настроек во flash
  21055. */
  21056. bool SYS_Save(SYS_t *settings)
  21057. {
  21058. 8028fa4: b510 push {r4, lr}
  21059. uint32_t crc_user = 0;
  21060. if (!settings)
  21061. 8028fa6: 4604 mov r4, r0
  21062. 8028fa8: b140 cbz r0, 8028fbc <SYS_Save+0x18>
  21063. return false;
  21064. crc_user = SYS_GetCRC(settings);
  21065. 8028faa: f7ff fff1 bl 8028f90 <SYS_GetCRC>
  21066. SYS_WriteToFlash((uint8_t*)settings, sizeof(*settings), crc_user);
  21067. 8028fae: 2150 movs r1, #80 ; 0x50
  21068. uint32_t crc_user = 0;
  21069. if (!settings)
  21070. return false;
  21071. crc_user = SYS_GetCRC(settings);
  21072. 8028fb0: 4602 mov r2, r0
  21073. SYS_WriteToFlash((uint8_t*)settings, sizeof(*settings), crc_user);
  21074. 8028fb2: 4620 mov r0, r4
  21075. 8028fb4: f000 f834 bl 8029020 <SYS_WriteToFlash>
  21076. return true;
  21077. 8028fb8: 2001 movs r0, #1
  21078. 8028fba: bd10 pop {r4, pc}
  21079. }
  21080. 8028fbc: bd10 pop {r4, pc}
  21081. 8028fbe: 0000 movs r0, r0
  21082. 08028fc0 <SYS_Load>:
  21083. /**
  21084. * @brief Загрузка структуры системных настроек из flash
  21085. */
  21086. bool SYS_Load(SYS_t *settings)
  21087. {
  21088. 8028fc0: b538 push {r3, r4, r5, lr}
  21089. uint32_t loadCRC; // CRC из flash
  21090. uint32_t newCRC; // CRC загруженной структуры настроек
  21091. bool need_default = false;
  21092. if (!settings)
  21093. 8028fc2: 4604 mov r4, r0
  21094. 8028fc4: b178 cbz r0, 8028fe6 <SYS_Load+0x26>
  21095. return false;
  21096. SYS_ReadFromFlash((uint8_t*)settings, sizeof(*settings), SYS_SECTOR);
  21097. 8028fc6: 2150 movs r1, #80 ; 0x50
  21098. 8028fc8: 4a0b ldr r2, [pc, #44] ; (8028ff8 <SYS_Load+0x38>)
  21099. 8028fca: f000 f81b bl 8029004 <SYS_ReadFromFlash>
  21100. /* Считываем CRC из флеш памяти */
  21101. loadCRC = (*(uint32_t*)SYS_CRC_ADDRESS);
  21102. 8028fce: 4b0b ldr r3, [pc, #44] ; (8028ffc <SYS_Load+0x3c>)
  21103. /* Рассчитываем CRC для структуры настроек */
  21104. newCRC = SYS_GetCRC(settings);
  21105. 8028fd0: 4620 mov r0, r4
  21106. return false;
  21107. SYS_ReadFromFlash((uint8_t*)settings, sizeof(*settings), SYS_SECTOR);
  21108. /* Считываем CRC из флеш памяти */
  21109. loadCRC = (*(uint32_t*)SYS_CRC_ADDRESS);
  21110. 8028fd2: 681d ldr r5, [r3, #0]
  21111. /* Рассчитываем CRC для структуры настроек */
  21112. newCRC = SYS_GetCRC(settings);
  21113. 8028fd4: f7ff ffdc bl 8028f90 <SYS_GetCRC>
  21114. /* Если CRC не совпадают нужно прошивать дефолтные настройки */
  21115. if (loadCRC != newCRC)
  21116. 8028fd8: 4285 cmp r5, r0
  21117. 8028fda: d105 bne.n 8028fe8 <SYS_Load+0x28>
  21118. DBG printf("Bad system sector CRC. Factory defaults restored.\r\n");
  21119. need_default = true;
  21120. }
  21121. /* CRC совпала, проверяем контрольное слово если слово не совпадает
  21122. то это значит, что поплыла структура нстроек, прошиваем дефолт */
  21123. else if (settings->controlword != SETTINGS_CONTROL_WORD)
  21124. 8028fdc: 6ca3 ldr r3, [r4, #72] ; 0x48
  21125. 8028fde: 4a08 ldr r2, [pc, #32] ; (8029000 <SYS_Load+0x40>)
  21126. 8028fe0: 4293 cmp r3, r2
  21127. 8028fe2: d101 bne.n 8028fe8 <SYS_Load+0x28>
  21128. 8028fe4: e006 b.n 8028ff4 <SYS_Load+0x34>
  21129. 8028fe6: bd38 pop {r3, r4, r5, pc}
  21130. need_default = true;
  21131. }
  21132. /* Прошиваем дефолтные настройки если нужно */
  21133. if (need_default) {
  21134. SYS_SetDefault(settings);
  21135. 8028fe8: 4620 mov r0, r4
  21136. 8028fea: f7ff ff95 bl 8028f18 <SYS_SetDefault>
  21137. SYS_Save(settings);
  21138. 8028fee: 4620 mov r0, r4
  21139. 8028ff0: f7ff ffd8 bl 8028fa4 <SYS_Save>
  21140. }
  21141. return true;
  21142. 8028ff4: 2001 movs r0, #1
  21143. }
  21144. 8028ff6: bd38 pop {r3, r4, r5, pc}
  21145. 8028ff8: 08008000 .word 0x08008000
  21146. 8028ffc: 0800bf9c .word 0x0800bf9c
  21147. 8029000: 075bcd15 .word 0x075bcd15
  21148. 08029004 <SYS_ReadFromFlash>:
  21149. #endif
  21150. /**
  21151. * @brief
  21152. */
  21153. void SYS_ReadFromFlash(uint8_t *data, uint32_t size, uint32_t baseAddress)
  21154. 8029004: 1851 adds r1, r2, r1
  21155. 8029006: 1a80 subs r0, r0, r2
  21156. {
  21157. for (uint32_t i = 0; i < size; i++)
  21158. 8029008: e002 b.n 8029010 <SYS_ReadFromFlash+0xc>
  21159. *data++ = (*(uint32_t*)baseAddress++);
  21160. 802900a: 6813 ldr r3, [r2, #0]
  21161. 802900c: 5483 strb r3, [r0, r2]
  21162. 802900e: 3201 adds r2, #1
  21163. /**
  21164. * @brief
  21165. */
  21166. void SYS_ReadFromFlash(uint8_t *data, uint32_t size, uint32_t baseAddress)
  21167. {
  21168. for (uint32_t i = 0; i < size; i++)
  21169. 8029010: 428a cmp r2, r1
  21170. 8029012: d1fa bne.n 802900a <SYS_ReadFromFlash+0x6>
  21171. *data++ = (*(uint32_t*)baseAddress++);
  21172. }
  21173. 8029014: 4770 bx lr
  21174. 08029016 <SYS_EraseFlashSector>:
  21175. */
  21176. void SYS_EraseFlashSector(void)
  21177. {
  21178. FLASH_Status status;
  21179. if ((status = FLASH_EraseSector(FLASH_Sector_2, VoltageRange_3)) != FLASH_COMPLETE) {
  21180. 8029016: 2010 movs r0, #16
  21181. 8029018: 2102 movs r1, #2
  21182. 802901a: f7fc bba1 b.w 8025760 <FLASH_EraseSector>
  21183. 802901e: 0000 movs r0, r0
  21184. 08029020 <SYS_WriteToFlash>:
  21185. /**
  21186. * @brief
  21187. */
  21188. void SYS_WriteToFlash(uint8_t *data, uint32_t size, uint32_t crc)
  21189. {
  21190. 8029020: e92d 4ff8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, lr}
  21191. uint32_t baseAddress = SYS_SECTOR;
  21192. 8029024: 4c1b ldr r4, [pc, #108] ; (8029094 <SYS_WriteToFlash+0x74>)
  21193. /**
  21194. * @brief
  21195. */
  21196. void SYS_WriteToFlash(uint8_t *data, uint32_t size, uint32_t crc)
  21197. {
  21198. 8029026: 468a mov sl, r1
  21199. 8029028: 4690 mov r8, r2
  21200. uint32_t baseAddress = SYS_SECTOR;
  21201. uint32_t checkCrc = 0;
  21202. bool fAlarm = 0;
  21203. FLASH_Status status;
  21204. uint8_t *pdata = data;
  21205. 802902a: 4606 mov r6, r0
  21206. 802902c: 2703 movs r7, #3
  21207. for (uint8_t i = 0; i < 3; i++)
  21208. {
  21209. fAlarm = 0;
  21210. FLASH_Unlock();
  21211. 802902e: f7fc fb17 bl 8025660 <FLASH_Unlock>
  21212. 8029032: 4635 mov r5, r6
  21213. SYS_EraseFlashSector();
  21214. 8029034: f7ff ffef bl 8029016 <SYS_EraseFlashSector>
  21215. }
  21216. /**
  21217. * @brief
  21218. */
  21219. void SYS_WriteToFlash(uint8_t *data, uint32_t size, uint32_t crc)
  21220. 8029038: eb04 0b0a add.w fp, r4, sl
  21221. fAlarm = 0;
  21222. FLASH_Unlock();
  21223. SYS_EraseFlashSector();
  21224. for (uint32_t i = 0; i < size; i++)
  21225. 802903c: e00a b.n 8029054 <SYS_WriteToFlash+0x34>
  21226. if ((status = FLASH_ProgramByte(baseAddress++, *pdata++)) != FLASH_COMPLETE) {
  21227. 802903e: f815 1b01 ldrb.w r1, [r5], #1
  21228. 8029042: 4620 mov r0, r4
  21229. 8029044: f7fc fb52 bl 80256ec <FLASH_ProgramByte>
  21230. 8029048: f104 0901 add.w r9, r4, #1
  21231. 802904c: 2808 cmp r0, #8
  21232. 802904e: 462e mov r6, r5
  21233. 8029050: 464c mov r4, r9
  21234. 8029052: d102 bne.n 802905a <SYS_WriteToFlash+0x3a>
  21235. fAlarm = 0;
  21236. FLASH_Unlock();
  21237. SYS_EraseFlashSector();
  21238. for (uint32_t i = 0; i < size; i++)
  21239. 8029054: 455c cmp r4, fp
  21240. 8029056: 462e mov r6, r5
  21241. 8029058: d1f1 bne.n 802903e <SYS_WriteToFlash+0x1e>
  21242. if ((status = FLASH_ProgramByte(baseAddress++, *pdata++)) != FLASH_COMPLETE) {
  21243. DBG printf("FLASH_ProgramByte error: %d\r\n", status);
  21244. break;
  21245. }
  21246. if ((status = FLASH_ProgramWord((uint32_t)SYS_CRC_ADDRESS, crc)) != FLASH_COMPLETE) {
  21247. 802905a: 4641 mov r1, r8
  21248. 802905c: 480e ldr r0, [pc, #56] ; (8029098 <SYS_WriteToFlash+0x78>)
  21249. 802905e: f7fc fb61 bl 8025724 <FLASH_ProgramWord>
  21250. DBG printf("FLASH_ProgramWord error: %d\r\n", status);
  21251. }
  21252. FLASH_Lock();
  21253. 8029062: f7fc fb0b bl 802567c <FLASH_Lock>
  21254. // /* Считываем что записали */
  21255. // SYS_ReadFromFlash((uint8_t*)data, size, SYS_SECTOR);
  21256. //
  21257. // checkCrc = SYS_GetCRC(data);
  21258. checkCrc = SYS_GetCRC((SYS_t *)SYS_SECTOR);
  21259. 8029066: 480b ldr r0, [pc, #44] ; (8029094 <SYS_WriteToFlash+0x74>)
  21260. 8029068: f7ff ff92 bl 8028f90 <SYS_GetCRC>
  21261. /* Проверяем CRC того что было записано */
  21262. if (checkCrc == crc) {
  21263. 802906c: 4540 cmp r0, r8
  21264. 802906e: d00f beq.n 8029090 <SYS_WriteToFlash+0x70>
  21265. 8029070: 3f01 subs r7, #1
  21266. uint32_t checkCrc = 0;
  21267. bool fAlarm = 0;
  21268. FLASH_Status status;
  21269. uint8_t *pdata = data;
  21270. for (uint8_t i = 0; i < 3; i++)
  21271. 8029072: f017 07ff ands.w r7, r7, #255 ; 0xff
  21272. 8029076: d1da bne.n 802902e <SYS_WriteToFlash+0xe>
  21273. This function acts as a special kind of Data Memory Barrier.
  21274. It completes when all explicit memory accesses before this instruction complete.
  21275. */
  21276. __attribute__( ( always_inline ) ) __STATIC_INLINE void __DSB(void)
  21277. {
  21278. __ASM volatile ("dsb");
  21279. 8029078: f3bf 8f4f dsb sy
  21280. //static inline void NVIC_SystemReset(void)
  21281. {
  21282. __DSB(); /* Ensure all outstanding memory accesses included
  21283. buffered write are completed before reset */
  21284. SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) |
  21285. (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |
  21286. 802907c: 4a07 ldr r2, [pc, #28] ; (802909c <SYS_WriteToFlash+0x7c>)
  21287. 802907e: 4b08 ldr r3, [pc, #32] ; (80290a0 <SYS_WriteToFlash+0x80>)
  21288. 8029080: 68d1 ldr r1, [r2, #12]
  21289. 8029082: f401 61e0 and.w r1, r1, #1792 ; 0x700
  21290. 8029086: 430b orrs r3, r1
  21291. __STATIC_INLINE void NVIC_SystemReset(void)
  21292. //static inline void NVIC_SystemReset(void)
  21293. {
  21294. __DSB(); /* Ensure all outstanding memory accesses included
  21295. buffered write are completed before reset */
  21296. SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) |
  21297. 8029088: 60d3 str r3, [r2, #12]
  21298. 802908a: f3bf 8f4f dsb sy
  21299. 802908e: e7fe b.n 802908e <SYS_WriteToFlash+0x6e>
  21300. 8029090: e8bd 8ff8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc}
  21301. 8029094: 08008000 .word 0x08008000
  21302. 8029098: 0800bf9c .word 0x0800bf9c
  21303. 802909c: e000ed00 .word 0xe000ed00
  21304. 80290a0: 05fa0004 .word 0x05fa0004
  21305. 080290a4 <WDG_Init>:
  21306. /**
  21307. * @brief
  21308. * @retval
  21309. */
  21310. void WDG_Init(void)
  21311. {
  21312. 80290a4: b530 push {r4, r5, lr}
  21313. // GPIO_InitTypeDef GPIO_InitStructure;
  21314. NVIC_InitTypeDef NVIC_InitStructure;
  21315. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  21316. // RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
  21317. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM13, ENABLE);
  21318. 80290a6: 2101 movs r1, #1
  21319. /**
  21320. * @brief
  21321. * @retval
  21322. */
  21323. void WDG_Init(void)
  21324. {
  21325. 80290a8: b085 sub sp, #20
  21326. // GPIO_InitTypeDef GPIO_InitStructure;
  21327. NVIC_InitTypeDef NVIC_InitStructure;
  21328. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  21329. // RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
  21330. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM13, ENABLE);
  21331. 80290aa: 2080 movs r0, #128 ; 0x80
  21332. 80290ac: f7fc fcf2 bl 8025a94 <RCC_APB1PeriphClockCmd>
  21333. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  21334. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  21335. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  21336. GPIO_Init(GPIOE, &GPIO_InitStructure);*/
  21337. NVIC_InitStructure.NVIC_IRQChannel = TIM8_UP_TIM13_IRQn;
  21338. 80290b0: 232c movs r3, #44 ; 0x2c
  21339. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x6;
  21340. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0;
  21341. 80290b2: 2400 movs r4, #0
  21342. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  21343. 80290b4: 2501 movs r5, #1
  21344. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  21345. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  21346. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  21347. GPIO_Init(GPIOE, &GPIO_InitStructure);*/
  21348. NVIC_InitStructure.NVIC_IRQChannel = TIM8_UP_TIM13_IRQn;
  21349. 80290b6: f88d 3000 strb.w r3, [sp]
  21350. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x6;
  21351. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0;
  21352. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  21353. NVIC_Init(&NVIC_InitStructure);
  21354. 80290ba: 4668 mov r0, sp
  21355. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  21356. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  21357. GPIO_Init(GPIOE, &GPIO_InitStructure);*/
  21358. NVIC_InitStructure.NVIC_IRQChannel = TIM8_UP_TIM13_IRQn;
  21359. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x6;
  21360. 80290bc: 2306 movs r3, #6
  21361. 80290be: f88d 3001 strb.w r3, [sp, #1]
  21362. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0;
  21363. 80290c2: f88d 4002 strb.w r4, [sp, #2]
  21364. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  21365. 80290c6: f88d 5003 strb.w r5, [sp, #3]
  21366. NVIC_Init(&NVIC_InitStructure);
  21367. 80290ca: f7fc fa75 bl 80255b8 <NVIC_Init>
  21368. __STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
  21369. {
  21370. if(IRQn < 0) {
  21371. SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for Cortex-M System Interrupts */
  21372. else {
  21373. NVIC->IP[(uint32_t)(IRQn)] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for device specific Interrupts */
  21374. 80290ce: 4b0f ldr r3, [pc, #60] ; (802910c <WDG_Init+0x68>)
  21375. 80290d0: 2220 movs r2, #32
  21376. 80290d2: f883 232c strb.w r2, [r3, #812] ; 0x32c
  21377. /* APB1 Timer clock is 60Mhz, configure timer clock to 10khz (1 update event per 100 us) */
  21378. TIM_TimeBaseStructure.TIM_Prescaler = 6000 - 1;
  21379. /* Configure timer period to 100ms */
  21380. TIM_TimeBaseStructure.TIM_Period = 1000;
  21381. TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  21382. 80290d6: f8ad 400c strh.w r4, [sp, #12]
  21383. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  21384. 80290da: f8ad 4006 strh.w r4, [sp, #6]
  21385. TIM_TimeBaseInit(TIM13, &TIM_TimeBaseStructure);
  21386. 80290de: 4c0c ldr r4, [pc, #48] ; (8029110 <WDG_Init+0x6c>)
  21387. NVIC_Init(&NVIC_InitStructure);
  21388. NVIC_SetPriority(TIM8_UP_TIM13_IRQn, 2);
  21389. /* APB1 Timer clock is 60Mhz, configure timer clock to 10khz (1 update event per 100 us) */
  21390. TIM_TimeBaseStructure.TIM_Prescaler = 6000 - 1;
  21391. 80290e0: f241 736f movw r3, #5999 ; 0x176f
  21392. 80290e4: f8ad 3004 strh.w r3, [sp, #4]
  21393. /* Configure timer period to 100ms */
  21394. TIM_TimeBaseStructure.TIM_Period = 1000;
  21395. TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  21396. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  21397. TIM_TimeBaseInit(TIM13, &TIM_TimeBaseStructure);
  21398. 80290e8: 4620 mov r0, r4
  21399. NVIC_SetPriority(TIM8_UP_TIM13_IRQn, 2);
  21400. /* APB1 Timer clock is 60Mhz, configure timer clock to 10khz (1 update event per 100 us) */
  21401. TIM_TimeBaseStructure.TIM_Prescaler = 6000 - 1;
  21402. /* Configure timer period to 100ms */
  21403. TIM_TimeBaseStructure.TIM_Period = 1000;
  21404. 80290ea: f44f 737a mov.w r3, #1000 ; 0x3e8
  21405. TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  21406. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  21407. TIM_TimeBaseInit(TIM13, &TIM_TimeBaseStructure);
  21408. 80290ee: a901 add r1, sp, #4
  21409. NVIC_SetPriority(TIM8_UP_TIM13_IRQn, 2);
  21410. /* APB1 Timer clock is 60Mhz, configure timer clock to 10khz (1 update event per 100 us) */
  21411. TIM_TimeBaseStructure.TIM_Prescaler = 6000 - 1;
  21412. /* Configure timer period to 100ms */
  21413. TIM_TimeBaseStructure.TIM_Period = 1000;
  21414. 80290f0: 9302 str r3, [sp, #8]
  21415. TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  21416. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  21417. TIM_TimeBaseInit(TIM13, &TIM_TimeBaseStructure);
  21418. 80290f2: f7fc fed5 bl 8025ea0 <TIM_TimeBaseInit>
  21419. TIM_Cmd(TIM13, ENABLE);
  21420. 80290f6: 4620 mov r0, r4
  21421. 80290f8: 4629 mov r1, r5
  21422. 80290fa: f7fc ff0f bl 8025f1c <TIM_Cmd>
  21423. TIM_ITConfig(TIM13, TIM_IT_Update, ENABLE);
  21424. 80290fe: 4620 mov r0, r4
  21425. 8029100: 4629 mov r1, r5
  21426. 8029102: 462a mov r2, r5
  21427. 8029104: f7fc ff16 bl 8025f34 <TIM_ITConfig>
  21428. }
  21429. 8029108: b005 add sp, #20
  21430. 802910a: bd30 pop {r4, r5, pc}
  21431. 802910c: e000e100 .word 0xe000e100
  21432. 8029110: 40001c00 .word 0x40001c00
  21433. 08029114 <TIM8_UP_TIM13_IRQHandler>:
  21434. /**
  21435. * @brief Дергаем пином (сброс внешнего WDT)
  21436. * @retval
  21437. */
  21438. void TIM8_UP_TIM13_IRQHandler(void)
  21439. {
  21440. 8029114: b508 push {r3, lr}
  21441. TIM_ClearITPendingBit(TIM13, TIM_IT_Update);
  21442. 8029116: 4804 ldr r0, [pc, #16] ; (8029128 <TIM8_UP_TIM13_IRQHandler+0x14>)
  21443. 8029118: 2101 movs r1, #1
  21444. 802911a: f7fc ff14 bl 8025f46 <TIM_ClearITPendingBit>
  21445. gpio_invert_output(_WDG);
  21446. 802911e: 2012 movs r0, #18
  21447. }
  21448. 8029120: e8bd 4008 ldmia.w sp!, {r3, lr}
  21449. * @retval
  21450. */
  21451. void TIM8_UP_TIM13_IRQHandler(void)
  21452. {
  21453. TIM_ClearITPendingBit(TIM13, TIM_IT_Update);
  21454. gpio_invert_output(_WDG);
  21455. 8029124: f7fd b976 b.w 8026414 <gpio_invert_output>
  21456. 8029128: 40001c00 .word 0x40001c00
  21457. 0802912c <LED_On>:
  21458. /**
  21459. * @brief
  21460. */
  21461. void LED_On(gpio_t pin)
  21462. {
  21463. gpio_set(pin, 1);
  21464. 802912c: 2101 movs r1, #1
  21465. 802912e: f7fd b8dd b.w 80262ec <gpio_set>
  21466. 08029132 <LED_Off>:
  21467. /**
  21468. * @brief
  21469. */
  21470. void LED_Off(gpio_t pin)
  21471. {
  21472. gpio_set(pin, 0);
  21473. 8029132: 2100 movs r1, #0
  21474. 8029134: f7fd b8da b.w 80262ec <gpio_set>
  21475. 08029138 <LED_Init>:
  21476. /**
  21477. * @brief
  21478. * @retval
  21479. */
  21480. void LED_Init(void)
  21481. {
  21482. 8029138: b508 push {r3, lr}
  21483. LED_Off(LED_INIT_R);
  21484. 802913a: 200b movs r0, #11
  21485. 802913c: f7ff fff9 bl 8029132 <LED_Off>
  21486. LED_Off(LED_INIT_G);
  21487. 8029140: 200c movs r0, #12
  21488. 8029142: f7ff fff6 bl 8029132 <LED_Off>
  21489. LED_Off(LED_MAJOR_R);
  21490. 8029146: 200d movs r0, #13
  21491. 8029148: f7ff fff3 bl 8029132 <LED_Off>
  21492. LED_Off(LED_MINOR_G);
  21493. 802914c: 200e movs r0, #14
  21494. 802914e: f7ff fff0 bl 8029132 <LED_Off>
  21495. LED_Off(LED_MINOR_R);
  21496. 8029152: 200f movs r0, #15
  21497. }
  21498. 8029154: e8bd 4008 ldmia.w sp!, {r3, lr}
  21499. {
  21500. LED_Off(LED_INIT_R);
  21501. LED_Off(LED_INIT_G);
  21502. LED_Off(LED_MAJOR_R);
  21503. LED_Off(LED_MINOR_G);
  21504. LED_Off(LED_MINOR_R);
  21505. 8029158: f7ff bfeb b.w 8029132 <LED_Off>
  21506. 0802915c <vTaskLedBlink>:
  21507. /**
  21508. * @brief Задача простой мигалки
  21509. */
  21510. void vTaskLedBlink(void *arg)
  21511. {
  21512. 802915c: b570 push {r4, r5, r6, lr}
  21513. uint8_t start_status = 0;
  21514. uint8_t start_status_old = 0;
  21515. start_status = (UPS.Status >> 7) & 0x01;
  21516. for (;;)
  21517. {
  21518. start_status = (UPS.Status >> 7) & 0x01;
  21519. 802915e: 4e0e ldr r6, [pc, #56] ; (8029198 <vTaskLedBlink+0x3c>)
  21520. LED_Off(LED_INIT_R);
  21521. LED_Toggle(LED_INIT_G);
  21522. }
  21523. start_status_old = start_status;
  21524. vTaskDelay(statusLedFreq);
  21525. 8029160: 4d0e ldr r5, [pc, #56] ; (802919c <vTaskLedBlink+0x40>)
  21526. * @brief Задача простой мигалки
  21527. */
  21528. void vTaskLedBlink(void *arg)
  21529. {
  21530. uint8_t start_status = 0;
  21531. uint8_t start_status_old = 0;
  21532. 8029162: 2300 movs r3, #0
  21533. start_status = (UPS.Status >> 7) & 0x01;
  21534. for (;;)
  21535. {
  21536. start_status = (UPS.Status >> 7) & 0x01;
  21537. 8029164: 7cf4 ldrb r4, [r6, #19]
  21538. /* Просто отражает состояние контроллера - "живой" */
  21539. if((UPS.Status >> 7) & 0x01){
  21540. 8029166: 09e4 lsrs r4, r4, #7
  21541. 8029168: d009 beq.n 802917e <vTaskLedBlink+0x22>
  21542. if(start_status_old != start_status)
  21543. 802916a: 42a3 cmp r3, r4
  21544. 802916c: d002 beq.n 8029174 <vTaskLedBlink+0x18>
  21545. LED_Off(LED_INIT_G);
  21546. 802916e: 200c movs r0, #12
  21547. 8029170: f7ff ffdf bl 8029132 <LED_Off>
  21548. /**
  21549. * @brief Изменить состояние LED
  21550. */
  21551. void LED_Toggle(gpio_t pin)
  21552. {
  21553. gpio_invert_output(pin);
  21554. 8029174: 200c movs r0, #12
  21555. 8029176: f7fd f94d bl 8026414 <gpio_invert_output>
  21556. 802917a: 200b movs r0, #11
  21557. 802917c: e005 b.n 802918a <vTaskLedBlink+0x2e>
  21558. LED_Off(LED_INIT_G);
  21559. LED_Toggle(LED_INIT_G);
  21560. LED_Toggle(LED_INIT_R);
  21561. }
  21562. else{
  21563. if(start_status_old != start_status)
  21564. 802917e: 42a3 cmp r3, r4
  21565. 8029180: d002 beq.n 8029188 <vTaskLedBlink+0x2c>
  21566. LED_Off(LED_INIT_R);
  21567. 8029182: 200b movs r0, #11
  21568. 8029184: f7ff ffd5 bl 8029132 <LED_Off>
  21569. /**
  21570. * @brief Изменить состояние LED
  21571. */
  21572. void LED_Toggle(gpio_t pin)
  21573. {
  21574. gpio_invert_output(pin);
  21575. 8029188: 200c movs r0, #12
  21576. 802918a: f7fd f943 bl 8026414 <gpio_invert_output>
  21577. LED_Off(LED_INIT_R);
  21578. LED_Toggle(LED_INIT_G);
  21579. }
  21580. start_status_old = start_status;
  21581. vTaskDelay(statusLedFreq);
  21582. 802918e: 8828 ldrh r0, [r5, #0]
  21583. 8029190: f002 fc8e bl 802bab0 <vTaskDelay>
  21584. uint8_t start_status = 0;
  21585. uint8_t start_status_old = 0;
  21586. start_status = (UPS.Status >> 7) & 0x01;
  21587. for (;;)
  21588. {
  21589. start_status = (UPS.Status >> 7) & 0x01;
  21590. 8029194: 4623 mov r3, r4
  21591. LED_Toggle(LED_INIT_G);
  21592. }
  21593. start_status_old = start_status;
  21594. vTaskDelay(statusLedFreq);
  21595. }
  21596. 8029196: e7e5 b.n 8029164 <vTaskLedBlink+0x8>
  21597. 8029198: 2000d7d8 .word 0x2000d7d8
  21598. 802919c: 20000670 .word 0x20000670
  21599. 080291a0 <LED_Toggle>:
  21600. /**
  21601. * @brief Изменить состояние LED
  21602. */
  21603. void LED_Toggle(gpio_t pin)
  21604. {
  21605. gpio_invert_output(pin);
  21606. 80291a0: f7fd b938 b.w 8026414 <gpio_invert_output>
  21607. 080291a4 <LED_SetStatusLedFreq>:
  21608. /**
  21609. * @brief
  21610. */
  21611. void LED_SetStatusLedFreq(uint16_t freq)
  21612. {
  21613. statusLedFreq = freq;
  21614. 80291a4: 4b01 ldr r3, [pc, #4] ; (80291ac <LED_SetStatusLedFreq+0x8>)
  21615. 80291a6: 8018 strh r0, [r3, #0]
  21616. 80291a8: 4770 bx lr
  21617. 80291aa: bf00 nop
  21618. 80291ac: 20000670 .word 0x20000670
  21619. 080291b0 <BUTTON_VoidHandler>:
  21620. /**
  21621. * @brief Заглушка
  21622. */
  21623. void BUTTON_VoidHandler(void)
  21624. {
  21625. 80291b0: 4770 bx lr
  21626. 80291b2: 0000 movs r0, r0
  21627. 080291b4 <BUTTON_DEF_DownHandler>:
  21628. /**
  21629. * @brief Хендлер кнопки DEFAULT. Сброс всех настроек, сохранение и перезагрузка
  21630. */
  21631. void BUTTON_DEF_DownHandler(void)
  21632. {
  21633. 80291b4: b508 push {r3, lr}
  21634. //taskENTER_CRITICAL();
  21635. SNMP_SendUserTrap(DEVICE_RESTORED);
  21636. 80291b6: 2003 movs r0, #3
  21637. 80291b8: f00e fd92 bl 8037ce0 <SNMP_SendUserTrap>
  21638. log_event_data(LOG_SYSTEM_DEFCONFIG, "Администратор");
  21639. 80291bc: 4909 ldr r1, [pc, #36] ; (80291e4 <BUTTON_DEF_DownHandler+0x30>)
  21640. 80291be: 2001 movs r0, #1
  21641. 80291c0: f001 f850 bl 802a264 <log_event_data>
  21642. vTaskDelay(500);
  21643. 80291c4: f44f 70fa mov.w r0, #500 ; 0x1f4
  21644. 80291c8: f002 fc72 bl 802bab0 <vTaskDelay>
  21645. SETTINGS_SetDefaultDebug();
  21646. 80291cc: f7ff fdb2 bl 8028d34 <SETTINGS_SetDefaultDebug>
  21647. SETTINGS_Save();
  21648. 80291d0: f7ff fda0 bl 8028d14 <SETTINGS_Save>
  21649. vTaskDelay(1010);
  21650. 80291d4: f240 30f2 movw r0, #1010 ; 0x3f2
  21651. 80291d8: f002 fc6a bl 802bab0 <vTaskDelay>
  21652. Reboot();
  21653. //taskEXIT_CRITICAL();
  21654. }
  21655. 80291dc: e8bd 4008 ldmia.w sp!, {r3, lr}
  21656. vTaskDelay(500);
  21657. SETTINGS_SetDefaultDebug();
  21658. SETTINGS_Save();
  21659. vTaskDelay(1010);
  21660. Reboot();
  21661. 80291e0: f000 bb46 b.w 8029870 <Reboot>
  21662. 80291e4: 0803928f .word 0x0803928f
  21663. 080291e8 <BUTTON_GetState>:
  21664. /**
  21665. * @brief Возвращает сотояние ключа
  21666. */
  21667. BUTTON_STATE_t BUTTON_GetState(BUTTON_NO_FIX_t *button)
  21668. {
  21669. return (BUTTON_STATE_t)gpio_get(button->id_pin);
  21670. 80291e8: 7800 ldrb r0, [r0, #0]
  21671. 80291ea: f7fd b923 b.w 8026434 <gpio_get>
  21672. 80291ee: 0000 movs r0, r0
  21673. 080291f0 <BUTTON_Init>:
  21674. /**
  21675. * @brief
  21676. * @retval
  21677. */
  21678. void BUTTON_Init(void)
  21679. {
  21680. 80291f0: b510 push {r4, lr}
  21681. defButton.id_pin = KEY_DEF;
  21682. 80291f2: 4c09 ldr r4, [pc, #36] ; (8029218 <BUTTON_Init+0x28>)
  21683. 80291f4: 2311 movs r3, #17
  21684. 80291f6: 7023 strb r3, [r4, #0]
  21685. defButton.timeDelay = 5;
  21686. 80291f8: 2305 movs r3, #5
  21687. 80291fa: 8063 strh r3, [r4, #2]
  21688. defButton.pressHandler = BUTTON_VoidHandler;
  21689. 80291fc: 4b07 ldr r3, [pc, #28] ; (802921c <BUTTON_Init+0x2c>)
  21690. 80291fe: 60a3 str r3, [r4, #8]
  21691. defButton.unpressHandler = BUTTON_DEF_DownHandler;
  21692. 8029200: 4b07 ldr r3, [pc, #28] ; (8029220 <BUTTON_Init+0x30>)
  21693. defButton.counterActivation = 0;
  21694. defButton.timeActivation = 40;
  21695. 8029202: 2228 movs r2, #40 ; 0x28
  21696. void BUTTON_Init(void)
  21697. {
  21698. defButton.id_pin = KEY_DEF;
  21699. defButton.timeDelay = 5;
  21700. defButton.pressHandler = BUTTON_VoidHandler;
  21701. defButton.unpressHandler = BUTTON_DEF_DownHandler;
  21702. 8029204: 60e3 str r3, [r4, #12]
  21703. defButton.counterActivation = 0;
  21704. defButton.timeActivation = 40;
  21705. defButton.fActivation = false;
  21706. defButton.stateOld = BUTTON_GetState(&defButton);
  21707. 8029206: 4620 mov r0, r4
  21708. {
  21709. defButton.id_pin = KEY_DEF;
  21710. defButton.timeDelay = 5;
  21711. defButton.pressHandler = BUTTON_VoidHandler;
  21712. defButton.unpressHandler = BUTTON_DEF_DownHandler;
  21713. defButton.counterActivation = 0;
  21714. 8029208: 2300 movs r3, #0
  21715. 802920a: 6163 str r3, [r4, #20]
  21716. defButton.timeActivation = 40;
  21717. 802920c: 8322 strh r2, [r4, #24]
  21718. defButton.fActivation = false;
  21719. 802920e: 76a3 strb r3, [r4, #26]
  21720. defButton.stateOld = BUTTON_GetState(&defButton);
  21721. 8029210: f7ff ffea bl 80291e8 <BUTTON_GetState>
  21722. 8029214: 71a0 strb r0, [r4, #6]
  21723. 8029216: bd10 pop {r4, pc}
  21724. 8029218: 2000d7bc .word 0x2000d7bc
  21725. 802921c: 080291b1 .word 0x080291b1
  21726. 8029220: 080291b5 .word 0x080291b5
  21727. 08029224 <BUTTON_DellayHandler>:
  21728. время нажатия.
  21729. * @param *button: указатель на структуру типа BUTTON_NO_FIX
  21730. * @retval нет
  21731. */
  21732. void BUTTON_DellayHandler(BUTTON_NO_FIX_t *button)
  21733. {
  21734. 8029224: b510 push {r4, lr}
  21735. 8029226: 4604 mov r4, r0
  21736. /* Кнопка нажата. Ведем отсчет времени удержания */
  21737. if (gpio_get(button->id_pin) == 0) // определяем текущее (новое) состояние кнопки
  21738. 8029228: 7800 ldrb r0, [r0, #0]
  21739. 802922a: f7fd f903 bl 8026434 <gpio_get>
  21740. 802922e: 6963 ldr r3, [r4, #20]
  21741. 8029230: b950 cbnz r0, 8029248 <BUTTON_DellayHandler+0x24>
  21742. {
  21743. button->counterActivation++;
  21744. button->fActivation = false;
  21745. /* Кнопка нажата более необходимого времени - начинаем чаще мигать диодом */
  21746. if (button->counterActivation > button->timeActivation)
  21747. 8029232: 8b22 ldrh r2, [r4, #24]
  21748. {
  21749. /* Кнопка нажата. Ведем отсчет времени удержания */
  21750. if (gpio_get(button->id_pin) == 0) // определяем текущее (новое) состояние кнопки
  21751. {
  21752. button->counterActivation++;
  21753. button->fActivation = false;
  21754. 8029234: 76a0 strb r0, [r4, #26]
  21755. void BUTTON_DellayHandler(BUTTON_NO_FIX_t *button)
  21756. {
  21757. /* Кнопка нажата. Ведем отсчет времени удержания */
  21758. if (gpio_get(button->id_pin) == 0) // определяем текущее (новое) состояние кнопки
  21759. {
  21760. button->counterActivation++;
  21761. 8029236: 3301 adds r3, #1
  21762. button->fActivation = false;
  21763. /* Кнопка нажата более необходимого времени - начинаем чаще мигать диодом */
  21764. if (button->counterActivation > button->timeActivation)
  21765. 8029238: 4293 cmp r3, r2
  21766. void BUTTON_DellayHandler(BUTTON_NO_FIX_t *button)
  21767. {
  21768. /* Кнопка нажата. Ведем отсчет времени удержания */
  21769. if (gpio_get(button->id_pin) == 0) // определяем текущее (новое) состояние кнопки
  21770. {
  21771. button->counterActivation++;
  21772. 802923a: 6163 str r3, [r4, #20]
  21773. button->fActivation = false;
  21774. /* Кнопка нажата более необходимого времени - начинаем чаще мигать диодом */
  21775. if (button->counterActivation > button->timeActivation)
  21776. 802923c: d914 bls.n 8029268 <BUTTON_DellayHandler+0x44>
  21777. LED_SetStatusLedFreq(100);
  21778. 802923e: 2064 movs r0, #100 ; 0x64
  21779. }
  21780. else
  21781. button->counterActivation = 0;
  21782. }
  21783. }
  21784. 8029240: e8bd 4010 ldmia.w sp!, {r4, lr}
  21785. button->counterActivation++;
  21786. button->fActivation = false;
  21787. /* Кнопка нажата более необходимого времени - начинаем чаще мигать диодом */
  21788. if (button->counterActivation > button->timeActivation)
  21789. LED_SetStatusLedFreq(100);
  21790. 8029244: f7ff bfae b.w 80291a4 <LED_SetStatusLedFreq>
  21791. }
  21792. /* Кнопку отжата. Если до этого она была нажата нужное время - вызываем хендлер */
  21793. else
  21794. {
  21795. if ((button->counterActivation > button->timeActivation)
  21796. 8029248: 8b22 ldrh r2, [r4, #24]
  21797. 802924a: 4293 cmp r3, r2
  21798. 802924c: d90a bls.n 8029264 <BUTTON_DellayHandler+0x40>
  21799. && button->fActivation == false)
  21800. 802924e: 7ea3 ldrb r3, [r4, #26]
  21801. 8029250: b943 cbnz r3, 8029264 <BUTTON_DellayHandler+0x40>
  21802. {
  21803. button->fActivation = true;
  21804. 8029252: 2301 movs r3, #1
  21805. 8029254: 76a3 strb r3, [r4, #26]
  21806. LED_SetStatusLedFreq(1000);
  21807. 8029256: f44f 707a mov.w r0, #1000 ; 0x3e8
  21808. 802925a: f7ff ffa3 bl 80291a4 <LED_SetStatusLedFreq>
  21809. button->unpressHandler();
  21810. 802925e: 68e3 ldr r3, [r4, #12]
  21811. 8029260: 4798 blx r3
  21812. 8029262: bd10 pop {r4, pc}
  21813. }
  21814. else
  21815. button->counterActivation = 0;
  21816. 8029264: 2300 movs r3, #0
  21817. 8029266: 6163 str r3, [r4, #20]
  21818. 8029268: bd10 pop {r4, pc}
  21819. 802926a: 0000 movs r0, r0
  21820. 0802926c <vTaskButtons>:
  21821. /**
  21822. * @brief Опрос кнопок
  21823. */
  21824. void vTaskButtons(void *pvParameters)
  21825. {
  21826. 802926c: b508 push {r3, lr}
  21827. for (;;)
  21828. {
  21829. BUTTON_DellayHandler(&defButton);
  21830. 802926e: 4803 ldr r0, [pc, #12] ; (802927c <vTaskButtons+0x10>)
  21831. 8029270: f7ff ffd8 bl 8029224 <BUTTON_DellayHandler>
  21832. vTaskDelay(100); //20
  21833. 8029274: 2064 movs r0, #100 ; 0x64
  21834. 8029276: f002 fc1b bl 802bab0 <vTaskDelay>
  21835. 802927a: e7f8 b.n 802926e <vTaskButtons+0x2>
  21836. 802927c: 2000d7bc .word 0x2000d7bc
  21837. 08029280 <set_mode_jumper>:
  21838. #include <stdbool.h>
  21839. #include "gpio.h"
  21840. bool set_mode_jumper(void)
  21841. {
  21842. return gpio_get(MODE_JUMPER);
  21843. 8029280: 2010 movs r0, #16
  21844. 8029282: f7fd b8d7 b.w 8026434 <gpio_get>
  21845. 08029286 <get_state_din_outs>:
  21846. /* data actuality mutexes */
  21847. static SemaphoreHandle_t outputs_mutex, inputs_mutex;
  21848. uint8_t get_state_din_outs(gpio_t pin) {
  21849. uint8_t res = 0;
  21850. res = gpio_get(pin);
  21851. 8029286: f7fd b8d5 b.w 8026434 <gpio_get>
  21852. 0802928a <set_state_douts>:
  21853. return res;
  21854. }
  21855. void set_state_douts(gpio_t pin, uint8_t value)
  21856. {
  21857. gpio_set(pin, value);
  21858. 802928a: 3100 adds r1, #0
  21859. 802928c: bf18 it ne
  21860. 802928e: 2101 movne r1, #1
  21861. 8029290: f7fd b82c b.w 80262ec <gpio_set>
  21862. 08029294 <init_UPS_value>:
  21863. extern bool flUpdateLog;
  21864. void init_UPS_value(void)
  21865. {
  21866. 8029294: b538 push {r3, r4, r5, lr}
  21867. UPS.Freq_in = 0;
  21868. 8029296: 4c10 ldr r4, [pc, #64] ; (80292d8 <init_UPS_value+0x44>)
  21869. UPS.VAC_in = 0;
  21870. UPS.VAC_out = 0;
  21871. UPS.Temp = 0;
  21872. UPS.Load = 0;
  21873. 8029298: 2500 movs r5, #0
  21874. extern bool flUpdateLog;
  21875. void init_UPS_value(void)
  21876. {
  21877. UPS.Freq_in = 0;
  21878. 802929a: 2300 movs r3, #0
  21879. UPS.Alarm = 0;
  21880. UPS.cnt_err_ups = 0;
  21881. UPS.Flag_Present = false;
  21882. UPS.Present = false;
  21883. memset(UPS.model, 0, 11);
  21884. 802929c: 4629 mov r1, r5
  21885. 802929e: 220b movs r2, #11
  21886. 80292a0: f104 0015 add.w r0, r4, #21
  21887. extern bool flUpdateLog;
  21888. void init_UPS_value(void)
  21889. {
  21890. UPS.Freq_in = 0;
  21891. 80292a4: 6023 str r3, [r4, #0]
  21892. UPS.VAC_in = 0;
  21893. 80292a6: 6063 str r3, [r4, #4]
  21894. UPS.VAC_out = 0;
  21895. 80292a8: 60a3 str r3, [r4, #8]
  21896. UPS.Temp = 0;
  21897. 80292aa: 60e3 str r3, [r4, #12]
  21898. UPS.Load = 0;
  21899. 80292ac: 7425 strb r5, [r4, #16]
  21900. UPS.SOC = 0;
  21901. 80292ae: 7465 strb r5, [r4, #17]
  21902. UPS.work_time = 0;
  21903. 80292b0: 74a5 strb r5, [r4, #18]
  21904. UPS.Status = 0;
  21905. 80292b2: 74e5 strb r5, [r4, #19]
  21906. UPS.Alarm = 0;
  21907. 80292b4: 7525 strb r5, [r4, #20]
  21908. UPS.cnt_err_ups = 0;
  21909. 80292b6: f884 502c strb.w r5, [r4, #44] ; 0x2c
  21910. UPS.Flag_Present = false;
  21911. 80292ba: f884 502e strb.w r5, [r4, #46] ; 0x2e
  21912. UPS.Present = false;
  21913. 80292be: f884 502d strb.w r5, [r4, #45] ; 0x2d
  21914. memset(UPS.model, 0, 11);
  21915. 80292c2: f7f8 fda9 bl 8021e18 <memset>
  21916. memset(UPS.vertion, 0, 11);
  21917. 80292c6: f104 0020 add.w r0, r4, #32
  21918. 80292ca: 4629 mov r1, r5
  21919. 80292cc: 220b movs r2, #11
  21920. }
  21921. 80292ce: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr}
  21922. UPS.cnt_err_ups = 0;
  21923. UPS.Flag_Present = false;
  21924. UPS.Present = false;
  21925. memset(UPS.model, 0, 11);
  21926. memset(UPS.vertion, 0, 11);
  21927. 80292d2: f7f8 bda1 b.w 8021e18 <memset>
  21928. 80292d6: bf00 nop
  21929. 80292d8: 2000d7d8 .word 0x2000d7d8
  21930. 080292dc <send_MegaTec_cmd>:
  21931. }
  21932. void send_MegaTec_cmd(cmdMegaTecEnums_t command)
  21933. {
  21934. 80292dc: b530 push {r4, r5, lr}
  21935. if(command == ups_test_time){
  21936. 80292de: 2803 cmp r0, #3
  21937. memset(UPS.model, 0, 11);
  21938. memset(UPS.vertion, 0, 11);
  21939. }
  21940. void send_MegaTec_cmd(cmdMegaTecEnums_t command)
  21941. {
  21942. 80292e0: b087 sub sp, #28
  21943. 80292e2: 4d36 ldr r5, [pc, #216] ; (80293bc <send_MegaTec_cmd+0xe0>)
  21944. if(command == ups_test_time){
  21945. 80292e4: d10c bne.n 8029300 <send_MegaTec_cmd+0x24>
  21946. uint8_t req[10];
  21947. memset(req, 0, 10);
  21948. 80292e6: 2100 movs r1, #0
  21949. 80292e8: 220a movs r2, #10
  21950. 80292ea: a803 add r0, sp, #12
  21951. 80292ec: f7f8 fd94 bl 8021e18 <memset>
  21952. sprintf(req, "%s%d\r", MegaTecCMD[command], TimeParam);
  21953. 80292f0: 4b33 ldr r3, [pc, #204] ; (80293c0 <send_MegaTec_cmd+0xe4>)
  21954. 80292f2: 4934 ldr r1, [pc, #208] ; (80293c4 <send_MegaTec_cmd+0xe8>)
  21955. 80292f4: 68ea ldr r2, [r5, #12]
  21956. 80292f6: 881b ldrh r3, [r3, #0]
  21957. 80292f8: a803 add r0, sp, #12
  21958. 80292fa: f7fe fcf5 bl 8027ce8 <tfp_sprintf>
  21959. 80292fe: e037 b.n 8029370 <send_MegaTec_cmd+0x94>
  21960. ups_send_block(req, strlen(req));
  21961. }
  21962. else if(command == ups_shutdown){
  21963. 8029300: 2805 cmp r0, #5
  21964. 8029302: d13b bne.n 802937c <send_MegaTec_cmd+0xa0>
  21965. uint8_t req[10];
  21966. memset(req, 0, 10);
  21967. 8029304: 2100 movs r1, #0
  21968. 8029306: a803 add r0, sp, #12
  21969. 8029308: 220a movs r2, #10
  21970. 802930a: f7f8 fd85 bl 8021e18 <memset>
  21971. if(TimeParamFloat >= 1 && TimeParamFloat < 10)
  21972. 802930e: 4b2e ldr r3, [pc, #184] ; (80293c8 <send_MegaTec_cmd+0xec>)
  21973. 8029310: 681c ldr r4, [r3, #0]
  21974. 8029312: f04f 517e mov.w r1, #1065353216 ; 0x3f800000
  21975. 8029316: 4620 mov r0, r4
  21976. 8029318: f7f7 ff80 bl 802121c <__aeabi_fcmpge>
  21977. 802931c: b160 cbz r0, 8029338 <send_MegaTec_cmd+0x5c>
  21978. 802931e: 4620 mov r0, r4
  21979. 8029320: 492a ldr r1, [pc, #168] ; (80293cc <send_MegaTec_cmd+0xf0>)
  21980. 8029322: f7f7 ff67 bl 80211f4 <__aeabi_fcmplt>
  21981. 8029326: b138 cbz r0, 8029338 <send_MegaTec_cmd+0x5c>
  21982. {
  21983. sprintf(req, "%s0%f\r", MegaTecCMD[command], TimeParamFloat);
  21984. 8029328: 4620 mov r0, r4
  21985. 802932a: f7f7 f931 bl 8020590 <__aeabi_f2d>
  21986. 802932e: e9cd 0100 strd r0, r1, [sp]
  21987. 8029332: a803 add r0, sp, #12
  21988. 8029334: 4926 ldr r1, [pc, #152] ; (80293d0 <send_MegaTec_cmd+0xf4>)
  21989. 8029336: e018 b.n 802936a <send_MegaTec_cmd+0x8e>
  21990. }
  21991. else if(TimeParamFloat < 1){
  21992. 8029338: 4620 mov r0, r4
  21993. 802933a: f04f 517e mov.w r1, #1065353216 ; 0x3f800000
  21994. 802933e: f7f7 ff59 bl 80211f4 <__aeabi_fcmplt>
  21995. 8029342: 4d1e ldr r5, [pc, #120] ; (80293bc <send_MegaTec_cmd+0xe0>)
  21996. 8029344: b150 cbz r0, 802935c <send_MegaTec_cmd+0x80>
  21997. sprintf(req, "%s.%f\r", MegaTecCMD[command], 10*TimeParamFloat);
  21998. 8029346: 4921 ldr r1, [pc, #132] ; (80293cc <send_MegaTec_cmd+0xf0>)
  21999. 8029348: 4620 mov r0, r4
  22000. 802934a: f7f7 fdb5 bl 8020eb8 <__aeabi_fmul>
  22001. 802934e: f7f7 f91f bl 8020590 <__aeabi_f2d>
  22002. 8029352: e9cd 0100 strd r0, r1, [sp]
  22003. 8029356: a803 add r0, sp, #12
  22004. 8029358: 491e ldr r1, [pc, #120] ; (80293d4 <send_MegaTec_cmd+0xf8>)
  22005. 802935a: e006 b.n 802936a <send_MegaTec_cmd+0x8e>
  22006. }
  22007. else{
  22008. sprintf(req, "%s%f\r", MegaTecCMD[command], TimeParamFloat);
  22009. 802935c: 4620 mov r0, r4
  22010. 802935e: f7f7 f917 bl 8020590 <__aeabi_f2d>
  22011. 8029362: e9cd 0100 strd r0, r1, [sp]
  22012. 8029366: 491c ldr r1, [pc, #112] ; (80293d8 <send_MegaTec_cmd+0xfc>)
  22013. 8029368: a803 add r0, sp, #12
  22014. 802936a: 696a ldr r2, [r5, #20]
  22015. 802936c: f7fe fcbc bl 8027ce8 <tfp_sprintf>
  22016. }
  22017. ups_send_block(req, strlen(req));
  22018. 8029370: a803 add r0, sp, #12
  22019. 8029372: f7f8 ff29 bl 80221c8 <strlen>
  22020. 8029376: b2c1 uxtb r1, r0
  22021. 8029378: a803 add r0, sp, #12
  22022. 802937a: e01a b.n 80293b2 <send_MegaTec_cmd+0xd6>
  22023. }
  22024. else if(command == ups_shutdown_restore){
  22025. 802937c: 2806 cmp r0, #6
  22026. 802937e: d111 bne.n 80293a4 <send_MegaTec_cmd+0xc8>
  22027. uint8_t req[10];
  22028. memset(req, 0, 10);
  22029. 8029380: 2100 movs r1, #0
  22030. 8029382: 220a movs r2, #10
  22031. 8029384: a803 add r0, sp, #12
  22032. 8029386: f7f8 fd47 bl 8021e18 <memset>
  22033. sprintf(req, "%s.%d%s%d\r", MegaTecCMD[command-1], TimeParam, MegaTecCMD[command], TimeParam2);
  22034. 802938a: 69aa ldr r2, [r5, #24]
  22035. 802938c: 4b0c ldr r3, [pc, #48] ; (80293c0 <send_MegaTec_cmd+0xe4>)
  22036. 802938e: 4913 ldr r1, [pc, #76] ; (80293dc <send_MegaTec_cmd+0x100>)
  22037. 8029390: 881b ldrh r3, [r3, #0]
  22038. 8029392: 9200 str r2, [sp, #0]
  22039. 8029394: 4a12 ldr r2, [pc, #72] ; (80293e0 <send_MegaTec_cmd+0x104>)
  22040. 8029396: 8812 ldrh r2, [r2, #0]
  22041. 8029398: a803 add r0, sp, #12
  22042. 802939a: 9201 str r2, [sp, #4]
  22043. 802939c: 696a ldr r2, [r5, #20]
  22044. 802939e: f7fe fca3 bl 8027ce8 <tfp_sprintf>
  22045. 80293a2: e7e5 b.n 8029370 <send_MegaTec_cmd+0x94>
  22046. ups_send_block(req, strlen(req));
  22047. }
  22048. else{
  22049. // TODO ����������� ���������
  22050. //ups_send_block(MegaTecCMD[command], strlen(MegaTecCMD[command]));
  22051. ups_send_block((void*)MegaTecCMD[command], strlen(MegaTecCMD[command]));
  22052. 80293a4: f855 4020 ldr.w r4, [r5, r0, lsl #2]
  22053. 80293a8: 4620 mov r0, r4
  22054. 80293aa: f7f8 ff0d bl 80221c8 <strlen>
  22055. 80293ae: b2c1 uxtb r1, r0
  22056. 80293b0: 4620 mov r0, r4
  22057. 80293b2: f7fd fe79 bl 80270a8 <ups_send_block>
  22058. }
  22059. }
  22060. 80293b6: b007 add sp, #28
  22061. 80293b8: bd30 pop {r4, r5, pc}
  22062. 80293ba: bf00 nop
  22063. 80293bc: 20000674 .word 0x20000674
  22064. 80293c0: 20000b8c .word 0x20000b8c
  22065. 80293c4: 080392c3 .word 0x080392c3
  22066. 80293c8: 20000b88 .word 0x20000b88
  22067. 80293cc: 41200000 .word 0x41200000
  22068. 80293d0: 080392aa .word 0x080392aa
  22069. 80293d4: 080392b1 .word 0x080392b1
  22070. 80293d8: 080392b8 .word 0x080392b8
  22071. 80293dc: 080392be .word 0x080392be
  22072. 80293e0: 20000b52 .word 0x20000b52
  22073. 080293e4 <ups_megatec_rx_pdu>:
  22074. bool ups_megatec_rx_pdu(void)
  22075. {
  22076. 80293e4: b510 push {r4, lr}
  22077. int c = 0;
  22078. ups_pdu.len = 0;
  22079. 80293e6: 4c0e ldr r4, [pc, #56] ; (8029420 <ups_megatec_rx_pdu+0x3c>)
  22080. 80293e8: 2000 movs r0, #0
  22081. 80293ea: 8660 strh r0, [r4, #50] ; 0x32
  22082. while ((ups_pdu.len < UPS_PDU_MAX_LEN) && (c != 0x0d)) {
  22083. 80293ec: e00d b.n 802940a <ups_megatec_rx_pdu+0x26>
  22084. c = ups_getchar(500);//portMAX_DELAY
  22085. 80293ee: f44f 70fa mov.w r0, #500 ; 0x1f4
  22086. 80293f2: f7fd fe7d bl 80270f0 <ups_getchar>
  22087. if(c < 0)
  22088. 80293f6: 2800 cmp r0, #0
  22089. 80293f8: da03 bge.n 8029402 <ups_megatec_rx_pdu+0x1e>
  22090. {
  22091. ups_pdu.len = 0;
  22092. 80293fa: 4b09 ldr r3, [pc, #36] ; (8029420 <ups_megatec_rx_pdu+0x3c>)
  22093. 80293fc: 2200 movs r2, #0
  22094. 80293fe: 865a strh r2, [r3, #50] ; 0x32
  22095. break;
  22096. 8029400: e008 b.n 8029414 <ups_megatec_rx_pdu+0x30>
  22097. }
  22098. ups_pdu.data[ups_pdu.len++] = c;
  22099. 8029402: 8e63 ldrh r3, [r4, #50] ; 0x32
  22100. 8029404: 54e0 strb r0, [r4, r3]
  22101. 8029406: 3301 adds r3, #1
  22102. 8029408: 8663 strh r3, [r4, #50] ; 0x32
  22103. {
  22104. int c = 0;
  22105. ups_pdu.len = 0;
  22106. while ((ups_pdu.len < UPS_PDU_MAX_LEN) && (c != 0x0d)) {
  22107. 802940a: 8e63 ldrh r3, [r4, #50] ; 0x32
  22108. 802940c: 2b31 cmp r3, #49 ; 0x31
  22109. 802940e: d801 bhi.n 8029414 <ups_megatec_rx_pdu+0x30>
  22110. 8029410: 280d cmp r0, #13
  22111. 8029412: d1ec bne.n 80293ee <ups_megatec_rx_pdu+0xa>
  22112. break;
  22113. }
  22114. ups_pdu.data[ups_pdu.len++] = c;
  22115. }
  22116. if (ups_pdu.len == 0)
  22117. 8029414: 4b02 ldr r3, [pc, #8] ; (8029420 <ups_megatec_rx_pdu+0x3c>)
  22118. 8029416: 8e58 ldrh r0, [r3, #50] ; 0x32
  22119. return false;
  22120. return true;
  22121. }
  22122. 8029418: 3000 adds r0, #0
  22123. 802941a: bf18 it ne
  22124. 802941c: 2001 movne r0, #1
  22125. 802941e: bd10 pop {r4, pc}
  22126. 8029420: 20000b54 .word 0x20000b54
  22127. 8029424: 00000000 .word 0x00000000
  22128. 08029428 <ups_status_response>:
  22129. void ups_status_response(char *data)
  22130. {
  22131. 8029428: e92d 41ff stmdb sp!, {r0, r1, r2, r3, r4, r5, r6, r7, r8, lr}
  22132. uint8_t i;
  22133. char *endValue;
  22134. char value[10];
  22135. uint8_t len = 0;
  22136. if(data[0] != '(')
  22137. 802942c: 7803 ldrb r3, [r0, #0]
  22138. 802942e: 2b28 cmp r3, #40 ; 0x28
  22139. return true;
  22140. }
  22141. void ups_status_response(char *data)
  22142. {
  22143. 8029430: 4604 mov r4, r0
  22144. uint8_t i;
  22145. char *endValue;
  22146. char value[10];
  22147. uint8_t len = 0;
  22148. if(data[0] != '(')
  22149. 8029432: f040 80e4 bne.w 80295fe <ups_status_response+0x1d6>
  22150. return;
  22151. UPS.Present = true;
  22152. 8029436: 4b78 ldr r3, [pc, #480] ; (8029618 <ups_status_response+0x1f0>)
  22153. 8029438: 2201 movs r2, #1
  22154. 802943a: f883 202d strb.w r2, [r3, #45] ; 0x2d
  22155. UPS.Flag_Present = true;
  22156. 802943e: f883 202e strb.w r2, [r3, #46] ; 0x2e
  22157. UPS.cnt_err_ups = 0;
  22158. 8029442: 2200 movs r2, #0
  22159. 8029444: f883 202c strb.w r2, [r3, #44] ; 0x2c
  22160. if(flUpdateLog){
  22161. 8029448: 4b74 ldr r3, [pc, #464] ; (802961c <ups_status_response+0x1f4>)
  22162. 802944a: 7819 ldrb r1, [r3, #0]
  22163. 802944c: b111 cbz r1, 8029454 <ups_status_response+0x2c>
  22164. flUpdateLog = false;
  22165. 802944e: 701a strb r2, [r3, #0]
  22166. log_add(data);
  22167. 8029450: f000 ff1e bl 802a290 <log_add>
  22168. }
  22169. data++;
  22170. 8029454: 3401 adds r4, #1
  22171. memset(value, 0, 10);
  22172. 8029456: 220a movs r2, #10
  22173. 8029458: 2100 movs r1, #0
  22174. 802945a: a801 add r0, sp, #4
  22175. 802945c: f7f8 fcdc bl 8021e18 <memset>
  22176. endValue = strpbrk(data," ");
  22177. 8029460: 4620 mov r0, r4
  22178. 8029462: 496f ldr r1, [pc, #444] ; (8029620 <ups_status_response+0x1f8>)
  22179. 8029464: f7f8 ff9a bl 802239c <strpbrk>
  22180. len = endValue - data;
  22181. 8029468: 1b00 subs r0, r0, r4
  22182. void ups_megatec_init(void) {
  22183. init_UPS_value();
  22184. UPS.Present = true;
  22185. xTaskCreate(request_task, ( char * ) "request_task", configMINIMAL_STACK_SIZE * 2, NULL, tskIDLE_PRIORITY, NULL);
  22186. }
  22187. 802946a: b2c6 uxtb r6, r0
  22188. data++;
  22189. memset(value, 0, 10);
  22190. endValue = strpbrk(data," ");
  22191. len = endValue - data;
  22192. strncpy(value, data, len);
  22193. 802946c: 4632 mov r2, r6
  22194. 802946e: 4621 mov r1, r4
  22195. 8029470: a801 add r0, sp, #4
  22196. 8029472: f7f8 ff61 bl 8022338 <strncpy>
  22197. data += (len + 1);
  22198. UPS.VAC_in = atof(value);
  22199. 8029476: a801 add r0, sp, #4
  22200. 8029478: f7f8 fbaa bl 8021bd0 <atof>
  22201. 802947c: f7f7 fbbe bl 8020bfc <__aeabi_d2f>
  22202. memset(value, 0, 10);
  22203. endValue = strpbrk(data," ");
  22204. len = endValue - data;
  22205. strncpy(value, data, len);
  22206. data += (len + 1);
  22207. 8029480: 3601 adds r6, #1
  22208. 8029482: 19a6 adds r6, r4, r6
  22209. UPS.VAC_in = atof(value);
  22210. 8029484: 4c64 ldr r4, [pc, #400] ; (8029618 <ups_status_response+0x1f0>)
  22211. //TODO
  22212. memset(value, 0, 10);
  22213. 8029486: 220a movs r2, #10
  22214. memset(value, 0, 10);
  22215. endValue = strpbrk(data," ");
  22216. len = endValue - data;
  22217. strncpy(value, data, len);
  22218. data += (len + 1);
  22219. UPS.VAC_in = atof(value);
  22220. 8029488: 6060 str r0, [r4, #4]
  22221. //TODO
  22222. memset(value, 0, 10);
  22223. 802948a: 2100 movs r1, #0
  22224. 802948c: a801 add r0, sp, #4
  22225. 802948e: f7f8 fcc3 bl 8021e18 <memset>
  22226. endValue = strpbrk(data," ");
  22227. 8029492: 4630 mov r0, r6
  22228. 8029494: 4962 ldr r1, [pc, #392] ; (8029620 <ups_status_response+0x1f8>)
  22229. 8029496: f7f8 ff81 bl 802239c <strpbrk>
  22230. len = endValue - data;
  22231. 802949a: 1b80 subs r0, r0, r6
  22232. void ups_megatec_init(void) {
  22233. init_UPS_value();
  22234. UPS.Present = true;
  22235. xTaskCreate(request_task, ( char * ) "request_task", configMINIMAL_STACK_SIZE * 2, NULL, tskIDLE_PRIORITY, NULL);
  22236. }
  22237. 802949c: b2c5 uxtb r5, r0
  22238. //TODO
  22239. memset(value, 0, 10);
  22240. endValue = strpbrk(data," ");
  22241. len = endValue - data;
  22242. strncpy(value, data, len);
  22243. 802949e: 4631 mov r1, r6
  22244. 80294a0: 462a mov r2, r5
  22245. 80294a2: a801 add r0, sp, #4
  22246. data += (len + 1);
  22247. 80294a4: 3501 adds r5, #1
  22248. //TODO
  22249. memset(value, 0, 10);
  22250. endValue = strpbrk(data," ");
  22251. len = endValue - data;
  22252. strncpy(value, data, len);
  22253. 80294a6: f7f8 ff47 bl 8022338 <strncpy>
  22254. data += (len + 1);
  22255. 80294aa: 1975 adds r5, r6, r5
  22256. memset(value, 0, 10);
  22257. 80294ac: 220a movs r2, #10
  22258. 80294ae: 2100 movs r1, #0
  22259. 80294b0: a801 add r0, sp, #4
  22260. 80294b2: f7f8 fcb1 bl 8021e18 <memset>
  22261. endValue = strpbrk(data," ");
  22262. 80294b6: 4628 mov r0, r5
  22263. 80294b8: 4959 ldr r1, [pc, #356] ; (8029620 <ups_status_response+0x1f8>)
  22264. 80294ba: f7f8 ff6f bl 802239c <strpbrk>
  22265. len = endValue - data;
  22266. 80294be: 1b40 subs r0, r0, r5
  22267. void ups_megatec_init(void) {
  22268. init_UPS_value();
  22269. UPS.Present = true;
  22270. xTaskCreate(request_task, ( char * ) "request_task", configMINIMAL_STACK_SIZE * 2, NULL, tskIDLE_PRIORITY, NULL);
  22271. }
  22272. 80294c0: fa5f f880 uxtb.w r8, r0
  22273. data += (len + 1);
  22274. memset(value, 0, 10);
  22275. endValue = strpbrk(data," ");
  22276. len = endValue - data;
  22277. strncpy(value, data, len);
  22278. 80294c4: 4642 mov r2, r8
  22279. 80294c6: 4629 mov r1, r5
  22280. 80294c8: a801 add r0, sp, #4
  22281. 80294ca: f7f8 ff35 bl 8022338 <strncpy>
  22282. data += (len + 1);
  22283. UPS.VAC_out = atof(value);
  22284. 80294ce: a801 add r0, sp, #4
  22285. 80294d0: f7f8 fb7e bl 8021bd0 <atof>
  22286. 80294d4: f7f7 fb92 bl 8020bfc <__aeabi_d2f>
  22287. memset(value, 0, 10);
  22288. endValue = strpbrk(data," ");
  22289. len = endValue - data;
  22290. strncpy(value, data, len);
  22291. data += (len + 1);
  22292. 80294d8: f108 0801 add.w r8, r8, #1
  22293. 80294dc: 44a8 add r8, r5
  22294. UPS.VAC_out = atof(value);
  22295. memset(value, 0, 10);
  22296. 80294de: 220a movs r2, #10
  22297. memset(value, 0, 10);
  22298. endValue = strpbrk(data," ");
  22299. len = endValue - data;
  22300. strncpy(value, data, len);
  22301. data += (len + 1);
  22302. UPS.VAC_out = atof(value);
  22303. 80294e0: 60a0 str r0, [r4, #8]
  22304. memset(value, 0, 10);
  22305. 80294e2: 2100 movs r1, #0
  22306. 80294e4: a801 add r0, sp, #4
  22307. 80294e6: f7f8 fc97 bl 8021e18 <memset>
  22308. endValue = strpbrk(data," ");
  22309. 80294ea: 494d ldr r1, [pc, #308] ; (8029620 <ups_status_response+0x1f8>)
  22310. 80294ec: 4640 mov r0, r8
  22311. 80294ee: f7f8 ff55 bl 802239c <strpbrk>
  22312. len = endValue - data;
  22313. 80294f2: ebc8 0000 rsb r0, r8, r0
  22314. void ups_megatec_init(void) {
  22315. init_UPS_value();
  22316. UPS.Present = true;
  22317. xTaskCreate(request_task, ( char * ) "request_task", configMINIMAL_STACK_SIZE * 2, NULL, tskIDLE_PRIORITY, NULL);
  22318. }
  22319. 80294f6: b2c7 uxtb r7, r0
  22320. UPS.VAC_out = atof(value);
  22321. memset(value, 0, 10);
  22322. endValue = strpbrk(data," ");
  22323. len = endValue - data;
  22324. strncpy(value, data, len);
  22325. 80294f8: 463a mov r2, r7
  22326. 80294fa: 4641 mov r1, r8
  22327. 80294fc: a801 add r0, sp, #4
  22328. 80294fe: f7f8 ff1b bl 8022338 <strncpy>
  22329. data += (len + 1);
  22330. UPS.Load = atoi(value);
  22331. 8029502: a801 add r0, sp, #4
  22332. 8029504: f7f8 fb68 bl 8021bd8 <atoi>
  22333. memset(value, 0, 10);
  22334. endValue = strpbrk(data," ");
  22335. len = endValue - data;
  22336. strncpy(value, data, len);
  22337. data += (len + 1);
  22338. 8029508: 3701 adds r7, #1
  22339. 802950a: 4447 add r7, r8
  22340. UPS.Load = atoi(value);
  22341. memset(value, 0, 10);
  22342. 802950c: 220a movs r2, #10
  22343. memset(value, 0, 10);
  22344. endValue = strpbrk(data," ");
  22345. len = endValue - data;
  22346. strncpy(value, data, len);
  22347. data += (len + 1);
  22348. UPS.Load = atoi(value);
  22349. 802950e: 7420 strb r0, [r4, #16]
  22350. memset(value, 0, 10);
  22351. 8029510: 2100 movs r1, #0
  22352. 8029512: a801 add r0, sp, #4
  22353. 8029514: f7f8 fc80 bl 8021e18 <memset>
  22354. endValue = strpbrk(data," ");
  22355. 8029518: 4941 ldr r1, [pc, #260] ; (8029620 <ups_status_response+0x1f8>)
  22356. 802951a: 4638 mov r0, r7
  22357. 802951c: f7f8 ff3e bl 802239c <strpbrk>
  22358. len = endValue - data;
  22359. 8029520: 1bc0 subs r0, r0, r7
  22360. void ups_megatec_init(void) {
  22361. init_UPS_value();
  22362. UPS.Present = true;
  22363. xTaskCreate(request_task, ( char * ) "request_task", configMINIMAL_STACK_SIZE * 2, NULL, tskIDLE_PRIORITY, NULL);
  22364. }
  22365. 8029522: b2c6 uxtb r6, r0
  22366. UPS.Load = atoi(value);
  22367. memset(value, 0, 10);
  22368. endValue = strpbrk(data," ");
  22369. len = endValue - data;
  22370. strncpy(value, data, len);
  22371. 8029524: 4632 mov r2, r6
  22372. 8029526: 4639 mov r1, r7
  22373. 8029528: a801 add r0, sp, #4
  22374. 802952a: f7f8 ff05 bl 8022338 <strncpy>
  22375. data += (len + 1);
  22376. UPS.Freq_in = atof(value);
  22377. 802952e: a801 add r0, sp, #4
  22378. 8029530: f7f8 fb4e bl 8021bd0 <atof>
  22379. 8029534: f7f7 fb62 bl 8020bfc <__aeabi_d2f>
  22380. memset(value, 0, 10);
  22381. endValue = strpbrk(data," ");
  22382. len = endValue - data;
  22383. strncpy(value, data, len);
  22384. data += (len + 1);
  22385. 8029538: 3601 adds r6, #1
  22386. 802953a: 19be adds r6, r7, r6
  22387. UPS.Freq_in = atof(value);
  22388. 802953c: 6020 str r0, [r4, #0]
  22389. //TODO
  22390. memset(value, 0, 10);
  22391. 802953e: 220a movs r2, #10
  22392. 8029540: 2100 movs r1, #0
  22393. 8029542: a801 add r0, sp, #4
  22394. 8029544: f7f8 fc68 bl 8021e18 <memset>
  22395. endValue = strpbrk(data," ");
  22396. 8029548: 4630 mov r0, r6
  22397. 802954a: 4935 ldr r1, [pc, #212] ; (8029620 <ups_status_response+0x1f8>)
  22398. 802954c: f7f8 ff26 bl 802239c <strpbrk>
  22399. len = endValue - data;
  22400. 8029550: 1b80 subs r0, r0, r6
  22401. void ups_megatec_init(void) {
  22402. init_UPS_value();
  22403. UPS.Present = true;
  22404. xTaskCreate(request_task, ( char * ) "request_task", configMINIMAL_STACK_SIZE * 2, NULL, tskIDLE_PRIORITY, NULL);
  22405. }
  22406. 8029552: b2c5 uxtb r5, r0
  22407. //TODO
  22408. memset(value, 0, 10);
  22409. endValue = strpbrk(data," ");
  22410. len = endValue - data;
  22411. strncpy(value, data, len);
  22412. 8029554: 462a mov r2, r5
  22413. 8029556: 4631 mov r1, r6
  22414. 8029558: a801 add r0, sp, #4
  22415. 802955a: f7f8 feed bl 8022338 <strncpy>
  22416. data += (len + 1);
  22417. UPS.SOC = 100*((atof(value)) - 1.6)/0.7;
  22418. 802955e: a801 add r0, sp, #4
  22419. 8029560: f7f8 fb36 bl 8021bd0 <atof>
  22420. 8029564: a328 add r3, pc, #160 ; (adr r3, 8029608 <ups_status_response+0x1e0>)
  22421. 8029566: e9d3 2300 ldrd r2, r3, [r3]
  22422. 802956a: f7f6 feb1 bl 80202d0 <__aeabi_dsub>
  22423. 802956e: 2200 movs r2, #0
  22424. 8029570: 4b2c ldr r3, [pc, #176] ; (8029624 <ups_status_response+0x1fc>)
  22425. 8029572: f7f7 f861 bl 8020638 <__aeabi_dmul>
  22426. 8029576: a326 add r3, pc, #152 ; (adr r3, 8029610 <ups_status_response+0x1e8>)
  22427. 8029578: e9d3 2300 ldrd r2, r3, [r3]
  22428. 802957c: f7f7 f986 bl 802088c <__aeabi_ddiv>
  22429. 8029580: f7f7 fb1c bl 8020bbc <__aeabi_d2uiz>
  22430. //TODO
  22431. memset(value, 0, 10);
  22432. endValue = strpbrk(data," ");
  22433. len = endValue - data;
  22434. strncpy(value, data, len);
  22435. data += (len + 1);
  22436. 8029584: 3501 adds r5, #1
  22437. 8029586: 1975 adds r5, r6, r5
  22438. UPS.SOC = 100*((atof(value)) - 1.6)/0.7;
  22439. 8029588: 7460 strb r0, [r4, #17]
  22440. memset(value, 0, 10);
  22441. 802958a: 220a movs r2, #10
  22442. 802958c: 2100 movs r1, #0
  22443. 802958e: a801 add r0, sp, #4
  22444. 8029590: f7f8 fc42 bl 8021e18 <memset>
  22445. endValue = strpbrk(data," ");
  22446. 8029594: 4628 mov r0, r5
  22447. 8029596: 4922 ldr r1, [pc, #136] ; (8029620 <ups_status_response+0x1f8>)
  22448. 8029598: f7f8 ff00 bl 802239c <strpbrk>
  22449. len = endValue - data;
  22450. 802959c: 1b40 subs r0, r0, r5
  22451. void ups_megatec_init(void) {
  22452. init_UPS_value();
  22453. UPS.Present = true;
  22454. xTaskCreate(request_task, ( char * ) "request_task", configMINIMAL_STACK_SIZE * 2, NULL, tskIDLE_PRIORITY, NULL);
  22455. }
  22456. 802959e: b2c6 uxtb r6, r0
  22457. UPS.SOC = 100*((atof(value)) - 1.6)/0.7;
  22458. memset(value, 0, 10);
  22459. endValue = strpbrk(data," ");
  22460. len = endValue - data;
  22461. strncpy(value, data, len);
  22462. 80295a0: 4632 mov r2, r6
  22463. 80295a2: 4629 mov r1, r5
  22464. 80295a4: a801 add r0, sp, #4
  22465. 80295a6: f7f8 fec7 bl 8022338 <strncpy>
  22466. data += (len + 1);
  22467. UPS.Temp = atof(value);
  22468. 80295aa: a801 add r0, sp, #4
  22469. 80295ac: f7f8 fb10 bl 8021bd0 <atof>
  22470. 80295b0: f7f7 fb24 bl 8020bfc <__aeabi_d2f>
  22471. memset(value, 0, 10);
  22472. endValue = strpbrk(data," ");
  22473. len = endValue - data;
  22474. strncpy(value, data, len);
  22475. data += (len + 1);
  22476. 80295b4: 3601 adds r6, #1
  22477. 80295b6: 19ad adds r5, r5, r6
  22478. UPS.Temp = atof(value);
  22479. 80295b8: 60e0 str r0, [r4, #12]
  22480. memset(value, 0, 10);
  22481. 80295ba: 220a movs r2, #10
  22482. 80295bc: 2100 movs r1, #0
  22483. 80295be: a801 add r0, sp, #4
  22484. 80295c0: f7f8 fc2a bl 8021e18 <memset>
  22485. endValue = strpbrk(data,"\r");
  22486. 80295c4: 4918 ldr r1, [pc, #96] ; (8029628 <ups_status_response+0x200>)
  22487. 80295c6: 4628 mov r0, r5
  22488. 80295c8: f7f8 fee8 bl 802239c <strpbrk>
  22489. len = endValue - data;
  22490. 80295cc: 1b40 subs r0, r0, r5
  22491. 80295ce: b2c4 uxtb r4, r0
  22492. strncpy(value, data, len);
  22493. 80295d0: 4629 mov r1, r5
  22494. 80295d2: a801 add r0, sp, #4
  22495. 80295d4: 4622 mov r2, r4
  22496. 80295d6: f7f8 feaf bl 8022338 <strncpy>
  22497. uint8_t stat = 0;
  22498. for(i = 0; i < len; i ++)
  22499. 80295da: 2300 movs r3, #0
  22500. memset(value, 0, 10);
  22501. endValue = strpbrk(data,"\r");
  22502. len = endValue - data;
  22503. strncpy(value, data, len);
  22504. uint8_t stat = 0;
  22505. 80295dc: 4619 mov r1, r3
  22506. for(i = 0; i < len; i ++)
  22507. 80295de: e009 b.n 80295f4 <ups_status_response+0x1cc>
  22508. {
  22509. stat |= (value[i] - 0x30) << (7-i);
  22510. 80295e0: aa01 add r2, sp, #4
  22511. return false;
  22512. return true;
  22513. }
  22514. void ups_status_response(char *data)
  22515. 80295e2: f1c3 0007 rsb r0, r3, #7
  22516. len = endValue - data;
  22517. strncpy(value, data, len);
  22518. uint8_t stat = 0;
  22519. for(i = 0; i < len; i ++)
  22520. {
  22521. stat |= (value[i] - 0x30) << (7-i);
  22522. 80295e6: 5c9a ldrb r2, [r3, r2]
  22523. 80295e8: 3a30 subs r2, #48 ; 0x30
  22524. 80295ea: fa02 f200 lsl.w r2, r2, r0
  22525. 80295ee: 4311 orrs r1, r2
  22526. 80295f0: b2c9 uxtb r1, r1
  22527. 80295f2: 3301 adds r3, #1
  22528. memset(value, 0, 10);
  22529. endValue = strpbrk(data,"\r");
  22530. len = endValue - data;
  22531. strncpy(value, data, len);
  22532. uint8_t stat = 0;
  22533. for(i = 0; i < len; i ++)
  22534. 80295f4: b2da uxtb r2, r3
  22535. 80295f6: 42a2 cmp r2, r4
  22536. 80295f8: d3f2 bcc.n 80295e0 <ups_status_response+0x1b8>
  22537. {
  22538. stat |= (value[i] - 0x30) << (7-i);
  22539. }
  22540. UPS.Status = stat;
  22541. 80295fa: 4b07 ldr r3, [pc, #28] ; (8029618 <ups_status_response+0x1f0>)
  22542. 80295fc: 74d9 strb r1, [r3, #19]
  22543. }
  22544. 80295fe: e8bd 81ff ldmia.w sp!, {r0, r1, r2, r3, r4, r5, r6, r7, r8, pc}
  22545. 8029602: bf00 nop
  22546. 8029604: f3af 8000 nop.w
  22547. 8029608: 9999999a .word 0x9999999a
  22548. 802960c: 3ff99999 .word 0x3ff99999
  22549. 8029610: 66666666 .word 0x66666666
  22550. 8029614: 3fe66666 .word 0x3fe66666
  22551. 8029618: 2000d7d8 .word 0x2000d7d8
  22552. 802961c: 20000bfc .word 0x20000bfc
  22553. 8029620: 080392c9 .word 0x080392c9
  22554. 8029624: 40590000 .word 0x40590000
  22555. 8029628: 08045251 .word 0x08045251
  22556. 802962c: f3af 8000 nop.w
  22557. 08029630 <ups_info_response>:
  22558. void ups_info_response(char *data)
  22559. {
  22560. 8029630: b510 push {r4, lr}
  22561. uint8_t i = 0;
  22562. if(data[0] != '#')
  22563. 8029632: 7803 ldrb r3, [r0, #0]
  22564. 8029634: 2b23 cmp r3, #35 ; 0x23
  22565. 8029636: d137 bne.n 80296a8 <ups_info_response+0x78>
  22566. return;
  22567. UPS.Present = true;
  22568. 8029638: 4b1c ldr r3, [pc, #112] ; (80296ac <ups_info_response+0x7c>)
  22569. 802963a: 2201 movs r2, #1
  22570. 802963c: f883 202d strb.w r2, [r3, #45] ; 0x2d
  22571. UPS.Flag_Present = true;
  22572. 8029640: f883 202e strb.w r2, [r3, #46] ; 0x2e
  22573. UPS.cnt_err_ups = 0;
  22574. data++;
  22575. data += 16;
  22576. 8029644: 3011 adds r0, #17
  22577. if(data[0] != '#')
  22578. return;
  22579. UPS.Present = true;
  22580. UPS.Flag_Present = true;
  22581. UPS.cnt_err_ups = 0;
  22582. 8029646: 2200 movs r2, #0
  22583. 8029648: f883 202c strb.w r2, [r3, #44] ; 0x2c
  22584. data++;
  22585. data += 16;
  22586. while(data[0] == ' '){
  22587. 802964c: 4603 mov r3, r0
  22588. 802964e: 461c mov r4, r3
  22589. stat |= (value[i] - 0x30) << (7-i);
  22590. }
  22591. UPS.Status = stat;
  22592. }
  22593. void ups_info_response(char *data)
  22594. 8029650: 1a1a subs r2, r3, r0
  22595. data++;
  22596. data += 16;
  22597. while(data[0] == ' '){
  22598. 8029652: 7821 ldrb r1, [r4, #0]
  22599. 8029654: 3301 adds r3, #1
  22600. 8029656: 2920 cmp r1, #32
  22601. stat |= (value[i] - 0x30) << (7-i);
  22602. }
  22603. UPS.Status = stat;
  22604. }
  22605. void ups_info_response(char *data)
  22606. 8029658: b2d2 uxtb r2, r2
  22607. data++;
  22608. data += 16;
  22609. while(data[0] == ' '){
  22610. 802965a: d0f8 beq.n 802964e <ups_info_response+0x1e>
  22611. 802965c: 4813 ldr r0, [pc, #76] ; (80296ac <ups_info_response+0x7c>)
  22612. data ++;
  22613. i ++;
  22614. }
  22615. if(i < 15){
  22616. 802965e: 2a0e cmp r2, #14
  22617. /*endValue = strpbrk(data," ");
  22618. len = endValue - data;*/
  22619. if(UPS.model[0] == 0){
  22620. 8029660: 7d43 ldrb r3, [r0, #21]
  22621. strncpy(UPS.model, data, 10);
  22622. 8029662: f100 0015 add.w r0, r0, #21
  22623. while(data[0] == ' '){
  22624. data ++;
  22625. i ++;
  22626. }
  22627. if(i < 15){
  22628. 8029666: d808 bhi.n 802967a <ups_info_response+0x4a>
  22629. /*endValue = strpbrk(data," ");
  22630. len = endValue - data;*/
  22631. if(UPS.model[0] == 0){
  22632. strncpy(UPS.model, data, 10);
  22633. 8029668: 4621 mov r1, r4
  22634. 802966a: 220a movs r2, #10
  22635. i ++;
  22636. }
  22637. if(i < 15){
  22638. /*endValue = strpbrk(data," ");
  22639. len = endValue - data;*/
  22640. if(UPS.model[0] == 0){
  22641. 802966c: b913 cbnz r3, 8029674 <ups_info_response+0x44>
  22642. strncpy(UPS.model, data, 10);
  22643. 802966e: f7f8 fe63 bl 8022338 <strncpy>
  22644. 8029672: e006 b.n 8029682 <ups_info_response+0x52>
  22645. SNMP_SetObjDescr();
  22646. }
  22647. else{
  22648. strncpy(UPS.model, data, 10);
  22649. 8029674: f7f8 fe60 bl 8022338 <strncpy>
  22650. 8029678: e008 b.n 802968c <ups_info_response+0x5c>
  22651. data += 11;
  22652. }
  22653. else
  22654. {
  22655. if(UPS.model[0] == 0){
  22656. strcpy(UPS.model, "RTMP II");
  22657. 802967a: 490d ldr r1, [pc, #52] ; (80296b0 <ups_info_response+0x80>)
  22658. data += 11;
  22659. }
  22660. else
  22661. {
  22662. if(UPS.model[0] == 0){
  22663. 802967c: b923 cbnz r3, 8029688 <ups_info_response+0x58>
  22664. strcpy(UPS.model, "RTMP II");
  22665. 802967e: f7f8 fd45 bl 802210c <strcpy>
  22666. SNMP_SetObjDescr();
  22667. 8029682: f00e fb4d bl 8037d20 <SNMP_SetObjDescr>
  22668. 8029686: e001 b.n 802968c <ups_info_response+0x5c>
  22669. }
  22670. else{
  22671. strcpy(UPS.model, "RTMP II");
  22672. 8029688: f7f8 fd40 bl 802210c <strcpy>
  22673. }
  22674. data += 11;
  22675. 802968c: 340b adds r4, #11
  22676. }
  22677. strncpy(UPS.serial, data, 8);
  22678. 802968e: 4621 mov r1, r4
  22679. 8029690: 2208 movs r2, #8
  22680. 8029692: 4808 ldr r0, [pc, #32] ; (80296b4 <ups_info_response+0x84>)
  22681. 8029694: f7f8 fe50 bl 8022338 <strncpy>
  22682. data += 8;
  22683. strncpy(UPS.vertion, data, 2);
  22684. 8029698: 4807 ldr r0, [pc, #28] ; (80296b8 <ups_info_response+0x88>)
  22685. 802969a: f104 0108 add.w r1, r4, #8
  22686. 802969e: 2202 movs r2, #2
  22687. }
  22688. 80296a0: e8bd 4010 ldmia.w sp!, {r4, lr}
  22689. }
  22690. strncpy(UPS.serial, data, 8);
  22691. data += 8;
  22692. strncpy(UPS.vertion, data, 2);
  22693. 80296a4: f7f8 be48 b.w 8022338 <strncpy>
  22694. 80296a8: bd10 pop {r4, pc}
  22695. 80296aa: bf00 nop
  22696. 80296ac: 2000d7d8 .word 0x2000d7d8
  22697. 80296b0: 080392cb .word 0x080392cb
  22698. 80296b4: 2000d7fb .word 0x2000d7fb
  22699. 80296b8: 2000d7f8 .word 0x2000d7f8
  22700. 080296bc <ups_remain_time_response>:
  22701. }
  22702. void ups_remain_time_response(char *data)
  22703. {
  22704. 80296bc: b530 push {r4, r5, lr}
  22705. char value[10];
  22706. if(data[0] != '(')
  22707. 80296be: 7803 ldrb r3, [r0, #0]
  22708. 80296c0: 2b28 cmp r3, #40 ; 0x28
  22709. strncpy(UPS.vertion, data, 2);
  22710. }
  22711. void ups_remain_time_response(char *data)
  22712. {
  22713. 80296c2: b085 sub sp, #20
  22714. 80296c4: 4605 mov r5, r0
  22715. char value[10];
  22716. if(data[0] != '(')
  22717. 80296c6: d11b bne.n 8029700 <ups_remain_time_response+0x44>
  22718. return;
  22719. UPS.Present = true;
  22720. 80296c8: 4c0e ldr r4, [pc, #56] ; (8029704 <ups_remain_time_response+0x48>)
  22721. 80296ca: 2301 movs r3, #1
  22722. UPS.Flag_Present = true;
  22723. UPS.cnt_err_ups = 0;
  22724. 80296cc: 2100 movs r1, #0
  22725. data++;
  22726. memset(value, 0, 10);
  22727. 80296ce: 220a movs r2, #10
  22728. 80296d0: a801 add r0, sp, #4
  22729. {
  22730. char value[10];
  22731. if(data[0] != '(')
  22732. return;
  22733. UPS.Present = true;
  22734. 80296d2: f884 302d strb.w r3, [r4, #45] ; 0x2d
  22735. UPS.Flag_Present = true;
  22736. 80296d6: f884 302e strb.w r3, [r4, #46] ; 0x2e
  22737. UPS.cnt_err_ups = 0;
  22738. 80296da: f884 102c strb.w r1, [r4, #44] ; 0x2c
  22739. data++;
  22740. memset(value, 0, 10);
  22741. 80296de: f7f8 fb9b bl 8021e18 <memset>
  22742. strcpy(value, data);
  22743. 80296e2: 1c69 adds r1, r5, #1
  22744. 80296e4: a801 add r0, sp, #4
  22745. 80296e6: f7f8 fd11 bl 802210c <strcpy>
  22746. if((UPS.Status >> 7) & 0x01)
  22747. 80296ea: 7ce3 ldrb r3, [r4, #19]
  22748. 80296ec: 09db lsrs r3, r3, #7
  22749. 80296ee: d006 beq.n 80296fe <ups_remain_time_response+0x42>
  22750. UPS.work_time = atof(value);
  22751. 80296f0: a801 add r0, sp, #4
  22752. 80296f2: f7f8 fa6d bl 8021bd0 <atof>
  22753. 80296f6: f7f7 fa61 bl 8020bbc <__aeabi_d2uiz>
  22754. 80296fa: 74a0 strb r0, [r4, #18]
  22755. 80296fc: e000 b.n 8029700 <ups_remain_time_response+0x44>
  22756. else
  22757. UPS.work_time = 0;
  22758. 80296fe: 74a3 strb r3, [r4, #18]
  22759. }
  22760. 8029700: b005 add sp, #20
  22761. 8029702: bd30 pop {r4, r5, pc}
  22762. 8029704: 2000d7d8 .word 0x2000d7d8
  22763. 08029708 <request_task>:
  22764. }
  22765. // TODO ����������� ���������
  22766. //void request_task(void)
  22767. void request_task(void* params)
  22768. {
  22769. 8029708: b570 push {r4, r5, r6, lr}
  22770. for(;;)
  22771. {
  22772. if(UPS.Present == true){
  22773. 802970a: 4c2e ldr r4, [pc, #184] ; (80297c4 <request_task+0xbc>)
  22774. //memset(UPS.model, 0, 11);
  22775. memset(UPS.vertion, 0, 11);
  22776. }
  22777. }
  22778. }
  22779. if(megatec_send){
  22780. 802970c: 4d2e ldr r5, [pc, #184] ; (80297c8 <request_task+0xc0>)
  22781. if(UPS.Flag_Present == false)
  22782. {
  22783. if(UPS.cnt_err_ups != 2)
  22784. UPS.cnt_err_ups++;
  22785. else{
  22786. UPS.Freq_in = 0;
  22787. 802970e: 2600 movs r6, #0
  22788. void request_task(void* params)
  22789. {
  22790. for(;;)
  22791. {
  22792. if(UPS.Present == true){
  22793. 8029710: f894 302d ldrb.w r3, [r4, #45] ; 0x2d
  22794. 8029714: b1cb cbz r3, 802974a <request_task+0x42>
  22795. if(UPS.Flag_Present == false)
  22796. 8029716: f894 102e ldrb.w r1, [r4, #46] ; 0x2e
  22797. 802971a: b9b1 cbnz r1, 802974a <request_task+0x42>
  22798. {
  22799. if(UPS.cnt_err_ups != 2)
  22800. 802971c: f894 302c ldrb.w r3, [r4, #44] ; 0x2c
  22801. 8029720: 2b02 cmp r3, #2
  22802. 8029722: d003 beq.n 802972c <request_task+0x24>
  22803. UPS.cnt_err_ups++;
  22804. 8029724: 3301 adds r3, #1
  22805. 8029726: f884 302c strb.w r3, [r4, #44] ; 0x2c
  22806. 802972a: e00e b.n 802974a <request_task+0x42>
  22807. UPS.Status = 0;
  22808. UPS.Alarm = 0;
  22809. UPS.Present = false;
  22810. //memset(UPS.model, 0, 11);
  22811. memset(UPS.vertion, 0, 11);
  22812. 802972c: 4827 ldr r0, [pc, #156] ; (80297cc <request_task+0xc4>)
  22813. if(UPS.Flag_Present == false)
  22814. {
  22815. if(UPS.cnt_err_ups != 2)
  22816. UPS.cnt_err_ups++;
  22817. else{
  22818. UPS.Freq_in = 0;
  22819. 802972e: 6026 str r6, [r4, #0]
  22820. UPS.Status = 0;
  22821. UPS.Alarm = 0;
  22822. UPS.Present = false;
  22823. //memset(UPS.model, 0, 11);
  22824. memset(UPS.vertion, 0, 11);
  22825. 8029730: 220b movs r2, #11
  22826. {
  22827. if(UPS.cnt_err_ups != 2)
  22828. UPS.cnt_err_ups++;
  22829. else{
  22830. UPS.Freq_in = 0;
  22831. UPS.VAC_in = 0;
  22832. 8029732: 6066 str r6, [r4, #4]
  22833. UPS.VAC_out = 0;
  22834. 8029734: 60a6 str r6, [r4, #8]
  22835. UPS.Temp = 0;
  22836. 8029736: 60e6 str r6, [r4, #12]
  22837. UPS.Load = 0;
  22838. 8029738: 7421 strb r1, [r4, #16]
  22839. UPS.SOC = 0;
  22840. 802973a: 7461 strb r1, [r4, #17]
  22841. UPS.work_time = 0;
  22842. 802973c: 74a1 strb r1, [r4, #18]
  22843. UPS.Status = 0;
  22844. 802973e: 74e1 strb r1, [r4, #19]
  22845. UPS.Alarm = 0;
  22846. 8029740: 7521 strb r1, [r4, #20]
  22847. UPS.Present = false;
  22848. 8029742: f884 102d strb.w r1, [r4, #45] ; 0x2d
  22849. //memset(UPS.model, 0, 11);
  22850. memset(UPS.vertion, 0, 11);
  22851. 8029746: f7f8 fb67 bl 8021e18 <memset>
  22852. }
  22853. }
  22854. }
  22855. if(megatec_send){
  22856. 802974a: 782b ldrb r3, [r5, #0]
  22857. 802974c: b16b cbz r3, 802976a <request_task+0x62>
  22858. megatec_send= false;
  22859. 802974e: 2000 movs r0, #0
  22860. 8029750: 7028 strb r0, [r5, #0]
  22861. UPS.Flag_Present = false;
  22862. 8029752: f884 002e strb.w r0, [r4, #46] ; 0x2e
  22863. send_MegaTec_cmd(ups_status_req);
  22864. 8029756: f7ff fdc1 bl 80292dc <send_MegaTec_cmd>
  22865. if (ups_megatec_rx_pdu())
  22866. 802975a: f7ff fe43 bl 80293e4 <ups_megatec_rx_pdu>
  22867. 802975e: b110 cbz r0, 8029766 <request_task+0x5e>
  22868. void ups_megatec_process_pdu(cmdMegaTecEnums_t command)
  22869. {
  22870. switch(command)
  22871. {
  22872. case ups_status_req:
  22873. ups_status_response(ups_pdu.data);
  22874. 8029760: 481b ldr r0, [pc, #108] ; (80297d0 <request_task+0xc8>)
  22875. 8029762: f7ff fe61 bl 8029428 <ups_status_response>
  22876. UPS.Flag_Present = false;
  22877. send_MegaTec_cmd(ups_status_req);
  22878. if (ups_megatec_rx_pdu())
  22879. ups_megatec_process_pdu(ups_status_req);
  22880. megatec_send=true;
  22881. 8029766: 2301 movs r3, #1
  22882. 8029768: 702b strb r3, [r5, #0]
  22883. }
  22884. if(megatec_send){
  22885. 802976a: 782b ldrb r3, [r5, #0]
  22886. 802976c: b19b cbz r3, 8029796 <request_task+0x8e>
  22887. memset(ups_pdu.data, 0, UPS_PDU_MAX_LEN);
  22888. 802976e: 2100 movs r1, #0
  22889. 8029770: 2232 movs r2, #50 ; 0x32
  22890. 8029772: 4817 ldr r0, [pc, #92] ; (80297d0 <request_task+0xc8>)
  22891. 8029774: f7f8 fb50 bl 8021e18 <memset>
  22892. megatec_send= false;
  22893. 8029778: 2300 movs r3, #0
  22894. UPS.Flag_Present = false;
  22895. send_MegaTec_cmd(ups_remain_time_reg);
  22896. 802977a: 200b movs r0, #11
  22897. megatec_send=true;
  22898. }
  22899. if(megatec_send){
  22900. memset(ups_pdu.data, 0, UPS_PDU_MAX_LEN);
  22901. megatec_send= false;
  22902. 802977c: 702b strb r3, [r5, #0]
  22903. UPS.Flag_Present = false;
  22904. 802977e: f884 302e strb.w r3, [r4, #46] ; 0x2e
  22905. send_MegaTec_cmd(ups_remain_time_reg);
  22906. 8029782: f7ff fdab bl 80292dc <send_MegaTec_cmd>
  22907. if (ups_megatec_rx_pdu())
  22908. 8029786: f7ff fe2d bl 80293e4 <ups_megatec_rx_pdu>
  22909. 802978a: b110 cbz r0, 8029792 <request_task+0x8a>
  22910. break;
  22911. case ups_rating_info:
  22912. break;
  22913. case ups_remain_time_reg:
  22914. ups_remain_time_response(ups_pdu.data);
  22915. 802978c: 4810 ldr r0, [pc, #64] ; (80297d0 <request_task+0xc8>)
  22916. 802978e: f7ff ff95 bl 80296bc <ups_remain_time_response>
  22917. UPS.Flag_Present = false;
  22918. send_MegaTec_cmd(ups_remain_time_reg);
  22919. if (ups_megatec_rx_pdu())
  22920. ups_megatec_process_pdu(ups_remain_time_reg);
  22921. megatec_send=true;
  22922. 8029792: 2301 movs r3, #1
  22923. 8029794: 702b strb r3, [r5, #0]
  22924. }
  22925. //vTaskDelay(100);
  22926. if(megatec_send){
  22927. 8029796: 782b ldrb r3, [r5, #0]
  22928. 8029798: b173 cbz r3, 80297b8 <request_task+0xb0>
  22929. megatec_send = false;
  22930. 802979a: 2300 movs r3, #0
  22931. UPS.Flag_Present = false;
  22932. send_MegaTec_cmd(ups_info);
  22933. 802979c: 2009 movs r0, #9
  22934. megatec_send=true;
  22935. }
  22936. //vTaskDelay(100);
  22937. if(megatec_send){
  22938. megatec_send = false;
  22939. 802979e: 702b strb r3, [r5, #0]
  22940. UPS.Flag_Present = false;
  22941. 80297a0: f884 302e strb.w r3, [r4, #46] ; 0x2e
  22942. send_MegaTec_cmd(ups_info);
  22943. 80297a4: f7ff fd9a bl 80292dc <send_MegaTec_cmd>
  22944. if (ups_megatec_rx_pdu())
  22945. 80297a8: f7ff fe1c bl 80293e4 <ups_megatec_rx_pdu>
  22946. 80297ac: b110 cbz r0, 80297b4 <request_task+0xac>
  22947. {
  22948. case ups_status_req:
  22949. ups_status_response(ups_pdu.data);
  22950. break;
  22951. case ups_info:
  22952. ups_info_response(ups_pdu.data);
  22953. 80297ae: 4808 ldr r0, [pc, #32] ; (80297d0 <request_task+0xc8>)
  22954. 80297b0: f7ff ff3e bl 8029630 <ups_info_response>
  22955. megatec_send = false;
  22956. UPS.Flag_Present = false;
  22957. send_MegaTec_cmd(ups_info);
  22958. if (ups_megatec_rx_pdu())
  22959. ups_megatec_process_pdu(ups_info);
  22960. megatec_send = true;
  22961. 80297b4: 2301 movs r3, #1
  22962. 80297b6: 702b strb r3, [r5, #0]
  22963. }
  22964. vTaskDelay(1000);
  22965. 80297b8: f44f 707a mov.w r0, #1000 ; 0x3e8
  22966. 80297bc: f002 f978 bl 802bab0 <vTaskDelay>
  22967. }
  22968. 80297c0: e7a6 b.n 8029710 <request_task+0x8>
  22969. 80297c2: bf00 nop
  22970. 80297c4: 2000d7d8 .word 0x2000d7d8
  22971. 80297c8: 20000672 .word 0x20000672
  22972. 80297cc: 2000d7f8 .word 0x2000d7f8
  22973. 80297d0: 20000b54 .word 0x20000b54
  22974. 080297d4 <ups_metac_service_pdu>:
  22975. break;
  22976. }
  22977. }
  22978. int ups_metac_service_pdu(cmdMegaTecEnums_t command)
  22979. {
  22980. 80297d4: b570 push {r4, r5, r6, lr}
  22981. 80297d6: 4606 mov r6, r0
  22982. while(!megatec_send)
  22983. 80297d8: 4c14 ldr r4, [pc, #80] ; (802982c <ups_metac_service_pdu+0x58>)
  22984. 80297da: e002 b.n 80297e2 <ups_metac_service_pdu+0xe>
  22985. {
  22986. vTaskDelay(50);
  22987. 80297dc: 2032 movs r0, #50 ; 0x32
  22988. 80297de: f002 f967 bl 802bab0 <vTaskDelay>
  22989. }
  22990. }
  22991. int ups_metac_service_pdu(cmdMegaTecEnums_t command)
  22992. {
  22993. while(!megatec_send)
  22994. 80297e2: 7823 ldrb r3, [r4, #0]
  22995. 80297e4: 4d11 ldr r5, [pc, #68] ; (802982c <ups_metac_service_pdu+0x58>)
  22996. 80297e6: 2b00 cmp r3, #0
  22997. 80297e8: d0f8 beq.n 80297dc <ups_metac_service_pdu+0x8>
  22998. {
  22999. vTaskDelay(50);
  23000. }
  23001. megatec_send = false;
  23002. 80297ea: 2300 movs r3, #0
  23003. send_MegaTec_cmd(command);
  23004. 80297ec: 4630 mov r0, r6
  23005. {
  23006. while(!megatec_send)
  23007. {
  23008. vTaskDelay(50);
  23009. }
  23010. megatec_send = false;
  23011. 80297ee: 702b strb r3, [r5, #0]
  23012. send_MegaTec_cmd(command);
  23013. 80297f0: f7ff fd74 bl 80292dc <send_MegaTec_cmd>
  23014. if (ups_megatec_rx_pdu())
  23015. 80297f4: f7ff fdf6 bl 80293e4 <ups_megatec_rx_pdu>
  23016. 80297f8: b190 cbz r0, 8029820 <ups_metac_service_pdu+0x4c>
  23017. {
  23018. megatec_send = true;
  23019. 80297fa: 2401 movs r4, #1
  23020. if(strncmp(ups_pdu.data, "ACK", 3) == 0)
  23021. 80297fc: 480c ldr r0, [pc, #48] ; (8029830 <ups_metac_service_pdu+0x5c>)
  23022. 80297fe: 490d ldr r1, [pc, #52] ; (8029834 <ups_metac_service_pdu+0x60>)
  23023. }
  23024. megatec_send = false;
  23025. send_MegaTec_cmd(command);
  23026. if (ups_megatec_rx_pdu())
  23027. {
  23028. megatec_send = true;
  23029. 8029800: 702c strb r4, [r5, #0]
  23030. if(strncmp(ups_pdu.data, "ACK", 3) == 0)
  23031. 8029802: 2203 movs r2, #3
  23032. 8029804: f7f8 fd42 bl 802228c <strncmp>
  23033. 8029808: b168 cbz r0, 8029826 <ups_metac_service_pdu+0x52>
  23034. return 1;
  23035. else if(strncmp(ups_pdu.data, "NCK", 3) == 0)
  23036. 802980a: 490b ldr r1, [pc, #44] ; (8029838 <ups_metac_service_pdu+0x64>)
  23037. 802980c: 4808 ldr r0, [pc, #32] ; (8029830 <ups_metac_service_pdu+0x5c>)
  23038. 802980e: 2203 movs r2, #3
  23039. 8029810: f7f8 fd3c bl 802228c <strncmp>
  23040. return 0;
  23041. 8029814: 2800 cmp r0, #0
  23042. 8029816: bf14 ite ne
  23043. 8029818: f04f 30ff movne.w r0, #4294967295
  23044. 802981c: 2000 moveq r0, #0
  23045. 802981e: bd70 pop {r4, r5, r6, pc}
  23046. }
  23047. return -1;
  23048. 8029820: f04f 30ff mov.w r0, #4294967295
  23049. 8029824: bd70 pop {r4, r5, r6, pc}
  23050. send_MegaTec_cmd(command);
  23051. if (ups_megatec_rx_pdu())
  23052. {
  23053. megatec_send = true;
  23054. if(strncmp(ups_pdu.data, "ACK", 3) == 0)
  23055. return 1;
  23056. 8029826: 4620 mov r0, r4
  23057. else if(strncmp(ups_pdu.data, "NCK", 3) == 0)
  23058. return 0;
  23059. }
  23060. return -1;
  23061. }
  23062. 8029828: bd70 pop {r4, r5, r6, pc}
  23063. 802982a: bf00 nop
  23064. 802982c: 20000672 .word 0x20000672
  23065. 8029830: 20000b54 .word 0x20000b54
  23066. 8029834: 080392d3 .word 0x080392d3
  23067. 8029838: 080392d7 .word 0x080392d7
  23068. 0802983c <ups_megatec_init>:
  23069. vTaskDelay(1000);
  23070. }
  23071. }
  23072. void ups_megatec_init(void) {
  23073. 802983c: b51f push {r0, r1, r2, r3, r4, lr}
  23074. init_UPS_value();
  23075. 802983e: f7ff fd29 bl 8029294 <init_UPS_value>
  23076. UPS.Present = true;
  23077. 8029842: 4b08 ldr r3, [pc, #32] ; (8029864 <ups_megatec_init+0x28>)
  23078. xTaskCreate(request_task, ( char * ) "request_task", configMINIMAL_STACK_SIZE * 2, NULL, tskIDLE_PRIORITY, NULL);
  23079. 8029844: 4908 ldr r1, [pc, #32] ; (8029868 <ups_megatec_init+0x2c>)
  23080. 8029846: 4809 ldr r0, [pc, #36] ; (802986c <ups_megatec_init+0x30>)
  23081. }
  23082. }
  23083. void ups_megatec_init(void) {
  23084. init_UPS_value();
  23085. UPS.Present = true;
  23086. 8029848: 2201 movs r2, #1
  23087. 802984a: f883 202d strb.w r2, [r3, #45] ; 0x2d
  23088. xTaskCreate(request_task, ( char * ) "request_task", configMINIMAL_STACK_SIZE * 2, NULL, tskIDLE_PRIORITY, NULL);
  23089. 802984e: 2300 movs r3, #0
  23090. 8029850: 9300 str r3, [sp, #0]
  23091. 8029852: 9301 str r3, [sp, #4]
  23092. 8029854: 9302 str r3, [sp, #8]
  23093. 8029856: 9303 str r3, [sp, #12]
  23094. 8029858: f44f 7280 mov.w r2, #256 ; 0x100
  23095. 802985c: f001 fe8e bl 802b57c <xTaskGenericCreate>
  23096. }
  23097. 8029860: b005 add sp, #20
  23098. 8029862: bd00 pop {pc}
  23099. 8029864: 2000d7d8 .word 0x2000d7d8
  23100. 8029868: 080392db .word 0x080392db
  23101. 802986c: 08029709 .word 0x08029709
  23102. 08029870 <Reboot>:
  23103. #endif
  23104. #include <stddef.h>
  23105. #include "FreeRTOS.h"
  23106. #include "task.h"
  23107. void Reboot(void) {
  23108. 8029870: b508 push {r3, lr}
  23109. #ifndef BT6702_SERVICE
  23110. SNMP_SendUserTrap(DEVICE_REBOOTED);
  23111. 8029872: 2004 movs r0, #4
  23112. 8029874: f00e fa34 bl 8037ce0 <SNMP_SendUserTrap>
  23113. log_event_data(LOG_SYSTEM_BOOT, "Администратор");
  23114. 8029878: 490a ldr r1, [pc, #40] ; (80298a4 <Reboot+0x34>)
  23115. 802987a: 2000 movs r0, #0
  23116. 802987c: f000 fcf2 bl 802a264 <log_event_data>
  23117. vTaskDelay(1010);
  23118. 8029880: f240 30f2 movw r0, #1010 ; 0x3f2
  23119. 8029884: f002 f914 bl 802bab0 <vTaskDelay>
  23120. LOG_Disable();
  23121. 8029888: f000 fc0e bl 802a0a8 <LOG_Disable>
  23122. 802988c: f3bf 8f4f dsb sy
  23123. //static inline void NVIC_SystemReset(void)
  23124. {
  23125. __DSB(); /* Ensure all outstanding memory accesses included
  23126. buffered write are completed before reset */
  23127. SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) |
  23128. (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |
  23129. 8029890: 4a05 ldr r2, [pc, #20] ; (80298a8 <Reboot+0x38>)
  23130. 8029892: 4b06 ldr r3, [pc, #24] ; (80298ac <Reboot+0x3c>)
  23131. 8029894: 68d1 ldr r1, [r2, #12]
  23132. 8029896: f401 61e0 and.w r1, r1, #1792 ; 0x700
  23133. 802989a: 430b orrs r3, r1
  23134. __STATIC_INLINE void NVIC_SystemReset(void)
  23135. //static inline void NVIC_SystemReset(void)
  23136. {
  23137. __DSB(); /* Ensure all outstanding memory accesses included
  23138. buffered write are completed before reset */
  23139. SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) |
  23140. 802989c: 60d3 str r3, [r2, #12]
  23141. 802989e: f3bf 8f4f dsb sy
  23142. 80298a2: e7fe b.n 80298a2 <Reboot+0x32>
  23143. 80298a4: 0803928f .word 0x0803928f
  23144. 80298a8: e000ed00 .word 0xe000ed00
  23145. 80298ac: 05fa0004 .word 0x05fa0004
  23146. 080298b0 <rbuf32_init>:
  23147. #define _size_w(n) sizeof(n) / sizeof(int)
  23148. void rbuf32_init(rbuf_t *rbuf32, uint32_t *buffer, uint32_t size) {
  23149. rbuf32->buf_ptr = buffer;
  23150. rbuf32->size = size;
  23151. rbuf32->read_index = 0;
  23152. 80298b0: 2300 movs r3, #0
  23153. #define _size_w(n) sizeof(n) / sizeof(int)
  23154. void rbuf32_init(rbuf_t *rbuf32, uint32_t *buffer, uint32_t size) {
  23155. rbuf32->buf_ptr = buffer;
  23156. rbuf32->size = size;
  23157. 80298b2: e880 0006 stmia.w r0, {r1, r2}
  23158. rbuf32->read_index = 0;
  23159. 80298b6: 6083 str r3, [r0, #8]
  23160. rbuf32->write_index = 0;
  23161. 80298b8: 60c3 str r3, [r0, #12]
  23162. 80298ba: 4770 bx lr
  23163. 080298bc <rbuf_isfull>:
  23164. return full_space;
  23165. }
  23166. bool rbuf_isfull(rbuf_t *rbuf) {
  23167. int r_tmp;
  23168. if (rbuf->write_index == (rbuf->size - 1)) {
  23169. 80298bc: 6842 ldr r2, [r0, #4]
  23170. 80298be: 68c3 ldr r3, [r0, #12]
  23171. 80298c0: 6880 ldr r0, [r0, #8]
  23172. 80298c2: 1e51 subs r1, r2, #1
  23173. 80298c4: 428b cmp r3, r1
  23174. r_tmp = rbuf->read_index + rbuf->size;
  23175. 80298c6: bf08 it eq
  23176. 80298c8: 1810 addeq r0, r2, r0
  23177. }
  23178. else
  23179. r_tmp = rbuf->read_index;
  23180. if (r_tmp - rbuf->write_index == 1)
  23181. 80298ca: 1ac0 subs r0, r0, r3
  23182. return true;
  23183. else
  23184. return false;
  23185. }
  23186. 80298cc: 1e42 subs r2, r0, #1
  23187. 80298ce: 4250 negs r0, r2
  23188. 80298d0: 4150 adcs r0, r2
  23189. 80298d2: 4770 bx lr
  23190. 080298d4 <rbuf32_get>:
  23191. rbuf64->read_index = 0;
  23192. rbuf64->write_index = 0;
  23193. }
  23194. bool rbuf_isempty(rbuf_t *rbuf) {
  23195. if (rbuf->read_index == rbuf->write_index)
  23196. 80298d4: 6883 ldr r3, [r0, #8]
  23197. 80298d6: 68c2 ldr r2, [r0, #12]
  23198. 80298d8: 4293 cmp r3, r2
  23199. 80298da: d105 bne.n 80298e8 <rbuf32_get+0x14>
  23200. 80298dc: e002 b.n 80298e4 <rbuf32_get+0x10>
  23201. /* Check whether buffer is not empty */
  23202. if (!rbuf_isempty(rbuf32)) {
  23203. *data = rbuf32->buf_ptr[rbuf32->read_index++];
  23204. /* swap the read pointer */
  23205. if (rbuf32->read_index == (rbuf32->size))
  23206. rbuf32->read_index = 0;
  23207. 80298de: 2300 movs r3, #0
  23208. 80298e0: 6083 str r3, [r0, #8]
  23209. 80298e2: e00a b.n 80298fa <rbuf32_get+0x26>
  23210. return true;
  23211. }
  23212. else
  23213. return false;
  23214. 80298e4: 2000 movs r0, #0
  23215. 80298e6: 4770 bx lr
  23216. }
  23217. bool rbuf32_get(rbuf_t *rbuf32, uint32_t *data) {
  23218. /* Check whether buffer is not empty */
  23219. if (!rbuf_isempty(rbuf32)) {
  23220. *data = rbuf32->buf_ptr[rbuf32->read_index++];
  23221. 80298e8: 6802 ldr r2, [r0, #0]
  23222. 80298ea: f852 2023 ldr.w r2, [r2, r3, lsl #2]
  23223. 80298ee: 600a str r2, [r1, #0]
  23224. /* swap the read pointer */
  23225. if (rbuf32->read_index == (rbuf32->size))
  23226. 80298f0: 6842 ldr r2, [r0, #4]
  23227. }
  23228. bool rbuf32_get(rbuf_t *rbuf32, uint32_t *data) {
  23229. /* Check whether buffer is not empty */
  23230. if (!rbuf_isempty(rbuf32)) {
  23231. *data = rbuf32->buf_ptr[rbuf32->read_index++];
  23232. 80298f2: 3301 adds r3, #1
  23233. /* swap the read pointer */
  23234. if (rbuf32->read_index == (rbuf32->size))
  23235. 80298f4: 4293 cmp r3, r2
  23236. }
  23237. bool rbuf32_get(rbuf_t *rbuf32, uint32_t *data) {
  23238. /* Check whether buffer is not empty */
  23239. if (!rbuf_isempty(rbuf32)) {
  23240. *data = rbuf32->buf_ptr[rbuf32->read_index++];
  23241. 80298f6: 6083 str r3, [r0, #8]
  23242. /* swap the read pointer */
  23243. if (rbuf32->read_index == (rbuf32->size))
  23244. 80298f8: d0f1 beq.n 80298de <rbuf32_get+0xa>
  23245. rbuf32->read_index = 0;
  23246. return true;
  23247. 80298fa: 2001 movs r0, #1
  23248. }
  23249. else
  23250. return false;
  23251. }
  23252. 80298fc: 4770 bx lr
  23253. 080298fe <rbuf32_put>:
  23254. /*
  23255. * Oldest data is overwriting when write_ptr reaches read_ptr - 1 (!).
  23256. * For check use rbuf_isfull.
  23257. */
  23258. bool rbuf32_put(rbuf_t *rbuf32, uint32_t data) {
  23259. 80298fe: b538 push {r3, r4, r5, lr}
  23260. 8029900: 4604 mov r4, r0
  23261. 8029902: 460d mov r5, r1
  23262. if(!rbuf_isfull(rbuf32))
  23263. 8029904: f7ff ffda bl 80298bc <rbuf_isfull>
  23264. 8029908: b950 cbnz r0, 8029920 <rbuf32_put+0x22>
  23265. {
  23266. rbuf32->buf_ptr[rbuf32->write_index++] = data;
  23267. 802990a: 68e3 ldr r3, [r4, #12]
  23268. 802990c: 6822 ldr r2, [r4, #0]
  23269. 802990e: f842 5023 str.w r5, [r2, r3, lsl #2]
  23270. /* swap the write pointer */
  23271. if (rbuf32->write_index == (rbuf32->size))
  23272. 8029912: 6862 ldr r2, [r4, #4]
  23273. */
  23274. bool rbuf32_put(rbuf_t *rbuf32, uint32_t data) {
  23275. if(!rbuf_isfull(rbuf32))
  23276. {
  23277. rbuf32->buf_ptr[rbuf32->write_index++] = data;
  23278. 8029914: 3301 adds r3, #1
  23279. /* swap the write pointer */
  23280. if (rbuf32->write_index == (rbuf32->size))
  23281. 8029916: 4293 cmp r3, r2
  23282. */
  23283. bool rbuf32_put(rbuf_t *rbuf32, uint32_t data) {
  23284. if(!rbuf_isfull(rbuf32))
  23285. {
  23286. rbuf32->buf_ptr[rbuf32->write_index++] = data;
  23287. 8029918: 60e3 str r3, [r4, #12]
  23288. /* swap the write pointer */
  23289. if (rbuf32->write_index == (rbuf32->size))
  23290. 802991a: d103 bne.n 8029924 <rbuf32_put+0x26>
  23291. rbuf32->write_index = 0;
  23292. 802991c: 60e0 str r0, [r4, #12]
  23293. 802991e: e001 b.n 8029924 <rbuf32_put+0x26>
  23294. return true;
  23295. }
  23296. else
  23297. return false;
  23298. 8029920: 2000 movs r0, #0
  23299. 8029922: bd38 pop {r3, r4, r5, pc}
  23300. bool rbuf32_put(rbuf_t *rbuf32, uint32_t data) {
  23301. if(!rbuf_isfull(rbuf32))
  23302. {
  23303. rbuf32->buf_ptr[rbuf32->write_index++] = data;
  23304. /* swap the write pointer */
  23305. if (rbuf32->write_index == (rbuf32->size))
  23306. 8029924: 2001 movs r0, #1
  23307. rbuf32->write_index = 0;
  23308. return true;
  23309. }
  23310. else
  23311. return false;
  23312. }
  23313. 8029926: bd38 pop {r3, r4, r5, pc}
  23314. 08029928 <from_hex>:
  23315. #include <ctype.h>
  23316. #include <stdint.h>
  23317. /* Converts a hex character to its integer value */
  23318. char from_hex(char ch) {
  23319. return isdigit(ch) ? ch - '0' : tolower(ch) - 'a' + 10;
  23320. 8029928: 4b08 ldr r3, [pc, #32] ; (802994c <from_hex+0x24>)
  23321. 802992a: 681b ldr r3, [r3, #0]
  23322. 802992c: 181b adds r3, r3, r0
  23323. 802992e: 785b ldrb r3, [r3, #1]
  23324. 8029930: f003 0204 and.w r2, r3, #4
  23325. 8029934: b2d2 uxtb r2, r2
  23326. 8029936: b10a cbz r2, 802993c <from_hex+0x14>
  23327. 8029938: 3830 subs r0, #48 ; 0x30
  23328. 802993a: e005 b.n 8029948 <from_hex+0x20>
  23329. 802993c: f003 0303 and.w r3, r3, #3
  23330. 8029940: 2b01 cmp r3, #1
  23331. 8029942: bf08 it eq
  23332. 8029944: 3020 addeq r0, #32
  23333. 8029946: 3857 subs r0, #87 ; 0x57
  23334. 8029948: b2c0 uxtb r0, r0
  23335. }
  23336. 802994a: 4770 bx lr
  23337. 802994c: 20000000 .word 0x20000000
  23338. 08029950 <url_decode>:
  23339. return buf;
  23340. }
  23341. /* Returns a url-decoded version of str */
  23342. /* IMPORTANT: be sure that outbuf is big enougth */
  23343. char *url_decode(char *outbuf, uint32_t outlen, char *inbuf) {
  23344. 8029950: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
  23345. 8029954: 4607 mov r7, r0
  23346. 8029956: 460e mov r6, r1
  23347. char *pstr = inbuf, *buf = outbuf, *pbuf = buf;
  23348. 8029958: 4604 mov r4, r0
  23349. 802995a: 4615 mov r5, r2
  23350. if (pstr[1] && pstr[2]) {
  23351. *pbuf++ = from_hex(pstr[1]) << 4 | from_hex(pstr[2]);
  23352. pstr += 2;
  23353. }
  23354. } else if (*pstr == '+') {
  23355. *pbuf++ = ' ';
  23356. 802995c: f04f 0920 mov.w r9, #32
  23357. /* Returns a url-decoded version of str */
  23358. /* IMPORTANT: be sure that outbuf is big enougth */
  23359. char *url_decode(char *outbuf, uint32_t outlen, char *inbuf) {
  23360. char *pstr = inbuf, *buf = outbuf, *pbuf = buf;
  23361. while ((*pstr) && outlen > 1) {
  23362. 8029960: e01e b.n 80299a0 <url_decode+0x50>
  23363. if (*pstr == '%') {
  23364. 8029962: 2b25 cmp r3, #37 ; 0x25
  23365. 8029964: d112 bne.n 802998c <url_decode+0x3c>
  23366. if (pstr[1] && pstr[2]) {
  23367. 8029966: 7868 ldrb r0, [r5, #1]
  23368. 8029968: b1c0 cbz r0, 802999c <url_decode+0x4c>
  23369. 802996a: f895 8002 ldrb.w r8, [r5, #2]
  23370. 802996e: f1b8 0f00 cmp.w r8, #0
  23371. 8029972: d013 beq.n 802999c <url_decode+0x4c>
  23372. *pbuf++ = from_hex(pstr[1]) << 4 | from_hex(pstr[2]);
  23373. 8029974: f7ff ffd8 bl 8029928 <from_hex>
  23374. 8029978: 4682 mov sl, r0
  23375. 802997a: 4640 mov r0, r8
  23376. 802997c: f7ff ffd4 bl 8029928 <from_hex>
  23377. 8029980: ea40 100a orr.w r0, r0, sl, lsl #4
  23378. 8029984: f804 0b01 strb.w r0, [r4], #1
  23379. pstr += 2;
  23380. 8029988: 3502 adds r5, #2
  23381. 802998a: e007 b.n 802999c <url_decode+0x4c>
  23382. }
  23383. } else if (*pstr == '+') {
  23384. 802998c: 2b2b cmp r3, #43 ; 0x2b
  23385. 802998e: f104 0201 add.w r2, r4, #1
  23386. *pbuf++ = ' ';
  23387. 8029992: bf0c ite eq
  23388. 8029994: f884 9000 strbeq.w r9, [r4]
  23389. } else {
  23390. *pbuf++ = *pstr;
  23391. 8029998: 7023 strbne r3, [r4, #0]
  23392. 802999a: 4614 mov r4, r2
  23393. }
  23394. pstr++;
  23395. 802999c: 3501 adds r5, #1
  23396. outlen--;
  23397. 802999e: 3e01 subs r6, #1
  23398. /* Returns a url-decoded version of str */
  23399. /* IMPORTANT: be sure that outbuf is big enougth */
  23400. char *url_decode(char *outbuf, uint32_t outlen, char *inbuf) {
  23401. char *pstr = inbuf, *buf = outbuf, *pbuf = buf;
  23402. while ((*pstr) && outlen > 1) {
  23403. 80299a0: 782b ldrb r3, [r5, #0]
  23404. 80299a2: b10b cbz r3, 80299a8 <url_decode+0x58>
  23405. 80299a4: 2e01 cmp r6, #1
  23406. 80299a6: d8dc bhi.n 8029962 <url_decode+0x12>
  23407. *pbuf++ = *pstr;
  23408. }
  23409. pstr++;
  23410. outlen--;
  23411. }
  23412. *pbuf = '\0';
  23413. 80299a8: 2300 movs r3, #0
  23414. 80299aa: 7023 strb r3, [r4, #0]
  23415. return buf;
  23416. }
  23417. 80299ac: 4638 mov r0, r7
  23418. 80299ae: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc}
  23419. 80299b2: 0000 movs r0, r0
  23420. 080299b4 <UPS_DI0Monitor>:
  23421. /**
  23422. * @brief Мониторинг бита DI0 state
  23423. */
  23424. void UPS_DI0Monitor(void)
  23425. {
  23426. 80299b4: b538 push {r3, r4, r5, lr}
  23427. static bool isValueRecv = false;
  23428. static uint8_t DI0OldState = 0;
  23429. uint8_t DI0StateCurrent;
  23430. DI0StateCurrent = get_state_din_outs(DIN1) ^ sSettings.sInOuts.din_type_act[0];
  23431. 80299b6: 2008 movs r0, #8
  23432. 80299b8: f7ff fc65 bl 8029286 <get_state_din_outs>
  23433. 80299bc: 4b1c ldr r3, [pc, #112] ; (8029a30 <UPS_DI0Monitor+0x7c>)
  23434. 80299be: f893 4376 ldrb.w r4, [r3, #886] ; 0x376
  23435. UPS.Alarm = (UPS.Alarm & 0x0f) | ((DI0StateCurrent^1) << 4);
  23436. 80299c2: 4b1c ldr r3, [pc, #112] ; (8029a34 <UPS_DI0Monitor+0x80>)
  23437. {
  23438. static bool isValueRecv = false;
  23439. static uint8_t DI0OldState = 0;
  23440. uint8_t DI0StateCurrent;
  23441. DI0StateCurrent = get_state_din_outs(DIN1) ^ sSettings.sInOuts.din_type_act[0];
  23442. 80299c4: 4060 eors r0, r4
  23443. UPS.Alarm = (UPS.Alarm & 0x0f) | ((DI0StateCurrent^1) << 4);
  23444. 80299c6: 7d1a ldrb r2, [r3, #20]
  23445. {
  23446. static bool isValueRecv = false;
  23447. static uint8_t DI0OldState = 0;
  23448. uint8_t DI0StateCurrent;
  23449. DI0StateCurrent = get_state_din_outs(DIN1) ^ sSettings.sInOuts.din_type_act[0];
  23450. 80299c8: b2c4 uxtb r4, r0
  23451. UPS.Alarm = (UPS.Alarm & 0x0f) | ((DI0StateCurrent^1) << 4);
  23452. 80299ca: f084 0101 eor.w r1, r4, #1
  23453. 80299ce: f002 020f and.w r2, r2, #15
  23454. 80299d2: ea42 1201 orr.w r2, r2, r1, lsl #4
  23455. 80299d6: 751a strb r2, [r3, #20]
  23456. if (!isValueRecv) {
  23457. 80299d8: 4a17 ldr r2, [pc, #92] ; (8029a38 <UPS_DI0Monitor+0x84>)
  23458. 80299da: 4b18 ldr r3, [pc, #96] ; (8029a3c <UPS_DI0Monitor+0x88>)
  23459. 80299dc: 7811 ldrb r1, [r2, #0]
  23460. 80299de: b969 cbnz r1, 80299fc <UPS_DI0Monitor+0x48>
  23461. isValueRecv = true;
  23462. 80299e0: 2501 movs r5, #1
  23463. 80299e2: 7015 strb r5, [r2, #0]
  23464. DI0OldState = DI0StateCurrent;
  23465. 80299e4: 701c strb r4, [r3, #0]
  23466. if (!DI0StateCurrent){
  23467. 80299e6: bb14 cbnz r4, 8029a2e <UPS_DI0Monitor+0x7a>
  23468. log_event_data(LOG_ALARM_DIO, "Авария");
  23469. 80299e8: 2008 movs r0, #8
  23470. 80299ea: 4915 ldr r1, [pc, #84] ; (8029a40 <UPS_DI0Monitor+0x8c>)
  23471. 80299ec: f000 fc3a bl 802a264 <log_event_data>
  23472. SNMP_SendUserTrap(DI0_ALARM);
  23473. 80299f0: 2006 movs r0, #6
  23474. 80299f2: f00e f975 bl 8037ce0 <SNMP_SendUserTrap>
  23475. flUpdateLog = true;
  23476. 80299f6: 4b13 ldr r3, [pc, #76] ; (8029a44 <UPS_DI0Monitor+0x90>)
  23477. 80299f8: 701d strb r5, [r3, #0]
  23478. 80299fa: bd38 pop {r3, r4, r5, pc}
  23479. }
  23480. return;
  23481. }
  23482. if (!DI0StateCurrent)
  23483. 80299fc: b914 cbnz r4, 8029a04 <UPS_DI0Monitor+0x50>
  23484. flCriticalAlarm = true;
  23485. 80299fe: 4a12 ldr r2, [pc, #72] ; (8029a48 <UPS_DI0Monitor+0x94>)
  23486. 8029a00: 2101 movs r1, #1
  23487. 8029a02: 7011 strb r1, [r2, #0]
  23488. // Значение параметра изменилось
  23489. if (DI0StateCurrent != DI0OldState)
  23490. 8029a04: 781b ldrb r3, [r3, #0]
  23491. 8029a06: 42a3 cmp r3, r4
  23492. 8029a08: d00f beq.n 8029a2a <UPS_DI0Monitor+0x76>
  23493. 8029a0a: 4d0e ldr r5, [pc, #56] ; (8029a44 <UPS_DI0Monitor+0x90>)
  23494. {
  23495. if (DI0StateCurrent){
  23496. log_event_data(LOG_ALARM_DIO, "Норма");
  23497. 8029a0c: 2008 movs r0, #8
  23498. // Значение параметра изменилось
  23499. if (DI0StateCurrent != DI0OldState)
  23500. {
  23501. if (DI0StateCurrent){
  23502. 8029a0e: b124 cbz r4, 8029a1a <UPS_DI0Monitor+0x66>
  23503. log_event_data(LOG_ALARM_DIO, "Норма");
  23504. 8029a10: 490e ldr r1, [pc, #56] ; (8029a4c <UPS_DI0Monitor+0x98>)
  23505. 8029a12: f000 fc27 bl 802a264 <log_event_data>
  23506. SNMP_SendUserTrap(DI0_NORM);
  23507. 8029a16: 2005 movs r0, #5
  23508. 8029a18: e003 b.n 8029a22 <UPS_DI0Monitor+0x6e>
  23509. flUpdateLog = true;
  23510. }
  23511. else{
  23512. log_event_data(LOG_ALARM_DIO, "Авария");
  23513. 8029a1a: 4909 ldr r1, [pc, #36] ; (8029a40 <UPS_DI0Monitor+0x8c>)
  23514. 8029a1c: f000 fc22 bl 802a264 <log_event_data>
  23515. SNMP_SendUserTrap(DI0_ALARM);
  23516. 8029a20: 2006 movs r0, #6
  23517. 8029a22: f00e f95d bl 8037ce0 <SNMP_SendUserTrap>
  23518. flUpdateLog = true;
  23519. 8029a26: 2301 movs r3, #1
  23520. 8029a28: 702b strb r3, [r5, #0]
  23521. }
  23522. }
  23523. DI0OldState = DI0StateCurrent;
  23524. 8029a2a: 4b04 ldr r3, [pc, #16] ; (8029a3c <UPS_DI0Monitor+0x88>)
  23525. 8029a2c: 701c strb r4, [r3, #0]
  23526. 8029a2e: bd38 pop {r3, r4, r5, pc}
  23527. 8029a30: 2000d414 .word 0x2000d414
  23528. 8029a34: 2000d7d8 .word 0x2000d7d8
  23529. 8029a38: 20000b95 .word 0x20000b95
  23530. 8029a3c: 20000b93 .word 0x20000b93
  23531. 8029a40: 0803930a .word 0x0803930a
  23532. 8029a44: 20000bfc .word 0x20000bfc
  23533. 8029a48: 20000b98 .word 0x20000b98
  23534. 8029a4c: 08039317 .word 0x08039317
  23535. 08029a50 <UPS_CriticalAlarmMonitor>:
  23536. /**
  23537. * @brief Мониторинг бита CriticalAlarm
  23538. */
  23539. void UPS_CriticalAlarmMonitor(void)
  23540. {
  23541. 8029a50: b5f0 push {r4, r5, r6, r7, lr}
  23542. 8029a52: b089 sub sp, #36 ; 0x24
  23543. static uint8_t OldRO2type_Sourse = 0;
  23544. uint8_t CurrRO2type_Sourse = 0;
  23545. uint8_t CurrRO1type_Sourse = 0;
  23546. char str[30];
  23547. memset(str, 0, 30);
  23548. 8029a54: 2100 movs r1, #0
  23549. 8029a56: 4668 mov r0, sp
  23550. 8029a58: 221e movs r2, #30
  23551. 8029a5a: f7f8 f9dd bl 8021e18 <memset>
  23552. CurrRO1type_Sourse = sSettings.sInOuts.ro_type_source[0];
  23553. 8029a5e: 4b45 ldr r3, [pc, #276] ; (8029b74 <UPS_CriticalAlarmMonitor+0x124>)
  23554. 8029a60: f893 5374 ldrb.w r5, [r3, #884] ; 0x374
  23555. CurrRO2type_Sourse = sSettings.sInOuts.ro_type_source[1];
  23556. 8029a64: f893 7375 ldrb.w r7, [r3, #885] ; 0x375
  23557. CriticalAlarmCurrent = flCriticalAlarm;
  23558. 8029a68: 4b43 ldr r3, [pc, #268] ; (8029b78 <UPS_CriticalAlarmMonitor+0x128>)
  23559. 8029a6a: 781c ldrb r4, [r3, #0]
  23560. if (!isValueRecv) {
  23561. 8029a6c: 4b43 ldr r3, [pc, #268] ; (8029b7c <UPS_CriticalAlarmMonitor+0x12c>)
  23562. 8029a6e: 7819 ldrb r1, [r3, #0]
  23563. 8029a70: bb29 cbnz r1, 8029abe <UPS_CriticalAlarmMonitor+0x6e>
  23564. isValueRecv = true;
  23565. 8029a72: 2201 movs r2, #1
  23566. 8029a74: 701a strb r2, [r3, #0]
  23567. CriticalAlarmOldState = CriticalAlarmCurrent;
  23568. 8029a76: 4b42 ldr r3, [pc, #264] ; (8029b80 <UPS_CriticalAlarmMonitor+0x130>)
  23569. 8029a78: 701c strb r4, [r3, #0]
  23570. OldRO0type_Sourse = CurrRO1type_Sourse;
  23571. 8029a7a: 4b42 ldr r3, [pc, #264] ; (8029b84 <UPS_CriticalAlarmMonitor+0x134>)
  23572. 8029a7c: 701d strb r5, [r3, #0]
  23573. OldRO2type_Sourse = CurrRO2type_Sourse;
  23574. 8029a7e: 4b42 ldr r3, [pc, #264] ; (8029b88 <UPS_CriticalAlarmMonitor+0x138>)
  23575. if(OldRO0type_Sourse == CRITICAL){
  23576. 8029a80: 4295 cmp r5, r2
  23577. if (!isValueRecv) {
  23578. isValueRecv = true;
  23579. CriticalAlarmOldState = CriticalAlarmCurrent;
  23580. OldRO0type_Sourse = CurrRO1type_Sourse;
  23581. OldRO2type_Sourse = CurrRO2type_Sourse;
  23582. 8029a82: 701f strb r7, [r3, #0]
  23583. if(OldRO0type_Sourse == CRITICAL){
  23584. 8029a84: d10a bne.n 8029a9c <UPS_CriticalAlarmMonitor+0x4c>
  23585. if(CriticalAlarmCurrent){
  23586. 8029a86: b14c cbz r4, 8029a9c <UPS_CriticalAlarmMonitor+0x4c>
  23587. SetROInt(1, 0);
  23588. 8029a88: 4628 mov r0, r5
  23589. 8029a8a: f7fe ff7f bl 802898c <SetROInt>
  23590. SNMP_SendUserTrap(DO0_TOGGLED);
  23591. 8029a8e: 2007 movs r0, #7
  23592. 8029a90: f00e f926 bl 8037ce0 <SNMP_SendUserTrap>
  23593. log_event_data(LOG_DO0_STATE, "Замкнуто");
  23594. 8029a94: 2009 movs r0, #9
  23595. 8029a96: 493d ldr r1, [pc, #244] ; (8029b8c <UPS_CriticalAlarmMonitor+0x13c>)
  23596. 8029a98: f000 fbe4 bl 802a264 <log_event_data>
  23597. }
  23598. }
  23599. if(OldRO2type_Sourse == CRITICAL){
  23600. 8029a9c: 4b3a ldr r3, [pc, #232] ; (8029b88 <UPS_CriticalAlarmMonitor+0x138>)
  23601. 8029a9e: 7818 ldrb r0, [r3, #0]
  23602. 8029aa0: 2801 cmp r0, #1
  23603. 8029aa2: d165 bne.n 8029b70 <UPS_CriticalAlarmMonitor+0x120>
  23604. if(CriticalAlarmCurrent){
  23605. 8029aa4: 2c00 cmp r4, #0
  23606. 8029aa6: d063 beq.n 8029b70 <UPS_CriticalAlarmMonitor+0x120>
  23607. SetROInt(1, 1);
  23608. 8029aa8: 4601 mov r1, r0
  23609. 8029aaa: f7fe ff6f bl 802898c <SetROInt>
  23610. SNMP_SendUserTrap(DO1_TOGGLED);
  23611. 8029aae: 2008 movs r0, #8
  23612. 8029ab0: f00e f916 bl 8037ce0 <SNMP_SendUserTrap>
  23613. log_event_data(LOG_DO1_STATE, "Замкнуто");
  23614. 8029ab4: 200a movs r0, #10
  23615. 8029ab6: 4935 ldr r1, [pc, #212] ; (8029b8c <UPS_CriticalAlarmMonitor+0x13c>)
  23616. 8029ab8: f000 fbd4 bl 802a264 <log_event_data>
  23617. 8029abc: e058 b.n 8029b70 <UPS_CriticalAlarmMonitor+0x120>
  23618. }
  23619. }
  23620. return;
  23621. }
  23622. if(CriticalAlarmCurrent){
  23623. 8029abe: b154 cbz r4, 8029ad6 <UPS_CriticalAlarmMonitor+0x86>
  23624. if (UPS.Present)
  23625. 8029ac0: 4b33 ldr r3, [pc, #204] ; (8029b90 <UPS_CriticalAlarmMonitor+0x140>)
  23626. 8029ac2: f893 302d ldrb.w r3, [r3, #45] ; 0x2d
  23627. LED_Toggle(LED_MAJOR_R);
  23628. 8029ac6: 200d movs r0, #13
  23629. }
  23630. return;
  23631. }
  23632. if(CriticalAlarmCurrent){
  23633. if (UPS.Present)
  23634. 8029ac8: b113 cbz r3, 8029ad0 <UPS_CriticalAlarmMonitor+0x80>
  23635. LED_Toggle(LED_MAJOR_R);
  23636. 8029aca: f7ff fb69 bl 80291a0 <LED_Toggle>
  23637. 8029ace: e005 b.n 8029adc <UPS_CriticalAlarmMonitor+0x8c>
  23638. else
  23639. LED_On(LED_MAJOR_R);
  23640. 8029ad0: f7ff fb2c bl 802912c <LED_On>
  23641. 8029ad4: e002 b.n 8029adc <UPS_CriticalAlarmMonitor+0x8c>
  23642. }
  23643. else{
  23644. LED_Off(LED_MAJOR_R);
  23645. 8029ad6: 200d movs r0, #13
  23646. 8029ad8: f7ff fb2b bl 8029132 <LED_Off>
  23647. }
  23648. // Значение параметра изменилось
  23649. if (CriticalAlarmCurrent != CriticalAlarmOldState)
  23650. 8029adc: 4b28 ldr r3, [pc, #160] ; (8029b80 <UPS_CriticalAlarmMonitor+0x130>)
  23651. 8029ade: 781b ldrb r3, [r3, #0]
  23652. 8029ae0: 42a3 cmp r3, r4
  23653. 8029ae2: d03f beq.n 8029b64 <UPS_CriticalAlarmMonitor+0x114>
  23654. {
  23655. if(OldRO0type_Sourse == CRITICAL){
  23656. 8029ae4: 4b27 ldr r3, [pc, #156] ; (8029b84 <UPS_CriticalAlarmMonitor+0x134>)
  23657. 8029ae6: 781e ldrb r6, [r3, #0]
  23658. 8029ae8: 2e01 cmp r6, #1
  23659. 8029aea: d11b bne.n 8029b24 <UPS_CriticalAlarmMonitor+0xd4>
  23660. memset(str, 0, 30);
  23661. 8029aec: 4668 mov r0, sp
  23662. 8029aee: 2100 movs r1, #0
  23663. 8029af0: 221e movs r2, #30
  23664. 8029af2: f7f8 f991 bl 8021e18 <memset>
  23665. if(CriticalAlarmCurrent){
  23666. 8029af6: b134 cbz r4, 8029b06 <UPS_CriticalAlarmMonitor+0xb6>
  23667. SetROInt(1, 0);
  23668. 8029af8: 4630 mov r0, r6
  23669. 8029afa: 2100 movs r1, #0
  23670. 8029afc: f7fe ff46 bl 802898c <SetROInt>
  23671. strcat(str, "Замкнуто");
  23672. 8029b00: 4668 mov r0, sp
  23673. 8029b02: 4922 ldr r1, [pc, #136] ; (8029b8c <UPS_CriticalAlarmMonitor+0x13c>)
  23674. 8029b04: e005 b.n 8029b12 <UPS_CriticalAlarmMonitor+0xc2>
  23675. }
  23676. else{
  23677. SetROInt(0, 0);
  23678. 8029b06: 4620 mov r0, r4
  23679. 8029b08: 4621 mov r1, r4
  23680. 8029b0a: f7fe ff3f bl 802898c <SetROInt>
  23681. strcat(str, "Разомкнуто");
  23682. 8029b0e: 4921 ldr r1, [pc, #132] ; (8029b94 <UPS_CriticalAlarmMonitor+0x144>)
  23683. 8029b10: 4668 mov r0, sp
  23684. 8029b12: f7f8 f9e7 bl 8021ee4 <strcat>
  23685. }
  23686. SNMP_SendUserTrap(DO0_TOGGLED);
  23687. 8029b16: 2007 movs r0, #7
  23688. 8029b18: f00e f8e2 bl 8037ce0 <SNMP_SendUserTrap>
  23689. log_event_data(LOG_DO0_STATE, str);
  23690. 8029b1c: 2009 movs r0, #9
  23691. 8029b1e: 4669 mov r1, sp
  23692. 8029b20: f000 fba0 bl 802a264 <log_event_data>
  23693. }
  23694. if(OldRO2type_Sourse == CRITICAL){
  23695. 8029b24: 4b18 ldr r3, [pc, #96] ; (8029b88 <UPS_CriticalAlarmMonitor+0x138>)
  23696. 8029b26: 781e ldrb r6, [r3, #0]
  23697. 8029b28: 2e01 cmp r6, #1
  23698. 8029b2a: d11b bne.n 8029b64 <UPS_CriticalAlarmMonitor+0x114>
  23699. memset(str, 0, 30);
  23700. 8029b2c: 4668 mov r0, sp
  23701. 8029b2e: 2100 movs r1, #0
  23702. 8029b30: 221e movs r2, #30
  23703. 8029b32: f7f8 f971 bl 8021e18 <memset>
  23704. if(CriticalAlarmCurrent){
  23705. 8029b36: b134 cbz r4, 8029b46 <UPS_CriticalAlarmMonitor+0xf6>
  23706. SetROInt(1, 1);
  23707. 8029b38: 4630 mov r0, r6
  23708. 8029b3a: 4631 mov r1, r6
  23709. 8029b3c: f7fe ff26 bl 802898c <SetROInt>
  23710. strcat(str, "Замкнуто");
  23711. 8029b40: 4668 mov r0, sp
  23712. 8029b42: 4912 ldr r1, [pc, #72] ; (8029b8c <UPS_CriticalAlarmMonitor+0x13c>)
  23713. 8029b44: e005 b.n 8029b52 <UPS_CriticalAlarmMonitor+0x102>
  23714. }
  23715. else{
  23716. SetROInt(0, 1);
  23717. 8029b46: 4620 mov r0, r4
  23718. 8029b48: 4631 mov r1, r6
  23719. 8029b4a: f7fe ff1f bl 802898c <SetROInt>
  23720. strcat(str, "Разомкнуто");
  23721. 8029b4e: 4911 ldr r1, [pc, #68] ; (8029b94 <UPS_CriticalAlarmMonitor+0x144>)
  23722. 8029b50: 4668 mov r0, sp
  23723. 8029b52: f7f8 f9c7 bl 8021ee4 <strcat>
  23724. }
  23725. SNMP_SendUserTrap(DO1_TOGGLED);
  23726. 8029b56: 2008 movs r0, #8
  23727. 8029b58: f00e f8c2 bl 8037ce0 <SNMP_SendUserTrap>
  23728. log_event_data(LOG_DO1_STATE, str);
  23729. 8029b5c: 200a movs r0, #10
  23730. 8029b5e: 4669 mov r1, sp
  23731. 8029b60: f000 fb80 bl 802a264 <log_event_data>
  23732. SNMP_SendUserTrap(DO1_TOGGLED);
  23733. log_event_data(LOG_DO1_STATE, str);
  23734. }
  23735. }
  23736. OldRO0type_Sourse = CurrRO1type_Sourse;
  23737. 8029b64: 4b07 ldr r3, [pc, #28] ; (8029b84 <UPS_CriticalAlarmMonitor+0x134>)
  23738. 8029b66: 701d strb r5, [r3, #0]
  23739. OldRO2type_Sourse = CurrRO2type_Sourse;
  23740. 8029b68: 4b07 ldr r3, [pc, #28] ; (8029b88 <UPS_CriticalAlarmMonitor+0x138>)
  23741. 8029b6a: 701f strb r7, [r3, #0]
  23742. CriticalAlarmOldState = CriticalAlarmCurrent;
  23743. 8029b6c: 4b04 ldr r3, [pc, #16] ; (8029b80 <UPS_CriticalAlarmMonitor+0x130>)
  23744. 8029b6e: 701c strb r4, [r3, #0]
  23745. }
  23746. 8029b70: b009 add sp, #36 ; 0x24
  23747. 8029b72: bdf0 pop {r4, r5, r6, r7, pc}
  23748. 8029b74: 2000d414 .word 0x2000d414
  23749. 8029b78: 20000b98 .word 0x20000b98
  23750. 8029b7c: 20000b9a .word 0x20000b9a
  23751. 8029b80: 20000b9c .word 0x20000b9c
  23752. 8029b84: 20000b8e .word 0x20000b8e
  23753. 8029b88: 20000b92 .word 0x20000b92
  23754. 8029b8c: 08039322 .word 0x08039322
  23755. 8029b90: 2000d7d8 .word 0x2000d7d8
  23756. 8029b94: 08039333 .word 0x08039333
  23757. 08029b98 <UPS_NonCriticalAlarmMonitor>:
  23758. /**
  23759. * @brief Мониторинг бита NonCriticalAlarm
  23760. */
  23761. void UPS_NonCriticalAlarmMonitor(void)
  23762. {
  23763. 8029b98: b5f0 push {r4, r5, r6, r7, lr}
  23764. 8029b9a: b089 sub sp, #36 ; 0x24
  23765. static uint8_t OldRO0type_Sourse = 0;
  23766. static uint8_t OldRO2type_Sourse = 0;
  23767. uint8_t CurrRO2type_Sourse = 0;
  23768. uint8_t CurrRO1type_Sourse = 0;
  23769. char str[30];
  23770. memset(str, 0, 30);
  23771. 8029b9c: 2100 movs r1, #0
  23772. 8029b9e: 221e movs r2, #30
  23773. 8029ba0: 4668 mov r0, sp
  23774. 8029ba2: f7f8 f939 bl 8021e18 <memset>
  23775. CurrRO1type_Sourse = sSettings.sInOuts.ro_type_source[0];
  23776. CurrRO2type_Sourse = sSettings.sInOuts.ro_type_source[1];
  23777. NonCriticalAlarmCurrent = flNonCriticalAlarm;
  23778. if (!isValueRecv) {
  23779. 8029ba6: 4f3d ldr r7, [pc, #244] ; (8029c9c <UPS_NonCriticalAlarmMonitor+0x104>)
  23780. uint8_t CurrRO2type_Sourse = 0;
  23781. uint8_t CurrRO1type_Sourse = 0;
  23782. char str[30];
  23783. memset(str, 0, 30);
  23784. CurrRO1type_Sourse = sSettings.sInOuts.ro_type_source[0];
  23785. 8029ba8: 4b3d ldr r3, [pc, #244] ; (8029ca0 <UPS_NonCriticalAlarmMonitor+0x108>)
  23786. CurrRO2type_Sourse = sSettings.sInOuts.ro_type_source[1];
  23787. NonCriticalAlarmCurrent = flNonCriticalAlarm;
  23788. if (!isValueRecv) {
  23789. 8029baa: 7839 ldrb r1, [r7, #0]
  23790. uint8_t CurrRO2type_Sourse = 0;
  23791. uint8_t CurrRO1type_Sourse = 0;
  23792. char str[30];
  23793. memset(str, 0, 30);
  23794. CurrRO1type_Sourse = sSettings.sInOuts.ro_type_source[0];
  23795. 8029bac: f893 5374 ldrb.w r5, [r3, #884] ; 0x374
  23796. CurrRO2type_Sourse = sSettings.sInOuts.ro_type_source[1];
  23797. 8029bb0: f893 6375 ldrb.w r6, [r3, #885] ; 0x375
  23798. NonCriticalAlarmCurrent = flNonCriticalAlarm;
  23799. 8029bb4: 4b3b ldr r3, [pc, #236] ; (8029ca4 <UPS_NonCriticalAlarmMonitor+0x10c>)
  23800. 8029bb6: 4a3c ldr r2, [pc, #240] ; (8029ca8 <UPS_NonCriticalAlarmMonitor+0x110>)
  23801. 8029bb8: 781c ldrb r4, [r3, #0]
  23802. 8029bba: 4b3c ldr r3, [pc, #240] ; (8029cac <UPS_NonCriticalAlarmMonitor+0x114>)
  23803. if (!isValueRecv) {
  23804. 8029bbc: bb19 cbnz r1, 8029c06 <UPS_NonCriticalAlarmMonitor+0x6e>
  23805. isValueRecv = true;
  23806. NonCriticalAlarmOldState = NonCriticalAlarmCurrent;
  23807. OldRO0type_Sourse = CurrRO1type_Sourse;
  23808. 8029bbe: 701d strb r5, [r3, #0]
  23809. OldRO2type_Sourse = CurrRO2type_Sourse;
  23810. 8029bc0: 4b3b ldr r3, [pc, #236] ; (8029cb0 <UPS_NonCriticalAlarmMonitor+0x118>)
  23811. CurrRO2type_Sourse = sSettings.sInOuts.ro_type_source[1];
  23812. NonCriticalAlarmCurrent = flNonCriticalAlarm;
  23813. if (!isValueRecv) {
  23814. isValueRecv = true;
  23815. NonCriticalAlarmOldState = NonCriticalAlarmCurrent;
  23816. 8029bc2: 7014 strb r4, [r2, #0]
  23817. CurrRO1type_Sourse = sSettings.sInOuts.ro_type_source[0];
  23818. CurrRO2type_Sourse = sSettings.sInOuts.ro_type_source[1];
  23819. NonCriticalAlarmCurrent = flNonCriticalAlarm;
  23820. if (!isValueRecv) {
  23821. isValueRecv = true;
  23822. 8029bc4: 2001 movs r0, #1
  23823. NonCriticalAlarmOldState = NonCriticalAlarmCurrent;
  23824. OldRO0type_Sourse = CurrRO1type_Sourse;
  23825. OldRO2type_Sourse = CurrRO2type_Sourse;
  23826. if(OldRO0type_Sourse == NON_CRITICAL){
  23827. 8029bc6: 2d02 cmp r5, #2
  23828. CurrRO1type_Sourse = sSettings.sInOuts.ro_type_source[0];
  23829. CurrRO2type_Sourse = sSettings.sInOuts.ro_type_source[1];
  23830. NonCriticalAlarmCurrent = flNonCriticalAlarm;
  23831. if (!isValueRecv) {
  23832. isValueRecv = true;
  23833. 8029bc8: 7038 strb r0, [r7, #0]
  23834. NonCriticalAlarmOldState = NonCriticalAlarmCurrent;
  23835. OldRO0type_Sourse = CurrRO1type_Sourse;
  23836. OldRO2type_Sourse = CurrRO2type_Sourse;
  23837. 8029bca: 701e strb r6, [r3, #0]
  23838. if(OldRO0type_Sourse == NON_CRITICAL){
  23839. 8029bcc: d109 bne.n 8029be2 <UPS_NonCriticalAlarmMonitor+0x4a>
  23840. if(NonCriticalAlarmCurrent){
  23841. 8029bce: b144 cbz r4, 8029be2 <UPS_NonCriticalAlarmMonitor+0x4a>
  23842. SetROInt(1, 0);
  23843. 8029bd0: f7fe fedc bl 802898c <SetROInt>
  23844. SNMP_SendUserTrap(DO0_TOGGLED);
  23845. 8029bd4: 2007 movs r0, #7
  23846. 8029bd6: f00e f883 bl 8037ce0 <SNMP_SendUserTrap>
  23847. log_event_data(LOG_DO0_STATE, "Замкнуто");
  23848. 8029bda: 2009 movs r0, #9
  23849. 8029bdc: 4935 ldr r1, [pc, #212] ; (8029cb4 <UPS_NonCriticalAlarmMonitor+0x11c>)
  23850. 8029bde: f000 fb41 bl 802a264 <log_event_data>
  23851. }
  23852. }
  23853. if(OldRO2type_Sourse == NON_CRITICAL){
  23854. 8029be2: 4b33 ldr r3, [pc, #204] ; (8029cb0 <UPS_NonCriticalAlarmMonitor+0x118>)
  23855. 8029be4: 781b ldrb r3, [r3, #0]
  23856. 8029be6: 2b02 cmp r3, #2
  23857. 8029be8: d155 bne.n 8029c96 <UPS_NonCriticalAlarmMonitor+0xfe>
  23858. if(NonCriticalAlarmCurrent){
  23859. 8029bea: 2c00 cmp r4, #0
  23860. 8029bec: d053 beq.n 8029c96 <UPS_NonCriticalAlarmMonitor+0xfe>
  23861. SetROInt(1, 1);
  23862. 8029bee: 2001 movs r0, #1
  23863. 8029bf0: 4601 mov r1, r0
  23864. 8029bf2: f7fe fecb bl 802898c <SetROInt>
  23865. SNMP_SendUserTrap(DO1_TOGGLED);
  23866. 8029bf6: 2008 movs r0, #8
  23867. 8029bf8: f00e f872 bl 8037ce0 <SNMP_SendUserTrap>
  23868. log_event_data(LOG_DO1_STATE, "Замкнуто");
  23869. 8029bfc: 200a movs r0, #10
  23870. 8029bfe: 492d ldr r1, [pc, #180] ; (8029cb4 <UPS_NonCriticalAlarmMonitor+0x11c>)
  23871. 8029c00: f000 fb30 bl 802a264 <log_event_data>
  23872. 8029c04: e047 b.n 8029c96 <UPS_NonCriticalAlarmMonitor+0xfe>
  23873. }
  23874. return;
  23875. }
  23876. // Значение параметра изменилось
  23877. if (NonCriticalAlarmCurrent != NonCriticalAlarmOldState)
  23878. 8029c06: 7812 ldrb r2, [r2, #0]
  23879. 8029c08: 42a2 cmp r2, r4
  23880. 8029c0a: d03e beq.n 8029c8a <UPS_NonCriticalAlarmMonitor+0xf2>
  23881. {
  23882. if(OldRO0type_Sourse == NON_CRITICAL){
  23883. 8029c0c: 781b ldrb r3, [r3, #0]
  23884. 8029c0e: 2b02 cmp r3, #2
  23885. 8029c10: d11b bne.n 8029c4a <UPS_NonCriticalAlarmMonitor+0xb2>
  23886. memset(str, 0, 30);
  23887. 8029c12: 4668 mov r0, sp
  23888. 8029c14: 2100 movs r1, #0
  23889. 8029c16: 221e movs r2, #30
  23890. 8029c18: f7f8 f8fe bl 8021e18 <memset>
  23891. if(NonCriticalAlarmCurrent){
  23892. 8029c1c: b134 cbz r4, 8029c2c <UPS_NonCriticalAlarmMonitor+0x94>
  23893. SetROInt(1, 0);
  23894. 8029c1e: 2001 movs r0, #1
  23895. 8029c20: 2100 movs r1, #0
  23896. 8029c22: f7fe feb3 bl 802898c <SetROInt>
  23897. strcat(str, "Замкнуто");
  23898. 8029c26: 4668 mov r0, sp
  23899. 8029c28: 4922 ldr r1, [pc, #136] ; (8029cb4 <UPS_NonCriticalAlarmMonitor+0x11c>)
  23900. 8029c2a: e005 b.n 8029c38 <UPS_NonCriticalAlarmMonitor+0xa0>
  23901. }
  23902. else{
  23903. SetROInt(0, 0);
  23904. 8029c2c: 4620 mov r0, r4
  23905. 8029c2e: 4621 mov r1, r4
  23906. 8029c30: f7fe feac bl 802898c <SetROInt>
  23907. strcat(str, "Разомкнуто");
  23908. 8029c34: 4920 ldr r1, [pc, #128] ; (8029cb8 <UPS_NonCriticalAlarmMonitor+0x120>)
  23909. 8029c36: 4668 mov r0, sp
  23910. 8029c38: f7f8 f954 bl 8021ee4 <strcat>
  23911. }
  23912. SNMP_SendUserTrap(DO0_TOGGLED);
  23913. 8029c3c: 2007 movs r0, #7
  23914. 8029c3e: f00e f84f bl 8037ce0 <SNMP_SendUserTrap>
  23915. log_event_data(LOG_DO0_STATE, str);
  23916. 8029c42: 2009 movs r0, #9
  23917. 8029c44: 4669 mov r1, sp
  23918. 8029c46: f000 fb0d bl 802a264 <log_event_data>
  23919. }
  23920. if(OldRO2type_Sourse == NON_CRITICAL){
  23921. 8029c4a: 4b19 ldr r3, [pc, #100] ; (8029cb0 <UPS_NonCriticalAlarmMonitor+0x118>)
  23922. 8029c4c: 781b ldrb r3, [r3, #0]
  23923. 8029c4e: 2b02 cmp r3, #2
  23924. 8029c50: d11b bne.n 8029c8a <UPS_NonCriticalAlarmMonitor+0xf2>
  23925. memset(str, 0, 30);
  23926. 8029c52: 4668 mov r0, sp
  23927. 8029c54: 2100 movs r1, #0
  23928. 8029c56: 221e movs r2, #30
  23929. 8029c58: f7f8 f8de bl 8021e18 <memset>
  23930. if(NonCriticalAlarmCurrent){
  23931. 8029c5c: b134 cbz r4, 8029c6c <UPS_NonCriticalAlarmMonitor+0xd4>
  23932. SetROInt(1, 1);
  23933. 8029c5e: 2001 movs r0, #1
  23934. 8029c60: 4601 mov r1, r0
  23935. 8029c62: f7fe fe93 bl 802898c <SetROInt>
  23936. strcat(str, "Разомкнуто");
  23937. 8029c66: 4668 mov r0, sp
  23938. 8029c68: 4913 ldr r1, [pc, #76] ; (8029cb8 <UPS_NonCriticalAlarmMonitor+0x120>)
  23939. 8029c6a: e005 b.n 8029c78 <UPS_NonCriticalAlarmMonitor+0xe0>
  23940. }
  23941. else{
  23942. SetROInt(0, 1);
  23943. 8029c6c: 4620 mov r0, r4
  23944. 8029c6e: 2101 movs r1, #1
  23945. 8029c70: f7fe fe8c bl 802898c <SetROInt>
  23946. strcat(str, "Замкнуто");
  23947. 8029c74: 490f ldr r1, [pc, #60] ; (8029cb4 <UPS_NonCriticalAlarmMonitor+0x11c>)
  23948. 8029c76: 4668 mov r0, sp
  23949. 8029c78: f7f8 f934 bl 8021ee4 <strcat>
  23950. }
  23951. SNMP_SendUserTrap(DO1_TOGGLED);
  23952. 8029c7c: 2008 movs r0, #8
  23953. 8029c7e: f00e f82f bl 8037ce0 <SNMP_SendUserTrap>
  23954. log_event_data(LOG_DO1_STATE, str);
  23955. 8029c82: 200a movs r0, #10
  23956. 8029c84: 4669 mov r1, sp
  23957. 8029c86: f000 faed bl 802a264 <log_event_data>
  23958. SNMP_SendUserTrap(DO1_TOGGLED);
  23959. log_event_data(LOG_DO1_STATE, str);
  23960. }
  23961. }
  23962. OldRO0type_Sourse = CurrRO1type_Sourse;
  23963. 8029c8a: 4b08 ldr r3, [pc, #32] ; (8029cac <UPS_NonCriticalAlarmMonitor+0x114>)
  23964. 8029c8c: 701d strb r5, [r3, #0]
  23965. OldRO2type_Sourse = CurrRO2type_Sourse;
  23966. 8029c8e: 4b08 ldr r3, [pc, #32] ; (8029cb0 <UPS_NonCriticalAlarmMonitor+0x118>)
  23967. 8029c90: 701e strb r6, [r3, #0]
  23968. NonCriticalAlarmOldState = NonCriticalAlarmCurrent;
  23969. 8029c92: 4b05 ldr r3, [pc, #20] ; (8029ca8 <UPS_NonCriticalAlarmMonitor+0x110>)
  23970. 8029c94: 701c strb r4, [r3, #0]
  23971. }
  23972. 8029c96: b009 add sp, #36 ; 0x24
  23973. 8029c98: bdf0 pop {r4, r5, r6, r7, pc}
  23974. 8029c9a: bf00 nop
  23975. 8029c9c: 20000ba0 .word 0x20000ba0
  23976. 8029ca0: 2000d414 .word 0x2000d414
  23977. 8029ca4: 20000b9f .word 0x20000b9f
  23978. 8029ca8: 20000b99 .word 0x20000b99
  23979. 8029cac: 20000ba1 .word 0x20000ba1
  23980. 8029cb0: 20000b97 .word 0x20000b97
  23981. 8029cb4: 08039322 .word 0x08039322
  23982. 8029cb8: 08039333 .word 0x08039333
  23983. 08029cbc <UPS_LineFailMonitor>:
  23984. /**
  23985. * @brief Мониторинг бита LainFail
  23986. */
  23987. void UPS_LineFailMonitor(void)
  23988. {
  23989. 8029cbc: b538 push {r3, r4, r5, lr}
  23990. static uint8_t lineFailOldState = 0;
  23991. uint8_t lineFailCurrent;
  23992. lineFailCurrent = (UPS.Status >> 7) & 0x01;
  23993. if (!isValueRecv) {
  23994. 8029cbe: 4a17 ldr r2, [pc, #92] ; (8029d1c <UPS_LineFailMonitor+0x60>)
  23995. {
  23996. static bool isValueRecv = false;
  23997. static uint8_t lineFailOldState = 0;
  23998. uint8_t lineFailCurrent;
  23999. lineFailCurrent = (UPS.Status >> 7) & 0x01;
  24000. 8029cc0: 4b17 ldr r3, [pc, #92] ; (8029d20 <UPS_LineFailMonitor+0x64>)
  24001. if (!isValueRecv) {
  24002. 8029cc2: 7811 ldrb r1, [r2, #0]
  24003. {
  24004. static bool isValueRecv = false;
  24005. static uint8_t lineFailOldState = 0;
  24006. uint8_t lineFailCurrent;
  24007. lineFailCurrent = (UPS.Status >> 7) & 0x01;
  24008. 8029cc4: 7cdc ldrb r4, [r3, #19]
  24009. 8029cc6: 4b17 ldr r3, [pc, #92] ; (8029d24 <UPS_LineFailMonitor+0x68>)
  24010. 8029cc8: 09e4 lsrs r4, r4, #7
  24011. if (!isValueRecv) {
  24012. 8029cca: b969 cbnz r1, 8029ce8 <UPS_LineFailMonitor+0x2c>
  24013. isValueRecv = true;
  24014. 8029ccc: 2501 movs r5, #1
  24015. 8029cce: 7015 strb r5, [r2, #0]
  24016. lineFailOldState = lineFailCurrent;
  24017. 8029cd0: 701c strb r4, [r3, #0]
  24018. if (lineFailCurrent){
  24019. 8029cd2: b314 cbz r4, 8029d1a <UPS_LineFailMonitor+0x5e>
  24020. log_event_data(LOG_ALARM_LINE, "Авария");
  24021. 8029cd4: 200c movs r0, #12
  24022. 8029cd6: 4914 ldr r1, [pc, #80] ; (8029d28 <UPS_LineFailMonitor+0x6c>)
  24023. 8029cd8: f000 fac4 bl 802a264 <log_event_data>
  24024. SNMP_SendUserTrap(LINE_ALARM);
  24025. 8029cdc: 200b movs r0, #11
  24026. 8029cde: f00d ffff bl 8037ce0 <SNMP_SendUserTrap>
  24027. flUpdateLog = true;
  24028. 8029ce2: 4b12 ldr r3, [pc, #72] ; (8029d2c <UPS_LineFailMonitor+0x70>)
  24029. 8029ce4: 701d strb r5, [r3, #0]
  24030. 8029ce6: bd38 pop {r3, r4, r5, pc}
  24031. }
  24032. return;
  24033. }
  24034. if (lineFailCurrent)
  24035. 8029ce8: b114 cbz r4, 8029cf0 <UPS_LineFailMonitor+0x34>
  24036. flCriticalAlarm = true;
  24037. 8029cea: 4a11 ldr r2, [pc, #68] ; (8029d30 <UPS_LineFailMonitor+0x74>)
  24038. 8029cec: 2101 movs r1, #1
  24039. 8029cee: 7011 strb r1, [r2, #0]
  24040. // Значение параметра изменилось
  24041. if (lineFailCurrent != lineFailOldState)
  24042. 8029cf0: 781b ldrb r3, [r3, #0]
  24043. 8029cf2: 42a3 cmp r3, r4
  24044. 8029cf4: d00f beq.n 8029d16 <UPS_LineFailMonitor+0x5a>
  24045. 8029cf6: 4d0d ldr r5, [pc, #52] ; (8029d2c <UPS_LineFailMonitor+0x70>)
  24046. {
  24047. if (lineFailCurrent){
  24048. log_event_data(LOG_ALARM_LINE, "Авария");
  24049. 8029cf8: 200c movs r0, #12
  24050. flCriticalAlarm = true;
  24051. // Значение параметра изменилось
  24052. if (lineFailCurrent != lineFailOldState)
  24053. {
  24054. if (lineFailCurrent){
  24055. 8029cfa: b124 cbz r4, 8029d06 <UPS_LineFailMonitor+0x4a>
  24056. log_event_data(LOG_ALARM_LINE, "Авария");
  24057. 8029cfc: 490a ldr r1, [pc, #40] ; (8029d28 <UPS_LineFailMonitor+0x6c>)
  24058. 8029cfe: f000 fab1 bl 802a264 <log_event_data>
  24059. SNMP_SendUserTrap(LINE_ALARM);
  24060. 8029d02: 200b movs r0, #11
  24061. 8029d04: e003 b.n 8029d0e <UPS_LineFailMonitor+0x52>
  24062. flUpdateLog = true;
  24063. }
  24064. else{
  24065. log_event_data(LOG_ALARM_LINE, "Норма");
  24066. 8029d06: 490b ldr r1, [pc, #44] ; (8029d34 <UPS_LineFailMonitor+0x78>)
  24067. 8029d08: f000 faac bl 802a264 <log_event_data>
  24068. SNMP_SendUserTrap(LINE_NORM);
  24069. 8029d0c: 200c movs r0, #12
  24070. 8029d0e: f00d ffe7 bl 8037ce0 <SNMP_SendUserTrap>
  24071. flUpdateLog = true;
  24072. 8029d12: 2301 movs r3, #1
  24073. 8029d14: 702b strb r3, [r5, #0]
  24074. }
  24075. }
  24076. lineFailOldState = lineFailCurrent;
  24077. 8029d16: 4b03 ldr r3, [pc, #12] ; (8029d24 <UPS_LineFailMonitor+0x68>)
  24078. 8029d18: 701c strb r4, [r3, #0]
  24079. 8029d1a: bd38 pop {r3, r4, r5, pc}
  24080. 8029d1c: 20000b9b .word 0x20000b9b
  24081. 8029d20: 2000d7d8 .word 0x2000d7d8
  24082. 8029d24: 20000b96 .word 0x20000b96
  24083. 8029d28: 0803930a .word 0x0803930a
  24084. 8029d2c: 20000bfc .word 0x20000bfc
  24085. 8029d30: 20000b98 .word 0x20000b98
  24086. 8029d34: 08039317 .word 0x08039317
  24087. 08029d38 <UPS_LowBatMonitor>:
  24088. /**
  24089. * @brief Мониторинг бита LowBat
  24090. */
  24091. void UPS_LowBatMonitor(void)
  24092. {
  24093. 8029d38: b538 push {r3, r4, r5, lr}
  24094. static bool isValueRecv = false;
  24095. static uint8_t lowBatOldState = 0;
  24096. uint8_t lowBatCurrent;
  24097. if((UPS.Status >> 7) & 0x01)
  24098. 8029d3a: 4b19 ldr r3, [pc, #100] ; (8029da0 <UPS_LowBatMonitor+0x68>)
  24099. lowBatCurrent = (UPS.Status >> 6) & 0x01;
  24100. else
  24101. lowBatCurrent = 0;
  24102. if (!isValueRecv) {
  24103. 8029d3c: 4a19 ldr r2, [pc, #100] ; (8029da4 <UPS_LowBatMonitor+0x6c>)
  24104. void UPS_LowBatMonitor(void)
  24105. {
  24106. static bool isValueRecv = false;
  24107. static uint8_t lowBatOldState = 0;
  24108. uint8_t lowBatCurrent;
  24109. if((UPS.Status >> 7) & 0x01)
  24110. 8029d3e: 7cdb ldrb r3, [r3, #19]
  24111. lowBatCurrent = (UPS.Status >> 6) & 0x01;
  24112. else
  24113. lowBatCurrent = 0;
  24114. if (!isValueRecv) {
  24115. 8029d40: 7811 ldrb r1, [r2, #0]
  24116. void UPS_LowBatMonitor(void)
  24117. {
  24118. static bool isValueRecv = false;
  24119. static uint8_t lowBatOldState = 0;
  24120. uint8_t lowBatCurrent;
  24121. if((UPS.Status >> 7) & 0x01)
  24122. 8029d42: 09dc lsrs r4, r3, #7
  24123. lowBatCurrent = (UPS.Status >> 6) & 0x01;
  24124. 8029d44: bf18 it ne
  24125. 8029d46: f3c3 1480 ubfxne r4, r3, #6, #1
  24126. 8029d4a: 4b17 ldr r3, [pc, #92] ; (8029da8 <UPS_LowBatMonitor+0x70>)
  24127. else
  24128. lowBatCurrent = 0;
  24129. if (!isValueRecv) {
  24130. 8029d4c: b969 cbnz r1, 8029d6a <UPS_LowBatMonitor+0x32>
  24131. isValueRecv = true;
  24132. 8029d4e: 2501 movs r5, #1
  24133. 8029d50: 7015 strb r5, [r2, #0]
  24134. lowBatOldState = lowBatCurrent;
  24135. 8029d52: 701c strb r4, [r3, #0]
  24136. if (lowBatCurrent){
  24137. 8029d54: b31c cbz r4, 8029d9e <UPS_LowBatMonitor+0x66>
  24138. log_event_data(LOG_ALARM_LOW_BAT, "Авария");
  24139. 8029d56: 200d movs r0, #13
  24140. 8029d58: 4914 ldr r1, [pc, #80] ; (8029dac <UPS_LowBatMonitor+0x74>)
  24141. 8029d5a: f000 fa83 bl 802a264 <log_event_data>
  24142. SNMP_SendUserTrap(LOW_BAT_ALARM);
  24143. 8029d5e: 200d movs r0, #13
  24144. 8029d60: f00d ffbe bl 8037ce0 <SNMP_SendUserTrap>
  24145. flUpdateLog = true;
  24146. 8029d64: 4b12 ldr r3, [pc, #72] ; (8029db0 <UPS_LowBatMonitor+0x78>)
  24147. 8029d66: 701d strb r5, [r3, #0]
  24148. 8029d68: bd38 pop {r3, r4, r5, pc}
  24149. }
  24150. return;
  24151. }
  24152. if (lowBatCurrent)
  24153. 8029d6a: b114 cbz r4, 8029d72 <UPS_LowBatMonitor+0x3a>
  24154. flNonCriticalAlarm = true;
  24155. 8029d6c: 4a11 ldr r2, [pc, #68] ; (8029db4 <UPS_LowBatMonitor+0x7c>)
  24156. 8029d6e: 2101 movs r1, #1
  24157. 8029d70: 7011 strb r1, [r2, #0]
  24158. // Значение параметра изменилось
  24159. if (lowBatCurrent != lowBatOldState)
  24160. 8029d72: 781b ldrb r3, [r3, #0]
  24161. 8029d74: 42a3 cmp r3, r4
  24162. 8029d76: d010 beq.n 8029d9a <UPS_LowBatMonitor+0x62>
  24163. 8029d78: 4d0d ldr r5, [pc, #52] ; (8029db0 <UPS_LowBatMonitor+0x78>)
  24164. {
  24165. if (lowBatCurrent){
  24166. 8029d7a: b12c cbz r4, 8029d88 <UPS_LowBatMonitor+0x50>
  24167. SNMP_SendUserTrap(LOW_BAT_ALARM);
  24168. 8029d7c: 200d movs r0, #13
  24169. 8029d7e: f00d ffaf bl 8037ce0 <SNMP_SendUserTrap>
  24170. log_event_data(LOG_ALARM_LOW_BAT, "Авария");
  24171. 8029d82: 200d movs r0, #13
  24172. 8029d84: 4909 ldr r1, [pc, #36] ; (8029dac <UPS_LowBatMonitor+0x74>)
  24173. 8029d86: e004 b.n 8029d92 <UPS_LowBatMonitor+0x5a>
  24174. flUpdateLog = true;
  24175. }
  24176. else{
  24177. SNMP_SendUserTrap(LOW_BAT_NORM);
  24178. 8029d88: 200e movs r0, #14
  24179. 8029d8a: f00d ffa9 bl 8037ce0 <SNMP_SendUserTrap>
  24180. log_event_data(LOG_ALARM_LOW_BAT, "Норма");
  24181. 8029d8e: 490a ldr r1, [pc, #40] ; (8029db8 <UPS_LowBatMonitor+0x80>)
  24182. 8029d90: 200d movs r0, #13
  24183. 8029d92: f000 fa67 bl 802a264 <log_event_data>
  24184. flUpdateLog = true;
  24185. 8029d96: 2301 movs r3, #1
  24186. 8029d98: 702b strb r3, [r5, #0]
  24187. }
  24188. }
  24189. lowBatOldState = lowBatCurrent;
  24190. 8029d9a: 4b03 ldr r3, [pc, #12] ; (8029da8 <UPS_LowBatMonitor+0x70>)
  24191. 8029d9c: 701c strb r4, [r3, #0]
  24192. 8029d9e: bd38 pop {r3, r4, r5, pc}
  24193. 8029da0: 2000d7d8 .word 0x2000d7d8
  24194. 8029da4: 20000ba3 .word 0x20000ba3
  24195. 8029da8: 20000b9d .word 0x20000b9d
  24196. 8029dac: 0803930a .word 0x0803930a
  24197. 8029db0: 20000bfc .word 0x20000bfc
  24198. 8029db4: 20000b9f .word 0x20000b9f
  24199. 8029db8: 08039317 .word 0x08039317
  24200. 08029dbc <UPS_PowerMonitor>:
  24201. /**
  24202. * @brief Мониторинг нагрузки
  24203. */
  24204. void UPS_PowerMonitor(void)
  24205. {
  24206. 8029dbc: b538 push {r3, r4, r5, lr}
  24207. float load;
  24208. static uint8_t stateCurrent = HYST_IDLE;
  24209. load = UPS.Load;
  24210. 8029dbe: 4c22 ldr r4, [pc, #136] ; (8029e48 <UPS_PowerMonitor+0x8c>)
  24211. 8029dc0: 7c20 ldrb r0, [r4, #16]
  24212. 8029dc2: f7f7 f821 bl 8020e08 <__aeabi_ui2f>
  24213. /* Отслеживается переход через верхнюю границу */
  24214. if (load > UPS_LOAD)
  24215. 8029dc6: 4921 ldr r1, [pc, #132] ; (8029e4c <UPS_PowerMonitor+0x90>)
  24216. void UPS_PowerMonitor(void)
  24217. {
  24218. float load;
  24219. static uint8_t stateCurrent = HYST_IDLE;
  24220. load = UPS.Load;
  24221. 8029dc8: 4605 mov r5, r0
  24222. /* Отслеживается переход через верхнюю границу */
  24223. if (load > UPS_LOAD)
  24224. 8029dca: f7f7 fa31 bl 8021230 <__aeabi_fcmpgt>
  24225. 8029dce: b1d8 cbz r0, 8029e08 <UPS_PowerMonitor+0x4c>
  24226. {
  24227. flCriticalAlarm = true;
  24228. 8029dd0: 4b1f ldr r3, [pc, #124] ; (8029e50 <UPS_PowerMonitor+0x94>)
  24229. 8029dd2: 2501 movs r5, #1
  24230. 8029dd4: 701d strb r5, [r3, #0]
  24231. UPS.Alarm = (UPS.Alarm & 0x0e) | (1 << 0);
  24232. 8029dd6: 7d23 ldrb r3, [r4, #20]
  24233. 8029dd8: f003 030e and.w r3, r3, #14
  24234. 8029ddc: 432b orrs r3, r5
  24235. 8029dde: 7523 strb r3, [r4, #20]
  24236. if (stateCurrent == HYST_IDLE)
  24237. 8029de0: 4c1c ldr r4, [pc, #112] ; (8029e54 <UPS_PowerMonitor+0x98>)
  24238. 8029de2: 7823 ldrb r3, [r4, #0]
  24239. 8029de4: bb73 cbnz r3, 8029e44 <UPS_PowerMonitor+0x88>
  24240. {
  24241. LED_On(LED_MINOR_R);
  24242. 8029de6: 200f movs r0, #15
  24243. 8029de8: f7ff f9a0 bl 802912c <LED_On>
  24244. LED_On(LED_MINOR_G);
  24245. 8029dec: 200e movs r0, #14
  24246. 8029dee: f7ff f99d bl 802912c <LED_On>
  24247. stateCurrent = HYST_UP;
  24248. log_event_data(LOG_ALARM_POWER, "Авария");
  24249. 8029df2: 200e movs r0, #14
  24250. 8029df4: 4918 ldr r1, [pc, #96] ; (8029e58 <UPS_PowerMonitor+0x9c>)
  24251. UPS.Alarm = (UPS.Alarm & 0x0e) | (1 << 0);
  24252. if (stateCurrent == HYST_IDLE)
  24253. {
  24254. LED_On(LED_MINOR_R);
  24255. LED_On(LED_MINOR_G);
  24256. stateCurrent = HYST_UP;
  24257. 8029df6: 7025 strb r5, [r4, #0]
  24258. log_event_data(LOG_ALARM_POWER, "Авария");
  24259. 8029df8: f000 fa34 bl 802a264 <log_event_data>
  24260. // Отправка трапа о завышении
  24261. SNMP_SendUserTrap(POWER_ALARM);
  24262. 8029dfc: 200f movs r0, #15
  24263. 8029dfe: f00d ff6f bl 8037ce0 <SNMP_SendUserTrap>
  24264. flUpdateLog = true;
  24265. 8029e02: 4b16 ldr r3, [pc, #88] ; (8029e5c <UPS_PowerMonitor+0xa0>)
  24266. 8029e04: 701d strb r5, [r3, #0]
  24267. 8029e06: bd38 pop {r3, r4, r5, pc}
  24268. }
  24269. }
  24270. /* Отслеживается нормализация */
  24271. else if (load < (UPS_LOAD - UPS_LOAD_HIST))
  24272. 8029e08: 4628 mov r0, r5
  24273. 8029e0a: 4915 ldr r1, [pc, #84] ; (8029e60 <UPS_PowerMonitor+0xa4>)
  24274. 8029e0c: f7f7 f9f2 bl 80211f4 <__aeabi_fcmplt>
  24275. 8029e10: b1c0 cbz r0, 8029e44 <UPS_PowerMonitor+0x88>
  24276. {
  24277. UPS.Alarm = (UPS.Alarm & 0x0e);
  24278. 8029e12: 7d23 ldrb r3, [r4, #20]
  24279. if (stateCurrent == HYST_UP)
  24280. 8029e14: 4d0f ldr r5, [pc, #60] ; (8029e54 <UPS_PowerMonitor+0x98>)
  24281. }
  24282. }
  24283. /* Отслеживается нормализация */
  24284. else if (load < (UPS_LOAD - UPS_LOAD_HIST))
  24285. {
  24286. UPS.Alarm = (UPS.Alarm & 0x0e);
  24287. 8029e16: f003 030e and.w r3, r3, #14
  24288. 8029e1a: 7523 strb r3, [r4, #20]
  24289. if (stateCurrent == HYST_UP)
  24290. 8029e1c: 782c ldrb r4, [r5, #0]
  24291. 8029e1e: 2c01 cmp r4, #1
  24292. 8029e20: d110 bne.n 8029e44 <UPS_PowerMonitor+0x88>
  24293. {
  24294. LED_Off(LED_MINOR_R);
  24295. 8029e22: 200f movs r0, #15
  24296. 8029e24: f7ff f985 bl 8029132 <LED_Off>
  24297. LED_Off(LED_MINOR_G);
  24298. 8029e28: 200e movs r0, #14
  24299. 8029e2a: f7ff f982 bl 8029132 <LED_Off>
  24300. stateCurrent = HYST_IDLE;
  24301. 8029e2e: 2300 movs r3, #0
  24302. log_event_data(LOG_ALARM_POWER, "Норма");
  24303. 8029e30: 200e movs r0, #14
  24304. 8029e32: 490c ldr r1, [pc, #48] ; (8029e64 <UPS_PowerMonitor+0xa8>)
  24305. UPS.Alarm = (UPS.Alarm & 0x0e);
  24306. if (stateCurrent == HYST_UP)
  24307. {
  24308. LED_Off(LED_MINOR_R);
  24309. LED_Off(LED_MINOR_G);
  24310. stateCurrent = HYST_IDLE;
  24311. 8029e34: 702b strb r3, [r5, #0]
  24312. log_event_data(LOG_ALARM_POWER, "Норма");
  24313. 8029e36: f000 fa15 bl 802a264 <log_event_data>
  24314. // Отправка трапа о нормализации
  24315. SNMP_SendUserTrap(POWER_NORM);
  24316. 8029e3a: 2010 movs r0, #16
  24317. 8029e3c: f00d ff50 bl 8037ce0 <SNMP_SendUserTrap>
  24318. flUpdateLog = true;
  24319. 8029e40: 4b06 ldr r3, [pc, #24] ; (8029e5c <UPS_PowerMonitor+0xa0>)
  24320. 8029e42: 701c strb r4, [r3, #0]
  24321. 8029e44: bd38 pop {r3, r4, r5, pc}
  24322. 8029e46: bf00 nop
  24323. 8029e48: 2000d7d8 .word 0x2000d7d8
  24324. 8029e4c: 428c0000 .word 0x428c0000
  24325. 8029e50: 20000b98 .word 0x20000b98
  24326. 8029e54: 20000b91 .word 0x20000b91
  24327. 8029e58: 0803930a .word 0x0803930a
  24328. 8029e5c: 20000bfc .word 0x20000bfc
  24329. 8029e60: 428a0000 .word 0x428a0000
  24330. 8029e64: 08039317 .word 0x08039317
  24331. 08029e68 <UPS_TemperatureMonitor>:
  24332. /**
  24333. * @brief Мониторинг температуры
  24334. */
  24335. void UPS_TemperatureMonitor(void)
  24336. {
  24337. 8029e68: b538 push {r3, r4, r5, lr}
  24338. float temperature;
  24339. static uint8_t stateCurrent = HYST_IDLE;
  24340. temperature = UPS.Temp;
  24341. 8029e6a: 4c1b ldr r4, [pc, #108] ; (8029ed8 <UPS_TemperatureMonitor+0x70>)
  24342. /* Отслеживается переход через верхнюю границу */
  24343. if (temperature > UPS_TEMPERATURE)
  24344. 8029e6c: 491b ldr r1, [pc, #108] ; (8029edc <UPS_TemperatureMonitor+0x74>)
  24345. void UPS_TemperatureMonitor(void)
  24346. {
  24347. float temperature;
  24348. static uint8_t stateCurrent = HYST_IDLE;
  24349. temperature = UPS.Temp;
  24350. 8029e6e: 68e5 ldr r5, [r4, #12]
  24351. /* Отслеживается переход через верхнюю границу */
  24352. if (temperature > UPS_TEMPERATURE)
  24353. 8029e70: 4628 mov r0, r5
  24354. 8029e72: f7f7 f9dd bl 8021230 <__aeabi_fcmpgt>
  24355. 8029e76: b1b0 cbz r0, 8029ea6 <UPS_TemperatureMonitor+0x3e>
  24356. {
  24357. flCriticalAlarm = true;
  24358. 8029e78: 4b19 ldr r3, [pc, #100] ; (8029ee0 <UPS_TemperatureMonitor+0x78>)
  24359. 8029e7a: 2501 movs r5, #1
  24360. 8029e7c: 701d strb r5, [r3, #0]
  24361. UPS.Alarm = (UPS.Alarm & 0x0d) | (1 << 1);
  24362. 8029e7e: 7d23 ldrb r3, [r4, #20]
  24363. 8029e80: f003 030d and.w r3, r3, #13
  24364. 8029e84: f043 0302 orr.w r3, r3, #2
  24365. 8029e88: 7523 strb r3, [r4, #20]
  24366. if (stateCurrent == HYST_IDLE)
  24367. 8029e8a: 4b16 ldr r3, [pc, #88] ; (8029ee4 <UPS_TemperatureMonitor+0x7c>)
  24368. 8029e8c: 781a ldrb r2, [r3, #0]
  24369. 8029e8e: bb12 cbnz r2, 8029ed6 <UPS_TemperatureMonitor+0x6e>
  24370. {
  24371. stateCurrent = HYST_UP;
  24372. log_event_data(LOG_ALARM_TEMP, "Авария");
  24373. 8029e90: 200b movs r0, #11
  24374. 8029e92: 4915 ldr r1, [pc, #84] ; (8029ee8 <UPS_TemperatureMonitor+0x80>)
  24375. {
  24376. flCriticalAlarm = true;
  24377. UPS.Alarm = (UPS.Alarm & 0x0d) | (1 << 1);
  24378. if (stateCurrent == HYST_IDLE)
  24379. {
  24380. stateCurrent = HYST_UP;
  24381. 8029e94: 701d strb r5, [r3, #0]
  24382. log_event_data(LOG_ALARM_TEMP, "Авария");
  24383. 8029e96: f000 f9e5 bl 802a264 <log_event_data>
  24384. // Отправка трапа о завышении
  24385. SNMP_SendUserTrap(BATTERY_TEMPERATURE_ALARM);
  24386. 8029e9a: 200a movs r0, #10
  24387. 8029e9c: f00d ff20 bl 8037ce0 <SNMP_SendUserTrap>
  24388. flUpdateLog = true;
  24389. 8029ea0: 4b12 ldr r3, [pc, #72] ; (8029eec <UPS_TemperatureMonitor+0x84>)
  24390. 8029ea2: 701d strb r5, [r3, #0]
  24391. 8029ea4: bd38 pop {r3, r4, r5, pc}
  24392. }
  24393. }
  24394. /* Отслеживается нормализация */
  24395. else if (temperature < (UPS_TEMPERATURE - UPS_TEMPERATURE_HIST))
  24396. 8029ea6: 4628 mov r0, r5
  24397. 8029ea8: 4911 ldr r1, [pc, #68] ; (8029ef0 <UPS_TemperatureMonitor+0x88>)
  24398. 8029eaa: f7f7 f9a3 bl 80211f4 <__aeabi_fcmplt>
  24399. 8029eae: b190 cbz r0, 8029ed6 <UPS_TemperatureMonitor+0x6e>
  24400. {
  24401. UPS.Alarm = (UPS.Alarm & 0x0d);
  24402. 8029eb0: 7d23 ldrb r3, [r4, #20]
  24403. 8029eb2: f003 030d and.w r3, r3, #13
  24404. 8029eb6: 7523 strb r3, [r4, #20]
  24405. if (stateCurrent == HYST_UP)
  24406. 8029eb8: 4b0a ldr r3, [pc, #40] ; (8029ee4 <UPS_TemperatureMonitor+0x7c>)
  24407. 8029eba: 781c ldrb r4, [r3, #0]
  24408. 8029ebc: 2c01 cmp r4, #1
  24409. 8029ebe: d10a bne.n 8029ed6 <UPS_TemperatureMonitor+0x6e>
  24410. {
  24411. stateCurrent = HYST_IDLE;
  24412. 8029ec0: 2200 movs r2, #0
  24413. log_event_data(LOG_ALARM_TEMP, "Норма");
  24414. 8029ec2: 200b movs r0, #11
  24415. 8029ec4: 490b ldr r1, [pc, #44] ; (8029ef4 <UPS_TemperatureMonitor+0x8c>)
  24416. else if (temperature < (UPS_TEMPERATURE - UPS_TEMPERATURE_HIST))
  24417. {
  24418. UPS.Alarm = (UPS.Alarm & 0x0d);
  24419. if (stateCurrent == HYST_UP)
  24420. {
  24421. stateCurrent = HYST_IDLE;
  24422. 8029ec6: 701a strb r2, [r3, #0]
  24423. log_event_data(LOG_ALARM_TEMP, "Норма");
  24424. 8029ec8: f000 f9cc bl 802a264 <log_event_data>
  24425. // Отправка трапа о нормализации
  24426. SNMP_SendUserTrap(BATTERY_TEMPERATURE_NORM);
  24427. 8029ecc: 2009 movs r0, #9
  24428. 8029ece: f00d ff07 bl 8037ce0 <SNMP_SendUserTrap>
  24429. flUpdateLog = true;
  24430. 8029ed2: 4b06 ldr r3, [pc, #24] ; (8029eec <UPS_TemperatureMonitor+0x84>)
  24431. 8029ed4: 701c strb r4, [r3, #0]
  24432. 8029ed6: bd38 pop {r3, r4, r5, pc}
  24433. 8029ed8: 2000d7d8 .word 0x2000d7d8
  24434. 8029edc: 42200000 .word 0x42200000
  24435. 8029ee0: 20000b98 .word 0x20000b98
  24436. 8029ee4: 20000b8f .word 0x20000b8f
  24437. 8029ee8: 0803930a .word 0x0803930a
  24438. 8029eec: 20000bfc .word 0x20000bfc
  24439. 8029ef0: 421c0000 .word 0x421c0000
  24440. 8029ef4: 08039317 .word 0x08039317
  24441. 08029ef8 <UPS_ConnectMonitor>:
  24442. /**
  24443. * @brief Мониторинг параметра upsParams.connect
  24444. */
  24445. void UPS_ConnectMonitor(void)
  24446. {
  24447. 8029ef8: b538 push {r3, r4, r5, lr}
  24448. static bool isValueRecv = false;
  24449. static uint8_t connectOldState = 0;
  24450. uint8_t connectCurrent;
  24451. connectCurrent = UPS.Present;
  24452. 8029efa: 4b1b ldr r3, [pc, #108] ; (8029f68 <UPS_ConnectMonitor+0x70>)
  24453. UPS.Alarm = (UPS.Alarm & 0x0b) | ((connectCurrent^1) << 2);
  24454. 8029efc: 7d1a ldrb r2, [r3, #20]
  24455. {
  24456. static bool isValueRecv = false;
  24457. static uint8_t connectOldState = 0;
  24458. uint8_t connectCurrent;
  24459. connectCurrent = UPS.Present;
  24460. 8029efe: f893 402d ldrb.w r4, [r3, #45] ; 0x2d
  24461. UPS.Alarm = (UPS.Alarm & 0x0b) | ((connectCurrent^1) << 2);
  24462. 8029f02: f002 020b and.w r2, r2, #11
  24463. 8029f06: f084 0101 eor.w r1, r4, #1
  24464. 8029f0a: ea42 0281 orr.w r2, r2, r1, lsl #2
  24465. 8029f0e: 751a strb r2, [r3, #20]
  24466. if (!isValueRecv) {
  24467. 8029f10: 4a16 ldr r2, [pc, #88] ; (8029f6c <UPS_ConnectMonitor+0x74>)
  24468. 8029f12: 4b17 ldr r3, [pc, #92] ; (8029f70 <UPS_ConnectMonitor+0x78>)
  24469. 8029f14: 7811 ldrb r1, [r2, #0]
  24470. 8029f16: b969 cbnz r1, 8029f34 <UPS_ConnectMonitor+0x3c>
  24471. isValueRecv = true;
  24472. 8029f18: 2501 movs r5, #1
  24473. 8029f1a: 7015 strb r5, [r2, #0]
  24474. connectOldState = connectCurrent;
  24475. 8029f1c: 701c strb r4, [r3, #0]
  24476. if (!connectCurrent){
  24477. 8029f1e: bb14 cbnz r4, 8029f66 <UPS_ConnectMonitor+0x6e>
  24478. log_event_data(LOG_ALARM_UPS, "Авария");
  24479. 8029f20: 200f movs r0, #15
  24480. 8029f22: 4914 ldr r1, [pc, #80] ; (8029f74 <UPS_ConnectMonitor+0x7c>)
  24481. 8029f24: f000 f99e bl 802a264 <log_event_data>
  24482. SNMP_SendUserTrap(CONNECT_MONITOR_ALARM);
  24483. 8029f28: 2011 movs r0, #17
  24484. 8029f2a: f00d fed9 bl 8037ce0 <SNMP_SendUserTrap>
  24485. flUpdateLog = true;
  24486. 8029f2e: 4b12 ldr r3, [pc, #72] ; (8029f78 <UPS_ConnectMonitor+0x80>)
  24487. 8029f30: 701d strb r5, [r3, #0]
  24488. 8029f32: bd38 pop {r3, r4, r5, pc}
  24489. }
  24490. return;
  24491. }
  24492. if (!connectCurrent)
  24493. 8029f34: b914 cbnz r4, 8029f3c <UPS_ConnectMonitor+0x44>
  24494. flCriticalAlarm = true;
  24495. 8029f36: 4a11 ldr r2, [pc, #68] ; (8029f7c <UPS_ConnectMonitor+0x84>)
  24496. 8029f38: 2101 movs r1, #1
  24497. 8029f3a: 7011 strb r1, [r2, #0]
  24498. // Значение параметра изменилось
  24499. if (connectCurrent != connectOldState)
  24500. 8029f3c: 781b ldrb r3, [r3, #0]
  24501. 8029f3e: 42a3 cmp r3, r4
  24502. 8029f40: d00f beq.n 8029f62 <UPS_ConnectMonitor+0x6a>
  24503. 8029f42: 4d0d ldr r5, [pc, #52] ; (8029f78 <UPS_ConnectMonitor+0x80>)
  24504. {
  24505. if (connectCurrent){
  24506. log_event_data(LOG_ALARM_UPS, "Норма");
  24507. 8029f44: 200f movs r0, #15
  24508. if (!connectCurrent)
  24509. flCriticalAlarm = true;
  24510. // Значение параметра изменилось
  24511. if (connectCurrent != connectOldState)
  24512. {
  24513. if (connectCurrent){
  24514. 8029f46: b124 cbz r4, 8029f52 <UPS_ConnectMonitor+0x5a>
  24515. log_event_data(LOG_ALARM_UPS, "Норма");
  24516. 8029f48: 490d ldr r1, [pc, #52] ; (8029f80 <UPS_ConnectMonitor+0x88>)
  24517. 8029f4a: f000 f98b bl 802a264 <log_event_data>
  24518. SNMP_SendUserTrap(CONNECT_MONITOR_NORM);
  24519. 8029f4e: 2012 movs r0, #18
  24520. 8029f50: e003 b.n 8029f5a <UPS_ConnectMonitor+0x62>
  24521. flUpdateLog = true;
  24522. }
  24523. else{
  24524. log_event_data(LOG_ALARM_UPS, "Авария");
  24525. 8029f52: 4908 ldr r1, [pc, #32] ; (8029f74 <UPS_ConnectMonitor+0x7c>)
  24526. 8029f54: f000 f986 bl 802a264 <log_event_data>
  24527. SNMP_SendUserTrap(CONNECT_MONITOR_ALARM);
  24528. 8029f58: 2011 movs r0, #17
  24529. 8029f5a: f00d fec1 bl 8037ce0 <SNMP_SendUserTrap>
  24530. flUpdateLog = true;
  24531. 8029f5e: 2301 movs r3, #1
  24532. 8029f60: 702b strb r3, [r5, #0]
  24533. }
  24534. }
  24535. connectOldState = connectCurrent;
  24536. 8029f62: 4b03 ldr r3, [pc, #12] ; (8029f70 <UPS_ConnectMonitor+0x78>)
  24537. 8029f64: 701c strb r4, [r3, #0]
  24538. 8029f66: bd38 pop {r3, r4, r5, pc}
  24539. 8029f68: 2000d7d8 .word 0x2000d7d8
  24540. 8029f6c: 20000b90 .word 0x20000b90
  24541. 8029f70: 20000b94 .word 0x20000b94
  24542. 8029f74: 0803930a .word 0x0803930a
  24543. 8029f78: 20000bfc .word 0x20000bfc
  24544. 8029f7c: 20000b98 .word 0x20000b98
  24545. 8029f80: 08039317 .word 0x08039317
  24546. 08029f84 <UPS_BatteryConnectMonitor>:
  24547. /**
  24548. * @brief Мониторинг параметра upsParams.connect
  24549. */
  24550. void UPS_BatteryConnectMonitor(void)
  24551. {
  24552. 8029f84: b538 push {r3, r4, r5, lr}
  24553. static bool isValueRecv = false;
  24554. static uint8_t AKBconnectOldState = 0;
  24555. uint8_t AKBconnectCurrent;
  24556. if(((UPS.Status >> 7) & 0x01) == 0)
  24557. 8029f86: 4b1d ldr r3, [pc, #116] ; (8029ffc <UPS_BatteryConnectMonitor+0x78>)
  24558. 8029f88: 7cdc ldrb r4, [r3, #19]
  24559. 8029f8a: 09e2 lsrs r2, r4, #7
  24560. AKBconnectCurrent = (UPS.Status >> 6) & 0x01;
  24561. else{
  24562. AKBconnectCurrent = 0;
  24563. }
  24564. UPS.Alarm = (UPS.Alarm & 0x07) | (AKBconnectCurrent << 3);
  24565. 8029f8c: 7d1a ldrb r2, [r3, #20]
  24566. static bool isValueRecv = false;
  24567. static uint8_t AKBconnectOldState = 0;
  24568. uint8_t AKBconnectCurrent;
  24569. if(((UPS.Status >> 7) & 0x01) == 0)
  24570. AKBconnectCurrent = (UPS.Status >> 6) & 0x01;
  24571. 8029f8e: bf08 it eq
  24572. 8029f90: f3c4 1480 ubfxeq r4, r4, #6, #1
  24573. else{
  24574. AKBconnectCurrent = 0;
  24575. }
  24576. UPS.Alarm = (UPS.Alarm & 0x07) | (AKBconnectCurrent << 3);
  24577. 8029f94: f002 0207 and.w r2, r2, #7
  24578. uint8_t AKBconnectCurrent;
  24579. if(((UPS.Status >> 7) & 0x01) == 0)
  24580. AKBconnectCurrent = (UPS.Status >> 6) & 0x01;
  24581. else{
  24582. AKBconnectCurrent = 0;
  24583. 8029f98: bf18 it ne
  24584. 8029f9a: 2400 movne r4, #0
  24585. }
  24586. UPS.Alarm = (UPS.Alarm & 0x07) | (AKBconnectCurrent << 3);
  24587. 8029f9c: ea42 02c4 orr.w r2, r2, r4, lsl #3
  24588. 8029fa0: 751a strb r2, [r3, #20]
  24589. if (!isValueRecv) {
  24590. 8029fa2: 4a17 ldr r2, [pc, #92] ; (802a000 <UPS_BatteryConnectMonitor+0x7c>)
  24591. 8029fa4: 4b17 ldr r3, [pc, #92] ; (802a004 <UPS_BatteryConnectMonitor+0x80>)
  24592. 8029fa6: 7811 ldrb r1, [r2, #0]
  24593. 8029fa8: b969 cbnz r1, 8029fc6 <UPS_BatteryConnectMonitor+0x42>
  24594. isValueRecv = true;
  24595. 8029faa: 2501 movs r5, #1
  24596. 8029fac: 7015 strb r5, [r2, #0]
  24597. AKBconnectOldState = AKBconnectCurrent;
  24598. 8029fae: 701c strb r4, [r3, #0]
  24599. if (AKBconnectCurrent){
  24600. 8029fb0: b314 cbz r4, 8029ff8 <UPS_BatteryConnectMonitor+0x74>
  24601. log_event_data(LOG_ALARM_AKB, "Авария");
  24602. 8029fb2: 2010 movs r0, #16
  24603. 8029fb4: 4914 ldr r1, [pc, #80] ; (802a008 <UPS_BatteryConnectMonitor+0x84>)
  24604. 8029fb6: f000 f955 bl 802a264 <log_event_data>
  24605. SNMP_SendUserTrap(BATTERY_CONNECT_ALARM);
  24606. 8029fba: 2013 movs r0, #19
  24607. 8029fbc: f00d fe90 bl 8037ce0 <SNMP_SendUserTrap>
  24608. flUpdateLog = true;
  24609. 8029fc0: 4b12 ldr r3, [pc, #72] ; (802a00c <UPS_BatteryConnectMonitor+0x88>)
  24610. 8029fc2: 701d strb r5, [r3, #0]
  24611. 8029fc4: bd38 pop {r3, r4, r5, pc}
  24612. }
  24613. return;
  24614. }
  24615. if (AKBconnectCurrent)
  24616. 8029fc6: b114 cbz r4, 8029fce <UPS_BatteryConnectMonitor+0x4a>
  24617. flCriticalAlarm = true;
  24618. 8029fc8: 4a11 ldr r2, [pc, #68] ; (802a010 <UPS_BatteryConnectMonitor+0x8c>)
  24619. 8029fca: 2101 movs r1, #1
  24620. 8029fcc: 7011 strb r1, [r2, #0]
  24621. // Значение параметра изменилось
  24622. if (AKBconnectCurrent != AKBconnectOldState)
  24623. 8029fce: 781b ldrb r3, [r3, #0]
  24624. 8029fd0: 42a3 cmp r3, r4
  24625. 8029fd2: d00f beq.n 8029ff4 <UPS_BatteryConnectMonitor+0x70>
  24626. 8029fd4: 4d0d ldr r5, [pc, #52] ; (802a00c <UPS_BatteryConnectMonitor+0x88>)
  24627. {
  24628. if (!AKBconnectCurrent){
  24629. log_event_data(LOG_ALARM_AKB, "Норма");
  24630. 8029fd6: 2010 movs r0, #16
  24631. if (AKBconnectCurrent)
  24632. flCriticalAlarm = true;
  24633. // Значение параметра изменилось
  24634. if (AKBconnectCurrent != AKBconnectOldState)
  24635. {
  24636. if (!AKBconnectCurrent){
  24637. 8029fd8: b924 cbnz r4, 8029fe4 <UPS_BatteryConnectMonitor+0x60>
  24638. log_event_data(LOG_ALARM_AKB, "Норма");
  24639. 8029fda: 490e ldr r1, [pc, #56] ; (802a014 <UPS_BatteryConnectMonitor+0x90>)
  24640. 8029fdc: f000 f942 bl 802a264 <log_event_data>
  24641. SNMP_SendUserTrap(BATTERY_CONNECT_NORM);
  24642. 8029fe0: 2014 movs r0, #20
  24643. 8029fe2: e003 b.n 8029fec <UPS_BatteryConnectMonitor+0x68>
  24644. flUpdateLog = true;
  24645. }
  24646. else{
  24647. log_event_data(LOG_ALARM_AKB, "Авария");
  24648. 8029fe4: 4908 ldr r1, [pc, #32] ; (802a008 <UPS_BatteryConnectMonitor+0x84>)
  24649. 8029fe6: f000 f93d bl 802a264 <log_event_data>
  24650. SNMP_SendUserTrap(BATTERY_CONNECT_ALARM);
  24651. 8029fea: 2013 movs r0, #19
  24652. 8029fec: f00d fe78 bl 8037ce0 <SNMP_SendUserTrap>
  24653. flUpdateLog = true;
  24654. 8029ff0: 2301 movs r3, #1
  24655. 8029ff2: 702b strb r3, [r5, #0]
  24656. }
  24657. }
  24658. AKBconnectOldState = AKBconnectCurrent;
  24659. 8029ff4: 4b03 ldr r3, [pc, #12] ; (802a004 <UPS_BatteryConnectMonitor+0x80>)
  24660. 8029ff6: 701c strb r4, [r3, #0]
  24661. 8029ff8: bd38 pop {r3, r4, r5, pc}
  24662. 8029ffa: bf00 nop
  24663. 8029ffc: 2000d7d8 .word 0x2000d7d8
  24664. 802a000: 20000ba2 .word 0x20000ba2
  24665. 802a004: 20000b9e .word 0x20000b9e
  24666. 802a008: 0803930a .word 0x0803930a
  24667. 802a00c: 20000bfc .word 0x20000bfc
  24668. 802a010: 20000b98 .word 0x20000b98
  24669. 802a014: 08039317 .word 0x08039317
  24670. 0802a018 <UPS_Monitor>:
  24671. /**
  24672. * @brief Задача мониторинга параметров UPS
  24673. */
  24674. void UPS_Monitor(void *params)
  24675. {
  24676. 802a018: b570 push {r4, r5, r6, lr}
  24677. vTaskDelay(5000);
  24678. 802a01a: f241 3088 movw r0, #5000 ; 0x1388
  24679. 802a01e: f001 fd47 bl 802bab0 <vTaskDelay>
  24680. for (;;)
  24681. {
  24682. flCriticalAlarm = false;
  24683. 802a022: 4d10 ldr r5, [pc, #64] ; (802a064 <UPS_Monitor+0x4c>)
  24684. flNonCriticalAlarm = false;
  24685. 802a024: 4e10 ldr r6, [pc, #64] ; (802a068 <UPS_Monitor+0x50>)
  24686. void UPS_Monitor(void *params)
  24687. {
  24688. vTaskDelay(5000);
  24689. for (;;)
  24690. {
  24691. flCriticalAlarm = false;
  24692. 802a026: 2400 movs r4, #0
  24693. flNonCriticalAlarm = false;
  24694. // Проверяем флаг подключения UPS
  24695. if (UPS.Present)
  24696. 802a028: 4b10 ldr r3, [pc, #64] ; (802a06c <UPS_Monitor+0x54>)
  24697. void UPS_Monitor(void *params)
  24698. {
  24699. vTaskDelay(5000);
  24700. for (;;)
  24701. {
  24702. flCriticalAlarm = false;
  24703. 802a02a: 702c strb r4, [r5, #0]
  24704. flNonCriticalAlarm = false;
  24705. // Проверяем флаг подключения UPS
  24706. if (UPS.Present)
  24707. 802a02c: f893 302d ldrb.w r3, [r3, #45] ; 0x2d
  24708. {
  24709. vTaskDelay(5000);
  24710. for (;;)
  24711. {
  24712. flCriticalAlarm = false;
  24713. flNonCriticalAlarm = false;
  24714. 802a030: 7034 strb r4, [r6, #0]
  24715. // Проверяем флаг подключения UPS
  24716. if (UPS.Present)
  24717. 802a032: b14b cbz r3, 802a048 <UPS_Monitor+0x30>
  24718. {
  24719. UPS_LineFailMonitor();
  24720. 802a034: f7ff fe42 bl 8029cbc <UPS_LineFailMonitor>
  24721. UPS_LowBatMonitor();
  24722. 802a038: f7ff fe7e bl 8029d38 <UPS_LowBatMonitor>
  24723. UPS_PowerMonitor();
  24724. 802a03c: f7ff febe bl 8029dbc <UPS_PowerMonitor>
  24725. UPS_TemperatureMonitor();
  24726. 802a040: f7ff ff12 bl 8029e68 <UPS_TemperatureMonitor>
  24727. UPS_BatteryConnectMonitor();
  24728. 802a044: f7ff ff9e bl 8029f84 <UPS_BatteryConnectMonitor>
  24729. }
  24730. UPS_ConnectMonitor();
  24731. 802a048: f7ff ff56 bl 8029ef8 <UPS_ConnectMonitor>
  24732. UPS_DI0Monitor();
  24733. 802a04c: f7ff fcb2 bl 80299b4 <UPS_DI0Monitor>
  24734. UPS_CriticalAlarmMonitor();
  24735. 802a050: f7ff fcfe bl 8029a50 <UPS_CriticalAlarmMonitor>
  24736. UPS_NonCriticalAlarmMonitor();
  24737. 802a054: f7ff fda0 bl 8029b98 <UPS_NonCriticalAlarmMonitor>
  24738. vTaskDelay(1000);
  24739. 802a058: f44f 707a mov.w r0, #1000 ; 0x3e8
  24740. 802a05c: f001 fd28 bl 802bab0 <vTaskDelay>
  24741. }
  24742. 802a060: e7e2 b.n 802a028 <UPS_Monitor+0x10>
  24743. 802a062: bf00 nop
  24744. 802a064: 20000b98 .word 0x20000b98
  24745. 802a068: 20000b9f .word 0x20000b9f
  24746. 802a06c: 2000d7d8 .word 0x2000d7d8
  24747. 0802a070 <op_read>:
  24748. }
  24749. static ssize_t op_read(struct ringfs_flash_partition *flash, int address, void *data, size_t size) {
  24750. (void)flash;
  24751. int ret;
  24752. ret = spi_flash_read(address, data, size, 0);
  24753. 802a070: 4608 mov r0, r1
  24754. 802a072: 4611 mov r1, r2
  24755. 802a074: 461a mov r2, r3
  24756. 802a076: 2300 movs r3, #0
  24757. 802a078: f7fc be1e b.w 8026cb8 <spi_flash_read>
  24758. 0802a07c <op_program>:
  24759. }
  24760. static ssize_t op_program(struct ringfs_flash_partition *flash, int address, const void *data, size_t size) {
  24761. (void)flash;
  24762. int ret;
  24763. ret = spi_flash_write(address, data, size, 0);
  24764. 802a07c: 4608 mov r0, r1
  24765. 802a07e: 4611 mov r1, r2
  24766. 802a080: 461a mov r2, r3
  24767. 802a082: 2300 movs r3, #0
  24768. 802a084: f7fc be67 b.w 8026d56 <spi_flash_write>
  24769. 0802a088 <op_sector_erase>:
  24770. #define ALARM_LOG_FLASH_SECTOR_OFFSET 258
  24771. static int op_sector_erase(struct ringfs_flash_partition *flash, int address) {
  24772. (void)flash;
  24773. int ret;
  24774. ret = spi_flash_erase_sector(address, 0);
  24775. 802a088: 4608 mov r0, r1
  24776. 802a08a: 2100 movs r1, #0
  24777. 802a08c: f7fc be73 b.w 8026d76 <spi_flash_erase_sector>
  24778. 0802a090 <log_task>:
  24779. return true;
  24780. }
  24781. }
  24782. void log_task(void* params)
  24783. {
  24784. 802a090: b508 push {r3, lr}
  24785. for(;;){
  24786. flUpdateLog = true;
  24787. 802a092: 4c03 ldr r4, [pc, #12] ; (802a0a0 <log_task+0x10>)
  24788. 802a094: 2501 movs r5, #1
  24789. vTaskDelay(LOG_TIME);
  24790. 802a096: 4803 ldr r0, [pc, #12] ; (802a0a4 <log_task+0x14>)
  24791. }
  24792. void log_task(void* params)
  24793. {
  24794. for(;;){
  24795. flUpdateLog = true;
  24796. 802a098: 7025 strb r5, [r4, #0]
  24797. vTaskDelay(LOG_TIME);
  24798. 802a09a: f001 fd09 bl 802bab0 <vTaskDelay>
  24799. 802a09e: e7fa b.n 802a096 <log_task+0x6>
  24800. 802a0a0: 20000bfc .word 0x20000bfc
  24801. 802a0a4: 000927c0 .word 0x000927c0
  24802. 0802a0a8 <LOG_Disable>:
  24803. /**
  24804. * @brief Отключает журнал для безопасной перезагрузки
  24805. */
  24806. bool LOG_Disable(void)
  24807. {
  24808. 802a0a8: b508 push {r3, lr}
  24809. if (fLogInit) {
  24810. 802a0aa: 4b08 ldr r3, [pc, #32] ; (802a0cc <LOG_Disable+0x24>)
  24811. 802a0ac: 781b ldrb r3, [r3, #0]
  24812. 802a0ae: b15b cbz r3, 802a0c8 <LOG_Disable+0x20>
  24813. /* Ожидаем завершения работы с журнал */
  24814. if ( xSemaphoreTake(log_mutex, 10000) == pdTRUE ) {
  24815. 802a0b0: 4b07 ldr r3, [pc, #28] ; (802a0d0 <LOG_Disable+0x28>)
  24816. 802a0b2: 2100 movs r1, #0
  24817. 802a0b4: 6818 ldr r0, [r3, #0]
  24818. 802a0b6: f242 7210 movw r2, #10000 ; 0x2710
  24819. 802a0ba: 460b mov r3, r1
  24820. 802a0bc: f001 f954 bl 802b368 <xQueueGenericReceive>
  24821. 802a0c0: 1e43 subs r3, r0, #1
  24822. 802a0c2: 4258 negs r0, r3
  24823. 802a0c4: 4158 adcs r0, r3
  24824. 802a0c6: bd08 pop {r3, pc}
  24825. else {
  24826. return false;
  24827. }
  24828. }
  24829. else {
  24830. return true;
  24831. 802a0c8: 2001 movs r0, #1
  24832. }
  24833. }
  24834. 802a0ca: bd08 pop {r3, pc}
  24835. 802a0cc: 20000c04 .word 0x20000c04
  24836. 802a0d0: 20000c00 .word 0x20000c00
  24837. 0802a0d4 <log_init>:
  24838. log_event_data(LOG_SYSTEM_BOOT, "Администратор");
  24839. log_add(")215.7;215.7;220.5;000;50.1;2.30;25.0;00000001;");*/
  24840. }
  24841. }
  24842. void log_init(bool format) {
  24843. 802a0d4: b51f push {r0, r1, r2, r3, r4, lr}
  24844. DBG printf(">>> Event log\n");
  24845. if (!spi_flash_desc.present)
  24846. 802a0d6: 4b22 ldr r3, [pc, #136] ; (802a160 <log_init+0x8c>)
  24847. 802a0d8: 781a ldrb r2, [r3, #0]
  24848. log_event_data(LOG_SYSTEM_BOOT, "Администратор");
  24849. log_add(")215.7;215.7;220.5;000;50.1;2.30;25.0;00000001;");*/
  24850. }
  24851. }
  24852. void log_init(bool format) {
  24853. 802a0da: 4604 mov r4, r0
  24854. DBG printf(">>> Event log\n");
  24855. if (!spi_flash_desc.present)
  24856. 802a0dc: 2a00 cmp r2, #0
  24857. 802a0de: d03e beq.n 802a15e <log_init+0x8a>
  24858. return;
  24859. ringfs_flash.sector_size = spi_flash_desc.sector_size;
  24860. 802a0e0: 685a ldr r2, [r3, #4]
  24861. ringfs_flash.sector_count = spi_flash_desc.sector_count/2 - LOG_FLASH_SECTOR_OFFSET;
  24862. 802a0e2: 895b ldrh r3, [r3, #10]
  24863. void log_init(bool format) {
  24864. DBG printf(">>> Event log\n");
  24865. if (!spi_flash_desc.present)
  24866. return;
  24867. ringfs_flash.sector_size = spi_flash_desc.sector_size;
  24868. 802a0e4: 491f ldr r1, [pc, #124] ; (802a164 <log_init+0x90>)
  24869. ringfs_flash.sector_count = spi_flash_desc.sector_count/2 - LOG_FLASH_SECTOR_OFFSET;
  24870. ringfs_init(&fs, &ringfs_flash, LOG_ENTRY_VERSION, sizeof(log_entry_t));
  24871. 802a0e6: 4820 ldr r0, [pc, #128] ; (802a168 <log_init+0x94>)
  24872. void log_init(bool format) {
  24873. DBG printf(">>> Event log\n");
  24874. if (!spi_flash_desc.present)
  24875. return;
  24876. ringfs_flash.sector_size = spi_flash_desc.sector_size;
  24877. 802a0e8: 600a str r2, [r1, #0]
  24878. ringfs_flash.sector_count = spi_flash_desc.sector_count/2 - LOG_FLASH_SECTOR_OFFSET;
  24879. 802a0ea: 085b lsrs r3, r3, #1
  24880. 802a0ec: 3b04 subs r3, #4
  24881. 802a0ee: 608b str r3, [r1, #8]
  24882. ringfs_init(&fs, &ringfs_flash, LOG_ENTRY_VERSION, sizeof(log_entry_t));
  24883. 802a0f0: 2201 movs r2, #1
  24884. 802a0f2: 2338 movs r3, #56 ; 0x38
  24885. 802a0f4: f000 fba1 bl 802a83a <ringfs_init>
  24886. if (format || ringfs_scan(&fs) != 0)
  24887. 802a0f8: b11c cbz r4, 802a102 <log_init+0x2e>
  24888. ringfs_format(&fs);
  24889. 802a0fa: 481b ldr r0, [pc, #108] ; (802a168 <log_init+0x94>)
  24890. 802a0fc: f000 fba7 bl 802a84e <ringfs_format>
  24891. 802a100: e004 b.n 802a10c <log_init+0x38>
  24892. return;
  24893. ringfs_flash.sector_size = spi_flash_desc.sector_size;
  24894. ringfs_flash.sector_count = spi_flash_desc.sector_count/2 - LOG_FLASH_SECTOR_OFFSET;
  24895. ringfs_init(&fs, &ringfs_flash, LOG_ENTRY_VERSION, sizeof(log_entry_t));
  24896. if (format || ringfs_scan(&fs) != 0)
  24897. 802a102: 4819 ldr r0, [pc, #100] ; (802a168 <log_init+0x94>)
  24898. 802a104: f000 fc85 bl 802aa12 <ringfs_scan>
  24899. 802a108: 2800 cmp r0, #0
  24900. 802a10a: d1f6 bne.n 802a0fa <log_init+0x26>
  24901. ringfs_format(&fs);
  24902. ringfs_flash2.sector_size = spi_flash_desc.sector_size;
  24903. 802a10c: 4b14 ldr r3, [pc, #80] ; (802a160 <log_init+0x8c>)
  24904. 802a10e: 4917 ldr r1, [pc, #92] ; (802a16c <log_init+0x98>)
  24905. 802a110: 685a ldr r2, [r3, #4]
  24906. ringfs_flash2.sector_count = spi_flash_desc.sector_count/2 - LOG_FLASH_SECTOR_OFFSET;
  24907. 802a112: 895b ldrh r3, [r3, #10]
  24908. ringfs_init(&fs, &ringfs_flash, LOG_ENTRY_VERSION, sizeof(log_entry_t));
  24909. if (format || ringfs_scan(&fs) != 0)
  24910. ringfs_format(&fs);
  24911. ringfs_flash2.sector_size = spi_flash_desc.sector_size;
  24912. 802a114: 600a str r2, [r1, #0]
  24913. ringfs_flash2.sector_count = spi_flash_desc.sector_count/2 - LOG_FLASH_SECTOR_OFFSET;
  24914. 802a116: 085b lsrs r3, r3, #1
  24915. 802a118: 3b04 subs r3, #4
  24916. 802a11a: 608b str r3, [r1, #8]
  24917. ringfs_init(&fs2, &ringfs_flash2, LOG_ENTRY_VERSION, sizeof(log_entry_t));
  24918. 802a11c: 4814 ldr r0, [pc, #80] ; (802a170 <log_init+0x9c>)
  24919. 802a11e: 2201 movs r2, #1
  24920. 802a120: 2338 movs r3, #56 ; 0x38
  24921. 802a122: f000 fb8a bl 802a83a <ringfs_init>
  24922. if (format || ringfs_scan(&fs2) != 0)
  24923. 802a126: b11c cbz r4, 802a130 <log_init+0x5c>
  24924. ringfs_format(&fs2);
  24925. 802a128: 4811 ldr r0, [pc, #68] ; (802a170 <log_init+0x9c>)
  24926. 802a12a: f000 fb90 bl 802a84e <ringfs_format>
  24927. 802a12e: e004 b.n 802a13a <log_init+0x66>
  24928. ringfs_flash2.sector_size = spi_flash_desc.sector_size;
  24929. ringfs_flash2.sector_count = spi_flash_desc.sector_count/2 - LOG_FLASH_SECTOR_OFFSET;
  24930. ringfs_init(&fs2, &ringfs_flash2, LOG_ENTRY_VERSION, sizeof(log_entry_t));
  24931. if (format || ringfs_scan(&fs2) != 0)
  24932. 802a130: 480f ldr r0, [pc, #60] ; (802a170 <log_init+0x9c>)
  24933. 802a132: f000 fc6e bl 802aa12 <ringfs_scan>
  24934. 802a136: 2800 cmp r0, #0
  24935. 802a138: d1f6 bne.n 802a128 <log_init+0x54>
  24936. ringfs_format(&fs2);
  24937. fLogInit = true;
  24938. 802a13a: 4b0e ldr r3, [pc, #56] ; (802a174 <log_init+0xa0>)
  24939. 802a13c: 2001 movs r0, #1
  24940. 802a13e: 7018 strb r0, [r3, #0]
  24941. log_mutex = xSemaphoreCreateMutex();
  24942. 802a140: f001 f86c bl 802b21c <xQueueCreateMutex>
  24943. 802a144: 4b0c ldr r3, [pc, #48] ; (802a178 <log_init+0xa4>)
  24944. xTaskCreate(log_task, ( char * ) "log_task", configMINIMAL_STACK_SIZE * 2, NULL, tskIDLE_PRIORITY, NULL);
  24945. 802a146: 490d ldr r1, [pc, #52] ; (802a17c <log_init+0xa8>)
  24946. if (format || ringfs_scan(&fs2) != 0)
  24947. ringfs_format(&fs2);
  24948. fLogInit = true;
  24949. log_mutex = xSemaphoreCreateMutex();
  24950. 802a148: 6018 str r0, [r3, #0]
  24951. xTaskCreate(log_task, ( char * ) "log_task", configMINIMAL_STACK_SIZE * 2, NULL, tskIDLE_PRIORITY, NULL);
  24952. 802a14a: 2300 movs r3, #0
  24953. 802a14c: 9300 str r3, [sp, #0]
  24954. 802a14e: 9301 str r3, [sp, #4]
  24955. 802a150: 9302 str r3, [sp, #8]
  24956. 802a152: 9303 str r3, [sp, #12]
  24957. 802a154: 480a ldr r0, [pc, #40] ; (802a180 <log_init+0xac>)
  24958. 802a156: f44f 7280 mov.w r2, #256 ; 0x100
  24959. 802a15a: f001 fa0f bl 802b57c <xTaskGenericCreate>
  24960. }
  24961. 802a15e: bd1f pop {r0, r1, r2, r3, r4, pc}
  24962. 802a160: 2000c890 .word 0x2000c890
  24963. 802a164: 200006bc .word 0x200006bc
  24964. 802a168: 20000bd0 .word 0x20000bd0
  24965. 802a16c: 200006a4 .word 0x200006a4
  24966. 802a170: 20000ba4 .word 0x20000ba4
  24967. 802a174: 20000c04 .word 0x20000c04
  24968. 802a178: 20000c00 .word 0x20000c00
  24969. 802a17c: 08039348 .word 0x08039348
  24970. 802a180: 0802a091 .word 0x0802a091
  24971. 0802a184 <log_append>:
  24972. }
  24973. return 0;
  24974. }
  24975. int log_append(log_entry_t *entry) {
  24976. 802a184: b530 push {r4, r5, lr}
  24977. int ret;
  24978. TM_RTC_t data;
  24979. ret = xSemaphoreTake( log_mutex, portMAX_DELAY );
  24980. 802a186: 4b12 ldr r3, [pc, #72] ; (802a1d0 <log_append+0x4c>)
  24981. 802a188: 2100 movs r1, #0
  24982. }
  24983. return 0;
  24984. }
  24985. int log_append(log_entry_t *entry) {
  24986. 802a18a: b085 sub sp, #20
  24987. 802a18c: 4604 mov r4, r0
  24988. int ret;
  24989. TM_RTC_t data;
  24990. ret = xSemaphoreTake( log_mutex, portMAX_DELAY );
  24991. 802a18e: f04f 32ff mov.w r2, #4294967295
  24992. 802a192: 6818 ldr r0, [r3, #0]
  24993. 802a194: 460b mov r3, r1
  24994. 802a196: f001 f8e7 bl 802b368 <xQueueGenericReceive>
  24995. if (ret == pdFALSE)
  24996. 802a19a: 4605 mov r5, r0
  24997. 802a19c: b1a8 cbz r0, 802a1ca <log_append+0x46>
  24998. return ret;
  24999. if (!entry->timestamp){
  25000. 802a19e: 6821 ldr r1, [r4, #0]
  25001. 802a1a0: b921 cbnz r1, 802a1ac <log_append+0x28>
  25002. TM_RTC_GetDateTime(&data, TM_RTC_Format_BIN);
  25003. 802a1a2: 4668 mov r0, sp
  25004. 802a1a4: f7fc fb4e bl 8026844 <TM_RTC_GetDateTime>
  25005. entry->timestamp = data.unix;
  25006. 802a1a8: 9b03 ldr r3, [sp, #12]
  25007. 802a1aa: 6023 str r3, [r4, #0]
  25008. }
  25009. if(entry->type == LOG_VALUE)
  25010. 802a1ac: 7923 ldrb r3, [r4, #4]
  25011. 802a1ae: 2b11 cmp r3, #17
  25012. ringfs_append(&fs, entry);
  25013. 802a1b0: bf0c ite eq
  25014. 802a1b2: 4808 ldreq r0, [pc, #32] ; (802a1d4 <log_append+0x50>)
  25015. else
  25016. ringfs_append(&fs2, entry);
  25017. 802a1b4: 4808 ldrne r0, [pc, #32] ; (802a1d8 <log_append+0x54>)
  25018. 802a1b6: 4621 mov r1, r4
  25019. 802a1b8: f000 fb7c bl 802a8b4 <ringfs_append>
  25020. xSemaphoreGive(log_mutex);
  25021. 802a1bc: 4b04 ldr r3, [pc, #16] ; (802a1d0 <log_append+0x4c>)
  25022. 802a1be: 2100 movs r1, #0
  25023. 802a1c0: 6818 ldr r0, [r3, #0]
  25024. 802a1c2: 460a mov r2, r1
  25025. 802a1c4: 460b mov r3, r1
  25026. 802a1c6: f000 ff8f bl 802b0e8 <xQueueGenericSend>
  25027. return ret;
  25028. }
  25029. 802a1ca: 4628 mov r0, r5
  25030. 802a1cc: b005 add sp, #20
  25031. 802a1ce: bd30 pop {r4, r5, pc}
  25032. 802a1d0: 20000c00 .word 0x20000c00
  25033. 802a1d4: 20000bd0 .word 0x20000bd0
  25034. 802a1d8: 20000ba4 .word 0x20000ba4
  25035. 0802a1dc <log_fetch>:
  25036. int log_fetch(log_entry_t *entry, uint32_t timeout) {
  25037. 802a1dc: b570 push {r4, r5, r6, lr}
  25038. int ret;
  25039. ret = xSemaphoreTake( log_mutex, (TickType_t)timeout );
  25040. 802a1de: 4e0d ldr r6, [pc, #52] ; (802a214 <log_fetch+0x38>)
  25041. ringfs_append(&fs2, entry);
  25042. xSemaphoreGive(log_mutex);
  25043. return ret;
  25044. }
  25045. int log_fetch(log_entry_t *entry, uint32_t timeout) {
  25046. 802a1e0: 460a mov r2, r1
  25047. int ret;
  25048. ret = xSemaphoreTake( log_mutex, (TickType_t)timeout );
  25049. 802a1e2: 2100 movs r1, #0
  25050. ringfs_append(&fs2, entry);
  25051. xSemaphoreGive(log_mutex);
  25052. return ret;
  25053. }
  25054. int log_fetch(log_entry_t *entry, uint32_t timeout) {
  25055. 802a1e4: 4605 mov r5, r0
  25056. int ret;
  25057. ret = xSemaphoreTake( log_mutex, (TickType_t)timeout );
  25058. 802a1e6: 460b mov r3, r1
  25059. 802a1e8: 6830 ldr r0, [r6, #0]
  25060. 802a1ea: f001 f8bd bl 802b368 <xQueueGenericReceive>
  25061. if (ret == pdFALSE)
  25062. 802a1ee: 4604 mov r4, r0
  25063. 802a1f0: b170 cbz r0, 802a210 <log_fetch+0x34>
  25064. return ret;
  25065. if(entry->type == LOG_VALUE)
  25066. 802a1f2: 792b ldrb r3, [r5, #4]
  25067. 802a1f4: 2b11 cmp r3, #17
  25068. ret = ringfs_fetch(&fs, entry);
  25069. 802a1f6: bf0c ite eq
  25070. 802a1f8: 4807 ldreq r0, [pc, #28] ; (802a218 <log_fetch+0x3c>)
  25071. else
  25072. ret = ringfs_fetch(&fs2, entry);
  25073. 802a1fa: 4808 ldrne r0, [pc, #32] ; (802a21c <log_fetch+0x40>)
  25074. 802a1fc: 4629 mov r1, r5
  25075. 802a1fe: f000 fbc3 bl 802a988 <ringfs_fetch>
  25076. xSemaphoreGive(log_mutex);
  25077. 802a202: 2100 movs r1, #0
  25078. if (ret == pdFALSE)
  25079. return ret;
  25080. if(entry->type == LOG_VALUE)
  25081. ret = ringfs_fetch(&fs, entry);
  25082. else
  25083. ret = ringfs_fetch(&fs2, entry);
  25084. 802a204: 4604 mov r4, r0
  25085. xSemaphoreGive(log_mutex);
  25086. 802a206: 460a mov r2, r1
  25087. 802a208: 6830 ldr r0, [r6, #0]
  25088. 802a20a: 460b mov r3, r1
  25089. 802a20c: f000 ff6c bl 802b0e8 <xQueueGenericSend>
  25090. return ret;
  25091. }
  25092. 802a210: 4620 mov r0, r4
  25093. 802a212: bd70 pop {r4, r5, r6, pc}
  25094. 802a214: 20000c00 .word 0x20000c00
  25095. 802a218: 20000bd0 .word 0x20000bd0
  25096. 802a21c: 20000ba4 .word 0x20000ba4
  25097. 0802a220 <log_rewind>:
  25098. int log_rewind(log_entry_t *entry, uint32_t timeout) {
  25099. 802a220: b570 push {r4, r5, r6, lr}
  25100. int ret;
  25101. ret = xSemaphoreTake( log_mutex, (TickType_t)timeout );
  25102. 802a222: 4d0d ldr r5, [pc, #52] ; (802a258 <log_rewind+0x38>)
  25103. ret = ringfs_fetch(&fs2, entry);
  25104. xSemaphoreGive(log_mutex);
  25105. return ret;
  25106. }
  25107. int log_rewind(log_entry_t *entry, uint32_t timeout) {
  25108. 802a224: 460a mov r2, r1
  25109. int ret;
  25110. ret = xSemaphoreTake( log_mutex, (TickType_t)timeout );
  25111. 802a226: 2100 movs r1, #0
  25112. ret = ringfs_fetch(&fs2, entry);
  25113. xSemaphoreGive(log_mutex);
  25114. return ret;
  25115. }
  25116. int log_rewind(log_entry_t *entry, uint32_t timeout) {
  25117. 802a228: 4606 mov r6, r0
  25118. int ret;
  25119. ret = xSemaphoreTake( log_mutex, (TickType_t)timeout );
  25120. 802a22a: 460b mov r3, r1
  25121. 802a22c: 6828 ldr r0, [r5, #0]
  25122. 802a22e: f001 f89b bl 802b368 <xQueueGenericReceive>
  25123. if (ret == pdFALSE)
  25124. 802a232: 4604 mov r4, r0
  25125. 802a234: b168 cbz r0, 802a252 <log_rewind+0x32>
  25126. return ret;
  25127. if(entry->type == LOG_VALUE)
  25128. 802a236: 7933 ldrb r3, [r6, #4]
  25129. 802a238: 2b11 cmp r3, #17
  25130. ret = ringfs_rewind(&fs);
  25131. 802a23a: bf0c ite eq
  25132. 802a23c: 4807 ldreq r0, [pc, #28] ; (802a25c <log_rewind+0x3c>)
  25133. else
  25134. ret = ringfs_rewind(&fs2);
  25135. 802a23e: 4808 ldrne r0, [pc, #32] ; (802a260 <log_rewind+0x40>)
  25136. 802a240: f000 fbdc bl 802a9fc <ringfs_rewind>
  25137. xSemaphoreGive(log_mutex);
  25138. 802a244: 2100 movs r1, #0
  25139. if (ret == pdFALSE)
  25140. return ret;
  25141. if(entry->type == LOG_VALUE)
  25142. ret = ringfs_rewind(&fs);
  25143. else
  25144. ret = ringfs_rewind(&fs2);
  25145. 802a246: 4604 mov r4, r0
  25146. xSemaphoreGive(log_mutex);
  25147. 802a248: 460a mov r2, r1
  25148. 802a24a: 6828 ldr r0, [r5, #0]
  25149. 802a24c: 460b mov r3, r1
  25150. 802a24e: f000 ff4b bl 802b0e8 <xQueueGenericSend>
  25151. return ret;
  25152. }
  25153. 802a252: 4620 mov r0, r4
  25154. 802a254: bd70 pop {r4, r5, r6, pc}
  25155. 802a256: bf00 nop
  25156. 802a258: 20000c00 .word 0x20000c00
  25157. 802a25c: 20000bd0 .word 0x20000bd0
  25158. 802a260: 20000ba4 .word 0x20000ba4
  25159. 0802a264 <log_event_data>:
  25160. xSemaphoreGive(log_mutex);
  25161. return ret;
  25162. }
  25163. void log_event_data(log_type_t type, char *data)
  25164. {
  25165. 802a264: b500 push {lr}
  25166. 802a266: b08f sub sp, #60 ; 0x3c
  25167. log_entry_t entry_data;
  25168. entry_data.timestamp = 0;
  25169. 802a268: 2300 movs r3, #0
  25170. 802a26a: 9300 str r3, [sp, #0]
  25171. entry_data.type = type;
  25172. strncpy(entry_data.data, data, 49);
  25173. 802a26c: 446b add r3, sp
  25174. void log_event_data(log_type_t type, char *data)
  25175. {
  25176. log_entry_t entry_data;
  25177. entry_data.timestamp = 0;
  25178. entry_data.type = type;
  25179. 802a26e: f88d 0004 strb.w r0, [sp, #4]
  25180. strncpy(entry_data.data, data, 49);
  25181. 802a272: 2231 movs r2, #49 ; 0x31
  25182. 802a274: 1d58 adds r0, r3, #5
  25183. 802a276: f7f8 f85f bl 8022338 <strncpy>
  25184. if (fLogInit)
  25185. 802a27a: 4b04 ldr r3, [pc, #16] ; (802a28c <log_event_data+0x28>)
  25186. 802a27c: 781b ldrb r3, [r3, #0]
  25187. 802a27e: b113 cbz r3, 802a286 <log_event_data+0x22>
  25188. log_append(&entry_data);
  25189. 802a280: 4668 mov r0, sp
  25190. 802a282: f7ff ff7f bl 802a184 <log_append>
  25191. }
  25192. 802a286: b00f add sp, #60 ; 0x3c
  25193. 802a288: bd00 pop {pc}
  25194. 802a28a: bf00 nop
  25195. 802a28c: 20000c04 .word 0x20000c04
  25196. 0802a290 <log_add>:
  25197. void log_add(char *log_data)
  25198. {
  25199. 802a290: b530 push {r4, r5, lr}
  25200. 802a292: b08f sub sp, #60 ; 0x3c
  25201. 802a294: 4605 mov r5, r0
  25202. char buf_value[50];
  25203. uint8_t i, len;
  25204. memset(buf_value, 0, 50);
  25205. 802a296: 2100 movs r1, #0
  25206. 802a298: 2232 movs r2, #50 ; 0x32
  25207. 802a29a: a801 add r0, sp, #4
  25208. 802a29c: f7f7 fdbc bl 8021e18 <memset>
  25209. len = strlen(log_data);
  25210. 802a2a0: 4628 mov r0, r5
  25211. 802a2a2: f7f7 ff91 bl 80221c8 <strlen>
  25212. 802a2a6: b2c4 uxtb r4, r0
  25213. strncpy(buf_value, log_data, len);
  25214. 802a2a8: 4629 mov r1, r5
  25215. 802a2aa: a801 add r0, sp, #4
  25216. 802a2ac: 4622 mov r2, r4
  25217. 802a2ae: f7f8 f843 bl 8022338 <strncpy>
  25218. buf_value[0] = '\"';
  25219. 802a2b2: 2322 movs r3, #34 ; 0x22
  25220. 802a2b4: f88d 3004 strb.w r3, [sp, #4]
  25221. for(i = 0; i < len; i++)
  25222. {
  25223. if(buf_value[i] == ' ')
  25224. buf_value[i] = ';';
  25225. 802a2b8: 213b movs r1, #59 ; 0x3b
  25226. len = strlen(log_data);
  25227. strncpy(buf_value, log_data, len);
  25228. buf_value[0] = '\"';
  25229. for(i = 0; i < len; i++)
  25230. 802a2ba: 2300 movs r3, #0
  25231. 802a2bc: e005 b.n 802a2ca <log_add+0x3a>
  25232. {
  25233. if(buf_value[i] == ' ')
  25234. 802a2be: aa01 add r2, sp, #4
  25235. 802a2c0: 5c98 ldrb r0, [r3, r2]
  25236. 802a2c2: 2820 cmp r0, #32
  25237. buf_value[i] = ';';
  25238. 802a2c4: bf08 it eq
  25239. 802a2c6: 5499 strbeq r1, [r3, r2]
  25240. 802a2c8: 3301 adds r3, #1
  25241. len = strlen(log_data);
  25242. strncpy(buf_value, log_data, len);
  25243. buf_value[0] = '\"';
  25244. for(i = 0; i < len; i++)
  25245. 802a2ca: b2da uxtb r2, r3
  25246. 802a2cc: 42a2 cmp r2, r4
  25247. 802a2ce: d3f6 bcc.n 802a2be <log_add+0x2e>
  25248. {
  25249. if(buf_value[i] == ' ')
  25250. buf_value[i] = ';';
  25251. }
  25252. buf_value[len - 1] = ';';
  25253. 802a2d0: ab0e add r3, sp, #56 ; 0x38
  25254. 802a2d2: 191c adds r4, r3, r4
  25255. 802a2d4: 233b movs r3, #59 ; 0x3b
  25256. 802a2d6: f804 3c35 strb.w r3, [r4, #-53]
  25257. if(fLogInit){
  25258. 802a2da: 4b04 ldr r3, [pc, #16] ; (802a2ec <log_add+0x5c>)
  25259. 802a2dc: 781b ldrb r3, [r3, #0]
  25260. 802a2de: b11b cbz r3, 802a2e8 <log_add+0x58>
  25261. if(fs.write.slot>67)
  25262. {
  25263. log_entry_t entry_data;
  25264. entry_data.timestamp = 0;
  25265. log_event_data(LOG_VALUE, buf_value);
  25266. 802a2e0: 2011 movs r0, #17
  25267. 802a2e2: a901 add r1, sp, #4
  25268. 802a2e4: f7ff ffbe bl 802a264 <log_event_data>
  25269. }
  25270. else
  25271. log_event_data(LOG_VALUE, buf_value);
  25272. }
  25273. }
  25274. 802a2e8: b00f add sp, #60 ; 0x3c
  25275. 802a2ea: bd30 pop {r4, r5, pc}
  25276. 802a2ec: 20000c04 .word 0x20000c04
  25277. 0802a2f0 <LOG_IsInit>:
  25278. * @brief Возвращает true если журнал проинициализирован
  25279. */
  25280. bool LOG_IsInit()
  25281. {
  25282. return fLogInit;
  25283. }
  25284. 802a2f0: 4b01 ldr r3, [pc, #4] ; (802a2f8 <LOG_IsInit+0x8>)
  25285. 802a2f2: 7818 ldrb r0, [r3, #0]
  25286. 802a2f4: 4770 bx lr
  25287. 802a2f6: bf00 nop
  25288. 802a2f8: 20000c04 .word 0x20000c04
  25289. 0802a2fc <LOG_GetPageCount>:
  25290. /**
  25291. * @brief Возвращает общее количество страниц
  25292. */
  25293. uint32_t LOG_GetPageCount(void)
  25294. {
  25295. 802a2fc: b508 push {r3, lr}
  25296. return (((ringfs_count_estimate(&fs)) / 10) + 1);
  25297. 802a2fe: 4804 ldr r0, [pc, #16] ; (802a310 <LOG_GetPageCount+0x14>)
  25298. 802a300: f000 fac6 bl 802a890 <ringfs_count_estimate>
  25299. 802a304: 230a movs r3, #10
  25300. 802a306: fb90 f0f3 sdiv r0, r0, r3
  25301. }
  25302. 802a30a: 3001 adds r0, #1
  25303. 802a30c: bd08 pop {r3, pc}
  25304. 802a30e: bf00 nop
  25305. 802a310: 20000bd0 .word 0x20000bd0
  25306. 0802a314 <LOG_GetTotalSTRCount>:
  25307. uint32_t LOG_GetTotalSTRCount(void)
  25308. {
  25309. return ringfs_count_estimate(&fs);
  25310. 802a314: 4801 ldr r0, [pc, #4] ; (802a31c <LOG_GetTotalSTRCount+0x8>)
  25311. 802a316: f000 babb b.w 802a890 <ringfs_count_estimate>
  25312. 802a31a: bf00 nop
  25313. 802a31c: 20000bd0 .word 0x20000bd0
  25314. 0802a320 <LOG_GetPage>:
  25315. }
  25316. void LOG_GetPage(char *str, uint32_t page)
  25317. {
  25318. 802a320: e92d 43f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, lr}
  25319. 802a324: b09d sub sp, #116 ; 0x74
  25320. 802a326: 460d mov r5, r1
  25321. 802a328: 4606 mov r6, r0
  25322. TM_RTC_t rtc_data;
  25323. log_entry_t entry;
  25324. char buf[20];
  25325. uint8_t i;
  25326. int start =LOG_GetTotalSTRCount();//(fs.write.sector*fs.slots_per_sector + fs.write.slot);
  25327. 802a32a: f7ff fff3 bl 802a314 <LOG_GetTotalSTRCount>
  25328. memset(buf, 0, 20);
  25329. 802a32e: 2100 movs r1, #0
  25330. {
  25331. TM_RTC_t rtc_data;
  25332. log_entry_t entry;
  25333. char buf[20];
  25334. uint8_t i;
  25335. int start =LOG_GetTotalSTRCount();//(fs.write.sector*fs.slots_per_sector + fs.write.slot);
  25336. 802a330: 4604 mov r4, r0
  25337. memset(buf, 0, 20);
  25338. 802a332: 2214 movs r2, #20
  25339. 802a334: a809 add r0, sp, #36 ; 0x24
  25340. for(i=0; i < 10; i++){
  25341. fs.cursor_position = start - 10*(page-1) - 1 - i;
  25342. 802a336: f06f 0809 mvn.w r8, #9
  25343. log_entry_t entry;
  25344. char buf[20];
  25345. uint8_t i;
  25346. int start =LOG_GetTotalSTRCount();//(fs.write.sector*fs.slots_per_sector + fs.write.slot);
  25347. memset(buf, 0, 20);
  25348. 802a33a: f7f7 fd6d bl 8021e18 <memset>
  25349. for(i=0; i < 10; i++){
  25350. fs.cursor_position = start - 10*(page-1) - 1 - i;
  25351. 802a33e: fb08 4805 mla r8, r8, r5, r4
  25352. 802a342: 4c2a ldr r4, [pc, #168] ; (802a3ec <LOG_GetPage+0xcc>)
  25353. 802a344: f108 0809 add.w r8, r8, #9
  25354. 802a348: 2500 movs r5, #0
  25355. fs.cursor.slot = fs.cursor_position%fs.slots_per_sector;
  25356. }
  25357. entry.type = LOG_VALUE;
  25358. log_fetch(&entry, portMAX_DELAY);
  25359. entry.data[49] = 0;
  25360. strncat(str, entry.data, strlen(entry.data));
  25361. 802a34a: f10d 073d add.w r7, sp, #61 ; 0x3d
  25362. uint32_t LOG_GetTotalSTRCount(void)
  25363. {
  25364. return ringfs_count_estimate(&fs);
  25365. }
  25366. void LOG_GetPage(char *str, uint32_t page)
  25367. 802a34e: ebc5 0308 rsb r3, r5, r8
  25368. int start =LOG_GetTotalSTRCount();//(fs.write.sector*fs.slots_per_sector + fs.write.slot);
  25369. memset(buf, 0, 20);
  25370. for(i=0; i < 10; i++){
  25371. fs.cursor_position = start - 10*(page-1) - 1 - i;
  25372. if(fs.cursor_position < 0)
  25373. 802a352: 2b00 cmp r3, #0
  25374. uint8_t i;
  25375. int start =LOG_GetTotalSTRCount();//(fs.write.sector*fs.slots_per_sector + fs.write.slot);
  25376. memset(buf, 0, 20);
  25377. for(i=0; i < 10; i++){
  25378. fs.cursor_position = start - 10*(page-1) - 1 - i;
  25379. 802a354: 62a3 str r3, [r4, #40] ; 0x28
  25380. if(fs.cursor_position < 0)
  25381. 802a356: db46 blt.n 802a3e6 <LOG_GetPage+0xc6>
  25382. break;
  25383. else{
  25384. fs.cursor.sector = (fs.read.sector + fs.cursor_position/fs.slots_per_sector)%fs.flash->sector_count;
  25385. 802a358: f8d4 900c ldr.w r9, [r4, #12]
  25386. 802a35c: 6920 ldr r0, [r4, #16]
  25387. 802a35e: 6821 ldr r1, [r4, #0]
  25388. 802a360: fb93 f2f9 sdiv r2, r3, r9
  25389. 802a364: eb02 0e00 add.w lr, r2, r0
  25390. 802a368: 6888 ldr r0, [r1, #8]
  25391. 802a36a: fb9e fcf0 sdiv ip, lr, r0
  25392. 802a36e: fb00 e01c mls r0, r0, ip, lr
  25393. fs.cursor.slot = fs.cursor_position%fs.slots_per_sector;
  25394. 802a372: fb09 3312 mls r3, r9, r2, r3
  25395. for(i=0; i < 10; i++){
  25396. fs.cursor_position = start - 10*(page-1) - 1 - i;
  25397. if(fs.cursor_position < 0)
  25398. break;
  25399. else{
  25400. fs.cursor.sector = (fs.read.sector + fs.cursor_position/fs.slots_per_sector)%fs.flash->sector_count;
  25401. 802a376: 6220 str r0, [r4, #32]
  25402. fs.cursor.slot = fs.cursor_position%fs.slots_per_sector;
  25403. 802a378: 6263 str r3, [r4, #36] ; 0x24
  25404. }
  25405. entry.type = LOG_VALUE;
  25406. log_fetch(&entry, portMAX_DELAY);
  25407. 802a37a: f04f 31ff mov.w r1, #4294967295
  25408. break;
  25409. else{
  25410. fs.cursor.sector = (fs.read.sector + fs.cursor_position/fs.slots_per_sector)%fs.flash->sector_count;
  25411. fs.cursor.slot = fs.cursor_position%fs.slots_per_sector;
  25412. }
  25413. entry.type = LOG_VALUE;
  25414. 802a37e: 2311 movs r3, #17
  25415. log_fetch(&entry, portMAX_DELAY);
  25416. 802a380: a80e add r0, sp, #56 ; 0x38
  25417. break;
  25418. else{
  25419. fs.cursor.sector = (fs.read.sector + fs.cursor_position/fs.slots_per_sector)%fs.flash->sector_count;
  25420. fs.cursor.slot = fs.cursor_position%fs.slots_per_sector;
  25421. }
  25422. entry.type = LOG_VALUE;
  25423. 802a382: f88d 303c strb.w r3, [sp, #60] ; 0x3c
  25424. log_fetch(&entry, portMAX_DELAY);
  25425. 802a386: f7ff ff29 bl 802a1dc <log_fetch>
  25426. entry.data[49] = 0;
  25427. 802a38a: 2300 movs r3, #0
  25428. strncat(str, entry.data, strlen(entry.data));
  25429. 802a38c: 4638 mov r0, r7
  25430. fs.cursor.sector = (fs.read.sector + fs.cursor_position/fs.slots_per_sector)%fs.flash->sector_count;
  25431. fs.cursor.slot = fs.cursor_position%fs.slots_per_sector;
  25432. }
  25433. entry.type = LOG_VALUE;
  25434. log_fetch(&entry, portMAX_DELAY);
  25435. entry.data[49] = 0;
  25436. 802a38e: f88d 306e strb.w r3, [sp, #110] ; 0x6e
  25437. strncat(str, entry.data, strlen(entry.data));
  25438. 802a392: f7f7 ff19 bl 80221c8 <strlen>
  25439. 802a396: 4639 mov r1, r7
  25440. 802a398: 4602 mov r2, r0
  25441. 802a39a: 4630 mov r0, r6
  25442. 802a39c: f7f7 ff44 bl 8022228 <strncat>
  25443. TM_RTC_GetDateTimeFromUnix(&rtc_data, entry.timestamp);
  25444. 802a3a0: a805 add r0, sp, #20
  25445. 802a3a2: 990e ldr r1, [sp, #56] ; 0x38
  25446. 802a3a4: f7fc fade bl 8026964 <TM_RTC_GetDateTimeFromUnix>
  25447. sprintf(buf, "%02i.%02i.%02i %02i:%02i:%02i", rtc_data.date, rtc_data.month,
  25448. 802a3a8: f89d 101d ldrb.w r1, [sp, #29]
  25449. 802a3ac: f89d 201b ldrb.w r2, [sp, #27]
  25450. 802a3b0: 9100 str r1, [sp, #0]
  25451. 802a3b2: f89d 1019 ldrb.w r1, [sp, #25]
  25452. 802a3b6: f89d 301c ldrb.w r3, [sp, #28]
  25453. 802a3ba: 9101 str r1, [sp, #4]
  25454. 802a3bc: f89d 1018 ldrb.w r1, [sp, #24]
  25455. 802a3c0: 9102 str r1, [sp, #8]
  25456. 802a3c2: f89d 1014 ldrb.w r1, [sp, #20]
  25457. 802a3c6: a809 add r0, sp, #36 ; 0x24
  25458. 802a3c8: 9103 str r1, [sp, #12]
  25459. 802a3ca: 4909 ldr r1, [pc, #36] ; (802a3f0 <LOG_GetPage+0xd0>)
  25460. 802a3cc: f7fd fc8c bl 8027ce8 <tfp_sprintf>
  25461. rtc_data.year, rtc_data.hours, rtc_data.minutes, rtc_data.seconds);
  25462. strcat(str, buf);
  25463. 802a3d0: a909 add r1, sp, #36 ; 0x24
  25464. 802a3d2: 4630 mov r0, r6
  25465. 802a3d4: f7f7 fd86 bl 8021ee4 <strcat>
  25466. 802a3d8: 3501 adds r5, #1
  25467. strcat(str, "\",");
  25468. 802a3da: 4630 mov r0, r6
  25469. 802a3dc: 4905 ldr r1, [pc, #20] ; (802a3f4 <LOG_GetPage+0xd4>)
  25470. 802a3de: f7f7 fd81 bl 8021ee4 <strcat>
  25471. char buf[20];
  25472. uint8_t i;
  25473. int start =LOG_GetTotalSTRCount();//(fs.write.sector*fs.slots_per_sector + fs.write.slot);
  25474. memset(buf, 0, 20);
  25475. for(i=0; i < 10; i++){
  25476. 802a3e2: 2d0a cmp r5, #10
  25477. 802a3e4: d1b3 bne.n 802a34e <LOG_GetPage+0x2e>
  25478. sprintf(buf, "%02i.%02i.%02i %02i:%02i:%02i", rtc_data.date, rtc_data.month,
  25479. rtc_data.year, rtc_data.hours, rtc_data.minutes, rtc_data.seconds);
  25480. strcat(str, buf);
  25481. strcat(str, "\",");
  25482. }
  25483. }
  25484. 802a3e6: b01d add sp, #116 ; 0x74
  25485. 802a3e8: e8bd 83f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, pc}
  25486. 802a3ec: 20000bd0 .word 0x20000bd0
  25487. 802a3f0: 08039351 .word 0x08039351
  25488. 802a3f4: 0803936f .word 0x0803936f
  25489. 0802a3f8 <LOG_GetData>:
  25490. uint32_t LOG_GetData(int ptr, char *str, uint32_t size, bool start)
  25491. {
  25492. 802a3f8: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  25493. 802a3fc: b09c sub sp, #112 ; 0x70
  25494. 802a3fe: 4690 mov r8, r2
  25495. TM_RTC_t rtc_data;
  25496. log_entry_t entry;
  25497. char buf[20];
  25498. uint8_t i;
  25499. entry.type = LOG_VALUE;
  25500. 802a400: 2211 movs r2, #17
  25501. strcat(str, "\",");
  25502. }
  25503. }
  25504. uint32_t LOG_GetData(int ptr, char *str, uint32_t size, bool start)
  25505. {
  25506. 802a402: 4605 mov r5, r0
  25507. 802a404: 460c mov r4, r1
  25508. TM_RTC_t rtc_data;
  25509. log_entry_t entry;
  25510. char buf[20];
  25511. uint8_t i;
  25512. entry.type = LOG_VALUE;
  25513. 802a406: f88d 203c strb.w r2, [sp, #60] ; 0x3c
  25514. if(start)
  25515. 802a40a: b123 cbz r3, 802a416 <LOG_GetData+0x1e>
  25516. log_rewind(&entry, portMAX_DELAY);
  25517. 802a40c: a80e add r0, sp, #56 ; 0x38
  25518. 802a40e: f04f 31ff mov.w r1, #4294967295
  25519. 802a412: f7ff ff05 bl 802a220 <log_rewind>
  25520. fs.cursor_position = ptr/STRING_SIZE;
  25521. 802a416: 4b2c ldr r3, [pc, #176] ; (802a4c8 <LOG_GetData+0xd0>)
  25522. 802a418: 2040 movs r0, #64 ; 0x40
  25523. 802a41a: fb95 f0f0 sdiv r0, r5, r0
  25524. fs.cursor.sector = (fs.read.sector + fs.cursor_position/fs.slots_per_sector)%fs.flash->sector_count;
  25525. 802a41e: 681e ldr r6, [r3, #0]
  25526. 802a420: 68dd ldr r5, [r3, #12]
  25527. 802a422: 691f ldr r7, [r3, #16]
  25528. 802a424: 68b6 ldr r6, [r6, #8]
  25529. uint8_t i;
  25530. entry.type = LOG_VALUE;
  25531. if(start)
  25532. log_rewind(&entry, portMAX_DELAY);
  25533. fs.cursor_position = ptr/STRING_SIZE;
  25534. 802a426: 6298 str r0, [r3, #40] ; 0x28
  25535. fs.cursor.sector = (fs.read.sector + fs.cursor_position/fs.slots_per_sector)%fs.flash->sector_count;
  25536. 802a428: fb90 f1f5 sdiv r1, r0, r5
  25537. 802a42c: 19cf adds r7, r1, r7
  25538. 802a42e: fb97 f2f6 sdiv r2, r7, r6
  25539. 802a432: fb06 7612 mls r6, r6, r2, r7
  25540. fs.cursor.slot = fs.cursor_position%fs.slots_per_sector;
  25541. 802a436: fb05 0011 mls r0, r5, r1, r0
  25542. entry.type = LOG_VALUE;
  25543. if(start)
  25544. log_rewind(&entry, portMAX_DELAY);
  25545. fs.cursor_position = ptr/STRING_SIZE;
  25546. fs.cursor.sector = (fs.read.sector + fs.cursor_position/fs.slots_per_sector)%fs.flash->sector_count;
  25547. 802a43a: 621e str r6, [r3, #32]
  25548. fs.cursor.slot = fs.cursor_position%fs.slots_per_sector;
  25549. 802a43c: 6258 str r0, [r3, #36] ; 0x24
  25550. for(i = 0; i < size/STRING_SIZE; i++)
  25551. 802a43e: ea4f 1798 mov.w r7, r8, lsr #6
  25552. 802a442: 2500 movs r5, #0
  25553. {
  25554. entry.type = LOG_VALUE;
  25555. log_fetch(&entry, portMAX_DELAY);
  25556. entry.data[49] = 0;
  25557. strncat(str, &entry.data[1], (strlen(entry.data) - 1));
  25558. 802a444: f10d 063d add.w r6, sp, #61 ; 0x3d
  25559. fs.cursor_position = ptr/STRING_SIZE;
  25560. fs.cursor.sector = (fs.read.sector + fs.cursor_position/fs.slots_per_sector)%fs.flash->sector_count;
  25561. fs.cursor.slot = fs.cursor_position%fs.slots_per_sector;
  25562. for(i = 0; i < size/STRING_SIZE; i++)
  25563. 802a448: e035 b.n 802a4b6 <LOG_GetData+0xbe>
  25564. {
  25565. entry.type = LOG_VALUE;
  25566. 802a44a: 2311 movs r3, #17
  25567. log_fetch(&entry, portMAX_DELAY);
  25568. 802a44c: f04f 31ff mov.w r1, #4294967295
  25569. 802a450: a80e add r0, sp, #56 ; 0x38
  25570. fs.cursor.sector = (fs.read.sector + fs.cursor_position/fs.slots_per_sector)%fs.flash->sector_count;
  25571. fs.cursor.slot = fs.cursor_position%fs.slots_per_sector;
  25572. for(i = 0; i < size/STRING_SIZE; i++)
  25573. {
  25574. entry.type = LOG_VALUE;
  25575. 802a452: f88d 303c strb.w r3, [sp, #60] ; 0x3c
  25576. log_fetch(&entry, portMAX_DELAY);
  25577. 802a456: f7ff fec1 bl 802a1dc <log_fetch>
  25578. entry.data[49] = 0;
  25579. 802a45a: 2300 movs r3, #0
  25580. strncat(str, &entry.data[1], (strlen(entry.data) - 1));
  25581. 802a45c: 4630 mov r0, r6
  25582. for(i = 0; i < size/STRING_SIZE; i++)
  25583. {
  25584. entry.type = LOG_VALUE;
  25585. log_fetch(&entry, portMAX_DELAY);
  25586. entry.data[49] = 0;
  25587. 802a45e: f88d 306e strb.w r3, [sp, #110] ; 0x6e
  25588. strncat(str, &entry.data[1], (strlen(entry.data) - 1));
  25589. 802a462: f7f7 feb1 bl 80221c8 <strlen>
  25590. 802a466: f10d 013e add.w r1, sp, #62 ; 0x3e
  25591. 802a46a: 1e42 subs r2, r0, #1
  25592. 802a46c: 4620 mov r0, r4
  25593. 802a46e: f7f7 fedb bl 8022228 <strncat>
  25594. TM_RTC_GetDateTimeFromUnix(&rtc_data, entry.timestamp);
  25595. 802a472: a805 add r0, sp, #20
  25596. 802a474: 990e ldr r1, [sp, #56] ; 0x38
  25597. 802a476: f7fc fa75 bl 8026964 <TM_RTC_GetDateTimeFromUnix>
  25598. sprintf(buf, "%02i.%02i.%02i %02i:%02i:%02i", rtc_data.date, rtc_data.month,
  25599. 802a47a: f89d 101d ldrb.w r1, [sp, #29]
  25600. 802a47e: f89d 201b ldrb.w r2, [sp, #27]
  25601. 802a482: 9100 str r1, [sp, #0]
  25602. 802a484: f89d 1019 ldrb.w r1, [sp, #25]
  25603. 802a488: f89d 301c ldrb.w r3, [sp, #28]
  25604. 802a48c: 9101 str r1, [sp, #4]
  25605. 802a48e: f89d 1018 ldrb.w r1, [sp, #24]
  25606. 802a492: 9102 str r1, [sp, #8]
  25607. 802a494: f89d 1014 ldrb.w r1, [sp, #20]
  25608. 802a498: a809 add r0, sp, #36 ; 0x24
  25609. 802a49a: 9103 str r1, [sp, #12]
  25610. 802a49c: 490b ldr r1, [pc, #44] ; (802a4cc <LOG_GetData+0xd4>)
  25611. 802a49e: f7fd fc23 bl 8027ce8 <tfp_sprintf>
  25612. rtc_data.year, rtc_data.hours, rtc_data.minutes, rtc_data.seconds);
  25613. strcat(str, buf);
  25614. 802a4a2: a909 add r1, sp, #36 ; 0x24
  25615. 802a4a4: 4620 mov r0, r4
  25616. 802a4a6: f7f7 fd1d bl 8021ee4 <strcat>
  25617. strcat(str, "\n");
  25618. 802a4aa: 4620 mov r0, r4
  25619. 802a4ac: 4908 ldr r1, [pc, #32] ; (802a4d0 <LOG_GetData+0xd8>)
  25620. 802a4ae: f7f7 fd19 bl 8021ee4 <strcat>
  25621. fs.cursor_position = ptr/STRING_SIZE;
  25622. fs.cursor.sector = (fs.read.sector + fs.cursor_position/fs.slots_per_sector)%fs.flash->sector_count;
  25623. fs.cursor.slot = fs.cursor_position%fs.slots_per_sector;
  25624. for(i = 0; i < size/STRING_SIZE; i++)
  25625. 802a4b2: 3501 adds r5, #1
  25626. 802a4b4: b2ed uxtb r5, r5
  25627. 802a4b6: 42bd cmp r5, r7
  25628. 802a4b8: d3c7 bcc.n 802a44a <LOG_GetData+0x52>
  25629. sprintf(buf, "%02i.%02i.%02i %02i:%02i:%02i", rtc_data.date, rtc_data.month,
  25630. rtc_data.year, rtc_data.hours, rtc_data.minutes, rtc_data.seconds);
  25631. strcat(str, buf);
  25632. strcat(str, "\n");
  25633. }
  25634. return strlen(str);
  25635. 802a4ba: 4620 mov r0, r4
  25636. 802a4bc: f7f7 fe84 bl 80221c8 <strlen>
  25637. }
  25638. 802a4c0: b01c add sp, #112 ; 0x70
  25639. 802a4c2: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  25640. 802a4c6: bf00 nop
  25641. 802a4c8: 20000bd0 .word 0x20000bd0
  25642. 802a4cc: 08039351 .word 0x08039351
  25643. 802a4d0: 080405c0 .word 0x080405c0
  25644. 0802a4d4 <History_GetPageCount>:
  25645. /**
  25646. * @brief Возвращает общее количество страниц
  25647. */
  25648. uint32_t History_GetPageCount(void)
  25649. {
  25650. 802a4d4: b508 push {r3, lr}
  25651. return (((ringfs_count_estimate(&fs2)) / 10) + 1);
  25652. 802a4d6: 4804 ldr r0, [pc, #16] ; (802a4e8 <History_GetPageCount+0x14>)
  25653. 802a4d8: f000 f9da bl 802a890 <ringfs_count_estimate>
  25654. 802a4dc: 230a movs r3, #10
  25655. 802a4de: fb90 f0f3 sdiv r0, r0, r3
  25656. }
  25657. 802a4e2: 3001 adds r0, #1
  25658. 802a4e4: bd08 pop {r3, pc}
  25659. 802a4e6: bf00 nop
  25660. 802a4e8: 20000ba4 .word 0x20000ba4
  25661. 0802a4ec <History_GetTotalSTRCount>:
  25662. uint32_t History_GetTotalSTRCount(void)
  25663. {
  25664. return ringfs_count_estimate(&fs2);
  25665. 802a4ec: 4801 ldr r0, [pc, #4] ; (802a4f4 <History_GetTotalSTRCount+0x8>)
  25666. 802a4ee: f000 b9cf b.w 802a890 <ringfs_count_estimate>
  25667. 802a4f2: bf00 nop
  25668. 802a4f4: 20000ba4 .word 0x20000ba4
  25669. 0802a4f8 <History_GetPage>:
  25670. }
  25671. void History_GetPage(char *str, uint32_t page)
  25672. {
  25673. 802a4f8: e92d 43f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, lr}
  25674. 802a4fc: b09d sub sp, #116 ; 0x74
  25675. 802a4fe: 460e mov r6, r1
  25676. 802a500: 4604 mov r4, r0
  25677. TM_RTC_t rtc_data;
  25678. log_entry_t entry;
  25679. char buf[20];
  25680. uint8_t i;
  25681. int start =History_GetTotalSTRCount();//(fs.write.sector*fs.slots_per_sector + fs.write.slot);
  25682. 802a502: f7ff fff3 bl 802a4ec <History_GetTotalSTRCount>
  25683. memset(buf, 0, 20);
  25684. 802a506: 2100 movs r1, #0
  25685. {
  25686. TM_RTC_t rtc_data;
  25687. log_entry_t entry;
  25688. char buf[20];
  25689. uint8_t i;
  25690. int start =History_GetTotalSTRCount();//(fs.write.sector*fs.slots_per_sector + fs.write.slot);
  25691. 802a508: 4605 mov r5, r0
  25692. memset(buf, 0, 20);
  25693. 802a50a: 2214 movs r2, #20
  25694. 802a50c: a809 add r0, sp, #36 ; 0x24
  25695. for(i=0; i < 10; i++){
  25696. fs2.cursor_position = start - 10*(page-1) - 1 - i;
  25697. 802a50e: f06f 0909 mvn.w r9, #9
  25698. log_entry_t entry;
  25699. char buf[20];
  25700. uint8_t i;
  25701. int start =History_GetTotalSTRCount();//(fs.write.sector*fs.slots_per_sector + fs.write.slot);
  25702. memset(buf, 0, 20);
  25703. 802a512: f7f7 fc81 bl 8021e18 <memset>
  25704. for(i=0; i < 10; i++){
  25705. fs2.cursor_position = start - 10*(page-1) - 1 - i;
  25706. 802a516: fb09 5906 mla r9, r9, r6, r5
  25707. 802a51a: 4d38 ldr r5, [pc, #224] ; (802a5fc <History_GetPage+0x104>)
  25708. 802a51c: f109 0909 add.w r9, r9, #9
  25709. 802a520: 2600 movs r6, #0
  25710. log_fetch(&entry, portMAX_DELAY);
  25711. strcat(str, "\"");
  25712. strncat(str, logsStrShortRu[entry.type], (strlen(logsStrShortRu[entry.type]) ));
  25713. strcat(str, ";");
  25714. entry.data[49] = 0;
  25715. strncat(str, entry.data, (strlen(entry.data) ));
  25716. 802a522: f10d 073d add.w r7, sp, #61 ; 0x3d
  25717. uint32_t History_GetTotalSTRCount(void)
  25718. {
  25719. return ringfs_count_estimate(&fs2);
  25720. }
  25721. void History_GetPage(char *str, uint32_t page)
  25722. 802a526: ebc6 0309 rsb r3, r6, r9
  25723. int start =History_GetTotalSTRCount();//(fs.write.sector*fs.slots_per_sector + fs.write.slot);
  25724. memset(buf, 0, 20);
  25725. for(i=0; i < 10; i++){
  25726. fs2.cursor_position = start - 10*(page-1) - 1 - i;
  25727. if(fs2.cursor_position < 0)
  25728. 802a52a: 2b00 cmp r3, #0
  25729. uint8_t i;
  25730. int start =History_GetTotalSTRCount();//(fs.write.sector*fs.slots_per_sector + fs.write.slot);
  25731. memset(buf, 0, 20);
  25732. for(i=0; i < 10; i++){
  25733. fs2.cursor_position = start - 10*(page-1) - 1 - i;
  25734. 802a52c: 62ab str r3, [r5, #40] ; 0x28
  25735. if(fs2.cursor_position < 0)
  25736. 802a52e: db61 blt.n 802a5f4 <History_GetPage+0xfc>
  25737. break;
  25738. else{
  25739. fs2.cursor.sector = (fs2.read.sector + fs2.cursor_position/fs.slots_per_sector)%fs2.flash->sector_count;
  25740. 802a530: 4a33 ldr r2, [pc, #204] ; (802a600 <History_GetPage+0x108>)
  25741. 802a532: 68d1 ldr r1, [r2, #12]
  25742. 802a534: 692a ldr r2, [r5, #16]
  25743. 802a536: fb93 f1f1 sdiv r1, r3, r1
  25744. 802a53a: 1889 adds r1, r1, r2
  25745. 802a53c: 682a ldr r2, [r5, #0]
  25746. 802a53e: 6892 ldr r2, [r2, #8]
  25747. 802a540: fb91 f0f2 sdiv r0, r1, r2
  25748. 802a544: fb02 1210 mls r2, r2, r0, r1
  25749. 802a548: 622a str r2, [r5, #32]
  25750. fs2.cursor.slot = fs2.cursor_position%fs2.slots_per_sector;
  25751. 802a54a: 68ea ldr r2, [r5, #12]
  25752. 802a54c: fb93 f1f2 sdiv r1, r3, r2
  25753. 802a550: fb02 3311 mls r3, r2, r1, r3
  25754. 802a554: 626b str r3, [r5, #36] ; 0x24
  25755. }
  25756. entry.type = LOG_LOGIN;
  25757. log_fetch(&entry, portMAX_DELAY);
  25758. 802a556: f04f 31ff mov.w r1, #4294967295
  25759. break;
  25760. else{
  25761. fs2.cursor.sector = (fs2.read.sector + fs2.cursor_position/fs.slots_per_sector)%fs2.flash->sector_count;
  25762. fs2.cursor.slot = fs2.cursor_position%fs2.slots_per_sector;
  25763. }
  25764. entry.type = LOG_LOGIN;
  25765. 802a55a: 2305 movs r3, #5
  25766. log_fetch(&entry, portMAX_DELAY);
  25767. 802a55c: a80e add r0, sp, #56 ; 0x38
  25768. break;
  25769. else{
  25770. fs2.cursor.sector = (fs2.read.sector + fs2.cursor_position/fs.slots_per_sector)%fs2.flash->sector_count;
  25771. fs2.cursor.slot = fs2.cursor_position%fs2.slots_per_sector;
  25772. }
  25773. entry.type = LOG_LOGIN;
  25774. 802a55e: f88d 303c strb.w r3, [sp, #60] ; 0x3c
  25775. log_fetch(&entry, portMAX_DELAY);
  25776. 802a562: f7ff fe3b bl 802a1dc <log_fetch>
  25777. strcat(str, "\"");
  25778. 802a566: 4927 ldr r1, [pc, #156] ; (802a604 <History_GetPage+0x10c>)
  25779. 802a568: 4620 mov r0, r4
  25780. 802a56a: f7f7 fcbb bl 8021ee4 <strcat>
  25781. strncat(str, logsStrShortRu[entry.type], (strlen(logsStrShortRu[entry.type]) ));
  25782. 802a56e: 4b26 ldr r3, [pc, #152] ; (802a608 <History_GetPage+0x110>)
  25783. 802a570: f89d 203c ldrb.w r2, [sp, #60] ; 0x3c
  25784. 802a574: f853 8022 ldr.w r8, [r3, r2, lsl #2]
  25785. 802a578: 4640 mov r0, r8
  25786. 802a57a: f7f7 fe25 bl 80221c8 <strlen>
  25787. 802a57e: 4641 mov r1, r8
  25788. 802a580: 4602 mov r2, r0
  25789. 802a582: 4620 mov r0, r4
  25790. 802a584: f7f7 fe50 bl 8022228 <strncat>
  25791. strcat(str, ";");
  25792. 802a588: 4920 ldr r1, [pc, #128] ; (802a60c <History_GetPage+0x114>)
  25793. 802a58a: 4620 mov r0, r4
  25794. 802a58c: f7f7 fcaa bl 8021ee4 <strcat>
  25795. entry.data[49] = 0;
  25796. 802a590: 2300 movs r3, #0
  25797. strncat(str, entry.data, (strlen(entry.data) ));
  25798. 802a592: 4638 mov r0, r7
  25799. entry.type = LOG_LOGIN;
  25800. log_fetch(&entry, portMAX_DELAY);
  25801. strcat(str, "\"");
  25802. strncat(str, logsStrShortRu[entry.type], (strlen(logsStrShortRu[entry.type]) ));
  25803. strcat(str, ";");
  25804. entry.data[49] = 0;
  25805. 802a594: f88d 306e strb.w r3, [sp, #110] ; 0x6e
  25806. strncat(str, entry.data, (strlen(entry.data) ));
  25807. 802a598: f7f7 fe16 bl 80221c8 <strlen>
  25808. 802a59c: 4639 mov r1, r7
  25809. 802a59e: 4602 mov r2, r0
  25810. 802a5a0: 4620 mov r0, r4
  25811. 802a5a2: f7f7 fe41 bl 8022228 <strncat>
  25812. strcat(str, ";");
  25813. 802a5a6: 4919 ldr r1, [pc, #100] ; (802a60c <History_GetPage+0x114>)
  25814. 802a5a8: 4620 mov r0, r4
  25815. 802a5aa: f7f7 fc9b bl 8021ee4 <strcat>
  25816. TM_RTC_GetDateTimeFromUnix(&rtc_data, entry.timestamp);
  25817. 802a5ae: a805 add r0, sp, #20
  25818. 802a5b0: 990e ldr r1, [sp, #56] ; 0x38
  25819. 802a5b2: f7fc f9d7 bl 8026964 <TM_RTC_GetDateTimeFromUnix>
  25820. sprintf(buf, "%02i.%02i.%02i %02i:%02i:%02i", rtc_data.date, rtc_data.month,
  25821. 802a5b6: f89d 101d ldrb.w r1, [sp, #29]
  25822. 802a5ba: f89d 201b ldrb.w r2, [sp, #27]
  25823. 802a5be: 9100 str r1, [sp, #0]
  25824. 802a5c0: f89d 1019 ldrb.w r1, [sp, #25]
  25825. 802a5c4: f89d 301c ldrb.w r3, [sp, #28]
  25826. 802a5c8: 9101 str r1, [sp, #4]
  25827. 802a5ca: f89d 1018 ldrb.w r1, [sp, #24]
  25828. 802a5ce: 9102 str r1, [sp, #8]
  25829. 802a5d0: f89d 1014 ldrb.w r1, [sp, #20]
  25830. 802a5d4: a809 add r0, sp, #36 ; 0x24
  25831. 802a5d6: 9103 str r1, [sp, #12]
  25832. 802a5d8: 490d ldr r1, [pc, #52] ; (802a610 <History_GetPage+0x118>)
  25833. 802a5da: f7fd fb85 bl 8027ce8 <tfp_sprintf>
  25834. rtc_data.year, rtc_data.hours, rtc_data.minutes, rtc_data.seconds);
  25835. strcat(str, buf);
  25836. 802a5de: a909 add r1, sp, #36 ; 0x24
  25837. 802a5e0: 4620 mov r0, r4
  25838. 802a5e2: f7f7 fc7f bl 8021ee4 <strcat>
  25839. 802a5e6: 3601 adds r6, #1
  25840. strcat(str, "\",");
  25841. 802a5e8: 4620 mov r0, r4
  25842. 802a5ea: 490a ldr r1, [pc, #40] ; (802a614 <History_GetPage+0x11c>)
  25843. 802a5ec: f7f7 fc7a bl 8021ee4 <strcat>
  25844. char buf[20];
  25845. uint8_t i;
  25846. int start =History_GetTotalSTRCount();//(fs.write.sector*fs.slots_per_sector + fs.write.slot);
  25847. memset(buf, 0, 20);
  25848. for(i=0; i < 10; i++){
  25849. 802a5f0: 2e0a cmp r6, #10
  25850. 802a5f2: d198 bne.n 802a526 <History_GetPage+0x2e>
  25851. sprintf(buf, "%02i.%02i.%02i %02i:%02i:%02i", rtc_data.date, rtc_data.month,
  25852. rtc_data.year, rtc_data.hours, rtc_data.minutes, rtc_data.seconds);
  25853. strcat(str, buf);
  25854. strcat(str, "\",");
  25855. }
  25856. }
  25857. 802a5f4: b01d add sp, #116 ; 0x74
  25858. 802a5f6: e8bd 83f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, pc}
  25859. 802a5fa: bf00 nop
  25860. 802a5fc: 20000ba4 .word 0x20000ba4
  25861. 802a600: 20000bd0 .word 0x20000bd0
  25862. 802a604: 0804443b .word 0x0804443b
  25863. 802a608: 200006d4 .word 0x200006d4
  25864. 802a60c: 08039372 .word 0x08039372
  25865. 802a610: 08039351 .word 0x08039351
  25866. 802a614: 0803936f .word 0x0803936f
  25867. 0802a618 <History_GetData>:
  25868. uint32_t History_GetData(int ptr, char *str, uint32_t size, bool start)
  25869. {
  25870. 802a618: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  25871. 802a61c: f5ad 6d8b sub.w sp, sp, #1112 ; 0x458
  25872. 802a620: 4690 mov r8, r2
  25873. log_entry_t entry;
  25874. char buf[20];
  25875. char temp_str[FILE_BUF_MAX_LEN];
  25876. uint8_t i;
  25877. uint16_t len;
  25878. entry.type = LOG_LOGIN;
  25879. 802a622: 2205 movs r2, #5
  25880. strcat(str, "\",");
  25881. }
  25882. }
  25883. uint32_t History_GetData(int ptr, char *str, uint32_t size, bool start)
  25884. {
  25885. 802a624: 4604 mov r4, r0
  25886. 802a626: 460d mov r5, r1
  25887. log_entry_t entry;
  25888. char buf[20];
  25889. char temp_str[FILE_BUF_MAX_LEN];
  25890. uint8_t i;
  25891. uint16_t len;
  25892. entry.type = LOG_LOGIN;
  25893. 802a628: f88d 203c strb.w r2, [sp, #60] ; 0x3c
  25894. if(start)
  25895. 802a62c: b123 cbz r3, 802a638 <History_GetData+0x20>
  25896. log_rewind(&entry, portMAX_DELAY);
  25897. 802a62e: a80e add r0, sp, #56 ; 0x38
  25898. 802a630: f04f 31ff mov.w r1, #4294967295
  25899. 802a634: f7ff fdf4 bl 802a220 <log_rewind>
  25900. fs2.cursor_position = ptr/STRING_SIZE_HISTORY;
  25901. 802a638: 4b43 ldr r3, [pc, #268] ; (802a748 <History_GetData+0x130>)
  25902. 802a63a: 2164 movs r1, #100 ; 0x64
  25903. fs2.cursor.sector = (fs2.read.sector + fs2.cursor_position/fs2.slots_per_sector)%fs2.flash->sector_count;
  25904. 802a63c: 68de ldr r6, [r3, #12]
  25905. 802a63e: 691f ldr r7, [r3, #16]
  25906. uint16_t len;
  25907. entry.type = LOG_LOGIN;
  25908. if(start)
  25909. log_rewind(&entry, portMAX_DELAY);
  25910. fs2.cursor_position = ptr/STRING_SIZE_HISTORY;
  25911. 802a640: fb94 f4f1 sdiv r4, r4, r1
  25912. fs2.cursor.sector = (fs2.read.sector + fs2.cursor_position/fs2.slots_per_sector)%fs2.flash->sector_count;
  25913. 802a644: fb94 f0f6 sdiv r0, r4, r6
  25914. 802a648: eb00 0e07 add.w lr, r0, r7
  25915. 802a64c: 681f ldr r7, [r3, #0]
  25916. uint16_t len;
  25917. entry.type = LOG_LOGIN;
  25918. if(start)
  25919. log_rewind(&entry, portMAX_DELAY);
  25920. fs2.cursor_position = ptr/STRING_SIZE_HISTORY;
  25921. 802a64e: 629c str r4, [r3, #40] ; 0x28
  25922. fs2.cursor.sector = (fs2.read.sector + fs2.cursor_position/fs2.slots_per_sector)%fs2.flash->sector_count;
  25923. 802a650: 68bf ldr r7, [r7, #8]
  25924. 802a652: fb9e f2f7 sdiv r2, lr, r7
  25925. fs2.cursor.slot = fs2.cursor_position%fs2.slots_per_sector;
  25926. 802a656: fb06 4410 mls r4, r6, r0, r4
  25927. entry.type = LOG_LOGIN;
  25928. if(start)
  25929. log_rewind(&entry, portMAX_DELAY);
  25930. fs2.cursor_position = ptr/STRING_SIZE_HISTORY;
  25931. fs2.cursor.sector = (fs2.read.sector + fs2.cursor_position/fs2.slots_per_sector)%fs2.flash->sector_count;
  25932. 802a65a: fb07 e712 mls r7, r7, r2, lr
  25933. fs2.cursor.slot = fs2.cursor_position%fs2.slots_per_sector;
  25934. 802a65e: 625c str r4, [r3, #36] ; 0x24
  25935. entry.type = LOG_LOGIN;
  25936. if(start)
  25937. log_rewind(&entry, portMAX_DELAY);
  25938. fs2.cursor_position = ptr/STRING_SIZE_HISTORY;
  25939. fs2.cursor.sector = (fs2.read.sector + fs2.cursor_position/fs2.slots_per_sector)%fs2.flash->sector_count;
  25940. 802a660: 621f str r7, [r3, #32]
  25941. fs2.cursor.slot = fs2.cursor_position%fs2.slots_per_sector;
  25942. for(i = 0; i < size/STRING_SIZE_HISTORY; i++)
  25943. 802a662: fbb8 f8f1 udiv r8, r8, r1
  25944. 802a666: 2400 movs r4, #0
  25945. memset(temp_str, 0, 100);
  25946. log_fetch(&entry, portMAX_DELAY);
  25947. strncat(temp_str, logsStrShortRu[entry.type], (strlen(logsStrShortRu[entry.type])));
  25948. strcat(temp_str, ";");
  25949. entry.data[49] = 0;
  25950. strncat(temp_str, entry.data, (strlen(entry.data)));
  25951. 802a668: f10d 063d add.w r6, sp, #61 ; 0x3d
  25952. fs2.cursor_position = ptr/STRING_SIZE_HISTORY;
  25953. fs2.cursor.sector = (fs2.read.sector + fs2.cursor_position/fs2.slots_per_sector)%fs2.flash->sector_count;
  25954. fs2.cursor.slot = fs2.cursor_position%fs2.slots_per_sector;
  25955. for(i = 0; i < size/STRING_SIZE_HISTORY; i++)
  25956. 802a66c: e062 b.n 802a734 <History_GetData+0x11c>
  25957. {
  25958. memset(temp_str, 0, 100);
  25959. 802a66e: 2264 movs r2, #100 ; 0x64
  25960. 802a670: 2100 movs r1, #0
  25961. 802a672: a81c add r0, sp, #112 ; 0x70
  25962. 802a674: f7f7 fbd0 bl 8021e18 <memset>
  25963. log_fetch(&entry, portMAX_DELAY);
  25964. 802a678: f04f 31ff mov.w r1, #4294967295
  25965. 802a67c: a80e add r0, sp, #56 ; 0x38
  25966. 802a67e: f7ff fdad bl 802a1dc <log_fetch>
  25967. strncat(temp_str, logsStrShortRu[entry.type], (strlen(logsStrShortRu[entry.type])));
  25968. 802a682: 4b32 ldr r3, [pc, #200] ; (802a74c <History_GetData+0x134>)
  25969. 802a684: f89d 203c ldrb.w r2, [sp, #60] ; 0x3c
  25970. 802a688: f853 7022 ldr.w r7, [r3, r2, lsl #2]
  25971. 802a68c: 4638 mov r0, r7
  25972. 802a68e: f7f7 fd9b bl 80221c8 <strlen>
  25973. 802a692: 4639 mov r1, r7
  25974. 802a694: 4602 mov r2, r0
  25975. 802a696: a81c add r0, sp, #112 ; 0x70
  25976. 802a698: f7f7 fdc6 bl 8022228 <strncat>
  25977. strcat(temp_str, ";");
  25978. 802a69c: 492c ldr r1, [pc, #176] ; (802a750 <History_GetData+0x138>)
  25979. 802a69e: a81c add r0, sp, #112 ; 0x70
  25980. 802a6a0: f7f7 fc20 bl 8021ee4 <strcat>
  25981. entry.data[49] = 0;
  25982. 802a6a4: 2300 movs r3, #0
  25983. strncat(temp_str, entry.data, (strlen(entry.data)));
  25984. 802a6a6: 4630 mov r0, r6
  25985. {
  25986. memset(temp_str, 0, 100);
  25987. log_fetch(&entry, portMAX_DELAY);
  25988. strncat(temp_str, logsStrShortRu[entry.type], (strlen(logsStrShortRu[entry.type])));
  25989. strcat(temp_str, ";");
  25990. entry.data[49] = 0;
  25991. 802a6a8: f88d 306e strb.w r3, [sp, #110] ; 0x6e
  25992. strncat(temp_str, entry.data, (strlen(entry.data)));
  25993. 802a6ac: f7f7 fd8c bl 80221c8 <strlen>
  25994. 802a6b0: 4631 mov r1, r6
  25995. 802a6b2: 4602 mov r2, r0
  25996. 802a6b4: a81c add r0, sp, #112 ; 0x70
  25997. 802a6b6: f7f7 fdb7 bl 8022228 <strncat>
  25998. strcat(temp_str, ";");
  25999. 802a6ba: 4925 ldr r1, [pc, #148] ; (802a750 <History_GetData+0x138>)
  26000. 802a6bc: a81c add r0, sp, #112 ; 0x70
  26001. 802a6be: f7f7 fc11 bl 8021ee4 <strcat>
  26002. TM_RTC_GetDateTimeFromUnix(&rtc_data, entry.timestamp);
  26003. 802a6c2: a805 add r0, sp, #20
  26004. 802a6c4: 990e ldr r1, [sp, #56] ; 0x38
  26005. 802a6c6: f7fc f94d bl 8026964 <TM_RTC_GetDateTimeFromUnix>
  26006. sprintf(buf, "%02i.%02i.%02i %02i:%02i:%02i", rtc_data.date, rtc_data.month,
  26007. 802a6ca: f89d 101d ldrb.w r1, [sp, #29]
  26008. 802a6ce: f89d 301c ldrb.w r3, [sp, #28]
  26009. 802a6d2: 9100 str r1, [sp, #0]
  26010. 802a6d4: f89d 1019 ldrb.w r1, [sp, #25]
  26011. 802a6d8: f89d 201b ldrb.w r2, [sp, #27]
  26012. 802a6dc: 9101 str r1, [sp, #4]
  26013. 802a6de: f89d 1018 ldrb.w r1, [sp, #24]
  26014. 802a6e2: 9102 str r1, [sp, #8]
  26015. 802a6e4: f89d 1014 ldrb.w r1, [sp, #20]
  26016. 802a6e8: a809 add r0, sp, #36 ; 0x24
  26017. 802a6ea: 9103 str r1, [sp, #12]
  26018. 802a6ec: 4919 ldr r1, [pc, #100] ; (802a754 <History_GetData+0x13c>)
  26019. 802a6ee: f7fd fafb bl 8027ce8 <tfp_sprintf>
  26020. rtc_data.year, rtc_data.hours, rtc_data.minutes, rtc_data.seconds);
  26021. strcat(temp_str, buf);
  26022. 802a6f2: a909 add r1, sp, #36 ; 0x24
  26023. 802a6f4: a81c add r0, sp, #112 ; 0x70
  26024. 802a6f6: f7f7 fbf5 bl 8021ee4 <strcat>
  26025. len = strlen(temp_str);
  26026. 802a6fa: a81c add r0, sp, #112 ; 0x70
  26027. 802a6fc: f7f7 fd64 bl 80221c8 <strlen>
  26028. if (len <= STRING_SIZE_HISTORY - 1)
  26029. 802a700: b283 uxth r3, r0
  26030. 802a702: 2b63 cmp r3, #99 ; 0x63
  26031. 802a704: d80c bhi.n 802a720 <History_GetData+0x108>
  26032. strncat(str, temp_str, STRING_SIZE_HISTORY);
  26033. }
  26034. return strlen(str);
  26035. }
  26036. 802a706: 461a mov r2, r3
  26037. len = strlen(temp_str);
  26038. if (len <= STRING_SIZE_HISTORY - 1)
  26039. {
  26040. memset(&temp_str[len], ' ', STRING_SIZE_HISTORY - len - 1);
  26041. 802a708: ab1c add r3, sp, #112 ; 0x70
  26042. 802a70a: 1898 adds r0, r3, r2
  26043. 802a70c: 2120 movs r1, #32
  26044. 802a70e: f1c2 0263 rsb r2, r2, #99 ; 0x63
  26045. 802a712: f7f7 fb81 bl 8021e18 <memset>
  26046. strcat(temp_str, "\n");
  26047. 802a716: a81c add r0, sp, #112 ; 0x70
  26048. 802a718: 490f ldr r1, [pc, #60] ; (802a758 <History_GetData+0x140>)
  26049. 802a71a: f7f7 fbe3 bl 8021ee4 <strcat>
  26050. 802a71e: e002 b.n 802a726 <History_GetData+0x10e>
  26051. }
  26052. else
  26053. {
  26054. temp_str[STRING_SIZE - 1] = 0xa;
  26055. 802a720: 230a movs r3, #10
  26056. 802a722: f88d 30af strb.w r3, [sp, #175] ; 0xaf
  26057. }
  26058. strncat(str, temp_str, STRING_SIZE_HISTORY);
  26059. 802a726: 4628 mov r0, r5
  26060. 802a728: a91c add r1, sp, #112 ; 0x70
  26061. 802a72a: 2264 movs r2, #100 ; 0x64
  26062. 802a72c: f7f7 fd7c bl 8022228 <strncat>
  26063. fs2.cursor_position = ptr/STRING_SIZE_HISTORY;
  26064. fs2.cursor.sector = (fs2.read.sector + fs2.cursor_position/fs2.slots_per_sector)%fs2.flash->sector_count;
  26065. fs2.cursor.slot = fs2.cursor_position%fs2.slots_per_sector;
  26066. for(i = 0; i < size/STRING_SIZE_HISTORY; i++)
  26067. 802a730: 3401 adds r4, #1
  26068. 802a732: b2e4 uxtb r4, r4
  26069. 802a734: 4544 cmp r4, r8
  26070. 802a736: d39a bcc.n 802a66e <History_GetData+0x56>
  26071. temp_str[STRING_SIZE - 1] = 0xa;
  26072. }
  26073. strncat(str, temp_str, STRING_SIZE_HISTORY);
  26074. }
  26075. return strlen(str);
  26076. 802a738: 4628 mov r0, r5
  26077. 802a73a: f7f7 fd45 bl 80221c8 <strlen>
  26078. }
  26079. 802a73e: b016 add sp, #88 ; 0x58
  26080. 802a740: f50d 6d80 add.w sp, sp, #1024 ; 0x400
  26081. 802a744: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  26082. 802a748: 20000ba4 .word 0x20000ba4
  26083. 802a74c: 200006d4 .word 0x200006d4
  26084. 802a750: 08039372 .word 0x08039372
  26085. 802a754: 08039351 .word 0x08039351
  26086. 802a758: 080405c0 .word 0x080405c0
  26087. 0802a75c <_slot_address>:
  26088. uint32_t version;
  26089. };
  26090. static int _sector_address(struct ringfs *fs, int sector_offset)
  26091. {
  26092. return (fs->flash->sector_offset + sector_offset) * fs->flash->sector_size;
  26093. 802a75c: 6803 ldr r3, [r0, #0]
  26094. 802a75e: 680a ldr r2, [r1, #0]
  26095. struct slot_header {
  26096. uint32_t status;
  26097. };
  26098. static int _slot_address(struct ringfs *fs, struct ringfs_loc *loc)
  26099. {
  26100. 802a760: b510 push {r4, lr}
  26101. uint32_t version;
  26102. };
  26103. static int _sector_address(struct ringfs *fs, int sector_offset)
  26104. {
  26105. return (fs->flash->sector_offset + sector_offset) * fs->flash->sector_size;
  26106. 802a762: 685c ldr r4, [r3, #4]
  26107. 802a764: 18a2 adds r2, r4, r2
  26108. 802a766: 681c ldr r4, [r3, #0]
  26109. static int _slot_address(struct ringfs *fs, struct ringfs_loc *loc)
  26110. {
  26111. return _sector_address(fs, loc->sector) +
  26112. sizeof(struct sector_header) +
  26113. (sizeof(struct slot_header) + fs->object_size) * loc->slot;
  26114. 802a768: 6883 ldr r3, [r0, #8]
  26115. 802a76a: 6848 ldr r0, [r1, #4]
  26116. 802a76c: 3304 adds r3, #4
  26117. 802a76e: 4343 muls r3, r0
  26118. };
  26119. static int _slot_address(struct ringfs *fs, struct ringfs_loc *loc)
  26120. {
  26121. return _sector_address(fs, loc->sector) +
  26122. sizeof(struct sector_header) +
  26123. 802a770: fb04 3002 mla r0, r4, r2, r3
  26124. (sizeof(struct slot_header) + fs->object_size) * loc->slot;
  26125. }
  26126. 802a774: 3008 adds r0, #8
  26127. 802a776: bd10 pop {r4, pc}
  26128. 0802a778 <_slot_get_status>:
  26129. static int _slot_get_status(struct ringfs *fs, struct ringfs_loc *loc, uint32_t *status)
  26130. {
  26131. 802a778: b570 push {r4, r5, r6, lr}
  26132. return fs->flash->read(fs->flash,
  26133. 802a77a: 6804 ldr r4, [r0, #0]
  26134. sizeof(struct sector_header) +
  26135. (sizeof(struct slot_header) + fs->object_size) * loc->slot;
  26136. }
  26137. static int _slot_get_status(struct ringfs *fs, struct ringfs_loc *loc, uint32_t *status)
  26138. {
  26139. 802a77c: 4616 mov r6, r2
  26140. return fs->flash->read(fs->flash,
  26141. 802a77e: f7ff ffed bl 802a75c <_slot_address>
  26142. 802a782: 6965 ldr r5, [r4, #20]
  26143. 802a784: 4601 mov r1, r0
  26144. 802a786: 4632 mov r2, r6
  26145. 802a788: 4620 mov r0, r4
  26146. 802a78a: 2304 movs r3, #4
  26147. 802a78c: 47a8 blx r5
  26148. _slot_address(fs, loc) + offsetof(struct slot_header, status),
  26149. status, sizeof(*status));
  26150. }
  26151. 802a78e: bd70 pop {r4, r5, r6, pc}
  26152. 0802a790 <_slot_set_status>:
  26153. static int _slot_set_status(struct ringfs *fs, struct ringfs_loc *loc, uint32_t status)
  26154. {
  26155. 802a790: b573 push {r0, r1, r4, r5, r6, lr}
  26156. 802a792: ac02 add r4, sp, #8
  26157. return fs->flash->program(fs->flash,
  26158. 802a794: 6805 ldr r5, [r0, #0]
  26159. _slot_address(fs, loc) + offsetof(struct slot_header, status),
  26160. status, sizeof(*status));
  26161. }
  26162. static int _slot_set_status(struct ringfs *fs, struct ringfs_loc *loc, uint32_t status)
  26163. {
  26164. 802a796: f844 2d04 str.w r2, [r4, #-4]!
  26165. return fs->flash->program(fs->flash,
  26166. 802a79a: f7ff ffdf bl 802a75c <_slot_address>
  26167. 802a79e: 692e ldr r6, [r5, #16]
  26168. 802a7a0: 4601 mov r1, r0
  26169. 802a7a2: 4622 mov r2, r4
  26170. 802a7a4: 4628 mov r0, r5
  26171. 802a7a6: 2304 movs r3, #4
  26172. 802a7a8: 47b0 blx r6
  26173. _slot_address(fs, loc) + offsetof(struct slot_header, status),
  26174. &status, sizeof(status));
  26175. }
  26176. 802a7aa: bd7c pop {r2, r3, r4, r5, r6, pc}
  26177. 0802a7ac <_sector_get_status>:
  26178. return (fs->flash->sector_offset + sector_offset) * fs->flash->sector_size;
  26179. }
  26180. static int _sector_get_status(struct ringfs *fs, int sector, uint32_t *status)
  26181. {
  26182. return fs->flash->read(fs->flash,
  26183. 802a7ac: 6800 ldr r0, [r0, #0]
  26184. uint32_t version;
  26185. };
  26186. static int _sector_address(struct ringfs *fs, int sector_offset)
  26187. {
  26188. return (fs->flash->sector_offset + sector_offset) * fs->flash->sector_size;
  26189. 802a7ae: 6843 ldr r3, [r0, #4]
  26190. 802a7b0: 18cb adds r3, r1, r3
  26191. 802a7b2: 6801 ldr r1, [r0, #0]
  26192. }
  26193. static int _sector_get_status(struct ringfs *fs, int sector, uint32_t *status)
  26194. {
  26195. 802a7b4: b510 push {r4, lr}
  26196. return fs->flash->read(fs->flash,
  26197. 802a7b6: 4359 muls r1, r3
  26198. 802a7b8: 6944 ldr r4, [r0, #20]
  26199. 802a7ba: 2304 movs r3, #4
  26200. 802a7bc: 47a0 blx r4
  26201. _sector_address(fs, sector) + offsetof(struct sector_header, status),
  26202. status, sizeof(*status));
  26203. }
  26204. 802a7be: bd10 pop {r4, pc}
  26205. 0802a7c0 <_sector_set_status>:
  26206. static int _sector_set_status(struct ringfs *fs, int sector, uint32_t status)
  26207. {
  26208. 802a7c0: b513 push {r0, r1, r4, lr}
  26209. return fs->flash->program(fs->flash,
  26210. 802a7c2: 6800 ldr r0, [r0, #0]
  26211. _sector_address(fs, sector) + offsetof(struct sector_header, status),
  26212. status, sizeof(*status));
  26213. }
  26214. static int _sector_set_status(struct ringfs *fs, int sector, uint32_t status)
  26215. {
  26216. 802a7c4: ab02 add r3, sp, #8
  26217. return fs->flash->program(fs->flash,
  26218. 802a7c6: 6904 ldr r4, [r0, #16]
  26219. _sector_address(fs, sector) + offsetof(struct sector_header, status),
  26220. status, sizeof(*status));
  26221. }
  26222. static int _sector_set_status(struct ringfs *fs, int sector, uint32_t status)
  26223. {
  26224. 802a7c8: f843 2d04 str.w r2, [r3, #-4]!
  26225. uint32_t version;
  26226. };
  26227. static int _sector_address(struct ringfs *fs, int sector_offset)
  26228. {
  26229. return (fs->flash->sector_offset + sector_offset) * fs->flash->sector_size;
  26230. 802a7cc: 6842 ldr r2, [r0, #4]
  26231. 802a7ce: 188a adds r2, r1, r2
  26232. 802a7d0: 6801 ldr r1, [r0, #0]
  26233. status, sizeof(*status));
  26234. }
  26235. static int _sector_set_status(struct ringfs *fs, int sector, uint32_t status)
  26236. {
  26237. return fs->flash->program(fs->flash,
  26238. 802a7d2: 4351 muls r1, r2
  26239. 802a7d4: 461a mov r2, r3
  26240. 802a7d6: 2304 movs r3, #4
  26241. 802a7d8: 47a0 blx r4
  26242. _sector_address(fs, sector) + offsetof(struct sector_header, status),
  26243. &status, sizeof(status));
  26244. }
  26245. 802a7da: bd1c pop {r2, r3, r4, pc}
  26246. 0802a7dc <_sector_free>:
  26247. static int _sector_free(struct ringfs *fs, int sector)
  26248. {
  26249. 802a7dc: b5f8 push {r3, r4, r5, r6, r7, lr}
  26250. uint32_t version;
  26251. };
  26252. static int _sector_address(struct ringfs *fs, int sector_offset)
  26253. {
  26254. return (fs->flash->sector_offset + sector_offset) * fs->flash->sector_size;
  26255. 802a7de: 6803 ldr r3, [r0, #0]
  26256. 802a7e0: cb28 ldmia r3, {r3, r5}
  26257. _sector_address(fs, sector) + offsetof(struct sector_header, status),
  26258. &status, sizeof(status));
  26259. }
  26260. static int _sector_free(struct ringfs *fs, int sector)
  26261. {
  26262. 802a7e2: 4604 mov r4, r0
  26263. uint32_t version;
  26264. };
  26265. static int _sector_address(struct ringfs *fs, int sector_offset)
  26266. {
  26267. return (fs->flash->sector_offset + sector_offset) * fs->flash->sector_size;
  26268. 802a7e4: 194d adds r5, r1, r5
  26269. }
  26270. static int _sector_free(struct ringfs *fs, int sector)
  26271. {
  26272. int sector_addr = _sector_address(fs, sector);
  26273. _sector_set_status(fs, sector, SECTOR_ERASING);
  26274. 802a7e6: f04f 427f mov.w r2, #4278190080 ; 0xff000000
  26275. uint32_t version;
  26276. };
  26277. static int _sector_address(struct ringfs *fs, int sector_offset)
  26278. {
  26279. return (fs->flash->sector_offset + sector_offset) * fs->flash->sector_size;
  26280. 802a7ea: 435d muls r5, r3
  26281. _sector_address(fs, sector) + offsetof(struct sector_header, status),
  26282. &status, sizeof(status));
  26283. }
  26284. static int _sector_free(struct ringfs *fs, int sector)
  26285. {
  26286. 802a7ec: 460e mov r6, r1
  26287. int sector_addr = _sector_address(fs, sector);
  26288. _sector_set_status(fs, sector, SECTOR_ERASING);
  26289. 802a7ee: f7ff ffe7 bl 802a7c0 <_sector_set_status>
  26290. fs->flash->sector_erase(fs->flash, sector_addr);
  26291. 802a7f2: 6820 ldr r0, [r4, #0]
  26292. 802a7f4: 4629 mov r1, r5
  26293. 802a7f6: 68c3 ldr r3, [r0, #12]
  26294. 802a7f8: 4798 blx r3
  26295. fs->flash->program(fs->flash,
  26296. 802a7fa: 4622 mov r2, r4
  26297. 802a7fc: 1d29 adds r1, r5, #4
  26298. 802a7fe: f852 0b04 ldr.w r0, [r2], #4
  26299. 802a802: 2304 movs r3, #4
  26300. 802a804: 6907 ldr r7, [r0, #16]
  26301. 802a806: 47b8 blx r7
  26302. sector_addr + offsetof(struct sector_header, version),
  26303. &fs->version, sizeof(fs->version));
  26304. _sector_set_status(fs, sector, SECTOR_FREE);
  26305. 802a808: 4620 mov r0, r4
  26306. 802a80a: 4631 mov r1, r6
  26307. 802a80c: f06f 02ff mvn.w r2, #255 ; 0xff
  26308. 802a810: f7ff ffd6 bl 802a7c0 <_sector_set_status>
  26309. return 0;
  26310. }
  26311. 802a814: 2000 movs r0, #0
  26312. 802a816: bdf8 pop {r3, r4, r5, r6, r7, pc}
  26313. 0802a818 <_loc_advance_slot>:
  26314. }
  26315. /** Advance a location to the next slot, advancing the sector too if needed. */
  26316. static void _loc_advance_slot(struct ringfs *fs, struct ringfs_loc *loc)
  26317. {
  26318. loc->slot++;
  26319. 802a818: 684b ldr r3, [r1, #4]
  26320. if (loc->slot >= fs->slots_per_sector)
  26321. 802a81a: 68c2 ldr r2, [r0, #12]
  26322. }
  26323. /** Advance a location to the next slot, advancing the sector too if needed. */
  26324. static void _loc_advance_slot(struct ringfs *fs, struct ringfs_loc *loc)
  26325. {
  26326. loc->slot++;
  26327. 802a81c: 3301 adds r3, #1
  26328. if (loc->slot >= fs->slots_per_sector)
  26329. 802a81e: 4293 cmp r3, r2
  26330. }
  26331. /** Advance a location to the next slot, advancing the sector too if needed. */
  26332. static void _loc_advance_slot(struct ringfs *fs, struct ringfs_loc *loc)
  26333. {
  26334. loc->slot++;
  26335. 802a820: 604b str r3, [r1, #4]
  26336. if (loc->slot >= fs->slots_per_sector)
  26337. 802a822: db09 blt.n 802a838 <_loc_advance_slot+0x20>
  26338. /** Advance a location to the beginning of the next sector. */
  26339. static void _loc_advance_sector(struct ringfs *fs, struct ringfs_loc *loc)
  26340. {
  26341. loc->slot = 0;
  26342. loc->sector++;
  26343. if (loc->sector >= fs->flash->sector_count)
  26344. 802a824: 6800 ldr r0, [r0, #0]
  26345. /** Advance a location to the beginning of the next sector. */
  26346. static void _loc_advance_sector(struct ringfs *fs, struct ringfs_loc *loc)
  26347. {
  26348. loc->slot = 0;
  26349. loc->sector++;
  26350. 802a826: 680a ldr r2, [r1, #0]
  26351. if (loc->sector >= fs->flash->sector_count)
  26352. 802a828: 6880 ldr r0, [r0, #8]
  26353. /** Advance a location to the beginning of the next sector. */
  26354. static void _loc_advance_sector(struct ringfs *fs, struct ringfs_loc *loc)
  26355. {
  26356. loc->slot = 0;
  26357. loc->sector++;
  26358. 802a82a: 3201 adds r2, #1
  26359. }
  26360. /** Advance a location to the beginning of the next sector. */
  26361. static void _loc_advance_sector(struct ringfs *fs, struct ringfs_loc *loc)
  26362. {
  26363. loc->slot = 0;
  26364. 802a82c: 2300 movs r3, #0
  26365. loc->sector++;
  26366. if (loc->sector >= fs->flash->sector_count)
  26367. 802a82e: 4282 cmp r2, r0
  26368. }
  26369. /** Advance a location to the beginning of the next sector. */
  26370. static void _loc_advance_sector(struct ringfs *fs, struct ringfs_loc *loc)
  26371. {
  26372. loc->slot = 0;
  26373. 802a830: e881 000c stmia.w r1, {r2, r3}
  26374. loc->sector++;
  26375. if (loc->sector >= fs->flash->sector_count)
  26376. loc->sector = 0;
  26377. 802a834: bfa8 it ge
  26378. 802a836: 600b strge r3, [r1, #0]
  26379. 802a838: 4770 bx lr
  26380. 0802a83a <ringfs_init>:
  26381. int ringfs_init(struct ringfs *fs, struct ringfs_flash_partition *flash, uint32_t version, int object_size)
  26382. {
  26383. /* Copy arguments to instance. */
  26384. fs->flash = flash;
  26385. fs->version = version;
  26386. fs->object_size = object_size;
  26387. 802a83a: e880 000e stmia.w r0, {r1, r2, r3}
  26388. /* Precalculate commonly used values. */
  26389. fs->slots_per_sector = (fs->flash->sector_size - sizeof(struct sector_header)) /
  26390. 802a83e: 680a ldr r2, [r1, #0]
  26391. (sizeof(struct slot_header) + fs->object_size);
  26392. 802a840: 3304 adds r3, #4
  26393. fs->flash = flash;
  26394. fs->version = version;
  26395. fs->object_size = object_size;
  26396. /* Precalculate commonly used values. */
  26397. fs->slots_per_sector = (fs->flash->sector_size - sizeof(struct sector_header)) /
  26398. 802a842: 3a08 subs r2, #8
  26399. 802a844: fbb2 f3f3 udiv r3, r2, r3
  26400. 802a848: 60c3 str r3, [r0, #12]
  26401. (sizeof(struct slot_header) + fs->object_size);
  26402. return 0;
  26403. }
  26404. 802a84a: 2000 movs r0, #0
  26405. 802a84c: 4770 bx lr
  26406. 0802a84e <ringfs_format>:
  26407. int ringfs_format(struct ringfs *fs)
  26408. {
  26409. 802a84e: b538 push {r3, r4, r5, lr}
  26410. 802a850: 4604 mov r4, r0
  26411. /* Mark all sectors to prevent half-erased filesystems. */
  26412. for (int sector=0; sector<fs->flash->sector_count; sector++)
  26413. 802a852: 2500 movs r5, #0
  26414. 802a854: e005 b.n 802a862 <ringfs_format+0x14>
  26415. _sector_set_status(fs, sector, SECTOR_FORMATTING);
  26416. 802a856: 4629 mov r1, r5
  26417. 802a858: 4620 mov r0, r4
  26418. 802a85a: 2200 movs r2, #0
  26419. 802a85c: f7ff ffb0 bl 802a7c0 <_sector_set_status>
  26420. }
  26421. int ringfs_format(struct ringfs *fs)
  26422. {
  26423. /* Mark all sectors to prevent half-erased filesystems. */
  26424. for (int sector=0; sector<fs->flash->sector_count; sector++)
  26425. 802a860: 3501 adds r5, #1
  26426. 802a862: 6823 ldr r3, [r4, #0]
  26427. 802a864: 689b ldr r3, [r3, #8]
  26428. 802a866: 429d cmp r5, r3
  26429. 802a868: dbf5 blt.n 802a856 <ringfs_format+0x8>
  26430. 802a86a: 2500 movs r5, #0
  26431. 802a86c: e004 b.n 802a878 <ringfs_format+0x2a>
  26432. _sector_set_status(fs, sector, SECTOR_FORMATTING);
  26433. /* Erase, update version, mark as free. */
  26434. for (int sector=0; sector<fs->flash->sector_count; sector++)
  26435. _sector_free(fs, sector);
  26436. 802a86e: 4629 mov r1, r5
  26437. 802a870: 4620 mov r0, r4
  26438. 802a872: f7ff ffb3 bl 802a7dc <_sector_free>
  26439. /* Mark all sectors to prevent half-erased filesystems. */
  26440. for (int sector=0; sector<fs->flash->sector_count; sector++)
  26441. _sector_set_status(fs, sector, SECTOR_FORMATTING);
  26442. /* Erase, update version, mark as free. */
  26443. for (int sector=0; sector<fs->flash->sector_count; sector++)
  26444. 802a876: 3501 adds r5, #1
  26445. 802a878: 6823 ldr r3, [r4, #0]
  26446. 802a87a: 689b ldr r3, [r3, #8]
  26447. 802a87c: 429d cmp r5, r3
  26448. 802a87e: dbf6 blt.n 802a86e <ringfs_format+0x20>
  26449. _sector_free(fs, sector);
  26450. /* Start reading & writing at the first sector. */
  26451. fs->read.sector = 0;
  26452. 802a880: 2000 movs r0, #0
  26453. 802a882: 6120 str r0, [r4, #16]
  26454. fs->read.slot = 0;
  26455. 802a884: 6160 str r0, [r4, #20]
  26456. fs->write.sector = 0;
  26457. 802a886: 61a0 str r0, [r4, #24]
  26458. fs->write.slot = 0;
  26459. 802a888: 61e0 str r0, [r4, #28]
  26460. fs->cursor.sector = 0;
  26461. 802a88a: 6220 str r0, [r4, #32]
  26462. fs->cursor.slot = 0;
  26463. 802a88c: 6260 str r0, [r4, #36] ; 0x24
  26464. return 0;
  26465. }
  26466. 802a88e: bd38 pop {r3, r4, r5, pc}
  26467. 0802a890 <ringfs_count_estimate>:
  26468. return fs->slots_per_sector * (fs->flash->sector_count - 1);
  26469. }
  26470. int ringfs_count_estimate(struct ringfs *fs)
  26471. {
  26472. int sector_diff = (fs->write.sector - fs->read.sector + fs->flash->sector_count) %
  26473. 802a890: 6803 ldr r3, [r0, #0]
  26474. 802a892: 6981 ldr r1, [r0, #24]
  26475. 802a894: 6902 ldr r2, [r0, #16]
  26476. 802a896: 689b ldr r3, [r3, #8]
  26477. 802a898: 1a8a subs r2, r1, r2
  26478. 802a89a: 18d2 adds r2, r2, r3
  26479. 802a89c: fb92 f1f3 sdiv r1, r2, r3
  26480. 802a8a0: fb03 2311 mls r3, r3, r1, r2
  26481. {
  26482. return fs->slots_per_sector * (fs->flash->sector_count - 1);
  26483. }
  26484. int ringfs_count_estimate(struct ringfs *fs)
  26485. {
  26486. 802a8a4: b510 push {r4, lr}
  26487. int sector_diff = (fs->write.sector - fs->read.sector + fs->flash->sector_count) %
  26488. fs->flash->sector_count;
  26489. return sector_diff * fs->slots_per_sector + fs->write.slot - fs->read.slot;
  26490. 802a8a6: 69c1 ldr r1, [r0, #28]
  26491. 802a8a8: 68c4 ldr r4, [r0, #12]
  26492. 802a8aa: 6940 ldr r0, [r0, #20]
  26493. 802a8ac: fb04 1103 mla r1, r4, r3, r1
  26494. }
  26495. 802a8b0: 1a08 subs r0, r1, r0
  26496. 802a8b2: bd10 pop {r4, pc}
  26497. 0802a8b4 <ringfs_append>:
  26498. * - the next sector: it must be free (invariant)
  26499. * - the next-next sector: read & cursor heads are moved there if needed
  26500. */
  26501. /* Make sure the next sector is free. */
  26502. int next_sector = (fs->write.sector+1) % fs->flash->sector_count;
  26503. 802a8b4: 6803 ldr r3, [r0, #0]
  26504. int ringfs_cursor_position(struct ringfs *fs) {
  26505. return fs->cursor_position;
  26506. }
  26507. int ringfs_append(struct ringfs *fs, const void *object)
  26508. {
  26509. 802a8b6: b5f7 push {r0, r1, r2, r4, r5, r6, r7, lr}
  26510. * - the next sector: it must be free (invariant)
  26511. * - the next-next sector: read & cursor heads are moved there if needed
  26512. */
  26513. /* Make sure the next sector is free. */
  26514. int next_sector = (fs->write.sector+1) % fs->flash->sector_count;
  26515. 802a8b8: 6985 ldr r5, [r0, #24]
  26516. 802a8ba: 689b ldr r3, [r3, #8]
  26517. 802a8bc: 3501 adds r5, #1
  26518. 802a8be: fb95 f2f3 sdiv r2, r5, r3
  26519. 802a8c2: fb03 5512 mls r5, r3, r2, r5
  26520. int ringfs_cursor_position(struct ringfs *fs) {
  26521. return fs->cursor_position;
  26522. }
  26523. int ringfs_append(struct ringfs *fs, const void *object)
  26524. {
  26525. 802a8c6: 460f mov r7, r1
  26526. * - the next-next sector: read & cursor heads are moved there if needed
  26527. */
  26528. /* Make sure the next sector is free. */
  26529. int next_sector = (fs->write.sector+1) % fs->flash->sector_count;
  26530. _sector_get_status(fs, next_sector, &status);
  26531. 802a8c8: aa01 add r2, sp, #4
  26532. 802a8ca: 4629 mov r1, r5
  26533. int ringfs_cursor_position(struct ringfs *fs) {
  26534. return fs->cursor_position;
  26535. }
  26536. int ringfs_append(struct ringfs *fs, const void *object)
  26537. {
  26538. 802a8cc: 4604 mov r4, r0
  26539. * - the next-next sector: read & cursor heads are moved there if needed
  26540. */
  26541. /* Make sure the next sector is free. */
  26542. int next_sector = (fs->write.sector+1) % fs->flash->sector_count;
  26543. _sector_get_status(fs, next_sector, &status);
  26544. 802a8ce: f7ff ff6d bl 802a7ac <_sector_get_status>
  26545. if (status != SECTOR_FREE) {
  26546. 802a8d2: 9b01 ldr r3, [sp, #4]
  26547. 802a8d4: f513 7f80 cmn.w r3, #256 ; 0x100
  26548. 802a8d8: d01b beq.n 802a912 <ringfs_append+0x5e>
  26549. /* Next sector must be freed. But first... */
  26550. /* Move the read & cursor heads out of the way. */
  26551. if (fs->read.sector == next_sector)
  26552. 802a8da: 6923 ldr r3, [r4, #16]
  26553. 802a8dc: 42ab cmp r3, r5
  26554. 802a8de: d108 bne.n 802a8f2 <ringfs_append+0x3e>
  26555. /** Advance a location to the beginning of the next sector. */
  26556. static void _loc_advance_sector(struct ringfs *fs, struct ringfs_loc *loc)
  26557. {
  26558. loc->slot = 0;
  26559. loc->sector++;
  26560. if (loc->sector >= fs->flash->sector_count)
  26561. 802a8e0: 6821 ldr r1, [r4, #0]
  26562. 802a8e2: 6889 ldr r1, [r1, #8]
  26563. /** Advance a location to the beginning of the next sector. */
  26564. static void _loc_advance_sector(struct ringfs *fs, struct ringfs_loc *loc)
  26565. {
  26566. loc->slot = 0;
  26567. loc->sector++;
  26568. 802a8e4: 1c6a adds r2, r5, #1
  26569. }
  26570. /** Advance a location to the beginning of the next sector. */
  26571. static void _loc_advance_sector(struct ringfs *fs, struct ringfs_loc *loc)
  26572. {
  26573. loc->slot = 0;
  26574. 802a8e6: 2300 movs r3, #0
  26575. loc->sector++;
  26576. if (loc->sector >= fs->flash->sector_count)
  26577. 802a8e8: 428a cmp r2, r1
  26578. /** Advance a location to the beginning of the next sector. */
  26579. static void _loc_advance_sector(struct ringfs *fs, struct ringfs_loc *loc)
  26580. {
  26581. loc->slot = 0;
  26582. loc->sector++;
  26583. 802a8ea: 6122 str r2, [r4, #16]
  26584. }
  26585. /** Advance a location to the beginning of the next sector. */
  26586. static void _loc_advance_sector(struct ringfs *fs, struct ringfs_loc *loc)
  26587. {
  26588. loc->slot = 0;
  26589. 802a8ec: 6163 str r3, [r4, #20]
  26590. loc->sector++;
  26591. if (loc->sector >= fs->flash->sector_count)
  26592. loc->sector = 0;
  26593. 802a8ee: bfa8 it ge
  26594. 802a8f0: 6123 strge r3, [r4, #16]
  26595. /* Next sector must be freed. But first... */
  26596. /* Move the read & cursor heads out of the way. */
  26597. if (fs->read.sector == next_sector)
  26598. _loc_advance_sector(fs, &fs->read);
  26599. if (fs->cursor.sector == next_sector)
  26600. 802a8f2: 6a23 ldr r3, [r4, #32]
  26601. 802a8f4: 42ab cmp r3, r5
  26602. 802a8f6: d108 bne.n 802a90a <ringfs_append+0x56>
  26603. /** Advance a location to the beginning of the next sector. */
  26604. static void _loc_advance_sector(struct ringfs *fs, struct ringfs_loc *loc)
  26605. {
  26606. loc->slot = 0;
  26607. loc->sector++;
  26608. if (loc->sector >= fs->flash->sector_count)
  26609. 802a8f8: 6821 ldr r1, [r4, #0]
  26610. 802a8fa: 6889 ldr r1, [r1, #8]
  26611. /** Advance a location to the beginning of the next sector. */
  26612. static void _loc_advance_sector(struct ringfs *fs, struct ringfs_loc *loc)
  26613. {
  26614. loc->slot = 0;
  26615. loc->sector++;
  26616. 802a8fc: 1c6a adds r2, r5, #1
  26617. }
  26618. /** Advance a location to the beginning of the next sector. */
  26619. static void _loc_advance_sector(struct ringfs *fs, struct ringfs_loc *loc)
  26620. {
  26621. loc->slot = 0;
  26622. 802a8fe: 2300 movs r3, #0
  26623. loc->sector++;
  26624. if (loc->sector >= fs->flash->sector_count)
  26625. 802a900: 428a cmp r2, r1
  26626. /** Advance a location to the beginning of the next sector. */
  26627. static void _loc_advance_sector(struct ringfs *fs, struct ringfs_loc *loc)
  26628. {
  26629. loc->slot = 0;
  26630. loc->sector++;
  26631. 802a902: 6222 str r2, [r4, #32]
  26632. }
  26633. /** Advance a location to the beginning of the next sector. */
  26634. static void _loc_advance_sector(struct ringfs *fs, struct ringfs_loc *loc)
  26635. {
  26636. loc->slot = 0;
  26637. 802a904: 6263 str r3, [r4, #36] ; 0x24
  26638. loc->sector++;
  26639. if (loc->sector >= fs->flash->sector_count)
  26640. loc->sector = 0;
  26641. 802a906: bfa8 it ge
  26642. 802a908: 6223 strge r3, [r4, #32]
  26643. _loc_advance_sector(fs, &fs->read);
  26644. if (fs->cursor.sector == next_sector)
  26645. _loc_advance_sector(fs, &fs->cursor);
  26646. /* Free the next sector. */
  26647. _sector_free(fs, next_sector);
  26648. 802a90a: 4620 mov r0, r4
  26649. 802a90c: 4629 mov r1, r5
  26650. 802a90e: f7ff ff65 bl 802a7dc <_sector_free>
  26651. }
  26652. /* Now we can make sure the current write sector is writable. */
  26653. _sector_get_status(fs, fs->write.sector, &status);
  26654. 802a912: 4620 mov r0, r4
  26655. 802a914: 69a1 ldr r1, [r4, #24]
  26656. 802a916: aa01 add r2, sp, #4
  26657. 802a918: f7ff ff48 bl 802a7ac <_sector_get_status>
  26658. if (status == SECTOR_FREE) {
  26659. 802a91c: 9b01 ldr r3, [sp, #4]
  26660. 802a91e: f513 7f80 cmn.w r3, #256 ; 0x100
  26661. 802a922: d105 bne.n 802a930 <ringfs_append+0x7c>
  26662. /* Free sector. Mark as used. */
  26663. _sector_set_status(fs, fs->write.sector, SECTOR_IN_USE);
  26664. 802a924: 4620 mov r0, r4
  26665. 802a926: 69a1 ldr r1, [r4, #24]
  26666. 802a928: 4a15 ldr r2, [pc, #84] ; (802a980 <ringfs_append+0xcc>)
  26667. 802a92a: f7ff ff49 bl 802a7c0 <_sector_set_status>
  26668. 802a92e: e008 b.n 802a942 <ringfs_append+0x8e>
  26669. } else if (status != SECTOR_IN_USE) {
  26670. 802a930: f513 3f80 cmn.w r3, #65536 ; 0x10000
  26671. 802a934: d005 beq.n 802a942 <ringfs_append+0x8e>
  26672. printf("ringfs_append: corrupted filesystem\r\n");
  26673. 802a936: 4813 ldr r0, [pc, #76] ; (802a984 <ringfs_append+0xd0>)
  26674. 802a938: f7fd f98a bl 8027c50 <tfp_printf>
  26675. return -1;
  26676. 802a93c: f04f 30ff mov.w r0, #4294967295
  26677. 802a940: e01d b.n 802a97e <ringfs_append+0xca>
  26678. }
  26679. /* Preallocate slot. */
  26680. _slot_set_status(fs, &fs->write, SLOT_RESERVED);
  26681. 802a942: f104 0518 add.w r5, r4, #24
  26682. 802a946: f06f 02ff mvn.w r2, #255 ; 0xff
  26683. 802a94a: 4629 mov r1, r5
  26684. 802a94c: 4620 mov r0, r4
  26685. 802a94e: f7ff ff1f bl 802a790 <_slot_set_status>
  26686. /* Write object. */
  26687. fs->flash->program(fs->flash,
  26688. _slot_address(fs, &fs->write) + sizeof(struct slot_header),
  26689. 802a952: 4629 mov r1, r5
  26690. 802a954: 4620 mov r0, r4
  26691. 802a956: f7ff ff01 bl 802a75c <_slot_address>
  26692. /* Preallocate slot. */
  26693. _slot_set_status(fs, &fs->write, SLOT_RESERVED);
  26694. /* Write object. */
  26695. fs->flash->program(fs->flash,
  26696. 802a95a: 6826 ldr r6, [r4, #0]
  26697. 802a95c: 68a3 ldr r3, [r4, #8]
  26698. 802a95e: f8d6 c010 ldr.w ip, [r6, #16]
  26699. _slot_address(fs, &fs->write) + sizeof(struct slot_header),
  26700. 802a962: 1d01 adds r1, r0, #4
  26701. /* Preallocate slot. */
  26702. _slot_set_status(fs, &fs->write, SLOT_RESERVED);
  26703. /* Write object. */
  26704. fs->flash->program(fs->flash,
  26705. 802a964: 463a mov r2, r7
  26706. 802a966: 4630 mov r0, r6
  26707. 802a968: 47e0 blx ip
  26708. _slot_address(fs, &fs->write) + sizeof(struct slot_header),
  26709. object, fs->object_size);
  26710. /* Commit write. */
  26711. _slot_set_status(fs, &fs->write, SLOT_VALID);
  26712. 802a96a: 4629 mov r1, r5
  26713. 802a96c: 4a04 ldr r2, [pc, #16] ; (802a980 <ringfs_append+0xcc>)
  26714. 802a96e: 4620 mov r0, r4
  26715. 802a970: f7ff ff0e bl 802a790 <_slot_set_status>
  26716. /* Advance the write head. */
  26717. _loc_advance_slot(fs, &fs->write);
  26718. 802a974: 4620 mov r0, r4
  26719. 802a976: 4629 mov r1, r5
  26720. 802a978: f7ff ff4e bl 802a818 <_loc_advance_slot>
  26721. return 0;
  26722. 802a97c: 2000 movs r0, #0
  26723. }
  26724. 802a97e: bdfe pop {r1, r2, r3, r4, r5, r6, r7, pc}
  26725. 802a980: ffff0000 .word 0xffff0000
  26726. 802a984: 0803959f .word 0x0803959f
  26727. 0802a988 <ringfs_fetch>:
  26728. int ringfs_fetch(struct ringfs *fs, void *object)
  26729. {
  26730. 802a988: e92d 41f3 stmdb sp!, {r0, r1, r4, r5, r6, r7, r8, lr}
  26731. 802a98c: 4604 mov r4, r0
  26732. 802a98e: 4688 mov r8, r1
  26733. /* Advance forward in search of a valid slot. */
  26734. while (!_loc_equal(&fs->cursor, &fs->write)) {
  26735. 802a990: f100 0520 add.w r5, r0, #32
  26736. 802a994: e021 b.n 802a9da <ringfs_fetch+0x52>
  26737. uint32_t status;
  26738. _slot_get_status(fs, &fs->cursor, &status);
  26739. 802a996: 4620 mov r0, r4
  26740. 802a998: 4629 mov r1, r5
  26741. 802a99a: aa01 add r2, sp, #4
  26742. 802a99c: f7ff feec bl 802a778 <_slot_get_status>
  26743. if (status == SLOT_VALID) {
  26744. 802a9a0: 9b01 ldr r3, [sp, #4]
  26745. 802a9a2: f513 3f80 cmn.w r3, #65536 ; 0x10000
  26746. 802a9a6: d114 bne.n 802a9d2 <ringfs_fetch+0x4a>
  26747. fs->flash->read(fs->flash,
  26748. _slot_address(fs, &fs->cursor) + sizeof(struct slot_header),
  26749. 802a9a8: 4629 mov r1, r5
  26750. 802a9aa: 4620 mov r0, r4
  26751. 802a9ac: f7ff fed6 bl 802a75c <_slot_address>
  26752. uint32_t status;
  26753. _slot_get_status(fs, &fs->cursor, &status);
  26754. if (status == SLOT_VALID) {
  26755. fs->flash->read(fs->flash,
  26756. 802a9b0: 6827 ldr r7, [r4, #0]
  26757. 802a9b2: 68a3 ldr r3, [r4, #8]
  26758. 802a9b4: f8d7 c014 ldr.w ip, [r7, #20]
  26759. _slot_address(fs, &fs->cursor) + sizeof(struct slot_header),
  26760. 802a9b8: 1d01 adds r1, r0, #4
  26761. uint32_t status;
  26762. _slot_get_status(fs, &fs->cursor, &status);
  26763. if (status == SLOT_VALID) {
  26764. fs->flash->read(fs->flash,
  26765. 802a9ba: 4642 mov r2, r8
  26766. 802a9bc: 4638 mov r0, r7
  26767. 802a9be: 47e0 blx ip
  26768. _slot_address(fs, &fs->cursor) + sizeof(struct slot_header),
  26769. object, fs->object_size);
  26770. _loc_advance_slot(fs, &fs->cursor);
  26771. 802a9c0: 4620 mov r0, r4
  26772. 802a9c2: 4629 mov r1, r5
  26773. 802a9c4: f7ff ff28 bl 802a818 <_loc_advance_slot>
  26774. fs->cursor_position++;
  26775. 802a9c8: 6aa3 ldr r3, [r4, #40] ; 0x28
  26776. 802a9ca: 3301 adds r3, #1
  26777. 802a9cc: 62a3 str r3, [r4, #40] ; 0x28
  26778. return 0;
  26779. 802a9ce: 4630 mov r0, r6
  26780. 802a9d0: e012 b.n 802a9f8 <ringfs_fetch+0x70>
  26781. }
  26782. _loc_advance_slot(fs, &fs->cursor);
  26783. 802a9d2: 4620 mov r0, r4
  26784. 802a9d4: 4629 mov r1, r5
  26785. 802a9d6: f7ff ff1f bl 802a818 <_loc_advance_slot>
  26786. * @{
  26787. */
  26788. static bool _loc_equal(struct ringfs_loc *a, struct ringfs_loc *b)
  26789. {
  26790. return (a->sector == b->sector) && (a->slot == b->slot);
  26791. 802a9da: 6a22 ldr r2, [r4, #32]
  26792. 802a9dc: 69a3 ldr r3, [r4, #24]
  26793. 802a9de: 429a cmp r2, r3
  26794. 802a9e0: d105 bne.n 802a9ee <ringfs_fetch+0x66>
  26795. 802a9e2: 6a66 ldr r6, [r4, #36] ; 0x24
  26796. 802a9e4: 69e3 ldr r3, [r4, #28]
  26797. 802a9e6: 1af1 subs r1, r6, r3
  26798. 802a9e8: 424e negs r6, r1
  26799. 802a9ea: 414e adcs r6, r1
  26800. 802a9ec: e000 b.n 802a9f0 <ringfs_fetch+0x68>
  26801. 802a9ee: 2600 movs r6, #0
  26802. }
  26803. int ringfs_fetch(struct ringfs *fs, void *object)
  26804. {
  26805. /* Advance forward in search of a valid slot. */
  26806. while (!_loc_equal(&fs->cursor, &fs->write)) {
  26807. 802a9f0: 2e00 cmp r6, #0
  26808. 802a9f2: d0d0 beq.n 802a996 <ringfs_fetch+0xe>
  26809. }
  26810. _loc_advance_slot(fs, &fs->cursor);
  26811. }
  26812. return -1;
  26813. 802a9f4: f04f 30ff mov.w r0, #4294967295
  26814. }
  26815. 802a9f8: e8bd 81fc ldmia.w sp!, {r2, r3, r4, r5, r6, r7, r8, pc}
  26816. 0802a9fc <ringfs_rewind>:
  26817. return 0;
  26818. }
  26819. int ringfs_rewind(struct ringfs *fs)
  26820. {
  26821. fs->cursor = fs->read;
  26822. 802a9fc: f100 0110 add.w r1, r0, #16
  26823. fs->cursor_position = 0;
  26824. return 0;
  26825. }
  26826. int ringfs_rewind(struct ringfs *fs)
  26827. {
  26828. 802aa00: 4603 mov r3, r0
  26829. fs->cursor = fs->read;
  26830. 802aa02: f100 0220 add.w r2, r0, #32
  26831. 802aa06: c903 ldmia r1, {r0, r1}
  26832. 802aa08: e882 0003 stmia.w r2, {r0, r1}
  26833. fs->cursor_position = 0;
  26834. 802aa0c: 2000 movs r0, #0
  26835. 802aa0e: 6298 str r0, [r3, #40] ; 0x28
  26836. return 0;
  26837. }
  26838. 802aa10: 4770 bx lr
  26839. 0802aa12 <ringfs_scan>:
  26840. return 0;
  26841. }
  26842. int ringfs_scan(struct ringfs *fs)
  26843. {
  26844. 802aa12: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  26845. /* The read sector is the first IN_USE sector *after* a FREE sector
  26846. * (or the first one). */
  26847. int read_sector = 0;
  26848. /* The write sector is the last IN_USE sector *before* a FREE sector
  26849. * (or the last one). */
  26850. int write_sector = fs->flash->sector_count - 1;
  26851. 802aa16: 6803 ldr r3, [r0, #0]
  26852. 802aa18: 689e ldr r6, [r3, #8]
  26853. bool free_seen = false;
  26854. /* If there's no IN_USE sector, we start at the first one. */
  26855. bool used_seen = false;
  26856. /* Iterate over sectors. */
  26857. for (int sector=0; sector<fs->flash->sector_count; sector++) {
  26858. 802aa1a: 2500 movs r5, #0
  26859. return 0;
  26860. }
  26861. int ringfs_scan(struct ringfs *fs)
  26862. {
  26863. 802aa1c: b085 sub sp, #20
  26864. 802aa1e: 4604 mov r4, r0
  26865. /* The read sector is the first IN_USE sector *after* a FREE sector
  26866. * (or the first one). */
  26867. int read_sector = 0;
  26868. /* The write sector is the last IN_USE sector *before* a FREE sector
  26869. * (or the last one). */
  26870. int write_sector = fs->flash->sector_count - 1;
  26871. 802aa20: 3e01 subs r6, #1
  26872. /* There must be at least one FREE sector available at all times. */
  26873. bool free_seen = false;
  26874. /* If there's no IN_USE sector, we start at the first one. */
  26875. bool used_seen = false;
  26876. 802aa22: 46aa mov sl, r5
  26877. int read_sector = 0;
  26878. /* The write sector is the last IN_USE sector *before* a FREE sector
  26879. * (or the last one). */
  26880. int write_sector = fs->flash->sector_count - 1;
  26881. /* There must be at least one FREE sector available at all times. */
  26882. bool free_seen = false;
  26883. 802aa24: 46a8 mov r8, r5
  26884. int ringfs_scan(struct ringfs *fs)
  26885. {
  26886. uint32_t previous_sector_status = SECTOR_FREE;
  26887. /* The read sector is the first IN_USE sector *after* a FREE sector
  26888. * (or the first one). */
  26889. int read_sector = 0;
  26890. 802aa26: 46a9 mov r9, r5
  26891. return 0;
  26892. }
  26893. int ringfs_scan(struct ringfs *fs)
  26894. {
  26895. uint32_t previous_sector_status = SECTOR_FREE;
  26896. 802aa28: f06f 07ff mvn.w r7, #255 ; 0xff
  26897. bool free_seen = false;
  26898. /* If there's no IN_USE sector, we start at the first one. */
  26899. bool used_seen = false;
  26900. /* Iterate over sectors. */
  26901. for (int sector=0; sector<fs->flash->sector_count; sector++) {
  26902. 802aa2c: e031 b.n 802aa92 <ringfs_scan+0x80>
  26903. uint32_t version;
  26904. };
  26905. static int _sector_address(struct ringfs *fs, int sector_offset)
  26906. {
  26907. return (fs->flash->sector_offset + sector_offset) * fs->flash->sector_size;
  26908. 802aa2e: 6843 ldr r3, [r0, #4]
  26909. for (int sector=0; sector<fs->flash->sector_count; sector++) {
  26910. int addr = _sector_address(fs, sector);
  26911. /* Read sector header. */
  26912. struct sector_header header;
  26913. fs->flash->read(fs->flash, addr, &header, sizeof(header));
  26914. 802aa30: f8d0 c014 ldr.w ip, [r0, #20]
  26915. uint32_t version;
  26916. };
  26917. static int _sector_address(struct ringfs *fs, int sector_offset)
  26918. {
  26919. return (fs->flash->sector_offset + sector_offset) * fs->flash->sector_size;
  26920. 802aa34: eb05 0b03 add.w fp, r5, r3
  26921. 802aa38: 6803 ldr r3, [r0, #0]
  26922. 802aa3a: fb03 fb0b mul.w fp, r3, fp
  26923. for (int sector=0; sector<fs->flash->sector_count; sector++) {
  26924. int addr = _sector_address(fs, sector);
  26925. /* Read sector header. */
  26926. struct sector_header header;
  26927. fs->flash->read(fs->flash, addr, &header, sizeof(header));
  26928. 802aa3e: 4659 mov r1, fp
  26929. 802aa40: 2308 movs r3, #8
  26930. 802aa42: aa02 add r2, sp, #8
  26931. 802aa44: 47e0 blx ip
  26932. /* Detect partially-formatted partitions. */
  26933. if (header.status == SECTOR_FORMATTING) {
  26934. 802aa46: 9b02 ldr r3, [sp, #8]
  26935. 802aa48: 2b00 cmp r3, #0
  26936. 802aa4a: d06b beq.n 802ab24 <ringfs_scan+0x112>
  26937. DBG printf("ringfs_scan: partially formatted partition\r\n");
  26938. return -1;
  26939. }
  26940. /* Detect and fix partially erased sectors. */
  26941. if (header.status == SECTOR_ERASING || header.status == SECTOR_ERASED) {
  26942. 802aa4c: f1b3 4f7f cmp.w r3, #4278190080 ; 0xff000000
  26943. 802aa50: d001 beq.n 802aa56 <ringfs_scan+0x44>
  26944. 802aa52: 3301 adds r3, #1
  26945. 802aa54: d106 bne.n 802aa64 <ringfs_scan+0x52>
  26946. _sector_free(fs, addr);
  26947. 802aa56: 4620 mov r0, r4
  26948. 802aa58: 4659 mov r1, fp
  26949. 802aa5a: f7ff febf bl 802a7dc <_sector_free>
  26950. header.status = SECTOR_FREE;
  26951. 802aa5e: f06f 03ff mvn.w r3, #255 ; 0xff
  26952. 802aa62: 9302 str r3, [sp, #8]
  26953. }
  26954. /* Detect corrupted sectors. */
  26955. if (header.status != SECTOR_FREE && header.status != SECTOR_IN_USE) {
  26956. 802aa64: 9b02 ldr r3, [sp, #8]
  26957. 802aa66: f513 7f80 cmn.w r3, #256 ; 0x100
  26958. 802aa6a: d002 beq.n 802aa72 <ringfs_scan+0x60>
  26959. 802aa6c: f513 3f80 cmn.w r3, #65536 ; 0x10000
  26960. 802aa70: d158 bne.n 802ab24 <ringfs_scan+0x112>
  26961. return -1;
  26962. }
  26963. /* Detect obsolete versions. We can't do this earlier because the version
  26964. * could have been invalid due to a partial erase. */
  26965. if (header.version != fs->version) {
  26966. 802aa72: 6862 ldr r2, [r4, #4]
  26967. 802aa74: 9903 ldr r1, [sp, #12]
  26968. 802aa76: 4291 cmp r1, r2
  26969. 802aa78: d154 bne.n 802ab24 <ringfs_scan+0x112>
  26970. DBG printf("ringfs_scan: incompatible version 0x%08"PRIx32"\r\n", header.version);
  26971. return -1;
  26972. }
  26973. /* Record the presence of a FREE sector. */
  26974. if (header.status == SECTOR_FREE)
  26975. 802aa7a: f513 7f80 cmn.w r3, #256 ; 0x100
  26976. 802aa7e: d05b beq.n 802ab38 <ringfs_scan+0x126>
  26977. free_seen = true;
  26978. /* Record the presence of a IN_USE sector. */
  26979. if (header.status == SECTOR_IN_USE)
  26980. 802aa80: f513 3f80 cmn.w r3, #65536 ; 0x10000
  26981. 802aa84: d103 bne.n 802aa8e <ringfs_scan+0x7c>
  26982. 802aa86: e050 b.n 802ab2a <ringfs_scan+0x118>
  26983. fs->cursor.slot = 0;
  26984. return 0;
  26985. }
  26986. int ringfs_scan(struct ringfs *fs)
  26987. 802aa88: 1e6e subs r6, r5, #1
  26988. return -1;
  26989. }
  26990. /* Record the presence of a FREE sector. */
  26991. if (header.status == SECTOR_FREE)
  26992. free_seen = true;
  26993. 802aa8a: f04f 0801 mov.w r8, #1
  26994. bool free_seen = false;
  26995. /* If there's no IN_USE sector, we start at the first one. */
  26996. bool used_seen = false;
  26997. /* Iterate over sectors. */
  26998. for (int sector=0; sector<fs->flash->sector_count; sector++) {
  26999. 802aa8e: 3501 adds r5, #1
  27000. _sector_free(fs, addr);
  27001. header.status = SECTOR_FREE;
  27002. }
  27003. /* Detect corrupted sectors. */
  27004. if (header.status != SECTOR_FREE && header.status != SECTOR_IN_USE) {
  27005. 802aa90: 461f mov r7, r3
  27006. bool free_seen = false;
  27007. /* If there's no IN_USE sector, we start at the first one. */
  27008. bool used_seen = false;
  27009. /* Iterate over sectors. */
  27010. for (int sector=0; sector<fs->flash->sector_count; sector++) {
  27011. 802aa92: 6820 ldr r0, [r4, #0]
  27012. 802aa94: 6883 ldr r3, [r0, #8]
  27013. 802aa96: 429d cmp r5, r3
  27014. 802aa98: dbc9 blt.n 802aa2e <ringfs_scan+0x1c>
  27015. previous_sector_status = header.status;
  27016. }
  27017. /* Detect the lack of a FREE sector. */
  27018. if (!free_seen) {
  27019. 802aa9a: f1b8 0f00 cmp.w r8, #0
  27020. 802aa9e: d041 beq.n 802ab24 <ringfs_scan+0x112>
  27021. return -1;
  27022. }
  27023. /* Start writing at the first sector if the filesystem is empty. */
  27024. if (!used_seen) {
  27025. write_sector = 0;
  27026. 802aaa0: f1ba 0f00 cmp.w sl, #0
  27027. 802aaa4: bf08 it eq
  27028. 802aaa6: 2600 moveq r6, #0
  27029. }
  27030. /* Scan the write sector and skip all occupied slots at the beginning. */
  27031. fs->write.sector = write_sector;
  27032. fs->write.slot = 0;
  27033. 802aaa8: 2300 movs r3, #0
  27034. if (!used_seen) {
  27035. write_sector = 0;
  27036. }
  27037. /* Scan the write sector and skip all occupied slots at the beginning. */
  27038. fs->write.sector = write_sector;
  27039. 802aaaa: 61a6 str r6, [r4, #24]
  27040. fs->write.slot = 0;
  27041. 802aaac: 61e3 str r3, [r4, #28]
  27042. while (fs->write.sector == write_sector) {
  27043. uint32_t status;
  27044. _slot_get_status(fs, &fs->write, &status);
  27045. 802aaae: f104 0518 add.w r5, r4, #24
  27046. }
  27047. /* Scan the write sector and skip all occupied slots at the beginning. */
  27048. fs->write.sector = write_sector;
  27049. fs->write.slot = 0;
  27050. while (fs->write.sector == write_sector) {
  27051. 802aab2: e00b b.n 802aacc <ringfs_scan+0xba>
  27052. uint32_t status;
  27053. _slot_get_status(fs, &fs->write, &status);
  27054. 802aab4: 4620 mov r0, r4
  27055. 802aab6: 4629 mov r1, r5
  27056. 802aab8: aa01 add r2, sp, #4
  27057. 802aaba: f7ff fe5d bl 802a778 <_slot_get_status>
  27058. if (status == SLOT_ERASED)
  27059. 802aabe: 9b01 ldr r3, [sp, #4]
  27060. 802aac0: 3301 adds r3, #1
  27061. 802aac2: d006 beq.n 802aad2 <ringfs_scan+0xc0>
  27062. break;
  27063. _loc_advance_slot(fs, &fs->write);
  27064. 802aac4: 4620 mov r0, r4
  27065. 802aac6: 4629 mov r1, r5
  27066. 802aac8: f7ff fea6 bl 802a818 <_loc_advance_slot>
  27067. }
  27068. /* Scan the write sector and skip all occupied slots at the beginning. */
  27069. fs->write.sector = write_sector;
  27070. fs->write.slot = 0;
  27071. while (fs->write.sector == write_sector) {
  27072. 802aacc: 69a3 ldr r3, [r4, #24]
  27073. 802aace: 42b3 cmp r3, r6
  27074. 802aad0: d0f0 beq.n 802aab4 <ringfs_scan+0xa2>
  27075. /* Position the read head at the start of the first IN_USE sector, then skip
  27076. * over garbage/invalid slots until something of value is found or we reach
  27077. * the write head which means there's no data. */
  27078. fs->read.sector = read_sector;
  27079. fs->read.slot = 0;
  27080. 802aad2: 2300 movs r3, #0
  27081. /* If the sector was full, we're at the beginning of a FREE sector now. */
  27082. /* Position the read head at the start of the first IN_USE sector, then skip
  27083. * over garbage/invalid slots until something of value is found or we reach
  27084. * the write head which means there's no data. */
  27085. fs->read.sector = read_sector;
  27086. 802aad4: f8c4 9010 str.w r9, [r4, #16]
  27087. fs->read.slot = 0;
  27088. 802aad8: 6163 str r3, [r4, #20]
  27089. while (!_loc_equal(&fs->read, &fs->write)) {
  27090. 802aada: f104 0510 add.w r5, r4, #16
  27091. 802aade: e00c b.n 802aafa <ringfs_scan+0xe8>
  27092. uint32_t status;
  27093. _slot_get_status(fs, &fs->read, &status);
  27094. 802aae0: 4620 mov r0, r4
  27095. 802aae2: 4629 mov r1, r5
  27096. 802aae4: aa01 add r2, sp, #4
  27097. 802aae6: f7ff fe47 bl 802a778 <_slot_get_status>
  27098. if (status == SLOT_VALID)
  27099. 802aaea: 9b01 ldr r3, [sp, #4]
  27100. 802aaec: f513 3f80 cmn.w r3, #65536 ; 0x10000
  27101. 802aaf0: d013 beq.n 802ab1a <ringfs_scan+0x108>
  27102. break;
  27103. _loc_advance_slot(fs, &fs->read);
  27104. 802aaf2: 4620 mov r0, r4
  27105. 802aaf4: 4629 mov r1, r5
  27106. 802aaf6: f7ff fe8f bl 802a818 <_loc_advance_slot>
  27107. * @{
  27108. */
  27109. static bool _loc_equal(struct ringfs_loc *a, struct ringfs_loc *b)
  27110. {
  27111. return (a->sector == b->sector) && (a->slot == b->slot);
  27112. 802aafa: 6922 ldr r2, [r4, #16]
  27113. 802aafc: 69a3 ldr r3, [r4, #24]
  27114. 802aafe: 429a cmp r2, r3
  27115. 802ab00: d108 bne.n 802ab14 <ringfs_scan+0x102>
  27116. 802ab02: 69e3 ldr r3, [r4, #28]
  27117. 802ab04: 6962 ldr r2, [r4, #20]
  27118. 802ab06: ebb2 0e03 subs.w lr, r2, r3
  27119. 802ab0a: f1de 0300 rsbs r3, lr, #0
  27120. 802ab0e: eb53 030e adcs.w r3, r3, lr
  27121. 802ab12: e000 b.n 802ab16 <ringfs_scan+0x104>
  27122. 802ab14: 2300 movs r3, #0
  27123. /* Position the read head at the start of the first IN_USE sector, then skip
  27124. * over garbage/invalid slots until something of value is found or we reach
  27125. * the write head which means there's no data. */
  27126. fs->read.sector = read_sector;
  27127. fs->read.slot = 0;
  27128. while (!_loc_equal(&fs->read, &fs->write)) {
  27129. 802ab16: 2b00 cmp r3, #0
  27130. 802ab18: d0e2 beq.n 802aae0 <ringfs_scan+0xce>
  27131. _loc_advance_slot(fs, &fs->read);
  27132. }
  27133. /* Move the read cursor to the read head position. */
  27134. ringfs_rewind(fs);
  27135. 802ab1a: 4620 mov r0, r4
  27136. 802ab1c: f7ff ff6e bl 802a9fc <ringfs_rewind>
  27137. return 0;
  27138. 802ab20: 2000 movs r0, #0
  27139. 802ab22: e00d b.n 802ab40 <ringfs_scan+0x12e>
  27140. }
  27141. /* Detect the lack of a FREE sector. */
  27142. if (!free_seen) {
  27143. DBG printf("ringfs_scan: invariant violated: no FREE sector found\r\n");
  27144. return -1;
  27145. 802ab24: f04f 30ff mov.w r0, #4294967295
  27146. 802ab28: e00a b.n 802ab40 <ringfs_scan+0x12e>
  27147. /* Record the presence of a IN_USE sector. */
  27148. if (header.status == SECTOR_IN_USE)
  27149. used_seen = true;
  27150. /* Update read & write sectors according to the above rules. */
  27151. if (header.status == SECTOR_IN_USE && previous_sector_status == SECTOR_FREE)
  27152. 802ab2a: f517 7f80 cmn.w r7, #256 ; 0x100
  27153. 802ab2e: bf08 it eq
  27154. 802ab30: 46a9 moveq r9, r5
  27155. if (header.status == SECTOR_FREE)
  27156. free_seen = true;
  27157. /* Record the presence of a IN_USE sector. */
  27158. if (header.status == SECTOR_IN_USE)
  27159. used_seen = true;
  27160. 802ab32: f04f 0a01 mov.w sl, #1
  27161. 802ab36: e7aa b.n 802aa8e <ringfs_scan+0x7c>
  27162. /* Update read & write sectors according to the above rules. */
  27163. if (header.status == SECTOR_IN_USE && previous_sector_status == SECTOR_FREE)
  27164. read_sector = sector;
  27165. if (header.status == SECTOR_FREE && previous_sector_status == SECTOR_IN_USE)
  27166. 802ab38: f517 3f80 cmn.w r7, #65536 ; 0x10000
  27167. 802ab3c: d0a4 beq.n 802aa88 <ringfs_scan+0x76>
  27168. 802ab3e: e7a4 b.n 802aa8a <ringfs_scan+0x78>
  27169. /* Move the read cursor to the read head position. */
  27170. ringfs_rewind(fs);
  27171. return 0;
  27172. }
  27173. 802ab40: b005 add sp, #20
  27174. 802ab42: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  27175. 802ab46: 0000 movs r0, r0
  27176. 0802ab48 <prvCheckForValidListAndQueue>:
  27177. pxOverflowTimerList = pxTemp;
  27178. }
  27179. /*-----------------------------------------------------------*/
  27180. static void prvCheckForValidListAndQueue( void )
  27181. {
  27182. 802ab48: b5f8 push {r3, r4, r5, r6, r7, lr}
  27183. /* Check that the list from which active timers are referenced, and the
  27184. queue used to communicate with the timer service, have been
  27185. initialised. */
  27186. taskENTER_CRITICAL();
  27187. {
  27188. if( xTimerQueue == NULL )
  27189. 802ab4a: 4c0f ldr r4, [pc, #60] ; (802ab88 <prvCheckForValidListAndQueue+0x40>)
  27190. static void prvCheckForValidListAndQueue( void )
  27191. {
  27192. /* Check that the list from which active timers are referenced, and the
  27193. queue used to communicate with the timer service, have been
  27194. initialised. */
  27195. taskENTER_CRITICAL();
  27196. 802ab4c: f001 fa24 bl 802bf98 <vPortEnterCritical>
  27197. {
  27198. if( xTimerQueue == NULL )
  27199. 802ab50: 6825 ldr r5, [r4, #0]
  27200. 802ab52: b9ad cbnz r5, 802ab80 <prvCheckForValidListAndQueue+0x38>
  27201. {
  27202. vListInitialise( &xActiveTimerList1 );
  27203. 802ab54: 4f0d ldr r7, [pc, #52] ; (802ab8c <prvCheckForValidListAndQueue+0x44>)
  27204. vListInitialise( &xActiveTimerList2 );
  27205. 802ab56: 4e0e ldr r6, [pc, #56] ; (802ab90 <prvCheckForValidListAndQueue+0x48>)
  27206. initialised. */
  27207. taskENTER_CRITICAL();
  27208. {
  27209. if( xTimerQueue == NULL )
  27210. {
  27211. vListInitialise( &xActiveTimerList1 );
  27212. 802ab58: 4638 mov r0, r7
  27213. 802ab5a: f000 f997 bl 802ae8c <vListInitialise>
  27214. vListInitialise( &xActiveTimerList2 );
  27215. 802ab5e: 4630 mov r0, r6
  27216. 802ab60: f000 f994 bl 802ae8c <vListInitialise>
  27217. pxCurrentTimerList = &xActiveTimerList1;
  27218. 802ab64: 4b0b ldr r3, [pc, #44] ; (802ab94 <prvCheckForValidListAndQueue+0x4c>)
  27219. 802ab66: 601f str r7, [r3, #0]
  27220. pxOverflowTimerList = &xActiveTimerList2;
  27221. 802ab68: 4b0b ldr r3, [pc, #44] ; (802ab98 <prvCheckForValidListAndQueue+0x50>)
  27222. xTimerQueue = xQueueCreate( ( UBaseType_t ) configTIMER_QUEUE_LENGTH, sizeof( DaemonTaskMessage_t ) );
  27223. 802ab6a: 200a movs r0, #10
  27224. 802ab6c: 210c movs r1, #12
  27225. 802ab6e: 462a mov r2, r5
  27226. if( xTimerQueue == NULL )
  27227. {
  27228. vListInitialise( &xActiveTimerList1 );
  27229. vListInitialise( &xActiveTimerList2 );
  27230. pxCurrentTimerList = &xActiveTimerList1;
  27231. pxOverflowTimerList = &xActiveTimerList2;
  27232. 802ab70: 601e str r6, [r3, #0]
  27233. xTimerQueue = xQueueCreate( ( UBaseType_t ) configTIMER_QUEUE_LENGTH, sizeof( DaemonTaskMessage_t ) );
  27234. 802ab72: f000 fa7c bl 802b06e <xQueueGenericCreate>
  27235. 802ab76: 6020 str r0, [r4, #0]
  27236. configASSERT( xTimerQueue );
  27237. 802ab78: b910 cbnz r0, 802ab80 <prvCheckForValidListAndQueue+0x38>
  27238. 802ab7a: f001 fa05 bl 802bf88 <ulPortSetInterruptMask>
  27239. 802ab7e: e7fe b.n 802ab7e <prvCheckForValidListAndQueue+0x36>
  27240. {
  27241. mtCOVERAGE_TEST_MARKER();
  27242. }
  27243. }
  27244. taskEXIT_CRITICAL();
  27245. }
  27246. 802ab80: e8bd 40f8 ldmia.w sp!, {r3, r4, r5, r6, r7, lr}
  27247. else
  27248. {
  27249. mtCOVERAGE_TEST_MARKER();
  27250. }
  27251. }
  27252. taskEXIT_CRITICAL();
  27253. 802ab84: f001 ba34 b.w 802bff0 <vPortExitCritical>
  27254. 802ab88: 20000c38 .word 0x20000c38
  27255. 802ab8c: 20000c0c .word 0x20000c0c
  27256. 802ab90: 20000c20 .word 0x20000c20
  27257. 802ab94: 20000c08 .word 0x20000c08
  27258. 802ab98: 20000c3c .word 0x20000c3c
  27259. 0802ab9c <prvInsertTimerInActiveList>:
  27260. return xTimeNow;
  27261. }
  27262. /*-----------------------------------------------------------*/
  27263. static BaseType_t prvInsertTimerInActiveList( Timer_t * const pxTimer, const TickType_t xNextExpiryTime, const TickType_t xTimeNow, const TickType_t xCommandTime )
  27264. {
  27265. 802ab9c: b510 push {r4, lr}
  27266. 802ab9e: 4604 mov r4, r0
  27267. BaseType_t xProcessTimerNow = pdFALSE;
  27268. listSET_LIST_ITEM_VALUE( &( pxTimer->xTimerListItem ), xNextExpiryTime );
  27269. listSET_LIST_ITEM_OWNER( &( pxTimer->xTimerListItem ), pxTimer );
  27270. if( xNextExpiryTime <= xTimeNow )
  27271. 802aba0: 4291 cmp r1, r2
  27272. static BaseType_t prvInsertTimerInActiveList( Timer_t * const pxTimer, const TickType_t xNextExpiryTime, const TickType_t xTimeNow, const TickType_t xCommandTime )
  27273. {
  27274. BaseType_t xProcessTimerNow = pdFALSE;
  27275. listSET_LIST_ITEM_VALUE( &( pxTimer->xTimerListItem ), xNextExpiryTime );
  27276. 802aba2: 6041 str r1, [r0, #4]
  27277. listSET_LIST_ITEM_OWNER( &( pxTimer->xTimerListItem ), pxTimer );
  27278. 802aba4: 6120 str r0, [r4, #16]
  27279. if( xNextExpiryTime <= xTimeNow )
  27280. 802aba6: d805 bhi.n 802abb4 <prvInsertTimerInActiveList+0x18>
  27281. {
  27282. /* Has the expiry time elapsed between the command to start/reset a
  27283. timer was issued, and the time the command was processed? */
  27284. if( ( xTimeNow - xCommandTime ) >= pxTimer->xTimerPeriodInTicks )
  27285. 802aba8: 6981 ldr r1, [r0, #24]
  27286. 802abaa: 1ad2 subs r2, r2, r3
  27287. 802abac: 428a cmp r2, r1
  27288. 802abae: d20c bcs.n 802abca <prvInsertTimerInActiveList+0x2e>
  27289. processed actually exceeds the timers period. */
  27290. xProcessTimerNow = pdTRUE;
  27291. }
  27292. else
  27293. {
  27294. vListInsert( pxOverflowTimerList, &( pxTimer->xTimerListItem ) );
  27295. 802abb0: 4b07 ldr r3, [pc, #28] ; (802abd0 <prvInsertTimerInActiveList+0x34>)
  27296. 802abb2: e004 b.n 802abbe <prvInsertTimerInActiveList+0x22>
  27297. }
  27298. }
  27299. else
  27300. {
  27301. if( ( xTimeNow < xCommandTime ) && ( xNextExpiryTime >= xCommandTime ) )
  27302. 802abb4: 429a cmp r2, r3
  27303. 802abb6: d201 bcs.n 802abbc <prvInsertTimerInActiveList+0x20>
  27304. 802abb8: 4299 cmp r1, r3
  27305. 802abba: d206 bcs.n 802abca <prvInsertTimerInActiveList+0x2e>
  27306. its expiry time and should be processed immediately. */
  27307. xProcessTimerNow = pdTRUE;
  27308. }
  27309. else
  27310. {
  27311. vListInsert( pxCurrentTimerList, &( pxTimer->xTimerListItem ) );
  27312. 802abbc: 4b05 ldr r3, [pc, #20] ; (802abd4 <prvInsertTimerInActiveList+0x38>)
  27313. 802abbe: 6818 ldr r0, [r3, #0]
  27314. 802abc0: 1d21 adds r1, r4, #4
  27315. 802abc2: f000 f97d bl 802aec0 <vListInsert>
  27316. }
  27317. /*-----------------------------------------------------------*/
  27318. static BaseType_t prvInsertTimerInActiveList( Timer_t * const pxTimer, const TickType_t xNextExpiryTime, const TickType_t xTimeNow, const TickType_t xCommandTime )
  27319. {
  27320. BaseType_t xProcessTimerNow = pdFALSE;
  27321. 802abc6: 2000 movs r0, #0
  27322. 802abc8: bd10 pop {r4, pc}
  27323. timer was issued, and the time the command was processed? */
  27324. if( ( xTimeNow - xCommandTime ) >= pxTimer->xTimerPeriodInTicks )
  27325. {
  27326. /* The time between a command being issued and the command being
  27327. processed actually exceeds the timers period. */
  27328. xProcessTimerNow = pdTRUE;
  27329. 802abca: 2001 movs r0, #1
  27330. vListInsert( pxCurrentTimerList, &( pxTimer->xTimerListItem ) );
  27331. }
  27332. }
  27333. return xProcessTimerNow;
  27334. }
  27335. 802abcc: bd10 pop {r4, pc}
  27336. 802abce: bf00 nop
  27337. 802abd0: 20000c3c .word 0x20000c3c
  27338. 802abd4: 20000c08 .word 0x20000c08
  27339. 0802abd8 <xTimerCreateTimerTask>:
  27340. static void prvProcessTimerOrBlockTask( const TickType_t xNextExpireTime, const BaseType_t xListWasEmpty ) PRIVILEGED_FUNCTION;
  27341. /*-----------------------------------------------------------*/
  27342. BaseType_t xTimerCreateTimerTask( void )
  27343. {
  27344. 802abd8: b51f push {r0, r1, r2, r3, r4, lr}
  27345. /* This function is called when the scheduler is started if
  27346. configUSE_TIMERS is set to 1. Check that the infrastructure used by the
  27347. timer service task has been created/initialised. If timers have already
  27348. been created then the initialisation will already have been performed. */
  27349. prvCheckForValidListAndQueue();
  27350. 802abda: f7ff ffb5 bl 802ab48 <prvCheckForValidListAndQueue>
  27351. if( xTimerQueue != NULL )
  27352. 802abde: 4b0b ldr r3, [pc, #44] ; (802ac0c <xTimerCreateTimerTask+0x34>)
  27353. 802abe0: 681b ldr r3, [r3, #0]
  27354. 802abe2: b913 cbnz r3, 802abea <xTimerCreateTimerTask+0x12>
  27355. else
  27356. {
  27357. mtCOVERAGE_TEST_MARKER();
  27358. }
  27359. configASSERT( xReturn );
  27360. 802abe4: f001 f9d0 bl 802bf88 <ulPortSetInterruptMask>
  27361. 802abe8: e00d b.n 802ac06 <xTimerCreateTimerTask+0x2e>
  27362. xReturn = xTaskCreate( prvTimerTask, "Tmr Svc", ( uint16_t ) configTIMER_TASK_STACK_DEPTH, NULL, ( ( UBaseType_t ) configTIMER_TASK_PRIORITY ) | portPRIVILEGE_BIT, &xTimerTaskHandle );
  27363. }
  27364. #else
  27365. {
  27366. /* Create the timer task without storing its handle. */
  27367. xReturn = xTaskCreate( prvTimerTask, "Tmr Svc", ( uint16_t ) configTIMER_TASK_STACK_DEPTH, NULL, ( ( UBaseType_t ) configTIMER_TASK_PRIORITY ) | portPRIVILEGE_BIT, NULL);
  27368. 802abea: 2302 movs r3, #2
  27369. 802abec: 9300 str r3, [sp, #0]
  27370. 802abee: 2300 movs r3, #0
  27371. 802abf0: 9301 str r3, [sp, #4]
  27372. 802abf2: 9302 str r3, [sp, #8]
  27373. 802abf4: 9303 str r3, [sp, #12]
  27374. 802abf6: 4806 ldr r0, [pc, #24] ; (802ac10 <xTimerCreateTimerTask+0x38>)
  27375. 802abf8: 4906 ldr r1, [pc, #24] ; (802ac14 <xTimerCreateTimerTask+0x3c>)
  27376. 802abfa: f44f 7280 mov.w r2, #256 ; 0x100
  27377. 802abfe: f000 fcbd bl 802b57c <xTaskGenericCreate>
  27378. else
  27379. {
  27380. mtCOVERAGE_TEST_MARKER();
  27381. }
  27382. configASSERT( xReturn );
  27383. 802ac02: b908 cbnz r0, 802ac08 <xTimerCreateTimerTask+0x30>
  27384. 802ac04: e7ee b.n 802abe4 <xTimerCreateTimerTask+0xc>
  27385. 802ac06: e7fe b.n 802ac06 <xTimerCreateTimerTask+0x2e>
  27386. return xReturn;
  27387. }
  27388. 802ac08: b005 add sp, #20
  27389. 802ac0a: bd00 pop {pc}
  27390. 802ac0c: 20000c38 .word 0x20000c38
  27391. 802ac10: 0802ad11 .word 0x0802ad11
  27392. 802ac14: 080395c5 .word 0x080395c5
  27393. 0802ac18 <xTimerCreate>:
  27394. /*-----------------------------------------------------------*/
  27395. TimerHandle_t xTimerCreate( const char * const pcTimerName, const TickType_t xTimerPeriodInTicks, const UBaseType_t uxAutoReload, void * const pvTimerID, TimerCallbackFunction_t pxCallbackFunction ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
  27396. {
  27397. 802ac18: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  27398. 802ac1c: 4680 mov r8, r0
  27399. 802ac1e: 4617 mov r7, r2
  27400. 802ac20: 461e mov r6, r3
  27401. Timer_t *pxNewTimer;
  27402. /* Allocate the timer structure. */
  27403. if( xTimerPeriodInTicks == ( TickType_t ) 0U )
  27404. 802ac22: 460d mov r5, r1
  27405. 802ac24: b191 cbz r1, 802ac4c <xTimerCreate+0x34>
  27406. {
  27407. pxNewTimer = NULL;
  27408. }
  27409. else
  27410. {
  27411. pxNewTimer = ( Timer_t * ) pvPortMalloc( sizeof( Timer_t ) );
  27412. 802ac26: 202c movs r0, #44 ; 0x2c
  27413. 802ac28: f001 fac4 bl 802c1b4 <pvPortMalloc>
  27414. if( pxNewTimer != NULL )
  27415. 802ac2c: 4604 mov r4, r0
  27416. 802ac2e: b180 cbz r0, 802ac52 <xTimerCreate+0x3a>
  27417. {
  27418. /* Ensure the infrastructure used by the timer service task has been
  27419. created/initialised. */
  27420. prvCheckForValidListAndQueue();
  27421. 802ac30: f7ff ff8a bl 802ab48 <prvCheckForValidListAndQueue>
  27422. /* Initialise the timer structure members using the function parameters. */
  27423. pxNewTimer->pcTimerName = pcTimerName;
  27424. pxNewTimer->xTimerPeriodInTicks = xTimerPeriodInTicks;
  27425. pxNewTimer->uxAutoReload = uxAutoReload;
  27426. pxNewTimer->pvTimerID = pvTimerID;
  27427. pxNewTimer->pxCallbackFunction = pxCallbackFunction;
  27428. 802ac34: 9b06 ldr r3, [sp, #24]
  27429. /* Ensure the infrastructure used by the timer service task has been
  27430. created/initialised. */
  27431. prvCheckForValidListAndQueue();
  27432. /* Initialise the timer structure members using the function parameters. */
  27433. pxNewTimer->pcTimerName = pcTimerName;
  27434. 802ac36: f8c4 8000 str.w r8, [r4]
  27435. pxNewTimer->xTimerPeriodInTicks = xTimerPeriodInTicks;
  27436. 802ac3a: 61a5 str r5, [r4, #24]
  27437. pxNewTimer->uxAutoReload = uxAutoReload;
  27438. 802ac3c: 61e7 str r7, [r4, #28]
  27439. pxNewTimer->pvTimerID = pvTimerID;
  27440. 802ac3e: 6226 str r6, [r4, #32]
  27441. pxNewTimer->pxCallbackFunction = pxCallbackFunction;
  27442. 802ac40: 6263 str r3, [r4, #36] ; 0x24
  27443. vListInitialiseItem( &( pxNewTimer->xTimerListItem ) );
  27444. 802ac42: 1d20 adds r0, r4, #4
  27445. 802ac44: f000 f92d bl 802aea2 <vListInitialiseItem>
  27446. 802ac48: e003 b.n 802ac52 <xTimerCreate+0x3a>
  27447. 802ac4a: e7fe b.n 802ac4a <xTimerCreate+0x32>
  27448. traceTIMER_CREATE_FAILED();
  27449. }
  27450. }
  27451. /* 0 is not a valid value for xTimerPeriodInTicks. */
  27452. configASSERT( ( xTimerPeriodInTicks > 0 ) );
  27453. 802ac4c: f001 f99c bl 802bf88 <ulPortSetInterruptMask>
  27454. 802ac50: e7fb b.n 802ac4a <xTimerCreate+0x32>
  27455. return ( TimerHandle_t ) pxNewTimer;
  27456. }
  27457. 802ac52: 4620 mov r0, r4
  27458. 802ac54: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  27459. 0802ac58 <xTimerGenericCommand>:
  27460. /*-----------------------------------------------------------*/
  27461. BaseType_t xTimerGenericCommand( TimerHandle_t xTimer, const BaseType_t xCommandID, const TickType_t xOptionalValue, BaseType_t * const pxHigherPriorityTaskWoken, const TickType_t xTicksToWait )
  27462. {
  27463. 802ac58: b530 push {r4, r5, lr}
  27464. BaseType_t xReturn = pdFAIL;
  27465. DaemonTaskMessage_t xMessage;
  27466. /* Send a message to the timer service task to perform a particular action
  27467. on a particular timer definition. */
  27468. if( xTimerQueue != NULL )
  27469. 802ac5a: 4c0f ldr r4, [pc, #60] ; (802ac98 <xTimerGenericCommand+0x40>)
  27470. return ( TimerHandle_t ) pxNewTimer;
  27471. }
  27472. /*-----------------------------------------------------------*/
  27473. BaseType_t xTimerGenericCommand( TimerHandle_t xTimer, const BaseType_t xCommandID, const TickType_t xOptionalValue, BaseType_t * const pxHigherPriorityTaskWoken, const TickType_t xTicksToWait )
  27474. {
  27475. 802ac5c: 4605 mov r5, r0
  27476. BaseType_t xReturn = pdFAIL;
  27477. DaemonTaskMessage_t xMessage;
  27478. /* Send a message to the timer service task to perform a particular action
  27479. on a particular timer definition. */
  27480. if( xTimerQueue != NULL )
  27481. 802ac5e: 6820 ldr r0, [r4, #0]
  27482. return ( TimerHandle_t ) pxNewTimer;
  27483. }
  27484. /*-----------------------------------------------------------*/
  27485. BaseType_t xTimerGenericCommand( TimerHandle_t xTimer, const BaseType_t xCommandID, const TickType_t xOptionalValue, BaseType_t * const pxHigherPriorityTaskWoken, const TickType_t xTicksToWait )
  27486. {
  27487. 802ac60: b085 sub sp, #20
  27488. BaseType_t xReturn = pdFAIL;
  27489. DaemonTaskMessage_t xMessage;
  27490. /* Send a message to the timer service task to perform a particular action
  27491. on a particular timer definition. */
  27492. if( xTimerQueue != NULL )
  27493. 802ac62: b1b8 cbz r0, 802ac94 <xTimerGenericCommand+0x3c>
  27494. /* Send a command to the timer service task to start the xTimer timer. */
  27495. xMessage.xMessageID = xCommandID;
  27496. xMessage.u.xTimerParameters.xMessageValue = xOptionalValue;
  27497. xMessage.u.xTimerParameters.pxTimer = ( Timer_t * ) xTimer;
  27498. if( xCommandID < tmrFIRST_FROM_ISR_COMMAND )
  27499. 802ac64: 2905 cmp r1, #5
  27500. /* Send a message to the timer service task to perform a particular action
  27501. on a particular timer definition. */
  27502. if( xTimerQueue != NULL )
  27503. {
  27504. /* Send a command to the timer service task to start the xTimer timer. */
  27505. xMessage.xMessageID = xCommandID;
  27506. 802ac66: 9101 str r1, [sp, #4]
  27507. xMessage.u.xTimerParameters.xMessageValue = xOptionalValue;
  27508. 802ac68: 9202 str r2, [sp, #8]
  27509. xMessage.u.xTimerParameters.pxTimer = ( Timer_t * ) xTimer;
  27510. 802ac6a: 9503 str r5, [sp, #12]
  27511. if( xCommandID < tmrFIRST_FROM_ISR_COMMAND )
  27512. 802ac6c: dc0d bgt.n 802ac8a <xTimerGenericCommand+0x32>
  27513. {
  27514. if( xTaskGetSchedulerState() == taskSCHEDULER_RUNNING )
  27515. 802ac6e: f001 f8a9 bl 802bdc4 <xTaskGetSchedulerState>
  27516. 802ac72: 2802 cmp r0, #2
  27517. {
  27518. xReturn = xQueueSendToBack( xTimerQueue, &xMessage, xTicksToWait );
  27519. 802ac74: a901 add r1, sp, #4
  27520. 802ac76: 6820 ldr r0, [r4, #0]
  27521. xMessage.u.xTimerParameters.xMessageValue = xOptionalValue;
  27522. xMessage.u.xTimerParameters.pxTimer = ( Timer_t * ) xTimer;
  27523. if( xCommandID < tmrFIRST_FROM_ISR_COMMAND )
  27524. {
  27525. if( xTaskGetSchedulerState() == taskSCHEDULER_RUNNING )
  27526. 802ac78: d102 bne.n 802ac80 <xTimerGenericCommand+0x28>
  27527. {
  27528. xReturn = xQueueSendToBack( xTimerQueue, &xMessage, xTicksToWait );
  27529. 802ac7a: 9a08 ldr r2, [sp, #32]
  27530. 802ac7c: 2300 movs r3, #0
  27531. 802ac7e: e001 b.n 802ac84 <xTimerGenericCommand+0x2c>
  27532. }
  27533. else
  27534. {
  27535. xReturn = xQueueSendToBack( xTimerQueue, &xMessage, tmrNO_DELAY );
  27536. 802ac80: 2200 movs r2, #0
  27537. 802ac82: 4613 mov r3, r2
  27538. 802ac84: f000 fa30 bl 802b0e8 <xQueueGenericSend>
  27539. 802ac88: e004 b.n 802ac94 <xTimerGenericCommand+0x3c>
  27540. }
  27541. }
  27542. else
  27543. {
  27544. xReturn = xQueueSendToBackFromISR( xTimerQueue, &xMessage, pxHigherPriorityTaskWoken );
  27545. 802ac8a: 461a mov r2, r3
  27546. 802ac8c: a901 add r1, sp, #4
  27547. 802ac8e: 2300 movs r3, #0
  27548. 802ac90: f000 faee bl 802b270 <xQueueGenericSendFromISR>
  27549. {
  27550. mtCOVERAGE_TEST_MARKER();
  27551. }
  27552. return xReturn;
  27553. }
  27554. 802ac94: b005 add sp, #20
  27555. 802ac96: bd30 pop {r4, r5, pc}
  27556. 802ac98: 20000c38 .word 0x20000c38
  27557. 0802ac9c <prvSwitchTimerLists>:
  27558. }
  27559. }
  27560. /*-----------------------------------------------------------*/
  27561. static void prvSwitchTimerLists( void )
  27562. {
  27563. 802ac9c: e92d 41f3 stmdb sp!, {r0, r1, r4, r5, r6, r7, r8, lr}
  27564. /* The tick count has overflowed. The timer lists must be switched.
  27565. If there are any timers still referenced from the current timer list
  27566. then they must have expired and should be processed before the lists
  27567. are switched. */
  27568. while( listLIST_IS_EMPTY( pxCurrentTimerList ) == pdFALSE )
  27569. 802aca0: 4e19 ldr r6, [pc, #100] ; (802ad08 <prvSwitchTimerLists+0x6c>)
  27570. listSET_LIST_ITEM_OWNER( &( pxTimer->xTimerListItem ), pxTimer );
  27571. vListInsert( pxCurrentTimerList, &( pxTimer->xTimerListItem ) );
  27572. }
  27573. else
  27574. {
  27575. xResult = xTimerGenericCommand( pxTimer, tmrCOMMAND_START_DONT_TRACE, xNextExpireTime, NULL, tmrNO_DELAY );
  27576. 802aca2: f04f 0800 mov.w r8, #0
  27577. 802aca6: e023 b.n 802acf0 <prvSwitchTimerLists+0x54>
  27578. If there are any timers still referenced from the current timer list
  27579. then they must have expired and should be processed before the lists
  27580. are switched. */
  27581. while( listLIST_IS_EMPTY( pxCurrentTimerList ) == pdFALSE )
  27582. {
  27583. xNextExpireTime = listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxCurrentTimerList );
  27584. 802aca8: 68db ldr r3, [r3, #12]
  27585. /* Remove the timer from the list. */
  27586. pxTimer = ( Timer_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxCurrentTimerList );
  27587. 802acaa: 68dc ldr r4, [r3, #12]
  27588. If there are any timers still referenced from the current timer list
  27589. then they must have expired and should be processed before the lists
  27590. are switched. */
  27591. while( listLIST_IS_EMPTY( pxCurrentTimerList ) == pdFALSE )
  27592. {
  27593. xNextExpireTime = listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxCurrentTimerList );
  27594. 802acac: 681d ldr r5, [r3, #0]
  27595. /* Remove the timer from the list. */
  27596. pxTimer = ( Timer_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxCurrentTimerList );
  27597. ( void ) uxListRemove( &( pxTimer->xTimerListItem ) );
  27598. 802acae: 1d27 adds r7, r4, #4
  27599. 802acb0: 4638 mov r0, r7
  27600. 802acb2: f000 f91d bl 802aef0 <uxListRemove>
  27601. traceTIMER_EXPIRED( pxTimer );
  27602. /* Execute its callback, then send a command to restart the timer if
  27603. it is an auto-reload timer. It cannot be restarted here as the lists
  27604. have not yet been switched. */
  27605. pxTimer->pxCallbackFunction( ( TimerHandle_t ) pxTimer );
  27606. 802acb6: 6a63 ldr r3, [r4, #36] ; 0x24
  27607. 802acb8: 4620 mov r0, r4
  27608. 802acba: 4798 blx r3
  27609. if( pxTimer->uxAutoReload == ( UBaseType_t ) pdTRUE )
  27610. 802acbc: 69e3 ldr r3, [r4, #28]
  27611. 802acbe: 2b01 cmp r3, #1
  27612. 802acc0: d116 bne.n 802acf0 <prvSwitchTimerLists+0x54>
  27613. the timer going into the same timer list then it has already expired
  27614. and the timer should be re-inserted into the current list so it is
  27615. processed again within this loop. Otherwise a command should be sent
  27616. to restart the timer to ensure it is only inserted into a list after
  27617. the lists have been swapped. */
  27618. xReloadTime = ( xNextExpireTime + pxTimer->xTimerPeriodInTicks );
  27619. 802acc2: 69a3 ldr r3, [r4, #24]
  27620. 802acc4: 18eb adds r3, r5, r3
  27621. if( xReloadTime > xNextExpireTime )
  27622. 802acc6: 42ab cmp r3, r5
  27623. 802acc8: d906 bls.n 802acd8 <prvSwitchTimerLists+0x3c>
  27624. {
  27625. listSET_LIST_ITEM_VALUE( &( pxTimer->xTimerListItem ), xReloadTime );
  27626. 802acca: 6063 str r3, [r4, #4]
  27627. listSET_LIST_ITEM_OWNER( &( pxTimer->xTimerListItem ), pxTimer );
  27628. 802accc: 6124 str r4, [r4, #16]
  27629. vListInsert( pxCurrentTimerList, &( pxTimer->xTimerListItem ) );
  27630. 802acce: 6830 ldr r0, [r6, #0]
  27631. 802acd0: 4639 mov r1, r7
  27632. 802acd2: f000 f8f5 bl 802aec0 <vListInsert>
  27633. 802acd6: e00b b.n 802acf0 <prvSwitchTimerLists+0x54>
  27634. }
  27635. else
  27636. {
  27637. xResult = xTimerGenericCommand( pxTimer, tmrCOMMAND_START_DONT_TRACE, xNextExpireTime, NULL, tmrNO_DELAY );
  27638. 802acd8: 2100 movs r1, #0
  27639. 802acda: f8cd 8000 str.w r8, [sp]
  27640. 802acde: 4620 mov r0, r4
  27641. 802ace0: 462a mov r2, r5
  27642. 802ace2: 460b mov r3, r1
  27643. 802ace4: f7ff ffb8 bl 802ac58 <xTimerGenericCommand>
  27644. configASSERT( xResult );
  27645. 802ace8: b910 cbnz r0, 802acf0 <prvSwitchTimerLists+0x54>
  27646. 802acea: f001 f94d bl 802bf88 <ulPortSetInterruptMask>
  27647. 802acee: e7fe b.n 802acee <prvSwitchTimerLists+0x52>
  27648. /* The tick count has overflowed. The timer lists must be switched.
  27649. If there are any timers still referenced from the current timer list
  27650. then they must have expired and should be processed before the lists
  27651. are switched. */
  27652. while( listLIST_IS_EMPTY( pxCurrentTimerList ) == pdFALSE )
  27653. 802acf0: 6833 ldr r3, [r6, #0]
  27654. 802acf2: 681a ldr r2, [r3, #0]
  27655. 802acf4: 2a00 cmp r2, #0
  27656. 802acf6: d1d7 bne.n 802aca8 <prvSwitchTimerLists+0xc>
  27657. mtCOVERAGE_TEST_MARKER();
  27658. }
  27659. }
  27660. pxTemp = pxCurrentTimerList;
  27661. pxCurrentTimerList = pxOverflowTimerList;
  27662. 802acf8: 4a04 ldr r2, [pc, #16] ; (802ad0c <prvSwitchTimerLists+0x70>)
  27663. 802acfa: 4803 ldr r0, [pc, #12] ; (802ad08 <prvSwitchTimerLists+0x6c>)
  27664. 802acfc: 6811 ldr r1, [r2, #0]
  27665. pxOverflowTimerList = pxTemp;
  27666. 802acfe: 6013 str r3, [r2, #0]
  27667. mtCOVERAGE_TEST_MARKER();
  27668. }
  27669. }
  27670. pxTemp = pxCurrentTimerList;
  27671. pxCurrentTimerList = pxOverflowTimerList;
  27672. 802ad00: 6001 str r1, [r0, #0]
  27673. pxOverflowTimerList = pxTemp;
  27674. }
  27675. 802ad02: e8bd 81fc ldmia.w sp!, {r2, r3, r4, r5, r6, r7, r8, pc}
  27676. 802ad06: bf00 nop
  27677. 802ad08: 20000c08 .word 0x20000c08
  27678. 802ad0c: 20000c3c .word 0x20000c3c
  27679. 0802ad10 <prvTimerTask>:
  27680. pxTimer->pxCallbackFunction( ( TimerHandle_t ) pxTimer );
  27681. }
  27682. /*-----------------------------------------------------------*/
  27683. static void prvTimerTask( void *pvParameters )
  27684. {
  27685. 802ad10: e92d 43f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, lr}
  27686. TickType_t xTimeNow;
  27687. PRIVILEGED_DATA static TickType_t xLastTime = ( TickType_t ) 0U; /*lint !e956 Variable is only accessible to one task. */
  27688. xTimeNow = xTaskGetTickCount();
  27689. if( xTimeNow < xLastTime )
  27690. 802ad14: f8df 816c ldr.w r8, [pc, #364] ; 802ae84 <prvTimerTask+0x174>
  27691. pxTimer->pxCallbackFunction( ( TimerHandle_t ) pxTimer );
  27692. }
  27693. /*-----------------------------------------------------------*/
  27694. static void prvTimerTask( void *pvParameters )
  27695. {
  27696. 802ad18: b087 sub sp, #28
  27697. 802ad1a: 46c1 mov r9, r8
  27698. the timer with the nearest expiry time will expire. If there are no
  27699. active timers then just set the next expire time to 0. That will cause
  27700. this task to unblock when the tick count overflows, at which point the
  27701. timer lists will be switched and the next expiry time can be
  27702. re-assessed. */
  27703. *pxListWasEmpty = listLIST_IS_EMPTY( pxCurrentTimerList );
  27704. 802ad1c: 4b57 ldr r3, [pc, #348] ; (802ae7c <prvTimerTask+0x16c>)
  27705. 802ad1e: 681b ldr r3, [r3, #0]
  27706. 802ad20: 681f ldr r7, [r3, #0]
  27707. 802ad22: f1d7 0701 rsbs r7, r7, #1
  27708. 802ad26: bf38 it cc
  27709. 802ad28: 2700 movcc r7, #0
  27710. if( *pxListWasEmpty == pdFALSE )
  27711. 802ad2a: b917 cbnz r7, 802ad32 <prvTimerTask+0x22>
  27712. {
  27713. xNextExpireTime = listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxCurrentTimerList );
  27714. 802ad2c: 68db ldr r3, [r3, #12]
  27715. 802ad2e: 681d ldr r5, [r3, #0]
  27716. 802ad30: e000 b.n 802ad34 <prvTimerTask+0x24>
  27717. }
  27718. else
  27719. {
  27720. /* Ensure the task unblocks when the tick count rolls over. */
  27721. xNextExpireTime = ( TickType_t ) 0U;
  27722. 802ad32: 2500 movs r5, #0
  27723. static void prvProcessTimerOrBlockTask( const TickType_t xNextExpireTime, const BaseType_t xListWasEmpty )
  27724. {
  27725. TickType_t xTimeNow;
  27726. BaseType_t xTimerListsWereSwitched;
  27727. vTaskSuspendAll();
  27728. 802ad34: f000 fd82 bl 802b83c <vTaskSuspendAll>
  27729. static TickType_t prvSampleTimeNow( BaseType_t * const pxTimerListsWereSwitched )
  27730. {
  27731. TickType_t xTimeNow;
  27732. PRIVILEGED_DATA static TickType_t xLastTime = ( TickType_t ) 0U; /*lint !e956 Variable is only accessible to one task. */
  27733. xTimeNow = xTaskGetTickCount();
  27734. 802ad38: f000 fd88 bl 802b84c <xTaskGetTickCount>
  27735. if( xTimeNow < xLastTime )
  27736. 802ad3c: f8d8 3000 ldr.w r3, [r8]
  27737. 802ad40: 4298 cmp r0, r3
  27738. static TickType_t prvSampleTimeNow( BaseType_t * const pxTimerListsWereSwitched )
  27739. {
  27740. TickType_t xTimeNow;
  27741. PRIVILEGED_DATA static TickType_t xLastTime = ( TickType_t ) 0U; /*lint !e956 Variable is only accessible to one task. */
  27742. xTimeNow = xTaskGetTickCount();
  27743. 802ad42: 4606 mov r6, r0
  27744. if( xTimeNow < xLastTime )
  27745. 802ad44: d203 bcs.n 802ad4e <prvTimerTask+0x3e>
  27746. {
  27747. prvSwitchTimerLists();
  27748. 802ad46: f7ff ffa9 bl 802ac9c <prvSwitchTimerLists>
  27749. *pxTimerListsWereSwitched = pdTRUE;
  27750. 802ad4a: 2301 movs r3, #1
  27751. 802ad4c: e000 b.n 802ad50 <prvTimerTask+0x40>
  27752. }
  27753. else
  27754. {
  27755. *pxTimerListsWereSwitched = pdFALSE;
  27756. 802ad4e: 2300 movs r3, #0
  27757. }
  27758. xLastTime = xTimeNow;
  27759. 802ad50: f8c9 6000 str.w r6, [r9]
  27760. has expired or not. If obtaining the time causes the lists to switch
  27761. then don't process this timer as any timers that remained in the list
  27762. when the lists were switched will have been processed within the
  27763. prvSampleTimeNow() function. */
  27764. xTimeNow = prvSampleTimeNow( &xTimerListsWereSwitched );
  27765. if( xTimerListsWereSwitched == pdFALSE )
  27766. 802ad54: 2b00 cmp r3, #0
  27767. 802ad56: d132 bne.n 802adbe <prvTimerTask+0xae>
  27768. {
  27769. /* The tick count has not overflowed, has the timer expired? */
  27770. if( ( xListWasEmpty == pdFALSE ) && ( xNextExpireTime <= xTimeNow ) )
  27771. 802ad58: bb2f cbnz r7, 802ada6 <prvTimerTask+0x96>
  27772. 802ad5a: 42b5 cmp r5, r6
  27773. 802ad5c: d823 bhi.n 802ada6 <prvTimerTask+0x96>
  27774. {
  27775. ( void ) xTaskResumeAll();
  27776. 802ad5e: f000 fe09 bl 802b974 <xTaskResumeAll>
  27777. /*-----------------------------------------------------------*/
  27778. static void prvProcessExpiredTimer( const TickType_t xNextExpireTime, const TickType_t xTimeNow )
  27779. {
  27780. BaseType_t xResult;
  27781. Timer_t * const pxTimer = ( Timer_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxCurrentTimerList );
  27782. 802ad62: 4b46 ldr r3, [pc, #280] ; (802ae7c <prvTimerTask+0x16c>)
  27783. 802ad64: 681b ldr r3, [r3, #0]
  27784. 802ad66: 68db ldr r3, [r3, #12]
  27785. 802ad68: 68dc ldr r4, [r3, #12]
  27786. /* Remove the timer from the list of active timers. A check has already
  27787. been performed to ensure the list is not empty. */
  27788. ( void ) uxListRemove( &( pxTimer->xTimerListItem ) );
  27789. 802ad6a: 1d20 adds r0, r4, #4
  27790. 802ad6c: f000 f8c0 bl 802aef0 <uxListRemove>
  27791. traceTIMER_EXPIRED( pxTimer );
  27792. /* If the timer is an auto reload timer then calculate the next
  27793. expiry time and re-insert the timer in the list of active timers. */
  27794. if( pxTimer->uxAutoReload == ( UBaseType_t ) pdTRUE )
  27795. 802ad70: 69e3 ldr r3, [r4, #28]
  27796. 802ad72: 2b01 cmp r3, #1
  27797. 802ad74: d113 bne.n 802ad9e <prvTimerTask+0x8e>
  27798. {
  27799. /* The timer is inserted into a list using a time relative to anything
  27800. other than the current time. It will therefore be inserted into the
  27801. correct list relative to the time this task thinks it is now. */
  27802. if( prvInsertTimerInActiveList( pxTimer, ( xNextExpireTime + pxTimer->xTimerPeriodInTicks ), xTimeNow, xNextExpireTime ) == pdTRUE )
  27803. 802ad76: 69a1 ldr r1, [r4, #24]
  27804. 802ad78: 4620 mov r0, r4
  27805. 802ad7a: 1869 adds r1, r5, r1
  27806. 802ad7c: 4632 mov r2, r6
  27807. 802ad7e: 462b mov r3, r5
  27808. 802ad80: f7ff ff0c bl 802ab9c <prvInsertTimerInActiveList>
  27809. 802ad84: 2801 cmp r0, #1
  27810. 802ad86: d10a bne.n 802ad9e <prvTimerTask+0x8e>
  27811. {
  27812. /* The timer expired before it was added to the active timer
  27813. list. Reload it now. */
  27814. xResult = xTimerGenericCommand( pxTimer, tmrCOMMAND_START_DONT_TRACE, xNextExpireTime, NULL, tmrNO_DELAY );
  27815. 802ad88: 9700 str r7, [sp, #0]
  27816. 802ad8a: 4620 mov r0, r4
  27817. 802ad8c: 4639 mov r1, r7
  27818. 802ad8e: 462a mov r2, r5
  27819. 802ad90: 463b mov r3, r7
  27820. 802ad92: f7ff ff61 bl 802ac58 <xTimerGenericCommand>
  27821. configASSERT( xResult );
  27822. 802ad96: b910 cbnz r0, 802ad9e <prvTimerTask+0x8e>
  27823. 802ad98: f001 f8f6 bl 802bf88 <ulPortSetInterruptMask>
  27824. 802ad9c: e7fe b.n 802ad9c <prvTimerTask+0x8c>
  27825. {
  27826. mtCOVERAGE_TEST_MARKER();
  27827. }
  27828. /* Call the timer callback. */
  27829. pxTimer->pxCallbackFunction( ( TimerHandle_t ) pxTimer );
  27830. 802ad9e: 6a63 ldr r3, [r4, #36] ; 0x24
  27831. 802ada0: 4620 mov r0, r4
  27832. 802ada2: 4798 blx r3
  27833. 802ada4: e05f b.n 802ae66 <prvTimerTask+0x156>
  27834. time has not been reached yet. This task should therefore
  27835. block to wait for the next expire time or a command to be
  27836. received - whichever comes first. The following line cannot
  27837. be reached unless xNextExpireTime > xTimeNow, except in the
  27838. case when the current timer list is empty. */
  27839. vQueueWaitForMessageRestricted( xTimerQueue, ( xNextExpireTime - xTimeNow ) );
  27840. 802ada6: 4b36 ldr r3, [pc, #216] ; (802ae80 <prvTimerTask+0x170>)
  27841. 802ada8: 1ba9 subs r1, r5, r6
  27842. 802adaa: 6818 ldr r0, [r3, #0]
  27843. 802adac: f000 fb8e bl 802b4cc <vQueueWaitForMessageRestricted>
  27844. if( xTaskResumeAll() == pdFALSE )
  27845. 802adb0: f000 fde0 bl 802b974 <xTaskResumeAll>
  27846. 802adb4: 2800 cmp r0, #0
  27847. 802adb6: d156 bne.n 802ae66 <prvTimerTask+0x156>
  27848. {
  27849. /* Yield to wait for either a command to arrive, or the
  27850. block time to expire. If a command arrived between the
  27851. critical section being exited and this yield then the yield
  27852. will not cause the task to block. */
  27853. portYIELD_WITHIN_API();
  27854. 802adb8: f001 f8da bl 802bf70 <vPortYield>
  27855. 802adbc: e053 b.n 802ae66 <prvTimerTask+0x156>
  27856. }
  27857. }
  27858. }
  27859. else
  27860. {
  27861. ( void ) xTaskResumeAll();
  27862. 802adbe: f000 fdd9 bl 802b974 <xTaskResumeAll>
  27863. 802adc2: e050 b.n 802ae66 <prvTimerTask+0x156>
  27864. }
  27865. #endif /* INCLUDE_xTimerPendFunctionCall */
  27866. /* Commands that are positive are timer commands rather than pended
  27867. function calls. */
  27868. if( xMessage.xMessageID >= ( BaseType_t ) 0 )
  27869. 802adc4: 9b03 ldr r3, [sp, #12]
  27870. 802adc6: 2b00 cmp r3, #0
  27871. 802adc8: db4e blt.n 802ae68 <prvTimerTask+0x158>
  27872. {
  27873. /* The messages uses the xTimerParameters member to work on a
  27874. software timer. */
  27875. pxTimer = xMessage.u.xTimerParameters.pxTimer;
  27876. 802adca: 9c05 ldr r4, [sp, #20]
  27877. if( listIS_CONTAINED_WITHIN( NULL, &( pxTimer->xTimerListItem ) ) == pdFALSE )
  27878. 802adcc: 6963 ldr r3, [r4, #20]
  27879. 802adce: b113 cbz r3, 802add6 <prvTimerTask+0xc6>
  27880. {
  27881. /* The timer is in a list, remove it. */
  27882. ( void ) uxListRemove( &( pxTimer->xTimerListItem ) );
  27883. 802add0: 1d20 adds r0, r4, #4
  27884. 802add2: f000 f88d bl 802aef0 <uxListRemove>
  27885. static TickType_t prvSampleTimeNow( BaseType_t * const pxTimerListsWereSwitched )
  27886. {
  27887. TickType_t xTimeNow;
  27888. PRIVILEGED_DATA static TickType_t xLastTime = ( TickType_t ) 0U; /*lint !e956 Variable is only accessible to one task. */
  27889. xTimeNow = xTaskGetTickCount();
  27890. 802add6: f000 fd39 bl 802b84c <xTaskGetTickCount>
  27891. if( xTimeNow < xLastTime )
  27892. 802adda: f8d8 3000 ldr.w r3, [r8]
  27893. 802adde: 4298 cmp r0, r3
  27894. static TickType_t prvSampleTimeNow( BaseType_t * const pxTimerListsWereSwitched )
  27895. {
  27896. TickType_t xTimeNow;
  27897. PRIVILEGED_DATA static TickType_t xLastTime = ( TickType_t ) 0U; /*lint !e956 Variable is only accessible to one task. */
  27898. xTimeNow = xTaskGetTickCount();
  27899. 802ade0: 4605 mov r5, r0
  27900. if( xTimeNow < xLastTime )
  27901. 802ade2: d201 bcs.n 802ade8 <prvTimerTask+0xd8>
  27902. {
  27903. prvSwitchTimerLists();
  27904. 802ade4: f7ff ff5a bl 802ac9c <prvSwitchTimerLists>
  27905. possibility of a higher priority task adding a message to the message
  27906. queue with a time that is ahead of the timer daemon task (because it
  27907. pre-empted the timer daemon task after the xTimeNow value was set). */
  27908. xTimeNow = prvSampleTimeNow( &xTimerListsWereSwitched );
  27909. switch( xMessage.xMessageID )
  27910. 802ade8: 9b03 ldr r3, [sp, #12]
  27911. else
  27912. {
  27913. *pxTimerListsWereSwitched = pdFALSE;
  27914. }
  27915. xLastTime = xTimeNow;
  27916. 802adea: f8c9 5000 str.w r5, [r9]
  27917. possibility of a higher priority task adding a message to the message
  27918. queue with a time that is ahead of the timer daemon task (because it
  27919. pre-empted the timer daemon task after the xTimeNow value was set). */
  27920. xTimeNow = prvSampleTimeNow( &xTimerListsWereSwitched );
  27921. switch( xMessage.xMessageID )
  27922. 802adee: 2b09 cmp r3, #9
  27923. 802adf0: d83a bhi.n 802ae68 <prvTimerTask+0x158>
  27924. 802adf2: f04f 6204 mov.w r2, #138412032 ; 0x8400000
  27925. 802adf6: 409a lsls r2, r3
  27926. 802adf8: d424 bmi.n 802ae44 <prvTimerTask+0x134>
  27927. 802adfa: f04f 4263 mov.w r2, #3808428032 ; 0xe3000000
  27928. 802adfe: 409a lsls r2, r3
  27929. 802ae00: d404 bmi.n 802ae0c <prvTimerTask+0xfc>
  27930. 802ae02: f04f 6280 mov.w r2, #67108864 ; 0x4000000
  27931. 802ae06: 409a lsls r2, r3
  27932. 802ae08: d429 bmi.n 802ae5e <prvTimerTask+0x14e>
  27933. 802ae0a: e02d b.n 802ae68 <prvTimerTask+0x158>
  27934. case tmrCOMMAND_START_FROM_ISR :
  27935. case tmrCOMMAND_RESET :
  27936. case tmrCOMMAND_RESET_FROM_ISR :
  27937. case tmrCOMMAND_START_DONT_TRACE :
  27938. /* Start or restart a timer. */
  27939. if( prvInsertTimerInActiveList( pxTimer, xMessage.u.xTimerParameters.xMessageValue + pxTimer->xTimerPeriodInTicks, xTimeNow, xMessage.u.xTimerParameters.xMessageValue ) == pdTRUE )
  27940. 802ae0c: 9b04 ldr r3, [sp, #16]
  27941. 802ae0e: 69a1 ldr r1, [r4, #24]
  27942. 802ae10: 4620 mov r0, r4
  27943. 802ae12: 1859 adds r1, r3, r1
  27944. 802ae14: 462a mov r2, r5
  27945. 802ae16: f7ff fec1 bl 802ab9c <prvInsertTimerInActiveList>
  27946. 802ae1a: 2801 cmp r0, #1
  27947. 802ae1c: d124 bne.n 802ae68 <prvTimerTask+0x158>
  27948. {
  27949. /* The timer expired before it was added to the active
  27950. timer list. Process it now. */
  27951. pxTimer->pxCallbackFunction( ( TimerHandle_t ) pxTimer );
  27952. 802ae1e: 6a63 ldr r3, [r4, #36] ; 0x24
  27953. 802ae20: 4620 mov r0, r4
  27954. 802ae22: 4798 blx r3
  27955. traceTIMER_EXPIRED( pxTimer );
  27956. if( pxTimer->uxAutoReload == ( UBaseType_t ) pdTRUE )
  27957. 802ae24: 69e3 ldr r3, [r4, #28]
  27958. 802ae26: 2b01 cmp r3, #1
  27959. 802ae28: d11e bne.n 802ae68 <prvTimerTask+0x158>
  27960. {
  27961. xResult = xTimerGenericCommand( pxTimer, tmrCOMMAND_START_DONT_TRACE, xMessage.u.xTimerParameters.xMessageValue + pxTimer->xTimerPeriodInTicks, NULL, tmrNO_DELAY );
  27962. 802ae2a: 69a2 ldr r2, [r4, #24]
  27963. 802ae2c: 9b04 ldr r3, [sp, #16]
  27964. 802ae2e: 2100 movs r1, #0
  27965. 802ae30: 18d2 adds r2, r2, r3
  27966. 802ae32: 9100 str r1, [sp, #0]
  27967. 802ae34: 4620 mov r0, r4
  27968. 802ae36: 460b mov r3, r1
  27969. 802ae38: f7ff ff0e bl 802ac58 <xTimerGenericCommand>
  27970. configASSERT( xResult );
  27971. 802ae3c: b9a0 cbnz r0, 802ae68 <prvTimerTask+0x158>
  27972. 802ae3e: f001 f8a3 bl 802bf88 <ulPortSetInterruptMask>
  27973. 802ae42: e7fe b.n 802ae42 <prvTimerTask+0x132>
  27974. There is nothing to do here. */
  27975. break;
  27976. case tmrCOMMAND_CHANGE_PERIOD :
  27977. case tmrCOMMAND_CHANGE_PERIOD_FROM_ISR :
  27978. pxTimer->xTimerPeriodInTicks = xMessage.u.xTimerParameters.xMessageValue;
  27979. 802ae44: 9904 ldr r1, [sp, #16]
  27980. 802ae46: 61a1 str r1, [r4, #24]
  27981. configASSERT( ( pxTimer->xTimerPeriodInTicks > 0 ) );
  27982. 802ae48: b911 cbnz r1, 802ae50 <prvTimerTask+0x140>
  27983. 802ae4a: f001 f89d bl 802bf88 <ulPortSetInterruptMask>
  27984. 802ae4e: e7fe b.n 802ae4e <prvTimerTask+0x13e>
  27985. longer or shorter than the old one. The command time is
  27986. therefore set to the current time, and as the period cannot be
  27987. zero the next expiry time can only be in the future, meaning
  27988. (unlike for the xTimerStart() case above) there is no fail case
  27989. that needs to be handled here. */
  27990. ( void ) prvInsertTimerInActiveList( pxTimer, ( xTimeNow + pxTimer->xTimerPeriodInTicks ), xTimeNow, xTimeNow );
  27991. 802ae50: 4620 mov r0, r4
  27992. 802ae52: 1869 adds r1, r5, r1
  27993. 802ae54: 462a mov r2, r5
  27994. 802ae56: 462b mov r3, r5
  27995. 802ae58: f7ff fea0 bl 802ab9c <prvInsertTimerInActiveList>
  27996. 802ae5c: e004 b.n 802ae68 <prvTimerTask+0x158>
  27997. break;
  27998. case tmrCOMMAND_DELETE :
  27999. /* The timer has already been removed from the active list,
  28000. just free up the memory. */
  28001. vPortFree( pxTimer );
  28002. 802ae5e: 4620 mov r0, r4
  28003. 802ae60: f001 fa2e bl 802c2c0 <vPortFree>
  28004. 802ae64: e000 b.n 802ae68 <prvTimerTask+0x158>
  28005. DaemonTaskMessage_t xMessage;
  28006. Timer_t *pxTimer;
  28007. BaseType_t xTimerListsWereSwitched, xResult;
  28008. TickType_t xTimeNow;
  28009. while( xQueueReceive( xTimerQueue, &xMessage, tmrNO_DELAY ) != pdFAIL ) /*lint !e603 xMessage does not have to be initialised as it is passed out, not in, and it is not used unless xQueueReceive() returns pdTRUE. */
  28010. 802ae66: 4e06 ldr r6, [pc, #24] ; (802ae80 <prvTimerTask+0x170>)
  28011. 802ae68: 2200 movs r2, #0
  28012. 802ae6a: 6830 ldr r0, [r6, #0]
  28013. 802ae6c: a903 add r1, sp, #12
  28014. 802ae6e: 4613 mov r3, r2
  28015. 802ae70: f000 fa7a bl 802b368 <xQueueGenericReceive>
  28016. 802ae74: 2800 cmp r0, #0
  28017. 802ae76: d1a5 bne.n 802adc4 <prvTimerTask+0xb4>
  28018. 802ae78: e750 b.n 802ad1c <prvTimerTask+0xc>
  28019. 802ae7a: bf00 nop
  28020. 802ae7c: 20000c08 .word 0x20000c08
  28021. 802ae80: 20000c38 .word 0x20000c38
  28022. 802ae84: 20000c34 .word 0x20000c34
  28023. 0802ae88 <pvTimerGetTimerID>:
  28024. void *pvTimerGetTimerID( const TimerHandle_t xTimer )
  28025. {
  28026. Timer_t * const pxTimer = ( Timer_t * ) xTimer;
  28027. return pxTimer->pvTimerID;
  28028. }
  28029. 802ae88: 6a00 ldr r0, [r0, #32]
  28030. 802ae8a: 4770 bx lr
  28031. 0802ae8c <vListInitialise>:
  28032. void vListInitialise( List_t * const pxList )
  28033. {
  28034. /* The list structure contains a list item which is used to mark the
  28035. end of the list. To initialise the list the list end is inserted
  28036. as the only list entry. */
  28037. 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. */
  28038. 802ae8c: f100 0308 add.w r3, r0, #8
  28039. 802ae90: 6043 str r3, [r0, #4]
  28040. /* The list end value is the highest possible value in the list to
  28041. ensure it remains at the end of the list. */
  28042. pxList->xListEnd.xItemValue = portMAX_DELAY;
  28043. 802ae92: f04f 32ff mov.w r2, #4294967295
  28044. /* The list end next and previous pointers point to itself so we know
  28045. when the list is empty. */
  28046. 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. */
  28047. 802ae96: 60c3 str r3, [r0, #12]
  28048. 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. */
  28049. 802ae98: 6103 str r3, [r0, #16]
  28050. pxList->uxNumberOfItems = ( UBaseType_t ) 0U;
  28051. 802ae9a: 2300 movs r3, #0
  28052. as the only list entry. */
  28053. 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. */
  28054. /* The list end value is the highest possible value in the list to
  28055. ensure it remains at the end of the list. */
  28056. pxList->xListEnd.xItemValue = portMAX_DELAY;
  28057. 802ae9c: 6082 str r2, [r0, #8]
  28058. /* The list end next and previous pointers point to itself so we know
  28059. when the list is empty. */
  28060. 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. */
  28061. 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. */
  28062. pxList->uxNumberOfItems = ( UBaseType_t ) 0U;
  28063. 802ae9e: 6003 str r3, [r0, #0]
  28064. 802aea0: 4770 bx lr
  28065. 0802aea2 <vListInitialiseItem>:
  28066. /*-----------------------------------------------------------*/
  28067. void vListInitialiseItem( ListItem_t * const pxItem )
  28068. {
  28069. /* Make sure the list item is not recorded as being on a list. */
  28070. pxItem->pvContainer = NULL;
  28071. 802aea2: 2300 movs r3, #0
  28072. 802aea4: 6103 str r3, [r0, #16]
  28073. 802aea6: 4770 bx lr
  28074. 0802aea8 <vListInsertEnd>:
  28075. }
  28076. /*-----------------------------------------------------------*/
  28077. void vListInsertEnd( List_t * const pxList, ListItem_t * const pxNewListItem )
  28078. {
  28079. ListItem_t * const pxIndex = pxList->pxIndex;
  28080. 802aea8: 6843 ldr r3, [r0, #4]
  28081. pxNewListItem->pxPrevious = pxIndex->pxPrevious;
  28082. pxIndex->pxPrevious->pxNext = pxNewListItem;
  28083. pxIndex->pxPrevious = pxNewListItem;
  28084. /* Remember which list the item is in. */
  28085. pxNewListItem->pvContainer = ( void * ) pxList;
  28086. 802aeaa: 6108 str r0, [r1, #16]
  28087. /* Insert a new list item into pxList, but rather than sort the list,
  28088. makes the new list item the last item to be removed by a call to
  28089. listGET_OWNER_OF_NEXT_ENTRY(). */
  28090. pxNewListItem->pxNext = pxIndex;
  28091. pxNewListItem->pxPrevious = pxIndex->pxPrevious;
  28092. 802aeac: 689a ldr r2, [r3, #8]
  28093. listTEST_LIST_ITEM_INTEGRITY( pxNewListItem );
  28094. /* Insert a new list item into pxList, but rather than sort the list,
  28095. makes the new list item the last item to be removed by a call to
  28096. listGET_OWNER_OF_NEXT_ENTRY(). */
  28097. pxNewListItem->pxNext = pxIndex;
  28098. 802aeae: 604b str r3, [r1, #4]
  28099. pxNewListItem->pxPrevious = pxIndex->pxPrevious;
  28100. 802aeb0: 608a str r2, [r1, #8]
  28101. pxIndex->pxPrevious->pxNext = pxNewListItem;
  28102. 802aeb2: 689a ldr r2, [r3, #8]
  28103. pxIndex->pxPrevious = pxNewListItem;
  28104. 802aeb4: 6099 str r1, [r3, #8]
  28105. /* Remember which list the item is in. */
  28106. pxNewListItem->pvContainer = ( void * ) pxList;
  28107. ( pxList->uxNumberOfItems )++;
  28108. 802aeb6: 6803 ldr r3, [r0, #0]
  28109. /* Insert a new list item into pxList, but rather than sort the list,
  28110. makes the new list item the last item to be removed by a call to
  28111. listGET_OWNER_OF_NEXT_ENTRY(). */
  28112. pxNewListItem->pxNext = pxIndex;
  28113. pxNewListItem->pxPrevious = pxIndex->pxPrevious;
  28114. pxIndex->pxPrevious->pxNext = pxNewListItem;
  28115. 802aeb8: 6051 str r1, [r2, #4]
  28116. pxIndex->pxPrevious = pxNewListItem;
  28117. /* Remember which list the item is in. */
  28118. pxNewListItem->pvContainer = ( void * ) pxList;
  28119. ( pxList->uxNumberOfItems )++;
  28120. 802aeba: 3301 adds r3, #1
  28121. 802aebc: 6003 str r3, [r0, #0]
  28122. 802aebe: 4770 bx lr
  28123. 0802aec0 <vListInsert>:
  28124. /*-----------------------------------------------------------*/
  28125. void vListInsert( List_t * const pxList, ListItem_t * const pxNewListItem )
  28126. {
  28127. ListItem_t *pxIterator;
  28128. const TickType_t xValueOfInsertion = pxNewListItem->xItemValue;
  28129. 802aec0: 680a ldr r2, [r1, #0]
  28130. new list item should be placed after it. This ensures that TCB's which are
  28131. stored in ready lists (all of which have the same xItemValue value) get a
  28132. share of the CPU. However, if the xItemValue is the same as the back marker
  28133. the iteration loop below will not end. Therefore the value is checked
  28134. first, and the algorithm slightly modified if necessary. */
  28135. if( xValueOfInsertion == portMAX_DELAY )
  28136. 802aec2: 1c53 adds r3, r2, #1
  28137. ( pxList->uxNumberOfItems )++;
  28138. }
  28139. /*-----------------------------------------------------------*/
  28140. void vListInsert( List_t * const pxList, ListItem_t * const pxNewListItem )
  28141. {
  28142. 802aec4: b530 push {r4, r5, lr}
  28143. new list item should be placed after it. This ensures that TCB's which are
  28144. stored in ready lists (all of which have the same xItemValue value) get a
  28145. share of the CPU. However, if the xItemValue is the same as the back marker
  28146. the iteration loop below will not end. Therefore the value is checked
  28147. first, and the algorithm slightly modified if necessary. */
  28148. if( xValueOfInsertion == portMAX_DELAY )
  28149. 802aec6: d101 bne.n 802aecc <vListInsert+0xc>
  28150. {
  28151. pxIterator = pxList->xListEnd.pxPrevious;
  28152. 802aec8: 6903 ldr r3, [r0, #16]
  28153. 802aeca: e007 b.n 802aedc <vListInsert+0x1c>
  28154. 4) Using a queue or semaphore before it has been initialised or
  28155. before the scheduler has been started (are interrupts firing
  28156. before vTaskStartScheduler() has been called?).
  28157. **********************************************************************/
  28158. 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. */
  28159. 802aecc: f100 0308 add.w r3, r0, #8
  28160. 802aed0: e000 b.n 802aed4 <vListInsert+0x14>
  28161. 802aed2: 4623 mov r3, r4
  28162. 802aed4: 685c ldr r4, [r3, #4]
  28163. 802aed6: 6825 ldr r5, [r4, #0]
  28164. 802aed8: 4295 cmp r5, r2
  28165. 802aeda: d9fa bls.n 802aed2 <vListInsert+0x12>
  28166. /* There is nothing to do here, just iterating to the wanted
  28167. insertion position. */
  28168. }
  28169. }
  28170. pxNewListItem->pxNext = pxIterator->pxNext;
  28171. 802aedc: 685a ldr r2, [r3, #4]
  28172. pxNewListItem->pxPrevious = pxIterator;
  28173. pxIterator->pxNext = pxNewListItem;
  28174. /* Remember which list the item is in. This allows fast removal of the
  28175. item later. */
  28176. pxNewListItem->pvContainer = ( void * ) pxList;
  28177. 802aede: 6108 str r0, [r1, #16]
  28178. /* There is nothing to do here, just iterating to the wanted
  28179. insertion position. */
  28180. }
  28181. }
  28182. pxNewListItem->pxNext = pxIterator->pxNext;
  28183. 802aee0: 604a str r2, [r1, #4]
  28184. pxNewListItem->pxNext->pxPrevious = pxNewListItem;
  28185. 802aee2: 6091 str r1, [r2, #8]
  28186. pxNewListItem->pxPrevious = pxIterator;
  28187. pxIterator->pxNext = pxNewListItem;
  28188. 802aee4: 6059 str r1, [r3, #4]
  28189. }
  28190. }
  28191. pxNewListItem->pxNext = pxIterator->pxNext;
  28192. pxNewListItem->pxNext->pxPrevious = pxNewListItem;
  28193. pxNewListItem->pxPrevious = pxIterator;
  28194. 802aee6: 608b str r3, [r1, #8]
  28195. /* Remember which list the item is in. This allows fast removal of the
  28196. item later. */
  28197. pxNewListItem->pvContainer = ( void * ) pxList;
  28198. ( pxList->uxNumberOfItems )++;
  28199. 802aee8: 6803 ldr r3, [r0, #0]
  28200. 802aeea: 3301 adds r3, #1
  28201. 802aeec: 6003 str r3, [r0, #0]
  28202. 802aeee: bd30 pop {r4, r5, pc}
  28203. 0802aef0 <uxListRemove>:
  28204. {
  28205. /* The list item knows which list it is in. Obtain the list from the list
  28206. item. */
  28207. List_t * const pxList = ( List_t * ) pxItemToRemove->pvContainer;
  28208. pxItemToRemove->pxNext->pxPrevious = pxItemToRemove->pxPrevious;
  28209. 802aef0: 6841 ldr r1, [r0, #4]
  28210. 802aef2: 6882 ldr r2, [r0, #8]
  28211. UBaseType_t uxListRemove( ListItem_t * const pxItemToRemove )
  28212. {
  28213. /* The list item knows which list it is in. Obtain the list from the list
  28214. item. */
  28215. List_t * const pxList = ( List_t * ) pxItemToRemove->pvContainer;
  28216. 802aef4: 6903 ldr r3, [r0, #16]
  28217. pxItemToRemove->pxNext->pxPrevious = pxItemToRemove->pxPrevious;
  28218. 802aef6: 608a str r2, [r1, #8]
  28219. pxItemToRemove->pxPrevious->pxNext = pxItemToRemove->pxNext;
  28220. 802aef8: 6882 ldr r2, [r0, #8]
  28221. 802aefa: 6051 str r1, [r2, #4]
  28222. /* Make sure the index is left pointing to a valid item. */
  28223. if( pxList->pxIndex == pxItemToRemove )
  28224. 802aefc: 6859 ldr r1, [r3, #4]
  28225. 802aefe: 4281 cmp r1, r0
  28226. {
  28227. pxList->pxIndex = pxItemToRemove->pxPrevious;
  28228. 802af00: bf08 it eq
  28229. 802af02: 605a streq r2, [r3, #4]
  28230. else
  28231. {
  28232. mtCOVERAGE_TEST_MARKER();
  28233. }
  28234. pxItemToRemove->pvContainer = NULL;
  28235. 802af04: 2200 movs r2, #0
  28236. 802af06: 6102 str r2, [r0, #16]
  28237. ( pxList->uxNumberOfItems )--;
  28238. 802af08: 6818 ldr r0, [r3, #0]
  28239. 802af0a: 3801 subs r0, #1
  28240. 802af0c: 6018 str r0, [r3, #0]
  28241. return pxList->uxNumberOfItems;
  28242. }
  28243. 802af0e: 4770 bx lr
  28244. 0802af10 <prvUnlockQueue>:
  28245. }
  28246. }
  28247. /*-----------------------------------------------------------*/
  28248. static void prvUnlockQueue( Queue_t * const pxQueue )
  28249. {
  28250. 802af10: b538 push {r3, r4, r5, lr}
  28251. 802af12: 4604 mov r4, r0
  28252. {
  28253. /* Tasks that are removed from the event list will get added to
  28254. the pending ready list as the scheduler is still suspended. */
  28255. if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE )
  28256. {
  28257. if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE )
  28258. 802af14: f104 0524 add.w r5, r4, #36 ; 0x24
  28259. /* The lock counts contains the number of extra data items placed or
  28260. removed from the queue while the queue was locked. When a queue is
  28261. locked items can be added or removed, but the event lists cannot be
  28262. updated. */
  28263. taskENTER_CRITICAL();
  28264. 802af18: f001 f83e bl 802bf98 <vPortEnterCritical>
  28265. {
  28266. /* See if data was added to the queue while it was locked. */
  28267. while( pxQueue->xTxLock > queueLOCKED_UNMODIFIED )
  28268. 802af1c: e00a b.n 802af34 <prvUnlockQueue+0x24>
  28269. }
  28270. #else /* configUSE_QUEUE_SETS */
  28271. {
  28272. /* Tasks that are removed from the event list will get added to
  28273. the pending ready list as the scheduler is still suspended. */
  28274. if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE )
  28275. 802af1e: 6a63 ldr r3, [r4, #36] ; 0x24
  28276. 802af20: b15b cbz r3, 802af3a <prvUnlockQueue+0x2a>
  28277. {
  28278. if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE )
  28279. 802af22: 4628 mov r0, r5
  28280. 802af24: f000 fece bl 802bcc4 <xTaskRemoveFromEventList>
  28281. 802af28: b108 cbz r0, 802af2e <prvUnlockQueue+0x1e>
  28282. {
  28283. /* The task waiting has a higher priority so record that a
  28284. context switch is required. */
  28285. vTaskMissedYield();
  28286. 802af2a: f000 ff45 bl 802bdb8 <vTaskMissedYield>
  28287. break;
  28288. }
  28289. }
  28290. #endif /* configUSE_QUEUE_SETS */
  28291. --( pxQueue->xTxLock );
  28292. 802af2e: 6ca3 ldr r3, [r4, #72] ; 0x48
  28293. 802af30: 3b01 subs r3, #1
  28294. 802af32: 64a3 str r3, [r4, #72] ; 0x48
  28295. locked items can be added or removed, but the event lists cannot be
  28296. updated. */
  28297. taskENTER_CRITICAL();
  28298. {
  28299. /* See if data was added to the queue while it was locked. */
  28300. while( pxQueue->xTxLock > queueLOCKED_UNMODIFIED )
  28301. 802af34: 6ca3 ldr r3, [r4, #72] ; 0x48
  28302. 802af36: 2b00 cmp r3, #0
  28303. 802af38: dcf1 bgt.n 802af1e <prvUnlockQueue+0xe>
  28304. #endif /* configUSE_QUEUE_SETS */
  28305. --( pxQueue->xTxLock );
  28306. }
  28307. pxQueue->xTxLock = queueUNLOCKED;
  28308. 802af3a: f04f 33ff mov.w r3, #4294967295
  28309. 802af3e: 64a3 str r3, [r4, #72] ; 0x48
  28310. }
  28311. taskEXIT_CRITICAL();
  28312. 802af40: f001 f856 bl 802bff0 <vPortExitCritical>
  28313. {
  28314. while( pxQueue->xRxLock > queueLOCKED_UNMODIFIED )
  28315. {
  28316. if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE )
  28317. {
  28318. if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE )
  28319. 802af44: f104 0510 add.w r5, r4, #16
  28320. pxQueue->xTxLock = queueUNLOCKED;
  28321. }
  28322. taskEXIT_CRITICAL();
  28323. /* Do the same for the Rx lock. */
  28324. taskENTER_CRITICAL();
  28325. 802af48: f001 f826 bl 802bf98 <vPortEnterCritical>
  28326. {
  28327. while( pxQueue->xRxLock > queueLOCKED_UNMODIFIED )
  28328. 802af4c: e00a b.n 802af64 <prvUnlockQueue+0x54>
  28329. {
  28330. if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE )
  28331. 802af4e: 6923 ldr r3, [r4, #16]
  28332. 802af50: b15b cbz r3, 802af6a <prvUnlockQueue+0x5a>
  28333. {
  28334. if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE )
  28335. 802af52: 4628 mov r0, r5
  28336. 802af54: f000 feb6 bl 802bcc4 <xTaskRemoveFromEventList>
  28337. 802af58: b108 cbz r0, 802af5e <prvUnlockQueue+0x4e>
  28338. {
  28339. vTaskMissedYield();
  28340. 802af5a: f000 ff2d bl 802bdb8 <vTaskMissedYield>
  28341. else
  28342. {
  28343. mtCOVERAGE_TEST_MARKER();
  28344. }
  28345. --( pxQueue->xRxLock );
  28346. 802af5e: 6c63 ldr r3, [r4, #68] ; 0x44
  28347. 802af60: 3b01 subs r3, #1
  28348. 802af62: 6463 str r3, [r4, #68] ; 0x44
  28349. taskEXIT_CRITICAL();
  28350. /* Do the same for the Rx lock. */
  28351. taskENTER_CRITICAL();
  28352. {
  28353. while( pxQueue->xRxLock > queueLOCKED_UNMODIFIED )
  28354. 802af64: 6c63 ldr r3, [r4, #68] ; 0x44
  28355. 802af66: 2b00 cmp r3, #0
  28356. 802af68: dcf1 bgt.n 802af4e <prvUnlockQueue+0x3e>
  28357. {
  28358. break;
  28359. }
  28360. }
  28361. pxQueue->xRxLock = queueUNLOCKED;
  28362. 802af6a: f04f 33ff mov.w r3, #4294967295
  28363. 802af6e: 6463 str r3, [r4, #68] ; 0x44
  28364. }
  28365. taskEXIT_CRITICAL();
  28366. }
  28367. 802af70: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr}
  28368. }
  28369. }
  28370. pxQueue->xRxLock = queueUNLOCKED;
  28371. }
  28372. taskEXIT_CRITICAL();
  28373. 802af74: f001 b83c b.w 802bff0 <vPortExitCritical>
  28374. 0802af78 <prvCopyDataFromQueue>:
  28375. }
  28376. /*-----------------------------------------------------------*/
  28377. static void prvCopyDataFromQueue( Queue_t * const pxQueue, void * const pvBuffer )
  28378. {
  28379. if( pxQueue->uxItemSize != ( UBaseType_t ) 0 )
  28380. 802af78: 6c02 ldr r2, [r0, #64] ; 0x40
  28381. return xReturn;
  28382. }
  28383. /*-----------------------------------------------------------*/
  28384. static void prvCopyDataFromQueue( Queue_t * const pxQueue, void * const pvBuffer )
  28385. {
  28386. 802af7a: b530 push {r4, r5, lr}
  28387. 802af7c: 4603 mov r3, r0
  28388. if( pxQueue->uxItemSize != ( UBaseType_t ) 0 )
  28389. 802af7e: b16a cbz r2, 802af9c <prvCopyDataFromQueue+0x24>
  28390. {
  28391. pxQueue->u.pcReadFrom += pxQueue->uxItemSize;
  28392. 802af80: 68c4 ldr r4, [r0, #12]
  28393. if( pxQueue->u.pcReadFrom >= pxQueue->pcTail ) /*lint !e946 MISRA exception justified as use of the relational operator is the cleanest solutions. */
  28394. 802af82: 6845 ldr r5, [r0, #4]
  28395. static void prvCopyDataFromQueue( Queue_t * const pxQueue, void * const pvBuffer )
  28396. {
  28397. if( pxQueue->uxItemSize != ( UBaseType_t ) 0 )
  28398. {
  28399. pxQueue->u.pcReadFrom += pxQueue->uxItemSize;
  28400. 802af84: 18a4 adds r4, r4, r2
  28401. if( pxQueue->u.pcReadFrom >= pxQueue->pcTail ) /*lint !e946 MISRA exception justified as use of the relational operator is the cleanest solutions. */
  28402. 802af86: 42ac cmp r4, r5
  28403. static void prvCopyDataFromQueue( Queue_t * const pxQueue, void * const pvBuffer )
  28404. {
  28405. if( pxQueue->uxItemSize != ( UBaseType_t ) 0 )
  28406. {
  28407. pxQueue->u.pcReadFrom += pxQueue->uxItemSize;
  28408. 802af88: 60c4 str r4, [r0, #12]
  28409. if( pxQueue->u.pcReadFrom >= pxQueue->pcTail ) /*lint !e946 MISRA exception justified as use of the relational operator is the cleanest solutions. */
  28410. {
  28411. pxQueue->u.pcReadFrom = pxQueue->pcHead;
  28412. 802af8a: bf24 itt cs
  28413. 802af8c: 6804 ldrcs r4, [r0, #0]
  28414. 802af8e: 60c4 strcs r4, [r0, #12]
  28415. }
  28416. else
  28417. {
  28418. mtCOVERAGE_TEST_MARKER();
  28419. }
  28420. ( 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. */
  28421. 802af90: 4608 mov r0, r1
  28422. 802af92: 68d9 ldr r1, [r3, #12]
  28423. }
  28424. }
  28425. 802af94: e8bd 4030 ldmia.w sp!, {r4, r5, lr}
  28426. }
  28427. else
  28428. {
  28429. mtCOVERAGE_TEST_MARKER();
  28430. }
  28431. ( 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. */
  28432. 802af98: f7f6 be84 b.w 8021ca4 <memcpy>
  28433. 802af9c: bd30 pop {r4, r5, pc}
  28434. 0802af9e <prvCopyDataToQueue>:
  28435. #endif /* configUSE_TRACE_FACILITY */
  28436. /*-----------------------------------------------------------*/
  28437. static BaseType_t prvCopyDataToQueue( Queue_t * const pxQueue, const void *pvItemToQueue, const BaseType_t xPosition )
  28438. {
  28439. 802af9e: b538 push {r3, r4, r5, lr}
  28440. 802afa0: 4615 mov r5, r2
  28441. BaseType_t xReturn = pdFALSE;
  28442. if( pxQueue->uxItemSize == ( UBaseType_t ) 0 )
  28443. 802afa2: 6c02 ldr r2, [r0, #64] ; 0x40
  28444. #endif /* configUSE_TRACE_FACILITY */
  28445. /*-----------------------------------------------------------*/
  28446. static BaseType_t prvCopyDataToQueue( Queue_t * const pxQueue, const void *pvItemToQueue, const BaseType_t xPosition )
  28447. {
  28448. 802afa4: 4604 mov r4, r0
  28449. BaseType_t xReturn = pdFALSE;
  28450. if( pxQueue->uxItemSize == ( UBaseType_t ) 0 )
  28451. 802afa6: b93a cbnz r2, 802afb8 <prvCopyDataToQueue+0x1a>
  28452. {
  28453. #if ( configUSE_MUTEXES == 1 )
  28454. {
  28455. if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX )
  28456. 802afa8: 6805 ldr r5, [r0, #0]
  28457. 802afaa: b105 cbz r5, 802afae <prvCopyDataToQueue+0x10>
  28458. 802afac: e028 b.n 802b000 <prvCopyDataToQueue+0x62>
  28459. {
  28460. /* The mutex is no longer being held. */
  28461. xReturn = xTaskPriorityDisinherit( ( void * ) pxQueue->pxMutexHolder );
  28462. 802afae: 6840 ldr r0, [r0, #4]
  28463. 802afb0: f000 ff64 bl 802be7c <xTaskPriorityDisinherit>
  28464. pxQueue->pxMutexHolder = NULL;
  28465. 802afb4: 6065 str r5, [r4, #4]
  28466. 802afb6: e024 b.n 802b002 <prvCopyDataToQueue+0x64>
  28467. mtCOVERAGE_TEST_MARKER();
  28468. }
  28469. }
  28470. #endif /* configUSE_MUTEXES */
  28471. }
  28472. else if( xPosition == queueSEND_TO_BACK )
  28473. 802afb8: b96d cbnz r5, 802afd6 <prvCopyDataToQueue+0x38>
  28474. {
  28475. ( 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. */
  28476. 802afba: 6880 ldr r0, [r0, #8]
  28477. 802afbc: f7f6 fe72 bl 8021ca4 <memcpy>
  28478. pxQueue->pcWriteTo += pxQueue->uxItemSize;
  28479. 802afc0: 68a2 ldr r2, [r4, #8]
  28480. 802afc2: 6c23 ldr r3, [r4, #64] ; 0x40
  28481. 802afc4: 18d3 adds r3, r2, r3
  28482. if( pxQueue->pcWriteTo >= pxQueue->pcTail ) /*lint !e946 MISRA exception justified as comparison of pointers is the cleanest solution. */
  28483. 802afc6: 6862 ldr r2, [r4, #4]
  28484. #endif /* configUSE_MUTEXES */
  28485. }
  28486. else if( xPosition == queueSEND_TO_BACK )
  28487. {
  28488. ( 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. */
  28489. pxQueue->pcWriteTo += pxQueue->uxItemSize;
  28490. 802afc8: 60a3 str r3, [r4, #8]
  28491. if( pxQueue->pcWriteTo >= pxQueue->pcTail ) /*lint !e946 MISRA exception justified as comparison of pointers is the cleanest solution. */
  28492. 802afca: 4293 cmp r3, r2
  28493. 802afcc: d318 bcc.n 802b000 <prvCopyDataToQueue+0x62>
  28494. {
  28495. pxQueue->pcWriteTo = pxQueue->pcHead;
  28496. 802afce: 6823 ldr r3, [r4, #0]
  28497. #endif /* configUSE_TRACE_FACILITY */
  28498. /*-----------------------------------------------------------*/
  28499. static BaseType_t prvCopyDataToQueue( Queue_t * const pxQueue, const void *pvItemToQueue, const BaseType_t xPosition )
  28500. {
  28501. BaseType_t xReturn = pdFALSE;
  28502. 802afd0: 4628 mov r0, r5
  28503. {
  28504. ( 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. */
  28505. pxQueue->pcWriteTo += pxQueue->uxItemSize;
  28506. if( pxQueue->pcWriteTo >= pxQueue->pcTail ) /*lint !e946 MISRA exception justified as comparison of pointers is the cleanest solution. */
  28507. {
  28508. pxQueue->pcWriteTo = pxQueue->pcHead;
  28509. 802afd2: 60a3 str r3, [r4, #8]
  28510. 802afd4: e015 b.n 802b002 <prvCopyDataToQueue+0x64>
  28511. mtCOVERAGE_TEST_MARKER();
  28512. }
  28513. }
  28514. else
  28515. {
  28516. ( void ) memcpy( ( void * ) pxQueue->u.pcReadFrom, pvItemToQueue, ( size_t ) pxQueue->uxItemSize ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */
  28517. 802afd6: 68c0 ldr r0, [r0, #12]
  28518. 802afd8: f7f6 fe64 bl 8021ca4 <memcpy>
  28519. pxQueue->u.pcReadFrom -= pxQueue->uxItemSize;
  28520. 802afdc: 6c23 ldr r3, [r4, #64] ; 0x40
  28521. 802afde: 68e2 ldr r2, [r4, #12]
  28522. if( pxQueue->u.pcReadFrom < pxQueue->pcHead ) /*lint !e946 MISRA exception justified as comparison of pointers is the cleanest solution. */
  28523. 802afe0: 6821 ldr r1, [r4, #0]
  28524. }
  28525. }
  28526. else
  28527. {
  28528. ( void ) memcpy( ( void * ) pxQueue->u.pcReadFrom, pvItemToQueue, ( size_t ) pxQueue->uxItemSize ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */
  28529. pxQueue->u.pcReadFrom -= pxQueue->uxItemSize;
  28530. 802afe2: 425b negs r3, r3
  28531. 802afe4: 18d2 adds r2, r2, r3
  28532. if( pxQueue->u.pcReadFrom < pxQueue->pcHead ) /*lint !e946 MISRA exception justified as comparison of pointers is the cleanest solution. */
  28533. 802afe6: 428a cmp r2, r1
  28534. }
  28535. }
  28536. else
  28537. {
  28538. ( void ) memcpy( ( void * ) pxQueue->u.pcReadFrom, pvItemToQueue, ( size_t ) pxQueue->uxItemSize ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */
  28539. pxQueue->u.pcReadFrom -= pxQueue->uxItemSize;
  28540. 802afe8: 60e2 str r2, [r4, #12]
  28541. if( pxQueue->u.pcReadFrom < pxQueue->pcHead ) /*lint !e946 MISRA exception justified as comparison of pointers is the cleanest solution. */
  28542. 802afea: d202 bcs.n 802aff2 <prvCopyDataToQueue+0x54>
  28543. {
  28544. pxQueue->u.pcReadFrom = ( pxQueue->pcTail - pxQueue->uxItemSize );
  28545. 802afec: 6862 ldr r2, [r4, #4]
  28546. 802afee: 18d3 adds r3, r2, r3
  28547. 802aff0: 60e3 str r3, [r4, #12]
  28548. else
  28549. {
  28550. mtCOVERAGE_TEST_MARKER();
  28551. }
  28552. if( xPosition == queueOVERWRITE )
  28553. 802aff2: 2d02 cmp r5, #2
  28554. 802aff4: d104 bne.n 802b000 <prvCopyDataToQueue+0x62>
  28555. {
  28556. if( pxQueue->uxMessagesWaiting > ( UBaseType_t ) 0 )
  28557. 802aff6: 6ba3 ldr r3, [r4, #56] ; 0x38
  28558. 802aff8: b113 cbz r3, 802b000 <prvCopyDataToQueue+0x62>
  28559. {
  28560. /* An item is not being added but overwritten, so subtract
  28561. one from the recorded number of items in the queue so when
  28562. one is added again below the number of recorded items remains
  28563. correct. */
  28564. --( pxQueue->uxMessagesWaiting );
  28565. 802affa: 6ba3 ldr r3, [r4, #56] ; 0x38
  28566. 802affc: 3b01 subs r3, #1
  28567. 802affe: 63a3 str r3, [r4, #56] ; 0x38
  28568. #endif /* configUSE_TRACE_FACILITY */
  28569. /*-----------------------------------------------------------*/
  28570. static BaseType_t prvCopyDataToQueue( Queue_t * const pxQueue, const void *pvItemToQueue, const BaseType_t xPosition )
  28571. {
  28572. BaseType_t xReturn = pdFALSE;
  28573. 802b000: 2000 movs r0, #0
  28574. {
  28575. mtCOVERAGE_TEST_MARKER();
  28576. }
  28577. }
  28578. ++( pxQueue->uxMessagesWaiting );
  28579. 802b002: 6ba3 ldr r3, [r4, #56] ; 0x38
  28580. 802b004: 3301 adds r3, #1
  28581. 802b006: 63a3 str r3, [r4, #56] ; 0x38
  28582. return xReturn;
  28583. }
  28584. 802b008: bd38 pop {r3, r4, r5, pc}
  28585. 0802b00a <xQueueGenericReset>:
  28586. } \
  28587. taskEXIT_CRITICAL()
  28588. /*-----------------------------------------------------------*/
  28589. BaseType_t xQueueGenericReset( QueueHandle_t xQueue, BaseType_t xNewQueue )
  28590. {
  28591. 802b00a: b538 push {r3, r4, r5, lr}
  28592. 802b00c: 460d mov r5, r1
  28593. Queue_t * const pxQueue = ( Queue_t * ) xQueue;
  28594. configASSERT( pxQueue );
  28595. 802b00e: 4604 mov r4, r0
  28596. 802b010: b910 cbnz r0, 802b018 <xQueueGenericReset+0xe>
  28597. 802b012: f000 ffb9 bl 802bf88 <ulPortSetInterruptMask>
  28598. 802b016: e7fe b.n 802b016 <xQueueGenericReset+0xc>
  28599. taskENTER_CRITICAL();
  28600. 802b018: f000 ffbe bl 802bf98 <vPortEnterCritical>
  28601. {
  28602. pxQueue->pcTail = pxQueue->pcHead + ( pxQueue->uxLength * pxQueue->uxItemSize );
  28603. 802b01c: 6823 ldr r3, [r4, #0]
  28604. 802b01e: 6be0 ldr r0, [r4, #60] ; 0x3c
  28605. 802b020: 6c22 ldr r2, [r4, #64] ; 0x40
  28606. pxQueue->uxMessagesWaiting = ( UBaseType_t ) 0U;
  28607. pxQueue->pcWriteTo = pxQueue->pcHead;
  28608. 802b022: 60a3 str r3, [r4, #8]
  28609. configASSERT( pxQueue );
  28610. taskENTER_CRITICAL();
  28611. {
  28612. pxQueue->pcTail = pxQueue->pcHead + ( pxQueue->uxLength * pxQueue->uxItemSize );
  28613. 802b024: fb00 3102 mla r1, r0, r2, r3
  28614. pxQueue->uxMessagesWaiting = ( UBaseType_t ) 0U;
  28615. pxQueue->pcWriteTo = pxQueue->pcHead;
  28616. pxQueue->u.pcReadFrom = pxQueue->pcHead + ( ( pxQueue->uxLength - ( UBaseType_t ) 1U ) * pxQueue->uxItemSize );
  28617. 802b028: 3801 subs r0, #1
  28618. 802b02a: fb02 3300 mla r3, r2, r0, r3
  28619. configASSERT( pxQueue );
  28620. taskENTER_CRITICAL();
  28621. {
  28622. pxQueue->pcTail = pxQueue->pcHead + ( pxQueue->uxLength * pxQueue->uxItemSize );
  28623. 802b02e: 6061 str r1, [r4, #4]
  28624. pxQueue->uxMessagesWaiting = ( UBaseType_t ) 0U;
  28625. pxQueue->pcWriteTo = pxQueue->pcHead;
  28626. pxQueue->u.pcReadFrom = pxQueue->pcHead + ( ( pxQueue->uxLength - ( UBaseType_t ) 1U ) * pxQueue->uxItemSize );
  28627. 802b030: 60e3 str r3, [r4, #12]
  28628. configASSERT( pxQueue );
  28629. taskENTER_CRITICAL();
  28630. {
  28631. pxQueue->pcTail = pxQueue->pcHead + ( pxQueue->uxLength * pxQueue->uxItemSize );
  28632. pxQueue->uxMessagesWaiting = ( UBaseType_t ) 0U;
  28633. 802b032: 2100 movs r1, #0
  28634. pxQueue->pcWriteTo = pxQueue->pcHead;
  28635. pxQueue->u.pcReadFrom = pxQueue->pcHead + ( ( pxQueue->uxLength - ( UBaseType_t ) 1U ) * pxQueue->uxItemSize );
  28636. pxQueue->xRxLock = queueUNLOCKED;
  28637. 802b034: f04f 33ff mov.w r3, #4294967295
  28638. configASSERT( pxQueue );
  28639. taskENTER_CRITICAL();
  28640. {
  28641. pxQueue->pcTail = pxQueue->pcHead + ( pxQueue->uxLength * pxQueue->uxItemSize );
  28642. pxQueue->uxMessagesWaiting = ( UBaseType_t ) 0U;
  28643. 802b038: 63a1 str r1, [r4, #56] ; 0x38
  28644. pxQueue->pcWriteTo = pxQueue->pcHead;
  28645. pxQueue->u.pcReadFrom = pxQueue->pcHead + ( ( pxQueue->uxLength - ( UBaseType_t ) 1U ) * pxQueue->uxItemSize );
  28646. pxQueue->xRxLock = queueUNLOCKED;
  28647. 802b03a: 6463 str r3, [r4, #68] ; 0x44
  28648. pxQueue->xTxLock = queueUNLOCKED;
  28649. 802b03c: 64a3 str r3, [r4, #72] ; 0x48
  28650. if( xNewQueue == pdFALSE )
  28651. 802b03e: b955 cbnz r5, 802b056 <xQueueGenericReset+0x4c>
  28652. /* If there are tasks blocked waiting to read from the queue, then
  28653. the tasks will remain blocked as after this function exits the queue
  28654. will still be empty. If there are tasks blocked waiting to write to
  28655. the queue, then one should be unblocked as after this function exits
  28656. it will be possible to write to it. */
  28657. if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE )
  28658. 802b040: 6923 ldr r3, [r4, #16]
  28659. 802b042: b183 cbz r3, 802b066 <xQueueGenericReset+0x5c>
  28660. {
  28661. if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) == pdTRUE )
  28662. 802b044: f104 0010 add.w r0, r4, #16
  28663. 802b048: f000 fe3c bl 802bcc4 <xTaskRemoveFromEventList>
  28664. 802b04c: 2801 cmp r0, #1
  28665. 802b04e: d10a bne.n 802b066 <xQueueGenericReset+0x5c>
  28666. {
  28667. queueYIELD_IF_USING_PREEMPTION();
  28668. 802b050: f000 ff8e bl 802bf70 <vPortYield>
  28669. 802b054: e007 b.n 802b066 <xQueueGenericReset+0x5c>
  28670. }
  28671. }
  28672. else
  28673. {
  28674. /* Ensure the event queues start in the correct state. */
  28675. vListInitialise( &( pxQueue->xTasksWaitingToSend ) );
  28676. 802b056: f104 0010 add.w r0, r4, #16
  28677. 802b05a: f7ff ff17 bl 802ae8c <vListInitialise>
  28678. vListInitialise( &( pxQueue->xTasksWaitingToReceive ) );
  28679. 802b05e: f104 0024 add.w r0, r4, #36 ; 0x24
  28680. 802b062: f7ff ff13 bl 802ae8c <vListInitialise>
  28681. }
  28682. }
  28683. taskEXIT_CRITICAL();
  28684. 802b066: f000 ffc3 bl 802bff0 <vPortExitCritical>
  28685. /* A value is returned for calling semantic consistency with previous
  28686. versions. */
  28687. return pdPASS;
  28688. }
  28689. 802b06a: 2001 movs r0, #1
  28690. 802b06c: bd38 pop {r3, r4, r5, pc}
  28691. 0802b06e <xQueueGenericCreate>:
  28692. /*-----------------------------------------------------------*/
  28693. QueueHandle_t xQueueGenericCreate( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, const uint8_t ucQueueType )
  28694. {
  28695. 802b06e: b5f8 push {r3, r4, r5, r6, r7, lr}
  28696. 802b070: 460d mov r5, r1
  28697. 802b072: 4617 mov r7, r2
  28698. /* Remove compiler warnings about unused parameters should
  28699. configUSE_TRACE_FACILITY not be set to 1. */
  28700. ( void ) ucQueueType;
  28701. configASSERT( uxQueueLength > ( UBaseType_t ) 0 );
  28702. 802b074: 4606 mov r6, r0
  28703. 802b076: b910 cbnz r0, 802b07e <xQueueGenericCreate+0x10>
  28704. 802b078: f000 ff86 bl 802bf88 <ulPortSetInterruptMask>
  28705. 802b07c: e7fe b.n 802b07c <xQueueGenericCreate+0xe>
  28706. if( uxItemSize == ( UBaseType_t ) 0 )
  28707. 802b07e: b111 cbz r1, 802b086 <xQueueGenericCreate+0x18>
  28708. }
  28709. else
  28710. {
  28711. /* The queue is one byte longer than asked for to make wrap checking
  28712. easier/faster. */
  28713. xQueueSizeInBytes = ( size_t ) ( uxQueueLength * uxItemSize ) + ( size_t ) 1; /*lint !e961 MISRA exception as the casts are only redundant for some ports. */
  28714. 802b080: 4348 muls r0, r1
  28715. 802b082: 3001 adds r0, #1
  28716. 802b084: e000 b.n 802b088 <xQueueGenericCreate+0x1a>
  28717. configASSERT( uxQueueLength > ( UBaseType_t ) 0 );
  28718. if( uxItemSize == ( UBaseType_t ) 0 )
  28719. {
  28720. /* There is not going to be a queue storage area. */
  28721. xQueueSizeInBytes = ( size_t ) 0;
  28722. 802b086: 4608 mov r0, r1
  28723. easier/faster. */
  28724. xQueueSizeInBytes = ( size_t ) ( uxQueueLength * uxItemSize ) + ( size_t ) 1; /*lint !e961 MISRA exception as the casts are only redundant for some ports. */
  28725. }
  28726. /* Allocate the new queue structure and storage area. */
  28727. pcAllocatedBuffer = ( int8_t * ) pvPortMalloc( sizeof( Queue_t ) + xQueueSizeInBytes );
  28728. 802b088: 3054 adds r0, #84 ; 0x54
  28729. 802b08a: f001 f893 bl 802c1b4 <pvPortMalloc>
  28730. if( pcAllocatedBuffer != NULL )
  28731. 802b08e: 4604 mov r4, r0
  28732. 802b090: b138 cbz r0, 802b0a2 <xQueueGenericCreate+0x34>
  28733. {
  28734. pxNewQueue = ( Queue_t * ) pcAllocatedBuffer; /*lint !e826 MISRA The buffer cannot be to small because it was dimensioned by sizeof( Queue_t ) + xQueueSizeInBytes. */
  28735. if( uxItemSize == ( UBaseType_t ) 0 )
  28736. 802b092: b90d cbnz r5, 802b098 <xQueueGenericCreate+0x2a>
  28737. {
  28738. /* No RAM was allocated for the queue storage area, but PC head
  28739. cannot be set to NULL because NULL is used as a key to say the queue
  28740. is used as a mutex. Therefore just set pcHead to point to the queue
  28741. as a benign value that is known to be within the memory map. */
  28742. pxNewQueue->pcHead = ( int8_t * ) pxNewQueue;
  28743. 802b094: 6020 str r0, [r4, #0]
  28744. 802b096: e007 b.n 802b0a8 <xQueueGenericCreate+0x3a>
  28745. }
  28746. else
  28747. {
  28748. /* Jump past the queue structure to find the location of the queue
  28749. storage area - adding the padding bytes to get a better alignment. */
  28750. pxNewQueue->pcHead = pcAllocatedBuffer + sizeof( Queue_t );
  28751. 802b098: f100 0354 add.w r3, r0, #84 ; 0x54
  28752. 802b09c: 6003 str r3, [r0, #0]
  28753. 802b09e: e003 b.n 802b0a8 <xQueueGenericCreate+0x3a>
  28754. 802b0a0: e7fe b.n 802b0a0 <xQueueGenericCreate+0x32>
  28755. else
  28756. {
  28757. mtCOVERAGE_TEST_MARKER();
  28758. }
  28759. configASSERT( xReturn );
  28760. 802b0a2: f000 ff71 bl 802bf88 <ulPortSetInterruptMask>
  28761. 802b0a6: e7fb b.n 802b0a0 <xQueueGenericCreate+0x32>
  28762. pxNewQueue->pcHead = pcAllocatedBuffer + sizeof( Queue_t );
  28763. }
  28764. /* Initialise the queue members as described above where the queue type
  28765. is defined. */
  28766. pxNewQueue->uxLength = uxQueueLength;
  28767. 802b0a8: 63e6 str r6, [r4, #60] ; 0x3c
  28768. pxNewQueue->uxItemSize = uxItemSize;
  28769. 802b0aa: 6425 str r5, [r4, #64] ; 0x40
  28770. ( void ) xQueueGenericReset( pxNewQueue, pdTRUE );
  28771. 802b0ac: 4620 mov r0, r4
  28772. 802b0ae: 2101 movs r1, #1
  28773. 802b0b0: f7ff ffab bl 802b00a <xQueueGenericReset>
  28774. #if ( configUSE_TRACE_FACILITY == 1 )
  28775. {
  28776. pxNewQueue->ucQueueType = ucQueueType;
  28777. 802b0b4: f884 7050 strb.w r7, [r4, #80] ; 0x50
  28778. }
  28779. configASSERT( xReturn );
  28780. return xReturn;
  28781. }
  28782. 802b0b8: 4620 mov r0, r4
  28783. 802b0ba: bdf8 pop {r3, r4, r5, r6, r7, pc}
  28784. 0802b0bc <xQueueCreateCountingSemaphore>:
  28785. /*-----------------------------------------------------------*/
  28786. #if ( configUSE_COUNTING_SEMAPHORES == 1 )
  28787. QueueHandle_t xQueueCreateCountingSemaphore( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount )
  28788. {
  28789. 802b0bc: b510 push {r4, lr}
  28790. 802b0be: 460c mov r4, r1
  28791. QueueHandle_t xHandle;
  28792. configASSERT( uxMaxCount != 0 );
  28793. 802b0c0: b910 cbnz r0, 802b0c8 <xQueueCreateCountingSemaphore+0xc>
  28794. 802b0c2: f000 ff61 bl 802bf88 <ulPortSetInterruptMask>
  28795. 802b0c6: e7fe b.n 802b0c6 <xQueueCreateCountingSemaphore+0xa>
  28796. configASSERT( uxInitialCount <= uxMaxCount );
  28797. 802b0c8: 4281 cmp r1, r0
  28798. 802b0ca: d902 bls.n 802b0d2 <xQueueCreateCountingSemaphore+0x16>
  28799. 802b0cc: f000 ff5c bl 802bf88 <ulPortSetInterruptMask>
  28800. 802b0d0: e7fe b.n 802b0d0 <xQueueCreateCountingSemaphore+0x14>
  28801. xHandle = xQueueGenericCreate( uxMaxCount, queueSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_COUNTING_SEMAPHORE );
  28802. 802b0d2: 2100 movs r1, #0
  28803. 802b0d4: 2202 movs r2, #2
  28804. 802b0d6: f7ff ffca bl 802b06e <xQueueGenericCreate>
  28805. if( xHandle != NULL )
  28806. 802b0da: b110 cbz r0, 802b0e2 <xQueueCreateCountingSemaphore+0x26>
  28807. {
  28808. ( ( Queue_t * ) xHandle )->uxMessagesWaiting = uxInitialCount;
  28809. 802b0dc: 6384 str r4, [r0, #56] ; 0x38
  28810. 802b0de: bd10 pop {r4, pc}
  28811. 802b0e0: e7fe b.n 802b0e0 <xQueueCreateCountingSemaphore+0x24>
  28812. else
  28813. {
  28814. traceCREATE_COUNTING_SEMAPHORE_FAILED();
  28815. }
  28816. configASSERT( xHandle );
  28817. 802b0e2: f000 ff51 bl 802bf88 <ulPortSetInterruptMask>
  28818. 802b0e6: e7fb b.n 802b0e0 <xQueueCreateCountingSemaphore+0x24>
  28819. 0802b0e8 <xQueueGenericSend>:
  28820. #endif /* configUSE_COUNTING_SEMAPHORES */
  28821. /*-----------------------------------------------------------*/
  28822. BaseType_t xQueueGenericSend( QueueHandle_t xQueue, const void * const pvItemToQueue, TickType_t xTicksToWait, const BaseType_t xCopyPosition )
  28823. {
  28824. 802b0e8: e92d 43f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, lr}
  28825. 802b0ec: b085 sub sp, #20
  28826. 802b0ee: 460f mov r7, r1
  28827. 802b0f0: 9201 str r2, [sp, #4]
  28828. 802b0f2: 461d mov r5, r3
  28829. BaseType_t xEntryTimeSet = pdFALSE, xYieldRequired;
  28830. TimeOut_t xTimeOut;
  28831. Queue_t * const pxQueue = ( Queue_t * ) xQueue;
  28832. configASSERT( pxQueue );
  28833. 802b0f4: 4604 mov r4, r0
  28834. 802b0f6: b910 cbnz r0, 802b0fe <xQueueGenericSend+0x16>
  28835. 802b0f8: f000 ff46 bl 802bf88 <ulPortSetInterruptMask>
  28836. 802b0fc: e7fe b.n 802b0fc <xQueueGenericSend+0x14>
  28837. configASSERT( !( ( pvItemToQueue == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) );
  28838. 802b0fe: 2900 cmp r1, #0
  28839. 802b100: d17b bne.n 802b1fa <xQueueGenericSend+0x112>
  28840. 802b102: 6c03 ldr r3, [r0, #64] ; 0x40
  28841. 802b104: 2b00 cmp r3, #0
  28842. 802b106: d078 beq.n 802b1fa <xQueueGenericSend+0x112>
  28843. 802b108: e074 b.n 802b1f4 <xQueueGenericSend+0x10c>
  28844. 802b10a: e7fe b.n 802b10a <xQueueGenericSend+0x22>
  28845. configASSERT( !( ( xCopyPosition == queueOVERWRITE ) && ( pxQueue->uxLength != 1 ) ) );
  28846. 802b10c: 6be3 ldr r3, [r4, #60] ; 0x3c
  28847. 802b10e: 2b01 cmp r3, #1
  28848. 802b110: d176 bne.n 802b200 <xQueueGenericSend+0x118>
  28849. 802b112: e078 b.n 802b206 <xQueueGenericSend+0x11e>
  28850. 802b114: e7fe b.n 802b114 <xQueueGenericSend+0x2c>
  28851. #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) )
  28852. {
  28853. configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) );
  28854. 802b116: 9e01 ldr r6, [sp, #4]
  28855. 802b118: b126 cbz r6, 802b124 <xQueueGenericSend+0x3c>
  28856. 802b11a: e079 b.n 802b210 <xQueueGenericSend+0x128>
  28857. 802b11c: e7fe b.n 802b11c <xQueueGenericSend+0x34>
  28858. 802b11e: 2601 movs r6, #1
  28859. 802b120: e002 b.n 802b128 <xQueueGenericSend+0x40>
  28860. 802b122: 2600 movs r6, #0
  28861. /* Interrupts and other tasks can send to and receive from the queue
  28862. now the critical section has been exited. */
  28863. vTaskSuspendAll();
  28864. prvLockQueue( pxQueue );
  28865. 802b124: f04f 0800 mov.w r8, #0
  28866. /* This function relaxes the coding standard somewhat to allow return
  28867. statements within the function itself. This is done in the interest
  28868. of execution time efficiency. */
  28869. for( ;; )
  28870. {
  28871. taskENTER_CRITICAL();
  28872. 802b128: f000 ff36 bl 802bf98 <vPortEnterCritical>
  28873. {
  28874. /* Is there room on the queue now? The running task must be
  28875. the highest priority task wanting to access the queue. If
  28876. the head item in the queue is to be overwritten then it does
  28877. not matter if the queue is full. */
  28878. if( ( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) || ( xCopyPosition == queueOVERWRITE ) )
  28879. 802b12c: 6ba2 ldr r2, [r4, #56] ; 0x38
  28880. 802b12e: 6be3 ldr r3, [r4, #60] ; 0x3c
  28881. 802b130: 429a cmp r2, r3
  28882. 802b132: d301 bcc.n 802b138 <xQueueGenericSend+0x50>
  28883. 802b134: 2d02 cmp r5, #2
  28884. 802b136: d115 bne.n 802b164 <xQueueGenericSend+0x7c>
  28885. {
  28886. traceQUEUE_SEND( pxQueue );
  28887. xYieldRequired = prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition );
  28888. 802b138: 4620 mov r0, r4
  28889. 802b13a: 4639 mov r1, r7
  28890. 802b13c: 462a mov r2, r5
  28891. 802b13e: f7ff ff2e bl 802af9e <prvCopyDataToQueue>
  28892. }
  28893. #else /* configUSE_QUEUE_SETS */
  28894. {
  28895. /* If there was a task waiting for data to arrive on the
  28896. queue then unblock it now. */
  28897. if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE )
  28898. 802b142: 6a63 ldr r3, [r4, #36] ; 0x24
  28899. 802b144: b143 cbz r3, 802b158 <xQueueGenericSend+0x70>
  28900. {
  28901. if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) == pdTRUE )
  28902. 802b146: f104 0024 add.w r0, r4, #36 ; 0x24
  28903. 802b14a: f000 fdbb bl 802bcc4 <xTaskRemoveFromEventList>
  28904. 802b14e: 2801 cmp r0, #1
  28905. 802b150: d104 bne.n 802b15c <xQueueGenericSend+0x74>
  28906. {
  28907. /* The unblocked task has a priority higher than
  28908. our own so yield immediately. Yes it is ok to do
  28909. this from within the critical section - the kernel
  28910. takes care of that. */
  28911. queueYIELD_IF_USING_PREEMPTION();
  28912. 802b152: f000 ff0d bl 802bf70 <vPortYield>
  28913. 802b156: e001 b.n 802b15c <xQueueGenericSend+0x74>
  28914. else
  28915. {
  28916. mtCOVERAGE_TEST_MARKER();
  28917. }
  28918. }
  28919. else if( xYieldRequired != pdFALSE )
  28920. 802b158: 2800 cmp r0, #0
  28921. 802b15a: d1fa bne.n 802b152 <xQueueGenericSend+0x6a>
  28922. mtCOVERAGE_TEST_MARKER();
  28923. }
  28924. }
  28925. #endif /* configUSE_QUEUE_SETS */
  28926. taskEXIT_CRITICAL();
  28927. 802b15c: f000 ff48 bl 802bff0 <vPortExitCritical>
  28928. return pdPASS;
  28929. 802b160: 2001 movs r0, #1
  28930. 802b162: e058 b.n 802b216 <xQueueGenericSend+0x12e>
  28931. }
  28932. else
  28933. {
  28934. if( xTicksToWait == ( TickType_t ) 0 )
  28935. 802b164: f8dd 9004 ldr.w r9, [sp, #4]
  28936. 802b168: f1b9 0f00 cmp.w r9, #0
  28937. 802b16c: d102 bne.n 802b174 <xQueueGenericSend+0x8c>
  28938. {
  28939. /* The queue was full and no block time is specified (or
  28940. the block time has expired) so leave now. */
  28941. taskEXIT_CRITICAL();
  28942. 802b16e: f000 ff3f bl 802bff0 <vPortExitCritical>
  28943. 802b172: e03d b.n 802b1f0 <xQueueGenericSend+0x108>
  28944. /* Return to the original privilege level before exiting
  28945. the function. */
  28946. traceQUEUE_SEND_FAILED( pxQueue );
  28947. return errQUEUE_FULL;
  28948. }
  28949. else if( xEntryTimeSet == pdFALSE )
  28950. 802b174: b916 cbnz r6, 802b17c <xQueueGenericSend+0x94>
  28951. {
  28952. /* The queue was full and a block time was specified so
  28953. configure the timeout structure. */
  28954. vTaskSetTimeOutState( &xTimeOut );
  28955. 802b176: a802 add r0, sp, #8
  28956. 802b178: f000 fde0 bl 802bd3c <vTaskSetTimeOutState>
  28957. /* Entry time was already set. */
  28958. mtCOVERAGE_TEST_MARKER();
  28959. }
  28960. }
  28961. }
  28962. taskEXIT_CRITICAL();
  28963. 802b17c: f000 ff38 bl 802bff0 <vPortExitCritical>
  28964. /* Interrupts and other tasks can send to and receive from the queue
  28965. now the critical section has been exited. */
  28966. vTaskSuspendAll();
  28967. 802b180: f000 fb5c bl 802b83c <vTaskSuspendAll>
  28968. prvLockQueue( pxQueue );
  28969. 802b184: f000 ff08 bl 802bf98 <vPortEnterCritical>
  28970. 802b188: 6c63 ldr r3, [r4, #68] ; 0x44
  28971. 802b18a: 3301 adds r3, #1
  28972. 802b18c: bf08 it eq
  28973. 802b18e: f8c4 8044 streq.w r8, [r4, #68] ; 0x44
  28974. 802b192: 6ca3 ldr r3, [r4, #72] ; 0x48
  28975. 802b194: 3301 adds r3, #1
  28976. 802b196: bf08 it eq
  28977. 802b198: f8c4 8048 streq.w r8, [r4, #72] ; 0x48
  28978. 802b19c: f000 ff28 bl 802bff0 <vPortExitCritical>
  28979. /* Update the timeout state to see if it has expired yet. */
  28980. if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE )
  28981. 802b1a0: a802 add r0, sp, #8
  28982. 802b1a2: a901 add r1, sp, #4
  28983. 802b1a4: f000 fdda bl 802bd5c <xTaskCheckForTimeOut>
  28984. 802b1a8: b9e8 cbnz r0, 802b1e6 <xQueueGenericSend+0xfe>
  28985. static BaseType_t prvIsQueueFull( const Queue_t *pxQueue )
  28986. {
  28987. BaseType_t xReturn;
  28988. taskENTER_CRITICAL();
  28989. 802b1aa: f000 fef5 bl 802bf98 <vPortEnterCritical>
  28990. {
  28991. if( pxQueue->uxMessagesWaiting == pxQueue->uxLength )
  28992. 802b1ae: f8d4 9038 ldr.w r9, [r4, #56] ; 0x38
  28993. 802b1b2: 6be6 ldr r6, [r4, #60] ; 0x3c
  28994. else
  28995. {
  28996. xReturn = pdFALSE;
  28997. }
  28998. }
  28999. taskEXIT_CRITICAL();
  29000. 802b1b4: f000 ff1c bl 802bff0 <vPortExitCritical>
  29001. prvLockQueue( pxQueue );
  29002. /* Update the timeout state to see if it has expired yet. */
  29003. if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE )
  29004. {
  29005. if( prvIsQueueFull( pxQueue ) != pdFALSE )
  29006. 802b1b8: 45b1 cmp r9, r6
  29007. 802b1ba: d10e bne.n 802b1da <xQueueGenericSend+0xf2>
  29008. {
  29009. traceBLOCKING_ON_QUEUE_SEND( pxQueue );
  29010. vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToSend ), xTicksToWait );
  29011. 802b1bc: f104 0010 add.w r0, r4, #16
  29012. 802b1c0: 9901 ldr r1, [sp, #4]
  29013. 802b1c2: f000 fd23 bl 802bc0c <vTaskPlaceOnEventList>
  29014. /* Unlocking the queue means queue events can effect the
  29015. event list. It is possible that interrupts occurring now
  29016. remove this task from the event list again - but as the
  29017. scheduler is suspended the task will go onto the pending
  29018. ready last instead of the actual ready list. */
  29019. prvUnlockQueue( pxQueue );
  29020. 802b1c6: 4620 mov r0, r4
  29021. 802b1c8: f7ff fea2 bl 802af10 <prvUnlockQueue>
  29022. /* Resuming the scheduler will move tasks from the pending
  29023. ready list into the ready list - so it is feasible that this
  29024. task is already in a ready list before it yields - in which
  29025. case the yield will not cause a context switch unless there
  29026. is also a higher priority task in the pending ready list. */
  29027. if( xTaskResumeAll() == pdFALSE )
  29028. 802b1cc: f000 fbd2 bl 802b974 <xTaskResumeAll>
  29029. 802b1d0: 2800 cmp r0, #0
  29030. 802b1d2: d1a4 bne.n 802b11e <xQueueGenericSend+0x36>
  29031. {
  29032. portYIELD_WITHIN_API();
  29033. 802b1d4: f000 fecc bl 802bf70 <vPortYield>
  29034. 802b1d8: e7a1 b.n 802b11e <xQueueGenericSend+0x36>
  29035. }
  29036. }
  29037. else
  29038. {
  29039. /* Try again. */
  29040. prvUnlockQueue( pxQueue );
  29041. 802b1da: 4620 mov r0, r4
  29042. 802b1dc: f7ff fe98 bl 802af10 <prvUnlockQueue>
  29043. ( void ) xTaskResumeAll();
  29044. 802b1e0: f000 fbc8 bl 802b974 <xTaskResumeAll>
  29045. 802b1e4: e79b b.n 802b11e <xQueueGenericSend+0x36>
  29046. }
  29047. }
  29048. else
  29049. {
  29050. /* The timeout has expired. */
  29051. prvUnlockQueue( pxQueue );
  29052. 802b1e6: 4620 mov r0, r4
  29053. 802b1e8: f7ff fe92 bl 802af10 <prvUnlockQueue>
  29054. ( void ) xTaskResumeAll();
  29055. 802b1ec: f000 fbc2 bl 802b974 <xTaskResumeAll>
  29056. /* Return to the original privilege level before exiting the
  29057. function. */
  29058. traceQUEUE_SEND_FAILED( pxQueue );
  29059. return errQUEUE_FULL;
  29060. 802b1f0: 2000 movs r0, #0
  29061. 802b1f2: e010 b.n 802b216 <xQueueGenericSend+0x12e>
  29062. BaseType_t xEntryTimeSet = pdFALSE, xYieldRequired;
  29063. TimeOut_t xTimeOut;
  29064. Queue_t * const pxQueue = ( Queue_t * ) xQueue;
  29065. configASSERT( pxQueue );
  29066. configASSERT( !( ( pvItemToQueue == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) );
  29067. 802b1f4: f000 fec8 bl 802bf88 <ulPortSetInterruptMask>
  29068. 802b1f8: e787 b.n 802b10a <xQueueGenericSend+0x22>
  29069. configASSERT( !( ( xCopyPosition == queueOVERWRITE ) && ( pxQueue->uxLength != 1 ) ) );
  29070. 802b1fa: 2d02 cmp r5, #2
  29071. 802b1fc: d103 bne.n 802b206 <xQueueGenericSend+0x11e>
  29072. 802b1fe: e785 b.n 802b10c <xQueueGenericSend+0x24>
  29073. 802b200: f000 fec2 bl 802bf88 <ulPortSetInterruptMask>
  29074. 802b204: e786 b.n 802b114 <xQueueGenericSend+0x2c>
  29075. #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) )
  29076. {
  29077. configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) );
  29078. 802b206: f000 fddd bl 802bdc4 <xTaskGetSchedulerState>
  29079. 802b20a: 2800 cmp r0, #0
  29080. 802b20c: d189 bne.n 802b122 <xQueueGenericSend+0x3a>
  29081. 802b20e: e782 b.n 802b116 <xQueueGenericSend+0x2e>
  29082. 802b210: f000 feba bl 802bf88 <ulPortSetInterruptMask>
  29083. 802b214: e782 b.n 802b11c <xQueueGenericSend+0x34>
  29084. function. */
  29085. traceQUEUE_SEND_FAILED( pxQueue );
  29086. return errQUEUE_FULL;
  29087. }
  29088. }
  29089. }
  29090. 802b216: b005 add sp, #20
  29091. 802b218: e8bd 83f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, pc}
  29092. 0802b21c <xQueueCreateMutex>:
  29093. /*-----------------------------------------------------------*/
  29094. #if ( configUSE_MUTEXES == 1 )
  29095. QueueHandle_t xQueueCreateMutex( const uint8_t ucQueueType )
  29096. {
  29097. 802b21c: b570 push {r4, r5, r6, lr}
  29098. 802b21e: 4606 mov r6, r0
  29099. /* Prevent compiler warnings about unused parameters if
  29100. configUSE_TRACE_FACILITY does not equal 1. */
  29101. ( void ) ucQueueType;
  29102. /* Allocate the new queue structure. */
  29103. pxNewQueue = ( Queue_t * ) pvPortMalloc( sizeof( Queue_t ) );
  29104. 802b220: 2054 movs r0, #84 ; 0x54
  29105. 802b222: f000 ffc7 bl 802c1b4 <pvPortMalloc>
  29106. if( pxNewQueue != NULL )
  29107. 802b226: 4604 mov r4, r0
  29108. 802b228: b108 cbz r0, 802b22e <xQueueCreateMutex+0x12>
  29109. 802b22a: e003 b.n 802b234 <xQueueCreateMutex+0x18>
  29110. 802b22c: e7fe b.n 802b22c <xQueueCreateMutex+0x10>
  29111. else
  29112. {
  29113. traceCREATE_MUTEX_FAILED();
  29114. }
  29115. configASSERT( pxNewQueue );
  29116. 802b22e: f000 feab bl 802bf88 <ulPortSetInterruptMask>
  29117. 802b232: e7fb b.n 802b22c <xQueueCreateMutex+0x10>
  29118. /* Each mutex has a length of 1 (like a binary semaphore) and
  29119. an item size of 0 as nothing is actually copied into or out
  29120. of the mutex. */
  29121. pxNewQueue->uxMessagesWaiting = ( UBaseType_t ) 0U;
  29122. pxNewQueue->uxLength = ( UBaseType_t ) 1U;
  29123. 802b234: 2301 movs r3, #1
  29124. /* Allocate the new queue structure. */
  29125. pxNewQueue = ( Queue_t * ) pvPortMalloc( sizeof( Queue_t ) );
  29126. if( pxNewQueue != NULL )
  29127. {
  29128. /* Information required for priority inheritance. */
  29129. pxNewQueue->pxMutexHolder = NULL;
  29130. 802b236: 2500 movs r5, #0
  29131. /* Each mutex has a length of 1 (like a binary semaphore) and
  29132. an item size of 0 as nothing is actually copied into or out
  29133. of the mutex. */
  29134. pxNewQueue->uxMessagesWaiting = ( UBaseType_t ) 0U;
  29135. pxNewQueue->uxLength = ( UBaseType_t ) 1U;
  29136. 802b238: 63c3 str r3, [r0, #60] ; 0x3c
  29137. pxNewQueue->uxItemSize = ( UBaseType_t ) 0U;
  29138. pxNewQueue->xRxLock = queueUNLOCKED;
  29139. 802b23a: f04f 33ff mov.w r3, #4294967295
  29140. pxNewQueue->u.pcReadFrom = NULL;
  29141. /* Each mutex has a length of 1 (like a binary semaphore) and
  29142. an item size of 0 as nothing is actually copied into or out
  29143. of the mutex. */
  29144. pxNewQueue->uxMessagesWaiting = ( UBaseType_t ) 0U;
  29145. 802b23e: 6385 str r5, [r0, #56] ; 0x38
  29146. /* Allocate the new queue structure. */
  29147. pxNewQueue = ( Queue_t * ) pvPortMalloc( sizeof( Queue_t ) );
  29148. if( pxNewQueue != NULL )
  29149. {
  29150. /* Information required for priority inheritance. */
  29151. pxNewQueue->pxMutexHolder = NULL;
  29152. 802b240: 6045 str r5, [r0, #4]
  29153. an item size of 0 as nothing is actually copied into or out
  29154. of the mutex. */
  29155. pxNewQueue->uxMessagesWaiting = ( UBaseType_t ) 0U;
  29156. pxNewQueue->uxLength = ( UBaseType_t ) 1U;
  29157. pxNewQueue->uxItemSize = ( UBaseType_t ) 0U;
  29158. pxNewQueue->xRxLock = queueUNLOCKED;
  29159. 802b242: 6443 str r3, [r0, #68] ; 0x44
  29160. pxNewQueue = ( Queue_t * ) pvPortMalloc( sizeof( Queue_t ) );
  29161. if( pxNewQueue != NULL )
  29162. {
  29163. /* Information required for priority inheritance. */
  29164. pxNewQueue->pxMutexHolder = NULL;
  29165. pxNewQueue->uxQueueType = queueQUEUE_IS_MUTEX;
  29166. 802b244: 6005 str r5, [r0, #0]
  29167. of the mutex. */
  29168. pxNewQueue->uxMessagesWaiting = ( UBaseType_t ) 0U;
  29169. pxNewQueue->uxLength = ( UBaseType_t ) 1U;
  29170. pxNewQueue->uxItemSize = ( UBaseType_t ) 0U;
  29171. pxNewQueue->xRxLock = queueUNLOCKED;
  29172. pxNewQueue->xTxLock = queueUNLOCKED;
  29173. 802b246: 6483 str r3, [r0, #72] ; 0x48
  29174. pxNewQueue->pxMutexHolder = NULL;
  29175. pxNewQueue->uxQueueType = queueQUEUE_IS_MUTEX;
  29176. /* Queues used as a mutex no data is actually copied into or out
  29177. of the queue. */
  29178. pxNewQueue->pcWriteTo = NULL;
  29179. 802b248: 6085 str r5, [r0, #8]
  29180. pxNewQueue->u.pcReadFrom = NULL;
  29181. 802b24a: 60c5 str r5, [r0, #12]
  29182. /* Each mutex has a length of 1 (like a binary semaphore) and
  29183. an item size of 0 as nothing is actually copied into or out
  29184. of the mutex. */
  29185. pxNewQueue->uxMessagesWaiting = ( UBaseType_t ) 0U;
  29186. pxNewQueue->uxLength = ( UBaseType_t ) 1U;
  29187. pxNewQueue->uxItemSize = ( UBaseType_t ) 0U;
  29188. 802b24c: 6405 str r5, [r0, #64] ; 0x40
  29189. pxNewQueue->xRxLock = queueUNLOCKED;
  29190. pxNewQueue->xTxLock = queueUNLOCKED;
  29191. #if ( configUSE_TRACE_FACILITY == 1 )
  29192. {
  29193. pxNewQueue->ucQueueType = ucQueueType;
  29194. 802b24e: f880 6050 strb.w r6, [r0, #80] ; 0x50
  29195. pxNewQueue->pxQueueSetContainer = NULL;
  29196. }
  29197. #endif
  29198. /* Ensure the event queues start with the correct state. */
  29199. vListInitialise( &( pxNewQueue->xTasksWaitingToSend ) );
  29200. 802b252: 3010 adds r0, #16
  29201. 802b254: f7ff fe1a bl 802ae8c <vListInitialise>
  29202. vListInitialise( &( pxNewQueue->xTasksWaitingToReceive ) );
  29203. 802b258: f104 0024 add.w r0, r4, #36 ; 0x24
  29204. 802b25c: f7ff fe16 bl 802ae8c <vListInitialise>
  29205. traceCREATE_MUTEX( pxNewQueue );
  29206. /* Start with the semaphore in the expected state. */
  29207. ( void ) xQueueGenericSend( pxNewQueue, NULL, ( TickType_t ) 0U, queueSEND_TO_BACK );
  29208. 802b260: 4620 mov r0, r4
  29209. 802b262: 4629 mov r1, r5
  29210. 802b264: 462a mov r2, r5
  29211. 802b266: 462b mov r3, r5
  29212. 802b268: f7ff ff3e bl 802b0e8 <xQueueGenericSend>
  29213. traceCREATE_MUTEX_FAILED();
  29214. }
  29215. configASSERT( pxNewQueue );
  29216. return pxNewQueue;
  29217. }
  29218. 802b26c: 4620 mov r0, r4
  29219. 802b26e: bd70 pop {r4, r5, r6, pc}
  29220. 0802b270 <xQueueGenericSendFromISR>:
  29221. #endif /* configUSE_ALTERNATIVE_API */
  29222. /*-----------------------------------------------------------*/
  29223. BaseType_t xQueueGenericSendFromISR( QueueHandle_t xQueue, const void * const pvItemToQueue, BaseType_t * const pxHigherPriorityTaskWoken, const BaseType_t xCopyPosition )
  29224. {
  29225. 802b270: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  29226. 802b274: 460f mov r7, r1
  29227. 802b276: 4616 mov r6, r2
  29228. 802b278: 461d mov r5, r3
  29229. BaseType_t xReturn;
  29230. UBaseType_t uxSavedInterruptStatus;
  29231. Queue_t * const pxQueue = ( Queue_t * ) xQueue;
  29232. configASSERT( pxQueue );
  29233. 802b27a: 4604 mov r4, r0
  29234. 802b27c: b910 cbnz r0, 802b284 <xQueueGenericSendFromISR+0x14>
  29235. 802b27e: f000 fe83 bl 802bf88 <ulPortSetInterruptMask>
  29236. 802b282: e7fe b.n 802b282 <xQueueGenericSendFromISR+0x12>
  29237. configASSERT( !( ( pvItemToQueue == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) );
  29238. 802b284: bb41 cbnz r1, 802b2d8 <xQueueGenericSendFromISR+0x68>
  29239. 802b286: 6c03 ldr r3, [r0, #64] ; 0x40
  29240. 802b288: b333 cbz r3, 802b2d8 <xQueueGenericSendFromISR+0x68>
  29241. 802b28a: e022 b.n 802b2d2 <xQueueGenericSendFromISR+0x62>
  29242. 802b28c: e7fe b.n 802b28c <xQueueGenericSendFromISR+0x1c>
  29243. configASSERT( !( ( xCopyPosition == queueOVERWRITE ) && ( pxQueue->uxLength != 1 ) ) );
  29244. 802b28e: 6be3 ldr r3, [r4, #60] ; 0x3c
  29245. 802b290: 2b01 cmp r3, #1
  29246. 802b292: d124 bne.n 802b2de <xQueueGenericSendFromISR+0x6e>
  29247. 802b294: e026 b.n 802b2e4 <xQueueGenericSendFromISR+0x74>
  29248. 802b296: e7fe b.n 802b296 <xQueueGenericSendFromISR+0x26>
  29249. read, instead return a flag to say whether a context switch is required or
  29250. not (i.e. has a task with a higher priority than us been woken by this
  29251. post). */
  29252. uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR();
  29253. {
  29254. if( ( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) || ( xCopyPosition == queueOVERWRITE ) )
  29255. 802b298: 2d02 cmp r5, #2
  29256. 802b29a: d118 bne.n 802b2ce <xQueueGenericSendFromISR+0x5e>
  29257. /* A task can only have an inherited priority if it is a mutex
  29258. holder - and if there is a mutex holder then the mutex cannot be
  29259. given from an ISR. Therefore, unlike the xQueueGenericGive()
  29260. function, there is no need to determine the need for priority
  29261. disinheritance here or to clear the mutex holder TCB member. */
  29262. ( void ) prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition );
  29263. 802b29c: 4620 mov r0, r4
  29264. 802b29e: 4639 mov r1, r7
  29265. 802b2a0: 462a mov r2, r5
  29266. 802b2a2: f7ff fe7c bl 802af9e <prvCopyDataToQueue>
  29267. /* The event list is not altered if the queue is locked. This will
  29268. be done when the queue is unlocked later. */
  29269. if( pxQueue->xTxLock == queueUNLOCKED )
  29270. 802b2a6: 6ca3 ldr r3, [r4, #72] ; 0x48
  29271. 802b2a8: 3301 adds r3, #1
  29272. 802b2aa: d10b bne.n 802b2c4 <xQueueGenericSendFromISR+0x54>
  29273. }
  29274. }
  29275. }
  29276. #else /* configUSE_QUEUE_SETS */
  29277. {
  29278. if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE )
  29279. 802b2ac: 6a63 ldr r3, [r4, #36] ; 0x24
  29280. 802b2ae: b903 cbnz r3, 802b2b2 <xQueueGenericSendFromISR+0x42>
  29281. 802b2b0: e00b b.n 802b2ca <xQueueGenericSendFromISR+0x5a>
  29282. {
  29283. if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE )
  29284. 802b2b2: f104 0024 add.w r0, r4, #36 ; 0x24
  29285. 802b2b6: f000 fd05 bl 802bcc4 <xTaskRemoveFromEventList>
  29286. 802b2ba: b130 cbz r0, 802b2ca <xQueueGenericSendFromISR+0x5a>
  29287. {
  29288. /* The task waiting has a higher priority so record that a
  29289. context switch is required. */
  29290. if( pxHigherPriorityTaskWoken != NULL )
  29291. 802b2bc: b12e cbz r6, 802b2ca <xQueueGenericSendFromISR+0x5a>
  29292. {
  29293. *pxHigherPriorityTaskWoken = pdTRUE;
  29294. 802b2be: 2401 movs r4, #1
  29295. 802b2c0: 6034 str r4, [r6, #0]
  29296. 802b2c2: e019 b.n 802b2f8 <xQueueGenericSendFromISR+0x88>
  29297. }
  29298. else
  29299. {
  29300. /* Increment the lock count so the task that unlocks the queue
  29301. knows that data was posted while it was locked. */
  29302. ++( pxQueue->xTxLock );
  29303. 802b2c4: 6ca3 ldr r3, [r4, #72] ; 0x48
  29304. 802b2c6: 3301 adds r3, #1
  29305. 802b2c8: 64a3 str r3, [r4, #72] ; 0x48
  29306. }
  29307. xReturn = pdPASS;
  29308. 802b2ca: 2401 movs r4, #1
  29309. 802b2cc: e014 b.n 802b2f8 <xQueueGenericSendFromISR+0x88>
  29310. }
  29311. else
  29312. {
  29313. traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue );
  29314. xReturn = errQUEUE_FULL;
  29315. 802b2ce: 2400 movs r4, #0
  29316. 802b2d0: e012 b.n 802b2f8 <xQueueGenericSendFromISR+0x88>
  29317. BaseType_t xReturn;
  29318. UBaseType_t uxSavedInterruptStatus;
  29319. Queue_t * const pxQueue = ( Queue_t * ) xQueue;
  29320. configASSERT( pxQueue );
  29321. configASSERT( !( ( pvItemToQueue == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) );
  29322. 802b2d2: f000 fe59 bl 802bf88 <ulPortSetInterruptMask>
  29323. 802b2d6: e7d9 b.n 802b28c <xQueueGenericSendFromISR+0x1c>
  29324. configASSERT( !( ( xCopyPosition == queueOVERWRITE ) && ( pxQueue->uxLength != 1 ) ) );
  29325. 802b2d8: 2d02 cmp r5, #2
  29326. 802b2da: d103 bne.n 802b2e4 <xQueueGenericSendFromISR+0x74>
  29327. 802b2dc: e7d7 b.n 802b28e <xQueueGenericSendFromISR+0x1e>
  29328. 802b2de: f000 fe53 bl 802bf88 <ulPortSetInterruptMask>
  29329. 802b2e2: e7d8 b.n 802b296 <xQueueGenericSendFromISR+0x26>
  29330. that have been assigned a priority at or (logically) below the maximum
  29331. system call interrupt priority. FreeRTOS maintains a separate interrupt
  29332. safe API to ensure interrupt entry is as fast and as simple as possible.
  29333. More information (albeit Cortex-M specific) is provided on the following
  29334. link: http://www.freertos.org/RTOS-Cortex-M3-M4.html */
  29335. portASSERT_IF_INTERRUPT_PRIORITY_INVALID();
  29336. 802b2e4: f000 ff20 bl 802c128 <vPortValidateInterruptPriority>
  29337. /* Similar to xQueueGenericSend, except without blocking if there is no room
  29338. in the queue. Also don't directly wake a task that was blocked on a queue
  29339. read, instead return a flag to say whether a context switch is required or
  29340. not (i.e. has a task with a higher priority than us been woken by this
  29341. post). */
  29342. uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR();
  29343. 802b2e8: f000 fe4e bl 802bf88 <ulPortSetInterruptMask>
  29344. {
  29345. if( ( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) || ( xCopyPosition == queueOVERWRITE ) )
  29346. 802b2ec: 6ba2 ldr r2, [r4, #56] ; 0x38
  29347. 802b2ee: 6be3 ldr r3, [r4, #60] ; 0x3c
  29348. 802b2f0: 429a cmp r2, r3
  29349. /* Similar to xQueueGenericSend, except without blocking if there is no room
  29350. in the queue. Also don't directly wake a task that was blocked on a queue
  29351. read, instead return a flag to say whether a context switch is required or
  29352. not (i.e. has a task with a higher priority than us been woken by this
  29353. post). */
  29354. uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR();
  29355. 802b2f2: 4680 mov r8, r0
  29356. {
  29357. if( ( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) || ( xCopyPosition == queueOVERWRITE ) )
  29358. 802b2f4: d2d0 bcs.n 802b298 <xQueueGenericSendFromISR+0x28>
  29359. 802b2f6: e7d1 b.n 802b29c <xQueueGenericSendFromISR+0x2c>
  29360. {
  29361. traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue );
  29362. xReturn = errQUEUE_FULL;
  29363. }
  29364. }
  29365. portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus );
  29366. 802b2f8: 4640 mov r0, r8
  29367. 802b2fa: f000 fe75 bl 802bfe8 <vPortClearInterruptMask>
  29368. return xReturn;
  29369. }
  29370. 802b2fe: 4620 mov r0, r4
  29371. 802b300: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  29372. 0802b304 <xQueueGiveFromISR>:
  29373. /*-----------------------------------------------------------*/
  29374. BaseType_t xQueueGiveFromISR( QueueHandle_t xQueue, BaseType_t * const pxHigherPriorityTaskWoken )
  29375. {
  29376. 802b304: b5f8 push {r3, r4, r5, r6, r7, lr}
  29377. 802b306: 460d mov r5, r1
  29378. BaseType_t xReturn;
  29379. UBaseType_t uxSavedInterruptStatus;
  29380. Queue_t * const pxQueue = ( Queue_t * ) xQueue;
  29381. configASSERT( pxQueue );
  29382. 802b308: 4604 mov r4, r0
  29383. 802b30a: b910 cbnz r0, 802b312 <xQueueGiveFromISR+0xe>
  29384. 802b30c: f000 fe3c bl 802bf88 <ulPortSetInterruptMask>
  29385. 802b310: e7fe b.n 802b310 <xQueueGiveFromISR+0xc>
  29386. /* xQueueGenericSendFromISR() should be used in the item size is not 0. */
  29387. configASSERT( pxQueue->uxItemSize == 0 );
  29388. 802b312: 6c06 ldr r6, [r0, #64] ; 0x40
  29389. 802b314: b116 cbz r6, 802b31c <xQueueGiveFromISR+0x18>
  29390. 802b316: f000 fe37 bl 802bf88 <ulPortSetInterruptMask>
  29391. 802b31a: e7fe b.n 802b31a <xQueueGiveFromISR+0x16>
  29392. that have been assigned a priority at or (logically) below the maximum
  29393. system call interrupt priority. FreeRTOS maintains a separate interrupt
  29394. safe API to ensure interrupt entry is as fast and as simple as possible.
  29395. More information (albeit Cortex-M specific) is provided on the following
  29396. link: http://www.freertos.org/RTOS-Cortex-M3-M4.html */
  29397. portASSERT_IF_INTERRUPT_PRIORITY_INVALID();
  29398. 802b31c: f000 ff04 bl 802c128 <vPortValidateInterruptPriority>
  29399. /* Similar to xQueueGenericSendFromISR() but used with semaphores where the
  29400. item size is 0. Don't directly wake a task that was blocked on a queue
  29401. read, instead return a flag to say whether a context switch is required or
  29402. not (i.e. has a task with a higher priority than us been woken by this
  29403. post). */
  29404. uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR();
  29405. 802b320: f000 fe32 bl 802bf88 <ulPortSetInterruptMask>
  29406. {
  29407. /* When the queue is used to implement a semaphore no data is ever
  29408. moved through the queue but it is still valid to see if the queue 'has
  29409. space'. */
  29410. if( pxQueue->uxMessagesWaiting < pxQueue->uxLength )
  29411. 802b324: 6ba2 ldr r2, [r4, #56] ; 0x38
  29412. 802b326: 6be3 ldr r3, [r4, #60] ; 0x3c
  29413. 802b328: 429a cmp r2, r3
  29414. /* Similar to xQueueGenericSendFromISR() but used with semaphores where the
  29415. item size is 0. Don't directly wake a task that was blocked on a queue
  29416. read, instead return a flag to say whether a context switch is required or
  29417. not (i.e. has a task with a higher priority than us been woken by this
  29418. post). */
  29419. uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR();
  29420. 802b32a: 4607 mov r7, r0
  29421. {
  29422. /* When the queue is used to implement a semaphore no data is ever
  29423. moved through the queue but it is still valid to see if the queue 'has
  29424. space'. */
  29425. if( pxQueue->uxMessagesWaiting < pxQueue->uxLength )
  29426. 802b32c: d216 bcs.n 802b35c <xQueueGiveFromISR+0x58>
  29427. holder - and if there is a mutex holder then the mutex cannot be
  29428. given from an ISR. Therefore, unlike the xQueueGenericGive()
  29429. function, there is no need to determine the need for priority
  29430. disinheritance here or to clear the mutex holder TCB member. */
  29431. ++( pxQueue->uxMessagesWaiting );
  29432. 802b32e: 6ba3 ldr r3, [r4, #56] ; 0x38
  29433. 802b330: 3301 adds r3, #1
  29434. 802b332: 63a3 str r3, [r4, #56] ; 0x38
  29435. /* The event list is not altered if the queue is locked. This will
  29436. be done when the queue is unlocked later. */
  29437. if( pxQueue->xTxLock == queueUNLOCKED )
  29438. 802b334: 6ca3 ldr r3, [r4, #72] ; 0x48
  29439. 802b336: 3301 adds r3, #1
  29440. 802b338: d10b bne.n 802b352 <xQueueGiveFromISR+0x4e>
  29441. }
  29442. }
  29443. }
  29444. #else /* configUSE_QUEUE_SETS */
  29445. {
  29446. if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE )
  29447. 802b33a: 6a63 ldr r3, [r4, #36] ; 0x24
  29448. 802b33c: b903 cbnz r3, 802b340 <xQueueGiveFromISR+0x3c>
  29449. 802b33e: e00b b.n 802b358 <xQueueGiveFromISR+0x54>
  29450. {
  29451. if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE )
  29452. 802b340: f104 0024 add.w r0, r4, #36 ; 0x24
  29453. 802b344: f000 fcbe bl 802bcc4 <xTaskRemoveFromEventList>
  29454. 802b348: b130 cbz r0, 802b358 <xQueueGiveFromISR+0x54>
  29455. {
  29456. /* The task waiting has a higher priority so record that a
  29457. context switch is required. */
  29458. if( pxHigherPriorityTaskWoken != NULL )
  29459. 802b34a: b12d cbz r5, 802b358 <xQueueGiveFromISR+0x54>
  29460. {
  29461. *pxHigherPriorityTaskWoken = pdTRUE;
  29462. 802b34c: 2401 movs r4, #1
  29463. 802b34e: 602c str r4, [r5, #0]
  29464. 802b350: e005 b.n 802b35e <xQueueGiveFromISR+0x5a>
  29465. }
  29466. else
  29467. {
  29468. /* Increment the lock count so the task that unlocks the queue
  29469. knows that data was posted while it was locked. */
  29470. ++( pxQueue->xTxLock );
  29471. 802b352: 6ca3 ldr r3, [r4, #72] ; 0x48
  29472. 802b354: 3301 adds r3, #1
  29473. 802b356: 64a3 str r3, [r4, #72] ; 0x48
  29474. }
  29475. xReturn = pdPASS;
  29476. 802b358: 2401 movs r4, #1
  29477. 802b35a: e000 b.n 802b35e <xQueueGiveFromISR+0x5a>
  29478. }
  29479. else
  29480. {
  29481. traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue );
  29482. xReturn = errQUEUE_FULL;
  29483. 802b35c: 4634 mov r4, r6
  29484. }
  29485. }
  29486. portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus );
  29487. 802b35e: 4638 mov r0, r7
  29488. 802b360: f000 fe42 bl 802bfe8 <vPortClearInterruptMask>
  29489. return xReturn;
  29490. }
  29491. 802b364: 4620 mov r0, r4
  29492. 802b366: bdf8 pop {r3, r4, r5, r6, r7, pc}
  29493. 0802b368 <xQueueGenericReceive>:
  29494. /*-----------------------------------------------------------*/
  29495. BaseType_t xQueueGenericReceive( QueueHandle_t xQueue, void * const pvBuffer, TickType_t xTicksToWait, const BaseType_t xJustPeeking )
  29496. {
  29497. 802b368: e92d 43f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, lr}
  29498. 802b36c: b085 sub sp, #20
  29499. 802b36e: 460e mov r6, r1
  29500. 802b370: 9201 str r2, [sp, #4]
  29501. 802b372: 4699 mov r9, r3
  29502. BaseType_t xEntryTimeSet = pdFALSE;
  29503. TimeOut_t xTimeOut;
  29504. int8_t *pcOriginalReadPosition;
  29505. Queue_t * const pxQueue = ( Queue_t * ) xQueue;
  29506. configASSERT( pxQueue );
  29507. 802b374: 4604 mov r4, r0
  29508. 802b376: b910 cbnz r0, 802b37e <xQueueGenericReceive+0x16>
  29509. 802b378: f000 fe06 bl 802bf88 <ulPortSetInterruptMask>
  29510. 802b37c: e7fe b.n 802b37c <xQueueGenericReceive+0x14>
  29511. configASSERT( !( ( pvBuffer == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) );
  29512. 802b37e: 2900 cmp r1, #0
  29513. 802b380: f040 8089 bne.w 802b496 <xQueueGenericReceive+0x12e>
  29514. 802b384: 6c03 ldr r3, [r0, #64] ; 0x40
  29515. 802b386: 2b00 cmp r3, #0
  29516. 802b388: f000 8085 beq.w 802b496 <xQueueGenericReceive+0x12e>
  29517. 802b38c: e080 b.n 802b490 <xQueueGenericReceive+0x128>
  29518. 802b38e: e7fe b.n 802b38e <xQueueGenericReceive+0x26>
  29519. #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) )
  29520. {
  29521. configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) );
  29522. 802b390: 9d01 ldr r5, [sp, #4]
  29523. 802b392: b125 cbz r5, 802b39e <xQueueGenericReceive+0x36>
  29524. 802b394: e085 b.n 802b4a2 <xQueueGenericReceive+0x13a>
  29525. 802b396: e7fe b.n 802b396 <xQueueGenericReceive+0x2e>
  29526. 802b398: 2501 movs r5, #1
  29527. 802b39a: e001 b.n 802b3a0 <xQueueGenericReceive+0x38>
  29528. 802b39c: 2500 movs r5, #0
  29529. /* Interrupts and other tasks can send to and receive from the queue
  29530. now the critical section has been exited. */
  29531. vTaskSuspendAll();
  29532. prvLockQueue( pxQueue );
  29533. 802b39e: 2700 movs r7, #0
  29534. statements within the function itself. This is done in the interest
  29535. of execution time efficiency. */
  29536. for( ;; )
  29537. {
  29538. taskENTER_CRITICAL();
  29539. 802b3a0: f000 fdfa bl 802bf98 <vPortEnterCritical>
  29540. {
  29541. /* Is there data in the queue now? To be running the calling task
  29542. must be the highest priority task wanting to access the queue. */
  29543. if( pxQueue->uxMessagesWaiting > ( UBaseType_t ) 0 )
  29544. 802b3a4: 6ba3 ldr r3, [r4, #56] ; 0x38
  29545. 802b3a6: b33b cbz r3, 802b3f8 <xQueueGenericReceive+0x90>
  29546. {
  29547. /* Remember the read position in case the queue is only being
  29548. peeked. */
  29549. pcOriginalReadPosition = pxQueue->u.pcReadFrom;
  29550. prvCopyDataFromQueue( pxQueue, pvBuffer );
  29551. 802b3a8: 4620 mov r0, r4
  29552. 802b3aa: 4631 mov r1, r6
  29553. must be the highest priority task wanting to access the queue. */
  29554. if( pxQueue->uxMessagesWaiting > ( UBaseType_t ) 0 )
  29555. {
  29556. /* Remember the read position in case the queue is only being
  29557. peeked. */
  29558. pcOriginalReadPosition = pxQueue->u.pcReadFrom;
  29559. 802b3ac: 68e5 ldr r5, [r4, #12]
  29560. prvCopyDataFromQueue( pxQueue, pvBuffer );
  29561. 802b3ae: f7ff fde3 bl 802af78 <prvCopyDataFromQueue>
  29562. if( xJustPeeking == pdFALSE )
  29563. 802b3b2: f1b9 0f00 cmp.w r9, #0
  29564. 802b3b6: d112 bne.n 802b3de <xQueueGenericReceive+0x76>
  29565. {
  29566. traceQUEUE_RECEIVE( pxQueue );
  29567. /* Actually removing data, not just peeking. */
  29568. --( pxQueue->uxMessagesWaiting );
  29569. 802b3b8: 6ba3 ldr r3, [r4, #56] ; 0x38
  29570. 802b3ba: 3b01 subs r3, #1
  29571. 802b3bc: 63a3 str r3, [r4, #56] ; 0x38
  29572. #if ( configUSE_MUTEXES == 1 )
  29573. {
  29574. if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX )
  29575. 802b3be: 6823 ldr r3, [r4, #0]
  29576. 802b3c0: b913 cbnz r3, 802b3c8 <xQueueGenericReceive+0x60>
  29577. {
  29578. /* Record the information required to implement
  29579. priority inheritance should it become necessary. */
  29580. pxQueue->pxMutexHolder = ( int8_t * ) pvTaskIncrementMutexHeldCount(); /*lint !e961 Cast is not redundant as TaskHandle_t is a typedef. */
  29581. 802b3c2: f000 fd99 bl 802bef8 <pvTaskIncrementMutexHeldCount>
  29582. 802b3c6: 6060 str r0, [r4, #4]
  29583. mtCOVERAGE_TEST_MARKER();
  29584. }
  29585. }
  29586. #endif /* configUSE_MUTEXES */
  29587. if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE )
  29588. 802b3c8: 6923 ldr r3, [r4, #16]
  29589. 802b3ca: b18b cbz r3, 802b3f0 <xQueueGenericReceive+0x88>
  29590. {
  29591. if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) == pdTRUE )
  29592. 802b3cc: f104 0010 add.w r0, r4, #16
  29593. 802b3d0: f000 fc78 bl 802bcc4 <xTaskRemoveFromEventList>
  29594. 802b3d4: 2801 cmp r0, #1
  29595. 802b3d6: d10b bne.n 802b3f0 <xQueueGenericReceive+0x88>
  29596. {
  29597. queueYIELD_IF_USING_PREEMPTION();
  29598. 802b3d8: f000 fdca bl 802bf70 <vPortYield>
  29599. 802b3dc: e008 b.n 802b3f0 <xQueueGenericReceive+0x88>
  29600. pointer. */
  29601. pxQueue->u.pcReadFrom = pcOriginalReadPosition;
  29602. /* The data is being left in the queue, so see if there are
  29603. any other tasks waiting for the data. */
  29604. if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE )
  29605. 802b3de: 6a63 ldr r3, [r4, #36] ; 0x24
  29606. {
  29607. traceQUEUE_PEEK( pxQueue );
  29608. /* The data is not being removed, so reset the read
  29609. pointer. */
  29610. pxQueue->u.pcReadFrom = pcOriginalReadPosition;
  29611. 802b3e0: 60e5 str r5, [r4, #12]
  29612. /* The data is being left in the queue, so see if there are
  29613. any other tasks waiting for the data. */
  29614. if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE )
  29615. 802b3e2: b12b cbz r3, 802b3f0 <xQueueGenericReceive+0x88>
  29616. {
  29617. /* Tasks that are removed from the event list will get added to
  29618. the pending ready list as the scheduler is still suspended. */
  29619. if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE )
  29620. 802b3e4: f104 0024 add.w r0, r4, #36 ; 0x24
  29621. 802b3e8: f000 fc6c bl 802bcc4 <xTaskRemoveFromEventList>
  29622. 802b3ec: 2800 cmp r0, #0
  29623. 802b3ee: d1f3 bne.n 802b3d8 <xQueueGenericReceive+0x70>
  29624. {
  29625. mtCOVERAGE_TEST_MARKER();
  29626. }
  29627. }
  29628. taskEXIT_CRITICAL();
  29629. 802b3f0: f000 fdfe bl 802bff0 <vPortExitCritical>
  29630. return pdPASS;
  29631. 802b3f4: 2001 movs r0, #1
  29632. 802b3f6: e057 b.n 802b4a8 <xQueueGenericReceive+0x140>
  29633. }
  29634. else
  29635. {
  29636. if( xTicksToWait == ( TickType_t ) 0 )
  29637. 802b3f8: f8dd 8004 ldr.w r8, [sp, #4]
  29638. 802b3fc: f1b8 0f00 cmp.w r8, #0
  29639. 802b400: d102 bne.n 802b408 <xQueueGenericReceive+0xa0>
  29640. {
  29641. /* The queue was empty and no block time is specified (or
  29642. the block time has expired) so leave now. */
  29643. taskEXIT_CRITICAL();
  29644. 802b402: f000 fdf5 bl 802bff0 <vPortExitCritical>
  29645. 802b406: e041 b.n 802b48c <xQueueGenericReceive+0x124>
  29646. traceQUEUE_RECEIVE_FAILED( pxQueue );
  29647. return errQUEUE_EMPTY;
  29648. }
  29649. else if( xEntryTimeSet == pdFALSE )
  29650. 802b408: b915 cbnz r5, 802b410 <xQueueGenericReceive+0xa8>
  29651. {
  29652. /* The queue was empty and a block time was specified so
  29653. configure the timeout structure. */
  29654. vTaskSetTimeOutState( &xTimeOut );
  29655. 802b40a: a802 add r0, sp, #8
  29656. 802b40c: f000 fc96 bl 802bd3c <vTaskSetTimeOutState>
  29657. /* Entry time was already set. */
  29658. mtCOVERAGE_TEST_MARKER();
  29659. }
  29660. }
  29661. }
  29662. taskEXIT_CRITICAL();
  29663. 802b410: f000 fdee bl 802bff0 <vPortExitCritical>
  29664. /* Interrupts and other tasks can send to and receive from the queue
  29665. now the critical section has been exited. */
  29666. vTaskSuspendAll();
  29667. 802b414: f000 fa12 bl 802b83c <vTaskSuspendAll>
  29668. prvLockQueue( pxQueue );
  29669. 802b418: f000 fdbe bl 802bf98 <vPortEnterCritical>
  29670. 802b41c: 6c63 ldr r3, [r4, #68] ; 0x44
  29671. 802b41e: 3301 adds r3, #1
  29672. 802b420: bf08 it eq
  29673. 802b422: 6467 streq r7, [r4, #68] ; 0x44
  29674. 802b424: 6ca3 ldr r3, [r4, #72] ; 0x48
  29675. 802b426: 3301 adds r3, #1
  29676. 802b428: bf08 it eq
  29677. 802b42a: 64a7 streq r7, [r4, #72] ; 0x48
  29678. 802b42c: f000 fde0 bl 802bff0 <vPortExitCritical>
  29679. /* Update the timeout state to see if it has expired yet. */
  29680. if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE )
  29681. 802b430: a802 add r0, sp, #8
  29682. 802b432: a901 add r1, sp, #4
  29683. 802b434: f000 fc92 bl 802bd5c <xTaskCheckForTimeOut>
  29684. 802b438: bb18 cbnz r0, 802b482 <xQueueGenericReceive+0x11a>
  29685. static BaseType_t prvIsQueueEmpty( const Queue_t *pxQueue )
  29686. {
  29687. BaseType_t xReturn;
  29688. taskENTER_CRITICAL();
  29689. 802b43a: f000 fdad bl 802bf98 <vPortEnterCritical>
  29690. {
  29691. if( pxQueue->uxMessagesWaiting == ( UBaseType_t ) 0 )
  29692. 802b43e: 6ba5 ldr r5, [r4, #56] ; 0x38
  29693. else
  29694. {
  29695. xReturn = pdFALSE;
  29696. }
  29697. }
  29698. taskEXIT_CRITICAL();
  29699. 802b440: f000 fdd6 bl 802bff0 <vPortExitCritical>
  29700. prvLockQueue( pxQueue );
  29701. /* Update the timeout state to see if it has expired yet. */
  29702. if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE )
  29703. {
  29704. if( prvIsQueueEmpty( pxQueue ) != pdFALSE )
  29705. 802b444: b9bd cbnz r5, 802b476 <xQueueGenericReceive+0x10e>
  29706. {
  29707. traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue );
  29708. #if ( configUSE_MUTEXES == 1 )
  29709. {
  29710. if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX )
  29711. 802b446: 6823 ldr r3, [r4, #0]
  29712. 802b448: b933 cbnz r3, 802b458 <xQueueGenericReceive+0xf0>
  29713. {
  29714. taskENTER_CRITICAL();
  29715. 802b44a: f000 fda5 bl 802bf98 <vPortEnterCritical>
  29716. {
  29717. vTaskPriorityInherit( ( void * ) pxQueue->pxMutexHolder );
  29718. 802b44e: 6860 ldr r0, [r4, #4]
  29719. 802b450: f000 fcc8 bl 802bde4 <vTaskPriorityInherit>
  29720. }
  29721. taskEXIT_CRITICAL();
  29722. 802b454: f000 fdcc bl 802bff0 <vPortExitCritical>
  29723. mtCOVERAGE_TEST_MARKER();
  29724. }
  29725. }
  29726. #endif
  29727. vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait );
  29728. 802b458: f104 0024 add.w r0, r4, #36 ; 0x24
  29729. 802b45c: 9901 ldr r1, [sp, #4]
  29730. 802b45e: f000 fbd5 bl 802bc0c <vTaskPlaceOnEventList>
  29731. prvUnlockQueue( pxQueue );
  29732. 802b462: 4620 mov r0, r4
  29733. 802b464: f7ff fd54 bl 802af10 <prvUnlockQueue>
  29734. if( xTaskResumeAll() == pdFALSE )
  29735. 802b468: f000 fa84 bl 802b974 <xTaskResumeAll>
  29736. 802b46c: 2800 cmp r0, #0
  29737. 802b46e: d193 bne.n 802b398 <xQueueGenericReceive+0x30>
  29738. {
  29739. portYIELD_WITHIN_API();
  29740. 802b470: f000 fd7e bl 802bf70 <vPortYield>
  29741. 802b474: e790 b.n 802b398 <xQueueGenericReceive+0x30>
  29742. }
  29743. }
  29744. else
  29745. {
  29746. /* Try again. */
  29747. prvUnlockQueue( pxQueue );
  29748. 802b476: 4620 mov r0, r4
  29749. 802b478: f7ff fd4a bl 802af10 <prvUnlockQueue>
  29750. ( void ) xTaskResumeAll();
  29751. 802b47c: f000 fa7a bl 802b974 <xTaskResumeAll>
  29752. 802b480: e78a b.n 802b398 <xQueueGenericReceive+0x30>
  29753. }
  29754. }
  29755. else
  29756. {
  29757. prvUnlockQueue( pxQueue );
  29758. 802b482: 4620 mov r0, r4
  29759. 802b484: f7ff fd44 bl 802af10 <prvUnlockQueue>
  29760. ( void ) xTaskResumeAll();
  29761. 802b488: f000 fa74 bl 802b974 <xTaskResumeAll>
  29762. traceQUEUE_RECEIVE_FAILED( pxQueue );
  29763. return errQUEUE_EMPTY;
  29764. 802b48c: 2000 movs r0, #0
  29765. 802b48e: e00b b.n 802b4a8 <xQueueGenericReceive+0x140>
  29766. TimeOut_t xTimeOut;
  29767. int8_t *pcOriginalReadPosition;
  29768. Queue_t * const pxQueue = ( Queue_t * ) xQueue;
  29769. configASSERT( pxQueue );
  29770. configASSERT( !( ( pvBuffer == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) );
  29771. 802b490: f000 fd7a bl 802bf88 <ulPortSetInterruptMask>
  29772. 802b494: e77b b.n 802b38e <xQueueGenericReceive+0x26>
  29773. #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) )
  29774. {
  29775. configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) );
  29776. 802b496: f000 fc95 bl 802bdc4 <xTaskGetSchedulerState>
  29777. 802b49a: 2800 cmp r0, #0
  29778. 802b49c: f47f af7e bne.w 802b39c <xQueueGenericReceive+0x34>
  29779. 802b4a0: e776 b.n 802b390 <xQueueGenericReceive+0x28>
  29780. 802b4a2: f000 fd71 bl 802bf88 <ulPortSetInterruptMask>
  29781. 802b4a6: e776 b.n 802b396 <xQueueGenericReceive+0x2e>
  29782. ( void ) xTaskResumeAll();
  29783. traceQUEUE_RECEIVE_FAILED( pxQueue );
  29784. return errQUEUE_EMPTY;
  29785. }
  29786. }
  29787. }
  29788. 802b4a8: b005 add sp, #20
  29789. 802b4aa: e8bd 83f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, pc}
  29790. 0802b4ae <uxQueueSpacesAvailable>:
  29791. return uxReturn;
  29792. } /*lint !e818 Pointer cannot be declared const as xQueue is a typedef not pointer. */
  29793. /*-----------------------------------------------------------*/
  29794. UBaseType_t uxQueueSpacesAvailable( const QueueHandle_t xQueue )
  29795. {
  29796. 802b4ae: b510 push {r4, lr}
  29797. UBaseType_t uxReturn;
  29798. Queue_t *pxQueue;
  29799. pxQueue = ( Queue_t * ) xQueue;
  29800. configASSERT( pxQueue );
  29801. 802b4b0: 4604 mov r4, r0
  29802. 802b4b2: b910 cbnz r0, 802b4ba <uxQueueSpacesAvailable+0xc>
  29803. 802b4b4: f000 fd68 bl 802bf88 <ulPortSetInterruptMask>
  29804. 802b4b8: e7fe b.n 802b4b8 <uxQueueSpacesAvailable+0xa>
  29805. taskENTER_CRITICAL();
  29806. 802b4ba: f000 fd6d bl 802bf98 <vPortEnterCritical>
  29807. {
  29808. uxReturn = pxQueue->uxLength - pxQueue->uxMessagesWaiting;
  29809. 802b4be: 6ba3 ldr r3, [r4, #56] ; 0x38
  29810. 802b4c0: 6be4 ldr r4, [r4, #60] ; 0x3c
  29811. 802b4c2: 1ae4 subs r4, r4, r3
  29812. }
  29813. taskEXIT_CRITICAL();
  29814. 802b4c4: f000 fd94 bl 802bff0 <vPortExitCritical>
  29815. return uxReturn;
  29816. } /*lint !e818 Pointer cannot be declared const as xQueue is a typedef not pointer. */
  29817. 802b4c8: 4620 mov r0, r4
  29818. 802b4ca: bd10 pop {r4, pc}
  29819. 0802b4cc <vQueueWaitForMessageRestricted>:
  29820. /*-----------------------------------------------------------*/
  29821. #if ( configUSE_TIMERS == 1 )
  29822. void vQueueWaitForMessageRestricted( QueueHandle_t xQueue, TickType_t xTicksToWait )
  29823. {
  29824. 802b4cc: b538 push {r3, r4, r5, lr}
  29825. 802b4ce: 4604 mov r4, r0
  29826. 802b4d0: 460d mov r5, r1
  29827. will not actually cause the task to block, just place it on a blocked
  29828. list. It will not block until the scheduler is unlocked - at which
  29829. time a yield will be performed. If an item is added to the queue while
  29830. the queue is locked, and the calling task blocks on the queue, then the
  29831. calling task will be immediately unblocked when the queue is unlocked. */
  29832. prvLockQueue( pxQueue );
  29833. 802b4d2: f000 fd61 bl 802bf98 <vPortEnterCritical>
  29834. 802b4d6: 6c63 ldr r3, [r4, #68] ; 0x44
  29835. 802b4d8: 3301 adds r3, #1
  29836. 802b4da: d101 bne.n 802b4e0 <vQueueWaitForMessageRestricted+0x14>
  29837. 802b4dc: 2300 movs r3, #0
  29838. 802b4de: 6463 str r3, [r4, #68] ; 0x44
  29839. 802b4e0: 6ca3 ldr r3, [r4, #72] ; 0x48
  29840. 802b4e2: 3301 adds r3, #1
  29841. 802b4e4: d101 bne.n 802b4ea <vQueueWaitForMessageRestricted+0x1e>
  29842. 802b4e6: 2300 movs r3, #0
  29843. 802b4e8: 64a3 str r3, [r4, #72] ; 0x48
  29844. 802b4ea: f000 fd81 bl 802bff0 <vPortExitCritical>
  29845. if( pxQueue->uxMessagesWaiting == ( UBaseType_t ) 0U )
  29846. 802b4ee: 6ba3 ldr r3, [r4, #56] ; 0x38
  29847. 802b4f0: b923 cbnz r3, 802b4fc <vQueueWaitForMessageRestricted+0x30>
  29848. {
  29849. /* There is nothing in the queue, block for the specified period. */
  29850. vTaskPlaceOnEventListRestricted( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait );
  29851. 802b4f2: f104 0024 add.w r0, r4, #36 ; 0x24
  29852. 802b4f6: 4629 mov r1, r5
  29853. 802b4f8: f000 fbbc bl 802bc74 <vTaskPlaceOnEventListRestricted>
  29854. }
  29855. else
  29856. {
  29857. mtCOVERAGE_TEST_MARKER();
  29858. }
  29859. prvUnlockQueue( pxQueue );
  29860. 802b4fc: 4620 mov r0, r4
  29861. }
  29862. 802b4fe: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr}
  29863. }
  29864. else
  29865. {
  29866. mtCOVERAGE_TEST_MARKER();
  29867. }
  29868. prvUnlockQueue( pxQueue );
  29869. 802b502: f7ff bd05 b.w 802af10 <prvUnlockQueue>
  29870. 802b506: 0000 movs r0, r0
  29871. 0802b508 <prvResetNextTaskUnblockTime>:
  29872. static void prvResetNextTaskUnblockTime( void )
  29873. {
  29874. TCB_t *pxTCB;
  29875. if( listLIST_IS_EMPTY( pxDelayedTaskList ) != pdFALSE )
  29876. 802b508: 4a06 ldr r2, [pc, #24] ; (802b524 <prvResetNextTaskUnblockTime+0x1c>)
  29877. 802b50a: 6813 ldr r3, [r2, #0]
  29878. 802b50c: 6819 ldr r1, [r3, #0]
  29879. 802b50e: 4b06 ldr r3, [pc, #24] ; (802b528 <prvResetNextTaskUnblockTime+0x20>)
  29880. 802b510: b911 cbnz r1, 802b518 <prvResetNextTaskUnblockTime+0x10>
  29881. /* The new current delayed list is empty. Set
  29882. xNextTaskUnblockTime to the maximum possible value so it is
  29883. extremely unlikely that the
  29884. if( xTickCount >= xNextTaskUnblockTime ) test will pass until
  29885. there is an item in the delayed list. */
  29886. xNextTaskUnblockTime = portMAX_DELAY;
  29887. 802b512: f04f 32ff mov.w r2, #4294967295
  29888. 802b516: e003 b.n 802b520 <prvResetNextTaskUnblockTime+0x18>
  29889. {
  29890. /* The new current delayed list is not empty, get the value of
  29891. the item at the head of the delayed list. This is the time at
  29892. which the task at the head of the delayed list should be removed
  29893. from the Blocked state. */
  29894. ( pxTCB ) = ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxDelayedTaskList );
  29895. 802b518: 6812 ldr r2, [r2, #0]
  29896. 802b51a: 68d2 ldr r2, [r2, #12]
  29897. xNextTaskUnblockTime = listGET_LIST_ITEM_VALUE( &( ( pxTCB )->xGenericListItem ) );
  29898. 802b51c: 68d2 ldr r2, [r2, #12]
  29899. 802b51e: 6852 ldr r2, [r2, #4]
  29900. 802b520: 601a str r2, [r3, #0]
  29901. 802b522: 4770 bx lr
  29902. 802b524: 20000c44 .word 0x20000c44
  29903. 802b528: 20000718 .word 0x20000718
  29904. 0802b52c <prvAddCurrentTaskToDelayedList>:
  29905. /*-----------------------------------------------------------*/
  29906. static void prvAddCurrentTaskToDelayedList( const TickType_t xTimeToWake )
  29907. {
  29908. /* The list item will be inserted in wake time order. */
  29909. listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xGenericListItem ), xTimeToWake );
  29910. 802b52c: 4b0e ldr r3, [pc, #56] ; (802b568 <prvAddCurrentTaskToDelayedList+0x3c>)
  29911. 802b52e: 681a ldr r2, [r3, #0]
  29912. #endif /* vTaskDelete */
  29913. }
  29914. /*-----------------------------------------------------------*/
  29915. static void prvAddCurrentTaskToDelayedList( const TickType_t xTimeToWake )
  29916. {
  29917. 802b530: b510 push {r4, lr}
  29918. /* The list item will be inserted in wake time order. */
  29919. listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xGenericListItem ), xTimeToWake );
  29920. 802b532: 6050 str r0, [r2, #4]
  29921. if( xTimeToWake < xTickCount )
  29922. 802b534: 4a0d ldr r2, [pc, #52] ; (802b56c <prvAddCurrentTaskToDelayedList+0x40>)
  29923. 802b536: 6812 ldr r2, [r2, #0]
  29924. 802b538: 4290 cmp r0, r2
  29925. #endif /* vTaskDelete */
  29926. }
  29927. /*-----------------------------------------------------------*/
  29928. static void prvAddCurrentTaskToDelayedList( const TickType_t xTimeToWake )
  29929. {
  29930. 802b53a: 4604 mov r4, r0
  29931. /* The list item will be inserted in wake time order. */
  29932. listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xGenericListItem ), xTimeToWake );
  29933. if( xTimeToWake < xTickCount )
  29934. 802b53c: d207 bcs.n 802b54e <prvAddCurrentTaskToDelayedList+0x22>
  29935. {
  29936. /* Wake time has overflowed. Place this item in the overflow list. */
  29937. vListInsert( pxOverflowDelayedTaskList, &( pxCurrentTCB->xGenericListItem ) );
  29938. 802b53e: 4a0c ldr r2, [pc, #48] ; (802b570 <prvAddCurrentTaskToDelayedList+0x44>)
  29939. 802b540: 6810 ldr r0, [r2, #0]
  29940. 802b542: 6819 ldr r1, [r3, #0]
  29941. 802b544: 3104 adds r1, #4
  29942. else
  29943. {
  29944. mtCOVERAGE_TEST_MARKER();
  29945. }
  29946. }
  29947. }
  29948. 802b546: e8bd 4010 ldmia.w sp!, {r4, lr}
  29949. listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xGenericListItem ), xTimeToWake );
  29950. if( xTimeToWake < xTickCount )
  29951. {
  29952. /* Wake time has overflowed. Place this item in the overflow list. */
  29953. vListInsert( pxOverflowDelayedTaskList, &( pxCurrentTCB->xGenericListItem ) );
  29954. 802b54a: f7ff bcb9 b.w 802aec0 <vListInsert>
  29955. }
  29956. else
  29957. {
  29958. /* The wake time has not overflowed, so the current block list is used. */
  29959. vListInsert( pxDelayedTaskList, &( pxCurrentTCB->xGenericListItem ) );
  29960. 802b54e: 4a09 ldr r2, [pc, #36] ; (802b574 <prvAddCurrentTaskToDelayedList+0x48>)
  29961. 802b550: 6810 ldr r0, [r2, #0]
  29962. 802b552: 6819 ldr r1, [r3, #0]
  29963. 802b554: 3104 adds r1, #4
  29964. 802b556: f7ff fcb3 bl 802aec0 <vListInsert>
  29965. /* If the task entering the blocked state was placed at the head of the
  29966. list of blocked tasks then xNextTaskUnblockTime needs to be updated
  29967. too. */
  29968. if( xTimeToWake < xNextTaskUnblockTime )
  29969. 802b55a: 4b07 ldr r3, [pc, #28] ; (802b578 <prvAddCurrentTaskToDelayedList+0x4c>)
  29970. 802b55c: 681a ldr r2, [r3, #0]
  29971. 802b55e: 4294 cmp r4, r2
  29972. {
  29973. xNextTaskUnblockTime = xTimeToWake;
  29974. 802b560: bf38 it cc
  29975. 802b562: 601c strcc r4, [r3, #0]
  29976. 802b564: bd10 pop {r4, pc}
  29977. 802b566: bf00 nop
  29978. 802b568: 20000cf4 .word 0x20000cf4
  29979. 802b56c: 20000d10 .word 0x20000d10
  29980. 802b570: 20000d14 .word 0x20000d14
  29981. 802b574: 20000c44 .word 0x20000c44
  29982. 802b578: 20000718 .word 0x20000718
  29983. 0802b57c <xTaskGenericCreate>:
  29984. #endif
  29985. /*-----------------------------------------------------------*/
  29986. 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. */
  29987. {
  29988. 802b57c: e92d 4ff8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, lr}
  29989. 802b580: 9d0a ldr r5, [sp, #40] ; 0x28
  29990. 802b582: f8dd 802c ldr.w r8, [sp, #44] ; 0x2c
  29991. 802b586: 9e0c ldr r6, [sp, #48] ; 0x30
  29992. 802b588: 460f mov r7, r1
  29993. 802b58a: 4693 mov fp, r2
  29994. 802b58c: 469a mov sl, r3
  29995. BaseType_t xReturn;
  29996. TCB_t * pxNewTCB;
  29997. StackType_t *pxTopOfStack;
  29998. configASSERT( pxTaskCode );
  29999. 802b58e: 4681 mov r9, r0
  30000. 802b590: b910 cbnz r0, 802b598 <xTaskGenericCreate+0x1c>
  30001. 802b592: f000 fcf9 bl 802bf88 <ulPortSetInterruptMask>
  30002. 802b596: e7fe b.n 802b596 <xTaskGenericCreate+0x1a>
  30003. configASSERT( ( ( uxPriority & ( ~portPRIVILEGE_BIT ) ) < configMAX_PRIORITIES ) );
  30004. 802b598: 2d04 cmp r5, #4
  30005. 802b59a: d902 bls.n 802b5a2 <xTaskGenericCreate+0x26>
  30006. 802b59c: f000 fcf4 bl 802bf88 <ulPortSetInterruptMask>
  30007. 802b5a0: e7fe b.n 802b5a0 <xTaskGenericCreate+0x24>
  30008. #else /* portSTACK_GROWTH */
  30009. {
  30010. StackType_t *pxStack;
  30011. /* Allocate space for the stack used by the task being created. */
  30012. pxStack = ( StackType_t * ) pvPortMallocAligned( ( ( ( size_t ) usStackDepth ) * sizeof( StackType_t ) ), puxStackBuffer ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */
  30013. 802b5a2: b936 cbnz r6, 802b5b2 <xTaskGenericCreate+0x36>
  30014. 802b5a4: 0090 lsls r0, r2, #2
  30015. 802b5a6: f000 fe05 bl 802c1b4 <pvPortMalloc>
  30016. if( pxStack != NULL )
  30017. 802b5aa: 4606 mov r6, r0
  30018. 802b5ac: 2800 cmp r0, #0
  30019. 802b5ae: f000 809e beq.w 802b6ee <xTaskGenericCreate+0x172>
  30020. {
  30021. /* Allocate space for the TCB. Where the memory comes from depends
  30022. on the implementation of the port malloc function. */
  30023. pxNewTCB = ( TCB_t * ) pvPortMalloc( sizeof( TCB_t ) );
  30024. 802b5b2: 205c movs r0, #92 ; 0x5c
  30025. 802b5b4: f000 fdfe bl 802c1b4 <pvPortMalloc>
  30026. if( pxNewTCB != NULL )
  30027. 802b5b8: 4604 mov r4, r0
  30028. 802b5ba: b178 cbz r0, 802b5dc <xTaskGenericCreate+0x60>
  30029. {
  30030. /* Store the stack location in the TCB. */
  30031. pxNewTCB->pxStack = pxStack;
  30032. 802b5bc: 6306 str r6, [r0, #48] ; 0x30
  30033. {
  30034. /* Avoid dependency on memset() if it is not required. */
  30035. #if( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) || ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) )
  30036. {
  30037. /* Just to help debugging. */
  30038. ( void ) memset( pxNewTCB->pxStack, ( int ) tskSTACK_FILL_BYTE, ( size_t ) usStackDepth * sizeof( StackType_t ) );
  30039. 802b5be: ea4f 028b mov.w r2, fp, lsl #2
  30040. 802b5c2: 4630 mov r0, r6
  30041. 802b5c4: 21a5 movs r1, #165 ; 0xa5
  30042. 802b5c6: f7f6 fc27 bl 8021e18 <memset>
  30043. stack grows from high memory to low (as per the 80x86) or vice versa.
  30044. portSTACK_GROWTH is used to make the result positive or negative as
  30045. required by the port. */
  30046. #if( portSTACK_GROWTH < 0 )
  30047. {
  30048. pxTopOfStack = pxNewTCB->pxStack + ( usStackDepth - ( uint16_t ) 1 );
  30049. 802b5ca: 6b23 ldr r3, [r4, #48] ; 0x30
  30050. 802b5cc: f10b 3bff add.w fp, fp, #4294967295
  30051. 802b5d0: eb03 0b8b add.w fp, r3, fp, lsl #2
  30052. 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. */
  30053. 802b5d4: f02b 0b07 bic.w fp, fp, #7
  30054. 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. */
  30055. {
  30056. UBaseType_t x;
  30057. /* Store the task name in the TCB. */
  30058. for( x = ( UBaseType_t ) 0; x < ( UBaseType_t ) configMAX_TASK_NAME_LEN; x++ )
  30059. 802b5d8: 2600 movs r6, #0
  30060. 802b5da: e003 b.n 802b5e4 <xTaskGenericCreate+0x68>
  30061. }
  30062. else
  30063. {
  30064. /* The stack cannot be used as the TCB was not created. Free it
  30065. again. */
  30066. vPortFree( pxStack );
  30067. 802b5dc: 4630 mov r0, r6
  30068. 802b5de: f000 fe6f bl 802c2c0 <vPortFree>
  30069. 802b5e2: e084 b.n 802b6ee <xTaskGenericCreate+0x172>
  30070. static char *prvWriteNameToBuffer( char *pcBuffer, const char *pcTaskName );
  30071. #endif
  30072. /*-----------------------------------------------------------*/
  30073. 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. */
  30074. 802b5e4: 19a3 adds r3, r4, r6
  30075. UBaseType_t x;
  30076. /* Store the task name in the TCB. */
  30077. for( x = ( UBaseType_t ) 0; x < ( UBaseType_t ) configMAX_TASK_NAME_LEN; x++ )
  30078. {
  30079. pxTCB->pcTaskName[ x ] = pcName[ x ];
  30080. 802b5e6: 5dba ldrb r2, [r7, r6]
  30081. 802b5e8: f883 2034 strb.w r2, [r3, #52] ; 0x34
  30082. /* Don't copy all configMAX_TASK_NAME_LEN if the string is shorter than
  30083. configMAX_TASK_NAME_LEN characters just in case the memory after the
  30084. string is not accessible (extremely unlikely). */
  30085. if( pcName[ x ] == 0x00 )
  30086. 802b5ec: 5dbb ldrb r3, [r7, r6]
  30087. 802b5ee: b113 cbz r3, 802b5f6 <xTaskGenericCreate+0x7a>
  30088. 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. */
  30089. {
  30090. UBaseType_t x;
  30091. /* Store the task name in the TCB. */
  30092. for( x = ( UBaseType_t ) 0; x < ( UBaseType_t ) configMAX_TASK_NAME_LEN; x++ )
  30093. 802b5f0: 3601 adds r6, #1
  30094. 802b5f2: 2e10 cmp r6, #16
  30095. 802b5f4: d1f6 bne.n 802b5e4 <xTaskGenericCreate+0x68>
  30096. }
  30097. }
  30098. /* Ensure the name string is terminated in the case that the string length
  30099. was greater or equal to configMAX_TASK_NAME_LEN. */
  30100. pxTCB->pcTaskName[ configMAX_TASK_NAME_LEN - 1 ] = '\0';
  30101. 802b5f6: 2600 movs r6, #0
  30102. pxTCB->uxBasePriority = uxPriority;
  30103. pxTCB->uxMutexesHeld = 0;
  30104. }
  30105. #endif /* configUSE_MUTEXES */
  30106. vListInitialiseItem( &( pxTCB->xGenericListItem ) );
  30107. 802b5f8: 1d27 adds r7, r4, #4
  30108. 802b5fa: 4638 mov r0, r7
  30109. }
  30110. }
  30111. /* Ensure the name string is terminated in the case that the string length
  30112. was greater or equal to configMAX_TASK_NAME_LEN. */
  30113. pxTCB->pcTaskName[ configMAX_TASK_NAME_LEN - 1 ] = '\0';
  30114. 802b5fc: f884 6043 strb.w r6, [r4, #67] ; 0x43
  30115. else
  30116. {
  30117. mtCOVERAGE_TEST_MARKER();
  30118. }
  30119. pxTCB->uxPriority = uxPriority;
  30120. 802b600: 62e5 str r5, [r4, #44] ; 0x2c
  30121. #if ( configUSE_MUTEXES == 1 )
  30122. {
  30123. pxTCB->uxBasePriority = uxPriority;
  30124. 802b602: 64e5 str r5, [r4, #76] ; 0x4c
  30125. pxTCB->uxMutexesHeld = 0;
  30126. 802b604: 6526 str r6, [r4, #80] ; 0x50
  30127. }
  30128. #endif /* configUSE_MUTEXES */
  30129. vListInitialiseItem( &( pxTCB->xGenericListItem ) );
  30130. 802b606: f7ff fc4c bl 802aea2 <vListInitialiseItem>
  30131. vListInitialiseItem( &( pxTCB->xEventListItem ) );
  30132. 802b60a: f104 0018 add.w r0, r4, #24
  30133. 802b60e: f7ff fc48 bl 802aea2 <vListInitialiseItem>
  30134. /* Set the pxTCB as a link back from the ListItem_t. This is so we can get
  30135. back to the containing TCB from a generic item in a list. */
  30136. listSET_LIST_ITEM_OWNER( &( pxTCB->xGenericListItem ), pxTCB );
  30137. /* Event lists are always in priority order. */
  30138. 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. */
  30139. 802b612: f1c5 0305 rsb r3, r5, #5
  30140. }
  30141. #endif /* portUSING_MPU_WRAPPERS */
  30142. #if ( configUSE_TASK_NOTIFICATIONS == 1 )
  30143. {
  30144. pxTCB->ulNotifiedValue = 0;
  30145. 802b616: 6566 str r6, [r4, #84] ; 0x54
  30146. vListInitialiseItem( &( pxTCB->xGenericListItem ) );
  30147. vListInitialiseItem( &( pxTCB->xEventListItem ) );
  30148. /* Set the pxTCB as a link back from the ListItem_t. This is so we can get
  30149. back to the containing TCB from a generic item in a list. */
  30150. listSET_LIST_ITEM_OWNER( &( pxTCB->xGenericListItem ), pxTCB );
  30151. 802b618: 6124 str r4, [r4, #16]
  30152. /* Event lists are always in priority order. */
  30153. 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. */
  30154. 802b61a: 61a3 str r3, [r4, #24]
  30155. listSET_LIST_ITEM_OWNER( &( pxTCB->xEventListItem ), pxTCB );
  30156. 802b61c: 6264 str r4, [r4, #36] ; 0x24
  30157. #endif /* portUSING_MPU_WRAPPERS */
  30158. #if ( configUSE_TASK_NOTIFICATIONS == 1 )
  30159. {
  30160. pxTCB->ulNotifiedValue = 0;
  30161. pxTCB->eNotifyState = eNotWaitingNotification;
  30162. 802b61e: f884 6058 strb.w r6, [r4, #88] ; 0x58
  30163. {
  30164. pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxTaskCode, pvParameters, xRunPrivileged );
  30165. }
  30166. #else /* portUSING_MPU_WRAPPERS */
  30167. {
  30168. pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxTaskCode, pvParameters );
  30169. 802b622: 4658 mov r0, fp
  30170. 802b624: 4649 mov r1, r9
  30171. 802b626: 4652 mov r2, sl
  30172. 802b628: f000 fc82 bl 802bf30 <pxPortInitialiseStack>
  30173. 802b62c: 6020 str r0, [r4, #0]
  30174. }
  30175. #endif /* portUSING_MPU_WRAPPERS */
  30176. if( ( void * ) pxCreatedTask != NULL )
  30177. 802b62e: f1b8 0f00 cmp.w r8, #0
  30178. 802b632: d001 beq.n 802b638 <xTaskGenericCreate+0xbc>
  30179. {
  30180. /* Pass the TCB out - in an anonymous way. The calling function/
  30181. task can use this as a handle to delete the task later if
  30182. required.*/
  30183. *pxCreatedTask = ( TaskHandle_t ) pxNewTCB;
  30184. 802b634: f8c8 4000 str.w r4, [r8]
  30185. mtCOVERAGE_TEST_MARKER();
  30186. }
  30187. /* Ensure interrupts don't access the task lists while they are being
  30188. updated. */
  30189. taskENTER_CRITICAL();
  30190. 802b638: f000 fcae bl 802bf98 <vPortEnterCritical>
  30191. {
  30192. uxCurrentNumberOfTasks++;
  30193. 802b63c: 4a2e ldr r2, [pc, #184] ; (802b6f8 <xTaskGenericCreate+0x17c>)
  30194. 802b63e: 6813 ldr r3, [r2, #0]
  30195. 802b640: 3301 adds r3, #1
  30196. 802b642: 6013 str r3, [r2, #0]
  30197. if( pxCurrentTCB == NULL )
  30198. 802b644: 4b2d ldr r3, [pc, #180] ; (802b6fc <xTaskGenericCreate+0x180>)
  30199. 802b646: 681e ldr r6, [r3, #0]
  30200. 802b648: bb36 cbnz r6, 802b698 <xTaskGenericCreate+0x11c>
  30201. {
  30202. /* There are no other tasks, or all the other tasks are in
  30203. the suspended state - make this the current task. */
  30204. pxCurrentTCB = pxNewTCB;
  30205. 802b64a: 601c str r4, [r3, #0]
  30206. if( uxCurrentNumberOfTasks == ( UBaseType_t ) 1 )
  30207. 802b64c: 6813 ldr r3, [r2, #0]
  30208. 802b64e: 2b01 cmp r3, #1
  30209. 802b650: d12a bne.n 802b6a8 <xTaskGenericCreate+0x12c>
  30210. {
  30211. UBaseType_t uxPriority;
  30212. for( uxPriority = ( UBaseType_t ) 0U; uxPriority < ( UBaseType_t ) configMAX_PRIORITIES; uxPriority++ )
  30213. {
  30214. vListInitialise( &( pxReadyTasksLists[ uxPriority ] ) );
  30215. 802b652: f8df 80d0 ldr.w r8, [pc, #208] ; 802b724 <xTaskGenericCreate+0x1a8>
  30216. 802b656: f04f 0914 mov.w r9, #20
  30217. 802b65a: fb09 8006 mla r0, r9, r6, r8
  30218. static void prvInitialiseTaskLists( void )
  30219. {
  30220. UBaseType_t uxPriority;
  30221. for( uxPriority = ( UBaseType_t ) 0U; uxPriority < ( UBaseType_t ) configMAX_PRIORITIES; uxPriority++ )
  30222. 802b65e: 3601 adds r6, #1
  30223. {
  30224. vListInitialise( &( pxReadyTasksLists[ uxPriority ] ) );
  30225. 802b660: f7ff fc14 bl 802ae8c <vListInitialise>
  30226. static void prvInitialiseTaskLists( void )
  30227. {
  30228. UBaseType_t uxPriority;
  30229. for( uxPriority = ( UBaseType_t ) 0U; uxPriority < ( UBaseType_t ) configMAX_PRIORITIES; uxPriority++ )
  30230. 802b664: 2e05 cmp r6, #5
  30231. 802b666: d1f8 bne.n 802b65a <xTaskGenericCreate+0xde>
  30232. {
  30233. vListInitialise( &( pxReadyTasksLists[ uxPriority ] ) );
  30234. }
  30235. vListInitialise( &xDelayedTaskList1 );
  30236. 802b668: f8df 80bc ldr.w r8, [pc, #188] ; 802b728 <xTaskGenericCreate+0x1ac>
  30237. vListInitialise( &xDelayedTaskList2 );
  30238. 802b66c: 4e24 ldr r6, [pc, #144] ; (802b700 <xTaskGenericCreate+0x184>)
  30239. for( uxPriority = ( UBaseType_t ) 0U; uxPriority < ( UBaseType_t ) configMAX_PRIORITIES; uxPriority++ )
  30240. {
  30241. vListInitialise( &( pxReadyTasksLists[ uxPriority ] ) );
  30242. }
  30243. vListInitialise( &xDelayedTaskList1 );
  30244. 802b66e: 4640 mov r0, r8
  30245. 802b670: f7ff fc0c bl 802ae8c <vListInitialise>
  30246. vListInitialise( &xDelayedTaskList2 );
  30247. 802b674: 4630 mov r0, r6
  30248. 802b676: f7ff fc09 bl 802ae8c <vListInitialise>
  30249. vListInitialise( &xPendingReadyList );
  30250. 802b67a: 4822 ldr r0, [pc, #136] ; (802b704 <xTaskGenericCreate+0x188>)
  30251. 802b67c: f7ff fc06 bl 802ae8c <vListInitialise>
  30252. #if ( INCLUDE_vTaskDelete == 1 )
  30253. {
  30254. vListInitialise( &xTasksWaitingTermination );
  30255. 802b680: 4821 ldr r0, [pc, #132] ; (802b708 <xTaskGenericCreate+0x18c>)
  30256. 802b682: f7ff fc03 bl 802ae8c <vListInitialise>
  30257. }
  30258. #endif /* INCLUDE_vTaskDelete */
  30259. #if ( INCLUDE_vTaskSuspend == 1 )
  30260. {
  30261. vListInitialise( &xSuspendedTaskList );
  30262. 802b686: 4821 ldr r0, [pc, #132] ; (802b70c <xTaskGenericCreate+0x190>)
  30263. 802b688: f7ff fc00 bl 802ae8c <vListInitialise>
  30264. }
  30265. #endif /* INCLUDE_vTaskSuspend */
  30266. /* Start with pxDelayedTaskList using list1 and the pxOverflowDelayedTaskList
  30267. using list2. */
  30268. pxDelayedTaskList = &xDelayedTaskList1;
  30269. 802b68c: 4b20 ldr r3, [pc, #128] ; (802b710 <xTaskGenericCreate+0x194>)
  30270. 802b68e: f8c3 8000 str.w r8, [r3]
  30271. pxOverflowDelayedTaskList = &xDelayedTaskList2;
  30272. 802b692: 4b20 ldr r3, [pc, #128] ; (802b714 <xTaskGenericCreate+0x198>)
  30273. 802b694: 601e str r6, [r3, #0]
  30274. 802b696: e007 b.n 802b6a8 <xTaskGenericCreate+0x12c>
  30275. else
  30276. {
  30277. /* If the scheduler is not already running, make this task the
  30278. current task if it is the highest priority task to be created
  30279. so far. */
  30280. if( xSchedulerRunning == pdFALSE )
  30281. 802b698: 4a1f ldr r2, [pc, #124] ; (802b718 <xTaskGenericCreate+0x19c>)
  30282. 802b69a: 6812 ldr r2, [r2, #0]
  30283. 802b69c: b922 cbnz r2, 802b6a8 <xTaskGenericCreate+0x12c>
  30284. {
  30285. if( pxCurrentTCB->uxPriority <= uxPriority )
  30286. 802b69e: 681a ldr r2, [r3, #0]
  30287. 802b6a0: 6ad2 ldr r2, [r2, #44] ; 0x2c
  30288. 802b6a2: 42aa cmp r2, r5
  30289. {
  30290. pxCurrentTCB = pxNewTCB;
  30291. 802b6a4: bf98 it ls
  30292. 802b6a6: 601c strls r4, [r3, #0]
  30293. {
  30294. mtCOVERAGE_TEST_MARKER();
  30295. }
  30296. }
  30297. uxTaskNumber++;
  30298. 802b6a8: 4a1c ldr r2, [pc, #112] ; (802b71c <xTaskGenericCreate+0x1a0>)
  30299. 802b6aa: 6813 ldr r3, [r2, #0]
  30300. 802b6ac: 3301 adds r3, #1
  30301. 802b6ae: 6013 str r3, [r2, #0]
  30302. pxNewTCB->uxTCBNumber = uxTaskNumber;
  30303. }
  30304. #endif /* configUSE_TRACE_FACILITY */
  30305. traceTASK_CREATE( pxNewTCB );
  30306. prvAddTaskToReadyList( pxNewTCB );
  30307. 802b6b0: 4a1b ldr r2, [pc, #108] ; (802b720 <xTaskGenericCreate+0x1a4>)
  30308. uxTaskNumber++;
  30309. #if ( configUSE_TRACE_FACILITY == 1 )
  30310. {
  30311. /* Add a counter into the TCB for tracing only. */
  30312. pxNewTCB->uxTCBNumber = uxTaskNumber;
  30313. 802b6b2: 6463 str r3, [r4, #68] ; 0x44
  30314. }
  30315. #endif /* configUSE_TRACE_FACILITY */
  30316. traceTASK_CREATE( pxNewTCB );
  30317. prvAddTaskToReadyList( pxNewTCB );
  30318. 802b6b4: 6ae3 ldr r3, [r4, #44] ; 0x2c
  30319. 802b6b6: 6811 ldr r1, [r2, #0]
  30320. 802b6b8: 2401 movs r4, #1
  30321. 802b6ba: fa04 f003 lsl.w r0, r4, r3
  30322. 802b6be: 4301 orrs r1, r0
  30323. 802b6c0: 6011 str r1, [r2, #0]
  30324. 802b6c2: 4a18 ldr r2, [pc, #96] ; (802b724 <xTaskGenericCreate+0x1a8>)
  30325. 802b6c4: 2014 movs r0, #20
  30326. 802b6c6: fb00 2003 mla r0, r0, r3, r2
  30327. 802b6ca: 4639 mov r1, r7
  30328. 802b6cc: f7ff fbec bl 802aea8 <vListInsertEnd>
  30329. xReturn = pdPASS;
  30330. portSETUP_TCB( pxNewTCB );
  30331. }
  30332. taskEXIT_CRITICAL();
  30333. 802b6d0: f000 fc8e bl 802bff0 <vPortExitCritical>
  30334. traceTASK_CREATE_FAILED();
  30335. }
  30336. if( xReturn == pdPASS )
  30337. {
  30338. if( xSchedulerRunning != pdFALSE )
  30339. 802b6d4: 4b10 ldr r3, [pc, #64] ; (802b718 <xTaskGenericCreate+0x19c>)
  30340. 802b6d6: 681b ldr r3, [r3, #0]
  30341. 802b6d8: b133 cbz r3, 802b6e8 <xTaskGenericCreate+0x16c>
  30342. {
  30343. /* If the created task is of a higher priority than the current task
  30344. then it should run now. */
  30345. if( pxCurrentTCB->uxPriority < uxPriority )
  30346. 802b6da: 4b08 ldr r3, [pc, #32] ; (802b6fc <xTaskGenericCreate+0x180>)
  30347. 802b6dc: 681b ldr r3, [r3, #0]
  30348. 802b6de: 6adb ldr r3, [r3, #44] ; 0x2c
  30349. 802b6e0: 42ab cmp r3, r5
  30350. 802b6e2: d201 bcs.n 802b6e8 <xTaskGenericCreate+0x16c>
  30351. {
  30352. taskYIELD_IF_USING_PREEMPTION();
  30353. 802b6e4: f000 fc44 bl 802bf70 <vPortYield>
  30354. #endif /* configUSE_TRACE_FACILITY */
  30355. traceTASK_CREATE( pxNewTCB );
  30356. prvAddTaskToReadyList( pxNewTCB );
  30357. xReturn = pdPASS;
  30358. 802b6e8: 4620 mov r0, r4
  30359. 802b6ea: e8bd 8ff8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc}
  30360. }
  30361. taskEXIT_CRITICAL();
  30362. }
  30363. else
  30364. {
  30365. xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY;
  30366. 802b6ee: f04f 30ff mov.w r0, #4294967295
  30367. mtCOVERAGE_TEST_MARKER();
  30368. }
  30369. }
  30370. return xReturn;
  30371. }
  30372. 802b6f2: e8bd 8ff8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc}
  30373. 802b6f6: bf00 nop
  30374. 802b6f8: 20000d1c .word 0x20000d1c
  30375. 802b6fc: 20000cf4 .word 0x20000cf4
  30376. 802b700: 20000c64 .word 0x20000c64
  30377. 802b704: 20000cf8 .word 0x20000cf8
  30378. 802b708: 20000ce0 .word 0x20000ce0
  30379. 802b70c: 20000d20 .word 0x20000d20
  30380. 802b710: 20000c44 .word 0x20000c44
  30381. 802b714: 20000d14 .word 0x20000d14
  30382. 802b718: 20000c48 .word 0x20000c48
  30383. 802b71c: 20000d18 .word 0x20000d18
  30384. 802b720: 20000d34 .word 0x20000d34
  30385. 802b724: 20000c7c .word 0x20000c7c
  30386. 802b728: 20000c50 .word 0x20000c50
  30387. 0802b72c <vTaskDelete>:
  30388. /*-----------------------------------------------------------*/
  30389. #if ( INCLUDE_vTaskDelete == 1 )
  30390. void vTaskDelete( TaskHandle_t xTaskToDelete )
  30391. {
  30392. 802b72c: b538 push {r3, r4, r5, lr}
  30393. 802b72e: 4604 mov r4, r0
  30394. TCB_t *pxTCB;
  30395. taskENTER_CRITICAL();
  30396. 802b730: f000 fc32 bl 802bf98 <vPortEnterCritical>
  30397. {
  30398. /* If null is passed in here then it is the calling task that is
  30399. being deleted. */
  30400. pxTCB = prvGetTCBFromHandle( xTaskToDelete );
  30401. 802b734: b90c cbnz r4, 802b73a <vTaskDelete+0xe>
  30402. 802b736: 4b22 ldr r3, [pc, #136] ; (802b7c0 <vTaskDelete+0x94>)
  30403. 802b738: 681c ldr r4, [r3, #0]
  30404. /* Remove task from the ready list and place in the termination list.
  30405. This will stop the task from be scheduled. The idle task will check
  30406. the termination list and free up any memory allocated by the
  30407. scheduler for the TCB and stack. */
  30408. if( uxListRemove( &( pxTCB->xGenericListItem ) ) == ( UBaseType_t ) 0 )
  30409. 802b73a: 1d25 adds r5, r4, #4
  30410. 802b73c: 4628 mov r0, r5
  30411. 802b73e: f7ff fbd7 bl 802aef0 <uxListRemove>
  30412. 802b742: b968 cbnz r0, 802b760 <vTaskDelete+0x34>
  30413. {
  30414. taskRESET_READY_PRIORITY( pxTCB->uxPriority );
  30415. 802b744: 6ae2 ldr r2, [r4, #44] ; 0x2c
  30416. 802b746: 491f ldr r1, [pc, #124] ; (802b7c4 <vTaskDelete+0x98>)
  30417. 802b748: 2314 movs r3, #20
  30418. 802b74a: 4353 muls r3, r2
  30419. 802b74c: 58cb ldr r3, [r1, r3]
  30420. 802b74e: b93b cbnz r3, 802b760 <vTaskDelete+0x34>
  30421. 802b750: 4b1d ldr r3, [pc, #116] ; (802b7c8 <vTaskDelete+0x9c>)
  30422. 802b752: 2001 movs r0, #1
  30423. 802b754: 6819 ldr r1, [r3, #0]
  30424. 802b756: fa00 f202 lsl.w r2, r0, r2
  30425. 802b75a: ea21 0202 bic.w r2, r1, r2
  30426. 802b75e: 601a str r2, [r3, #0]
  30427. {
  30428. mtCOVERAGE_TEST_MARKER();
  30429. }
  30430. /* Is the task waiting on an event also? */
  30431. if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL )
  30432. 802b760: 6aa3 ldr r3, [r4, #40] ; 0x28
  30433. 802b762: b11b cbz r3, 802b76c <vTaskDelete+0x40>
  30434. {
  30435. ( void ) uxListRemove( &( pxTCB->xEventListItem ) );
  30436. 802b764: f104 0018 add.w r0, r4, #24
  30437. 802b768: f7ff fbc2 bl 802aef0 <uxListRemove>
  30438. else
  30439. {
  30440. mtCOVERAGE_TEST_MARKER();
  30441. }
  30442. vListInsertEnd( &xTasksWaitingTermination, &( pxTCB->xGenericListItem ) );
  30443. 802b76c: 4817 ldr r0, [pc, #92] ; (802b7cc <vTaskDelete+0xa0>)
  30444. 802b76e: 4629 mov r1, r5
  30445. 802b770: f7ff fb9a bl 802aea8 <vListInsertEnd>
  30446. /* Increment the ucTasksDeleted variable so the idle task knows
  30447. there is a task that has been deleted and that it should therefore
  30448. check the xTasksWaitingTermination list. */
  30449. ++uxTasksDeleted;
  30450. 802b774: 4b16 ldr r3, [pc, #88] ; (802b7d0 <vTaskDelete+0xa4>)
  30451. 802b776: 681a ldr r2, [r3, #0]
  30452. 802b778: 3201 adds r2, #1
  30453. 802b77a: 601a str r2, [r3, #0]
  30454. /* Increment the uxTaskNumberVariable also so kernel aware debuggers
  30455. can detect that the task lists need re-generating. */
  30456. uxTaskNumber++;
  30457. 802b77c: 4b15 ldr r3, [pc, #84] ; (802b7d4 <vTaskDelete+0xa8>)
  30458. 802b77e: 681a ldr r2, [r3, #0]
  30459. 802b780: 3201 adds r2, #1
  30460. 802b782: 601a str r2, [r3, #0]
  30461. traceTASK_DELETE( pxTCB );
  30462. }
  30463. taskEXIT_CRITICAL();
  30464. 802b784: f000 fc34 bl 802bff0 <vPortExitCritical>
  30465. /* Force a reschedule if it is the currently running task that has just
  30466. been deleted. */
  30467. if( xSchedulerRunning != pdFALSE )
  30468. 802b788: 4b13 ldr r3, [pc, #76] ; (802b7d8 <vTaskDelete+0xac>)
  30469. 802b78a: 681b ldr r3, [r3, #0]
  30470. 802b78c: 2b00 cmp r3, #0
  30471. 802b78e: d015 beq.n 802b7bc <vTaskDelete+0x90>
  30472. {
  30473. if( pxTCB == pxCurrentTCB )
  30474. 802b790: 4b0b ldr r3, [pc, #44] ; (802b7c0 <vTaskDelete+0x94>)
  30475. 802b792: 681b ldr r3, [r3, #0]
  30476. 802b794: 429c cmp r4, r3
  30477. 802b796: d109 bne.n 802b7ac <vTaskDelete+0x80>
  30478. {
  30479. configASSERT( uxSchedulerSuspended == 0 );
  30480. 802b798: 4b10 ldr r3, [pc, #64] ; (802b7dc <vTaskDelete+0xb0>)
  30481. 802b79a: 681b ldr r3, [r3, #0]
  30482. 802b79c: b113 cbz r3, 802b7a4 <vTaskDelete+0x78>
  30483. 802b79e: f000 fbf3 bl 802bf88 <ulPortSetInterruptMask>
  30484. 802b7a2: e7fe b.n 802b7a2 <vTaskDelete+0x76>
  30485. prvResetNextTaskUnblockTime();
  30486. }
  30487. taskEXIT_CRITICAL();
  30488. }
  30489. }
  30490. }
  30491. 802b7a4: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr}
  30492. in which Windows specific clean up operations are performed,
  30493. after which it is not possible to yield away from this task -
  30494. hence xYieldPending is used to latch that a context switch is
  30495. required. */
  30496. portPRE_TASK_DELETE_HOOK( pxTCB, &xYieldPending );
  30497. portYIELD_WITHIN_API();
  30498. 802b7a8: f000 bbe2 b.w 802bf70 <vPortYield>
  30499. }
  30500. else
  30501. {
  30502. /* Reset the next expected unblock time in case it referred to
  30503. the task that has just been deleted. */
  30504. taskENTER_CRITICAL();
  30505. 802b7ac: f000 fbf4 bl 802bf98 <vPortEnterCritical>
  30506. {
  30507. prvResetNextTaskUnblockTime();
  30508. 802b7b0: f7ff feaa bl 802b508 <prvResetNextTaskUnblockTime>
  30509. }
  30510. taskEXIT_CRITICAL();
  30511. }
  30512. }
  30513. }
  30514. 802b7b4: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr}
  30515. the task that has just been deleted. */
  30516. taskENTER_CRITICAL();
  30517. {
  30518. prvResetNextTaskUnblockTime();
  30519. }
  30520. taskEXIT_CRITICAL();
  30521. 802b7b8: f000 bc1a b.w 802bff0 <vPortExitCritical>
  30522. 802b7bc: bd38 pop {r3, r4, r5, pc}
  30523. 802b7be: bf00 nop
  30524. 802b7c0: 20000cf4 .word 0x20000cf4
  30525. 802b7c4: 20000c7c .word 0x20000c7c
  30526. 802b7c8: 20000d34 .word 0x20000d34
  30527. 802b7cc: 20000ce0 .word 0x20000ce0
  30528. 802b7d0: 20000c4c .word 0x20000c4c
  30529. 802b7d4: 20000d18 .word 0x20000d18
  30530. 802b7d8: 20000c48 .word 0x20000c48
  30531. 802b7dc: 20000d0c .word 0x20000d0c
  30532. 0802b7e0 <vTaskStartScheduler>:
  30533. #endif /* ( ( INCLUDE_xTaskResumeFromISR == 1 ) && ( INCLUDE_vTaskSuspend == 1 ) ) */
  30534. /*-----------------------------------------------------------*/
  30535. void vTaskStartScheduler( void )
  30536. {
  30537. 802b7e0: b530 push {r4, r5, lr}
  30538. 802b7e2: b085 sub sp, #20
  30539. 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. */
  30540. }
  30541. #else
  30542. {
  30543. /* Create the idle task without storing its handle. */
  30544. 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. */
  30545. 802b7e4: 2400 movs r4, #0
  30546. 802b7e6: 2280 movs r2, #128 ; 0x80
  30547. 802b7e8: 9400 str r4, [sp, #0]
  30548. 802b7ea: 9401 str r4, [sp, #4]
  30549. 802b7ec: 9402 str r4, [sp, #8]
  30550. 802b7ee: 9403 str r4, [sp, #12]
  30551. 802b7f0: 480e ldr r0, [pc, #56] ; (802b82c <vTaskStartScheduler+0x4c>)
  30552. 802b7f2: 490f ldr r1, [pc, #60] ; (802b830 <vTaskStartScheduler+0x50>)
  30553. 802b7f4: 4623 mov r3, r4
  30554. 802b7f6: f7ff fec1 bl 802b57c <xTaskGenericCreate>
  30555. }
  30556. #endif /* INCLUDE_xTaskGetIdleTaskHandle */
  30557. #if ( configUSE_TIMERS == 1 )
  30558. {
  30559. if( xReturn == pdPASS )
  30560. 802b7fa: 2801 cmp r0, #1
  30561. 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. */
  30562. }
  30563. #else
  30564. {
  30565. /* Create the idle task without storing its handle. */
  30566. 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. */
  30567. 802b7fc: 4605 mov r5, r0
  30568. }
  30569. #endif /* INCLUDE_xTaskGetIdleTaskHandle */
  30570. #if ( configUSE_TIMERS == 1 )
  30571. {
  30572. if( xReturn == pdPASS )
  30573. 802b7fe: d10f bne.n 802b820 <vTaskStartScheduler+0x40>
  30574. {
  30575. xReturn = xTimerCreateTimerTask();
  30576. 802b800: f7ff f9ea bl 802abd8 <xTimerCreateTimerTask>
  30577. mtCOVERAGE_TEST_MARKER();
  30578. }
  30579. }
  30580. #endif /* configUSE_TIMERS */
  30581. if( xReturn == pdPASS )
  30582. 802b804: 2801 cmp r0, #1
  30583. #if ( configUSE_TIMERS == 1 )
  30584. {
  30585. if( xReturn == pdPASS )
  30586. {
  30587. xReturn = xTimerCreateTimerTask();
  30588. 802b806: 4605 mov r5, r0
  30589. mtCOVERAGE_TEST_MARKER();
  30590. }
  30591. }
  30592. #endif /* configUSE_TIMERS */
  30593. if( xReturn == pdPASS )
  30594. 802b808: d10a bne.n 802b820 <vTaskStartScheduler+0x40>
  30595. /* Interrupts are turned off here, to ensure a tick does not occur
  30596. before or during the call to xPortStartScheduler(). The stacks of
  30597. the created tasks contain a status word with interrupts switched on
  30598. so interrupts will automatically get re-enabled when the first task
  30599. starts to run. */
  30600. portDISABLE_INTERRUPTS();
  30601. 802b80a: f000 fbbd bl 802bf88 <ulPortSetInterruptMask>
  30602. structure specific to the task that will run first. */
  30603. _impure_ptr = &( pxCurrentTCB->xNewLib_reent );
  30604. }
  30605. #endif /* configUSE_NEWLIB_REENTRANT */
  30606. xSchedulerRunning = pdTRUE;
  30607. 802b80e: 4b09 ldr r3, [pc, #36] ; (802b834 <vTaskStartScheduler+0x54>)
  30608. 802b810: 601d str r5, [r3, #0]
  30609. xTickCount = ( TickType_t ) 0U;
  30610. 802b812: 4b09 ldr r3, [pc, #36] ; (802b838 <vTaskStartScheduler+0x58>)
  30611. 802b814: 601c str r4, [r3, #0]
  30612. /* This line will only be reached if the kernel could not be started,
  30613. because there was not enough FreeRTOS heap to create the idle task
  30614. or the timer task. */
  30615. configASSERT( xReturn );
  30616. }
  30617. }
  30618. 802b816: b005 add sp, #20
  30619. 802b818: e8bd 4030 ldmia.w sp!, {r4, r5, lr}
  30620. the run time counter time base. */
  30621. portCONFIGURE_TIMER_FOR_RUN_TIME_STATS();
  30622. /* Setting up the timer tick is hardware specific and thus in the
  30623. portable interface. */
  30624. if( xPortStartScheduler() != pdFALSE )
  30625. 802b81c: f000 bc40 b.w 802c0a0 <xPortStartScheduler>
  30626. else
  30627. {
  30628. /* This line will only be reached if the kernel could not be started,
  30629. because there was not enough FreeRTOS heap to create the idle task
  30630. or the timer task. */
  30631. configASSERT( xReturn );
  30632. 802b820: b915 cbnz r5, 802b828 <vTaskStartScheduler+0x48>
  30633. 802b822: f000 fbb1 bl 802bf88 <ulPortSetInterruptMask>
  30634. 802b826: e7fe b.n 802b826 <vTaskStartScheduler+0x46>
  30635. }
  30636. }
  30637. 802b828: b005 add sp, #20
  30638. 802b82a: bd30 pop {r4, r5, pc}
  30639. 802b82c: 0802ba4d .word 0x0802ba4d
  30640. 802b830: 080395cd .word 0x080395cd
  30641. 802b834: 20000c48 .word 0x20000c48
  30642. 802b838: 20000d10 .word 0x20000d10
  30643. 0802b83c <vTaskSuspendAll>:
  30644. {
  30645. /* A critical section is not required as the variable is of type
  30646. BaseType_t. Please read Richard Barry's reply in the following link to a
  30647. post in the FreeRTOS support forum before reporting this as a bug! -
  30648. http://goo.gl/wu4acr */
  30649. ++uxSchedulerSuspended;
  30650. 802b83c: 4b02 ldr r3, [pc, #8] ; (802b848 <vTaskSuspendAll+0xc>)
  30651. 802b83e: 681a ldr r2, [r3, #0]
  30652. 802b840: 3201 adds r2, #1
  30653. 802b842: 601a str r2, [r3, #0]
  30654. 802b844: 4770 bx lr
  30655. 802b846: bf00 nop
  30656. 802b848: 20000d0c .word 0x20000d0c
  30657. 0802b84c <xTaskGetTickCount>:
  30658. TickType_t xTicks;
  30659. /* Critical section required if running on a 16 bit processor. */
  30660. portTICK_TYPE_ENTER_CRITICAL();
  30661. {
  30662. xTicks = xTickCount;
  30663. 802b84c: 4b01 ldr r3, [pc, #4] ; (802b854 <xTaskGetTickCount+0x8>)
  30664. 802b84e: 6818 ldr r0, [r3, #0]
  30665. }
  30666. portTICK_TYPE_EXIT_CRITICAL();
  30667. return xTicks;
  30668. }
  30669. 802b850: 4770 bx lr
  30670. 802b852: bf00 nop
  30671. 802b854: 20000d10 .word 0x20000d10
  30672. 0802b858 <xTaskIncrementTick>:
  30673. /* Called by the portable layer each time a tick interrupt occurs.
  30674. Increments the tick then checks to see if the new tick value will cause any
  30675. tasks to be unblocked. */
  30676. traceTASK_INCREMENT_TICK( xTickCount );
  30677. if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE )
  30678. 802b858: 4b3b ldr r3, [pc, #236] ; (802b948 <xTaskIncrementTick+0xf0>)
  30679. 802b85a: 681b ldr r3, [r3, #0]
  30680. #endif /* configUSE_TICKLESS_IDLE */
  30681. /*----------------------------------------------------------*/
  30682. BaseType_t xTaskIncrementTick( void )
  30683. {
  30684. 802b85c: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
  30685. /* Called by the portable layer each time a tick interrupt occurs.
  30686. Increments the tick then checks to see if the new tick value will cause any
  30687. tasks to be unblocked. */
  30688. traceTASK_INCREMENT_TICK( xTickCount );
  30689. if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE )
  30690. 802b860: 2b00 cmp r3, #0
  30691. 802b862: d15b bne.n 802b91c <xTaskIncrementTick+0xc4>
  30692. {
  30693. /* Increment the RTOS tick, switching the delayed and overflowed
  30694. delayed lists if it wraps to 0. */
  30695. ++xTickCount;
  30696. 802b864: 4b39 ldr r3, [pc, #228] ; (802b94c <xTaskIncrementTick+0xf4>)
  30697. 802b866: 681a ldr r2, [r3, #0]
  30698. 802b868: 3201 adds r2, #1
  30699. 802b86a: 601a str r2, [r3, #0]
  30700. {
  30701. /* Minor optimisation. The tick count cannot change in this
  30702. block. */
  30703. const TickType_t xConstTickCount = xTickCount;
  30704. 802b86c: 681e ldr r6, [r3, #0]
  30705. if( xConstTickCount == ( TickType_t ) 0U )
  30706. 802b86e: b98e cbnz r6, 802b894 <xTaskIncrementTick+0x3c>
  30707. {
  30708. taskSWITCH_DELAYED_LISTS();
  30709. 802b870: 4b37 ldr r3, [pc, #220] ; (802b950 <xTaskIncrementTick+0xf8>)
  30710. 802b872: 681a ldr r2, [r3, #0]
  30711. 802b874: 6812 ldr r2, [r2, #0]
  30712. 802b876: b112 cbz r2, 802b87e <xTaskIncrementTick+0x26>
  30713. 802b878: f000 fb86 bl 802bf88 <ulPortSetInterruptMask>
  30714. 802b87c: e7fe b.n 802b87c <xTaskIncrementTick+0x24>
  30715. 802b87e: 4a35 ldr r2, [pc, #212] ; (802b954 <xTaskIncrementTick+0xfc>)
  30716. 802b880: 6819 ldr r1, [r3, #0]
  30717. 802b882: 6810 ldr r0, [r2, #0]
  30718. 802b884: 6018 str r0, [r3, #0]
  30719. 802b886: 4b34 ldr r3, [pc, #208] ; (802b958 <xTaskIncrementTick+0x100>)
  30720. 802b888: 6011 str r1, [r2, #0]
  30721. 802b88a: 681a ldr r2, [r3, #0]
  30722. 802b88c: 3201 adds r2, #1
  30723. 802b88e: 601a str r2, [r3, #0]
  30724. 802b890: f7ff fe3a bl 802b508 <prvResetNextTaskUnblockTime>
  30725. /* See if this tick has made a timeout expire. Tasks are stored in
  30726. the queue in the order of their wake time - meaning once one task
  30727. has been found whose block time has not expired there is no need to
  30728. look any further down the list. */
  30729. if( xConstTickCount >= xNextTaskUnblockTime )
  30730. 802b894: 4b31 ldr r3, [pc, #196] ; (802b95c <xTaskIncrementTick+0x104>)
  30731. 802b896: 681b ldr r3, [r3, #0]
  30732. 802b898: 2400 movs r4, #0
  30733. 802b89a: 429e cmp r6, r3
  30734. 802b89c: d200 bcs.n 802b8a0 <xTaskIncrementTick+0x48>
  30735. 802b89e: e032 b.n 802b906 <xTaskIncrementTick+0xae>
  30736. {
  30737. for( ;; )
  30738. {
  30739. if( listLIST_IS_EMPTY( pxDelayedTaskList ) != pdFALSE )
  30740. 802b8a0: 4f2b ldr r7, [pc, #172] ; (802b950 <xTaskIncrementTick+0xf8>)
  30741. mtCOVERAGE_TEST_MARKER();
  30742. }
  30743. /* Place the unblocked task into the appropriate ready
  30744. list. */
  30745. prvAddTaskToReadyList( pxTCB );
  30746. 802b8a2: f8df 80cc ldr.w r8, [pc, #204] ; 802b970 <xTaskIncrementTick+0x118>
  30747. 802b8a6: f8df a0bc ldr.w sl, [pc, #188] ; 802b964 <xTaskIncrementTick+0x10c>
  30748. look any further down the list. */
  30749. if( xConstTickCount >= xNextTaskUnblockTime )
  30750. {
  30751. for( ;; )
  30752. {
  30753. if( listLIST_IS_EMPTY( pxDelayedTaskList ) != pdFALSE )
  30754. 802b8aa: 683b ldr r3, [r7, #0]
  30755. 802b8ac: 681b ldr r3, [r3, #0]
  30756. 802b8ae: 2b00 cmp r3, #0
  30757. 802b8b0: d13a bne.n 802b928 <xTaskIncrementTick+0xd0>
  30758. /* The delayed list is empty. Set xNextTaskUnblockTime
  30759. to the maximum possible value so it is extremely
  30760. unlikely that the
  30761. if( xTickCount >= xNextTaskUnblockTime ) test will pass
  30762. next time through. */
  30763. xNextTaskUnblockTime = portMAX_DELAY;
  30764. 802b8b2: 4b2a ldr r3, [pc, #168] ; (802b95c <xTaskIncrementTick+0x104>)
  30765. 802b8b4: f04f 32ff mov.w r2, #4294967295
  30766. 802b8b8: 601a str r2, [r3, #0]
  30767. break;
  30768. 802b8ba: e024 b.n 802b906 <xTaskIncrementTick+0xae>
  30769. /* It is not time to unblock this item yet, but the
  30770. item value is the time at which the task at the head
  30771. of the blocked list must be removed from the Blocked
  30772. state - so record the item value in
  30773. xNextTaskUnblockTime. */
  30774. xNextTaskUnblockTime = xItemValue;
  30775. 802b8bc: 4a27 ldr r2, [pc, #156] ; (802b95c <xTaskIncrementTick+0x104>)
  30776. 802b8be: 6013 str r3, [r2, #0]
  30777. break;
  30778. 802b8c0: e021 b.n 802b906 <xTaskIncrementTick+0xae>
  30779. {
  30780. mtCOVERAGE_TEST_MARKER();
  30781. }
  30782. /* It is time to remove the item from the Blocked state. */
  30783. ( void ) uxListRemove( &( pxTCB->xGenericListItem ) );
  30784. 802b8c2: f105 0904 add.w r9, r5, #4
  30785. 802b8c6: 4648 mov r0, r9
  30786. 802b8c8: f7ff fb12 bl 802aef0 <uxListRemove>
  30787. /* Is the task waiting on an event also? If so remove
  30788. it from the event list. */
  30789. if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL )
  30790. 802b8cc: 6aab ldr r3, [r5, #40] ; 0x28
  30791. 802b8ce: b11b cbz r3, 802b8d8 <xTaskIncrementTick+0x80>
  30792. {
  30793. ( void ) uxListRemove( &( pxTCB->xEventListItem ) );
  30794. 802b8d0: f105 0018 add.w r0, r5, #24
  30795. 802b8d4: f7ff fb0c bl 802aef0 <uxListRemove>
  30796. mtCOVERAGE_TEST_MARKER();
  30797. }
  30798. /* Place the unblocked task into the appropriate ready
  30799. list. */
  30800. prvAddTaskToReadyList( pxTCB );
  30801. 802b8d8: 6aeb ldr r3, [r5, #44] ; 0x2c
  30802. 802b8da: f8d8 1000 ldr.w r1, [r8]
  30803. 802b8de: 2201 movs r2, #1
  30804. 802b8e0: fa02 f203 lsl.w r2, r2, r3
  30805. 802b8e4: 2014 movs r0, #20
  30806. 802b8e6: 430a orrs r2, r1
  30807. 802b8e8: fb00 a003 mla r0, r0, r3, sl
  30808. 802b8ec: 4649 mov r1, r9
  30809. 802b8ee: f8c8 2000 str.w r2, [r8]
  30810. 802b8f2: f7ff fad9 bl 802aea8 <vListInsertEnd>
  30811. {
  30812. /* Preemption is on, but a context switch should
  30813. only be performed if the unblocked task has a
  30814. priority that is equal to or higher than the
  30815. currently executing task. */
  30816. if( pxTCB->uxPriority >= pxCurrentTCB->uxPriority )
  30817. 802b8f6: 4b1a ldr r3, [pc, #104] ; (802b960 <xTaskIncrementTick+0x108>)
  30818. 802b8f8: 6aea ldr r2, [r5, #44] ; 0x2c
  30819. 802b8fa: 681b ldr r3, [r3, #0]
  30820. 802b8fc: 6adb ldr r3, [r3, #44] ; 0x2c
  30821. {
  30822. xSwitchRequired = pdTRUE;
  30823. 802b8fe: 429a cmp r2, r3
  30824. 802b900: bf28 it cs
  30825. 802b902: 2401 movcs r4, #1
  30826. 802b904: e7d1 b.n 802b8aa <xTaskIncrementTick+0x52>
  30827. /* Tasks of equal priority to the currently running task will share
  30828. processing time (time slice) if preemption is on, and the application
  30829. writer has not explicitly turned time slicing off. */
  30830. #if ( ( configUSE_PREEMPTION == 1 ) && ( configUSE_TIME_SLICING == 1 ) )
  30831. {
  30832. if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ pxCurrentTCB->uxPriority ] ) ) > ( UBaseType_t ) 1 )
  30833. 802b906: 4b16 ldr r3, [pc, #88] ; (802b960 <xTaskIncrementTick+0x108>)
  30834. 802b908: 681b ldr r3, [r3, #0]
  30835. 802b90a: 6adb ldr r3, [r3, #44] ; 0x2c
  30836. 802b90c: 2214 movs r2, #20
  30837. 802b90e: 4353 muls r3, r2
  30838. 802b910: 4a14 ldr r2, [pc, #80] ; (802b964 <xTaskIncrementTick+0x10c>)
  30839. 802b912: 58d3 ldr r3, [r2, r3]
  30840. {
  30841. xSwitchRequired = pdTRUE;
  30842. 802b914: 2b01 cmp r3, #1
  30843. 802b916: bf88 it hi
  30844. 802b918: 2401 movhi r4, #1
  30845. 802b91a: e00c b.n 802b936 <xTaskIncrementTick+0xde>
  30846. }
  30847. #endif /* configUSE_TICK_HOOK */
  30848. }
  30849. else
  30850. {
  30851. ++uxPendedTicks;
  30852. 802b91c: 4b12 ldr r3, [pc, #72] ; (802b968 <xTaskIncrementTick+0x110>)
  30853. 802b91e: 681a ldr r2, [r3, #0]
  30854. 802b920: 3201 adds r2, #1
  30855. 802b922: 601a str r2, [r3, #0]
  30856. BaseType_t xTaskIncrementTick( void )
  30857. {
  30858. TCB_t * pxTCB;
  30859. TickType_t xItemValue;
  30860. BaseType_t xSwitchRequired = pdFALSE;
  30861. 802b924: 2400 movs r4, #0
  30862. 802b926: e006 b.n 802b936 <xTaskIncrementTick+0xde>
  30863. {
  30864. /* The delayed list is not empty, get the value of the
  30865. item at the head of the delayed list. This is the time
  30866. at which the task at the head of the delayed list must
  30867. be removed from the Blocked state. */
  30868. pxTCB = ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxDelayedTaskList );
  30869. 802b928: 683b ldr r3, [r7, #0]
  30870. 802b92a: 68db ldr r3, [r3, #12]
  30871. 802b92c: 68dd ldr r5, [r3, #12]
  30872. xItemValue = listGET_LIST_ITEM_VALUE( &( pxTCB->xGenericListItem ) );
  30873. 802b92e: 686b ldr r3, [r5, #4]
  30874. if( xConstTickCount < xItemValue )
  30875. 802b930: 429e cmp r6, r3
  30876. 802b932: d2c6 bcs.n 802b8c2 <xTaskIncrementTick+0x6a>
  30877. 802b934: e7c2 b.n 802b8bc <xTaskIncrementTick+0x64>
  30878. #endif
  30879. }
  30880. #if ( configUSE_PREEMPTION == 1 )
  30881. {
  30882. if( xYieldPending != pdFALSE )
  30883. 802b936: 4b0d ldr r3, [pc, #52] ; (802b96c <xTaskIncrementTick+0x114>)
  30884. 802b938: 681b ldr r3, [r3, #0]
  30885. {
  30886. xSwitchRequired = pdTRUE;
  30887. 802b93a: 2b00 cmp r3, #0
  30888. 802b93c: bf18 it ne
  30889. 802b93e: 2401 movne r4, #1
  30890. }
  30891. }
  30892. #endif /* configUSE_PREEMPTION */
  30893. return xSwitchRequired;
  30894. }
  30895. 802b940: 4620 mov r0, r4
  30896. 802b942: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc}
  30897. 802b946: bf00 nop
  30898. 802b948: 20000d0c .word 0x20000d0c
  30899. 802b94c: 20000d10 .word 0x20000d10
  30900. 802b950: 20000c44 .word 0x20000c44
  30901. 802b954: 20000d14 .word 0x20000d14
  30902. 802b958: 20000c40 .word 0x20000c40
  30903. 802b95c: 20000718 .word 0x20000718
  30904. 802b960: 20000cf4 .word 0x20000cf4
  30905. 802b964: 20000c7c .word 0x20000c7c
  30906. 802b968: 20000c78 .word 0x20000c78
  30907. 802b96c: 20000d38 .word 0x20000d38
  30908. 802b970: 20000d34 .word 0x20000d34
  30909. 0802b974 <xTaskResumeAll>:
  30910. #endif /* configUSE_TICKLESS_IDLE */
  30911. /*----------------------------------------------------------*/
  30912. BaseType_t xTaskResumeAll( void )
  30913. {
  30914. 802b974: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr}
  30915. TCB_t *pxTCB;
  30916. BaseType_t xAlreadyYielded = pdFALSE;
  30917. /* If uxSchedulerSuspended is zero then this function does not match a
  30918. previous call to vTaskSuspendAll(). */
  30919. configASSERT( uxSchedulerSuspended );
  30920. 802b978: 4c2c ldr r4, [pc, #176] ; (802ba2c <xTaskResumeAll+0xb8>)
  30921. 802b97a: 6823 ldr r3, [r4, #0]
  30922. 802b97c: b913 cbnz r3, 802b984 <xTaskResumeAll+0x10>
  30923. 802b97e: f000 fb03 bl 802bf88 <ulPortSetInterruptMask>
  30924. 802b982: e7fe b.n 802b982 <xTaskResumeAll+0xe>
  30925. /* It is possible that an ISR caused a task to be removed from an event
  30926. list while the scheduler was suspended. If this was the case then the
  30927. removed task will have been added to the xPendingReadyList. Once the
  30928. scheduler has been resumed it is safe to move all the pending ready
  30929. tasks from this list into their appropriate ready list. */
  30930. taskENTER_CRITICAL();
  30931. 802b984: f000 fb08 bl 802bf98 <vPortEnterCritical>
  30932. {
  30933. --uxSchedulerSuspended;
  30934. 802b988: 6823 ldr r3, [r4, #0]
  30935. 802b98a: 3b01 subs r3, #1
  30936. 802b98c: 6023 str r3, [r4, #0]
  30937. if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE )
  30938. 802b98e: 6823 ldr r3, [r4, #0]
  30939. 802b990: b10b cbz r3, 802b996 <xTaskResumeAll+0x22>
  30940. /*----------------------------------------------------------*/
  30941. BaseType_t xTaskResumeAll( void )
  30942. {
  30943. TCB_t *pxTCB;
  30944. BaseType_t xAlreadyYielded = pdFALSE;
  30945. 802b992: 2400 movs r4, #0
  30946. 802b994: e044 b.n 802ba20 <xTaskResumeAll+0xac>
  30947. {
  30948. --uxSchedulerSuspended;
  30949. if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE )
  30950. {
  30951. if( uxCurrentNumberOfTasks > ( UBaseType_t ) 0U )
  30952. 802b996: 4b26 ldr r3, [pc, #152] ; (802ba30 <xTaskResumeAll+0xbc>)
  30953. 802b998: 681b ldr r3, [r3, #0]
  30954. 802b99a: bb0b cbnz r3, 802b9e0 <xTaskResumeAll+0x6c>
  30955. 802b99c: e7f9 b.n 802b992 <xTaskResumeAll+0x1e>
  30956. {
  30957. /* Move any readied tasks from the pending list into the
  30958. appropriate ready list. */
  30959. while( listLIST_IS_EMPTY( &xPendingReadyList ) == pdFALSE )
  30960. {
  30961. pxTCB = ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( ( &xPendingReadyList ) );
  30962. 802b99e: 68f3 ldr r3, [r6, #12]
  30963. 802b9a0: 68dc ldr r4, [r3, #12]
  30964. ( void ) uxListRemove( &( pxTCB->xEventListItem ) );
  30965. ( void ) uxListRemove( &( pxTCB->xGenericListItem ) );
  30966. 802b9a2: f104 0804 add.w r8, r4, #4
  30967. /* Move any readied tasks from the pending list into the
  30968. appropriate ready list. */
  30969. while( listLIST_IS_EMPTY( &xPendingReadyList ) == pdFALSE )
  30970. {
  30971. pxTCB = ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( ( &xPendingReadyList ) );
  30972. ( void ) uxListRemove( &( pxTCB->xEventListItem ) );
  30973. 802b9a6: f104 0018 add.w r0, r4, #24
  30974. 802b9aa: f7ff faa1 bl 802aef0 <uxListRemove>
  30975. ( void ) uxListRemove( &( pxTCB->xGenericListItem ) );
  30976. 802b9ae: 4640 mov r0, r8
  30977. 802b9b0: f7ff fa9e bl 802aef0 <uxListRemove>
  30978. prvAddTaskToReadyList( pxTCB );
  30979. 802b9b4: 6ae3 ldr r3, [r4, #44] ; 0x2c
  30980. 802b9b6: 682a ldr r2, [r5, #0]
  30981. 802b9b8: 2701 movs r7, #1
  30982. 802b9ba: fa07 f103 lsl.w r1, r7, r3
  30983. 802b9be: 2014 movs r0, #20
  30984. 802b9c0: 430a orrs r2, r1
  30985. 802b9c2: fb00 9003 mla r0, r0, r3, r9
  30986. 802b9c6: 4641 mov r1, r8
  30987. 802b9c8: 602a str r2, [r5, #0]
  30988. 802b9ca: f7ff fa6d bl 802aea8 <vListInsertEnd>
  30989. /* If the moved task has a priority higher than the current
  30990. task then a yield must be performed. */
  30991. if( pxTCB->uxPriority >= pxCurrentTCB->uxPriority )
  30992. 802b9ce: 4b19 ldr r3, [pc, #100] ; (802ba34 <xTaskResumeAll+0xc0>)
  30993. 802b9d0: 6ae2 ldr r2, [r4, #44] ; 0x2c
  30994. 802b9d2: 681b ldr r3, [r3, #0]
  30995. 802b9d4: 6adb ldr r3, [r3, #44] ; 0x2c
  30996. 802b9d6: 429a cmp r2, r3
  30997. 802b9d8: d306 bcc.n 802b9e8 <xTaskResumeAll+0x74>
  30998. {
  30999. xYieldPending = pdTRUE;
  31000. 802b9da: 4b17 ldr r3, [pc, #92] ; (802ba38 <xTaskResumeAll+0xc4>)
  31001. 802b9dc: 601f str r7, [r3, #0]
  31002. 802b9de: e003 b.n 802b9e8 <xTaskResumeAll+0x74>
  31003. {
  31004. if( uxCurrentNumberOfTasks > ( UBaseType_t ) 0U )
  31005. {
  31006. /* Move any readied tasks from the pending list into the
  31007. appropriate ready list. */
  31008. while( listLIST_IS_EMPTY( &xPendingReadyList ) == pdFALSE )
  31009. 802b9e0: 4e16 ldr r6, [pc, #88] ; (802ba3c <xTaskResumeAll+0xc8>)
  31010. {
  31011. pxTCB = ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( ( &xPendingReadyList ) );
  31012. ( void ) uxListRemove( &( pxTCB->xEventListItem ) );
  31013. ( void ) uxListRemove( &( pxTCB->xGenericListItem ) );
  31014. prvAddTaskToReadyList( pxTCB );
  31015. 802b9e2: 4d17 ldr r5, [pc, #92] ; (802ba40 <xTaskResumeAll+0xcc>)
  31016. 802b9e4: f8df 9060 ldr.w r9, [pc, #96] ; 802ba48 <xTaskResumeAll+0xd4>
  31017. {
  31018. if( uxCurrentNumberOfTasks > ( UBaseType_t ) 0U )
  31019. {
  31020. /* Move any readied tasks from the pending list into the
  31021. appropriate ready list. */
  31022. while( listLIST_IS_EMPTY( &xPendingReadyList ) == pdFALSE )
  31023. 802b9e8: 6833 ldr r3, [r6, #0]
  31024. 802b9ea: 2b00 cmp r3, #0
  31025. 802b9ec: d1d7 bne.n 802b99e <xTaskResumeAll+0x2a>
  31026. /* If any ticks occurred while the scheduler was suspended then
  31027. they should be processed now. This ensures the tick count does
  31028. not slip, and that any delayed tasks are resumed at the correct
  31029. time. */
  31030. if( uxPendedTicks > ( UBaseType_t ) 0U )
  31031. 802b9ee: 4c15 ldr r4, [pc, #84] ; (802ba44 <xTaskResumeAll+0xd0>)
  31032. 802b9f0: 6823 ldr r3, [r4, #0]
  31033. 802b9f2: b96b cbnz r3, 802ba10 <xTaskResumeAll+0x9c>
  31034. else
  31035. {
  31036. mtCOVERAGE_TEST_MARKER();
  31037. }
  31038. if( xYieldPending == pdTRUE )
  31039. 802b9f4: 4b10 ldr r3, [pc, #64] ; (802ba38 <xTaskResumeAll+0xc4>)
  31040. 802b9f6: 681c ldr r4, [r3, #0]
  31041. 802b9f8: 2c01 cmp r4, #1
  31042. 802b9fa: d1ca bne.n 802b992 <xTaskResumeAll+0x1e>
  31043. 802b9fc: e00e b.n 802ba1c <xTaskResumeAll+0xa8>
  31044. time. */
  31045. if( uxPendedTicks > ( UBaseType_t ) 0U )
  31046. {
  31047. while( uxPendedTicks > ( UBaseType_t ) 0U )
  31048. {
  31049. if( xTaskIncrementTick() != pdFALSE )
  31050. 802b9fe: f7ff ff2b bl 802b858 <xTaskIncrementTick>
  31051. 802ba02: b108 cbz r0, 802ba08 <xTaskResumeAll+0x94>
  31052. {
  31053. xYieldPending = pdTRUE;
  31054. 802ba04: 2301 movs r3, #1
  31055. 802ba06: 6033 str r3, [r6, #0]
  31056. }
  31057. else
  31058. {
  31059. mtCOVERAGE_TEST_MARKER();
  31060. }
  31061. --uxPendedTicks;
  31062. 802ba08: 682b ldr r3, [r5, #0]
  31063. 802ba0a: 3b01 subs r3, #1
  31064. 802ba0c: 602b str r3, [r5, #0]
  31065. 802ba0e: e001 b.n 802ba14 <xTaskResumeAll+0xa0>
  31066. {
  31067. while( uxPendedTicks > ( UBaseType_t ) 0U )
  31068. {
  31069. if( xTaskIncrementTick() != pdFALSE )
  31070. {
  31071. xYieldPending = pdTRUE;
  31072. 802ba10: 4e09 ldr r6, [pc, #36] ; (802ba38 <xTaskResumeAll+0xc4>)
  31073. 802ba12: 4625 mov r5, r4
  31074. they should be processed now. This ensures the tick count does
  31075. not slip, and that any delayed tasks are resumed at the correct
  31076. time. */
  31077. if( uxPendedTicks > ( UBaseType_t ) 0U )
  31078. {
  31079. while( uxPendedTicks > ( UBaseType_t ) 0U )
  31080. 802ba14: 6823 ldr r3, [r4, #0]
  31081. 802ba16: 2b00 cmp r3, #0
  31082. 802ba18: d1f1 bne.n 802b9fe <xTaskResumeAll+0x8a>
  31083. 802ba1a: e7eb b.n 802b9f4 <xTaskResumeAll+0x80>
  31084. #if( configUSE_PREEMPTION != 0 )
  31085. {
  31086. xAlreadyYielded = pdTRUE;
  31087. }
  31088. #endif
  31089. taskYIELD_IF_USING_PREEMPTION();
  31090. 802ba1c: f000 faa8 bl 802bf70 <vPortYield>
  31091. else
  31092. {
  31093. mtCOVERAGE_TEST_MARKER();
  31094. }
  31095. }
  31096. taskEXIT_CRITICAL();
  31097. 802ba20: f000 fae6 bl 802bff0 <vPortExitCritical>
  31098. return xAlreadyYielded;
  31099. }
  31100. 802ba24: 4620 mov r0, r4
  31101. 802ba26: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc}
  31102. 802ba2a: bf00 nop
  31103. 802ba2c: 20000d0c .word 0x20000d0c
  31104. 802ba30: 20000d1c .word 0x20000d1c
  31105. 802ba34: 20000cf4 .word 0x20000cf4
  31106. 802ba38: 20000d38 .word 0x20000d38
  31107. 802ba3c: 20000cf8 .word 0x20000cf8
  31108. 802ba40: 20000d34 .word 0x20000d34
  31109. 802ba44: 20000c78 .word 0x20000c78
  31110. 802ba48: 20000c7c .word 0x20000c7c
  31111. 0802ba4c <prvIdleTask>:
  31112. *
  31113. * void prvIdleTask( void *pvParameters );
  31114. *
  31115. */
  31116. static portTASK_FUNCTION( prvIdleTask, pvParameters )
  31117. {
  31118. 802ba4c: b5f8 push {r3, r4, r5, r6, r7, lr}
  31119. {
  31120. BaseType_t xListIsEmpty;
  31121. /* ucTasksDeleted is used to prevent vTaskSuspendAll() being called
  31122. too often in the idle task. */
  31123. while( uxTasksDeleted > ( UBaseType_t ) 0U )
  31124. 802ba4e: 4c14 ldr r4, [pc, #80] ; (802baa0 <prvIdleTask+0x54>)
  31125. {
  31126. vTaskSuspendAll();
  31127. {
  31128. xListIsEmpty = listLIST_IS_EMPTY( &xTasksWaitingTermination );
  31129. 802ba50: 4e14 ldr r6, [pc, #80] ; (802baa4 <prvIdleTask+0x58>)
  31130. taskENTER_CRITICAL();
  31131. {
  31132. pxTCB = ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( ( &xTasksWaitingTermination ) );
  31133. ( void ) uxListRemove( &( pxTCB->xGenericListItem ) );
  31134. --uxCurrentNumberOfTasks;
  31135. 802ba52: 4f15 ldr r7, [pc, #84] ; (802baa8 <prvIdleTask+0x5c>)
  31136. {
  31137. BaseType_t xListIsEmpty;
  31138. /* ucTasksDeleted is used to prevent vTaskSuspendAll() being called
  31139. too often in the idle task. */
  31140. while( uxTasksDeleted > ( UBaseType_t ) 0U )
  31141. 802ba54: 6823 ldr r3, [r4, #0]
  31142. 802ba56: b1e3 cbz r3, 802ba92 <prvIdleTask+0x46>
  31143. {
  31144. vTaskSuspendAll();
  31145. 802ba58: f7ff fef0 bl 802b83c <vTaskSuspendAll>
  31146. {
  31147. xListIsEmpty = listLIST_IS_EMPTY( &xTasksWaitingTermination );
  31148. 802ba5c: 6835 ldr r5, [r6, #0]
  31149. }
  31150. ( void ) xTaskResumeAll();
  31151. 802ba5e: f7ff ff89 bl 802b974 <xTaskResumeAll>
  31152. if( xListIsEmpty == pdFALSE )
  31153. 802ba62: 2d00 cmp r5, #0
  31154. 802ba64: d0f6 beq.n 802ba54 <prvIdleTask+0x8>
  31155. {
  31156. TCB_t *pxTCB;
  31157. taskENTER_CRITICAL();
  31158. 802ba66: f000 fa97 bl 802bf98 <vPortEnterCritical>
  31159. {
  31160. pxTCB = ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( ( &xTasksWaitingTermination ) );
  31161. 802ba6a: 68f3 ldr r3, [r6, #12]
  31162. 802ba6c: 68dd ldr r5, [r3, #12]
  31163. ( void ) uxListRemove( &( pxTCB->xGenericListItem ) );
  31164. 802ba6e: 1d28 adds r0, r5, #4
  31165. 802ba70: f7ff fa3e bl 802aef0 <uxListRemove>
  31166. --uxCurrentNumberOfTasks;
  31167. 802ba74: 683b ldr r3, [r7, #0]
  31168. 802ba76: 3b01 subs r3, #1
  31169. 802ba78: 603b str r3, [r7, #0]
  31170. --uxTasksDeleted;
  31171. 802ba7a: 6823 ldr r3, [r4, #0]
  31172. 802ba7c: 3b01 subs r3, #1
  31173. 802ba7e: 6023 str r3, [r4, #0]
  31174. }
  31175. taskEXIT_CRITICAL();
  31176. 802ba80: f000 fab6 bl 802bff0 <vPortExitCritical>
  31177. vPortFreeAligned( pxTCB->pxStack );
  31178. }
  31179. }
  31180. #else
  31181. {
  31182. vPortFreeAligned( pxTCB->pxStack );
  31183. 802ba84: 6b28 ldr r0, [r5, #48] ; 0x30
  31184. 802ba86: f000 fc1b bl 802c2c0 <vPortFree>
  31185. }
  31186. #endif
  31187. vPortFree( pxTCB );
  31188. 802ba8a: 4628 mov r0, r5
  31189. 802ba8c: f000 fc18 bl 802c2c0 <vPortFree>
  31190. 802ba90: e7e0 b.n 802ba54 <prvIdleTask+0x8>
  31191. A critical region is not required here as we are just reading from
  31192. the list, and an occasional incorrect value will not matter. If
  31193. the ready list at the idle priority contains more than one task
  31194. then a task other than the idle task is ready to execute. */
  31195. if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ tskIDLE_PRIORITY ] ) ) > ( UBaseType_t ) 1 )
  31196. 802ba92: 4b06 ldr r3, [pc, #24] ; (802baac <prvIdleTask+0x60>)
  31197. 802ba94: 681b ldr r3, [r3, #0]
  31198. 802ba96: 2b01 cmp r3, #1
  31199. 802ba98: d9dc bls.n 802ba54 <prvIdleTask+0x8>
  31200. {
  31201. taskYIELD();
  31202. 802ba9a: f000 fa69 bl 802bf70 <vPortYield>
  31203. 802ba9e: e7d9 b.n 802ba54 <prvIdleTask+0x8>
  31204. 802baa0: 20000c4c .word 0x20000c4c
  31205. 802baa4: 20000ce0 .word 0x20000ce0
  31206. 802baa8: 20000d1c .word 0x20000d1c
  31207. 802baac: 20000c7c .word 0x20000c7c
  31208. 0802bab0 <vTaskDelay>:
  31209. /*-----------------------------------------------------------*/
  31210. #if ( INCLUDE_vTaskDelay == 1 )
  31211. void vTaskDelay( const TickType_t xTicksToDelay )
  31212. {
  31213. 802bab0: b538 push {r3, r4, r5, lr}
  31214. TickType_t xTimeToWake;
  31215. BaseType_t xAlreadyYielded = pdFALSE;
  31216. /* A delay time of zero just forces a reschedule. */
  31217. if( xTicksToDelay > ( TickType_t ) 0U )
  31218. 802bab2: 4604 mov r4, r0
  31219. 802bab4: b918 cbnz r0, 802babe <vTaskDelay+0xe>
  31220. }
  31221. else
  31222. {
  31223. mtCOVERAGE_TEST_MARKER();
  31224. }
  31225. }
  31226. 802bab6: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr}
  31227. /* Force a reschedule if xTaskResumeAll has not already done so, we may
  31228. have put ourselves to sleep. */
  31229. if( xAlreadyYielded == pdFALSE )
  31230. {
  31231. portYIELD_WITHIN_API();
  31232. 802baba: f000 ba59 b.w 802bf70 <vPortYield>
  31233. /* A delay time of zero just forces a reschedule. */
  31234. if( xTicksToDelay > ( TickType_t ) 0U )
  31235. {
  31236. configASSERT( uxSchedulerSuspended == 0 );
  31237. 802babe: 4b11 ldr r3, [pc, #68] ; (802bb04 <vTaskDelay+0x54>)
  31238. 802bac0: 681b ldr r3, [r3, #0]
  31239. 802bac2: b113 cbz r3, 802baca <vTaskDelay+0x1a>
  31240. 802bac4: f000 fa60 bl 802bf88 <ulPortSetInterruptMask>
  31241. 802bac8: e7fe b.n 802bac8 <vTaskDelay+0x18>
  31242. vTaskSuspendAll();
  31243. 802baca: f7ff feb7 bl 802b83c <vTaskSuspendAll>
  31244. This task cannot be in an event list as it is the currently
  31245. executing task. */
  31246. /* Calculate the time to wake - this may overflow but this is
  31247. not a problem. */
  31248. xTimeToWake = xTickCount + xTicksToDelay;
  31249. 802bace: 4b0e ldr r3, [pc, #56] ; (802bb08 <vTaskDelay+0x58>)
  31250. 802bad0: 681d ldr r5, [r3, #0]
  31251. 802bad2: 1965 adds r5, r4, r5
  31252. /* We must remove ourselves from the ready list before adding
  31253. ourselves to the blocked list as the same list item is used for
  31254. both lists. */
  31255. if( uxListRemove( &( pxCurrentTCB->xGenericListItem ) ) == ( UBaseType_t ) 0 )
  31256. 802bad4: 4c0d ldr r4, [pc, #52] ; (802bb0c <vTaskDelay+0x5c>)
  31257. 802bad6: 6820 ldr r0, [r4, #0]
  31258. 802bad8: 3004 adds r0, #4
  31259. 802bada: f7ff fa09 bl 802aef0 <uxListRemove>
  31260. 802bade: b948 cbnz r0, 802baf4 <vTaskDelay+0x44>
  31261. {
  31262. /* The current task must be in a ready list, so there is
  31263. no need to check, and the port reset macro can be called
  31264. directly. */
  31265. portRESET_READY_PRIORITY( pxCurrentTCB->uxPriority, uxTopReadyPriority );
  31266. 802bae0: 4b0b ldr r3, [pc, #44] ; (802bb10 <vTaskDelay+0x60>)
  31267. 802bae2: 6819 ldr r1, [r3, #0]
  31268. 802bae4: 6822 ldr r2, [r4, #0]
  31269. 802bae6: 6ad2 ldr r2, [r2, #44] ; 0x2c
  31270. 802bae8: 2001 movs r0, #1
  31271. 802baea: fa00 f202 lsl.w r2, r0, r2
  31272. 802baee: ea21 0202 bic.w r2, r1, r2
  31273. 802baf2: 601a str r2, [r3, #0]
  31274. }
  31275. else
  31276. {
  31277. mtCOVERAGE_TEST_MARKER();
  31278. }
  31279. prvAddCurrentTaskToDelayedList( xTimeToWake );
  31280. 802baf4: 4628 mov r0, r5
  31281. 802baf6: f7ff fd19 bl 802b52c <prvAddCurrentTaskToDelayedList>
  31282. }
  31283. xAlreadyYielded = xTaskResumeAll();
  31284. 802bafa: f7ff ff3b bl 802b974 <xTaskResumeAll>
  31285. mtCOVERAGE_TEST_MARKER();
  31286. }
  31287. /* Force a reschedule if xTaskResumeAll has not already done so, we may
  31288. have put ourselves to sleep. */
  31289. if( xAlreadyYielded == pdFALSE )
  31290. 802bafe: 2800 cmp r0, #0
  31291. 802bb00: d0d9 beq.n 802bab6 <vTaskDelay+0x6>
  31292. }
  31293. else
  31294. {
  31295. mtCOVERAGE_TEST_MARKER();
  31296. }
  31297. }
  31298. 802bb02: bd38 pop {r3, r4, r5, pc}
  31299. 802bb04: 20000d0c .word 0x20000d0c
  31300. 802bb08: 20000d10 .word 0x20000d10
  31301. 802bb0c: 20000cf4 .word 0x20000cf4
  31302. 802bb10: 20000d34 .word 0x20000d34
  31303. 0802bb14 <vTaskDelayUntil>:
  31304. /*-----------------------------------------------------------*/
  31305. #if ( INCLUDE_vTaskDelayUntil == 1 )
  31306. void vTaskDelayUntil( TickType_t * const pxPreviousWakeTime, const TickType_t xTimeIncrement )
  31307. {
  31308. 802bb14: b570 push {r4, r5, r6, lr}
  31309. 802bb16: 460c mov r4, r1
  31310. TickType_t xTimeToWake;
  31311. BaseType_t xAlreadyYielded, xShouldDelay = pdFALSE;
  31312. configASSERT( pxPreviousWakeTime );
  31313. 802bb18: 4605 mov r5, r0
  31314. 802bb1a: b910 cbnz r0, 802bb22 <vTaskDelayUntil+0xe>
  31315. 802bb1c: f000 fa34 bl 802bf88 <ulPortSetInterruptMask>
  31316. 802bb20: e7fe b.n 802bb20 <vTaskDelayUntil+0xc>
  31317. configASSERT( ( xTimeIncrement > 0U ) );
  31318. 802bb22: b911 cbnz r1, 802bb2a <vTaskDelayUntil+0x16>
  31319. 802bb24: f000 fa30 bl 802bf88 <ulPortSetInterruptMask>
  31320. 802bb28: e7fe b.n 802bb28 <vTaskDelayUntil+0x14>
  31321. configASSERT( uxSchedulerSuspended == 0 );
  31322. 802bb2a: 4b1c ldr r3, [pc, #112] ; (802bb9c <vTaskDelayUntil+0x88>)
  31323. 802bb2c: 681e ldr r6, [r3, #0]
  31324. 802bb2e: b116 cbz r6, 802bb36 <vTaskDelayUntil+0x22>
  31325. 802bb30: f000 fa2a bl 802bf88 <ulPortSetInterruptMask>
  31326. 802bb34: e7fe b.n 802bb34 <vTaskDelayUntil+0x20>
  31327. vTaskSuspendAll();
  31328. 802bb36: f7ff fe81 bl 802b83c <vTaskSuspendAll>
  31329. {
  31330. /* Minor optimisation. The tick count cannot change in this
  31331. block. */
  31332. const TickType_t xConstTickCount = xTickCount;
  31333. 802bb3a: 4b19 ldr r3, [pc, #100] ; (802bba0 <vTaskDelayUntil+0x8c>)
  31334. /* Generate the tick time at which the task wants to wake. */
  31335. xTimeToWake = *pxPreviousWakeTime + xTimeIncrement;
  31336. 802bb3c: 682a ldr r2, [r5, #0]
  31337. vTaskSuspendAll();
  31338. {
  31339. /* Minor optimisation. The tick count cannot change in this
  31340. block. */
  31341. const TickType_t xConstTickCount = xTickCount;
  31342. 802bb3e: 6818 ldr r0, [r3, #0]
  31343. /* Generate the tick time at which the task wants to wake. */
  31344. xTimeToWake = *pxPreviousWakeTime + xTimeIncrement;
  31345. if( xConstTickCount < *pxPreviousWakeTime )
  31346. 802bb40: 4290 cmp r0, r2
  31347. /* Minor optimisation. The tick count cannot change in this
  31348. block. */
  31349. const TickType_t xConstTickCount = xTickCount;
  31350. /* Generate the tick time at which the task wants to wake. */
  31351. xTimeToWake = *pxPreviousWakeTime + xTimeIncrement;
  31352. 802bb42: 4414 add r4, r2
  31353. if( xConstTickCount < *pxPreviousWakeTime )
  31354. 802bb44: d202 bcs.n 802bb4c <vTaskDelayUntil+0x38>
  31355. /* The tick count has overflowed since this function was
  31356. lasted called. In this case the only time we should ever
  31357. actually delay is if the wake time has also overflowed,
  31358. and the wake time is greater than the tick time. When this
  31359. is the case it is as if neither time had overflowed. */
  31360. if( ( xTimeToWake < *pxPreviousWakeTime ) && ( xTimeToWake > xConstTickCount ) )
  31361. 802bb46: 4294 cmp r4, r2
  31362. 802bb48: d207 bcs.n 802bb5a <vTaskDelayUntil+0x46>
  31363. 802bb4a: e001 b.n 802bb50 <vTaskDelayUntil+0x3c>
  31364. else
  31365. {
  31366. /* The tick time has not overflowed. In this case we will
  31367. delay if either the wake time has overflowed, and/or the
  31368. tick time is less than the wake time. */
  31369. if( ( xTimeToWake < *pxPreviousWakeTime ) || ( xTimeToWake > xConstTickCount ) )
  31370. 802bb4c: 4294 cmp r4, r2
  31371. 802bb4e: d306 bcc.n 802bb5e <vTaskDelayUntil+0x4a>
  31372. 802bb50: 4284 cmp r4, r0
  31373. 802bb52: bf94 ite ls
  31374. 802bb54: 2300 movls r3, #0
  31375. 802bb56: 2301 movhi r3, #1
  31376. 802bb58: e002 b.n 802bb60 <vTaskDelayUntil+0x4c>
  31377. #if ( INCLUDE_vTaskDelayUntil == 1 )
  31378. void vTaskDelayUntil( TickType_t * const pxPreviousWakeTime, const TickType_t xTimeIncrement )
  31379. {
  31380. TickType_t xTimeToWake;
  31381. BaseType_t xAlreadyYielded, xShouldDelay = pdFALSE;
  31382. 802bb5a: 4633 mov r3, r6
  31383. 802bb5c: e000 b.n 802bb60 <vTaskDelayUntil+0x4c>
  31384. /* The tick time has not overflowed. In this case we will
  31385. delay if either the wake time has overflowed, and/or the
  31386. tick time is less than the wake time. */
  31387. if( ( xTimeToWake < *pxPreviousWakeTime ) || ( xTimeToWake > xConstTickCount ) )
  31388. {
  31389. xShouldDelay = pdTRUE;
  31390. 802bb5e: 2301 movs r3, #1
  31391. mtCOVERAGE_TEST_MARKER();
  31392. }
  31393. }
  31394. /* Update the wake time ready for the next call. */
  31395. *pxPreviousWakeTime = xTimeToWake;
  31396. 802bb60: 602c str r4, [r5, #0]
  31397. if( xShouldDelay != pdFALSE )
  31398. 802bb62: b193 cbz r3, 802bb8a <vTaskDelayUntil+0x76>
  31399. {
  31400. traceTASK_DELAY_UNTIL();
  31401. /* Remove the task from the ready list before adding it to the
  31402. blocked list as the same list item is used for both lists. */
  31403. if( uxListRemove( &( pxCurrentTCB->xGenericListItem ) ) == ( UBaseType_t ) 0 )
  31404. 802bb64: 4d0f ldr r5, [pc, #60] ; (802bba4 <vTaskDelayUntil+0x90>)
  31405. 802bb66: 6828 ldr r0, [r5, #0]
  31406. 802bb68: 3004 adds r0, #4
  31407. 802bb6a: f7ff f9c1 bl 802aef0 <uxListRemove>
  31408. 802bb6e: b948 cbnz r0, 802bb84 <vTaskDelayUntil+0x70>
  31409. {
  31410. /* The current task must be in a ready list, so there is
  31411. no need to check, and the port reset macro can be called
  31412. directly. */
  31413. portRESET_READY_PRIORITY( pxCurrentTCB->uxPriority, uxTopReadyPriority );
  31414. 802bb70: 4b0d ldr r3, [pc, #52] ; (802bba8 <vTaskDelayUntil+0x94>)
  31415. 802bb72: 6819 ldr r1, [r3, #0]
  31416. 802bb74: 682a ldr r2, [r5, #0]
  31417. 802bb76: 6ad2 ldr r2, [r2, #44] ; 0x2c
  31418. 802bb78: 2001 movs r0, #1
  31419. 802bb7a: fa00 f202 lsl.w r2, r0, r2
  31420. 802bb7e: ea21 0202 bic.w r2, r1, r2
  31421. 802bb82: 601a str r2, [r3, #0]
  31422. else
  31423. {
  31424. mtCOVERAGE_TEST_MARKER();
  31425. }
  31426. prvAddCurrentTaskToDelayedList( xTimeToWake );
  31427. 802bb84: 4620 mov r0, r4
  31428. 802bb86: f7ff fcd1 bl 802b52c <prvAddCurrentTaskToDelayedList>
  31429. else
  31430. {
  31431. mtCOVERAGE_TEST_MARKER();
  31432. }
  31433. }
  31434. xAlreadyYielded = xTaskResumeAll();
  31435. 802bb8a: f7ff fef3 bl 802b974 <xTaskResumeAll>
  31436. /* Force a reschedule if xTaskResumeAll has not already done so, we may
  31437. have put ourselves to sleep. */
  31438. if( xAlreadyYielded == pdFALSE )
  31439. 802bb8e: b918 cbnz r0, 802bb98 <vTaskDelayUntil+0x84>
  31440. }
  31441. else
  31442. {
  31443. mtCOVERAGE_TEST_MARKER();
  31444. }
  31445. }
  31446. 802bb90: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
  31447. /* Force a reschedule if xTaskResumeAll has not already done so, we may
  31448. have put ourselves to sleep. */
  31449. if( xAlreadyYielded == pdFALSE )
  31450. {
  31451. portYIELD_WITHIN_API();
  31452. 802bb94: f000 b9ec b.w 802bf70 <vPortYield>
  31453. 802bb98: bd70 pop {r4, r5, r6, pc}
  31454. 802bb9a: bf00 nop
  31455. 802bb9c: 20000d0c .word 0x20000d0c
  31456. 802bba0: 20000d10 .word 0x20000d10
  31457. 802bba4: 20000cf4 .word 0x20000cf4
  31458. 802bba8: 20000d34 .word 0x20000d34
  31459. 0802bbac <vTaskSwitchContext>:
  31460. #endif /* configUSE_APPLICATION_TASK_TAG */
  31461. /*-----------------------------------------------------------*/
  31462. void vTaskSwitchContext( void )
  31463. {
  31464. 802bbac: b508 push {r3, lr}
  31465. if( uxSchedulerSuspended != ( UBaseType_t ) pdFALSE )
  31466. 802bbae: 4b12 ldr r3, [pc, #72] ; (802bbf8 <vTaskSwitchContext+0x4c>)
  31467. 802bbb0: 681a ldr r2, [r3, #0]
  31468. 802bbb2: 4b12 ldr r3, [pc, #72] ; (802bbfc <vTaskSwitchContext+0x50>)
  31469. 802bbb4: b10a cbz r2, 802bbba <vTaskSwitchContext+0xe>
  31470. {
  31471. /* The scheduler is currently suspended - do not allow a context
  31472. switch. */
  31473. xYieldPending = pdTRUE;
  31474. 802bbb6: 2201 movs r2, #1
  31475. 802bbb8: e01c b.n 802bbf4 <vTaskSwitchContext+0x48>
  31476. }
  31477. else
  31478. {
  31479. xYieldPending = pdFALSE;
  31480. 802bbba: 601a str r2, [r3, #0]
  31481. taskFIRST_CHECK_FOR_STACK_OVERFLOW();
  31482. taskSECOND_CHECK_FOR_STACK_OVERFLOW();
  31483. /* Select a new task to run using either the generic C or port
  31484. optimised asm code. */
  31485. taskSELECT_HIGHEST_PRIORITY_TASK();
  31486. 802bbbc: 4b10 ldr r3, [pc, #64] ; (802bc00 <vTaskSwitchContext+0x54>)
  31487. 802bbbe: 681a ldr r2, [r3, #0]
  31488. /* Generic helper function. */
  31489. __attribute__( ( always_inline ) ) static inline uint8_t ucPortCountLeadingZeros( uint32_t ulBitmap )
  31490. {
  31491. uint8_t ucReturn;
  31492. __asm volatile ( "clz %0, %1" : "=r" ( ucReturn ) : "r" ( ulBitmap ) );
  31493. 802bbc0: fab2 f282 clz r2, r2
  31494. 802bbc4: b2d2 uxtb r2, r2
  31495. 802bbc6: 2314 movs r3, #20
  31496. 802bbc8: f1c2 021f rsb r2, r2, #31
  31497. 802bbcc: 490d ldr r1, [pc, #52] ; (802bc04 <vTaskSwitchContext+0x58>)
  31498. 802bbce: 435a muls r2, r3
  31499. 802bbd0: 188b adds r3, r1, r2
  31500. 802bbd2: 588a ldr r2, [r1, r2]
  31501. 802bbd4: b912 cbnz r2, 802bbdc <vTaskSwitchContext+0x30>
  31502. 802bbd6: f000 f9d7 bl 802bf88 <ulPortSetInterruptMask>
  31503. 802bbda: e7fe b.n 802bbda <vTaskSwitchContext+0x2e>
  31504. 802bbdc: 685a ldr r2, [r3, #4]
  31505. 802bbde: 6852 ldr r2, [r2, #4]
  31506. 802bbe0: f103 0108 add.w r1, r3, #8
  31507. 802bbe4: 428a cmp r2, r1
  31508. 802bbe6: 605a str r2, [r3, #4]
  31509. 802bbe8: bf04 itt eq
  31510. 802bbea: 6852 ldreq r2, [r2, #4]
  31511. 802bbec: 605a streq r2, [r3, #4]
  31512. 802bbee: 685b ldr r3, [r3, #4]
  31513. 802bbf0: 68da ldr r2, [r3, #12]
  31514. 802bbf2: 4b05 ldr r3, [pc, #20] ; (802bc08 <vTaskSwitchContext+0x5c>)
  31515. 802bbf4: 601a str r2, [r3, #0]
  31516. 802bbf6: bd08 pop {r3, pc}
  31517. 802bbf8: 20000d0c .word 0x20000d0c
  31518. 802bbfc: 20000d38 .word 0x20000d38
  31519. 802bc00: 20000d34 .word 0x20000d34
  31520. 802bc04: 20000c7c .word 0x20000c7c
  31521. 802bc08: 20000cf4 .word 0x20000cf4
  31522. 0802bc0c <vTaskPlaceOnEventList>:
  31523. }
  31524. }
  31525. /*-----------------------------------------------------------*/
  31526. void vTaskPlaceOnEventList( List_t * const pxEventList, const TickType_t xTicksToWait )
  31527. {
  31528. 802bc0c: b538 push {r3, r4, r5, lr}
  31529. 802bc0e: 460d mov r5, r1
  31530. TickType_t xTimeToWake;
  31531. configASSERT( pxEventList );
  31532. 802bc10: b910 cbnz r0, 802bc18 <vTaskPlaceOnEventList+0xc>
  31533. 802bc12: f000 f9b9 bl 802bf88 <ulPortSetInterruptMask>
  31534. 802bc16: e7fe b.n 802bc16 <vTaskPlaceOnEventList+0xa>
  31535. /* Place the event list item of the TCB in the appropriate event list.
  31536. This is placed in the list in priority order so the highest priority task
  31537. is the first to be woken by the event. The queue that contains the event
  31538. list is locked, preventing simultaneous access from interrupts. */
  31539. vListInsert( pxEventList, &( pxCurrentTCB->xEventListItem ) );
  31540. 802bc18: 4c12 ldr r4, [pc, #72] ; (802bc64 <vTaskPlaceOnEventList+0x58>)
  31541. 802bc1a: 6821 ldr r1, [r4, #0]
  31542. 802bc1c: 3118 adds r1, #24
  31543. 802bc1e: f7ff f94f bl 802aec0 <vListInsert>
  31544. /* The task must be removed from from the ready list before it is added to
  31545. the blocked list as the same list item is used for both lists. Exclusive
  31546. access to the ready lists guaranteed because the scheduler is locked. */
  31547. if( uxListRemove( &( pxCurrentTCB->xGenericListItem ) ) == ( UBaseType_t ) 0 )
  31548. 802bc22: 6820 ldr r0, [r4, #0]
  31549. 802bc24: 3004 adds r0, #4
  31550. 802bc26: f7ff f963 bl 802aef0 <uxListRemove>
  31551. 802bc2a: b948 cbnz r0, 802bc40 <vTaskPlaceOnEventList+0x34>
  31552. {
  31553. /* The current task must be in a ready list, so there is no need to
  31554. check, and the port reset macro can be called directly. */
  31555. portRESET_READY_PRIORITY( pxCurrentTCB->uxPriority, uxTopReadyPriority );
  31556. 802bc2c: 4b0e ldr r3, [pc, #56] ; (802bc68 <vTaskPlaceOnEventList+0x5c>)
  31557. 802bc2e: 6819 ldr r1, [r3, #0]
  31558. 802bc30: 6822 ldr r2, [r4, #0]
  31559. 802bc32: 6ad2 ldr r2, [r2, #44] ; 0x2c
  31560. 802bc34: 2001 movs r0, #1
  31561. 802bc36: fa00 f202 lsl.w r2, r0, r2
  31562. 802bc3a: ea21 0202 bic.w r2, r1, r2
  31563. 802bc3e: 601a str r2, [r3, #0]
  31564. mtCOVERAGE_TEST_MARKER();
  31565. }
  31566. #if ( INCLUDE_vTaskSuspend == 1 )
  31567. {
  31568. if( xTicksToWait == portMAX_DELAY )
  31569. 802bc40: 1c69 adds r1, r5, #1
  31570. 802bc42: d107 bne.n 802bc54 <vTaskPlaceOnEventList+0x48>
  31571. {
  31572. /* Add the task to the suspended task list instead of a delayed task
  31573. list to ensure the task is not woken by a timing event. It will
  31574. block indefinitely. */
  31575. vListInsertEnd( &xSuspendedTaskList, &( pxCurrentTCB->xGenericListItem ) );
  31576. 802bc44: 4b07 ldr r3, [pc, #28] ; (802bc64 <vTaskPlaceOnEventList+0x58>)
  31577. 802bc46: 4809 ldr r0, [pc, #36] ; (802bc6c <vTaskPlaceOnEventList+0x60>)
  31578. 802bc48: 6819 ldr r1, [r3, #0]
  31579. 802bc4a: 3104 adds r1, #4
  31580. will handle it. */
  31581. xTimeToWake = xTickCount + xTicksToWait;
  31582. prvAddCurrentTaskToDelayedList( xTimeToWake );
  31583. }
  31584. #endif /* INCLUDE_vTaskSuspend */
  31585. }
  31586. 802bc4c: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr}
  31587. if( xTicksToWait == portMAX_DELAY )
  31588. {
  31589. /* Add the task to the suspended task list instead of a delayed task
  31590. list to ensure the task is not woken by a timing event. It will
  31591. block indefinitely. */
  31592. vListInsertEnd( &xSuspendedTaskList, &( pxCurrentTCB->xGenericListItem ) );
  31593. 802bc50: f7ff b92a b.w 802aea8 <vListInsertEnd>
  31594. else
  31595. {
  31596. /* Calculate the time at which the task should be woken if the event
  31597. does not occur. This may overflow but this doesn't matter, the
  31598. scheduler will handle it. */
  31599. xTimeToWake = xTickCount + xTicksToWait;
  31600. 802bc54: 4b06 ldr r3, [pc, #24] ; (802bc70 <vTaskPlaceOnEventList+0x64>)
  31601. 802bc56: 6818 ldr r0, [r3, #0]
  31602. prvAddCurrentTaskToDelayedList( xTimeToWake );
  31603. 802bc58: 1828 adds r0, r5, r0
  31604. will handle it. */
  31605. xTimeToWake = xTickCount + xTicksToWait;
  31606. prvAddCurrentTaskToDelayedList( xTimeToWake );
  31607. }
  31608. #endif /* INCLUDE_vTaskSuspend */
  31609. }
  31610. 802bc5a: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr}
  31611. {
  31612. /* Calculate the time at which the task should be woken if the event
  31613. does not occur. This may overflow but this doesn't matter, the
  31614. scheduler will handle it. */
  31615. xTimeToWake = xTickCount + xTicksToWait;
  31616. prvAddCurrentTaskToDelayedList( xTimeToWake );
  31617. 802bc5e: f7ff bc65 b.w 802b52c <prvAddCurrentTaskToDelayedList>
  31618. 802bc62: bf00 nop
  31619. 802bc64: 20000cf4 .word 0x20000cf4
  31620. 802bc68: 20000d34 .word 0x20000d34
  31621. 802bc6c: 20000d20 .word 0x20000d20
  31622. 802bc70: 20000d10 .word 0x20000d10
  31623. 0802bc74 <vTaskPlaceOnEventListRestricted>:
  31624. /*-----------------------------------------------------------*/
  31625. #if configUSE_TIMERS == 1
  31626. void vTaskPlaceOnEventListRestricted( List_t * const pxEventList, const TickType_t xTicksToWait )
  31627. {
  31628. 802bc74: b538 push {r3, r4, r5, lr}
  31629. 802bc76: 460d mov r5, r1
  31630. TickType_t xTimeToWake;
  31631. configASSERT( pxEventList );
  31632. 802bc78: b910 cbnz r0, 802bc80 <vTaskPlaceOnEventListRestricted+0xc>
  31633. 802bc7a: f000 f985 bl 802bf88 <ulPortSetInterruptMask>
  31634. 802bc7e: e7fe b.n 802bc7e <vTaskPlaceOnEventListRestricted+0xa>
  31635. /* Place the event list item of the TCB in the appropriate event list.
  31636. In this case it is assume that this is the only task that is going to
  31637. be waiting on this event list, so the faster vListInsertEnd() function
  31638. can be used in place of vListInsert. */
  31639. vListInsertEnd( pxEventList, &( pxCurrentTCB->xEventListItem ) );
  31640. 802bc80: 4c0d ldr r4, [pc, #52] ; (802bcb8 <vTaskPlaceOnEventListRestricted+0x44>)
  31641. 802bc82: 6821 ldr r1, [r4, #0]
  31642. 802bc84: 3118 adds r1, #24
  31643. 802bc86: f7ff f90f bl 802aea8 <vListInsertEnd>
  31644. /* We must remove this task from the ready list before adding it to the
  31645. blocked list as the same list item is used for both lists. This
  31646. function is called form a critical section. */
  31647. if( uxListRemove( &( pxCurrentTCB->xGenericListItem ) ) == ( UBaseType_t ) 0 )
  31648. 802bc8a: 6820 ldr r0, [r4, #0]
  31649. 802bc8c: 3004 adds r0, #4
  31650. 802bc8e: f7ff f92f bl 802aef0 <uxListRemove>
  31651. 802bc92: b948 cbnz r0, 802bca8 <vTaskPlaceOnEventListRestricted+0x34>
  31652. {
  31653. /* The current task must be in a ready list, so there is no need to
  31654. check, and the port reset macro can be called directly. */
  31655. portRESET_READY_PRIORITY( pxCurrentTCB->uxPriority, uxTopReadyPriority );
  31656. 802bc94: 4b09 ldr r3, [pc, #36] ; (802bcbc <vTaskPlaceOnEventListRestricted+0x48>)
  31657. 802bc96: 6819 ldr r1, [r3, #0]
  31658. 802bc98: 6822 ldr r2, [r4, #0]
  31659. 802bc9a: 6ad2 ldr r2, [r2, #44] ; 0x2c
  31660. 802bc9c: 2001 movs r0, #1
  31661. 802bc9e: fa00 f202 lsl.w r2, r0, r2
  31662. 802bca2: ea21 0202 bic.w r2, r1, r2
  31663. 802bca6: 601a str r2, [r3, #0]
  31664. mtCOVERAGE_TEST_MARKER();
  31665. }
  31666. /* Calculate the time at which the task should be woken if the event does
  31667. not occur. This may overflow but this doesn't matter. */
  31668. xTimeToWake = xTickCount + xTicksToWait;
  31669. 802bca8: 4b05 ldr r3, [pc, #20] ; (802bcc0 <vTaskPlaceOnEventListRestricted+0x4c>)
  31670. 802bcaa: 6818 ldr r0, [r3, #0]
  31671. traceTASK_DELAY_UNTIL();
  31672. prvAddCurrentTaskToDelayedList( xTimeToWake );
  31673. 802bcac: 1828 adds r0, r5, r0
  31674. }
  31675. 802bcae: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr}
  31676. /* Calculate the time at which the task should be woken if the event does
  31677. not occur. This may overflow but this doesn't matter. */
  31678. xTimeToWake = xTickCount + xTicksToWait;
  31679. traceTASK_DELAY_UNTIL();
  31680. prvAddCurrentTaskToDelayedList( xTimeToWake );
  31681. 802bcb2: f7ff bc3b b.w 802b52c <prvAddCurrentTaskToDelayedList>
  31682. 802bcb6: bf00 nop
  31683. 802bcb8: 20000cf4 .word 0x20000cf4
  31684. 802bcbc: 20000d34 .word 0x20000d34
  31685. 802bcc0: 20000d10 .word 0x20000d10
  31686. 0802bcc4 <xTaskRemoveFromEventList>:
  31687. #endif /* configUSE_TIMERS */
  31688. /*-----------------------------------------------------------*/
  31689. BaseType_t xTaskRemoveFromEventList( const List_t * const pxEventList )
  31690. {
  31691. 802bcc4: b538 push {r3, r4, r5, lr}
  31692. get called - the lock count on the queue will get modified instead. This
  31693. means exclusive access to the event list is guaranteed here.
  31694. This function assumes that a check has already been made to ensure that
  31695. pxEventList is not empty. */
  31696. pxUnblockedTCB = ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxEventList );
  31697. 802bcc6: 68c3 ldr r3, [r0, #12]
  31698. 802bcc8: 68dc ldr r4, [r3, #12]
  31699. configASSERT( pxUnblockedTCB );
  31700. 802bcca: b914 cbnz r4, 802bcd2 <xTaskRemoveFromEventList+0xe>
  31701. 802bccc: f000 f95c bl 802bf88 <ulPortSetInterruptMask>
  31702. 802bcd0: e7fe b.n 802bcd0 <xTaskRemoveFromEventList+0xc>
  31703. ( void ) uxListRemove( &( pxUnblockedTCB->xEventListItem ) );
  31704. 802bcd2: f104 0518 add.w r5, r4, #24
  31705. 802bcd6: 4628 mov r0, r5
  31706. 802bcd8: f7ff f90a bl 802aef0 <uxListRemove>
  31707. if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE )
  31708. 802bcdc: 4b11 ldr r3, [pc, #68] ; (802bd24 <xTaskRemoveFromEventList+0x60>)
  31709. 802bcde: 681b ldr r3, [r3, #0]
  31710. 802bce0: b983 cbnz r3, 802bd04 <xTaskRemoveFromEventList+0x40>
  31711. {
  31712. ( void ) uxListRemove( &( pxUnblockedTCB->xGenericListItem ) );
  31713. 802bce2: 1d25 adds r5, r4, #4
  31714. 802bce4: 4628 mov r0, r5
  31715. 802bce6: f7ff f903 bl 802aef0 <uxListRemove>
  31716. prvAddTaskToReadyList( pxUnblockedTCB );
  31717. 802bcea: 4a0f ldr r2, [pc, #60] ; (802bd28 <xTaskRemoveFromEventList+0x64>)
  31718. 802bcec: 6ae3 ldr r3, [r4, #44] ; 0x2c
  31719. 802bcee: 6810 ldr r0, [r2, #0]
  31720. 802bcf0: 2101 movs r1, #1
  31721. 802bcf2: fa01 f103 lsl.w r1, r1, r3
  31722. 802bcf6: 4301 orrs r1, r0
  31723. 802bcf8: 6011 str r1, [r2, #0]
  31724. 802bcfa: 4a0c ldr r2, [pc, #48] ; (802bd2c <xTaskRemoveFromEventList+0x68>)
  31725. 802bcfc: 2014 movs r0, #20
  31726. 802bcfe: fb00 2003 mla r0, r0, r3, r2
  31727. 802bd02: e000 b.n 802bd06 <xTaskRemoveFromEventList+0x42>
  31728. }
  31729. else
  31730. {
  31731. /* The delayed and ready lists cannot be accessed, so hold this task
  31732. pending until the scheduler is resumed. */
  31733. vListInsertEnd( &( xPendingReadyList ), &( pxUnblockedTCB->xEventListItem ) );
  31734. 802bd04: 480a ldr r0, [pc, #40] ; (802bd30 <xTaskRemoveFromEventList+0x6c>)
  31735. 802bd06: 4629 mov r1, r5
  31736. 802bd08: f7ff f8ce bl 802aea8 <vListInsertEnd>
  31737. }
  31738. if( pxUnblockedTCB->uxPriority > pxCurrentTCB->uxPriority )
  31739. 802bd0c: 4b09 ldr r3, [pc, #36] ; (802bd34 <xTaskRemoveFromEventList+0x70>)
  31740. 802bd0e: 6ae2 ldr r2, [r4, #44] ; 0x2c
  31741. 802bd10: 681b ldr r3, [r3, #0]
  31742. 802bd12: 6adb ldr r3, [r3, #44] ; 0x2c
  31743. 802bd14: 429a cmp r2, r3
  31744. 802bd16: d903 bls.n 802bd20 <xTaskRemoveFromEventList+0x5c>
  31745. it should force a context switch now. */
  31746. xReturn = pdTRUE;
  31747. /* Mark that a yield is pending in case the user is not using the
  31748. "xHigherPriorityTaskWoken" parameter to an ISR safe FreeRTOS function. */
  31749. xYieldPending = pdTRUE;
  31750. 802bd18: 4b07 ldr r3, [pc, #28] ; (802bd38 <xTaskRemoveFromEventList+0x74>)
  31751. 802bd1a: 2001 movs r0, #1
  31752. 802bd1c: 6018 str r0, [r3, #0]
  31753. 802bd1e: bd38 pop {r3, r4, r5, pc}
  31754. }
  31755. else
  31756. {
  31757. xReturn = pdFALSE;
  31758. 802bd20: 2000 movs r0, #0
  31759. prvResetNextTaskUnblockTime();
  31760. }
  31761. #endif
  31762. return xReturn;
  31763. }
  31764. 802bd22: bd38 pop {r3, r4, r5, pc}
  31765. 802bd24: 20000d0c .word 0x20000d0c
  31766. 802bd28: 20000d34 .word 0x20000d34
  31767. 802bd2c: 20000c7c .word 0x20000c7c
  31768. 802bd30: 20000cf8 .word 0x20000cf8
  31769. 802bd34: 20000cf4 .word 0x20000cf4
  31770. 802bd38: 20000d38 .word 0x20000d38
  31771. 0802bd3c <vTaskSetTimeOutState>:
  31772. return xReturn;
  31773. }
  31774. /*-----------------------------------------------------------*/
  31775. void vTaskSetTimeOutState( TimeOut_t * const pxTimeOut )
  31776. {
  31777. 802bd3c: b508 push {r3, lr}
  31778. configASSERT( pxTimeOut );
  31779. 802bd3e: b910 cbnz r0, 802bd46 <vTaskSetTimeOutState+0xa>
  31780. 802bd40: f000 f922 bl 802bf88 <ulPortSetInterruptMask>
  31781. 802bd44: e7fe b.n 802bd44 <vTaskSetTimeOutState+0x8>
  31782. pxTimeOut->xOverflowCount = xNumOfOverflows;
  31783. 802bd46: 4b03 ldr r3, [pc, #12] ; (802bd54 <vTaskSetTimeOutState+0x18>)
  31784. 802bd48: 681b ldr r3, [r3, #0]
  31785. 802bd4a: 6003 str r3, [r0, #0]
  31786. pxTimeOut->xTimeOnEntering = xTickCount;
  31787. 802bd4c: 4b02 ldr r3, [pc, #8] ; (802bd58 <vTaskSetTimeOutState+0x1c>)
  31788. 802bd4e: 681b ldr r3, [r3, #0]
  31789. 802bd50: 6043 str r3, [r0, #4]
  31790. 802bd52: bd08 pop {r3, pc}
  31791. 802bd54: 20000c40 .word 0x20000c40
  31792. 802bd58: 20000d10 .word 0x20000d10
  31793. 0802bd5c <xTaskCheckForTimeOut>:
  31794. }
  31795. /*-----------------------------------------------------------*/
  31796. BaseType_t xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut, TickType_t * const pxTicksToWait )
  31797. {
  31798. 802bd5c: b538 push {r3, r4, r5, lr}
  31799. 802bd5e: 460d mov r5, r1
  31800. BaseType_t xReturn;
  31801. configASSERT( pxTimeOut );
  31802. 802bd60: 4604 mov r4, r0
  31803. 802bd62: b910 cbnz r0, 802bd6a <xTaskCheckForTimeOut+0xe>
  31804. 802bd64: f000 f910 bl 802bf88 <ulPortSetInterruptMask>
  31805. 802bd68: e7fe b.n 802bd68 <xTaskCheckForTimeOut+0xc>
  31806. configASSERT( pxTicksToWait );
  31807. 802bd6a: b911 cbnz r1, 802bd72 <xTaskCheckForTimeOut+0x16>
  31808. 802bd6c: f000 f90c bl 802bf88 <ulPortSetInterruptMask>
  31809. 802bd70: e7fe b.n 802bd70 <xTaskCheckForTimeOut+0x14>
  31810. taskENTER_CRITICAL();
  31811. 802bd72: f000 f911 bl 802bf98 <vPortEnterCritical>
  31812. {
  31813. /* Minor optimisation. The tick count cannot change in this block. */
  31814. const TickType_t xConstTickCount = xTickCount;
  31815. 802bd76: 4b0e ldr r3, [pc, #56] ; (802bdb0 <xTaskCheckForTimeOut+0x54>)
  31816. 802bd78: 681a ldr r2, [r3, #0]
  31817. #if ( INCLUDE_vTaskSuspend == 1 )
  31818. /* If INCLUDE_vTaskSuspend is set to 1 and the block time specified is
  31819. the maximum block time then the task should block indefinitely, and
  31820. therefore never time out. */
  31821. if( *pxTicksToWait == portMAX_DELAY )
  31822. 802bd7a: 682b ldr r3, [r5, #0]
  31823. 802bd7c: 1c59 adds r1, r3, #1
  31824. 802bd7e: d010 beq.n 802bda2 <xTaskCheckForTimeOut+0x46>
  31825. xReturn = pdFALSE;
  31826. }
  31827. else /* We are not blocking indefinitely, perform the checks below. */
  31828. #endif
  31829. if( ( xNumOfOverflows != pxTimeOut->xOverflowCount ) && ( xConstTickCount >= pxTimeOut->xTimeOnEntering ) ) /*lint !e525 Indentation preferred as is to make code within pre-processor directives clearer. */
  31830. 802bd80: 490c ldr r1, [pc, #48] ; (802bdb4 <xTaskCheckForTimeOut+0x58>)
  31831. 802bd82: 6808 ldr r0, [r1, #0]
  31832. 802bd84: 6821 ldr r1, [r4, #0]
  31833. 802bd86: 4288 cmp r0, r1
  31834. 802bd88: 6861 ldr r1, [r4, #4]
  31835. 802bd8a: d001 beq.n 802bd90 <xTaskCheckForTimeOut+0x34>
  31836. 802bd8c: 428a cmp r2, r1
  31837. 802bd8e: d20a bcs.n 802bda6 <xTaskCheckForTimeOut+0x4a>
  31838. was called, but has also overflowed since vTaskSetTimeOut() was called.
  31839. It must have wrapped all the way around and gone past us again. This
  31840. passed since vTaskSetTimeout() was called. */
  31841. xReturn = pdTRUE;
  31842. }
  31843. else if( ( xConstTickCount - pxTimeOut->xTimeOnEntering ) < *pxTicksToWait )
  31844. 802bd90: 1a50 subs r0, r2, r1
  31845. 802bd92: 4298 cmp r0, r3
  31846. 802bd94: d207 bcs.n 802bda6 <xTaskCheckForTimeOut+0x4a>
  31847. {
  31848. /* Not a genuine timeout. Adjust parameters for time remaining. */
  31849. *pxTicksToWait -= ( xConstTickCount - pxTimeOut->xTimeOnEntering );
  31850. 802bd96: 1a8a subs r2, r1, r2
  31851. 802bd98: 18d3 adds r3, r2, r3
  31852. 802bd9a: 602b str r3, [r5, #0]
  31853. vTaskSetTimeOutState( pxTimeOut );
  31854. 802bd9c: 4620 mov r0, r4
  31855. 802bd9e: f7ff ffcd bl 802bd3c <vTaskSetTimeOutState>
  31856. /* If INCLUDE_vTaskSuspend is set to 1 and the block time specified is
  31857. the maximum block time then the task should block indefinitely, and
  31858. therefore never time out. */
  31859. if( *pxTicksToWait == portMAX_DELAY )
  31860. {
  31861. xReturn = pdFALSE;
  31862. 802bda2: 2400 movs r4, #0
  31863. 802bda4: e000 b.n 802bda8 <xTaskCheckForTimeOut+0x4c>
  31864. {
  31865. /* The tick count is greater than the time at which vTaskSetTimeout()
  31866. was called, but has also overflowed since vTaskSetTimeOut() was called.
  31867. It must have wrapped all the way around and gone past us again. This
  31868. passed since vTaskSetTimeout() was called. */
  31869. xReturn = pdTRUE;
  31870. 802bda6: 2401 movs r4, #1
  31871. else
  31872. {
  31873. xReturn = pdTRUE;
  31874. }
  31875. }
  31876. taskEXIT_CRITICAL();
  31877. 802bda8: f000 f922 bl 802bff0 <vPortExitCritical>
  31878. return xReturn;
  31879. }
  31880. 802bdac: 4620 mov r0, r4
  31881. 802bdae: bd38 pop {r3, r4, r5, pc}
  31882. 802bdb0: 20000d10 .word 0x20000d10
  31883. 802bdb4: 20000c40 .word 0x20000c40
  31884. 0802bdb8 <vTaskMissedYield>:
  31885. /*-----------------------------------------------------------*/
  31886. void vTaskMissedYield( void )
  31887. {
  31888. xYieldPending = pdTRUE;
  31889. 802bdb8: 4b01 ldr r3, [pc, #4] ; (802bdc0 <vTaskMissedYield+0x8>)
  31890. 802bdba: 2201 movs r2, #1
  31891. 802bdbc: 601a str r2, [r3, #0]
  31892. 802bdbe: 4770 bx lr
  31893. 802bdc0: 20000d38 .word 0x20000d38
  31894. 0802bdc4 <xTaskGetSchedulerState>:
  31895. BaseType_t xTaskGetSchedulerState( void )
  31896. {
  31897. BaseType_t xReturn;
  31898. if( xSchedulerRunning == pdFALSE )
  31899. 802bdc4: 4b05 ldr r3, [pc, #20] ; (802bddc <xTaskGetSchedulerState+0x18>)
  31900. 802bdc6: 681b ldr r3, [r3, #0]
  31901. 802bdc8: b133 cbz r3, 802bdd8 <xTaskGetSchedulerState+0x14>
  31902. {
  31903. xReturn = taskSCHEDULER_NOT_STARTED;
  31904. }
  31905. else
  31906. {
  31907. if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE )
  31908. 802bdca: 4b05 ldr r3, [pc, #20] ; (802bde0 <xTaskGetSchedulerState+0x1c>)
  31909. 802bdcc: 6818 ldr r0, [r3, #0]
  31910. {
  31911. xReturn = taskSCHEDULER_RUNNING;
  31912. 802bdce: 2800 cmp r0, #0
  31913. 802bdd0: bf0c ite eq
  31914. 802bdd2: 2002 moveq r0, #2
  31915. 802bdd4: 2000 movne r0, #0
  31916. 802bdd6: 4770 bx lr
  31917. {
  31918. BaseType_t xReturn;
  31919. if( xSchedulerRunning == pdFALSE )
  31920. {
  31921. xReturn = taskSCHEDULER_NOT_STARTED;
  31922. 802bdd8: 2001 movs r0, #1
  31923. xReturn = taskSCHEDULER_SUSPENDED;
  31924. }
  31925. }
  31926. return xReturn;
  31927. }
  31928. 802bdda: 4770 bx lr
  31929. 802bddc: 20000c48 .word 0x20000c48
  31930. 802bde0: 20000d0c .word 0x20000d0c
  31931. 0802bde4 <vTaskPriorityInherit>:
  31932. /*-----------------------------------------------------------*/
  31933. #if ( configUSE_MUTEXES == 1 )
  31934. void vTaskPriorityInherit( TaskHandle_t const pxMutexHolder )
  31935. {
  31936. 802bde4: b5f8 push {r3, r4, r5, r6, r7, lr}
  31937. TCB_t * const pxTCB = ( TCB_t * ) pxMutexHolder;
  31938. /* If the mutex was given back by an interrupt while the queue was
  31939. locked then the mutex holder might now be NULL. */
  31940. if( pxMutexHolder != NULL )
  31941. 802bde6: 4604 mov r4, r0
  31942. 802bde8: 2800 cmp r0, #0
  31943. 802bdea: d040 beq.n 802be6e <vTaskPriorityInherit+0x8a>
  31944. {
  31945. if( pxTCB->uxPriority < pxCurrentTCB->uxPriority )
  31946. 802bdec: 4a20 ldr r2, [pc, #128] ; (802be70 <vTaskPriorityInherit+0x8c>)
  31947. 802bdee: 6ac3 ldr r3, [r0, #44] ; 0x2c
  31948. 802bdf0: 6811 ldr r1, [r2, #0]
  31949. 802bdf2: 6ac9 ldr r1, [r1, #44] ; 0x2c
  31950. 802bdf4: 428b cmp r3, r1
  31951. 802bdf6: d23a bcs.n 802be6e <vTaskPriorityInherit+0x8a>
  31952. {
  31953. /* Adjust the mutex holder state to account for its new
  31954. priority. Only reset the event list item value if the value is
  31955. not being used for anything else. */
  31956. if( ( listGET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ) ) & taskEVENT_LIST_ITEM_VALUE_IN_USE ) == 0UL )
  31957. 802bdf8: 6981 ldr r1, [r0, #24]
  31958. 802bdfa: 2900 cmp r1, #0
  31959. 802bdfc: db04 blt.n 802be08 <vTaskPriorityInherit+0x24>
  31960. {
  31961. 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. */
  31962. 802bdfe: 6812 ldr r2, [r2, #0]
  31963. 802be00: 6ad2 ldr r2, [r2, #44] ; 0x2c
  31964. 802be02: f1c2 0205 rsb r2, r2, #5
  31965. 802be06: 6182 str r2, [r0, #24]
  31966. mtCOVERAGE_TEST_MARKER();
  31967. }
  31968. /* If the task being modified is in the ready state it will need to
  31969. be moved into a new list. */
  31970. if( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ pxTCB->uxPriority ] ), &( pxTCB->xGenericListItem ) ) != pdFALSE )
  31971. 802be08: 4e1a ldr r6, [pc, #104] ; (802be74 <vTaskPriorityInherit+0x90>)
  31972. 802be0a: 6962 ldr r2, [r4, #20]
  31973. 802be0c: 2714 movs r7, #20
  31974. 802be0e: fb07 6303 mla r3, r7, r3, r6
  31975. 802be12: 429a cmp r2, r3
  31976. 802be14: d127 bne.n 802be66 <vTaskPriorityInherit+0x82>
  31977. 802be16: e01f b.n 802be58 <vTaskPriorityInherit+0x74>
  31978. {
  31979. if( uxListRemove( &( pxTCB->xGenericListItem ) ) == ( UBaseType_t ) 0 )
  31980. {
  31981. taskRESET_READY_PRIORITY( pxTCB->uxPriority );
  31982. 802be18: 6ae2 ldr r2, [r4, #44] ; 0x2c
  31983. 802be1a: 4357 muls r7, r2
  31984. 802be1c: 59f3 ldr r3, [r6, r7]
  31985. 802be1e: b93b cbnz r3, 802be30 <vTaskPriorityInherit+0x4c>
  31986. 802be20: 4b15 ldr r3, [pc, #84] ; (802be78 <vTaskPriorityInherit+0x94>)
  31987. 802be22: 2001 movs r0, #1
  31988. 802be24: 6819 ldr r1, [r3, #0]
  31989. 802be26: fa00 f202 lsl.w r2, r0, r2
  31990. 802be2a: ea21 0202 bic.w r2, r1, r2
  31991. 802be2e: 601a str r2, [r3, #0]
  31992. {
  31993. mtCOVERAGE_TEST_MARKER();
  31994. }
  31995. /* Inherit the priority before being moved into the new list. */
  31996. pxTCB->uxPriority = pxCurrentTCB->uxPriority;
  31997. 802be30: 4b0f ldr r3, [pc, #60] ; (802be70 <vTaskPriorityInherit+0x8c>)
  31998. prvAddTaskToReadyList( pxTCB );
  31999. 802be32: 4a11 ldr r2, [pc, #68] ; (802be78 <vTaskPriorityInherit+0x94>)
  32000. {
  32001. mtCOVERAGE_TEST_MARKER();
  32002. }
  32003. /* Inherit the priority before being moved into the new list. */
  32004. pxTCB->uxPriority = pxCurrentTCB->uxPriority;
  32005. 802be34: 681b ldr r3, [r3, #0]
  32006. prvAddTaskToReadyList( pxTCB );
  32007. 802be36: 6810 ldr r0, [r2, #0]
  32008. {
  32009. mtCOVERAGE_TEST_MARKER();
  32010. }
  32011. /* Inherit the priority before being moved into the new list. */
  32012. pxTCB->uxPriority = pxCurrentTCB->uxPriority;
  32013. 802be38: 6adb ldr r3, [r3, #44] ; 0x2c
  32014. prvAddTaskToReadyList( pxTCB );
  32015. 802be3a: 2101 movs r1, #1
  32016. 802be3c: fa01 f103 lsl.w r1, r1, r3
  32017. 802be40: 4301 orrs r1, r0
  32018. 802be42: 6011 str r1, [r2, #0]
  32019. 802be44: 4a0b ldr r2, [pc, #44] ; (802be74 <vTaskPriorityInherit+0x90>)
  32020. {
  32021. mtCOVERAGE_TEST_MARKER();
  32022. }
  32023. /* Inherit the priority before being moved into the new list. */
  32024. pxTCB->uxPriority = pxCurrentTCB->uxPriority;
  32025. 802be46: 62e3 str r3, [r4, #44] ; 0x2c
  32026. prvAddTaskToReadyList( pxTCB );
  32027. 802be48: 2014 movs r0, #20
  32028. 802be4a: fb00 2003 mla r0, r0, r3, r2
  32029. 802be4e: 4629 mov r1, r5
  32030. }
  32031. else
  32032. {
  32033. mtCOVERAGE_TEST_MARKER();
  32034. }
  32035. }
  32036. 802be50: e8bd 40f8 ldmia.w sp!, {r3, r4, r5, r6, r7, lr}
  32037. mtCOVERAGE_TEST_MARKER();
  32038. }
  32039. /* Inherit the priority before being moved into the new list. */
  32040. pxTCB->uxPriority = pxCurrentTCB->uxPriority;
  32041. prvAddTaskToReadyList( pxTCB );
  32042. 802be54: f7ff b828 b.w 802aea8 <vListInsertEnd>
  32043. /* If the task being modified is in the ready state it will need to
  32044. be moved into a new list. */
  32045. if( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ pxTCB->uxPriority ] ), &( pxTCB->xGenericListItem ) ) != pdFALSE )
  32046. {
  32047. if( uxListRemove( &( pxTCB->xGenericListItem ) ) == ( UBaseType_t ) 0 )
  32048. 802be58: 1d25 adds r5, r4, #4
  32049. 802be5a: 4628 mov r0, r5
  32050. 802be5c: f7ff f848 bl 802aef0 <uxListRemove>
  32051. 802be60: 2800 cmp r0, #0
  32052. 802be62: d0d9 beq.n 802be18 <vTaskPriorityInherit+0x34>
  32053. 802be64: e7e4 b.n 802be30 <vTaskPriorityInherit+0x4c>
  32054. prvAddTaskToReadyList( pxTCB );
  32055. }
  32056. else
  32057. {
  32058. /* Just inherit the priority. */
  32059. pxTCB->uxPriority = pxCurrentTCB->uxPriority;
  32060. 802be66: 4b02 ldr r3, [pc, #8] ; (802be70 <vTaskPriorityInherit+0x8c>)
  32061. 802be68: 681b ldr r3, [r3, #0]
  32062. 802be6a: 6adb ldr r3, [r3, #44] ; 0x2c
  32063. 802be6c: 62e3 str r3, [r4, #44] ; 0x2c
  32064. 802be6e: bdf8 pop {r3, r4, r5, r6, r7, pc}
  32065. 802be70: 20000cf4 .word 0x20000cf4
  32066. 802be74: 20000c7c .word 0x20000c7c
  32067. 802be78: 20000d34 .word 0x20000d34
  32068. 0802be7c <xTaskPriorityDisinherit>:
  32069. /*-----------------------------------------------------------*/
  32070. #if ( configUSE_MUTEXES == 1 )
  32071. BaseType_t xTaskPriorityDisinherit( TaskHandle_t const pxMutexHolder )
  32072. {
  32073. 802be7c: b538 push {r3, r4, r5, lr}
  32074. TCB_t * const pxTCB = ( TCB_t * ) pxMutexHolder;
  32075. BaseType_t xReturn = pdFALSE;
  32076. if( pxMutexHolder != NULL )
  32077. 802be7e: 4604 mov r4, r0
  32078. 802be80: b908 cbnz r0, 802be86 <xTaskPriorityDisinherit+0xa>
  32079. #if ( configUSE_MUTEXES == 1 )
  32080. BaseType_t xTaskPriorityDisinherit( TaskHandle_t const pxMutexHolder )
  32081. {
  32082. TCB_t * const pxTCB = ( TCB_t * ) pxMutexHolder;
  32083. BaseType_t xReturn = pdFALSE;
  32084. 802be82: 2000 movs r0, #0
  32085. 802be84: bd38 pop {r3, r4, r5, pc}
  32086. if( pxMutexHolder != NULL )
  32087. {
  32088. configASSERT( pxTCB->uxMutexesHeld );
  32089. 802be86: 6d03 ldr r3, [r0, #80] ; 0x50
  32090. 802be88: b913 cbnz r3, 802be90 <xTaskPriorityDisinherit+0x14>
  32091. 802be8a: f000 f87d bl 802bf88 <ulPortSetInterruptMask>
  32092. 802be8e: e7fe b.n 802be8e <xTaskPriorityDisinherit+0x12>
  32093. ( pxTCB->uxMutexesHeld )--;
  32094. if( pxTCB->uxPriority != pxTCB->uxBasePriority )
  32095. 802be90: 6ac1 ldr r1, [r0, #44] ; 0x2c
  32096. 802be92: 6cc2 ldr r2, [r0, #76] ; 0x4c
  32097. BaseType_t xReturn = pdFALSE;
  32098. if( pxMutexHolder != NULL )
  32099. {
  32100. configASSERT( pxTCB->uxMutexesHeld );
  32101. ( pxTCB->uxMutexesHeld )--;
  32102. 802be94: 3b01 subs r3, #1
  32103. if( pxTCB->uxPriority != pxTCB->uxBasePriority )
  32104. 802be96: 4291 cmp r1, r2
  32105. BaseType_t xReturn = pdFALSE;
  32106. if( pxMutexHolder != NULL )
  32107. {
  32108. configASSERT( pxTCB->uxMutexesHeld );
  32109. ( pxTCB->uxMutexesHeld )--;
  32110. 802be98: 6503 str r3, [r0, #80] ; 0x50
  32111. if( pxTCB->uxPriority != pxTCB->uxBasePriority )
  32112. 802be9a: d0f2 beq.n 802be82 <xTaskPriorityDisinherit+0x6>
  32113. {
  32114. /* Only disinherit if no other mutexes are held. */
  32115. if( pxTCB->uxMutexesHeld == ( UBaseType_t ) 0 )
  32116. 802be9c: 2b00 cmp r3, #0
  32117. 802be9e: d1f0 bne.n 802be82 <xTaskPriorityDisinherit+0x6>
  32118. /* A task can only have an inhertied priority if it holds
  32119. the mutex. If the mutex is held by a task then it cannot be
  32120. given from an interrupt, and if a mutex is given by the
  32121. holding task then it must be the running state task. Remove
  32122. the holding task from the ready list. */
  32123. if( uxListRemove( &( pxTCB->xGenericListItem ) ) == ( UBaseType_t ) 0 )
  32124. 802bea0: 1d05 adds r5, r0, #4
  32125. 802bea2: 4628 mov r0, r5
  32126. 802bea4: f7ff f824 bl 802aef0 <uxListRemove>
  32127. 802bea8: b968 cbnz r0, 802bec6 <xTaskPriorityDisinherit+0x4a>
  32128. {
  32129. taskRESET_READY_PRIORITY( pxTCB->uxPriority );
  32130. 802beaa: 6ae2 ldr r2, [r4, #44] ; 0x2c
  32131. 802beac: 4910 ldr r1, [pc, #64] ; (802bef0 <xTaskPriorityDisinherit+0x74>)
  32132. 802beae: 2314 movs r3, #20
  32133. 802beb0: 4353 muls r3, r2
  32134. 802beb2: 58cb ldr r3, [r1, r3]
  32135. 802beb4: b93b cbnz r3, 802bec6 <xTaskPriorityDisinherit+0x4a>
  32136. 802beb6: 4b0f ldr r3, [pc, #60] ; (802bef4 <xTaskPriorityDisinherit+0x78>)
  32137. 802beb8: 2001 movs r0, #1
  32138. 802beba: 6819 ldr r1, [r3, #0]
  32139. 802bebc: fa00 f202 lsl.w r2, r0, r2
  32140. 802bec0: ea21 0202 bic.w r2, r1, r2
  32141. 802bec4: 601a str r2, [r3, #0]
  32142. }
  32143. /* Disinherit the priority before adding the task into the
  32144. new ready list. */
  32145. traceTASK_PRIORITY_DISINHERIT( pxTCB, pxTCB->uxBasePriority );
  32146. pxTCB->uxPriority = pxTCB->uxBasePriority;
  32147. 802bec6: 6ce3 ldr r3, [r4, #76] ; 0x4c
  32148. /* Reset the event list item value. It cannot be in use for
  32149. any other purpose if this task is running, and it must be
  32150. running to give back the mutex. */
  32151. 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. */
  32152. 802bec8: f1c3 0205 rsb r2, r3, #5
  32153. 802becc: 61a2 str r2, [r4, #24]
  32154. prvAddTaskToReadyList( pxTCB );
  32155. 802bece: 4a09 ldr r2, [pc, #36] ; (802bef4 <xTaskPriorityDisinherit+0x78>)
  32156. }
  32157. /* Disinherit the priority before adding the task into the
  32158. new ready list. */
  32159. traceTASK_PRIORITY_DISINHERIT( pxTCB, pxTCB->uxBasePriority );
  32160. pxTCB->uxPriority = pxTCB->uxBasePriority;
  32161. 802bed0: 62e3 str r3, [r4, #44] ; 0x2c
  32162. /* Reset the event list item value. It cannot be in use for
  32163. any other purpose if this task is running, and it must be
  32164. running to give back the mutex. */
  32165. 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. */
  32166. prvAddTaskToReadyList( pxTCB );
  32167. 802bed2: 6811 ldr r1, [r2, #0]
  32168. 802bed4: 2401 movs r4, #1
  32169. 802bed6: fa04 f003 lsl.w r0, r4, r3
  32170. 802beda: 4301 orrs r1, r0
  32171. 802bedc: 6011 str r1, [r2, #0]
  32172. 802bede: 4a04 ldr r2, [pc, #16] ; (802bef0 <xTaskPriorityDisinherit+0x74>)
  32173. 802bee0: 2014 movs r0, #20
  32174. 802bee2: fb00 2003 mla r0, r0, r3, r2
  32175. 802bee6: 4629 mov r1, r5
  32176. 802bee8: f7fe ffde bl 802aea8 <vListInsertEnd>
  32177. in an order different to that in which they were taken.
  32178. If a context switch did not occur when the first mutex was
  32179. returned, even if a task was waiting on it, then a context
  32180. switch should occur when the last mutex is returned whether
  32181. a task is waiting on it or not. */
  32182. xReturn = pdTRUE;
  32183. 802beec: 4620 mov r0, r4
  32184. {
  32185. mtCOVERAGE_TEST_MARKER();
  32186. }
  32187. return xReturn;
  32188. }
  32189. 802beee: bd38 pop {r3, r4, r5, pc}
  32190. 802bef0: 20000c7c .word 0x20000c7c
  32191. 802bef4: 20000d34 .word 0x20000d34
  32192. 0802bef8 <pvTaskIncrementMutexHeldCount>:
  32193. void *pvTaskIncrementMutexHeldCount( void )
  32194. {
  32195. /* If xSemaphoreCreateMutex() is called before any tasks have been created
  32196. then pxCurrentTCB will be NULL. */
  32197. if( pxCurrentTCB != NULL )
  32198. 802bef8: 4b04 ldr r3, [pc, #16] ; (802bf0c <pvTaskIncrementMutexHeldCount+0x14>)
  32199. 802befa: 681a ldr r2, [r3, #0]
  32200. 802befc: b11a cbz r2, 802bf06 <pvTaskIncrementMutexHeldCount+0xe>
  32201. {
  32202. ( pxCurrentTCB->uxMutexesHeld )++;
  32203. 802befe: 681a ldr r2, [r3, #0]
  32204. 802bf00: 6d11 ldr r1, [r2, #80] ; 0x50
  32205. 802bf02: 3101 adds r1, #1
  32206. 802bf04: 6511 str r1, [r2, #80] ; 0x50
  32207. }
  32208. return pxCurrentTCB;
  32209. 802bf06: 6818 ldr r0, [r3, #0]
  32210. }
  32211. 802bf08: 4770 bx lr
  32212. 802bf0a: bf00 nop
  32213. 802bf0c: 20000cf4 .word 0x20000cf4
  32214. 0802bf10 <prvPortStartFirstTask>:
  32215. }
  32216. /*-----------------------------------------------------------*/
  32217. static void prvPortStartFirstTask( void )
  32218. {
  32219. __asm volatile(
  32220. 802bf10: 4806 ldr r0, [pc, #24] ; (802bf2c <prvPortStartFirstTask+0x1c>)
  32221. 802bf12: 6800 ldr r0, [r0, #0]
  32222. 802bf14: 6800 ldr r0, [r0, #0]
  32223. 802bf16: f380 8808 msr MSP, r0
  32224. 802bf1a: b662 cpsie i
  32225. 802bf1c: b661 cpsie f
  32226. 802bf1e: f3bf 8f4f dsb sy
  32227. 802bf22: f3bf 8f6f isb sy
  32228. 802bf26: df00 svc 0
  32229. 802bf28: bf00 nop
  32230. 802bf2a: 0000 .short 0x0000
  32231. 802bf2c: e000ed08 .word 0xe000ed08
  32232. 0802bf30 <pxPortInitialiseStack>:
  32233. StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters )
  32234. {
  32235. /* Simulate the stack frame as it would be created by a context switch
  32236. interrupt. */
  32237. pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */
  32238. *pxTopOfStack = portINITIAL_XPSR; /* xPSR */
  32239. 802bf30: f04f 7380 mov.w r3, #16777216 ; 0x1000000
  32240. pxTopOfStack--;
  32241. *pxTopOfStack = ( StackType_t ) pxCode; /* PC */
  32242. 802bf34: e900 000a stmdb r0, {r1, r3}
  32243. pxTopOfStack--;
  32244. *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */
  32245. 802bf38: 4b03 ldr r3, [pc, #12] ; (802bf48 <pxPortInitialiseStack+0x18>)
  32246. pxTopOfStack -= 5; /* R12, R3, R2 and R1. */
  32247. *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */
  32248. 802bf3a: f840 2c20 str.w r2, [r0, #-32]
  32249. pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */
  32250. *pxTopOfStack = portINITIAL_XPSR; /* xPSR */
  32251. pxTopOfStack--;
  32252. *pxTopOfStack = ( StackType_t ) pxCode; /* PC */
  32253. pxTopOfStack--;
  32254. *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */
  32255. 802bf3e: f840 3c0c str.w r3, [r0, #-12]
  32256. pxTopOfStack -= 5; /* R12, R3, R2 and R1. */
  32257. *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */
  32258. pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */
  32259. return pxTopOfStack;
  32260. }
  32261. 802bf42: 3840 subs r0, #64 ; 0x40
  32262. 802bf44: 4770 bx lr
  32263. 802bf46: bf00 nop
  32264. 802bf48: 0802bfcd .word 0x0802bfcd
  32265. 0802bf4c <SVC_Handler>:
  32266. }
  32267. /*-----------------------------------------------------------*/
  32268. void vPortSVCHandler( void )
  32269. {
  32270. __asm volatile (
  32271. 802bf4c: 4b07 ldr r3, [pc, #28] ; (802bf6c <pxCurrentTCBConst2>)
  32272. 802bf4e: 6819 ldr r1, [r3, #0]
  32273. 802bf50: 6808 ldr r0, [r1, #0]
  32274. 802bf52: e8b0 0ff0 ldmia.w r0!, {r4, r5, r6, r7, r8, r9, sl, fp}
  32275. 802bf56: f380 8809 msr PSP, r0
  32276. 802bf5a: f3bf 8f6f isb sy
  32277. 802bf5e: f04f 0000 mov.w r0, #0
  32278. 802bf62: f380 8811 msr BASEPRI, r0
  32279. 802bf66: f04e 0e0d orr.w lr, lr, #13
  32280. 802bf6a: 4770 bx lr
  32281. 0802bf6c <pxCurrentTCBConst2>:
  32282. 802bf6c: 20000cf4 .word 0x20000cf4
  32283. 0802bf70 <vPortYield>:
  32284. /*-----------------------------------------------------------*/
  32285. void vPortYield( void )
  32286. {
  32287. /* Set a PendSV to request a context switch. */
  32288. portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;
  32289. 802bf70: 4b04 ldr r3, [pc, #16] ; (802bf84 <vPortYield+0x14>)
  32290. 802bf72: f04f 5280 mov.w r2, #268435456 ; 0x10000000
  32291. 802bf76: 601a str r2, [r3, #0]
  32292. /* Barriers are normally not required but do ensure the code is completely
  32293. within the specified behaviour for the architecture. */
  32294. __asm volatile( "dsb" );
  32295. 802bf78: f3bf 8f4f dsb sy
  32296. __asm volatile( "isb" );
  32297. 802bf7c: f3bf 8f6f isb sy
  32298. 802bf80: 4770 bx lr
  32299. 802bf82: bf00 nop
  32300. 802bf84: e000ed04 .word 0xe000ed04
  32301. 0802bf88 <ulPortSetInterruptMask>:
  32302. }
  32303. /*-----------------------------------------------------------*/
  32304. __attribute__(( naked )) uint32_t ulPortSetInterruptMask( void )
  32305. {
  32306. __asm volatile \
  32307. 802bf88: f3ef 8011 mrs r0, BASEPRI
  32308. 802bf8c: f04f 0150 mov.w r1, #80 ; 0x50
  32309. 802bf90: f381 8811 msr BASEPRI, r1
  32310. 802bf94: 4770 bx lr
  32311. );
  32312. /* This return will not be reached but is necessary to prevent compiler
  32313. warnings. */
  32314. return 0;
  32315. }
  32316. 802bf96: 2000 movs r0, #0
  32317. 0802bf98 <vPortEnterCritical>:
  32318. __asm volatile( "isb" );
  32319. }
  32320. /*-----------------------------------------------------------*/
  32321. void vPortEnterCritical( void )
  32322. {
  32323. 802bf98: b508 push {r3, lr}
  32324. portDISABLE_INTERRUPTS();
  32325. 802bf9a: f7ff fff5 bl 802bf88 <ulPortSetInterruptMask>
  32326. uxCriticalNesting++;
  32327. 802bf9e: 4a09 ldr r2, [pc, #36] ; (802bfc4 <vPortEnterCritical+0x2c>)
  32328. 802bfa0: 6813 ldr r3, [r2, #0]
  32329. 802bfa2: 3301 adds r3, #1
  32330. 802bfa4: 6013 str r3, [r2, #0]
  32331. __asm volatile( "dsb" );
  32332. 802bfa6: f3bf 8f4f dsb sy
  32333. __asm volatile( "isb" );
  32334. 802bfaa: f3bf 8f6f isb sy
  32335. /* This is not the interrupt safe version of the enter critical function so
  32336. assert() if it is being called from an interrupt context. Only API
  32337. functions that end in "FromISR" can be used in an interrupt. Only assert if
  32338. the critical nesting count is 1 to protect against recursive calls if the
  32339. assert function also uses a critical section. */
  32340. if( uxCriticalNesting == 1 )
  32341. 802bfae: 2b01 cmp r3, #1
  32342. 802bfb0: d107 bne.n 802bfc2 <vPortEnterCritical+0x2a>
  32343. {
  32344. configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 );
  32345. 802bfb2: 4b05 ldr r3, [pc, #20] ; (802bfc8 <vPortEnterCritical+0x30>)
  32346. 802bfb4: 681b ldr r3, [r3, #0]
  32347. 802bfb6: f013 0fff tst.w r3, #255 ; 0xff
  32348. 802bfba: d002 beq.n 802bfc2 <vPortEnterCritical+0x2a>
  32349. 802bfbc: f7ff ffe4 bl 802bf88 <ulPortSetInterruptMask>
  32350. 802bfc0: e7fe b.n 802bfc0 <vPortEnterCritical+0x28>
  32351. 802bfc2: bd08 pop {r3, pc}
  32352. 802bfc4: 2000071c .word 0x2000071c
  32353. 802bfc8: e000ed04 .word 0xe000ed04
  32354. 0802bfcc <prvTaskExitError>:
  32355. return pxTopOfStack;
  32356. }
  32357. /*-----------------------------------------------------------*/
  32358. static void prvTaskExitError( void )
  32359. {
  32360. 802bfcc: b508 push {r3, lr}
  32361. its caller as there is nothing to return to. If a task wants to exit it
  32362. should instead call vTaskDelete( NULL ).
  32363. Artificially force an assert() to be triggered if configASSERT() is
  32364. defined, then stop here so application writers can catch the error. */
  32365. configASSERT( uxCriticalNesting == ~0UL );
  32366. 802bfce: 4b05 ldr r3, [pc, #20] ; (802bfe4 <prvTaskExitError+0x18>)
  32367. 802bfd0: 681b ldr r3, [r3, #0]
  32368. 802bfd2: 3301 adds r3, #1
  32369. 802bfd4: d002 beq.n 802bfdc <prvTaskExitError+0x10>
  32370. 802bfd6: f7ff ffd7 bl 802bf88 <ulPortSetInterruptMask>
  32371. 802bfda: e7fe b.n 802bfda <prvTaskExitError+0xe>
  32372. portDISABLE_INTERRUPTS();
  32373. 802bfdc: f7ff ffd4 bl 802bf88 <ulPortSetInterruptMask>
  32374. 802bfe0: e7fe b.n 802bfe0 <prvTaskExitError+0x14>
  32375. 802bfe2: bf00 nop
  32376. 802bfe4: 2000071c .word 0x2000071c
  32377. 0802bfe8 <vPortClearInterruptMask>:
  32378. }
  32379. /*-----------------------------------------------------------*/
  32380. __attribute__(( naked )) void vPortClearInterruptMask( uint32_t ulNewMaskValue )
  32381. {
  32382. __asm volatile \
  32383. 802bfe8: f380 8811 msr BASEPRI, r0
  32384. 802bfec: 4770 bx lr
  32385. 802bfee: 0000 movs r0, r0
  32386. 0802bff0 <vPortExitCritical>:
  32387. }
  32388. }
  32389. /*-----------------------------------------------------------*/
  32390. void vPortExitCritical( void )
  32391. {
  32392. 802bff0: b508 push {r3, lr}
  32393. configASSERT( uxCriticalNesting );
  32394. 802bff2: 4b07 ldr r3, [pc, #28] ; (802c010 <vPortExitCritical+0x20>)
  32395. 802bff4: 6818 ldr r0, [r3, #0]
  32396. 802bff6: b910 cbnz r0, 802bffe <vPortExitCritical+0xe>
  32397. 802bff8: f7ff ffc6 bl 802bf88 <ulPortSetInterruptMask>
  32398. 802bffc: e7fe b.n 802bffc <vPortExitCritical+0xc>
  32399. uxCriticalNesting--;
  32400. 802bffe: 3801 subs r0, #1
  32401. 802c000: 6018 str r0, [r3, #0]
  32402. if( uxCriticalNesting == 0 )
  32403. 802c002: b918 cbnz r0, 802c00c <vPortExitCritical+0x1c>
  32404. {
  32405. portENABLE_INTERRUPTS();
  32406. }
  32407. }
  32408. 802c004: e8bd 4008 ldmia.w sp!, {r3, lr}
  32409. {
  32410. configASSERT( uxCriticalNesting );
  32411. uxCriticalNesting--;
  32412. if( uxCriticalNesting == 0 )
  32413. {
  32414. portENABLE_INTERRUPTS();
  32415. 802c008: f7ff bfee b.w 802bfe8 <vPortClearInterruptMask>
  32416. 802c00c: bd08 pop {r3, pc}
  32417. 802c00e: bf00 nop
  32418. 802c010: 2000071c .word 0x2000071c
  32419. 0802c014 <PendSV_Handler>:
  32420. void xPortPendSVHandler( void )
  32421. {
  32422. /* This is a naked function. */
  32423. __asm volatile
  32424. 802c014: f3ef 8009 mrs r0, PSP
  32425. 802c018: f3bf 8f6f isb sy
  32426. 802c01c: 4b0d ldr r3, [pc, #52] ; (802c054 <pxCurrentTCBConst>)
  32427. 802c01e: 681a ldr r2, [r3, #0]
  32428. 802c020: e920 0ff0 stmdb r0!, {r4, r5, r6, r7, r8, r9, sl, fp}
  32429. 802c024: 6010 str r0, [r2, #0]
  32430. 802c026: e92d 4008 stmdb sp!, {r3, lr}
  32431. 802c02a: f04f 0050 mov.w r0, #80 ; 0x50
  32432. 802c02e: f380 8811 msr BASEPRI, r0
  32433. 802c032: f7ff fdbb bl 802bbac <vTaskSwitchContext>
  32434. 802c036: f04f 0000 mov.w r0, #0
  32435. 802c03a: f380 8811 msr BASEPRI, r0
  32436. 802c03e: e8bd 4008 ldmia.w sp!, {r3, lr}
  32437. 802c042: 6819 ldr r1, [r3, #0]
  32438. 802c044: 6808 ldr r0, [r1, #0]
  32439. 802c046: e8b0 0ff0 ldmia.w r0!, {r4, r5, r6, r7, r8, r9, sl, fp}
  32440. 802c04a: f380 8809 msr PSP, r0
  32441. 802c04e: f3bf 8f6f isb sy
  32442. 802c052: 4770 bx lr
  32443. 0802c054 <pxCurrentTCBConst>:
  32444. 802c054: 20000cf4 .word 0x20000cf4
  32445. 0802c058 <SysTick_Handler>:
  32446. );
  32447. }
  32448. /*-----------------------------------------------------------*/
  32449. void xPortSysTickHandler( void )
  32450. {
  32451. 802c058: b508 push {r3, lr}
  32452. /* The SysTick runs at the lowest interrupt priority, so when this interrupt
  32453. executes all interrupts must be unmasked. There is therefore no need to
  32454. save and then restore the interrupt mask value as its value is already
  32455. known. */
  32456. ( void ) portSET_INTERRUPT_MASK_FROM_ISR();
  32457. 802c05a: f7ff ff95 bl 802bf88 <ulPortSetInterruptMask>
  32458. {
  32459. /* Increment the RTOS tick. */
  32460. if( xTaskIncrementTick() != pdFALSE )
  32461. 802c05e: f7ff fbfb bl 802b858 <xTaskIncrementTick>
  32462. 802c062: b118 cbz r0, 802c06c <SysTick_Handler+0x14>
  32463. {
  32464. /* A context switch is required. Context switching is performed in
  32465. the PendSV interrupt. Pend the PendSV interrupt. */
  32466. portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;
  32467. 802c064: 4b04 ldr r3, [pc, #16] ; (802c078 <SysTick_Handler+0x20>)
  32468. 802c066: f04f 5280 mov.w r2, #268435456 ; 0x10000000
  32469. 802c06a: 601a str r2, [r3, #0]
  32470. }
  32471. }
  32472. portCLEAR_INTERRUPT_MASK_FROM_ISR( 0 );
  32473. 802c06c: 2000 movs r0, #0
  32474. }
  32475. 802c06e: e8bd 4008 ldmia.w sp!, {r3, lr}
  32476. /* A context switch is required. Context switching is performed in
  32477. the PendSV interrupt. Pend the PendSV interrupt. */
  32478. portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;
  32479. }
  32480. }
  32481. portCLEAR_INTERRUPT_MASK_FROM_ISR( 0 );
  32482. 802c072: f7ff bfb9 b.w 802bfe8 <vPortClearInterruptMask>
  32483. 802c076: bf00 nop
  32484. 802c078: e000ed04 .word 0xe000ed04
  32485. 0802c07c <vPortSetupTimerInterrupt>:
  32486. ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ );
  32487. }
  32488. #endif /* configUSE_TICKLESS_IDLE */
  32489. /* Configure SysTick to interrupt at the requested rate. */
  32490. portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;
  32491. 802c07c: 4b06 ldr r3, [pc, #24] ; (802c098 <vPortSetupTimerInterrupt+0x1c>)
  32492. 802c07e: 681a ldr r2, [r3, #0]
  32493. 802c080: f44f 737a mov.w r3, #1000 ; 0x3e8
  32494. 802c084: fbb2 f2f3 udiv r2, r2, r3
  32495. 802c088: 4b04 ldr r3, [pc, #16] ; (802c09c <vPortSetupTimerInterrupt+0x20>)
  32496. 802c08a: 3a01 subs r2, #1
  32497. 802c08c: 601a str r2, [r3, #0]
  32498. portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT );
  32499. 802c08e: 2207 movs r2, #7
  32500. 802c090: f843 2c04 str.w r2, [r3, #-4]
  32501. 802c094: 4770 bx lr
  32502. 802c096: bf00 nop
  32503. 802c098: 200005bc .word 0x200005bc
  32504. 802c09c: e000e014 .word 0xe000e014
  32505. 0802c0a0 <xPortStartScheduler>:
  32506. /*
  32507. * See header file for description.
  32508. */
  32509. BaseType_t xPortStartScheduler( void )
  32510. {
  32511. 802c0a0: b507 push {r0, r1, r2, lr}
  32512. functions can be called. ISR safe functions are those that end in
  32513. "FromISR". FreeRTOS maintains separate thread and ISR API functions to
  32514. ensure interrupt entry is as fast and simple as possible.
  32515. Save the interrupt priority value that is about to be clobbered. */
  32516. ulOriginalPriority = *pucFirstUserPriorityRegister;
  32517. 802c0a2: 4b1d ldr r3, [pc, #116] ; (802c118 <xPortStartScheduler+0x78>)
  32518. 802c0a4: 781a ldrb r2, [r3, #0]
  32519. 802c0a6: 9201 str r2, [sp, #4]
  32520. /* Determine the number of priority bits available. First write to all
  32521. possible bits. */
  32522. *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE;
  32523. 802c0a8: 22ff movs r2, #255 ; 0xff
  32524. 802c0aa: 701a strb r2, [r3, #0]
  32525. /* Read the value back to see how many bits stuck. */
  32526. ucMaxPriorityValue = *pucFirstUserPriorityRegister;
  32527. 802c0ac: 781b ldrb r3, [r3, #0]
  32528. 802c0ae: f88d 3003 strb.w r3, [sp, #3]
  32529. /* Use the same mask on the maximum system call priority. */
  32530. ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue;
  32531. 802c0b2: f89d 2003 ldrb.w r2, [sp, #3]
  32532. 802c0b6: 4b19 ldr r3, [pc, #100] ; (802c11c <xPortStartScheduler+0x7c>)
  32533. 802c0b8: f002 0250 and.w r2, r2, #80 ; 0x50
  32534. 802c0bc: 701a strb r2, [r3, #0]
  32535. /* Calculate the maximum acceptable priority group value for the number
  32536. of bits read back. */
  32537. ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS;
  32538. 802c0be: 4a18 ldr r2, [pc, #96] ; (802c120 <xPortStartScheduler+0x80>)
  32539. 802c0c0: 2307 movs r3, #7
  32540. 802c0c2: 6013 str r3, [r2, #0]
  32541. while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE )
  32542. 802c0c4: e005 b.n 802c0d2 <xPortStartScheduler+0x32>
  32543. {
  32544. ulMaxPRIGROUPValue--;
  32545. ucMaxPriorityValue <<= ( uint8_t ) 0x01;
  32546. 802c0c6: f89d 3003 ldrb.w r3, [sp, #3]
  32547. 802c0ca: 005b lsls r3, r3, #1
  32548. 802c0cc: f88d 3003 strb.w r3, [sp, #3]
  32549. 802c0d0: 460b mov r3, r1
  32550. ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue;
  32551. /* Calculate the maximum acceptable priority group value for the number
  32552. of bits read back. */
  32553. ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS;
  32554. while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE )
  32555. 802c0d2: f89d 2003 ldrb.w r2, [sp, #3]
  32556. 802c0d6: 1e59 subs r1, r3, #1
  32557. 802c0d8: 0612 lsls r2, r2, #24
  32558. 802c0da: d4f4 bmi.n 802c0c6 <xPortStartScheduler+0x26>
  32559. }
  32560. /* Shift the priority group value back to its position within the AIRCR
  32561. register. */
  32562. ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT;
  32563. ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK;
  32564. 802c0dc: 4a10 ldr r2, [pc, #64] ; (802c120 <xPortStartScheduler+0x80>)
  32565. ucMaxPriorityValue <<= ( uint8_t ) 0x01;
  32566. }
  32567. /* Shift the priority group value back to its position within the AIRCR
  32568. register. */
  32569. ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT;
  32570. 802c0de: 021b lsls r3, r3, #8
  32571. ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK;
  32572. 802c0e0: f403 63e0 and.w r3, r3, #1792 ; 0x700
  32573. 802c0e4: 6013 str r3, [r2, #0]
  32574. /* Restore the clobbered interrupt priority register to its original
  32575. value. */
  32576. *pucFirstUserPriorityRegister = ulOriginalPriority;
  32577. 802c0e6: 4b0c ldr r3, [pc, #48] ; (802c118 <xPortStartScheduler+0x78>)
  32578. 802c0e8: 9a01 ldr r2, [sp, #4]
  32579. 802c0ea: 701a strb r2, [r3, #0]
  32580. }
  32581. #endif /* conifgASSERT_DEFINED */
  32582. /* Make PendSV and SysTick the lowest priority interrupts. */
  32583. portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI;
  32584. 802c0ec: f8d3 2920 ldr.w r2, [r3, #2336] ; 0x920
  32585. 802c0f0: f442 0270 orr.w r2, r2, #15728640 ; 0xf00000
  32586. 802c0f4: f8c3 2920 str.w r2, [r3, #2336] ; 0x920
  32587. portNVIC_SYSPRI2_REG |= portNVIC_SYSTICK_PRI;
  32588. 802c0f8: f8d3 2920 ldr.w r2, [r3, #2336] ; 0x920
  32589. 802c0fc: f042 4270 orr.w r2, r2, #4026531840 ; 0xf0000000
  32590. 802c100: f8c3 2920 str.w r2, [r3, #2336] ; 0x920
  32591. /* Start the timer that generates the tick ISR. Interrupts are disabled
  32592. here already. */
  32593. vPortSetupTimerInterrupt();
  32594. 802c104: f7ff ffba bl 802c07c <vPortSetupTimerInterrupt>
  32595. /* Initialise the critical nesting count ready for the first task. */
  32596. uxCriticalNesting = 0;
  32597. 802c108: 4b06 ldr r3, [pc, #24] ; (802c124 <xPortStartScheduler+0x84>)
  32598. 802c10a: 2200 movs r2, #0
  32599. 802c10c: 601a str r2, [r3, #0]
  32600. /* Start the first task. */
  32601. prvPortStartFirstTask();
  32602. 802c10e: f7ff feff bl 802bf10 <prvPortStartFirstTask>
  32603. /* Should never get here as the tasks will now be executing! Call the task
  32604. exit error function to prevent compiler warnings about a static function
  32605. not being called in the case that the application writer overrides this
  32606. functionality by defining configTASK_RETURN_ADDRESS. */
  32607. prvTaskExitError();
  32608. 802c112: f7ff ff5b bl 802bfcc <prvTaskExitError>
  32609. 802c116: bf00 nop
  32610. 802c118: e000e400 .word 0xe000e400
  32611. 802c11c: 20000d3c .word 0x20000d3c
  32612. 802c120: 20000d40 .word 0x20000d40
  32613. 802c124: 2000071c .word 0x2000071c
  32614. 0802c128 <vPortValidateInterruptPriority>:
  32615. /*-----------------------------------------------------------*/
  32616. #if( configASSERT_DEFINED == 1 )
  32617. void vPortValidateInterruptPriority( void )
  32618. {
  32619. 802c128: b508 push {r3, lr}
  32620. uint32_t ulCurrentInterrupt;
  32621. uint8_t ucCurrentPriority;
  32622. /* Obtain the number of the currently executing interrupt. */
  32623. __asm volatile( "mrs %0, ipsr" : "=r"( ulCurrentInterrupt ) );
  32624. 802c12a: f3ef 8305 mrs r3, IPSR
  32625. /* Is the interrupt number a user defined interrupt? */
  32626. if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER )
  32627. 802c12e: 2b0f cmp r3, #15
  32628. 802c130: d908 bls.n 802c144 <vPortValidateInterruptPriority+0x1c>
  32629. {
  32630. /* Look up the interrupt's priority. */
  32631. ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ];
  32632. 802c132: 4a0a ldr r2, [pc, #40] ; (802c15c <vPortValidateInterruptPriority+0x34>)
  32633. 802c134: 5c9b ldrb r3, [r3, r2]
  32634. interrupt entry is as fast and simple as possible.
  32635. The following links provide detailed information:
  32636. http://www.freertos.org/RTOS-Cortex-M3-M4.html
  32637. http://www.freertos.org/FAQHelp.html */
  32638. configASSERT( ucCurrentPriority >= ucMaxSysCallPriority );
  32639. 802c136: 4a0a ldr r2, [pc, #40] ; (802c160 <vPortValidateInterruptPriority+0x38>)
  32640. 802c138: 7812 ldrb r2, [r2, #0]
  32641. 802c13a: 429a cmp r2, r3
  32642. 802c13c: d902 bls.n 802c144 <vPortValidateInterruptPriority+0x1c>
  32643. 802c13e: f7ff ff23 bl 802bf88 <ulPortSetInterruptMask>
  32644. 802c142: e7fe b.n 802c142 <vPortValidateInterruptPriority+0x1a>
  32645. configuration then the correct setting can be achieved on all Cortex-M
  32646. devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the
  32647. scheduler. Note however that some vendor specific peripheral libraries
  32648. assume a non-zero priority group setting, in which cases using a value
  32649. of zero will result in unpredicable behaviour. */
  32650. configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue );
  32651. 802c144: 4b07 ldr r3, [pc, #28] ; (802c164 <vPortValidateInterruptPriority+0x3c>)
  32652. 802c146: 681a ldr r2, [r3, #0]
  32653. 802c148: 4b07 ldr r3, [pc, #28] ; (802c168 <vPortValidateInterruptPriority+0x40>)
  32654. 802c14a: 681b ldr r3, [r3, #0]
  32655. 802c14c: f402 62e0 and.w r2, r2, #1792 ; 0x700
  32656. 802c150: 429a cmp r2, r3
  32657. 802c152: d902 bls.n 802c15a <vPortValidateInterruptPriority+0x32>
  32658. 802c154: f7ff ff18 bl 802bf88 <ulPortSetInterruptMask>
  32659. 802c158: e7fe b.n 802c158 <vPortValidateInterruptPriority+0x30>
  32660. 802c15a: bd08 pop {r3, pc}
  32661. 802c15c: e000e3f0 .word 0xe000e3f0
  32662. 802c160: 20000d3c .word 0x20000d3c
  32663. 802c164: e000ed0c .word 0xe000ed0c
  32664. 802c168: 20000d40 .word 0x20000d40
  32665. 0802c16c <prvInsertBlockIntoFreeList>:
  32666. xBlockAllocatedBit = ( ( size_t ) 1 ) << ( ( sizeof( size_t ) * heapBITS_PER_BYTE ) - 1 );
  32667. }
  32668. /*-----------------------------------------------------------*/
  32669. static void prvInsertBlockIntoFreeList( BlockLink_t *pxBlockToInsert )
  32670. {
  32671. 802c16c: b510 push {r4, lr}
  32672. BlockLink_t *pxIterator;
  32673. uint8_t *puc;
  32674. /* Iterate through the list until a block is found that has a higher address
  32675. than the block being inserted. */
  32676. for( pxIterator = &xStart; pxIterator->pxNextFreeBlock < pxBlockToInsert; pxIterator = pxIterator->pxNextFreeBlock )
  32677. 802c16e: 4b0f ldr r3, [pc, #60] ; (802c1ac <prvInsertBlockIntoFreeList+0x40>)
  32678. 802c170: e000 b.n 802c174 <prvInsertBlockIntoFreeList+0x8>
  32679. 802c172: 4613 mov r3, r2
  32680. 802c174: 681a ldr r2, [r3, #0]
  32681. 802c176: 4282 cmp r2, r0
  32682. 802c178: d3fb bcc.n 802c172 <prvInsertBlockIntoFreeList+0x6>
  32683. }
  32684. /* Do the block being inserted, and the block it is being inserted after
  32685. make a contiguous block of memory? */
  32686. puc = ( uint8_t * ) pxIterator;
  32687. if( ( puc + pxIterator->xBlockSize ) == ( uint8_t * ) pxBlockToInsert )
  32688. 802c17a: 6859 ldr r1, [r3, #4]
  32689. 802c17c: 185c adds r4, r3, r1
  32690. 802c17e: 4284 cmp r4, r0
  32691. 802c180: d103 bne.n 802c18a <prvInsertBlockIntoFreeList+0x1e>
  32692. {
  32693. pxIterator->xBlockSize += pxBlockToInsert->xBlockSize;
  32694. 802c182: 6840 ldr r0, [r0, #4]
  32695. 802c184: 1841 adds r1, r0, r1
  32696. 802c186: 6059 str r1, [r3, #4]
  32697. 802c188: 4618 mov r0, r3
  32698. }
  32699. /* Do the block being inserted, and the block it is being inserted before
  32700. make a contiguous block of memory? */
  32701. puc = ( uint8_t * ) pxBlockToInsert;
  32702. if( ( puc + pxBlockToInsert->xBlockSize ) == ( uint8_t * ) pxIterator->pxNextFreeBlock )
  32703. 802c18a: 6841 ldr r1, [r0, #4]
  32704. 802c18c: 1844 adds r4, r0, r1
  32705. 802c18e: 4294 cmp r4, r2
  32706. 802c190: d106 bne.n 802c1a0 <prvInsertBlockIntoFreeList+0x34>
  32707. {
  32708. if( pxIterator->pxNextFreeBlock != pxEnd )
  32709. 802c192: 4c07 ldr r4, [pc, #28] ; (802c1b0 <prvInsertBlockIntoFreeList+0x44>)
  32710. 802c194: 6824 ldr r4, [r4, #0]
  32711. 802c196: 42a2 cmp r2, r4
  32712. 802c198: d002 beq.n 802c1a0 <prvInsertBlockIntoFreeList+0x34>
  32713. {
  32714. /* Form one big block from the two blocks. */
  32715. pxBlockToInsert->xBlockSize += pxIterator->pxNextFreeBlock->xBlockSize;
  32716. pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock->pxNextFreeBlock;
  32717. 802c19a: ca14 ldmia r2, {r2, r4}
  32718. if( ( puc + pxBlockToInsert->xBlockSize ) == ( uint8_t * ) pxIterator->pxNextFreeBlock )
  32719. {
  32720. if( pxIterator->pxNextFreeBlock != pxEnd )
  32721. {
  32722. /* Form one big block from the two blocks. */
  32723. pxBlockToInsert->xBlockSize += pxIterator->pxNextFreeBlock->xBlockSize;
  32724. 802c19c: 1861 adds r1, r4, r1
  32725. 802c19e: 6041 str r1, [r0, #4]
  32726. /* If the block being inserted plugged a gab, so was merged with the block
  32727. before and the block after, then it's pxNextFreeBlock pointer will have
  32728. already been set, and should not be set here as that would make it point
  32729. to itself. */
  32730. if( pxIterator != pxBlockToInsert )
  32731. 802c1a0: 4283 cmp r3, r0
  32732. pxBlockToInsert->pxNextFreeBlock = pxEnd;
  32733. }
  32734. }
  32735. else
  32736. {
  32737. pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock;
  32738. 802c1a2: 6002 str r2, [r0, #0]
  32739. before and the block after, then it's pxNextFreeBlock pointer will have
  32740. already been set, and should not be set here as that would make it point
  32741. to itself. */
  32742. if( pxIterator != pxBlockToInsert )
  32743. {
  32744. pxIterator->pxNextFreeBlock = pxBlockToInsert;
  32745. 802c1a4: bf18 it ne
  32746. 802c1a6: 6018 strne r0, [r3, #0]
  32747. 802c1a8: bd10 pop {r4, pc}
  32748. 802c1aa: bf00 nop
  32749. 802c1ac: 20000d4c .word 0x20000d4c
  32750. 802c1b0: 20000d48 .word 0x20000d48
  32751. 0802c1b4 <pvPortMalloc>:
  32752. static size_t xBlockAllocatedBit = 0;
  32753. /*-----------------------------------------------------------*/
  32754. void *pvPortMalloc( size_t xWantedSize )
  32755. {
  32756. 802c1b4: b5f8 push {r3, r4, r5, r6, r7, lr}
  32757. 802c1b6: 4605 mov r5, r0
  32758. BlockLink_t *pxBlock, *pxPreviousBlock, *pxNewBlockLink;
  32759. void *pvReturn = NULL;
  32760. vTaskSuspendAll();
  32761. 802c1b8: f7ff fb40 bl 802b83c <vTaskSuspendAll>
  32762. {
  32763. /* If this is the first call to malloc then the heap will require
  32764. initialisation to setup the list of free blocks. */
  32765. if( pxEnd == NULL )
  32766. 802c1bc: 4b3a ldr r3, [pc, #232] ; (802c2a8 <pvPortMalloc+0xf4>)
  32767. 802c1be: 681b ldr r3, [r3, #0]
  32768. 802c1c0: bb1b cbnz r3, 802c20a <pvPortMalloc+0x56>
  32769. uint8_t *pucAlignedHeap;
  32770. uint32_t ulAddress;
  32771. size_t xTotalHeapSize = configTOTAL_HEAP_SIZE;
  32772. /* Ensure the heap starts on a correctly aligned boundary. */
  32773. ulAddress = ( uint32_t ) ucHeap;
  32774. 802c1c2: 4a3a ldr r2, [pc, #232] ; (802c2ac <pvPortMalloc+0xf8>)
  32775. if( ( ulAddress & portBYTE_ALIGNMENT_MASK ) != 0 )
  32776. 802c1c4: 0756 lsls r6, r2, #29
  32777. 802c1c6: d007 beq.n 802c1d8 <pvPortMalloc+0x24>
  32778. {
  32779. ulAddress += ( portBYTE_ALIGNMENT - 1 );
  32780. 802c1c8: 1dd3 adds r3, r2, #7
  32781. ulAddress &= ~portBYTE_ALIGNMENT_MASK;
  32782. 802c1ca: f023 0307 bic.w r3, r3, #7
  32783. xTotalHeapSize -= ulAddress - ( uint32_t ) ucHeap;
  32784. 802c1ce: f502 4270 add.w r2, r2, #61440 ; 0xf000
  32785. 802c1d2: 1ad1 subs r1, r2, r3
  32786. ulAddress = ( uint32_t ) ucHeap;
  32787. if( ( ulAddress & portBYTE_ALIGNMENT_MASK ) != 0 )
  32788. {
  32789. ulAddress += ( portBYTE_ALIGNMENT - 1 );
  32790. ulAddress &= ~portBYTE_ALIGNMENT_MASK;
  32791. 802c1d4: 461a mov r2, r3
  32792. 802c1d6: e001 b.n 802c1dc <pvPortMalloc+0x28>
  32793. static void prvHeapInit( void )
  32794. {
  32795. BlockLink_t *pxFirstFreeBlock;
  32796. uint8_t *pucAlignedHeap;
  32797. uint32_t ulAddress;
  32798. size_t xTotalHeapSize = configTOTAL_HEAP_SIZE;
  32799. 802c1d8: f44f 4170 mov.w r1, #61440 ; 0xf000
  32800. xStart.pxNextFreeBlock = ( void * ) pucAlignedHeap;
  32801. xStart.xBlockSize = ( size_t ) 0;
  32802. /* pxEnd is used to mark the end of the list of free blocks and is inserted
  32803. at the end of the heap space. */
  32804. ulAddress = ( ( uint32_t ) pucAlignedHeap ) + xTotalHeapSize;
  32805. 802c1dc: 1851 adds r1, r2, r1
  32806. ulAddress -= xHeapStructSize;
  32807. 802c1de: 3908 subs r1, #8
  32808. ulAddress &= ~portBYTE_ALIGNMENT_MASK;
  32809. 802c1e0: f021 0107 bic.w r1, r1, #7
  32810. pucAlignedHeap = ( uint8_t * ) ulAddress;
  32811. /* xStart is used to hold a pointer to the first item in the list of free
  32812. blocks. The void cast is used to prevent compiler warnings. */
  32813. xStart.pxNextFreeBlock = ( void * ) pucAlignedHeap;
  32814. 802c1e4: 4832 ldr r0, [pc, #200] ; (802c2b0 <pvPortMalloc+0xfc>)
  32815. xStart.xBlockSize = ( size_t ) 0;
  32816. 802c1e6: 2300 movs r3, #0
  32817. 802c1e8: e880 000c stmia.w r0, {r2, r3}
  32818. ulAddress = ( ( uint32_t ) pucAlignedHeap ) + xTotalHeapSize;
  32819. ulAddress -= xHeapStructSize;
  32820. ulAddress &= ~portBYTE_ALIGNMENT_MASK;
  32821. pxEnd = ( void * ) ulAddress;
  32822. pxEnd->xBlockSize = 0;
  32823. pxEnd->pxNextFreeBlock = NULL;
  32824. 802c1ec: 600b str r3, [r1, #0]
  32825. at the end of the heap space. */
  32826. ulAddress = ( ( uint32_t ) pucAlignedHeap ) + xTotalHeapSize;
  32827. ulAddress -= xHeapStructSize;
  32828. ulAddress &= ~portBYTE_ALIGNMENT_MASK;
  32829. pxEnd = ( void * ) ulAddress;
  32830. pxEnd->xBlockSize = 0;
  32831. 802c1ee: 604b str r3, [r1, #4]
  32832. pxEnd->pxNextFreeBlock = NULL;
  32833. /* To start with there is a single free block that is sized to take up the
  32834. entire heap space, minus the space taken by pxEnd. */
  32835. pxFirstFreeBlock = ( void * ) pucAlignedHeap;
  32836. pxFirstFreeBlock->xBlockSize = ulAddress - ( uint32_t ) pxFirstFreeBlock;
  32837. 802c1f0: 1a8b subs r3, r1, r2
  32838. pxFirstFreeBlock->pxNextFreeBlock = pxEnd;
  32839. 802c1f2: e882 000a stmia.w r2, {r1, r3}
  32840. /* Only one block exists - and it covers the entire usable heap space. */
  32841. xMinimumEverFreeBytesRemaining = pxFirstFreeBlock->xBlockSize;
  32842. 802c1f6: 4a2f ldr r2, [pc, #188] ; (802c2b4 <pvPortMalloc+0x100>)
  32843. /* pxEnd is used to mark the end of the list of free blocks and is inserted
  32844. at the end of the heap space. */
  32845. ulAddress = ( ( uint32_t ) pucAlignedHeap ) + xTotalHeapSize;
  32846. ulAddress -= xHeapStructSize;
  32847. ulAddress &= ~portBYTE_ALIGNMENT_MASK;
  32848. pxEnd = ( void * ) ulAddress;
  32849. 802c1f8: 482b ldr r0, [pc, #172] ; (802c2a8 <pvPortMalloc+0xf4>)
  32850. pxFirstFreeBlock = ( void * ) pucAlignedHeap;
  32851. pxFirstFreeBlock->xBlockSize = ulAddress - ( uint32_t ) pxFirstFreeBlock;
  32852. pxFirstFreeBlock->pxNextFreeBlock = pxEnd;
  32853. /* Only one block exists - and it covers the entire usable heap space. */
  32854. xMinimumEverFreeBytesRemaining = pxFirstFreeBlock->xBlockSize;
  32855. 802c1fa: 6013 str r3, [r2, #0]
  32856. xFreeBytesRemaining = pxFirstFreeBlock->xBlockSize;
  32857. 802c1fc: 4a2e ldr r2, [pc, #184] ; (802c2b8 <pvPortMalloc+0x104>)
  32858. /* pxEnd is used to mark the end of the list of free blocks and is inserted
  32859. at the end of the heap space. */
  32860. ulAddress = ( ( uint32_t ) pucAlignedHeap ) + xTotalHeapSize;
  32861. ulAddress -= xHeapStructSize;
  32862. ulAddress &= ~portBYTE_ALIGNMENT_MASK;
  32863. pxEnd = ( void * ) ulAddress;
  32864. 802c1fe: 6001 str r1, [r0, #0]
  32865. pxFirstFreeBlock->xBlockSize = ulAddress - ( uint32_t ) pxFirstFreeBlock;
  32866. pxFirstFreeBlock->pxNextFreeBlock = pxEnd;
  32867. /* Only one block exists - and it covers the entire usable heap space. */
  32868. xMinimumEverFreeBytesRemaining = pxFirstFreeBlock->xBlockSize;
  32869. xFreeBytesRemaining = pxFirstFreeBlock->xBlockSize;
  32870. 802c200: 6013 str r3, [r2, #0]
  32871. /* Work out the position of the top bit in a size_t variable. */
  32872. xBlockAllocatedBit = ( ( size_t ) 1 ) << ( ( sizeof( size_t ) * heapBITS_PER_BYTE ) - 1 );
  32873. 802c202: 4b2e ldr r3, [pc, #184] ; (802c2bc <pvPortMalloc+0x108>)
  32874. 802c204: f04f 4200 mov.w r2, #2147483648 ; 0x80000000
  32875. 802c208: 601a str r2, [r3, #0]
  32876. /* Check the requested block size is not so large that the top bit is
  32877. set. The top bit of the block size member of the BlockLink_t structure
  32878. is used to determine who owns the block - the application or the
  32879. kernel, so it must be free. */
  32880. if( ( xWantedSize & xBlockAllocatedBit ) == 0 )
  32881. 802c20a: 4b2c ldr r3, [pc, #176] ; (802c2bc <pvPortMalloc+0x108>)
  32882. 802c20c: 681e ldr r6, [r3, #0]
  32883. 802c20e: 4235 tst r5, r6
  32884. 802c210: d140 bne.n 802c294 <pvPortMalloc+0xe0>
  32885. {
  32886. /* The wanted size is increased so it can contain a BlockLink_t
  32887. structure in addition to the requested amount of bytes. */
  32888. if( xWantedSize > 0 )
  32889. 802c212: 2d00 cmp r5, #0
  32890. 802c214: d03f beq.n 802c296 <pvPortMalloc+0xe2>
  32891. {
  32892. xWantedSize += xHeapStructSize;
  32893. 802c216: f105 0308 add.w r3, r5, #8
  32894. /* Ensure that blocks are always aligned to the required number
  32895. of bytes. */
  32896. if( ( xWantedSize & portBYTE_ALIGNMENT_MASK ) != 0x00 )
  32897. 802c21a: 0758 lsls r0, r3, #29
  32898. {
  32899. /* Byte alignment required. */
  32900. xWantedSize += ( portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK ) );
  32901. 802c21c: bf1c itt ne
  32902. 802c21e: f023 0307 bicne.w r3, r3, #7
  32903. 802c222: 3308 addne r3, #8
  32904. else
  32905. {
  32906. mtCOVERAGE_TEST_MARKER();
  32907. }
  32908. if( ( xWantedSize > 0 ) && ( xWantedSize <= xFreeBytesRemaining ) )
  32909. 802c224: 2b00 cmp r3, #0
  32910. 802c226: d033 beq.n 802c290 <pvPortMalloc+0xdc>
  32911. 802c228: 4a23 ldr r2, [pc, #140] ; (802c2b8 <pvPortMalloc+0x104>)
  32912. 802c22a: 6817 ldr r7, [r2, #0]
  32913. 802c22c: 42bb cmp r3, r7
  32914. 802c22e: d831 bhi.n 802c294 <pvPortMalloc+0xe0>
  32915. {
  32916. /* Traverse the list from the start (lowest address) block until
  32917. one of adequate size is found. */
  32918. pxPreviousBlock = &xStart;
  32919. pxBlock = xStart.pxNextFreeBlock;
  32920. 802c230: 4a1f ldr r2, [pc, #124] ; (802c2b0 <pvPortMalloc+0xfc>)
  32921. 802c232: 6814 ldr r4, [r2, #0]
  32922. while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) )
  32923. 802c234: e001 b.n 802c23a <pvPortMalloc+0x86>
  32924. 802c236: 4622 mov r2, r4
  32925. {
  32926. pxPreviousBlock = pxBlock;
  32927. pxBlock = pxBlock->pxNextFreeBlock;
  32928. 802c238: 4604 mov r4, r0
  32929. {
  32930. /* Traverse the list from the start (lowest address) block until
  32931. one of adequate size is found. */
  32932. pxPreviousBlock = &xStart;
  32933. pxBlock = xStart.pxNextFreeBlock;
  32934. while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) )
  32935. 802c23a: 6861 ldr r1, [r4, #4]
  32936. 802c23c: 4299 cmp r1, r3
  32937. 802c23e: d304 bcc.n 802c24a <pvPortMalloc+0x96>
  32938. pxBlock = pxBlock->pxNextFreeBlock;
  32939. }
  32940. /* If the end marker was reached then a block of adequate size
  32941. was not found. */
  32942. if( pxBlock != pxEnd )
  32943. 802c240: 4819 ldr r0, [pc, #100] ; (802c2a8 <pvPortMalloc+0xf4>)
  32944. 802c242: 6800 ldr r0, [r0, #0]
  32945. 802c244: 4284 cmp r4, r0
  32946. 802c246: d104 bne.n 802c252 <pvPortMalloc+0x9e>
  32947. 802c248: e024 b.n 802c294 <pvPortMalloc+0xe0>
  32948. {
  32949. /* Traverse the list from the start (lowest address) block until
  32950. one of adequate size is found. */
  32951. pxPreviousBlock = &xStart;
  32952. pxBlock = xStart.pxNextFreeBlock;
  32953. while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) )
  32954. 802c24a: 6820 ldr r0, [r4, #0]
  32955. 802c24c: 2800 cmp r0, #0
  32956. 802c24e: d1f2 bne.n 802c236 <pvPortMalloc+0x82>
  32957. 802c250: e7f6 b.n 802c240 <pvPortMalloc+0x8c>
  32958. BlockLink_t structure at its start. */
  32959. pvReturn = ( void * ) ( ( ( uint8_t * ) pxPreviousBlock->pxNextFreeBlock ) + xHeapStructSize );
  32960. /* This block is being returned for use so must be taken out
  32961. of the list of free blocks. */
  32962. pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock;
  32963. 802c252: 6820 ldr r0, [r4, #0]
  32964. was not found. */
  32965. if( pxBlock != pxEnd )
  32966. {
  32967. /* Return the memory space pointed to - jumping over the
  32968. BlockLink_t structure at its start. */
  32969. pvReturn = ( void * ) ( ( ( uint8_t * ) pxPreviousBlock->pxNextFreeBlock ) + xHeapStructSize );
  32970. 802c254: 6815 ldr r5, [r2, #0]
  32971. /* This block is being returned for use so must be taken out
  32972. of the list of free blocks. */
  32973. pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock;
  32974. 802c256: 6010 str r0, [r2, #0]
  32975. /* If the block is larger than required it can be split into
  32976. two. */
  32977. if( ( pxBlock->xBlockSize - xWantedSize ) > heapMINIMUM_BLOCK_SIZE )
  32978. 802c258: 1aca subs r2, r1, r3
  32979. was not found. */
  32980. if( pxBlock != pxEnd )
  32981. {
  32982. /* Return the memory space pointed to - jumping over the
  32983. BlockLink_t structure at its start. */
  32984. pvReturn = ( void * ) ( ( ( uint8_t * ) pxPreviousBlock->pxNextFreeBlock ) + xHeapStructSize );
  32985. 802c25a: 3508 adds r5, #8
  32986. of the list of free blocks. */
  32987. pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock;
  32988. /* If the block is larger than required it can be split into
  32989. two. */
  32990. if( ( pxBlock->xBlockSize - xWantedSize ) > heapMINIMUM_BLOCK_SIZE )
  32991. 802c25c: 2a10 cmp r2, #16
  32992. 802c25e: d909 bls.n 802c274 <pvPortMalloc+0xc0>
  32993. {
  32994. /* This block is to be split into two. Create a new
  32995. block following the number of bytes requested. The void
  32996. cast is used to prevent byte alignment warnings from the
  32997. compiler. */
  32998. pxNewBlockLink = ( void * ) ( ( ( uint8_t * ) pxBlock ) + xWantedSize );
  32999. 802c260: 18e0 adds r0, r4, r3
  33000. configASSERT( ( ( ( uint32_t ) pxNewBlockLink ) & portBYTE_ALIGNMENT_MASK ) == 0 );
  33001. 802c262: 0741 lsls r1, r0, #29
  33002. 802c264: d002 beq.n 802c26c <pvPortMalloc+0xb8>
  33003. 802c266: f7ff fe8f bl 802bf88 <ulPortSetInterruptMask>
  33004. 802c26a: e7fe b.n 802c26a <pvPortMalloc+0xb6>
  33005. /* Calculate the sizes of two blocks split from the
  33006. single block. */
  33007. pxNewBlockLink->xBlockSize = pxBlock->xBlockSize - xWantedSize;
  33008. 802c26c: 6042 str r2, [r0, #4]
  33009. pxBlock->xBlockSize = xWantedSize;
  33010. 802c26e: 6063 str r3, [r4, #4]
  33011. /* Insert the new block into the list of free blocks. */
  33012. prvInsertBlockIntoFreeList( ( pxNewBlockLink ) );
  33013. 802c270: f7ff ff7c bl 802c16c <prvInsertBlockIntoFreeList>
  33014. else
  33015. {
  33016. mtCOVERAGE_TEST_MARKER();
  33017. }
  33018. xFreeBytesRemaining -= pxBlock->xBlockSize;
  33019. 802c274: 6862 ldr r2, [r4, #4]
  33020. 802c276: 4910 ldr r1, [pc, #64] ; (802c2b8 <pvPortMalloc+0x104>)
  33021. 802c278: 1abb subs r3, r7, r2
  33022. 802c27a: 600b str r3, [r1, #0]
  33023. if( xFreeBytesRemaining < xMinimumEverFreeBytesRemaining )
  33024. 802c27c: 490d ldr r1, [pc, #52] ; (802c2b4 <pvPortMalloc+0x100>)
  33025. 802c27e: 6808 ldr r0, [r1, #0]
  33026. 802c280: 4283 cmp r3, r0
  33027. {
  33028. xMinimumEverFreeBytesRemaining = xFreeBytesRemaining;
  33029. 802c282: bf38 it cc
  33030. 802c284: 600b strcc r3, [r1, #0]
  33031. mtCOVERAGE_TEST_MARKER();
  33032. }
  33033. /* The block is being returned - it is allocated and owned
  33034. by the application and has no "next" block. */
  33035. pxBlock->xBlockSize |= xBlockAllocatedBit;
  33036. 802c286: 4316 orrs r6, r2
  33037. pxBlock->pxNextFreeBlock = NULL;
  33038. 802c288: 2300 movs r3, #0
  33039. 802c28a: e884 0048 stmia.w r4, {r3, r6}
  33040. 802c28e: e002 b.n 802c296 <pvPortMalloc+0xe2>
  33041. /*-----------------------------------------------------------*/
  33042. void *pvPortMalloc( size_t xWantedSize )
  33043. {
  33044. BlockLink_t *pxBlock, *pxPreviousBlock, *pxNewBlockLink;
  33045. void *pvReturn = NULL;
  33046. 802c290: 461d mov r5, r3
  33047. 802c292: e000 b.n 802c296 <pvPortMalloc+0xe2>
  33048. 802c294: 2500 movs r5, #0
  33049. mtCOVERAGE_TEST_MARKER();
  33050. }
  33051. traceMALLOC( pvReturn, xWantedSize );
  33052. }
  33053. ( void ) xTaskResumeAll();
  33054. 802c296: f7ff fb6d bl 802b974 <xTaskResumeAll>
  33055. mtCOVERAGE_TEST_MARKER();
  33056. }
  33057. }
  33058. #endif
  33059. configASSERT( ( ( ( uint32_t ) pvReturn ) & portBYTE_ALIGNMENT_MASK ) == 0 );
  33060. 802c29a: 076b lsls r3, r5, #29
  33061. 802c29c: d002 beq.n 802c2a4 <pvPortMalloc+0xf0>
  33062. 802c29e: f7ff fe73 bl 802bf88 <ulPortSetInterruptMask>
  33063. 802c2a2: e7fe b.n 802c2a2 <pvPortMalloc+0xee>
  33064. return pvReturn;
  33065. }
  33066. 802c2a4: 4628 mov r0, r5
  33067. 802c2a6: bdf8 pop {r3, r4, r5, r6, r7, pc}
  33068. 802c2a8: 20000d48 .word 0x20000d48
  33069. 802c2ac: 10000000 .word 0x10000000
  33070. 802c2b0: 20000d4c .word 0x20000d4c
  33071. 802c2b4: 20000d54 .word 0x20000d54
  33072. 802c2b8: 20000d44 .word 0x20000d44
  33073. 802c2bc: 20000d58 .word 0x20000d58
  33074. 0802c2c0 <vPortFree>:
  33075. /*-----------------------------------------------------------*/
  33076. void vPortFree( void *pv )
  33077. {
  33078. 802c2c0: b510 push {r4, lr}
  33079. uint8_t *puc = ( uint8_t * ) pv;
  33080. BlockLink_t *pxLink;
  33081. if( pv != NULL )
  33082. 802c2c2: 4604 mov r4, r0
  33083. 802c2c4: b310 cbz r0, 802c30c <vPortFree+0x4c>
  33084. /* This casting is to keep the compiler from issuing warnings. */
  33085. pxLink = ( void * ) puc;
  33086. /* Check the block is actually allocated. */
  33087. configASSERT( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 );
  33088. 802c2c6: 4a12 ldr r2, [pc, #72] ; (802c310 <vPortFree+0x50>)
  33089. 802c2c8: f850 3c04 ldr.w r3, [r0, #-4]
  33090. 802c2cc: 6812 ldr r2, [r2, #0]
  33091. 802c2ce: 421a tst r2, r3
  33092. 802c2d0: d102 bne.n 802c2d8 <vPortFree+0x18>
  33093. 802c2d2: f7ff fe59 bl 802bf88 <ulPortSetInterruptMask>
  33094. 802c2d6: e7fe b.n 802c2d6 <vPortFree+0x16>
  33095. configASSERT( pxLink->pxNextFreeBlock == NULL );
  33096. 802c2d8: f850 1c08 ldr.w r1, [r0, #-8]
  33097. 802c2dc: b111 cbz r1, 802c2e4 <vPortFree+0x24>
  33098. 802c2de: f7ff fe53 bl 802bf88 <ulPortSetInterruptMask>
  33099. 802c2e2: e7fe b.n 802c2e2 <vPortFree+0x22>
  33100. {
  33101. if( pxLink->pxNextFreeBlock == NULL )
  33102. {
  33103. /* The block is being returned to the heap - it is no longer
  33104. allocated. */
  33105. pxLink->xBlockSize &= ~xBlockAllocatedBit;
  33106. 802c2e4: ea23 0302 bic.w r3, r3, r2
  33107. 802c2e8: f840 3c04 str.w r3, [r0, #-4]
  33108. vTaskSuspendAll();
  33109. 802c2ec: f7ff faa6 bl 802b83c <vTaskSuspendAll>
  33110. {
  33111. /* Add this block to the list of free blocks. */
  33112. xFreeBytesRemaining += pxLink->xBlockSize;
  33113. 802c2f0: 4b08 ldr r3, [pc, #32] ; (802c314 <vPortFree+0x54>)
  33114. 802c2f2: f854 1c04 ldr.w r1, [r4, #-4]
  33115. 802c2f6: 681a ldr r2, [r3, #0]
  33116. traceFREE( pv, pxLink->xBlockSize );
  33117. prvInsertBlockIntoFreeList( ( ( BlockLink_t * ) pxLink ) );
  33118. 802c2f8: f1a4 0008 sub.w r0, r4, #8
  33119. pxLink->xBlockSize &= ~xBlockAllocatedBit;
  33120. vTaskSuspendAll();
  33121. {
  33122. /* Add this block to the list of free blocks. */
  33123. xFreeBytesRemaining += pxLink->xBlockSize;
  33124. 802c2fc: 188a adds r2, r1, r2
  33125. 802c2fe: 601a str r2, [r3, #0]
  33126. traceFREE( pv, pxLink->xBlockSize );
  33127. prvInsertBlockIntoFreeList( ( ( BlockLink_t * ) pxLink ) );
  33128. 802c300: f7ff ff34 bl 802c16c <prvInsertBlockIntoFreeList>
  33129. else
  33130. {
  33131. mtCOVERAGE_TEST_MARKER();
  33132. }
  33133. }
  33134. }
  33135. 802c304: e8bd 4010 ldmia.w sp!, {r4, lr}
  33136. /* Add this block to the list of free blocks. */
  33137. xFreeBytesRemaining += pxLink->xBlockSize;
  33138. traceFREE( pv, pxLink->xBlockSize );
  33139. prvInsertBlockIntoFreeList( ( ( BlockLink_t * ) pxLink ) );
  33140. }
  33141. ( void ) xTaskResumeAll();
  33142. 802c308: f7ff bb34 b.w 802b974 <xTaskResumeAll>
  33143. 802c30c: bd10 pop {r4, pc}
  33144. 802c30e: bf00 nop
  33145. 802c310: 20000d58 .word 0x20000d58
  33146. 802c314: 20000d44 .word 0x20000d44
  33147. 0802c318 <http_sent_log_err>:
  33148. static void http_sent_log_err(void * arg, err_t err)
  33149. {
  33150. (void)err;
  33151. (void)arg;
  33152. /* Clear file transfer in progress flag */
  33153. fLogTransInprog = false;
  33154. 802c318: 4b01 ldr r3, [pc, #4] ; (802c320 <http_sent_log_err+0x8>)
  33155. 802c31a: 2200 movs r2, #0
  33156. 802c31c: 701a strb r2, [r3, #0]
  33157. 802c31e: 4770 bx lr
  33158. 802c320: 20000d6c .word 0x20000d6c
  33159. 0802c324 <Parse_Content_Length>:
  33160. {
  33161. uint32_t i=0,size=0, S=1;
  33162. int32_t j=0;
  33163. char sizestring[6], *ptr;
  33164. ContentLengthOffset =0;
  33165. 802c324: 4b1b ldr r3, [pc, #108] ; (802c394 <Parse_Content_Length+0x70>)
  33166. * @param data : pointer on receive packet buffer
  33167. * @param len : buffer length
  33168. * @retval size : Content_length in numeric format
  33169. */
  33170. static uint32_t Parse_Content_Length(char *data, uint32_t len)
  33171. {
  33172. 802c326: b573 push {r0, r1, r4, r5, r6, lr}
  33173. uint32_t i=0,size=0, S=1;
  33174. int32_t j=0;
  33175. char sizestring[6], *ptr;
  33176. ContentLengthOffset =0;
  33177. 802c328: 2400 movs r4, #0
  33178. * @param data : pointer on receive packet buffer
  33179. * @param len : buffer length
  33180. * @retval size : Content_length in numeric format
  33181. */
  33182. static uint32_t Parse_Content_Length(char *data, uint32_t len)
  33183. {
  33184. 802c32a: 4605 mov r5, r0
  33185. 802c32c: 460e mov r6, r1
  33186. uint32_t i=0,size=0, S=1;
  33187. int32_t j=0;
  33188. char sizestring[6], *ptr;
  33189. ContentLengthOffset =0;
  33190. 802c32e: 601c str r4, [r3, #0]
  33191. /* find Content-Length data in packet buffer */
  33192. for (i=0;i<len;i++)
  33193. 802c330: e00a b.n 802c348 <Parse_Content_Length+0x24>
  33194. {
  33195. if (strncmp ((char*)(data+i), Content_Length, 16)==0)
  33196. 802c332: 1928 adds r0, r5, r4
  33197. 802c334: 4918 ldr r1, [pc, #96] ; (802c398 <Parse_Content_Length+0x74>)
  33198. 802c336: 2210 movs r2, #16
  33199. 802c338: f7f5 ffa8 bl 802228c <strncmp>
  33200. 802c33c: b918 cbnz r0, 802c346 <Parse_Content_Length+0x22>
  33201. {
  33202. ContentLengthOffset = i+16;
  33203. 802c33e: 4b15 ldr r3, [pc, #84] ; (802c394 <Parse_Content_Length+0x70>)
  33204. 802c340: 3410 adds r4, #16
  33205. 802c342: 601c str r4, [r3, #0]
  33206. break;
  33207. 802c344: e002 b.n 802c34c <Parse_Content_Length+0x28>
  33208. char sizestring[6], *ptr;
  33209. ContentLengthOffset =0;
  33210. /* find Content-Length data in packet buffer */
  33211. for (i=0;i<len;i++)
  33212. 802c346: 3401 adds r4, #1
  33213. 802c348: 42b4 cmp r4, r6
  33214. 802c34a: d1f2 bne.n 802c332 <Parse_Content_Length+0xe>
  33215. ContentLengthOffset = i+16;
  33216. break;
  33217. }
  33218. }
  33219. /* read Content-Length value */
  33220. if (ContentLengthOffset)
  33221. 802c34c: 4b11 ldr r3, [pc, #68] ; (802c394 <Parse_Content_Length+0x70>)
  33222. 802c34e: 681a ldr r2, [r3, #0]
  33223. 802c350: 4618 mov r0, r3
  33224. 802c352: b90a cbnz r2, 802c358 <Parse_Content_Length+0x34>
  33225. * @param len : buffer length
  33226. * @retval size : Content_length in numeric format
  33227. */
  33228. static uint32_t Parse_Content_Length(char *data, uint32_t len)
  33229. {
  33230. uint32_t i=0,size=0, S=1;
  33231. 802c354: 2000 movs r0, #0
  33232. 802c356: e01b b.n 802c390 <Parse_Content_Length+0x6c>
  33233. }
  33234. /* read Content-Length value */
  33235. if (ContentLengthOffset)
  33236. {
  33237. i=0;
  33238. ptr = (char*)(data + ContentLengthOffset);
  33239. 802c358: 18ad adds r5, r5, r2
  33240. }
  33241. }
  33242. /* read Content-Length value */
  33243. if (ContentLengthOffset)
  33244. {
  33245. i=0;
  33246. 802c35a: 2300 movs r3, #0
  33247. ptr = (char*)(data + ContentLengthOffset);
  33248. while(*(ptr+i)!=0x0d)
  33249. 802c35c: e002 b.n 802c364 <Parse_Content_Length+0x40>
  33250. {
  33251. sizestring[i] = *(ptr+i);
  33252. 802c35e: f80d 1003 strb.w r1, [sp, r3]
  33253. i++;
  33254. 802c362: 3301 adds r3, #1
  33255. /* read Content-Length value */
  33256. if (ContentLengthOffset)
  33257. {
  33258. i=0;
  33259. ptr = (char*)(data + ContentLengthOffset);
  33260. while(*(ptr+i)!=0x0d)
  33261. 802c364: 5ce9 ldrb r1, [r5, r3]
  33262. 802c366: 290d cmp r1, #13
  33263. 802c368: eb03 0402 add.w r4, r3, r2
  33264. 802c36c: d1f7 bne.n 802c35e <Parse_Content_Length+0x3a>
  33265. 802c36e: 6004 str r4, [r0, #0]
  33266. {
  33267. sizestring[i] = *(ptr+i);
  33268. i++;
  33269. ContentLengthOffset++;
  33270. }
  33271. if (i>0)
  33272. 802c370: 2b00 cmp r3, #0
  33273. 802c372: d0ef beq.n 802c354 <Parse_Content_Length+0x30>
  33274. {
  33275. /* transform string data into numeric format */
  33276. for(j=i-1;j>=0;j--)
  33277. 802c374: 3b01 subs r3, #1
  33278. * @param len : buffer length
  33279. * @retval size : Content_length in numeric format
  33280. */
  33281. static uint32_t Parse_Content_Length(char *data, uint32_t len)
  33282. {
  33283. uint32_t i=0,size=0, S=1;
  33284. 802c376: 2201 movs r2, #1
  33285. 802c378: 2000 movs r0, #0
  33286. {
  33287. /* transform string data into numeric format */
  33288. for(j=i-1;j>=0;j--)
  33289. {
  33290. size += (sizestring[j]-0x30)*S;
  33291. S=S*10;
  33292. 802c37a: 210a movs r1, #10
  33293. ContentLengthOffset++;
  33294. }
  33295. if (i>0)
  33296. {
  33297. /* transform string data into numeric format */
  33298. for(j=i-1;j>=0;j--)
  33299. 802c37c: e006 b.n 802c38c <Parse_Content_Length+0x68>
  33300. {
  33301. size += (sizestring[j]-0x30)*S;
  33302. 802c37e: f81d 4003 ldrb.w r4, [sp, r3]
  33303. 802c382: 3c30 subs r4, #48 ; 0x30
  33304. 802c384: fb02 0004 mla r0, r2, r4, r0
  33305. ContentLengthOffset++;
  33306. }
  33307. if (i>0)
  33308. {
  33309. /* transform string data into numeric format */
  33310. for(j=i-1;j>=0;j--)
  33311. 802c388: 3b01 subs r3, #1
  33312. {
  33313. size += (sizestring[j]-0x30)*S;
  33314. S=S*10;
  33315. 802c38a: 434a muls r2, r1
  33316. ContentLengthOffset++;
  33317. }
  33318. if (i>0)
  33319. {
  33320. /* transform string data into numeric format */
  33321. for(j=i-1;j>=0;j--)
  33322. 802c38c: 2b00 cmp r3, #0
  33323. 802c38e: daf6 bge.n 802c37e <Parse_Content_Length+0x5a>
  33324. S=S*10;
  33325. }
  33326. }
  33327. }
  33328. return size;
  33329. }
  33330. 802c390: bd7c pop {r2, r3, r4, r5, r6, pc}
  33331. 802c392: bf00 nop
  33332. 802c394: 20000d68 .word 0x20000d68
  33333. 802c398: 0803b820 .word 0x0803b820
  33334. 0802c39c <HTTP_UpdateUserLoginTime>:
  33335. /**
  33336. * @brief Обновление времени последней активности пользователя
  33337. */
  33338. static void HTTP_UpdateUserLoginTime(uint8_t user_id)
  33339. {
  33340. xTimerStart(users[user_id].LogoutTimer, 0);
  33341. 802c39c: 4b07 ldr r3, [pc, #28] ; (802c3bc <HTTP_UpdateUserLoginTime+0x20>)
  33342. 802c39e: 2214 movs r2, #20
  33343. /**
  33344. * @brief Обновление времени последней активности пользователя
  33345. */
  33346. static void HTTP_UpdateUserLoginTime(uint8_t user_id)
  33347. {
  33348. 802c3a0: b513 push {r0, r1, r4, lr}
  33349. xTimerStart(users[user_id].LogoutTimer, 0);
  33350. 802c3a2: fb02 3000 mla r0, r2, r0, r3
  33351. 802c3a6: 6904 ldr r4, [r0, #16]
  33352. 802c3a8: f7ff fa50 bl 802b84c <xTaskGetTickCount>
  33353. 802c3ac: 2300 movs r3, #0
  33354. 802c3ae: 4602 mov r2, r0
  33355. 802c3b0: 9300 str r3, [sp, #0]
  33356. 802c3b2: 4620 mov r0, r4
  33357. 802c3b4: 2101 movs r1, #1
  33358. 802c3b6: f7fe fc4f bl 802ac58 <xTimerGenericCommand>
  33359. }
  33360. 802c3ba: bd1c pop {r2, r3, r4, pc}
  33361. 802c3bc: 2000eaa0 .word 0x2000eaa0
  33362. 0802c3c0 <fs_open>:
  33363. * @param name : pointer to a file name
  33364. * @param file : pointer to a fs_file structure
  33365. * @retval 1 if success, 0 if fail
  33366. */
  33367. static int fs_open(char *name, struct fs_file *file)
  33368. {
  33369. 802c3c0: b570 push {r4, r5, r6, lr}
  33370. struct fsdata_file_noconst *f;
  33371. for (f = (struct fsdata_file_noconst *)FS_ROOT; f != NULL; f = (struct fsdata_file_noconst *)f->next)
  33372. 802c3c2: 4c09 ldr r4, [pc, #36] ; (802c3e8 <fs_open+0x28>)
  33373. * @param name : pointer to a file name
  33374. * @param file : pointer to a fs_file structure
  33375. * @retval 1 if success, 0 if fail
  33376. */
  33377. static int fs_open(char *name, struct fs_file *file)
  33378. {
  33379. 802c3c4: 4606 mov r6, r0
  33380. 802c3c6: 460d mov r5, r1
  33381. struct fsdata_file_noconst *f;
  33382. for (f = (struct fsdata_file_noconst *)FS_ROOT; f != NULL; f = (struct fsdata_file_noconst *)f->next)
  33383. {
  33384. if (!strcmp(name, f->name))
  33385. 802c3c8: 4630 mov r0, r6
  33386. 802c3ca: 6861 ldr r1, [r4, #4]
  33387. 802c3cc: f7f5 fdb0 bl 8021f30 <strcmp>
  33388. 802c3d0: b928 cbnz r0, 802c3de <fs_open+0x1e>
  33389. {
  33390. file->data = f->data;
  33391. 802c3d2: 68a3 ldr r3, [r4, #8]
  33392. 802c3d4: 602b str r3, [r5, #0]
  33393. file->len = f->len;
  33394. 802c3d6: 68e3 ldr r3, [r4, #12]
  33395. return 1;
  33396. 802c3d8: 2001 movs r0, #1
  33397. for (f = (struct fsdata_file_noconst *)FS_ROOT; f != NULL; f = (struct fsdata_file_noconst *)f->next)
  33398. {
  33399. if (!strcmp(name, f->name))
  33400. {
  33401. file->data = f->data;
  33402. file->len = f->len;
  33403. 802c3da: 606b str r3, [r5, #4]
  33404. return 1;
  33405. 802c3dc: bd70 pop {r4, r5, r6, pc}
  33406. */
  33407. static int fs_open(char *name, struct fs_file *file)
  33408. {
  33409. struct fsdata_file_noconst *f;
  33410. for (f = (struct fsdata_file_noconst *)FS_ROOT; f != NULL; f = (struct fsdata_file_noconst *)f->next)
  33411. 802c3de: 6824 ldr r4, [r4, #0]
  33412. 802c3e0: 2c00 cmp r4, #0
  33413. 802c3e2: d1f1 bne.n 802c3c8 <fs_open+0x8>
  33414. file->data = f->data;
  33415. file->len = f->len;
  33416. return 1;
  33417. }
  33418. }
  33419. return 0;
  33420. 802c3e4: 4620 mov r0, r4
  33421. }
  33422. 802c3e6: bd70 pop {r4, r5, r6, pc}
  33423. 802c3e8: 0804068c .word 0x0804068c
  33424. 0802c3ec <http_accept>:
  33425. * @param pcb: pointer to a tcp_pcb structure
  33426. * &param err: Lwip stack error code
  33427. * @retval err
  33428. */
  33429. static err_t http_accept(void *arg, struct tcp_pcb *pcb, err_t err)
  33430. {
  33431. 802c3ec: b538 push {r3, r4, r5, lr}
  33432. struct http_state *hs;
  33433. /* Allocate memory for the structure that holds the state of the connection */
  33434. hs = mem_malloc(sizeof(struct http_state));
  33435. 802c3ee: 2008 movs r0, #8
  33436. * @param pcb: pointer to a tcp_pcb structure
  33437. * &param err: Lwip stack error code
  33438. * @retval err
  33439. */
  33440. static err_t http_accept(void *arg, struct tcp_pcb *pcb, err_t err)
  33441. {
  33442. 802c3f0: 460c mov r4, r1
  33443. struct http_state *hs;
  33444. /* Allocate memory for the structure that holds the state of the connection */
  33445. hs = mem_malloc(sizeof(struct http_state));
  33446. 802c3f2: f003 fa9f bl 802f934 <mem_malloc>
  33447. if (hs == NULL)
  33448. 802c3f6: 4601 mov r1, r0
  33449. 802c3f8: b1a0 cbz r0, 802c424 <http_accept+0x38>
  33450. {
  33451. return ERR_MEM;
  33452. }
  33453. /* Initialize the structure. */
  33454. hs->file = NULL;
  33455. 802c3fa: 2500 movs r5, #0
  33456. 802c3fc: 6005 str r5, [r0, #0]
  33457. hs->left = 0;
  33458. 802c3fe: 6045 str r5, [r0, #4]
  33459. /* Tell TCP that this is the structure we wish to be passed for our
  33460. callbacks. */
  33461. tcp_arg(pcb, hs);
  33462. 802c400: 4620 mov r0, r4
  33463. 802c402: f003 ff05 bl 8030210 <tcp_arg>
  33464. /* Tell TCP that we wish to be informed of incoming data by a call
  33465. to the http_recv() function. */
  33466. tcp_recv(pcb, http_recv);
  33467. 802c406: 4620 mov r0, r4
  33468. 802c408: 4908 ldr r1, [pc, #32] ; (802c42c <http_accept+0x40>)
  33469. 802c40a: f003 ff03 bl 8030214 <tcp_recv>
  33470. tcp_err(pcb, conn_err);
  33471. 802c40e: 4620 mov r0, r4
  33472. 802c410: 4907 ldr r1, [pc, #28] ; (802c430 <http_accept+0x44>)
  33473. 802c412: f003 ff03 bl 803021c <tcp_err>
  33474. tcp_poll(pcb, http_poll, 10);
  33475. 802c416: 4620 mov r0, r4
  33476. 802c418: 4906 ldr r1, [pc, #24] ; (802c434 <http_accept+0x48>)
  33477. 802c41a: 220a movs r2, #10
  33478. 802c41c: f003 ff03 bl 8030226 <tcp_poll>
  33479. return ERR_OK;
  33480. 802c420: 4628 mov r0, r5
  33481. 802c422: e000 b.n 802c426 <http_accept+0x3a>
  33482. /* Allocate memory for the structure that holds the state of the connection */
  33483. hs = mem_malloc(sizeof(struct http_state));
  33484. if (hs == NULL)
  33485. {
  33486. return ERR_MEM;
  33487. 802c424: 20ff movs r0, #255 ; 0xff
  33488. tcp_err(pcb, conn_err);
  33489. tcp_poll(pcb, http_poll, 10);
  33490. return ERR_OK;
  33491. }
  33492. 802c426: b240 sxtb r0, r0
  33493. 802c428: bd38 pop {r3, r4, r5, pc}
  33494. 802c42a: bf00 nop
  33495. 802c42c: 0802d439 .word 0x0802d439
  33496. 802c430: 0802c47b .word 0x0802c47b
  33497. 802c434: 0802c463 .word 0x0802c463
  33498. 0802c438 <send_data>:
  33499. * @param pcb: pointer to a tcp_pcb struct
  33500. * @param hs: pointer to a http_state struct
  33501. * @retval none
  33502. */
  33503. static void send_data(struct tcp_pcb *pcb, struct http_state *hs)
  33504. {
  33505. 802c438: b538 push {r3, r4, r5, lr}
  33506. err_t err;
  33507. u16_t len;
  33508. /* We cannot send more data than space available in the send
  33509. buffer */
  33510. if (tcp_sndbuf(pcb) < hs->left)
  33511. 802c43a: 684b ldr r3, [r1, #4]
  33512. 802c43c: f8b0 5066 ldrh.w r5, [r0, #102] ; 0x66
  33513. 802c440: 429d cmp r5, r3
  33514. {
  33515. len = tcp_sndbuf(pcb);
  33516. }
  33517. else
  33518. {
  33519. len = hs->left;
  33520. 802c442: bf28 it cs
  33521. 802c444: b29d uxthcs r5, r3
  33522. * @param pcb: pointer to a tcp_pcb struct
  33523. * @param hs: pointer to a http_state struct
  33524. * @retval none
  33525. */
  33526. static void send_data(struct tcp_pcb *pcb, struct http_state *hs)
  33527. {
  33528. 802c446: 460c mov r4, r1
  33529. }
  33530. else
  33531. {
  33532. len = hs->left;
  33533. }
  33534. err = tcp_write(pcb, hs->file, len, 0);
  33535. 802c448: 462a mov r2, r5
  33536. 802c44a: 6809 ldr r1, [r1, #0]
  33537. 802c44c: 2300 movs r3, #0
  33538. 802c44e: f005 fa44 bl 80318da <tcp_write>
  33539. if (err == ERR_OK)
  33540. 802c452: b928 cbnz r0, 802c460 <send_data+0x28>
  33541. {
  33542. hs->file += len;
  33543. 802c454: 6823 ldr r3, [r4, #0]
  33544. 802c456: 195b adds r3, r3, r5
  33545. 802c458: 6023 str r3, [r4, #0]
  33546. hs->left -= len;
  33547. 802c45a: 6863 ldr r3, [r4, #4]
  33548. 802c45c: 1b5d subs r5, r3, r5
  33549. 802c45e: 6065 str r5, [r4, #4]
  33550. 802c460: bd38 pop {r3, r4, r5, pc}
  33551. 0802c462 <http_poll>:
  33552. * @param arg: pointer to an argument to be passed to callback function
  33553. * @param pcb: pointer on tcp_pcb structure
  33554. * @retval err_t
  33555. */
  33556. static err_t http_poll(void *arg, struct tcp_pcb *pcb)
  33557. {
  33558. 802c462: b508 push {r3, lr}
  33559. if (arg == NULL)
  33560. 802c464: 4603 mov r3, r0
  33561. {
  33562. tcp_close(pcb);
  33563. 802c466: 4608 mov r0, r1
  33564. * @param pcb: pointer on tcp_pcb structure
  33565. * @retval err_t
  33566. */
  33567. static err_t http_poll(void *arg, struct tcp_pcb *pcb)
  33568. {
  33569. if (arg == NULL)
  33570. 802c468: b913 cbnz r3, 802c470 <http_poll+0xe>
  33571. {
  33572. tcp_close(pcb);
  33573. 802c46a: f004 f96f bl 803074c <tcp_close>
  33574. 802c46e: e002 b.n 802c476 <http_poll+0x14>
  33575. }
  33576. else
  33577. {
  33578. send_data(pcb, (struct http_state *)arg);
  33579. 802c470: 4619 mov r1, r3
  33580. 802c472: f7ff ffe1 bl 802c438 <send_data>
  33581. }
  33582. return ERR_OK;
  33583. }
  33584. 802c476: 2000 movs r0, #0
  33585. 802c478: bd08 pop {r3, pc}
  33586. 0802c47a <conn_err>:
  33587. static void conn_err(void *arg, err_t err)
  33588. {
  33589. struct http_state *hs;
  33590. hs = arg;
  33591. mem_free(hs);
  33592. 802c47a: f003 b993 b.w 802f7a4 <mem_free>
  33593. 0802c47e <close_conn>:
  33594. * @param pcb: pointer to a tcp_pcb struct
  33595. * @param hs: pointer to a http_state struct
  33596. * @retval
  33597. */
  33598. static void close_conn(struct tcp_pcb *pcb, struct http_state *hs)
  33599. {
  33600. 802c47e: b538 push {r3, r4, r5, lr}
  33601. 802c480: 4604 mov r4, r0
  33602. 802c482: 460d mov r5, r1
  33603. tcp_arg(pcb, NULL);
  33604. 802c484: 2100 movs r1, #0
  33605. 802c486: f003 fec3 bl 8030210 <tcp_arg>
  33606. tcp_sent(pcb, NULL);
  33607. 802c48a: 4620 mov r0, r4
  33608. 802c48c: 2100 movs r1, #0
  33609. 802c48e: f003 fec3 bl 8030218 <tcp_sent>
  33610. tcp_recv(pcb, NULL);
  33611. 802c492: 4620 mov r0, r4
  33612. 802c494: 2100 movs r1, #0
  33613. 802c496: f003 febd bl 8030214 <tcp_recv>
  33614. mem_free(hs);
  33615. 802c49a: 4628 mov r0, r5
  33616. 802c49c: f003 f982 bl 802f7a4 <mem_free>
  33617. tcp_close(pcb);
  33618. 802c4a0: 4620 mov r0, r4
  33619. }
  33620. 802c4a2: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr}
  33621. {
  33622. tcp_arg(pcb, NULL);
  33623. tcp_sent(pcb, NULL);
  33624. tcp_recv(pcb, NULL);
  33625. mem_free(hs);
  33626. tcp_close(pcb);
  33627. 802c4a6: f004 b951 b.w 803074c <tcp_close>
  33628. 0802c4aa <http_sent>:
  33629. * @param pcb: pointer on tcp_pcb structure
  33630. * @param len
  33631. * @retval err : LwIP error code
  33632. */
  33633. static err_t http_sent(void *arg, struct tcp_pcb *pcb, u16_t len)
  33634. {
  33635. 802c4aa: b508 push {r3, lr}
  33636. 802c4ac: 4603 mov r3, r0
  33637. 802c4ae: 4608 mov r0, r1
  33638. struct http_state *hs;
  33639. hs = arg;
  33640. if (hs->left > 0)
  33641. 802c4b0: 685a ldr r2, [r3, #4]
  33642. {
  33643. send_data(pcb, hs);
  33644. 802c4b2: 4619 mov r1, r3
  33645. {
  33646. struct http_state *hs;
  33647. hs = arg;
  33648. if (hs->left > 0)
  33649. 802c4b4: b112 cbz r2, 802c4bc <http_sent+0x12>
  33650. {
  33651. send_data(pcb, hs);
  33652. 802c4b6: f7ff ffbf bl 802c438 <send_data>
  33653. 802c4ba: e001 b.n 802c4c0 <http_sent+0x16>
  33654. }
  33655. else
  33656. {
  33657. close_conn(pcb, hs);
  33658. 802c4bc: f7ff ffdf bl 802c47e <close_conn>
  33659. }
  33660. return ERR_OK;
  33661. }
  33662. 802c4c0: 2000 movs r0, #0
  33663. 802c4c2: bd08 pop {r3, pc}
  33664. 0802c4c4 <http_sent_log>:
  33665. /**
  33666. * @brief Sent callback for log file transfer (messages as is, not ordered)
  33667. */
  33668. static err_t http_sent_log(void *arg, struct tcp_pcb *pcb, u16_t len)
  33669. {
  33670. 802c4c4: b570 push {r4, r5, r6, lr}
  33671. static bool start = true;
  33672. (void)len;
  33673. hs = arg;
  33674. if (hs->left > 0)
  33675. 802c4c6: 6845 ldr r5, [r0, #4]
  33676. /**
  33677. * @brief Sent callback for log file transfer (messages as is, not ordered)
  33678. */
  33679. static err_t http_sent_log(void *arg, struct tcp_pcb *pcb, u16_t len)
  33680. {
  33681. 802c4c8: 4604 mov r4, r0
  33682. 802c4ca: 460e mov r6, r1
  33683. static bool start = true;
  33684. (void)len;
  33685. hs = arg;
  33686. if (hs->left > 0)
  33687. 802c4cc: b125 cbz r5, 802c4d8 <http_sent_log+0x14>
  33688. {
  33689. send_data(pcb, hs);
  33690. 802c4ce: 4608 mov r0, r1
  33691. 802c4d0: 4621 mov r1, r4
  33692. 802c4d2: f7ff ffb1 bl 802c438 <send_data>
  33693. 802c4d6: e036 b.n 802c546 <http_sent_log+0x82>
  33694. }
  33695. else
  33696. {
  33697. memset(logFileBuf, 0, FILE_BUF_MAX_LEN);
  33698. 802c4d8: f44f 727a mov.w r2, #1000 ; 0x3e8
  33699. 802c4dc: 481b ldr r0, [pc, #108] ; (802c54c <http_sent_log+0x88>)
  33700. 802c4de: 4629 mov r1, r5
  33701. 802c4e0: f7f5 fc9a bl 8021e18 <memset>
  33702. if (log_ptr + FILE_BUF_MAX_LEN_LOG <= log_size) {
  33703. 802c4e4: 4b1a ldr r3, [pc, #104] ; (802c550 <http_sent_log+0x8c>)
  33704. 802c4e6: 6818 ldr r0, [r3, #0]
  33705. 802c4e8: 4b1a ldr r3, [pc, #104] ; (802c554 <http_sent_log+0x90>)
  33706. 802c4ea: 681a ldr r2, [r3, #0]
  33707. 802c4ec: f500 7320 add.w r3, r0, #640 ; 0x280
  33708. 802c4f0: 4293 cmp r3, r2
  33709. 802c4f2: 4b19 ldr r3, [pc, #100] ; (802c558 <http_sent_log+0x94>)
  33710. 802c4f4: d803 bhi.n 802c4fe <http_sent_log+0x3a>
  33711. nbytes = LOG_GetData(log_ptr, logFileBuf, FILE_BUF_MAX_LEN_LOG, start);
  33712. 802c4f6: 4915 ldr r1, [pc, #84] ; (802c54c <http_sent_log+0x88>)
  33713. 802c4f8: f44f 7220 mov.w r2, #640 ; 0x280
  33714. 802c4fc: e003 b.n 802c506 <http_sent_log+0x42>
  33715. }
  33716. else if (log_ptr < log_size) {
  33717. 802c4fe: 4290 cmp r0, r2
  33718. 802c500: d205 bcs.n 802c50e <http_sent_log+0x4a>
  33719. nbytes = LOG_GetData(log_ptr, logFileBuf, (log_size - log_ptr), start);
  33720. 802c502: 4912 ldr r1, [pc, #72] ; (802c54c <http_sent_log+0x88>)
  33721. 802c504: 1a12 subs r2, r2, r0
  33722. 802c506: 781b ldrb r3, [r3, #0]
  33723. 802c508: f7fd ff76 bl 802a3f8 <LOG_GetData>
  33724. 802c50c: 4605 mov r5, r0
  33725. }
  33726. else {
  33727. nbytes = 0;
  33728. }
  33729. log_ptr += nbytes;
  33730. 802c50e: 4b10 ldr r3, [pc, #64] ; (802c550 <http_sent_log+0x8c>)
  33731. 802c510: 681a ldr r2, [r3, #0]
  33732. 802c512: 18aa adds r2, r5, r2
  33733. 802c514: 601a str r2, [r3, #0]
  33734. start = false;
  33735. 802c516: 4b10 ldr r3, [pc, #64] ; (802c558 <http_sent_log+0x94>)
  33736. 802c518: 2200 movs r2, #0
  33737. 802c51a: 701a strb r2, [r3, #0]
  33738. if (nbytes == 0) {
  33739. 802c51c: b945 cbnz r5, 802c530 <http_sent_log+0x6c>
  33740. /* File transfer finished. */
  33741. start = true;
  33742. 802c51e: 2201 movs r2, #1
  33743. close_conn(pcb, hs);
  33744. 802c520: 4630 mov r0, r6
  33745. 802c522: 4621 mov r1, r4
  33746. log_ptr += nbytes;
  33747. start = false;
  33748. if (nbytes == 0) {
  33749. /* File transfer finished. */
  33750. start = true;
  33751. 802c524: 701a strb r2, [r3, #0]
  33752. close_conn(pcb, hs);
  33753. 802c526: f7ff ffaa bl 802c47e <close_conn>
  33754. /* Clear file transfer in progress flag */
  33755. fLogTransInprog = false;
  33756. 802c52a: 4b0c ldr r3, [pc, #48] ; (802c55c <http_sent_log+0x98>)
  33757. 802c52c: 701d strb r5, [r3, #0]
  33758. 802c52e: e00a b.n 802c546 <http_sent_log+0x82>
  33759. return ERR_OK;
  33760. }
  33761. hs->file = logFileBuf;
  33762. 802c530: 4b06 ldr r3, [pc, #24] ; (802c54c <http_sent_log+0x88>)
  33763. hs->left = nbytes;
  33764. send_data(pcb, hs);
  33765. 802c532: 4630 mov r0, r6
  33766. 802c534: 4621 mov r1, r4
  33767. return ERR_OK;
  33768. }
  33769. hs->file = logFileBuf;
  33770. hs->left = nbytes;
  33771. 802c536: e884 0028 stmia.w r4, {r3, r5}
  33772. send_data(pcb, hs);
  33773. 802c53a: f7ff ff7d bl 802c438 <send_data>
  33774. tcp_sent(pcb, http_sent_log);
  33775. 802c53e: 4630 mov r0, r6
  33776. 802c540: 4907 ldr r1, [pc, #28] ; (802c560 <http_sent_log+0x9c>)
  33777. 802c542: f003 fe69 bl 8030218 <tcp_sent>
  33778. }
  33779. return ERR_OK;
  33780. }
  33781. 802c546: 2000 movs r0, #0
  33782. 802c548: bd70 pop {r4, r5, r6, pc}
  33783. 802c54a: bf00 nop
  33784. 802c54c: 2000d808 .word 0x2000d808
  33785. 802c550: 20000d60 .word 0x20000d60
  33786. 802c554: 20000d78 .word 0x20000d78
  33787. 802c558: 20000720 .word 0x20000720
  33788. 802c55c: 20000d6c .word 0x20000d6c
  33789. 802c560: 0802c4c5 .word 0x0802c4c5
  33790. 0802c564 <http_sent_history>:
  33791. /**
  33792. * @brief Sent callback for log file transfer (messages as is, not ordered)
  33793. */
  33794. static err_t http_sent_history(void *arg, struct tcp_pcb *pcb, u16_t len)
  33795. {
  33796. 802c564: b570 push {r4, r5, r6, lr}
  33797. static bool start = true;
  33798. (void)len;
  33799. hs = arg;
  33800. if (hs->left > 0)
  33801. 802c566: 6845 ldr r5, [r0, #4]
  33802. /**
  33803. * @brief Sent callback for log file transfer (messages as is, not ordered)
  33804. */
  33805. static err_t http_sent_history(void *arg, struct tcp_pcb *pcb, u16_t len)
  33806. {
  33807. 802c568: 4604 mov r4, r0
  33808. 802c56a: 460e mov r6, r1
  33809. static bool start = true;
  33810. (void)len;
  33811. hs = arg;
  33812. if (hs->left > 0)
  33813. 802c56c: b125 cbz r5, 802c578 <http_sent_history+0x14>
  33814. {
  33815. send_data(pcb, hs);
  33816. 802c56e: 4608 mov r0, r1
  33817. 802c570: 4621 mov r1, r4
  33818. 802c572: f7ff ff61 bl 802c438 <send_data>
  33819. 802c576: e036 b.n 802c5e6 <http_sent_history+0x82>
  33820. }
  33821. else
  33822. {
  33823. memset(logFileBuf, 0, FILE_BUF_MAX_LEN);
  33824. 802c578: f44f 727a mov.w r2, #1000 ; 0x3e8
  33825. 802c57c: 481b ldr r0, [pc, #108] ; (802c5ec <http_sent_history+0x88>)
  33826. 802c57e: 4629 mov r1, r5
  33827. 802c580: f7f5 fc4a bl 8021e18 <memset>
  33828. if (log_ptr + FILE_BUF_MAX_LEN <= log_size) {
  33829. 802c584: 4b1a ldr r3, [pc, #104] ; (802c5f0 <http_sent_history+0x8c>)
  33830. 802c586: 6818 ldr r0, [r3, #0]
  33831. 802c588: 4b1a ldr r3, [pc, #104] ; (802c5f4 <http_sent_history+0x90>)
  33832. 802c58a: 681a ldr r2, [r3, #0]
  33833. 802c58c: f500 737a add.w r3, r0, #1000 ; 0x3e8
  33834. 802c590: 4293 cmp r3, r2
  33835. 802c592: 4b19 ldr r3, [pc, #100] ; (802c5f8 <http_sent_history+0x94>)
  33836. 802c594: d803 bhi.n 802c59e <http_sent_history+0x3a>
  33837. nbytes = History_GetData(log_ptr, logFileBuf, FILE_BUF_MAX_LEN, start);
  33838. 802c596: 4915 ldr r1, [pc, #84] ; (802c5ec <http_sent_history+0x88>)
  33839. 802c598: f44f 727a mov.w r2, #1000 ; 0x3e8
  33840. 802c59c: e003 b.n 802c5a6 <http_sent_history+0x42>
  33841. }
  33842. else if (log_ptr < log_size) {
  33843. 802c59e: 4290 cmp r0, r2
  33844. 802c5a0: d205 bcs.n 802c5ae <http_sent_history+0x4a>
  33845. nbytes = History_GetData(log_ptr, logFileBuf, (log_size - log_ptr), start);
  33846. 802c5a2: 4912 ldr r1, [pc, #72] ; (802c5ec <http_sent_history+0x88>)
  33847. 802c5a4: 1a12 subs r2, r2, r0
  33848. 802c5a6: 781b ldrb r3, [r3, #0]
  33849. 802c5a8: f7fe f836 bl 802a618 <History_GetData>
  33850. 802c5ac: 4605 mov r5, r0
  33851. }
  33852. else {
  33853. nbytes = 0;
  33854. }
  33855. log_ptr += nbytes;
  33856. 802c5ae: 4b10 ldr r3, [pc, #64] ; (802c5f0 <http_sent_history+0x8c>)
  33857. 802c5b0: 681a ldr r2, [r3, #0]
  33858. 802c5b2: 18aa adds r2, r5, r2
  33859. 802c5b4: 601a str r2, [r3, #0]
  33860. start = false;
  33861. 802c5b6: 4b10 ldr r3, [pc, #64] ; (802c5f8 <http_sent_history+0x94>)
  33862. 802c5b8: 2200 movs r2, #0
  33863. 802c5ba: 701a strb r2, [r3, #0]
  33864. if (nbytes == 0) {
  33865. 802c5bc: b945 cbnz r5, 802c5d0 <http_sent_history+0x6c>
  33866. /* File transfer finished. */
  33867. start = true;
  33868. 802c5be: 2201 movs r2, #1
  33869. close_conn(pcb, hs);
  33870. 802c5c0: 4630 mov r0, r6
  33871. 802c5c2: 4621 mov r1, r4
  33872. log_ptr += nbytes;
  33873. start = false;
  33874. if (nbytes == 0) {
  33875. /* File transfer finished. */
  33876. start = true;
  33877. 802c5c4: 701a strb r2, [r3, #0]
  33878. close_conn(pcb, hs);
  33879. 802c5c6: f7ff ff5a bl 802c47e <close_conn>
  33880. /* Clear file transfer in progress flag */
  33881. fLogTransInprog = false;
  33882. 802c5ca: 4b0c ldr r3, [pc, #48] ; (802c5fc <http_sent_history+0x98>)
  33883. 802c5cc: 701d strb r5, [r3, #0]
  33884. 802c5ce: e00a b.n 802c5e6 <http_sent_history+0x82>
  33885. return ERR_OK;
  33886. }
  33887. hs->file = logFileBuf;
  33888. 802c5d0: 4b06 ldr r3, [pc, #24] ; (802c5ec <http_sent_history+0x88>)
  33889. hs->left = nbytes;
  33890. send_data(pcb, hs);
  33891. 802c5d2: 4630 mov r0, r6
  33892. 802c5d4: 4621 mov r1, r4
  33893. return ERR_OK;
  33894. }
  33895. hs->file = logFileBuf;
  33896. hs->left = nbytes;
  33897. 802c5d6: e884 0028 stmia.w r4, {r3, r5}
  33898. send_data(pcb, hs);
  33899. 802c5da: f7ff ff2d bl 802c438 <send_data>
  33900. tcp_sent(pcb, http_sent_history);
  33901. 802c5de: 4630 mov r0, r6
  33902. 802c5e0: 4907 ldr r1, [pc, #28] ; (802c600 <http_sent_history+0x9c>)
  33903. 802c5e2: f003 fe19 bl 8030218 <tcp_sent>
  33904. }
  33905. return ERR_OK;
  33906. }
  33907. 802c5e6: 2000 movs r0, #0
  33908. 802c5e8: bd70 pop {r4, r5, r6, pc}
  33909. 802c5ea: bf00 nop
  33910. 802c5ec: 2000d808 .word 0x2000d808
  33911. 802c5f0: 20000d60 .word 0x20000d60
  33912. 802c5f4: 20000d78 .word 0x20000d78
  33913. 802c5f8: 20000722 .word 0x20000722
  33914. 802c5fc: 20000d6c .word 0x20000d6c
  33915. 802c600: 0802c565 .word 0x0802c565
  33916. 0802c604 <LogoutTimerCallback>:
  33917. }
  33918. /**
  33919. * @brief >Callback таймера логаута пользователя
  33920. */
  33921. void LogoutTimerCallback(TimerHandle_t pxTimer) {
  33922. 802c604: b51f push {r0, r1, r2, r3, r4, lr}
  33923. uint8_t user_id = (uint8_t)pvTimerGetTimerID( pxTimer );
  33924. 802c606: f7fe fc3f bl 802ae88 <pvTimerGetTimerID>
  33925. if( sSettings.sRADIUS.Auth_enable )
  33926. 802c60a: 4b0a ldr r3, [pc, #40] ; (802c634 <LogoutTimerCallback+0x30>)
  33927. 802c60c: f893 3378 ldrb.w r3, [r3, #888] ; 0x378
  33928. /**
  33929. * @brief >Callback таймера логаута пользователя
  33930. */
  33931. void LogoutTimerCallback(TimerHandle_t pxTimer) {
  33932. uint8_t user_id = (uint8_t)pvTimerGetTimerID( pxTimer );
  33933. 802c610: 4604 mov r4, r0
  33934. if( sSettings.sRADIUS.Auth_enable )
  33935. 802c612: b173 cbz r3, 802c632 <LogoutTimerCallback+0x2e>
  33936. static void HTTP_ForceUserLogout(uint8_t user_id)
  33937. {
  33938. char cookie[MAX_WEB_COOKIE_LEN];
  33939. /* Flush user cookie by random value */
  33940. sprintf(cookie, "%X", (unsigned int)GetRandomNumber());
  33941. 802c614: f7f9 ff38 bl 8026488 <GetRandomNumber>
  33942. 802c618: 4907 ldr r1, [pc, #28] ; (802c638 <LogoutTimerCallback+0x34>)
  33943. 802c61a: 4602 mov r2, r0
  33944. 802c61c: 4668 mov r0, sp
  33945. 802c61e: f7fb fb63 bl 8027ce8 <tfp_sprintf>
  33946. /**
  33947. * @brief Установка Cookie пользователя
  33948. */
  33949. static void HTTP_SetUserCookie(char *str, uint8_t user_id)
  33950. {
  33951. strcpy(users[user_id].cookie, str);
  33952. 802c622: 4b06 ldr r3, [pc, #24] ; (802c63c <LogoutTimerCallback+0x38>)
  33953. 802c624: b2e0 uxtb r0, r4
  33954. 802c626: 2214 movs r2, #20
  33955. 802c628: fb00 3002 mla r0, r0, r2, r3
  33956. 802c62c: 4669 mov r1, sp
  33957. 802c62e: f7f5 fd6d bl 802210c <strcpy>
  33958. */
  33959. void LogoutTimerCallback(TimerHandle_t pxTimer) {
  33960. uint8_t user_id = (uint8_t)pvTimerGetTimerID( pxTimer );
  33961. if( sSettings.sRADIUS.Auth_enable )
  33962. HTTP_ForceUserLogout(user_id);
  33963. }
  33964. 802c632: bd1f pop {r0, r1, r2, r3, r4, pc}
  33965. 802c634: 2000d414 .word 0x2000d414
  33966. 802c638: 0803fe3e .word 0x0803fe3e
  33967. 802c63c: 2000eaa0 .word 0x2000eaa0
  33968. 0802c640 <HTTP_Init>:
  33969. * @brief Initialize the HTTP server (start its thread)
  33970. * @param none
  33971. * @retval None
  33972. */
  33973. void HTTP_Init()
  33974. {
  33975. 802c640: b5f0 push {r4, r5, r6, r7, lr}
  33976. 802c642: b087 sub sp, #28
  33977. char buf[MAX_WEB_COOKIE_LEN];
  33978. uint8_t user_id;
  33979. //sys_thread_new("HTTP", http_server_netconn_thread, NULL, 3000, 2);
  33980. struct tcp_pcb *pcb;
  33981. /*create new pcb*/
  33982. pcb = tcp_new();
  33983. 802c644: f004 f9b0 bl 80309a8 <tcp_new>
  33984. /* bind HTTP traffic to pcb */
  33985. tcp_bind(pcb, IP_ADDR_ANY, 80);
  33986. 802c648: 2250 movs r2, #80 ; 0x50
  33987. char buf[MAX_WEB_COOKIE_LEN];
  33988. uint8_t user_id;
  33989. //sys_thread_new("HTTP", http_server_netconn_thread, NULL, 3000, 2);
  33990. struct tcp_pcb *pcb;
  33991. /*create new pcb*/
  33992. pcb = tcp_new();
  33993. 802c64a: 4604 mov r4, r0
  33994. /* bind HTTP traffic to pcb */
  33995. tcp_bind(pcb, IP_ADDR_ANY, 80);
  33996. 802c64c: 4913 ldr r1, [pc, #76] ; (802c69c <HTTP_Init+0x5c>)
  33997. /**
  33998. * @brief Установка Cookie пользователя
  33999. */
  34000. static void HTTP_SetUserCookie(char *str, uint8_t user_id)
  34001. {
  34002. strcpy(users[user_id].cookie, str);
  34003. 802c64e: 4f14 ldr r7, [pc, #80] ; (802c6a0 <HTTP_Init+0x60>)
  34004. sprintf(buf, "%X", (unsigned int)GetRandomNumber());
  34005. HTTP_SetUserCookie(buf, user_id);
  34006. /* Create user logout timers */
  34007. users[user_id].LogoutTimer =
  34008. xTimerCreate("LogoutTmr", WEB_LOGOUT_TIME, pdFALSE, ( void * ) user_id, LogoutTimerCallback);
  34009. 802c650: 4e14 ldr r6, [pc, #80] ; (802c6a4 <HTTP_Init+0x64>)
  34010. //sys_thread_new("HTTP", http_server_netconn_thread, NULL, 3000, 2);
  34011. struct tcp_pcb *pcb;
  34012. /*create new pcb*/
  34013. pcb = tcp_new();
  34014. /* bind HTTP traffic to pcb */
  34015. tcp_bind(pcb, IP_ADDR_ANY, 80);
  34016. 802c652: f003 fd0b bl 803006c <tcp_bind>
  34017. /* start listening on port 80 */
  34018. pcb = tcp_listen(pcb);
  34019. 802c656: 4620 mov r0, r4
  34020. 802c658: 21ff movs r1, #255 ; 0xff
  34021. 802c65a: f003 fd3f bl 80300dc <tcp_listen_with_backlog>
  34022. /* define callback function for TCP connection setup */
  34023. tcp_accept(pcb, http_accept);
  34024. 802c65e: 4912 ldr r1, [pc, #72] ; (802c6a8 <HTTP_Init+0x68>)
  34025. 802c660: f003 fddf bl 8030222 <tcp_accept>
  34026. 802c664: 2400 movs r4, #0
  34027. for (user_id = 0; user_id < MAX_WEB_USERS; user_id++) {
  34028. /* Flush user cookie by random value */
  34029. sprintf(buf, "%X", (unsigned int)GetRandomNumber());
  34030. 802c666: f7f9 ff0f bl 8026488 <GetRandomNumber>
  34031. /**
  34032. * @brief Установка Cookie пользователя
  34033. */
  34034. static void HTTP_SetUserCookie(char *str, uint8_t user_id)
  34035. {
  34036. strcpy(users[user_id].cookie, str);
  34037. 802c66a: 2514 movs r5, #20
  34038. pcb = tcp_listen(pcb);
  34039. /* define callback function for TCP connection setup */
  34040. tcp_accept(pcb, http_accept);
  34041. for (user_id = 0; user_id < MAX_WEB_USERS; user_id++) {
  34042. /* Flush user cookie by random value */
  34043. sprintf(buf, "%X", (unsigned int)GetRandomNumber());
  34044. 802c66c: 4602 mov r2, r0
  34045. /**
  34046. * @brief Установка Cookie пользователя
  34047. */
  34048. static void HTTP_SetUserCookie(char *str, uint8_t user_id)
  34049. {
  34050. strcpy(users[user_id].cookie, str);
  34051. 802c66e: fb05 7504 mla r5, r5, r4, r7
  34052. pcb = tcp_listen(pcb);
  34053. /* define callback function for TCP connection setup */
  34054. tcp_accept(pcb, http_accept);
  34055. for (user_id = 0; user_id < MAX_WEB_USERS; user_id++) {
  34056. /* Flush user cookie by random value */
  34057. sprintf(buf, "%X", (unsigned int)GetRandomNumber());
  34058. 802c672: 490e ldr r1, [pc, #56] ; (802c6ac <HTTP_Init+0x6c>)
  34059. 802c674: a802 add r0, sp, #8
  34060. 802c676: f7fb fb37 bl 8027ce8 <tfp_sprintf>
  34061. /**
  34062. * @brief Установка Cookie пользователя
  34063. */
  34064. static void HTTP_SetUserCookie(char *str, uint8_t user_id)
  34065. {
  34066. strcpy(users[user_id].cookie, str);
  34067. 802c67a: a902 add r1, sp, #8
  34068. 802c67c: 4628 mov r0, r5
  34069. 802c67e: f7f5 fd45 bl 802210c <strcpy>
  34070. sprintf(buf, "%X", (unsigned int)GetRandomNumber());
  34071. HTTP_SetUserCookie(buf, user_id);
  34072. /* Create user logout timers */
  34073. users[user_id].LogoutTimer =
  34074. xTimerCreate("LogoutTmr", WEB_LOGOUT_TIME, pdFALSE, ( void * ) user_id, LogoutTimerCallback);
  34075. 802c682: 2200 movs r2, #0
  34076. 802c684: 4623 mov r3, r4
  34077. 802c686: 9600 str r6, [sp, #0]
  34078. 802c688: 4809 ldr r0, [pc, #36] ; (802c6b0 <HTTP_Init+0x70>)
  34079. 802c68a: 490a ldr r1, [pc, #40] ; (802c6b4 <HTTP_Init+0x74>)
  34080. 802c68c: f7fe fac4 bl 802ac18 <xTimerCreate>
  34081. 802c690: 3401 adds r4, #1
  34082. tcp_bind(pcb, IP_ADDR_ANY, 80);
  34083. /* start listening on port 80 */
  34084. pcb = tcp_listen(pcb);
  34085. /* define callback function for TCP connection setup */
  34086. tcp_accept(pcb, http_accept);
  34087. for (user_id = 0; user_id < MAX_WEB_USERS; user_id++) {
  34088. 802c692: 2c02 cmp r4, #2
  34089. /* Flush user cookie by random value */
  34090. sprintf(buf, "%X", (unsigned int)GetRandomNumber());
  34091. HTTP_SetUserCookie(buf, user_id);
  34092. /* Create user logout timers */
  34093. users[user_id].LogoutTimer =
  34094. 802c694: 6128 str r0, [r5, #16]
  34095. tcp_bind(pcb, IP_ADDR_ANY, 80);
  34096. /* start listening on port 80 */
  34097. pcb = tcp_listen(pcb);
  34098. /* define callback function for TCP connection setup */
  34099. tcp_accept(pcb, http_accept);
  34100. for (user_id = 0; user_id < MAX_WEB_USERS; user_id++) {
  34101. 802c696: d1e6 bne.n 802c666 <HTTP_Init+0x26>
  34102. /* Create user logout timers */
  34103. users[user_id].LogoutTimer =
  34104. xTimerCreate("LogoutTmr", WEB_LOGOUT_TIME, pdFALSE, ( void * ) user_id, LogoutTimerCallback);
  34105. }
  34106. }
  34107. 802c698: b007 add sp, #28
  34108. 802c69a: bdf0 pop {r4, r5, r6, r7, pc}
  34109. 802c69c: 08044744 .word 0x08044744
  34110. 802c6a0: 2000eaa0 .word 0x2000eaa0
  34111. 802c6a4: 0802c605 .word 0x0802c605
  34112. 802c6a8: 0802c3ed .word 0x0802c3ed
  34113. 802c6ac: 0803fe3e .word 0x0803fe3e
  34114. 802c6b0: 0803fe41 .word 0x0803fe41
  34115. 802c6b4: 001b7740 .word 0x001b7740
  34116. 0802c6b8 <HTTP_SettingsPage>:
  34117. /**
  34118. * @brief
  34119. * @retval None
  34120. */
  34121. int HTTP_SettingsPage(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  34122. {
  34123. 802c6b8: b570 push {r4, r5, r6, lr}
  34124. 802c6ba: 4602 mov r2, r0
  34125. 802c6bc: b088 sub sp, #32
  34126. 802c6be: 460c mov r4, r1
  34127. char tempStr[30];
  34128. strncpy(tempStr, bufIn, 30);
  34129. 802c6c0: 4668 mov r0, sp
  34130. 802c6c2: 4611 mov r1, r2
  34131. 802c6c4: 221e movs r2, #30
  34132. /**
  34133. * @brief
  34134. * @retval None
  34135. */
  34136. int HTTP_SettingsPage(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  34137. {
  34138. 802c6c6: 461e mov r6, r3
  34139. char tempStr[30];
  34140. strncpy(tempStr, bufIn, 30);
  34141. 802c6c8: f7f5 fe36 bl 8022338 <strncpy>
  34142. /* В запросе нет параметров, нужно формировать JSON ответ */
  34143. if (strpbrk(tempStr,"?") == 0)
  34144. 802c6cc: 4668 mov r0, sp
  34145. 802c6ce: 490b ldr r1, [pc, #44] ; (802c6fc <HTTP_SettingsPage+0x44>)
  34146. 802c6d0: f7f5 fe64 bl 802239c <strpbrk>
  34147. 802c6d4: 4605 mov r5, r0
  34148. /* В запросе есть параметры, нужно парсить и сохранять настройки */
  34149. else
  34150. {
  34151. //HTTP_SetSettings(bufIn, lenBufIn);
  34152. return SEND_REQUIRED_NO;
  34153. 802c6d6: 2001 movs r0, #1
  34154. {
  34155. char tempStr[30];
  34156. strncpy(tempStr, bufIn, 30);
  34157. /* В запросе нет параметров, нужно формировать JSON ответ */
  34158. if (strpbrk(tempStr,"?") == 0)
  34159. 802c6d8: b975 cbnz r5, 802c6f8 <HTTP_SettingsPage+0x40>
  34160. {
  34161. memset(bufOut, 0, SEND_BUF_MAX_LEN);
  34162. 802c6da: 4629 mov r1, r5
  34163. 802c6dc: f44f 62fa mov.w r2, #2000 ; 0x7d0
  34164. 802c6e0: 4620 mov r0, r4
  34165. 802c6e2: f7f5 fb99 bl 8021e18 <memset>
  34166. HTTP_GetSettings(bufOut);
  34167. 802c6e6: 4620 mov r0, r4
  34168. 802c6e8: f001 fd16 bl 802e118 <HTTP_GetSettings>
  34169. //printf(bufOut);
  34170. *lenBufOut = strlen(bufOut);
  34171. 802c6ec: 4620 mov r0, r4
  34172. 802c6ee: f7f5 fd6b bl 80221c8 <strlen>
  34173. 802c6f2: 8030 strh r0, [r6, #0]
  34174. return SEND_REQUIRED_YES;
  34175. 802c6f4: 4628 mov r0, r5
  34176. 802c6f6: e7ff b.n 802c6f8 <HTTP_SettingsPage+0x40>
  34177. {
  34178. //HTTP_SetSettings(bufIn, lenBufIn);
  34179. return SEND_REQUIRED_NO;
  34180. }
  34181. }
  34182. 802c6f8: b008 add sp, #32
  34183. 802c6fa: bd70 pop {r4, r5, r6, pc}
  34184. 802c6fc: 0803fe4b .word 0x0803fe4b
  34185. 0802c700 <HTTP_InfoPage>:
  34186. /**
  34187. * @brief
  34188. * @retval None
  34189. */
  34190. int HTTP_InfoPage(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  34191. {
  34192. 802c700: b570 push {r4, r5, r6, lr}
  34193. 802c702: 4602 mov r2, r0
  34194. 802c704: b088 sub sp, #32
  34195. 802c706: 460c mov r4, r1
  34196. char tempStr[30];
  34197. strncpy(tempStr, bufIn, 30);
  34198. 802c708: 4668 mov r0, sp
  34199. 802c70a: 4611 mov r1, r2
  34200. 802c70c: 221e movs r2, #30
  34201. /**
  34202. * @brief
  34203. * @retval None
  34204. */
  34205. int HTTP_InfoPage(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  34206. {
  34207. 802c70e: 461e mov r6, r3
  34208. char tempStr[30];
  34209. strncpy(tempStr, bufIn, 30);
  34210. 802c710: f7f5 fe12 bl 8022338 <strncpy>
  34211. /* В запросе нет параметров, нужно формировать JSON ответ */
  34212. if (strpbrk(tempStr,"?") == 0)
  34213. 802c714: 4668 mov r0, sp
  34214. 802c716: 490b ldr r1, [pc, #44] ; (802c744 <HTTP_InfoPage+0x44>)
  34215. 802c718: f7f5 fe40 bl 802239c <strpbrk>
  34216. 802c71c: 4605 mov r5, r0
  34217. }
  34218. /* В запросе есть параметры, нужно парсить и сохранять настройки */
  34219. else
  34220. {
  34221. //HTTP_SetInfo(bufIn, lenBufIn);
  34222. return SEND_REQUIRED_NO;
  34223. 802c71e: 2001 movs r0, #1
  34224. {
  34225. char tempStr[30];
  34226. strncpy(tempStr, bufIn, 30);
  34227. /* В запросе нет параметров, нужно формировать JSON ответ */
  34228. if (strpbrk(tempStr,"?") == 0)
  34229. 802c720: b975 cbnz r5, 802c740 <HTTP_InfoPage+0x40>
  34230. {
  34231. memset(bufOut, 0, SEND_BUF_MAX_LEN);
  34232. 802c722: 4629 mov r1, r5
  34233. 802c724: f44f 62fa mov.w r2, #2000 ; 0x7d0
  34234. 802c728: 4620 mov r0, r4
  34235. 802c72a: f7f5 fb75 bl 8021e18 <memset>
  34236. HTTP_GetInfo(bufOut);
  34237. 802c72e: 4620 mov r0, r4
  34238. 802c730: f001 fee4 bl 802e4fc <HTTP_GetInfo>
  34239. *lenBufOut = strlen(bufOut);
  34240. 802c734: 4620 mov r0, r4
  34241. 802c736: f7f5 fd47 bl 80221c8 <strlen>
  34242. 802c73a: 8030 strh r0, [r6, #0]
  34243. return SEND_REQUIRED_YES;
  34244. 802c73c: 4628 mov r0, r5
  34245. 802c73e: e7ff b.n 802c740 <HTTP_InfoPage+0x40>
  34246. /*
  34247. HTTP_SetSettings(bufIn, lenBufIn);
  34248. return SEND_REQUIRED_NO;
  34249. */
  34250. }
  34251. }
  34252. 802c740: b008 add sp, #32
  34253. 802c742: bd70 pop {r4, r5, r6, pc}
  34254. 802c744: 0803fe4b .word 0x0803fe4b
  34255. 0802c748 <HTTP_ConfirmBootPwd>:
  34256. /**
  34257. * @brief Проверка пароля для перехода в режим bootloader
  34258. * @retval None
  34259. */
  34260. void HTTP_ConfirmBootPwd(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  34261. {
  34262. 802c748: b500 push {lr}
  34263. 802c74a: b093 sub sp, #76 ; 0x4c
  34264. 802c74c: 4601 mov r1, r0
  34265. char tempStr[50];
  34266. strncpy(tempStr, bufIn, 50);
  34267. 802c74e: 2232 movs r2, #50 ; 0x32
  34268. 802c750: a805 add r0, sp, #20
  34269. 802c752: f7f5 fdf1 bl 8022338 <strncpy>
  34270. char value[20];
  34271. uint8_t valueLen;
  34272. memset(value, 0, 20);
  34273. 802c756: 4668 mov r0, sp
  34274. 802c758: 2100 movs r1, #0
  34275. 802c75a: 2214 movs r2, #20
  34276. 802c75c: f7f5 fb5c bl 8021e18 <memset>
  34277. //if (strcmp(BOOTLOADER_PASWORD, value) == 0)
  34278. {
  34279. // *bufOut = '1';
  34280. /* Запускаем задачу отложенной перезагрузки. Контроллер должен успеть
  34281. отправить ответ серверу о статусе пароля */
  34282. HTTP_StartResetTask(true);
  34283. 802c760: 2001 movs r0, #1
  34284. 802c762: f002 f8b7 bl 802e8d4 <HTTP_StartResetTask>
  34285. /* else
  34286. *bufOut = '0';*/
  34287. //*lenBufOut = 1;
  34288. }
  34289. }
  34290. 802c766: b013 add sp, #76 ; 0x4c
  34291. 802c768: bd00 pop {pc}
  34292. 802c76a: 0000 movs r0, r0
  34293. 0802c76c <HTTP_LOGIN>:
  34294. /* Wrong login or pass, return */
  34295. return SEND_REQUIRED_NO;
  34296. }
  34297. void HTTP_LOGIN(char *bufOut, uint16_t *lenBufOut)
  34298. {
  34299. 802c76c: b530 push {r4, r5, lr}
  34300. 802c76e: b093 sub sp, #76 ; 0x4c
  34301. 802c770: 4604 mov r4, r0
  34302. 802c772: 460d mov r5, r1
  34303. char tempStr[50];
  34304. uint8_t valueLen;
  34305. char WebLogin[MAX_WEB_LOGIN_LEN];
  34306. GetUserLogin(ADMIN, WebLogin, &valueLen);
  34307. 802c774: 2000 movs r0, #0
  34308. 802c776: a902 add r1, sp, #8
  34309. 802c778: f10d 0207 add.w r2, sp, #7
  34310. 802c77c: f7fb fd9e bl 80282bc <GetUserLogin>
  34311. memset(tempStr, 0, 50);
  34312. 802c780: 2100 movs r1, #0
  34313. 802c782: 2232 movs r2, #50 ; 0x32
  34314. 802c784: a805 add r0, sp, #20
  34315. 802c786: f7f5 fb47 bl 8021e18 <memset>
  34316. /* TODO replace global flag with user-pass-cookie */
  34317. Authenticated = true;
  34318. 802c78a: 4b1b ldr r3, [pc, #108] ; (802c7f8 <HTTP_LOGIN+0x8c>)
  34319. 802c78c: 2201 movs r2, #1
  34320. 802c78e: 701a strb r2, [r3, #0]
  34321. /* Generate cookie */
  34322. sprintf(tempStr, "%X", (unsigned int)GetRandomNumber());
  34323. 802c790: f7f9 fe7a bl 8026488 <GetRandomNumber>
  34324. 802c794: 4919 ldr r1, [pc, #100] ; (802c7fc <HTTP_LOGIN+0x90>)
  34325. 802c796: 4602 mov r2, r0
  34326. 802c798: a805 add r0, sp, #20
  34327. 802c79a: f7fb faa5 bl 8027ce8 <tfp_sprintf>
  34328. /**
  34329. * @brief Установка Cookie пользователя
  34330. */
  34331. static void HTTP_SetUserCookie(char *str, uint8_t user_id)
  34332. {
  34333. strcpy(users[user_id].cookie, str);
  34334. 802c79e: a905 add r1, sp, #20
  34335. 802c7a0: 4817 ldr r0, [pc, #92] ; (802c800 <HTTP_LOGIN+0x94>)
  34336. 802c7a2: f7f5 fcb3 bl 802210c <strcpy>
  34337. sprintf(tempStr, "%X", (unsigned int)GetRandomNumber());
  34338. /* Set users cookie */
  34339. HTTP_SetUserCookie(tempStr, ADMIN);
  34340. HTTP_UpdateUserLoginTime(ADMIN);
  34341. 802c7a6: 2000 movs r0, #0
  34342. 802c7a8: f7ff fdf8 bl 802c39c <HTTP_UpdateUserLoginTime>
  34343. /* Send login and cookie back */
  34344. strcpy(bufOut, "HTTP/1.0 200 OK\r\nContent-Type:text/html\r\nSet-Cookie: uname=");
  34345. 802c7ac: 4915 ldr r1, [pc, #84] ; (802c804 <HTTP_LOGIN+0x98>)
  34346. 802c7ae: 4620 mov r0, r4
  34347. 802c7b0: f7f5 fcac bl 802210c <strcpy>
  34348. strcat(bufOut, WebLogin);
  34349. 802c7b4: a902 add r1, sp, #8
  34350. 802c7b6: 4620 mov r0, r4
  34351. 802c7b8: f7f5 fb94 bl 8021ee4 <strcat>
  34352. strcat(bufOut, "\r\nSet-Cookie: id=");
  34353. 802c7bc: 4912 ldr r1, [pc, #72] ; (802c808 <HTTP_LOGIN+0x9c>)
  34354. 802c7be: 4620 mov r0, r4
  34355. 802c7c0: f7f5 fb90 bl 8021ee4 <strcat>
  34356. strcat(bufOut, tempStr);
  34357. 802c7c4: a905 add r1, sp, #20
  34358. 802c7c6: 4620 mov r0, r4
  34359. 802c7c8: f7f5 fb8c bl 8021ee4 <strcat>
  34360. strcat(bufOut, "\r\nSet-Cookie: role=0");
  34361. 802c7cc: 490f ldr r1, [pc, #60] ; (802c80c <HTTP_LOGIN+0xa0>)
  34362. 802c7ce: 4620 mov r0, r4
  34363. 802c7d0: f7f5 fb88 bl 8021ee4 <strcat>
  34364. strcat(bufOut, "\r\nSet-Cookie: auth=0");
  34365. 802c7d4: 490e ldr r1, [pc, #56] ; (802c810 <HTTP_LOGIN+0xa4>)
  34366. 802c7d6: 4620 mov r0, r4
  34367. 802c7d8: f7f5 fb84 bl 8021ee4 <strcat>
  34368. strcat(bufOut, "\r\n\r\n");
  34369. 802c7dc: 490d ldr r1, [pc, #52] ; (802c814 <HTTP_LOGIN+0xa8>)
  34370. 802c7de: 4620 mov r0, r4
  34371. 802c7e0: f7f5 fb80 bl 8021ee4 <strcat>
  34372. strcat(bufOut,"<!DOCTYPE html><html lang=""><head><meta http-equiv=\"refresh\" content=\"0;url=/index.html\"/></head></html>\r\n\r\n");
  34373. 802c7e4: 490c ldr r1, [pc, #48] ; (802c818 <HTTP_LOGIN+0xac>)
  34374. 802c7e6: 4620 mov r0, r4
  34375. 802c7e8: f7f5 fb7c bl 8021ee4 <strcat>
  34376. *lenBufOut = strlen(bufOut);
  34377. 802c7ec: 4620 mov r0, r4
  34378. 802c7ee: f7f5 fceb bl 80221c8 <strlen>
  34379. 802c7f2: 8028 strh r0, [r5, #0]
  34380. }
  34381. 802c7f4: b013 add sp, #76 ; 0x4c
  34382. 802c7f6: bd30 pop {r4, r5, pc}
  34383. 802c7f8: 20000d5f .word 0x20000d5f
  34384. 802c7fc: 0803fe3e .word 0x0803fe3e
  34385. 802c800: 2000eaa0 .word 0x2000eaa0
  34386. 802c804: 0803fe4d .word 0x0803fe4d
  34387. 802c808: 0803fe89 .word 0x0803fe89
  34388. 802c80c: 0803fe9b .word 0x0803fe9b
  34389. 802c810: 0803feb0 .word 0x0803feb0
  34390. 802c814: 080405bd .word 0x080405bd
  34391. 802c818: 0803fec5 .word 0x0803fec5
  34392. 0802c81c <GetParamValue>:
  34393. /**
  34394. * @brief
  34395. * @retval None
  34396. */
  34397. uint8_t GetParamValue(char *inStr, char *paramName, char *paramValue, uint8_t *paramLen)
  34398. {
  34399. 802c81c: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  34400. 802c820: 4690 mov r8, r2
  34401. 802c822: 461f mov r7, r3
  34402. char *beginValue = 0;
  34403. char *endValue = 0;
  34404. int len = 0;
  34405. char *strPtr = 0;
  34406. strPtr = strstr(inStr, paramName);
  34407. 802c824: f7f5 ff50 bl 80226c8 <strstr>
  34408. if (strPtr != 0)
  34409. 802c828: 4605 mov r5, r0
  34410. 802c82a: b1e0 cbz r0, 802c866 <GetParamValue+0x4a>
  34411. {
  34412. beginValue = strpbrk(strPtr,"=");
  34413. 802c82c: 490f ldr r1, [pc, #60] ; (802c86c <GetParamValue+0x50>)
  34414. 802c82e: f7f5 fdb5 bl 802239c <strpbrk>
  34415. endValue = strpbrk(strPtr,"&");
  34416. 802c832: 490f ldr r1, [pc, #60] ; (802c870 <GetParamValue+0x54>)
  34417. strPtr = strstr(inStr, paramName);
  34418. if (strPtr != 0)
  34419. {
  34420. beginValue = strpbrk(strPtr,"=");
  34421. 802c834: 4606 mov r6, r0
  34422. endValue = strpbrk(strPtr,"&");
  34423. 802c836: 4628 mov r0, r5
  34424. 802c838: f7f5 fdb0 bl 802239c <strpbrk>
  34425. if (endValue == 0)
  34426. 802c83c: 4604 mov r4, r0
  34427. 802c83e: b920 cbnz r0, 802c84a <GetParamValue+0x2e>
  34428. endValue = strpbrk(strPtr," ");
  34429. 802c840: 4628 mov r0, r5
  34430. 802c842: 490c ldr r1, [pc, #48] ; (802c874 <GetParamValue+0x58>)
  34431. 802c844: f7f5 fdaa bl 802239c <strpbrk>
  34432. 802c848: 4604 mov r4, r0
  34433. len = endValue - beginValue - 1;
  34434. 802c84a: 1ba5 subs r5, r4, r6
  34435. 802c84c: 3d01 subs r5, #1
  34436. strncpy(paramValue, beginValue + 1, len);
  34437. 802c84e: 4640 mov r0, r8
  34438. 802c850: 1c71 adds r1, r6, #1
  34439. 802c852: 462a mov r2, r5
  34440. 802c854: f7f5 fd70 bl 8022338 <strncpy>
  34441. *endValue = '0';
  34442. 802c858: 2330 movs r3, #48 ; 0x30
  34443. 802c85a: 7023 strb r3, [r4, #0]
  34444. *beginValue = '0';
  34445. *paramLen = len;
  34446. return 1;
  34447. 802c85c: 2001 movs r0, #1
  34448. if (endValue == 0)
  34449. endValue = strpbrk(strPtr," ");
  34450. len = endValue - beginValue - 1;
  34451. strncpy(paramValue, beginValue + 1, len);
  34452. *endValue = '0';
  34453. *beginValue = '0';
  34454. 802c85e: 7033 strb r3, [r6, #0]
  34455. *paramLen = len;
  34456. 802c860: 703d strb r5, [r7, #0]
  34457. return 1;
  34458. 802c862: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  34459. }
  34460. else
  34461. {
  34462. *paramLen = 0;
  34463. 802c866: 7038 strb r0, [r7, #0]
  34464. return 0;
  34465. }
  34466. }
  34467. 802c868: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  34468. 802c86c: 0804025e .word 0x0804025e
  34469. 802c870: 0803ff31 .word 0x0803ff31
  34470. 802c874: 080392c9 .word 0x080392c9
  34471. 0802c878 <HTTP_ConfirmWebPwd>:
  34472. /**
  34473. * @brief Проверка пароля для входа в Web
  34474. * @retval None
  34475. */
  34476. int HTTP_ConfirmWebPwd(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  34477. {
  34478. 802c878: b5f0 push {r4, r5, r6, r7, lr}
  34479. 802c87a: b0a9 sub sp, #164 ; 0xa4
  34480. 802c87c: 4604 mov r4, r0
  34481. char *strPtr = 0;
  34482. char WebPassword[MAX_WEB_PASSWD_LEN];
  34483. char WebLogin[MAX_WEB_LOGIN_LEN];
  34484. char buf[40];
  34485. memset(login, 0, 20);
  34486. 802c87e: 2214 movs r2, #20
  34487. /**
  34488. * @brief Проверка пароля для входа в Web
  34489. * @retval None
  34490. */
  34491. int HTTP_ConfirmWebPwd(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  34492. {
  34493. 802c880: 460d mov r5, r1
  34494. char *strPtr = 0;
  34495. char WebPassword[MAX_WEB_PASSWD_LEN];
  34496. char WebLogin[MAX_WEB_LOGIN_LEN];
  34497. char buf[40];
  34498. memset(login, 0, 20);
  34499. 802c882: a807 add r0, sp, #28
  34500. 802c884: 2100 movs r1, #0
  34501. /**
  34502. * @brief Проверка пароля для входа в Web
  34503. * @retval None
  34504. */
  34505. int HTTP_ConfirmWebPwd(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  34506. {
  34507. 802c886: 461f mov r7, r3
  34508. char *strPtr = 0;
  34509. char WebPassword[MAX_WEB_PASSWD_LEN];
  34510. char WebLogin[MAX_WEB_LOGIN_LEN];
  34511. char buf[40];
  34512. memset(login, 0, 20);
  34513. 802c888: f7f5 fac6 bl 8021e18 <memset>
  34514. memset(password, 0, 20);
  34515. 802c88c: 2100 movs r1, #0
  34516. 802c88e: 2214 movs r2, #20
  34517. 802c890: a80c add r0, sp, #48 ; 0x30
  34518. 802c892: f7f5 fac1 bl 8021e18 <memset>
  34519. memset(tempStr, 0, 50);
  34520. 802c896: 2100 movs r1, #0
  34521. 802c898: 2232 movs r2, #50 ; 0x32
  34522. 802c89a: a81b add r0, sp, #108 ; 0x6c
  34523. 802c89c: f7f5 fabc bl 8021e18 <memset>
  34524. /* Get first 50 bytes of string */
  34525. strncpy(tempStr, bufIn, 49);
  34526. 802c8a0: 2231 movs r2, #49 ; 0x31
  34527. 802c8a2: 4621 mov r1, r4
  34528. 802c8a4: a81b add r0, sp, #108 ; 0x6c
  34529. 802c8a6: f7f5 fd47 bl 8022338 <strncpy>
  34530. /* Add " " to the string in order GetParamValue() can be able to parse the param */
  34531. strcat(tempStr, " ");
  34532. if (GetParamValue(tempStr, "login=", login, &valueLen) &&
  34533. 802c8aa: f10d 0603 add.w r6, sp, #3
  34534. /* Get first 50 bytes of string */
  34535. strncpy(tempStr, bufIn, 49);
  34536. /* Add " " to the string in order GetParamValue() can be able to parse the param */
  34537. strcat(tempStr, " ");
  34538. 802c8ae: 4941 ldr r1, [pc, #260] ; (802c9b4 <HTTP_ConfirmWebPwd+0x13c>)
  34539. 802c8b0: a81b add r0, sp, #108 ; 0x6c
  34540. 802c8b2: f7f5 fb17 bl 8021ee4 <strcat>
  34541. if (GetParamValue(tempStr, "login=", login, &valueLen) &&
  34542. 802c8b6: a81b add r0, sp, #108 ; 0x6c
  34543. 802c8b8: 493f ldr r1, [pc, #252] ; (802c9b8 <HTTP_ConfirmWebPwd+0x140>)
  34544. 802c8ba: aa07 add r2, sp, #28
  34545. 802c8bc: 4633 mov r3, r6
  34546. 802c8be: f7ff ffad bl 802c81c <GetParamValue>
  34547. 802c8c2: b920 cbnz r0, 802c8ce <HTTP_ConfirmWebPwd+0x56>
  34548. }
  34549. }
  34550. /* No valid login and pass found */
  34551. /* TODO replace global flag with user-pass-cookie*/
  34552. Authenticated = false;
  34553. 802c8c4: 4b3d ldr r3, [pc, #244] ; (802c9bc <HTTP_ConfirmWebPwd+0x144>)
  34554. 802c8c6: 2200 movs r2, #0
  34555. 802c8c8: 701a strb r2, [r3, #0]
  34556. /* Wrong login or pass, return */
  34557. return SEND_REQUIRED_NO;
  34558. 802c8ca: 2001 movs r0, #1
  34559. 802c8cc: e070 b.n 802c9b0 <HTTP_ConfirmWebPwd+0x138>
  34560. /* Add " " to the string in order GetParamValue() can be able to parse the param */
  34561. strcat(tempStr, " ");
  34562. if (GetParamValue(tempStr, "login=", login, &valueLen) &&
  34563. GetParamValue(tempStr, "password=", password, &valueLen))
  34564. 802c8ce: a81b add r0, sp, #108 ; 0x6c
  34565. 802c8d0: 493b ldr r1, [pc, #236] ; (802c9c0 <HTTP_ConfirmWebPwd+0x148>)
  34566. 802c8d2: aa0c add r2, sp, #48 ; 0x30
  34567. 802c8d4: 4633 mov r3, r6
  34568. 802c8d6: f7ff ffa1 bl 802c81c <GetParamValue>
  34569. strncpy(tempStr, bufIn, 49);
  34570. /* Add " " to the string in order GetParamValue() can be able to parse the param */
  34571. strcat(tempStr, " ");
  34572. if (GetParamValue(tempStr, "login=", login, &valueLen) &&
  34573. 802c8da: 2800 cmp r0, #0
  34574. 802c8dc: d0f2 beq.n 802c8c4 <HTTP_ConfirmWebPwd+0x4c>
  34575. 802c8de: 2400 movs r4, #0
  34576. GetParamValue(tempStr, "password=", password, &valueLen))
  34577. {
  34578. for (user_id = 0; user_id < MAX_WEB_USERS; user_id++) {
  34579. GetUserLogin(user_id, WebLogin, &valueLen);
  34580. 802c8e0: 4620 mov r0, r4
  34581. 802c8e2: a904 add r1, sp, #16
  34582. 802c8e4: 4632 mov r2, r6
  34583. 802c8e6: f7fb fce9 bl 80282bc <GetUserLogin>
  34584. GetUserPassword(user_id, WebPassword, &valueLen);
  34585. 802c8ea: 4620 mov r0, r4
  34586. 802c8ec: a901 add r1, sp, #4
  34587. 802c8ee: 4632 mov r2, r6
  34588. 802c8f0: f7fb fcfa bl 80282e8 <GetUserPassword>
  34589. /* Check login and password */
  34590. if ((strncmp(WebLogin, login, MAX_WEB_LOGIN_LEN) == 0) &&
  34591. 802c8f4: a804 add r0, sp, #16
  34592. 802c8f6: a907 add r1, sp, #28
  34593. 802c8f8: 220b movs r2, #11
  34594. 802c8fa: f7f5 fcc7 bl 802228c <strncmp>
  34595. 802c8fe: 2800 cmp r0, #0
  34596. 802c900: d151 bne.n 802c9a6 <HTTP_ConfirmWebPwd+0x12e>
  34597. (strncmp(WebPassword, password, MAX_WEB_PASSWD_LEN) == 0)) {
  34598. 802c902: a801 add r0, sp, #4
  34599. 802c904: a90c add r1, sp, #48 ; 0x30
  34600. 802c906: 220b movs r2, #11
  34601. 802c908: f7f5 fcc0 bl 802228c <strncmp>
  34602. GetUserLogin(user_id, WebLogin, &valueLen);
  34603. GetUserPassword(user_id, WebPassword, &valueLen);
  34604. /* Check login and password */
  34605. if ((strncmp(WebLogin, login, MAX_WEB_LOGIN_LEN) == 0) &&
  34606. 802c90c: 2800 cmp r0, #0
  34607. 802c90e: d14a bne.n 802c9a6 <HTTP_ConfirmWebPwd+0x12e>
  34608. if (user_id >= 1) {
  34609. }
  34610. /* TODO replace global flag with user-pass-cookie */
  34611. Authenticated = true;
  34612. 802c910: 4b2a ldr r3, [pc, #168] ; (802c9bc <HTTP_ConfirmWebPwd+0x144>)
  34613. 802c912: 2201 movs r2, #1
  34614. 802c914: 701a strb r2, [r3, #0]
  34615. /* Generate cookie */
  34616. sprintf(tempStr, "%X", (unsigned int)GetRandomNumber());
  34617. 802c916: f7f9 fdb7 bl 8026488 <GetRandomNumber>
  34618. 802c91a: 492a ldr r1, [pc, #168] ; (802c9c4 <HTTP_ConfirmWebPwd+0x14c>)
  34619. 802c91c: 4602 mov r2, r0
  34620. 802c91e: a81b add r0, sp, #108 ; 0x6c
  34621. 802c920: f7fb f9e2 bl 8027ce8 <tfp_sprintf>
  34622. /**
  34623. * @brief Установка Cookie пользователя
  34624. */
  34625. static void HTTP_SetUserCookie(char *str, uint8_t user_id)
  34626. {
  34627. strcpy(users[user_id].cookie, str);
  34628. 802c924: 4b28 ldr r3, [pc, #160] ; (802c9c8 <HTTP_ConfirmWebPwd+0x150>)
  34629. 802c926: 2014 movs r0, #20
  34630. 802c928: fb00 3004 mla r0, r0, r4, r3
  34631. 802c92c: a91b add r1, sp, #108 ; 0x6c
  34632. 802c92e: f7f5 fbed bl 802210c <strcpy>
  34633. sprintf(tempStr, "%X", (unsigned int)GetRandomNumber());
  34634. /* Set users cookie */
  34635. HTTP_SetUserCookie(tempStr, user_id);
  34636. HTTP_UpdateUserLoginTime(user_id);
  34637. 802c932: 4620 mov r0, r4
  34638. 802c934: f7ff fd32 bl 802c39c <HTTP_UpdateUserLoginTime>
  34639. /* Send login and cookie back */
  34640. strcpy(bufOut, "HTTP/1.0 200 OK\r\nContent-Type:text/html\r\nSet-Cookie: uname=");
  34641. 802c938: 4924 ldr r1, [pc, #144] ; (802c9cc <HTTP_ConfirmWebPwd+0x154>)
  34642. 802c93a: 4628 mov r0, r5
  34643. 802c93c: f7f5 fbe6 bl 802210c <strcpy>
  34644. strcat(bufOut, WebLogin);
  34645. 802c940: a904 add r1, sp, #16
  34646. 802c942: 4628 mov r0, r5
  34647. 802c944: f7f5 face bl 8021ee4 <strcat>
  34648. strcat(bufOut, "\r\nSet-Cookie: id=");
  34649. 802c948: 4921 ldr r1, [pc, #132] ; (802c9d0 <HTTP_ConfirmWebPwd+0x158>)
  34650. 802c94a: 4628 mov r0, r5
  34651. 802c94c: f7f5 faca bl 8021ee4 <strcat>
  34652. strcat(bufOut, tempStr);
  34653. 802c950: a91b add r1, sp, #108 ; 0x6c
  34654. 802c952: 4628 mov r0, r5
  34655. 802c954: f7f5 fac6 bl 8021ee4 <strcat>
  34656. sprintf(tempStr, "%d", user_id);
  34657. 802c958: 4622 mov r2, r4
  34658. 802c95a: 491e ldr r1, [pc, #120] ; (802c9d4 <HTTP_ConfirmWebPwd+0x15c>)
  34659. 802c95c: a81b add r0, sp, #108 ; 0x6c
  34660. 802c95e: f7fb f9c3 bl 8027ce8 <tfp_sprintf>
  34661. strcat(bufOut, "\r\nSet-Cookie: role=");
  34662. 802c962: 491d ldr r1, [pc, #116] ; (802c9d8 <HTTP_ConfirmWebPwd+0x160>)
  34663. 802c964: 4628 mov r0, r5
  34664. 802c966: f7f5 fabd bl 8021ee4 <strcat>
  34665. strcat(bufOut, tempStr);
  34666. 802c96a: a91b add r1, sp, #108 ; 0x6c
  34667. 802c96c: 4628 mov r0, r5
  34668. 802c96e: f7f5 fab9 bl 8021ee4 <strcat>
  34669. strcat(bufOut, "\r\n\r\n");
  34670. 802c972: 491a ldr r1, [pc, #104] ; (802c9dc <HTTP_ConfirmWebPwd+0x164>)
  34671. 802c974: 4628 mov r0, r5
  34672. 802c976: f7f5 fab5 bl 8021ee4 <strcat>
  34673. strcat(bufOut,"<!DOCTYPE html><html lang=""><head><meta http-equiv=\"refresh\" content=\"0;url=/index.html\"/></head></html>\r\n\r\n");
  34674. 802c97a: 4919 ldr r1, [pc, #100] ; (802c9e0 <HTTP_ConfirmWebPwd+0x168>)
  34675. 802c97c: 4628 mov r0, r5
  34676. 802c97e: f7f5 fab1 bl 8021ee4 <strcat>
  34677. *lenBufOut = strlen(bufOut);
  34678. 802c982: 4628 mov r0, r5
  34679. 802c984: f7f5 fc20 bl 80221c8 <strlen>
  34680. switch (user_id) {
  34681. case 0:
  34682. snprintf(buf, sizeof(buf), "Администратор");
  34683. break;
  34684. case 1:
  34685. snprintf(buf, sizeof(buf), "Пользователь");
  34686. 802c988: 2128 movs r1, #40 ; 0x28
  34687. strcat(bufOut, "\r\n\r\n");
  34688. strcat(bufOut,"<!DOCTYPE html><html lang=""><head><meta http-equiv=\"refresh\" content=\"0;url=/index.html\"/></head></html>\r\n\r\n");
  34689. *lenBufOut = strlen(bufOut);
  34690. switch (user_id) {
  34691. 802c98a: 2c01 cmp r4, #1
  34692. case 0:
  34693. snprintf(buf, sizeof(buf), "Администратор");
  34694. 802c98c: bf14 ite ne
  34695. 802c98e: 4a15 ldrne r2, [pc, #84] ; (802c9e4 <HTTP_ConfirmWebPwd+0x16c>)
  34696. break;
  34697. case 1:
  34698. snprintf(buf, sizeof(buf), "Пользователь");
  34699. 802c990: 4a15 ldreq r2, [pc, #84] ; (802c9e8 <HTTP_ConfirmWebPwd+0x170>)
  34700. strcat(bufOut, "\r\nSet-Cookie: role=");
  34701. strcat(bufOut, tempStr);
  34702. strcat(bufOut, "\r\n\r\n");
  34703. strcat(bufOut,"<!DOCTYPE html><html lang=""><head><meta http-equiv=\"refresh\" content=\"0;url=/index.html\"/></head></html>\r\n\r\n");
  34704. *lenBufOut = strlen(bufOut);
  34705. 802c992: 8038 strh r0, [r7, #0]
  34706. switch (user_id) {
  34707. case 0:
  34708. snprintf(buf, sizeof(buf), "Администратор");
  34709. break;
  34710. case 1:
  34711. snprintf(buf, sizeof(buf), "Пользователь");
  34712. 802c994: a811 add r0, sp, #68 ; 0x44
  34713. 802c996: f7fb f989 bl 8027cac <tfp_snprintf>
  34714. default:
  34715. snprintf(buf, sizeof(buf), "", login);
  34716. break;
  34717. }
  34718. log_event_data(LOG_LOGIN, buf);
  34719. 802c99a: 2005 movs r0, #5
  34720. 802c99c: a911 add r1, sp, #68 ; 0x44
  34721. 802c99e: f7fd fc61 bl 802a264 <log_event_data>
  34722. /* Запускаем задачу-таймер логаута. */
  34723. /* TODO отправить ответ серверу о статусе пароля */
  34724. return SEND_REQUIRED_YES;
  34725. 802c9a2: 2000 movs r0, #0
  34726. 802c9a4: e004 b.n 802c9b0 <HTTP_ConfirmWebPwd+0x138>
  34727. strcat(tempStr, " ");
  34728. if (GetParamValue(tempStr, "login=", login, &valueLen) &&
  34729. GetParamValue(tempStr, "password=", password, &valueLen))
  34730. {
  34731. for (user_id = 0; user_id < MAX_WEB_USERS; user_id++) {
  34732. 802c9a6: 3401 adds r4, #1
  34733. 802c9a8: b2e4 uxtb r4, r4
  34734. 802c9aa: 2c02 cmp r4, #2
  34735. 802c9ac: d08a beq.n 802c8c4 <HTTP_ConfirmWebPwd+0x4c>
  34736. 802c9ae: e797 b.n 802c8e0 <HTTP_ConfirmWebPwd+0x68>
  34737. /* TODO replace global flag with user-pass-cookie*/
  34738. Authenticated = false;
  34739. /* Wrong login or pass, return */
  34740. return SEND_REQUIRED_NO;
  34741. }
  34742. 802c9b0: b029 add sp, #164 ; 0xa4
  34743. 802c9b2: bdf0 pop {r4, r5, r6, r7, pc}
  34744. 802c9b4: 080392c9 .word 0x080392c9
  34745. 802c9b8: 0803ff33 .word 0x0803ff33
  34746. 802c9bc: 20000d5f .word 0x20000d5f
  34747. 802c9c0: 0803ff3a .word 0x0803ff3a
  34748. 802c9c4: 0803fe3e .word 0x0803fe3e
  34749. 802c9c8: 2000eaa0 .word 0x2000eaa0
  34750. 802c9cc: 0803fe4d .word 0x0803fe4d
  34751. 802c9d0: 0803fe89 .word 0x0803fe89
  34752. 802c9d4: 0803916f .word 0x0803916f
  34753. 802c9d8: 0803ff44 .word 0x0803ff44
  34754. 802c9dc: 080405bd .word 0x080405bd
  34755. 802c9e0: 0803fec5 .word 0x0803fec5
  34756. 802c9e4: 0803928f .word 0x0803928f
  34757. 802c9e8: 0803ff58 .word 0x0803ff58
  34758. 0802c9ec <HTTP_UPSshutdown>:
  34759. /**
  34760. * @brief Выклюение UPS
  34761. */
  34762. void HTTP_UPSshutdown(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  34763. {
  34764. 802c9ec: b570 push {r4, r5, r6, lr}
  34765. 802c9ee: b09c sub sp, #112 ; 0x70
  34766. char *valueLenEnd = 0;
  34767. char tempValue[50];
  34768. char tempValue2[50];
  34769. int8_t res = 0;
  34770. memset(tempValue, 0, 50);
  34771. 802c9f0: 2232 movs r2, #50 ; 0x32
  34772. /**
  34773. * @brief Выклюение UPS
  34774. */
  34775. void HTTP_UPSshutdown(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  34776. {
  34777. 802c9f2: 4606 mov r6, r0
  34778. 802c9f4: 460c mov r4, r1
  34779. char *valueLenEnd = 0;
  34780. char tempValue[50];
  34781. char tempValue2[50];
  34782. int8_t res = 0;
  34783. memset(tempValue, 0, 50);
  34784. 802c9f6: a802 add r0, sp, #8
  34785. /**
  34786. * @brief Выклюение UPS
  34787. */
  34788. void HTTP_UPSshutdown(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  34789. {
  34790. uint8_t valueLen = 0;
  34791. 802c9f8: 2100 movs r1, #0
  34792. /**
  34793. * @brief Выклюение UPS
  34794. */
  34795. void HTTP_UPSshutdown(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  34796. {
  34797. 802c9fa: 461d mov r5, r3
  34798. uint8_t valueLen = 0;
  34799. 802c9fc: f88d 1007 strb.w r1, [sp, #7]
  34800. char *valueLenEnd = 0;
  34801. char tempValue[50];
  34802. char tempValue2[50];
  34803. int8_t res = 0;
  34804. memset(tempValue, 0, 50);
  34805. 802ca00: f7f5 fa0a bl 8021e18 <memset>
  34806. strcpy(bufOut, HTTP_200_OK);
  34807. 802ca04: 4928 ldr r1, [pc, #160] ; (802caa8 <HTTP_UPSshutdown+0xbc>)
  34808. 802ca06: 4620 mov r0, r4
  34809. 802ca08: f7f5 fb80 bl 802210c <strcpy>
  34810. GetParamValue(bufIn, "func=", tempValue, &valueLen);
  34811. 802ca0c: 4927 ldr r1, [pc, #156] ; (802caac <HTTP_UPSshutdown+0xc0>)
  34812. 802ca0e: 4630 mov r0, r6
  34813. 802ca10: aa02 add r2, sp, #8
  34814. 802ca12: f10d 0307 add.w r3, sp, #7
  34815. 802ca16: f7ff ff01 bl 802c81c <GetParamValue>
  34816. if (strcmp(tempValue, "reboot") == 0){
  34817. 802ca1a: a802 add r0, sp, #8
  34818. 802ca1c: 4924 ldr r1, [pc, #144] ; (802cab0 <HTTP_UPSshutdown+0xc4>)
  34819. 802ca1e: f7f5 fa87 bl 8021f30 <strcmp>
  34820. 802ca22: b978 cbnz r0, 802ca44 <HTTP_UPSshutdown+0x58>
  34821. res = ups_metac_service_pdu(ups_cancel_shut_down);
  34822. 802ca24: 2007 movs r0, #7
  34823. 802ca26: f7fc fed5 bl 80297d4 <ups_metac_service_pdu>
  34824. if(res == 1){
  34825. 802ca2a: b240 sxtb r0, r0
  34826. 802ca2c: 2801 cmp r0, #1
  34827. 802ca2e: d106 bne.n 802ca3e <HTTP_UPSshutdown+0x52>
  34828. log_event_data(LOG_SHUTDOWN_UPS, "Администратор(Останов)");
  34829. 802ca30: 2007 movs r0, #7
  34830. 802ca32: 4920 ldr r1, [pc, #128] ; (802cab4 <HTTP_UPSshutdown+0xc8>)
  34831. 802ca34: f7fd fc16 bl 802a264 <log_event_data>
  34832. strcat(bufOut, "Выключение нагрузки ИБП отменено!");
  34833. 802ca38: 4620 mov r0, r4
  34834. 802ca3a: 491f ldr r1, [pc, #124] ; (802cab8 <HTTP_UPSshutdown+0xcc>)
  34835. 802ca3c: e02b b.n 802ca96 <HTTP_UPSshutdown+0xaa>
  34836. }
  34837. else
  34838. strcat(bufOut, "Выключение нагрузки ИБП не удалось отменить!");
  34839. 802ca3e: 4620 mov r0, r4
  34840. 802ca40: 491e ldr r1, [pc, #120] ; (802cabc <HTTP_UPSshutdown+0xd0>)
  34841. 802ca42: e028 b.n 802ca96 <HTTP_UPSshutdown+0xaa>
  34842. *lenBufOut = strlen(bufOut);
  34843. }
  34844. else if (strncmp(tempValue, "off", 5) == 0){
  34845. 802ca44: 491e ldr r1, [pc, #120] ; (802cac0 <HTTP_UPSshutdown+0xd4>)
  34846. 802ca46: a802 add r0, sp, #8
  34847. 802ca48: 2205 movs r2, #5
  34848. 802ca4a: f7f5 fc1f bl 802228c <strncmp>
  34849. 802ca4e: 4601 mov r1, r0
  34850. 802ca50: bb38 cbnz r0, 802caa2 <HTTP_UPSshutdown+0xb6>
  34851. memset(tempValue2, 0, 50);
  34852. 802ca52: 2232 movs r2, #50 ; 0x32
  34853. 802ca54: a80f add r0, sp, #60 ; 0x3c
  34854. 802ca56: f7f5 f9df bl 8021e18 <memset>
  34855. GetParamValue(bufIn, "after=", tempValue2, &valueLen);
  34856. 802ca5a: aa0f add r2, sp, #60 ; 0x3c
  34857. 802ca5c: f10d 0307 add.w r3, sp, #7
  34858. 802ca60: 4918 ldr r1, [pc, #96] ; (802cac4 <HTTP_UPSshutdown+0xd8>)
  34859. 802ca62: 4630 mov r0, r6
  34860. 802ca64: f7ff feda bl 802c81c <GetParamValue>
  34861. TimeParamFloat = atof(tempValue2);
  34862. 802ca68: a80f add r0, sp, #60 ; 0x3c
  34863. 802ca6a: f7f5 f8b1 bl 8021bd0 <atof>
  34864. 802ca6e: f7f4 f8c5 bl 8020bfc <__aeabi_d2f>
  34865. 802ca72: 4b15 ldr r3, [pc, #84] ; (802cac8 <HTTP_UPSshutdown+0xdc>)
  34866. 802ca74: 6018 str r0, [r3, #0]
  34867. res = ups_metac_service_pdu(ups_shutdown);
  34868. 802ca76: 2005 movs r0, #5
  34869. 802ca78: f7fc feac bl 80297d4 <ups_metac_service_pdu>
  34870. if(res == 1){
  34871. 802ca7c: b240 sxtb r0, r0
  34872. 802ca7e: 2801 cmp r0, #1
  34873. strcat(bufOut, "Отключение нагрузки ИБП!");
  34874. 802ca80: 4620 mov r0, r4
  34875. else if (strncmp(tempValue, "off", 5) == 0){
  34876. memset(tempValue2, 0, 50);
  34877. GetParamValue(bufIn, "after=", tempValue2, &valueLen);
  34878. TimeParamFloat = atof(tempValue2);
  34879. res = ups_metac_service_pdu(ups_shutdown);
  34880. if(res == 1){
  34881. 802ca82: d107 bne.n 802ca94 <HTTP_UPSshutdown+0xa8>
  34882. strcat(bufOut, "Отключение нагрузки ИБП!");
  34883. 802ca84: 4911 ldr r1, [pc, #68] ; (802cacc <HTTP_UPSshutdown+0xe0>)
  34884. 802ca86: f7f5 fa2d bl 8021ee4 <strcat>
  34885. log_event_data(LOG_SHUTDOWN_UPS, "Администратор");
  34886. 802ca8a: 2007 movs r0, #7
  34887. 802ca8c: 4910 ldr r1, [pc, #64] ; (802cad0 <HTTP_UPSshutdown+0xe4>)
  34888. 802ca8e: f7fd fbe9 bl 802a264 <log_event_data>
  34889. 802ca92: e002 b.n 802ca9a <HTTP_UPSshutdown+0xae>
  34890. }else
  34891. strcat(bufOut, "Отключение нагрузки ИБП не удалось!");
  34892. 802ca94: 490f ldr r1, [pc, #60] ; (802cad4 <HTTP_UPSshutdown+0xe8>)
  34893. 802ca96: f7f5 fa25 bl 8021ee4 <strcat>
  34894. *lenBufOut = strlen(bufOut);
  34895. 802ca9a: 4620 mov r0, r4
  34896. 802ca9c: f7f5 fb94 bl 80221c8 <strlen>
  34897. 802caa0: 8028 strh r0, [r5, #0]
  34898. }
  34899. }
  34900. 802caa2: b01c add sp, #112 ; 0x70
  34901. 802caa4: bd70 pop {r4, r5, r6, pc}
  34902. 802caa6: bf00 nop
  34903. 802caa8: 08041928 .word 0x08041928
  34904. 802caac: 0803ff71 .word 0x0803ff71
  34905. 802cab0: 0803ff77 .word 0x0803ff77
  34906. 802cab4: 0803ff7e .word 0x0803ff7e
  34907. 802cab8: 0803ffa9 .word 0x0803ffa9
  34908. 802cabc: 0803ffe8 .word 0x0803ffe8
  34909. 802cac0: 0804003b .word 0x0804003b
  34910. 802cac4: 0804003f .word 0x0804003f
  34911. 802cac8: 20000b88 .word 0x20000b88
  34912. 802cacc: 08040046 .word 0x08040046
  34913. 802cad0: 0803928f .word 0x0803928f
  34914. 802cad4: 08040074 .word 0x08040074
  34915. 0802cad8 <HTTP_UPSTest>:
  34916. /**
  34917. * @brief Запуск/останов теста UPS
  34918. */
  34919. void HTTP_UPSTest(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  34920. {
  34921. 802cad8: b5f0 push {r4, r5, r6, r7, lr}
  34922. uint8_t valueLen = 0;
  34923. 802cada: 2600 movs r6, #0
  34924. /**
  34925. * @brief Запуск/останов теста UPS
  34926. */
  34927. void HTTP_UPSTest(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  34928. {
  34929. 802cadc: b08d sub sp, #52 ; 0x34
  34930. 802cade: 4607 mov r7, r0
  34931. 802cae0: 460c mov r4, r1
  34932. uint8_t valueLen = 0;
  34933. char tempValue[20];
  34934. char tempValue2[20];
  34935. int8_t res = 0;
  34936. memset(tempValue, 0, 20);
  34937. 802cae2: 2214 movs r2, #20
  34938. 802cae4: 4631 mov r1, r6
  34939. 802cae6: a802 add r0, sp, #8
  34940. /**
  34941. * @brief Запуск/останов теста UPS
  34942. */
  34943. void HTTP_UPSTest(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  34944. {
  34945. 802cae8: 461d mov r5, r3
  34946. uint8_t valueLen = 0;
  34947. 802caea: f88d 6007 strb.w r6, [sp, #7]
  34948. char tempValue[20];
  34949. char tempValue2[20];
  34950. int8_t res = 0;
  34951. memset(tempValue, 0, 20);
  34952. 802caee: f7f5 f993 bl 8021e18 <memset>
  34953. memset(tempValue2, 0, 20);
  34954. 802caf2: 2214 movs r2, #20
  34955. 802caf4: 4631 mov r1, r6
  34956. 802caf6: a807 add r0, sp, #28
  34957. 802caf8: f7f5 f98e bl 8021e18 <memset>
  34958. strcpy(bufOut, HTTP_200_OK);
  34959. 802cafc: 492b ldr r1, [pc, #172] ; (802cbac <HTTP_UPSTest+0xd4>)
  34960. 802cafe: 4620 mov r0, r4
  34961. 802cb00: f7f5 fb04 bl 802210c <strcpy>
  34962. GetParamValue(bufIn, "func=", tempValue, &valueLen);
  34963. 802cb04: 492a ldr r1, [pc, #168] ; (802cbb0 <HTTP_UPSTest+0xd8>)
  34964. 802cb06: 4638 mov r0, r7
  34965. 802cb08: aa02 add r2, sp, #8
  34966. 802cb0a: f10d 0307 add.w r3, sp, #7
  34967. 802cb0e: f7ff fe85 bl 802c81c <GetParamValue>
  34968. if (strcmp(tempValue, "stop") == 0){
  34969. 802cb12: a802 add r0, sp, #8
  34970. 802cb14: 4927 ldr r1, [pc, #156] ; (802cbb4 <HTTP_UPSTest+0xdc>)
  34971. 802cb16: f7f5 fa0b bl 8021f30 <strcmp>
  34972. 802cb1a: b998 cbnz r0, 802cb44 <HTTP_UPSTest+0x6c>
  34973. res = ups_metac_service_pdu(ups_cancel_test);
  34974. 802cb1c: 2008 movs r0, #8
  34975. 802cb1e: f7fc fe59 bl 80297d4 <ups_metac_service_pdu>
  34976. 802cb22: b2c6 uxtb r6, r0
  34977. if(res == 1 || res == 0){
  34978. 802cb24: 2e01 cmp r6, #1
  34979. 802cb26: d807 bhi.n 802cb38 <HTTP_UPSTest+0x60>
  34980. strcat(bufOut, "Тест остановлен!");
  34981. 802cb28: 4923 ldr r1, [pc, #140] ; (802cbb8 <HTTP_UPSTest+0xe0>)
  34982. 802cb2a: 4620 mov r0, r4
  34983. 802cb2c: f7f5 f9da bl 8021ee4 <strcat>
  34984. log_event_data(LOG_TEST_UPS, "Администратор(Останов)");
  34985. 802cb30: 2006 movs r0, #6
  34986. 802cb32: 4922 ldr r1, [pc, #136] ; (802cbbc <HTTP_UPSTest+0xe4>)
  34987. 802cb34: f7fd fb96 bl 802a264 <log_event_data>
  34988. }
  34989. if(res == -1)
  34990. 802cb38: b276 sxtb r6, r6
  34991. 802cb3a: 1c72 adds r2, r6, #1
  34992. 802cb3c: d130 bne.n 802cba0 <HTTP_UPSTest+0xc8>
  34993. strcat(bufOut, "Тест не удалось остановить!");
  34994. 802cb3e: 4620 mov r0, r4
  34995. 802cb40: 491f ldr r1, [pc, #124] ; (802cbc0 <HTTP_UPSTest+0xe8>)
  34996. 802cb42: e02b b.n 802cb9c <HTTP_UPSTest+0xc4>
  34997. *lenBufOut = strlen(bufOut);
  34998. }
  34999. else if (strcmp(tempValue, "discharge") == 0){
  35000. 802cb44: a802 add r0, sp, #8
  35001. 802cb46: 491f ldr r1, [pc, #124] ; (802cbc4 <HTTP_UPSTest+0xec>)
  35002. 802cb48: f7f5 f9f2 bl 8021f30 <strcmp>
  35003. 802cb4c: b908 cbnz r0, 802cb52 <HTTP_UPSTest+0x7a>
  35004. res = ups_metac_service_pdu(ups_test_low_bat);
  35005. 802cb4e: 2002 movs r0, #2
  35006. 802cb50: e012 b.n 802cb78 <HTTP_UPSTest+0xa0>
  35007. }
  35008. if(res == -1)
  35009. strcat(bufOut, "Тест не удалось запустить!");
  35010. *lenBufOut = strlen(bufOut);
  35011. }
  35012. else if (strncmp(tempValue, "time", 6) == 0){
  35013. 802cb52: a802 add r0, sp, #8
  35014. 802cb54: 491c ldr r1, [pc, #112] ; (802cbc8 <HTTP_UPSTest+0xf0>)
  35015. 802cb56: 2206 movs r2, #6
  35016. 802cb58: f7f5 fb98 bl 802228c <strncmp>
  35017. 802cb5c: bb20 cbnz r0, 802cba8 <HTTP_UPSTest+0xd0>
  35018. GetParamValue(bufIn, "=", tempValue2, &valueLen);
  35019. 802cb5e: f10d 0307 add.w r3, sp, #7
  35020. 802cb62: 491a ldr r1, [pc, #104] ; (802cbcc <HTTP_UPSTest+0xf4>)
  35021. 802cb64: aa07 add r2, sp, #28
  35022. 802cb66: 4638 mov r0, r7
  35023. 802cb68: f7ff fe58 bl 802c81c <GetParamValue>
  35024. TimeParam = atoi(tempValue2);
  35025. 802cb6c: a807 add r0, sp, #28
  35026. 802cb6e: f7f5 f833 bl 8021bd8 <atoi>
  35027. 802cb72: 4b17 ldr r3, [pc, #92] ; (802cbd0 <HTTP_UPSTest+0xf8>)
  35028. 802cb74: 8018 strh r0, [r3, #0]
  35029. res = ups_metac_service_pdu(ups_test_time);
  35030. 802cb76: 2003 movs r0, #3
  35031. 802cb78: f7fc fe2c bl 80297d4 <ups_metac_service_pdu>
  35032. 802cb7c: b2c6 uxtb r6, r0
  35033. if(res == 1 || res == 0){
  35034. 802cb7e: 2e01 cmp r6, #1
  35035. 802cb80: d807 bhi.n 802cb92 <HTTP_UPSTest+0xba>
  35036. strcat(bufOut, "Тест запущен!");
  35037. 802cb82: 4914 ldr r1, [pc, #80] ; (802cbd4 <HTTP_UPSTest+0xfc>)
  35038. 802cb84: 4620 mov r0, r4
  35039. 802cb86: f7f5 f9ad bl 8021ee4 <strcat>
  35040. log_event_data(LOG_TEST_UPS, "Администратор (Запущен)");
  35041. 802cb8a: 2006 movs r0, #6
  35042. 802cb8c: 4912 ldr r1, [pc, #72] ; (802cbd8 <HTTP_UPSTest+0x100>)
  35043. 802cb8e: f7fd fb69 bl 802a264 <log_event_data>
  35044. }
  35045. if(res == -1)
  35046. 802cb92: b276 sxtb r6, r6
  35047. 802cb94: 1c73 adds r3, r6, #1
  35048. 802cb96: d103 bne.n 802cba0 <HTTP_UPSTest+0xc8>
  35049. strcat(bufOut, "Тест не удалось запустить!");
  35050. 802cb98: 4910 ldr r1, [pc, #64] ; (802cbdc <HTTP_UPSTest+0x104>)
  35051. 802cb9a: 4620 mov r0, r4
  35052. 802cb9c: f7f5 f9a2 bl 8021ee4 <strcat>
  35053. *lenBufOut = strlen(bufOut);
  35054. 802cba0: 4620 mov r0, r4
  35055. 802cba2: f7f5 fb11 bl 80221c8 <strlen>
  35056. 802cba6: 8028 strh r0, [r5, #0]
  35057. }
  35058. }
  35059. 802cba8: b00d add sp, #52 ; 0x34
  35060. 802cbaa: bdf0 pop {r4, r5, r6, r7, pc}
  35061. 802cbac: 08041928 .word 0x08041928
  35062. 802cbb0: 0803ff71 .word 0x0803ff71
  35063. 802cbb4: 080400b6 .word 0x080400b6
  35064. 802cbb8: 080400bb .word 0x080400bb
  35065. 802cbbc: 0803ff7e .word 0x0803ff7e
  35066. 802cbc0: 080400da .word 0x080400da
  35067. 802cbc4: 0804010d .word 0x0804010d
  35068. 802cbc8: 0804018d .word 0x0804018d
  35069. 802cbcc: 0804025e .word 0x0804025e
  35070. 802cbd0: 20000b8c .word 0x20000b8c
  35071. 802cbd4: 08040117 .word 0x08040117
  35072. 802cbd8: 08040130 .word 0x08040130
  35073. 802cbdc: 0804015c .word 0x0804015c
  35074. 0802cbe0 <HTTP_SetInfo>:
  35075. /**
  35076. * @brief
  35077. * @retval None
  35078. */
  35079. void HTTP_SetInfo(char *buf, uint16_t lenBuf)
  35080. {
  35081. 802cbe0: b530 push {r4, r5, lr}
  35082. uint8_t valueLen = 0;
  35083. 802cbe2: 2400 movs r4, #0
  35084. /**
  35085. * @brief
  35086. * @retval None
  35087. */
  35088. void HTTP_SetInfo(char *buf, uint16_t lenBuf)
  35089. {
  35090. 802cbe4: b0bb sub sp, #236 ; 0xec
  35091. 802cbe6: 4605 mov r5, r0
  35092. char value[110];
  35093. char str[110];
  35094. // ClearParamString(buf);
  35095. memset(value, 0, len);
  35096. 802cbe8: 4621 mov r1, r4
  35097. 802cbea: 226e movs r2, #110 ; 0x6e
  35098. 802cbec: a802 add r0, sp, #8
  35099. * @brief
  35100. * @retval None
  35101. */
  35102. void HTTP_SetInfo(char *buf, uint16_t lenBuf)
  35103. {
  35104. uint8_t valueLen = 0;
  35105. 802cbee: f88d 4007 strb.w r4, [sp, #7]
  35106. char value[110];
  35107. char str[110];
  35108. // ClearParamString(buf);
  35109. memset(value, 0, len);
  35110. 802cbf2: f7f5 f911 bl 8021e18 <memset>
  35111. /* Владелец */
  35112. GetParamValue(buf, "owner=", value, &valueLen);
  35113. 802cbf6: f10d 0307 add.w r3, sp, #7
  35114. 802cbfa: aa02 add r2, sp, #8
  35115. 802cbfc: 4628 mov r0, r5
  35116. 802cbfe: 491e ldr r1, [pc, #120] ; (802cc78 <HTTP_SetInfo+0x98>)
  35117. 802cc00: f7ff fe0c bl 802c81c <GetParamValue>
  35118. url_decode(str, sizeof(str), value);
  35119. 802cc04: 216e movs r1, #110 ; 0x6e
  35120. 802cc06: aa02 add r2, sp, #8
  35121. 802cc08: a81e add r0, sp, #120 ; 0x78
  35122. 802cc0a: f7fc fea1 bl 8029950 <url_decode>
  35123. SetOwner(str);
  35124. 802cc0e: a81e add r0, sp, #120 ; 0x78
  35125. 802cc10: f7fb fd58 bl 80286c4 <SetOwner>
  35126. memset(value, 0, len);
  35127. 802cc14: 4621 mov r1, r4
  35128. 802cc16: 226e movs r2, #110 ; 0x6e
  35129. 802cc18: a802 add r0, sp, #8
  35130. 802cc1a: f7f5 f8fd bl 8021e18 <memset>
  35131. /* Владелец */
  35132. GetParamValue(buf, "sysLocation=", value, &valueLen);
  35133. 802cc1e: f10d 0307 add.w r3, sp, #7
  35134. 802cc22: aa02 add r2, sp, #8
  35135. 802cc24: 4628 mov r0, r5
  35136. 802cc26: 4915 ldr r1, [pc, #84] ; (802cc7c <HTTP_SetInfo+0x9c>)
  35137. 802cc28: f7ff fdf8 bl 802c81c <GetParamValue>
  35138. url_decode(str, sizeof(str), value);
  35139. 802cc2c: 216e movs r1, #110 ; 0x6e
  35140. 802cc2e: aa02 add r2, sp, #8
  35141. 802cc30: a81e add r0, sp, #120 ; 0x78
  35142. 802cc32: f7fc fe8d bl 8029950 <url_decode>
  35143. SetLocation(str);
  35144. 802cc36: a81e add r0, sp, #120 ; 0x78
  35145. 802cc38: f7fb fd54 bl 80286e4 <SetLocation>
  35146. memset(value, 0, len);
  35147. 802cc3c: 4621 mov r1, r4
  35148. 802cc3e: 226e movs r2, #110 ; 0x6e
  35149. 802cc40: a802 add r0, sp, #8
  35150. 802cc42: f7f5 f8e9 bl 8021e18 <memset>
  35151. /* Комментарий */
  35152. GetParamValue(buf, "comment=", value, &valueLen);
  35153. 802cc46: f10d 0307 add.w r3, sp, #7
  35154. 802cc4a: aa02 add r2, sp, #8
  35155. 802cc4c: 4628 mov r0, r5
  35156. 802cc4e: 490c ldr r1, [pc, #48] ; (802cc80 <HTTP_SetInfo+0xa0>)
  35157. 802cc50: f7ff fde4 bl 802c81c <GetParamValue>
  35158. url_decode(str, sizeof(str), value);
  35159. 802cc54: 216e movs r1, #110 ; 0x6e
  35160. 802cc56: aa02 add r2, sp, #8
  35161. 802cc58: a81e add r0, sp, #120 ; 0x78
  35162. 802cc5a: f7fc fe79 bl 8029950 <url_decode>
  35163. SetComment(str);
  35164. 802cc5e: a81e add r0, sp, #120 ; 0x78
  35165. 802cc60: f7fb fd4e bl 8028700 <SetComment>
  35166. memset(value, 0, len);
  35167. 802cc64: 4621 mov r1, r4
  35168. 802cc66: 226e movs r2, #110 ; 0x6e
  35169. 802cc68: a802 add r0, sp, #8
  35170. 802cc6a: f7f5 f8d5 bl 8021e18 <memset>
  35171. HTTP_SaveSettings();
  35172. 802cc6e: f001 fdfb bl 802e868 <HTTP_SaveSettings>
  35173. }
  35174. 802cc72: b03b add sp, #236 ; 0xec
  35175. 802cc74: bd30 pop {r4, r5, pc}
  35176. 802cc76: bf00 nop
  35177. 802cc78: 08040192 .word 0x08040192
  35178. 802cc7c: 08040199 .word 0x08040199
  35179. 802cc80: 080401a6 .word 0x080401a6
  35180. 0802cc84 <HTTP_SetSettings>:
  35181. /**
  35182. * @brief
  35183. * @retval None
  35184. */
  35185. void HTTP_SetSettings(char *buf, uint16_t lenBuf)
  35186. {
  35187. 802cc84: b530 push {r4, r5, lr}
  35188. uint8_t valueLen = 0;
  35189. 802cc86: 2500 movs r5, #0
  35190. /**
  35191. * @brief
  35192. * @retval None
  35193. */
  35194. void HTTP_SetSettings(char *buf, uint16_t lenBuf)
  35195. {
  35196. 802cc88: b0a3 sub sp, #140 ; 0x8c
  35197. 802cc8a: 4604 mov r4, r0
  35198. //printf(buf);
  35199. //ClearParamString(buf);
  35200. memset(value, 0, len);
  35201. 802cc8c: 2240 movs r2, #64 ; 0x40
  35202. 802cc8e: 4629 mov r1, r5
  35203. 802cc90: a802 add r0, sp, #8
  35204. * @brief
  35205. * @retval None
  35206. */
  35207. void HTTP_SetSettings(char *buf, uint16_t lenBuf)
  35208. {
  35209. uint8_t valueLen = 0;
  35210. 802cc92: f88d 5007 strb.w r5, [sp, #7]
  35211. //printf(buf);
  35212. //ClearParamString(buf);
  35213. memset(value, 0, len);
  35214. 802cc96: f7f5 f8bf bl 8021e18 <memset>
  35215. memset(str, 0, MAX_WEB_PARAM_LEN);
  35216. 802cc9a: 2240 movs r2, #64 ; 0x40
  35217. 802cc9c: 4629 mov r1, r5
  35218. 802cc9e: a812 add r0, sp, #72 ; 0x48
  35219. 802cca0: f7f5 f8ba bl 8021e18 <memset>
  35220. /* SNMP */
  35221. GetParamValue(buf, "read_community=", value, &valueLen);
  35222. 802cca4: f10d 0307 add.w r3, sp, #7
  35223. 802cca8: 49b5 ldr r1, [pc, #724] ; (802cf80 <HTTP_SetSettings+0x2fc>)
  35224. 802ccaa: aa02 add r2, sp, #8
  35225. 802ccac: 4620 mov r0, r4
  35226. 802ccae: f7ff fdb5 bl 802c81c <GetParamValue>
  35227. SetReadCommunity(value);
  35228. 802ccb2: a802 add r0, sp, #8
  35229. 802ccb4: f7fb fcb4 bl 8028620 <SetReadCommunity>
  35230. memset(value, 0, len);
  35231. 802ccb8: 2240 movs r2, #64 ; 0x40
  35232. 802ccba: 4629 mov r1, r5
  35233. 802ccbc: a802 add r0, sp, #8
  35234. 802ccbe: f7f5 f8ab bl 8021e18 <memset>
  35235. GetParamValue(buf, "write_community=", value, &valueLen);
  35236. 802ccc2: f10d 0307 add.w r3, sp, #7
  35237. 802ccc6: 49af ldr r1, [pc, #700] ; (802cf84 <HTTP_SetSettings+0x300>)
  35238. 802ccc8: aa02 add r2, sp, #8
  35239. 802ccca: 4620 mov r0, r4
  35240. 802cccc: f7ff fda6 bl 802c81c <GetParamValue>
  35241. SetWriteCommunity(value);
  35242. 802ccd0: a802 add r0, sp, #8
  35243. 802ccd2: f7fb fcab bl 802862c <SetWriteCommunity>
  35244. memset(value, 0, len);
  35245. 802ccd6: 2240 movs r2, #64 ; 0x40
  35246. 802ccd8: 4629 mov r1, r5
  35247. 802ccda: a802 add r0, sp, #8
  35248. 802ccdc: f7f5 f89c bl 8021e18 <memset>
  35249. GetParamValue(buf, "managerIP=", value, &valueLen);
  35250. 802cce0: f10d 0307 add.w r3, sp, #7
  35251. 802cce4: 49a8 ldr r1, [pc, #672] ; (802cf88 <HTTP_SetSettings+0x304>)
  35252. 802cce6: aa02 add r2, sp, #8
  35253. 802cce8: 4620 mov r0, r4
  35254. 802ccea: f7ff fd97 bl 802c81c <GetParamValue>
  35255. SetManagerIp(value);
  35256. 802ccee: a802 add r0, sp, #8
  35257. 802ccf0: f7fb fca2 bl 8028638 <SetManagerIp>
  35258. memset(value, 0, len);
  35259. 802ccf4: 2240 movs r2, #64 ; 0x40
  35260. 802ccf6: 4629 mov r1, r5
  35261. 802ccf8: a802 add r0, sp, #8
  35262. 802ccfa: f7f5 f88d bl 8021e18 <memset>
  35263. GetParamValue(buf, "managerIP2=", value, &valueLen);
  35264. 802ccfe: f10d 0307 add.w r3, sp, #7
  35265. 802cd02: 49a2 ldr r1, [pc, #648] ; (802cf8c <HTTP_SetSettings+0x308>)
  35266. 802cd04: aa02 add r2, sp, #8
  35267. 802cd06: 4620 mov r0, r4
  35268. 802cd08: f7ff fd88 bl 802c81c <GetParamValue>
  35269. SetManagerIp2(value);
  35270. 802cd0c: a802 add r0, sp, #8
  35271. 802cd0e: f7fb fca1 bl 8028654 <SetManagerIp2>
  35272. memset(value, 0, len);
  35273. 802cd12: 2240 movs r2, #64 ; 0x40
  35274. 802cd14: 4629 mov r1, r5
  35275. 802cd16: a802 add r0, sp, #8
  35276. 802cd18: f7f5 f87e bl 8021e18 <memset>
  35277. GetParamValue(buf, "managerIP3=", value, &valueLen);
  35278. 802cd1c: f10d 0307 add.w r3, sp, #7
  35279. 802cd20: 499b ldr r1, [pc, #620] ; (802cf90 <HTTP_SetSettings+0x30c>)
  35280. 802cd22: aa02 add r2, sp, #8
  35281. 802cd24: 4620 mov r0, r4
  35282. 802cd26: f7ff fd79 bl 802c81c <GetParamValue>
  35283. SetManagerIp3(value);
  35284. 802cd2a: a802 add r0, sp, #8
  35285. 802cd2c: f7fb fca0 bl 8028670 <SetManagerIp3>
  35286. memset(value, 0, len);
  35287. 802cd30: 2240 movs r2, #64 ; 0x40
  35288. 802cd32: 4629 mov r1, r5
  35289. 802cd34: a802 add r0, sp, #8
  35290. 802cd36: f7f5 f86f bl 8021e18 <memset>
  35291. GetParamValue(buf, "managerIP4=", value, &valueLen);
  35292. 802cd3a: f10d 0307 add.w r3, sp, #7
  35293. 802cd3e: 4995 ldr r1, [pc, #596] ; (802cf94 <HTTP_SetSettings+0x310>)
  35294. 802cd40: aa02 add r2, sp, #8
  35295. 802cd42: 4620 mov r0, r4
  35296. 802cd44: f7ff fd6a bl 802c81c <GetParamValue>
  35297. SetManagerIp4(value);
  35298. 802cd48: a802 add r0, sp, #8
  35299. 802cd4a: f7fb fc9f bl 802868c <SetManagerIp4>
  35300. memset(value, 0, len);
  35301. 802cd4e: 2240 movs r2, #64 ; 0x40
  35302. 802cd50: 4629 mov r1, r5
  35303. 802cd52: a802 add r0, sp, #8
  35304. 802cd54: f7f5 f860 bl 8021e18 <memset>
  35305. GetParamValue(buf, "managerIP5=", value, &valueLen);
  35306. 802cd58: f10d 0307 add.w r3, sp, #7
  35307. 802cd5c: 498e ldr r1, [pc, #568] ; (802cf98 <HTTP_SetSettings+0x314>)
  35308. 802cd5e: aa02 add r2, sp, #8
  35309. 802cd60: 4620 mov r0, r4
  35310. 802cd62: f7ff fd5b bl 802c81c <GetParamValue>
  35311. SetManagerIp5(value);
  35312. 802cd66: a802 add r0, sp, #8
  35313. 802cd68: f7fb fc9e bl 80286a8 <SetManagerIp5>
  35314. memset(value, 0, len);
  35315. 802cd6c: 2240 movs r2, #64 ; 0x40
  35316. 802cd6e: 4629 mov r1, r5
  35317. 802cd70: a802 add r0, sp, #8
  35318. 802cd72: f7f5 f851 bl 8021e18 <memset>
  35319. /* Сетевые параметры */
  35320. GetParamValue(buf, "dhcp=", value, &valueLen);
  35321. 802cd76: 4989 ldr r1, [pc, #548] ; (802cf9c <HTTP_SetSettings+0x318>)
  35322. 802cd78: aa02 add r2, sp, #8
  35323. 802cd7a: f10d 0307 add.w r3, sp, #7
  35324. 802cd7e: 4620 mov r0, r4
  35325. 802cd80: f7ff fd4c bl 802c81c <GetParamValue>
  35326. SetDhcpStateStr(value);
  35327. 802cd84: a802 add r0, sp, #8
  35328. 802cd86: f7fb fc39 bl 80285fc <SetDhcpStateStr>
  35329. if (strncmp(value, "on", 2) != 0) // Если dhcp off устанавливаем параметры
  35330. 802cd8a: a802 add r0, sp, #8
  35331. 802cd8c: 4984 ldr r1, [pc, #528] ; (802cfa0 <HTTP_SetSettings+0x31c>)
  35332. 802cd8e: 2202 movs r2, #2
  35333. 802cd90: f7f5 fa7c bl 802228c <strncmp>
  35334. 802cd94: 2800 cmp r0, #0
  35335. 802cd96: d031 beq.n 802cdfc <HTTP_SetSettings+0x178>
  35336. {
  35337. memset(value, 0, len);
  35338. 802cd98: 4629 mov r1, r5
  35339. 802cd9a: 2240 movs r2, #64 ; 0x40
  35340. 802cd9c: a802 add r0, sp, #8
  35341. 802cd9e: f7f5 f83b bl 8021e18 <memset>
  35342. GetParamValue(buf, "ipaddr=", value, &valueLen);
  35343. 802cda2: f10d 0307 add.w r3, sp, #7
  35344. 802cda6: 497f ldr r1, [pc, #508] ; (802cfa4 <HTTP_SetSettings+0x320>)
  35345. 802cda8: aa02 add r2, sp, #8
  35346. 802cdaa: 4620 mov r0, r4
  35347. 802cdac: f7ff fd36 bl 802c81c <GetParamValue>
  35348. SetIPStr(value);
  35349. 802cdb0: a802 add r0, sp, #8
  35350. 802cdb2: f7fb fc11 bl 80285d8 <SetIPStr>
  35351. memset(value, 0, len);
  35352. 802cdb6: 4629 mov r1, r5
  35353. 802cdb8: 2240 movs r2, #64 ; 0x40
  35354. 802cdba: a802 add r0, sp, #8
  35355. 802cdbc: f7f5 f82c bl 8021e18 <memset>
  35356. GetParamValue(buf, "gw=", value, &valueLen);
  35357. 802cdc0: f10d 0307 add.w r3, sp, #7
  35358. 802cdc4: 4978 ldr r1, [pc, #480] ; (802cfa8 <HTTP_SetSettings+0x324>)
  35359. 802cdc6: aa02 add r2, sp, #8
  35360. 802cdc8: 4620 mov r0, r4
  35361. 802cdca: f7ff fd27 bl 802c81c <GetParamValue>
  35362. SetGatewayStr(value);
  35363. 802cdce: a802 add r0, sp, #8
  35364. 802cdd0: f7fb fc08 bl 80285e4 <SetGatewayStr>
  35365. memset(value, 0, len);
  35366. 802cdd4: 4629 mov r1, r5
  35367. 802cdd6: 2240 movs r2, #64 ; 0x40
  35368. 802cdd8: a802 add r0, sp, #8
  35369. 802cdda: f7f5 f81d bl 8021e18 <memset>
  35370. GetParamValue(buf, "mask=", value, &valueLen);
  35371. 802cdde: 4973 ldr r1, [pc, #460] ; (802cfac <HTTP_SetSettings+0x328>)
  35372. 802cde0: aa02 add r2, sp, #8
  35373. 802cde2: f10d 0307 add.w r3, sp, #7
  35374. 802cde6: 4620 mov r0, r4
  35375. 802cde8: f7ff fd18 bl 802c81c <GetParamValue>
  35376. SetMaskStr(value);
  35377. 802cdec: a802 add r0, sp, #8
  35378. 802cdee: f7fb fbff bl 80285f0 <SetMaskStr>
  35379. memset(value, 0, len);
  35380. 802cdf2: a802 add r0, sp, #8
  35381. 802cdf4: 4629 mov r1, r5
  35382. 802cdf6: 2240 movs r2, #64 ; 0x40
  35383. 802cdf8: f7f5 f80e bl 8021e18 <memset>
  35384. }
  35385. memset(value, 0, len);
  35386. 802cdfc: 2100 movs r1, #0
  35387. 802cdfe: 2240 movs r2, #64 ; 0x40
  35388. 802ce00: a802 add r0, sp, #8
  35389. 802ce02: f7f5 f809 bl 8021e18 <memset>
  35390. GetParamValue(buf, "swauth=", value, &valueLen);
  35391. 802ce06: 496a ldr r1, [pc, #424] ; (802cfb0 <HTTP_SetSettings+0x32c>)
  35392. 802ce08: aa02 add r2, sp, #8
  35393. 802ce0a: f10d 0307 add.w r3, sp, #7
  35394. 802ce0e: 4620 mov r0, r4
  35395. 802ce10: f7ff fd04 bl 802c81c <GetParamValue>
  35396. SetAuthEnableStateStr(value);
  35397. 802ce14: a802 add r0, sp, #8
  35398. 802ce16: f7fb fcab bl 8028770 <SetAuthEnableStateStr>
  35399. if (strncmp(value, "on", 2) == 0){
  35400. 802ce1a: 4961 ldr r1, [pc, #388] ; (802cfa0 <HTTP_SetSettings+0x31c>)
  35401. 802ce1c: a802 add r0, sp, #8
  35402. 802ce1e: 2202 movs r2, #2
  35403. 802ce20: f7f5 fa34 bl 802228c <strncmp>
  35404. 802ce24: 4601 mov r1, r0
  35405. 802ce26: 2800 cmp r0, #0
  35406. 802ce28: d156 bne.n 802ced8 <HTTP_SetSettings+0x254>
  35407. /* параметры RADIUS*/
  35408. memset(value, 0, len);
  35409. 802ce2a: 2240 movs r2, #64 ; 0x40
  35410. 802ce2c: a802 add r0, sp, #8
  35411. 802ce2e: f7f4 fff3 bl 8021e18 <memset>
  35412. GetParamValue(buf, "rs_enabled=", value, &valueLen);
  35413. 802ce32: 4960 ldr r1, [pc, #384] ; (802cfb4 <HTTP_SetSettings+0x330>)
  35414. 802ce34: aa02 add r2, sp, #8
  35415. 802ce36: f10d 0307 add.w r3, sp, #7
  35416. 802ce3a: 4620 mov r0, r4
  35417. 802ce3c: f7ff fcee bl 802c81c <GetParamValue>
  35418. SetRDSEnableStateStr(value);
  35419. 802ce40: a802 add r0, sp, #8
  35420. 802ce42: f7fb fc83 bl 802874c <SetRDSEnableStateStr>
  35421. if (strncmp(value, "on", 2) == 0) // Если raddius off устанавливаем параметры
  35422. 802ce46: a802 add r0, sp, #8
  35423. 802ce48: 4955 ldr r1, [pc, #340] ; (802cfa0 <HTTP_SetSettings+0x31c>)
  35424. 802ce4a: 2202 movs r2, #2
  35425. 802ce4c: f7f5 fa1e bl 802228c <strncmp>
  35426. 802ce50: 4605 mov r5, r0
  35427. 802ce52: 2800 cmp r0, #0
  35428. 802ce54: d140 bne.n 802ced8 <HTTP_SetSettings+0x254>
  35429. {
  35430. memset(value, 0, len);
  35431. 802ce56: 4629 mov r1, r5
  35432. 802ce58: 2240 movs r2, #64 ; 0x40
  35433. 802ce5a: a802 add r0, sp, #8
  35434. 802ce5c: f7f4 ffdc bl 8021e18 <memset>
  35435. GetParamValue(buf, "rs_server=", value, &valueLen);
  35436. 802ce60: f10d 0307 add.w r3, sp, #7
  35437. 802ce64: 4954 ldr r1, [pc, #336] ; (802cfb8 <HTTP_SetSettings+0x334>)
  35438. 802ce66: aa02 add r2, sp, #8
  35439. 802ce68: 4620 mov r0, r4
  35440. 802ce6a: f7ff fcd7 bl 802c81c <GetParamValue>
  35441. SetRDSIpStr(value);
  35442. 802ce6e: a802 add r0, sp, #8
  35443. 802ce70: f7fb fc4c bl 802870c <SetRDSIpStr>
  35444. memset(value, 0, len);
  35445. 802ce74: 4629 mov r1, r5
  35446. 802ce76: 2240 movs r2, #64 ; 0x40
  35447. 802ce78: a802 add r0, sp, #8
  35448. 802ce7a: f7f4 ffcd bl 8021e18 <memset>
  35449. GetParamValue(buf, "rs_port=", value, &valueLen);
  35450. 802ce7e: f10d 0307 add.w r3, sp, #7
  35451. 802ce82: 494e ldr r1, [pc, #312] ; (802cfbc <HTTP_SetSettings+0x338>)
  35452. 802ce84: aa02 add r2, sp, #8
  35453. 802ce86: 4620 mov r0, r4
  35454. 802ce88: f7ff fcc8 bl 802c81c <GetParamValue>
  35455. SetRDSPortStr(value);
  35456. 802ce8c: a802 add r0, sp, #8
  35457. 802ce8e: f7fb fc43 bl 8028718 <SetRDSPortStr>
  35458. memset(value, 0, len);
  35459. 802ce92: 4629 mov r1, r5
  35460. 802ce94: 2240 movs r2, #64 ; 0x40
  35461. 802ce96: a802 add r0, sp, #8
  35462. 802ce98: f7f4 ffbe bl 8021e18 <memset>
  35463. GetParamValue(buf, "rs_pwd=", value, &valueLen);
  35464. 802ce9c: f10d 0307 add.w r3, sp, #7
  35465. 802cea0: 4947 ldr r1, [pc, #284] ; (802cfc0 <HTTP_SetSettings+0x33c>)
  35466. 802cea2: aa02 add r2, sp, #8
  35467. 802cea4: 4620 mov r0, r4
  35468. 802cea6: f7ff fcb9 bl 802c81c <GetParamValue>
  35469. SetRDSPasswordkStr(value);
  35470. 802ceaa: a802 add r0, sp, #8
  35471. 802ceac: f7fb fc48 bl 8028740 <SetRDSPasswordkStr>
  35472. memset(value, 0, len);
  35473. 802ceb0: 4629 mov r1, r5
  35474. 802ceb2: 2240 movs r2, #64 ; 0x40
  35475. 802ceb4: a802 add r0, sp, #8
  35476. 802ceb6: f7f4 ffaf bl 8021e18 <memset>
  35477. GetParamValue(buf, "rs_key=", value, &valueLen);
  35478. 802ceba: 4942 ldr r1, [pc, #264] ; (802cfc4 <HTTP_SetSettings+0x340>)
  35479. 802cebc: aa02 add r2, sp, #8
  35480. 802cebe: f10d 0307 add.w r3, sp, #7
  35481. 802cec2: 4620 mov r0, r4
  35482. 802cec4: f7ff fcaa bl 802c81c <GetParamValue>
  35483. SetRDSKeyAccesstStr(value);
  35484. 802cec8: a802 add r0, sp, #8
  35485. 802ceca: f7fb fc2f bl 802872c <SetRDSKeyAccesstStr>
  35486. memset(value, 0, len);
  35487. 802cece: a802 add r0, sp, #8
  35488. 802ced0: 4629 mov r1, r5
  35489. 802ced2: 2240 movs r2, #64 ; 0x40
  35490. 802ced4: f7f4 ffa0 bl 8021e18 <memset>
  35491. }
  35492. }
  35493. memset(value, 0, len);
  35494. 802ced8: 2100 movs r1, #0
  35495. 802ceda: 2240 movs r2, #64 ; 0x40
  35496. 802cedc: a802 add r0, sp, #8
  35497. 802cede: f7f4 ff9b bl 8021e18 <memset>
  35498. // Параметры реле и сухих контактов
  35499. GetParamValue(buf, "di1=", value, &valueLen);
  35500. 802cee2: f10d 0307 add.w r3, sp, #7
  35501. 802cee6: aa02 add r2, sp, #8
  35502. 802cee8: 4937 ldr r1, [pc, #220] ; (802cfc8 <HTTP_SetSettings+0x344>)
  35503. 802ceea: 4620 mov r0, r4
  35504. 802ceec: f7ff fc96 bl 802c81c <GetParamValue>
  35505. SetDINTypeActStr(value, 0);
  35506. 802cef0: a802 add r0, sp, #8
  35507. 802cef2: 2100 movs r1, #0
  35508. 802cef4: f7fb fd32 bl 802895c <SetDINTypeActStr>
  35509. memset(value, 0, len);
  35510. 802cef8: 2100 movs r1, #0
  35511. 802cefa: 2240 movs r2, #64 ; 0x40
  35512. 802cefc: a802 add r0, sp, #8
  35513. 802cefe: f7f4 ff8b bl 8021e18 <memset>
  35514. GetParamValue(buf, "ro1=", value, &valueLen);
  35515. 802cf02: f10d 0307 add.w r3, sp, #7
  35516. 802cf06: aa02 add r2, sp, #8
  35517. 802cf08: 4930 ldr r1, [pc, #192] ; (802cfcc <HTTP_SetSettings+0x348>)
  35518. 802cf0a: 4620 mov r0, r4
  35519. 802cf0c: f7ff fc86 bl 802c81c <GetParamValue>
  35520. SetROTypeActStr(value, 0);
  35521. 802cf10: a802 add r0, sp, #8
  35522. 802cf12: 2100 movs r1, #0
  35523. 802cf14: f7fb fd40 bl 8028998 <SetROTypeActStr>
  35524. memset(value, 0, len);
  35525. 802cf18: 2100 movs r1, #0
  35526. 802cf1a: 2240 movs r2, #64 ; 0x40
  35527. 802cf1c: a802 add r0, sp, #8
  35528. 802cf1e: f7f4 ff7b bl 8021e18 <memset>
  35529. GetParamValue(buf, "ro2=", value, &valueLen);
  35530. 802cf22: f10d 0307 add.w r3, sp, #7
  35531. 802cf26: aa02 add r2, sp, #8
  35532. 802cf28: 4929 ldr r1, [pc, #164] ; (802cfd0 <HTTP_SetSettings+0x34c>)
  35533. 802cf2a: 4620 mov r0, r4
  35534. 802cf2c: f7ff fc76 bl 802c81c <GetParamValue>
  35535. SetROTypeActStr(value, 1);
  35536. 802cf30: a802 add r0, sp, #8
  35537. 802cf32: 2101 movs r1, #1
  35538. 802cf34: f7fb fd30 bl 8028998 <SetROTypeActStr>
  35539. memset(value, 0, len);
  35540. 802cf38: 2100 movs r1, #0
  35541. 802cf3a: 2240 movs r2, #64 ; 0x40
  35542. 802cf3c: a802 add r0, sp, #8
  35543. 802cf3e: f7f4 ff6b bl 8021e18 <memset>
  35544. // Параметры даты и времени
  35545. GetParamValue(buf, "ntp=", value, &valueLen);
  35546. 802cf42: 4924 ldr r1, [pc, #144] ; (802cfd4 <HTTP_SetSettings+0x350>)
  35547. 802cf44: aa02 add r2, sp, #8
  35548. 802cf46: f10d 0307 add.w r3, sp, #7
  35549. 802cf4a: 4620 mov r0, r4
  35550. 802cf4c: f7ff fc66 bl 802c81c <GetParamValue>
  35551. SetSntpStateStr(value);
  35552. 802cf50: a802 add r0, sp, #8
  35553. 802cf52: f7fb fc87 bl 8028864 <SetSntpStateStr>
  35554. if (strncmp(value, "1", 1) == 0) // Если ntp on устанавливаем параметры
  35555. 802cf56: a802 add r0, sp, #8
  35556. 802cf58: 491f ldr r1, [pc, #124] ; (802cfd8 <HTTP_SetSettings+0x354>)
  35557. 802cf5a: 2201 movs r2, #1
  35558. 802cf5c: f7f5 f996 bl 802228c <strncmp>
  35559. 802cf60: 4605 mov r5, r0
  35560. {
  35561. memset(value, 0, len);
  35562. 802cf62: a802 add r0, sp, #8
  35563. // Параметры даты и времени
  35564. GetParamValue(buf, "ntp=", value, &valueLen);
  35565. SetSntpStateStr(value);
  35566. if (strncmp(value, "1", 1) == 0) // Если ntp on устанавливаем параметры
  35567. 802cf64: 2d00 cmp r5, #0
  35568. 802cf66: d13f bne.n 802cfe8 <HTTP_SetSettings+0x364>
  35569. {
  35570. memset(value, 0, len);
  35571. 802cf68: 4629 mov r1, r5
  35572. 802cf6a: 2240 movs r2, #64 ; 0x40
  35573. 802cf6c: f7f4 ff54 bl 8021e18 <memset>
  35574. GetParamValue(buf, "ntpservip=", value, &valueLen);
  35575. 802cf70: 4620 mov r0, r4
  35576. 802cf72: 491a ldr r1, [pc, #104] ; (802cfdc <HTTP_SetSettings+0x358>)
  35577. 802cf74: aa02 add r2, sp, #8
  35578. 802cf76: f10d 0307 add.w r3, sp, #7
  35579. 802cf7a: f7ff fc4f bl 802c81c <GetParamValue>
  35580. 802cf7e: e02f b.n 802cfe0 <HTTP_SetSettings+0x35c>
  35581. 802cf80: 080401af .word 0x080401af
  35582. 802cf84: 080401bf .word 0x080401bf
  35583. 802cf88: 080401d0 .word 0x080401d0
  35584. 802cf8c: 080401db .word 0x080401db
  35585. 802cf90: 080401e7 .word 0x080401e7
  35586. 802cf94: 080401f3 .word 0x080401f3
  35587. 802cf98: 080401ff .word 0x080401ff
  35588. 802cf9c: 0804020b .word 0x0804020b
  35589. 802cfa0: 080391b1 .word 0x080391b1
  35590. 802cfa4: 08040211 .word 0x08040211
  35591. 802cfa8: 08040219 .word 0x08040219
  35592. 802cfac: 0804021d .word 0x0804021d
  35593. 802cfb0: 08040223 .word 0x08040223
  35594. 802cfb4: 0804022b .word 0x0804022b
  35595. 802cfb8: 08040237 .word 0x08040237
  35596. 802cfbc: 08040242 .word 0x08040242
  35597. 802cfc0: 0804024b .word 0x0804024b
  35598. 802cfc4: 08040253 .word 0x08040253
  35599. 802cfc8: 0804025b .word 0x0804025b
  35600. 802cfcc: 08040260 .word 0x08040260
  35601. 802cfd0: 08040265 .word 0x08040265
  35602. 802cfd4: 0804026a .word 0x0804026a
  35603. 802cfd8: 080394a7 .word 0x080394a7
  35604. 802cfdc: 0804026f .word 0x0804026f
  35605. SetSntpServerIpStr(value);
  35606. 802cfe0: a802 add r0, sp, #8
  35607. 802cfe2: f7fb fc5f bl 80288a4 <SetSntpServerIpStr>
  35608. 802cfe6: e023 b.n 802d030 <HTTP_SetSettings+0x3ac>
  35609. memset(value, 0, len);
  35610. }
  35611. else if (strncmp(value, "0", 1) == 0){
  35612. 802cfe8: 4924 ldr r1, [pc, #144] ; (802d07c <HTTP_SetSettings+0x3f8>)
  35613. 802cfea: 2201 movs r2, #1
  35614. 802cfec: f7f5 f94e bl 802228c <strncmp>
  35615. 802cff0: 4605 mov r5, r0
  35616. 802cff2: bb10 cbnz r0, 802d03a <HTTP_SetSettings+0x3b6>
  35617. GetParamValue(buf, "date=", value, &valueLen);
  35618. 802cff4: f10d 0307 add.w r3, sp, #7
  35619. 802cff8: 4921 ldr r1, [pc, #132] ; (802d080 <HTTP_SetSettings+0x3fc>)
  35620. 802cffa: aa02 add r2, sp, #8
  35621. 802cffc: 4620 mov r0, r4
  35622. 802cffe: f7ff fc0d bl 802c81c <GetParamValue>
  35623. SetDateStr(value);
  35624. 802d002: a802 add r0, sp, #8
  35625. 802d004: f7fb fbc6 bl 8028794 <SetDateStr>
  35626. memset(value, 0, len);
  35627. 802d008: 4629 mov r1, r5
  35628. 802d00a: 2240 movs r2, #64 ; 0x40
  35629. 802d00c: a802 add r0, sp, #8
  35630. 802d00e: f7f4 ff03 bl 8021e18 <memset>
  35631. GetParamValue(buf, "time=", value, &valueLen);
  35632. 802d012: 491c ldr r1, [pc, #112] ; (802d084 <HTTP_SetSettings+0x400>)
  35633. 802d014: aa02 add r2, sp, #8
  35634. 802d016: f10d 0307 add.w r3, sp, #7
  35635. 802d01a: 4620 mov r0, r4
  35636. 802d01c: f7ff fbfe bl 802c81c <GetParamValue>
  35637. url_decode(str, sizeof(str), value);
  35638. 802d020: a812 add r0, sp, #72 ; 0x48
  35639. 802d022: 2140 movs r1, #64 ; 0x40
  35640. 802d024: aa02 add r2, sp, #8
  35641. 802d026: f7fc fc93 bl 8029950 <url_decode>
  35642. SetTimeStr(str);
  35643. 802d02a: a812 add r0, sp, #72 ; 0x48
  35644. 802d02c: f7fb fbea bl 8028804 <SetTimeStr>
  35645. memset(value, 0, len);
  35646. 802d030: a802 add r0, sp, #8
  35647. 802d032: 4629 mov r1, r5
  35648. 802d034: 2240 movs r2, #64 ; 0x40
  35649. 802d036: f7f4 feef bl 8021e18 <memset>
  35650. }
  35651. GetParamValue(buf, "utc=", value, &valueLen);
  35652. 802d03a: 4913 ldr r1, [pc, #76] ; (802d088 <HTTP_SetSettings+0x404>)
  35653. 802d03c: aa02 add r2, sp, #8
  35654. 802d03e: f10d 0307 add.w r3, sp, #7
  35655. 802d042: 4620 mov r0, r4
  35656. 802d044: f7ff fbea bl 802c81c <GetParamValue>
  35657. SetSntpTimeZoneStr(value);
  35658. 802d048: a802 add r0, sp, #8
  35659. 802d04a: f7fb fc31 bl 80288b0 <SetSntpTimeZoneStr>
  35660. memset(value, 0, len);
  35661. 802d04e: 2100 movs r1, #0
  35662. 802d050: 2240 movs r2, #64 ; 0x40
  35663. 802d052: a802 add r0, sp, #8
  35664. 802d054: f7f4 fee0 bl 8021e18 <memset>
  35665. /* Если параметры WEB изменились выставляем флаг, сохраняем настройки и перезагружаемся */
  35666. if (GetStateWebReinit() == true)
  35667. 802d058: f00a fc74 bl 8037944 <GetStateWebReinit>
  35668. 802d05c: b150 cbz r0, 802d074 <HTTP_SetSettings+0x3f0>
  35669. {
  35670. SetWebReinitFlag(true);
  35671. 802d05e: 2001 movs r0, #1
  35672. 802d060: f7fb faae bl 80285c0 <SetWebReinitFlag>
  35673. HTTP_SaveSettings();
  35674. 802d064: f001 fc00 bl 802e868 <HTTP_SaveSettings>
  35675. /* Блокируем управление ключем на тау секунд*/
  35676. //IO_KeyBlockOn();
  35677. vTaskDelay(1010);
  35678. 802d068: f240 30f2 movw r0, #1010 ; 0x3f2
  35679. 802d06c: f7fe fd20 bl 802bab0 <vTaskDelay>
  35680. Reboot();
  35681. 802d070: f7fc fbfe bl 8029870 <Reboot>
  35682. }
  35683. HTTP_SaveSettings();
  35684. 802d074: f001 fbf8 bl 802e868 <HTTP_SaveSettings>
  35685. }
  35686. 802d078: b023 add sp, #140 ; 0x8c
  35687. 802d07a: bd30 pop {r4, r5, pc}
  35688. 802d07c: 0803921b .word 0x0803921b
  35689. 802d080: 0804028d .word 0x0804028d
  35690. 802d084: 0804027a .word 0x0804027a
  35691. 802d088: 08040280 .word 0x08040280
  35692. 0802d08c <GetCookieValue>:
  35693. /**
  35694. * @brief
  35695. * @retval None
  35696. */
  35697. uint8_t GetCookieValue(char *inStr, char *paramName, char *paramValue, uint8_t *paramLen)
  35698. {
  35699. 802d08c: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  35700. 802d090: 4690 mov r8, r2
  35701. 802d092: 461f mov r7, r3
  35702. char *beginValue = 0;
  35703. char *endValue = 0;
  35704. int len = 0;
  35705. char *strPtr = 0;
  35706. strPtr = strstr(inStr, paramName);
  35707. 802d094: f7f5 fb18 bl 80226c8 <strstr>
  35708. if (strPtr != 0)
  35709. 802d098: 4605 mov r5, r0
  35710. 802d09a: b1e0 cbz r0, 802d0d6 <GetCookieValue+0x4a>
  35711. {
  35712. beginValue = strpbrk(strPtr,"=");
  35713. 802d09c: 490f ldr r1, [pc, #60] ; (802d0dc <GetCookieValue+0x50>)
  35714. 802d09e: f7f5 f97d bl 802239c <strpbrk>
  35715. endValue = strpbrk(strPtr,";");
  35716. 802d0a2: 490f ldr r1, [pc, #60] ; (802d0e0 <GetCookieValue+0x54>)
  35717. strPtr = strstr(inStr, paramName);
  35718. if (strPtr != 0)
  35719. {
  35720. beginValue = strpbrk(strPtr,"=");
  35721. 802d0a4: 4606 mov r6, r0
  35722. endValue = strpbrk(strPtr,";");
  35723. 802d0a6: 4628 mov r0, r5
  35724. 802d0a8: f7f5 f978 bl 802239c <strpbrk>
  35725. if (endValue == 0)
  35726. 802d0ac: 4604 mov r4, r0
  35727. 802d0ae: b920 cbnz r0, 802d0ba <GetCookieValue+0x2e>
  35728. endValue = strpbrk(strPtr,"\n");
  35729. 802d0b0: 4628 mov r0, r5
  35730. 802d0b2: 490c ldr r1, [pc, #48] ; (802d0e4 <GetCookieValue+0x58>)
  35731. 802d0b4: f7f5 f972 bl 802239c <strpbrk>
  35732. 802d0b8: 4604 mov r4, r0
  35733. len = endValue - beginValue - 1;
  35734. 802d0ba: 1ba5 subs r5, r4, r6
  35735. 802d0bc: 3d01 subs r5, #1
  35736. strncpy(paramValue, beginValue + 1, len);
  35737. 802d0be: 4640 mov r0, r8
  35738. 802d0c0: 1c71 adds r1, r6, #1
  35739. 802d0c2: 462a mov r2, r5
  35740. 802d0c4: f7f5 f938 bl 8022338 <strncpy>
  35741. *endValue = '0';
  35742. 802d0c8: 2330 movs r3, #48 ; 0x30
  35743. 802d0ca: 7023 strb r3, [r4, #0]
  35744. *beginValue = '0';
  35745. *paramLen = len;
  35746. return 1;
  35747. 802d0cc: 2001 movs r0, #1
  35748. if (endValue == 0)
  35749. endValue = strpbrk(strPtr,"\n");
  35750. len = endValue - beginValue - 1;
  35751. strncpy(paramValue, beginValue + 1, len);
  35752. *endValue = '0';
  35753. *beginValue = '0';
  35754. 802d0ce: 7033 strb r3, [r6, #0]
  35755. *paramLen = len;
  35756. 802d0d0: 703d strb r5, [r7, #0]
  35757. return 1;
  35758. 802d0d2: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  35759. }
  35760. else
  35761. {
  35762. *paramLen = 0;
  35763. 802d0d6: 7038 strb r0, [r7, #0]
  35764. return 0;
  35765. }
  35766. }
  35767. 802d0d8: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  35768. 802d0dc: 0804025e .word 0x0804025e
  35769. 802d0e0: 08039372 .word 0x08039372
  35770. 802d0e4: 080405c0 .word 0x080405c0
  35771. 0802d0e8 <ClearParamString>:
  35772. }
  35773. }
  35774. */
  35775. void ClearParamString(char *inBuf)
  35776. {
  35777. 802d0e8: b510 push {r4, lr}
  35778. uint16_t len;
  35779. char *str;
  35780. str = strstr(inBuf, "HTTP");
  35781. 802d0ea: 4908 ldr r1, [pc, #32] ; (802d10c <ClearParamString+0x24>)
  35782. }
  35783. }
  35784. */
  35785. void ClearParamString(char *inBuf)
  35786. {
  35787. 802d0ec: 4604 mov r4, r0
  35788. uint16_t len;
  35789. char *str;
  35790. str = strstr(inBuf, "HTTP");
  35791. 802d0ee: f7f5 faeb bl 80226c8 <strstr>
  35792. if (str != 0)
  35793. 802d0f2: b148 cbz r0, 802d108 <ClearParamString+0x20>
  35794. {
  35795. len = str - inBuf;
  35796. 802d0f4: 1b02 subs r2, r0, r4
  35797. memset(str, 0, RECIVE_BUF_MAX_LEN - len - 1);
  35798. 802d0f6: b292 uxth r2, r2
  35799. 802d0f8: f5c2 62bb rsb r2, r2, #1496 ; 0x5d8
  35800. 802d0fc: 2100 movs r1, #0
  35801. 802d0fe: 3203 adds r2, #3
  35802. }
  35803. }
  35804. 802d100: e8bd 4010 ldmia.w sp!, {r4, lr}
  35805. str = strstr(inBuf, "HTTP");
  35806. if (str != 0)
  35807. {
  35808. len = str - inBuf;
  35809. memset(str, 0, RECIVE_BUF_MAX_LEN - len - 1);
  35810. 802d104: f7f4 be88 b.w 8021e18 <memset>
  35811. 802d108: bd10 pop {r4, pc}
  35812. 802d10a: bf00 nop
  35813. 802d10c: 08040285 .word 0x08040285
  35814. 0802d110 <HTTP_Prodate>:
  35815. /**
  35816. * @brief Установка даты производства
  35817. */
  35818. // TODO Убрать заглушку!
  35819. void HTTP_Prodate(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  35820. {
  35821. 802d110: b5f0 push {r4, r5, r6, r7, lr}
  35822. uint8_t valueLen = 0;
  35823. 802d112: 2500 movs r5, #0
  35824. /**
  35825. * @brief Установка даты производства
  35826. */
  35827. // TODO Убрать заглушку!
  35828. void HTTP_Prodate(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  35829. {
  35830. 802d114: b087 sub sp, #28
  35831. 802d116: 4606 mov r6, r0
  35832. 802d118: 460c mov r4, r1
  35833. uint8_t valueLen = 0;
  35834. char value[20];
  35835. memset(bufOut, 0, SEND_BUF_MAX_LEN);
  35836. 802d11a: f44f 62fa mov.w r2, #2000 ; 0x7d0
  35837. 802d11e: 4608 mov r0, r1
  35838. 802d120: 4629 mov r1, r5
  35839. /**
  35840. * @brief Установка даты производства
  35841. */
  35842. // TODO Убрать заглушку!
  35843. void HTTP_Prodate(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  35844. {
  35845. 802d122: 461f mov r7, r3
  35846. uint8_t valueLen = 0;
  35847. 802d124: f88d 5003 strb.w r5, [sp, #3]
  35848. char value[20];
  35849. memset(bufOut, 0, SEND_BUF_MAX_LEN);
  35850. 802d128: f7f4 fe76 bl 8021e18 <memset>
  35851. ClearParamString(bufIn);
  35852. 802d12c: 4630 mov r0, r6
  35853. 802d12e: f7ff ffdb bl 802d0e8 <ClearParamString>
  35854. memset(value, 0, 20);
  35855. 802d132: 4629 mov r1, r5
  35856. 802d134: 2214 movs r2, #20
  35857. 802d136: a801 add r0, sp, #4
  35858. 802d138: f7f4 fe6e bl 8021e18 <memset>
  35859. GetParamValue(bufIn, "prodate=", value, &valueLen);
  35860. 802d13c: aa01 add r2, sp, #4
  35861. 802d13e: f10d 0303 add.w r3, sp, #3
  35862. 802d142: 490b ldr r1, [pc, #44] ; (802d170 <HTTP_Prodate+0x60>)
  35863. 802d144: 4630 mov r0, r6
  35864. 802d146: f7ff fb69 bl 802c81c <GetParamValue>
  35865. printf(value);
  35866. printf("\r\n");
  35867. */
  35868. /* Устанавливаем дату производства */
  35869. SETTINGS_SetProDate(value, valueLen);
  35870. 802d14a: f89d 1003 ldrb.w r1, [sp, #3]
  35871. 802d14e: a801 add r0, sp, #4
  35872. 802d150: f7fb fea0 bl 8028e94 <SETTINGS_SetProDate>
  35873. /* Устанавливаем дату следующей профилактики +1 год */
  35874. RTC_SetProfTime(value);
  35875. 802d154: a801 add r0, sp, #4
  35876. 802d156: f7f9 fcd3 bl 8026b00 <RTC_SetProfTime>
  35877. /* Пока отправляем true */
  35878. strcpy(bufOut, "HTTP/1.0 200 OK\r\nContent-Type:text/html\r\n\r\nTrue");
  35879. 802d15a: 4906 ldr r1, [pc, #24] ; (802d174 <HTTP_Prodate+0x64>)
  35880. 802d15c: 4620 mov r0, r4
  35881. 802d15e: f7f4 ffd5 bl 802210c <strcpy>
  35882. *lenBufOut = strlen(bufOut);
  35883. 802d162: 4620 mov r0, r4
  35884. 802d164: f7f5 f830 bl 80221c8 <strlen>
  35885. 802d168: 8038 strh r0, [r7, #0]
  35886. // TEST_SetServerFlag();
  35887. }
  35888. 802d16a: b007 add sp, #28
  35889. 802d16c: bdf0 pop {r4, r5, r6, r7, pc}
  35890. 802d16e: bf00 nop
  35891. 802d170: 0804028a .word 0x0804028a
  35892. 802d174: 08040293 .word 0x08040293
  35893. 0802d178 <HTTP_UpsHistoryPage>:
  35894. }
  35895. }
  35896. }
  35897. int HTTP_UpsHistoryPage(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  35898. {
  35899. 802d178: b5f0 push {r4, r5, r6, r7, lr}
  35900. uint8_t i, valueLen = 0;
  35901. 802d17a: 2500 movs r5, #0
  35902. }
  35903. }
  35904. }
  35905. int HTTP_UpsHistoryPage(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  35906. {
  35907. 802d17c: b087 sub sp, #28
  35908. 802d17e: 4607 mov r7, r0
  35909. char value[20];
  35910. uint32_t nbytes = 0;
  35911. (void)lenBufIn;
  35912. memset(bufOut, 0, FILE_BUF_MAX_LEN);
  35913. 802d180: f44f 727a mov.w r2, #1000 ; 0x3e8
  35914. 802d184: 4608 mov r0, r1
  35915. }
  35916. }
  35917. }
  35918. int HTTP_UpsHistoryPage(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  35919. {
  35920. 802d186: 460c mov r4, r1
  35921. char value[20];
  35922. uint32_t nbytes = 0;
  35923. (void)lenBufIn;
  35924. memset(bufOut, 0, FILE_BUF_MAX_LEN);
  35925. 802d188: 4629 mov r1, r5
  35926. }
  35927. }
  35928. }
  35929. int HTTP_UpsHistoryPage(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  35930. {
  35931. 802d18a: 461e mov r6, r3
  35932. uint8_t i, valueLen = 0;
  35933. 802d18c: f88d 5003 strb.w r5, [sp, #3]
  35934. char value[20];
  35935. uint32_t nbytes = 0;
  35936. (void)lenBufIn;
  35937. memset(bufOut, 0, FILE_BUF_MAX_LEN);
  35938. 802d190: f7f4 fe42 bl 8021e18 <memset>
  35939. ClearParamString(bufIn);
  35940. 802d194: 4638 mov r0, r7
  35941. 802d196: f7ff ffa7 bl 802d0e8 <ClearParamString>
  35942. memset(value, 0, 20);
  35943. 802d19a: 4629 mov r1, r5
  35944. 802d19c: 2214 movs r2, #20
  35945. 802d19e: a801 add r0, sp, #4
  35946. 802d1a0: f7f4 fe3a bl 8021e18 <memset>
  35947. GetParamValue(bufIn, "page=", value, &valueLen);
  35948. 802d1a4: 491d ldr r1, [pc, #116] ; (802d21c <HTTP_UpsHistoryPage+0xa4>)
  35949. 802d1a6: 4638 mov r0, r7
  35950. 802d1a8: aa01 add r2, sp, #4
  35951. 802d1aa: f10d 0303 add.w r3, sp, #3
  35952. 802d1ae: f7ff fb35 bl 802c81c <GetParamValue>
  35953. if (strcmp(value, "all") == 0)
  35954. 802d1b2: a801 add r0, sp, #4
  35955. 802d1b4: 491a ldr r1, [pc, #104] ; (802d220 <HTTP_UpsHistoryPage+0xa8>)
  35956. 802d1b6: f7f4 febb bl 8021f30 <strcmp>
  35957. 802d1ba: b9e8 cbnz r0, 802d1f8 <HTTP_UpsHistoryPage+0x80>
  35958. {
  35959. if (!LOG_IsInit()) {
  35960. 802d1bc: f7fd f898 bl 802a2f0 <LOG_IsInit>
  35961. 802d1c0: b908 cbnz r0, 802d1c6 <HTTP_UpsHistoryPage+0x4e>
  35962. return SEND_REQUIRED_NO;
  35963. 802d1c2: 2001 movs r0, #1
  35964. 802d1c4: e028 b.n 802d218 <HTTP_UpsHistoryPage+0xa0>
  35965. }
  35966. if (fLogTransInprog == false) {
  35967. 802d1c6: 4d17 ldr r5, [pc, #92] ; (802d224 <HTTP_UpsHistoryPage+0xac>)
  35968. 802d1c8: 782b ldrb r3, [r5, #0]
  35969. 802d1ca: 2b00 cmp r3, #0
  35970. 802d1cc: d1f9 bne.n 802d1c2 <HTTP_UpsHistoryPage+0x4a>
  35971. // Send log as raw data
  35972. log_ptr = 0;
  35973. 802d1ce: 4a16 ldr r2, [pc, #88] ; (802d228 <HTTP_UpsHistoryPage+0xb0>)
  35974. 802d1d0: 6013 str r3, [r2, #0]
  35975. log_size = LOG_GetTotalSTRCount() * STRING_SIZE + sizeof(UTF8_BOM)-1;
  35976. 802d1d2: f7fd f89f bl 802a314 <LOG_GetTotalSTRCount>
  35977. 802d1d6: 4b15 ldr r3, [pc, #84] ; (802d22c <HTTP_UpsHistoryPage+0xb4>)
  35978. sprintf(bufOut, "HTTP/1.1 200 OK\r\nContent-Length:%lu\r\n\r\n%s", log_size, UTF8_BOM);
  35979. 802d1d8: 4915 ldr r1, [pc, #84] ; (802d230 <HTTP_UpsHistoryPage+0xb8>)
  35980. if (fLogTransInprog == false) {
  35981. // Send log as raw data
  35982. log_ptr = 0;
  35983. log_size = LOG_GetTotalSTRCount() * STRING_SIZE + sizeof(UTF8_BOM)-1;
  35984. 802d1da: 0180 lsls r0, r0, #6
  35985. 802d1dc: 1cc2 adds r2, r0, #3
  35986. 802d1de: 601a str r2, [r3, #0]
  35987. sprintf(bufOut, "HTTP/1.1 200 OK\r\nContent-Length:%lu\r\n\r\n%s", log_size, UTF8_BOM);
  35988. 802d1e0: 4620 mov r0, r4
  35989. 802d1e2: 4b14 ldr r3, [pc, #80] ; (802d234 <HTTP_UpsHistoryPage+0xbc>)
  35990. 802d1e4: f7fa fd80 bl 8027ce8 <tfp_sprintf>
  35991. *lenBufOut = strlen(bufOut);
  35992. 802d1e8: 4620 mov r0, r4
  35993. 802d1ea: f7f4 ffed bl 80221c8 <strlen>
  35994. // Set file transfer in progress flag
  35995. fLogTransInprog = true;
  35996. 802d1ee: 2301 movs r3, #1
  35997. log_ptr = 0;
  35998. log_size = LOG_GetTotalSTRCount() * STRING_SIZE + sizeof(UTF8_BOM)-1;
  35999. sprintf(bufOut, "HTTP/1.1 200 OK\r\nContent-Length:%lu\r\n\r\n%s", log_size, UTF8_BOM);
  36000. *lenBufOut = strlen(bufOut);
  36001. 802d1f0: 8030 strh r0, [r6, #0]
  36002. // Set file transfer in progress flag
  36003. fLogTransInprog = true;
  36004. 802d1f2: 702b strb r3, [r5, #0]
  36005. return SEND_REQUIRED_FILE;
  36006. 802d1f4: 2002 movs r0, #2
  36007. 802d1f6: e00f b.n 802d218 <HTTP_UpsHistoryPage+0xa0>
  36008. // We send nothing if file transfer already in progress
  36009. return SEND_REQUIRED_NO;
  36010. }
  36011. }
  36012. else {
  36013. if (!LOG_IsInit()) {
  36014. 802d1f8: f7fd f87a bl 802a2f0 <LOG_IsInit>
  36015. 802d1fc: 2800 cmp r0, #0
  36016. 802d1fe: d0e0 beq.n 802d1c2 <HTTP_UpsHistoryPage+0x4a>
  36017. return SEND_REQUIRED_NO;
  36018. }
  36019. else {
  36020. HTTP_GetUpsHistoryPage(bufOut, atoi(value));
  36021. 802d200: a801 add r0, sp, #4
  36022. 802d202: f7f4 fce9 bl 8021bd8 <atoi>
  36023. 802d206: 4601 mov r1, r0
  36024. 802d208: 4620 mov r0, r4
  36025. 802d20a: f001 fab7 bl 802e77c <HTTP_GetUpsHistoryPage>
  36026. *lenBufOut = strlen(bufOut);
  36027. 802d20e: 4620 mov r0, r4
  36028. 802d210: f7f4 ffda bl 80221c8 <strlen>
  36029. 802d214: 8030 strh r0, [r6, #0]
  36030. return SEND_REQUIRED_YES;
  36031. 802d216: 4628 mov r0, r5
  36032. }
  36033. }
  36034. }
  36035. 802d218: b007 add sp, #28
  36036. 802d21a: bdf0 pop {r4, r5, r6, r7, pc}
  36037. 802d21c: 080402c3 .word 0x080402c3
  36038. 802d220: 080402c9 .word 0x080402c9
  36039. 802d224: 20000d6c .word 0x20000d6c
  36040. 802d228: 20000d60 .word 0x20000d60
  36041. 802d22c: 20000d78 .word 0x20000d78
  36042. 802d230: 080402cd .word 0x080402cd
  36043. 802d234: 0803b85c .word 0x0803b85c
  36044. 0802d238 <HTTP_HistoryPage>:
  36045. */
  36046. }
  36047. }
  36048. int HTTP_HistoryPage(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  36049. {
  36050. 802d238: b5f0 push {r4, r5, r6, r7, lr}
  36051. uint8_t i, valueLen = 0;
  36052. 802d23a: 2500 movs r5, #0
  36053. */
  36054. }
  36055. }
  36056. int HTTP_HistoryPage(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  36057. {
  36058. 802d23c: b087 sub sp, #28
  36059. 802d23e: 4607 mov r7, r0
  36060. char value[20];
  36061. uint32_t nbytes = 0;
  36062. (void)lenBufIn;
  36063. memset(bufOut, 0, FILE_BUF_MAX_LEN);
  36064. 802d240: f44f 727a mov.w r2, #1000 ; 0x3e8
  36065. 802d244: 4608 mov r0, r1
  36066. */
  36067. }
  36068. }
  36069. int HTTP_HistoryPage(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  36070. {
  36071. 802d246: 460c mov r4, r1
  36072. char value[20];
  36073. uint32_t nbytes = 0;
  36074. (void)lenBufIn;
  36075. memset(bufOut, 0, FILE_BUF_MAX_LEN);
  36076. 802d248: 4629 mov r1, r5
  36077. */
  36078. }
  36079. }
  36080. int HTTP_HistoryPage(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  36081. {
  36082. 802d24a: 461e mov r6, r3
  36083. uint8_t i, valueLen = 0;
  36084. 802d24c: f88d 5003 strb.w r5, [sp, #3]
  36085. char value[20];
  36086. uint32_t nbytes = 0;
  36087. (void)lenBufIn;
  36088. memset(bufOut, 0, FILE_BUF_MAX_LEN);
  36089. 802d250: f7f4 fde2 bl 8021e18 <memset>
  36090. ClearParamString(bufIn);
  36091. 802d254: 4638 mov r0, r7
  36092. 802d256: f7ff ff47 bl 802d0e8 <ClearParamString>
  36093. memset(value, 0, 20);
  36094. 802d25a: 4629 mov r1, r5
  36095. 802d25c: 2214 movs r2, #20
  36096. 802d25e: a801 add r0, sp, #4
  36097. 802d260: f7f4 fdda bl 8021e18 <memset>
  36098. GetParamValue(bufIn, "page=", value, &valueLen);
  36099. 802d264: 491e ldr r1, [pc, #120] ; (802d2e0 <HTTP_HistoryPage+0xa8>)
  36100. 802d266: 4638 mov r0, r7
  36101. 802d268: aa01 add r2, sp, #4
  36102. 802d26a: f10d 0303 add.w r3, sp, #3
  36103. 802d26e: f7ff fad5 bl 802c81c <GetParamValue>
  36104. if (strcmp(value, "all") == 0)
  36105. 802d272: a801 add r0, sp, #4
  36106. 802d274: 491b ldr r1, [pc, #108] ; (802d2e4 <HTTP_HistoryPage+0xac>)
  36107. 802d276: f7f4 fe5b bl 8021f30 <strcmp>
  36108. 802d27a: b9f0 cbnz r0, 802d2ba <HTTP_HistoryPage+0x82>
  36109. {
  36110. if (!LOG_IsInit()) {
  36111. 802d27c: f7fd f838 bl 802a2f0 <LOG_IsInit>
  36112. 802d280: b908 cbnz r0, 802d286 <HTTP_HistoryPage+0x4e>
  36113. return SEND_REQUIRED_NO;
  36114. 802d282: 2001 movs r0, #1
  36115. 802d284: e029 b.n 802d2da <HTTP_HistoryPage+0xa2>
  36116. }
  36117. if (fLogTransInprog == false) {
  36118. 802d286: 4d18 ldr r5, [pc, #96] ; (802d2e8 <HTTP_HistoryPage+0xb0>)
  36119. 802d288: 782b ldrb r3, [r5, #0]
  36120. 802d28a: 2b00 cmp r3, #0
  36121. 802d28c: d1f9 bne.n 802d282 <HTTP_HistoryPage+0x4a>
  36122. // Send log as raw data
  36123. log_ptr = 0;
  36124. 802d28e: 4a17 ldr r2, [pc, #92] ; (802d2ec <HTTP_HistoryPage+0xb4>)
  36125. 802d290: 6013 str r3, [r2, #0]
  36126. log_size = History_GetTotalSTRCount() * STRING_SIZE_HISTORY + sizeof(UTF8_BOM)-1;
  36127. 802d292: f7fd f92b bl 802a4ec <History_GetTotalSTRCount>
  36128. 802d296: 2264 movs r2, #100 ; 0x64
  36129. 802d298: 4350 muls r0, r2
  36130. 802d29a: 4b15 ldr r3, [pc, #84] ; (802d2f0 <HTTP_HistoryPage+0xb8>)
  36131. sprintf(bufOut, "HTTP/1.1 200 OK\r\nContent-Length:%lu\r\n\r\n%s", log_size, UTF8_BOM);
  36132. 802d29c: 4915 ldr r1, [pc, #84] ; (802d2f4 <HTTP_HistoryPage+0xbc>)
  36133. if (fLogTransInprog == false) {
  36134. // Send log as raw data
  36135. log_ptr = 0;
  36136. log_size = History_GetTotalSTRCount() * STRING_SIZE_HISTORY + sizeof(UTF8_BOM)-1;
  36137. 802d29e: 1cc2 adds r2, r0, #3
  36138. 802d2a0: 601a str r2, [r3, #0]
  36139. sprintf(bufOut, "HTTP/1.1 200 OK\r\nContent-Length:%lu\r\n\r\n%s", log_size, UTF8_BOM);
  36140. 802d2a2: 4620 mov r0, r4
  36141. 802d2a4: 4b14 ldr r3, [pc, #80] ; (802d2f8 <HTTP_HistoryPage+0xc0>)
  36142. 802d2a6: f7fa fd1f bl 8027ce8 <tfp_sprintf>
  36143. *lenBufOut = strlen(bufOut);
  36144. 802d2aa: 4620 mov r0, r4
  36145. 802d2ac: f7f4 ff8c bl 80221c8 <strlen>
  36146. // Set file transfer in progress flag
  36147. fLogTransInprog = true;
  36148. 802d2b0: 2301 movs r3, #1
  36149. log_ptr = 0;
  36150. log_size = History_GetTotalSTRCount() * STRING_SIZE_HISTORY + sizeof(UTF8_BOM)-1;
  36151. sprintf(bufOut, "HTTP/1.1 200 OK\r\nContent-Length:%lu\r\n\r\n%s", log_size, UTF8_BOM);
  36152. *lenBufOut = strlen(bufOut);
  36153. 802d2b2: 8030 strh r0, [r6, #0]
  36154. // Set file transfer in progress flag
  36155. fLogTransInprog = true;
  36156. 802d2b4: 702b strb r3, [r5, #0]
  36157. return SEND_REQUIRED_FILE;
  36158. 802d2b6: 2002 movs r0, #2
  36159. 802d2b8: e00f b.n 802d2da <HTTP_HistoryPage+0xa2>
  36160. // We send nothing if file transfer already in progress
  36161. return SEND_REQUIRED_NO;
  36162. }
  36163. }
  36164. else {
  36165. if (!LOG_IsInit()) {
  36166. 802d2ba: f7fd f819 bl 802a2f0 <LOG_IsInit>
  36167. 802d2be: 2800 cmp r0, #0
  36168. 802d2c0: d0df beq.n 802d282 <HTTP_HistoryPage+0x4a>
  36169. return SEND_REQUIRED_NO;
  36170. }
  36171. else {
  36172. HTTP_GetHistoryPage(bufOut, atoi(value));
  36173. 802d2c2: a801 add r0, sp, #4
  36174. 802d2c4: f7f4 fc88 bl 8021bd8 <atoi>
  36175. 802d2c8: 4601 mov r1, r0
  36176. 802d2ca: 4620 mov r0, r4
  36177. 802d2cc: f001 f9f4 bl 802e6b8 <HTTP_GetHistoryPage>
  36178. *lenBufOut = strlen(bufOut);
  36179. 802d2d0: 4620 mov r0, r4
  36180. 802d2d2: f7f4 ff79 bl 80221c8 <strlen>
  36181. 802d2d6: 8030 strh r0, [r6, #0]
  36182. return SEND_REQUIRED_YES;
  36183. 802d2d8: 4628 mov r0, r5
  36184. }
  36185. }
  36186. }
  36187. 802d2da: b007 add sp, #28
  36188. 802d2dc: bdf0 pop {r4, r5, r6, r7, pc}
  36189. 802d2de: bf00 nop
  36190. 802d2e0: 080402c3 .word 0x080402c3
  36191. 802d2e4: 080402c9 .word 0x080402c9
  36192. 802d2e8: 20000d6c .word 0x20000d6c
  36193. 802d2ec: 20000d60 .word 0x20000d60
  36194. 802d2f0: 20000d78 .word 0x20000d78
  36195. 802d2f4: 080402cd .word 0x080402cd
  36196. 802d2f8: 0803b85c .word 0x0803b85c
  36197. 0802d2fc <HTTP_ChangeUserPwd>:
  36198. /**
  36199. * @brief Смена пароля пользователя
  36200. * @retval None
  36201. */
  36202. int HTTP_ChangeUserPwd(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  36203. {
  36204. 802d2fc: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  36205. 802d300: b0b0 sub sp, #192 ; 0xc0
  36206. 802d302: 4605 mov r5, r0
  36207. 802d304: 460c mov r4, r1
  36208. uint8_t valueLen, valueLen2, user_id;
  36209. char WebLogin[MAX_WEB_LOGIN_LEN];
  36210. (void)lenBufIn;
  36211. memset(login, 0, 20);
  36212. 802d306: 2214 movs r2, #20
  36213. 802d308: 2100 movs r1, #0
  36214. 802d30a: a80a add r0, sp, #40 ; 0x28
  36215. /**
  36216. * @brief Смена пароля пользователя
  36217. * @retval None
  36218. */
  36219. int HTTP_ChangeUserPwd(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  36220. {
  36221. 802d30c: 461e mov r6, r3
  36222. uint8_t valueLen, valueLen2, user_id;
  36223. char WebLogin[MAX_WEB_LOGIN_LEN];
  36224. (void)lenBufIn;
  36225. memset(login, 0, 20);
  36226. 802d30e: f7f4 fd83 bl 8021e18 <memset>
  36227. memset(password, 0, 20);
  36228. 802d312: 2100 movs r1, #0
  36229. 802d314: 2214 movs r2, #20
  36230. 802d316: a80f add r0, sp, #60 ; 0x3c
  36231. 802d318: f7f4 fd7e bl 8021e18 <memset>
  36232. memset(tempStr, 0, 50);
  36233. memset(value, 0, 20);
  36234. 802d31c: af05 add r7, sp, #20
  36235. (void)lenBufIn;
  36236. memset(login, 0, 20);
  36237. memset(password, 0, 20);
  36238. memset(tempStr, 0, 50);
  36239. 802d31e: 2100 movs r1, #0
  36240. 802d320: 2232 movs r2, #50 ; 0x32
  36241. 802d322: a814 add r0, sp, #80 ; 0x50
  36242. 802d324: f7f4 fd78 bl 8021e18 <memset>
  36243. memset(value, 0, 20);
  36244. 802d328: 2100 movs r1, #0
  36245. 802d32a: 2214 movs r2, #20
  36246. 802d32c: 4638 mov r0, r7
  36247. 802d32e: f7f4 fd73 bl 8021e18 <memset>
  36248. ClearParamString(bufIn);
  36249. 802d332: 4628 mov r0, r5
  36250. 802d334: f7ff fed8 bl 802d0e8 <ClearParamString>
  36251. strncpy(tempStr, bufIn, 110);
  36252. 802d338: 226e movs r2, #110 ; 0x6e
  36253. 802d33a: 4629 mov r1, r5
  36254. 802d33c: a814 add r0, sp, #80 ; 0x50
  36255. 802d33e: f7f4 fffb bl 8022338 <strncpy>
  36256. strcpy(bufOut, HTTP_200_OK);
  36257. if (GetParamValue(tempStr, "username=", login, &valueLen) &&
  36258. 802d342: f10d 0806 add.w r8, sp, #6
  36259. ClearParamString(bufIn);
  36260. strncpy(tempStr, bufIn, 110);
  36261. strcpy(bufOut, HTTP_200_OK);
  36262. 802d346: 4933 ldr r1, [pc, #204] ; (802d414 <HTTP_ChangeUserPwd+0x118>)
  36263. 802d348: 4620 mov r0, r4
  36264. 802d34a: f7f4 fedf bl 802210c <strcpy>
  36265. if (GetParamValue(tempStr, "username=", login, &valueLen) &&
  36266. 802d34e: a814 add r0, sp, #80 ; 0x50
  36267. 802d350: 4931 ldr r1, [pc, #196] ; (802d418 <HTTP_ChangeUserPwd+0x11c>)
  36268. 802d352: aa0a add r2, sp, #40 ; 0x28
  36269. 802d354: 4643 mov r3, r8
  36270. 802d356: f7ff fa61 bl 802c81c <GetParamValue>
  36271. 802d35a: 2800 cmp r0, #0
  36272. 802d35c: d04e beq.n 802d3fc <HTTP_ChangeUserPwd+0x100>
  36273. GetParamValue(tempStr, "oldpass=", password, &valueLen))
  36274. 802d35e: a814 add r0, sp, #80 ; 0x50
  36275. 802d360: 492e ldr r1, [pc, #184] ; (802d41c <HTTP_ChangeUserPwd+0x120>)
  36276. 802d362: aa0f add r2, sp, #60 ; 0x3c
  36277. 802d364: 4643 mov r3, r8
  36278. 802d366: f7ff fa59 bl 802c81c <GetParamValue>
  36279. strncpy(tempStr, bufIn, 110);
  36280. strcpy(bufOut, HTTP_200_OK);
  36281. if (GetParamValue(tempStr, "username=", login, &valueLen) &&
  36282. 802d36a: 2800 cmp r0, #0
  36283. 802d36c: d046 beq.n 802d3fc <HTTP_ChangeUserPwd+0x100>
  36284. 802d36e: 2500 movs r5, #0
  36285. GetParamValue(tempStr, "oldpass=", password, &valueLen))
  36286. {
  36287. for (user_id = 0; user_id < MAX_WEB_USERS; user_id++)
  36288. {
  36289. memset(value, 0, 20);
  36290. 802d370: 2100 movs r1, #0
  36291. 802d372: 2214 movs r2, #20
  36292. 802d374: 4638 mov r0, r7
  36293. 802d376: f7f4 fd4f bl 8021e18 <memset>
  36294. memset(WebLogin, 0, MAX_WEB_LOGIN_LEN);
  36295. 802d37a: 2100 movs r1, #0
  36296. 802d37c: 220b movs r2, #11
  36297. 802d37e: a802 add r0, sp, #8
  36298. 802d380: f7f4 fd4a bl 8021e18 <memset>
  36299. GetUserLogin(user_id, WebLogin, &valueLen);
  36300. 802d384: 4628 mov r0, r5
  36301. 802d386: a902 add r1, sp, #8
  36302. 802d388: 4642 mov r2, r8
  36303. 802d38a: f7fa ff97 bl 80282bc <GetUserLogin>
  36304. GetUserPassword(user_id, value, &valueLen2);
  36305. 802d38e: 4628 mov r0, r5
  36306. 802d390: 4639 mov r1, r7
  36307. 802d392: f10d 0207 add.w r2, sp, #7
  36308. 802d396: f7fa ffa7 bl 80282e8 <GetUserPassword>
  36309. /* Check login and password */
  36310. if ((strncmp(WebLogin, login, MAX_WEB_LOGIN_LEN) == 0) &&
  36311. 802d39a: a802 add r0, sp, #8
  36312. 802d39c: a90a add r1, sp, #40 ; 0x28
  36313. 802d39e: 220b movs r2, #11
  36314. 802d3a0: f7f4 ff74 bl 802228c <strncmp>
  36315. 802d3a4: bb18 cbnz r0, 802d3ee <HTTP_ChangeUserPwd+0xf2>
  36316. (memcmp(password, value, 11) == 0))
  36317. 802d3a6: 4639 mov r1, r7
  36318. 802d3a8: a80f add r0, sp, #60 ; 0x3c
  36319. 802d3aa: 220b movs r2, #11
  36320. 802d3ac: f7f4 fc48 bl 8021c40 <memcmp>
  36321. memset(value, 0, 20);
  36322. memset(WebLogin, 0, MAX_WEB_LOGIN_LEN);
  36323. GetUserLogin(user_id, WebLogin, &valueLen);
  36324. GetUserPassword(user_id, value, &valueLen2);
  36325. /* Check login and password */
  36326. if ((strncmp(WebLogin, login, MAX_WEB_LOGIN_LEN) == 0) &&
  36327. 802d3b0: 4601 mov r1, r0
  36328. 802d3b2: b9e0 cbnz r0, 802d3ee <HTTP_ChangeUserPwd+0xf2>
  36329. (memcmp(password, value, 11) == 0))
  36330. {
  36331. memset(password, 0, 20);
  36332. 802d3b4: 2214 movs r2, #20
  36333. 802d3b6: a80f add r0, sp, #60 ; 0x3c
  36334. 802d3b8: f7f4 fd2e bl 8021e18 <memset>
  36335. if (GetParamValue(tempStr, "newpass=", password, &valueLen))
  36336. 802d3bc: a814 add r0, sp, #80 ; 0x50
  36337. 802d3be: 4918 ldr r1, [pc, #96] ; (802d420 <HTTP_ChangeUserPwd+0x124>)
  36338. 802d3c0: aa0f add r2, sp, #60 ; 0x3c
  36339. 802d3c2: 4643 mov r3, r8
  36340. 802d3c4: f7ff fa2a bl 802c81c <GetParamValue>
  36341. 802d3c8: b1c0 cbz r0, 802d3fc <HTTP_ChangeUserPwd+0x100>
  36342. {
  36343. memcpy(sSettings.sAuth[user_id].password, password, 11);
  36344. 802d3ca: 4b16 ldr r3, [pc, #88] ; (802d424 <HTTP_ChangeUserPwd+0x128>)
  36345. 802d3cc: 2217 movs r2, #23
  36346. 802d3ce: fb02 3005 mla r0, r2, r5, r3
  36347. 802d3d2: a90f add r1, sp, #60 ; 0x3c
  36348. 802d3d4: 220b movs r2, #11
  36349. 802d3d6: 3005 adds r0, #5
  36350. 802d3d8: f7f4 fc64 bl 8021ca4 <memcpy>
  36351. HTTP_SaveSettings();
  36352. 802d3dc: f001 fa44 bl 802e868 <HTTP_SaveSettings>
  36353. log_event_data(LOG_PSW_CHANGE, "Администратор");
  36354. 802d3e0: 2003 movs r0, #3
  36355. 802d3e2: 4911 ldr r1, [pc, #68] ; (802d428 <HTTP_ChangeUserPwd+0x12c>)
  36356. 802d3e4: f7fc ff3e bl 802a264 <log_event_data>
  36357. strcat(bufOut, "Пароль успешно изменён");
  36358. 802d3e8: 4620 mov r0, r4
  36359. 802d3ea: 4910 ldr r1, [pc, #64] ; (802d42c <HTTP_ChangeUserPwd+0x130>)
  36360. 802d3ec: e008 b.n 802d400 <HTTP_ChangeUserPwd+0x104>
  36361. strcpy(bufOut, HTTP_200_OK);
  36362. if (GetParamValue(tempStr, "username=", login, &valueLen) &&
  36363. GetParamValue(tempStr, "oldpass=", password, &valueLen))
  36364. {
  36365. for (user_id = 0; user_id < MAX_WEB_USERS; user_id++)
  36366. 802d3ee: 3501 adds r5, #1
  36367. 802d3f0: b2ed uxtb r5, r5
  36368. 802d3f2: 2d02 cmp r5, #2
  36369. 802d3f4: d1bc bne.n 802d370 <HTTP_ChangeUserPwd+0x74>
  36370. *lenBufOut = strlen(bufOut);
  36371. return SEND_REQUIRED_YES;
  36372. }
  36373. }
  36374. }
  36375. strcat(bufOut, "Введён неверный пароль!");
  36376. 802d3f6: 4620 mov r0, r4
  36377. 802d3f8: 490d ldr r1, [pc, #52] ; (802d430 <HTTP_ChangeUserPwd+0x134>)
  36378. 802d3fa: e001 b.n 802d400 <HTTP_ChangeUserPwd+0x104>
  36379. *lenBufOut = strlen(bufOut);
  36380. return SEND_REQUIRED_YES;
  36381. }
  36382. else {
  36383. strcat(bufOut, "Введены некорректные данные!");
  36384. 802d3fc: 490d ldr r1, [pc, #52] ; (802d434 <HTTP_ChangeUserPwd+0x138>)
  36385. 802d3fe: 4620 mov r0, r4
  36386. 802d400: f7f4 fd70 bl 8021ee4 <strcat>
  36387. *lenBufOut = strlen(bufOut);
  36388. 802d404: 4620 mov r0, r4
  36389. 802d406: f7f4 fedf bl 80221c8 <strlen>
  36390. 802d40a: 8030 strh r0, [r6, #0]
  36391. return SEND_REQUIRED_YES;
  36392. }
  36393. }
  36394. 802d40c: 2000 movs r0, #0
  36395. 802d40e: b030 add sp, #192 ; 0xc0
  36396. 802d410: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  36397. 802d414: 08041928 .word 0x08041928
  36398. 802d418: 080402f7 .word 0x080402f7
  36399. 802d41c: 08040301 .word 0x08040301
  36400. 802d420: 0804030a .word 0x0804030a
  36401. 802d424: 2000d72c .word 0x2000d72c
  36402. 802d428: 0803928f .word 0x0803928f
  36403. 802d42c: 08040313 .word 0x08040313
  36404. 802d430: 08040374 .word 0x08040374
  36405. 802d434: 0804033e .word 0x0804033e
  36406. 0802d438 <http_recv>:
  36407. * @param p: pointer to a packet buffer
  36408. * @param err: LwIP error code
  36409. * @retval err
  36410. */
  36411. static err_t http_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err)
  36412. {
  36413. 802d438: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  36414. 802d43c: b09b sub sp, #108 ; 0x6c
  36415. 802d43e: 4617 mov r7, r2
  36416. struct http_state *hs;
  36417. char CookieBuf[50];
  36418. char *CookiePtr = NULL;
  36419. char name[MAX_WEB_COOKIE_LEN];
  36420. char id[MAX_WEB_COOKIE_LEN];
  36421. uint8_t nameLen = 0, idLen = 0;
  36422. 802d440: 2200 movs r2, #0
  36423. * @param p: pointer to a packet buffer
  36424. * @param err: LwIP error code
  36425. * @retval err
  36426. */
  36427. static err_t http_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err)
  36428. {
  36429. 802d442: 4604 mov r4, r0
  36430. 802d444: 460d mov r5, r1
  36431. struct http_state *hs;
  36432. char CookieBuf[50];
  36433. char *CookiePtr = NULL;
  36434. char name[MAX_WEB_COOKIE_LEN];
  36435. char id[MAX_WEB_COOKIE_LEN];
  36436. uint8_t nameLen = 0, idLen = 0;
  36437. 802d446: f88d 200a strb.w r2, [sp, #10]
  36438. 802d44a: f88d 200b strb.w r2, [sp, #11]
  36439. uint32_t DataOffset;
  36440. struct fs_file file = {0, 0};
  36441. 802d44e: 9203 str r2, [sp, #12]
  36442. 802d450: 9204 str r2, [sp, #16]
  36443. uint32_t i;
  36444. hs = arg;
  36445. if (err == ERR_OK && p != NULL)
  36446. 802d452: 2b00 cmp r3, #0
  36447. 802d454: f040 852b bne.w 802deae <http_recv+0xa76>
  36448. 802d458: 2f00 cmp r7, #0
  36449. 802d45a: f000 8528 beq.w 802deae <http_recv+0xa76>
  36450. {
  36451. tcp_recved(pcb, p->tot_len);
  36452. 802d45e: 4608 mov r0, r1
  36453. 802d460: 8939 ldrh r1, [r7, #8]
  36454. 802d462: f002 fea3 bl 80301ac <tcp_recved>
  36455. if (hs->file == NULL)
  36456. 802d466: f8d4 9000 ldr.w r9, [r4]
  36457. 802d46a: f1b9 0f00 cmp.w r9, #0
  36458. 802d46e: f040 851b bne.w 802dea8 <http_recv+0xa70>
  36459. printLen = p->tot_len;
  36460. memcpy(printBuf, p->payload , printLen);
  36461. printf(printBuf);
  36462. */
  36463. receivedBufLen = p->tot_len;
  36464. memcpy(receiveBuf, p->payload , receivedBufLen);
  36465. 802d472: f8df b2e8 ldr.w fp, [pc, #744] ; 802d75c <http_recv+0x324>
  36466. {
  36467. tcp_recved(pcb, p->tot_len);
  36468. if (hs->file == NULL)
  36469. {
  36470. data = p->payload;
  36471. 802d476: 687e ldr r6, [r7, #4]
  36472. /*
  36473. printLen = p->tot_len;
  36474. memcpy(printBuf, p->payload , printLen);
  36475. printf(printBuf);
  36476. */
  36477. receivedBufLen = p->tot_len;
  36478. 802d478: 893a ldrh r2, [r7, #8]
  36479. 802d47a: f8df a2dc ldr.w sl, [pc, #732] ; 802d758 <http_recv+0x320>
  36480. memcpy(receiveBuf, p->payload , receivedBufLen);
  36481. 802d47e: 4658 mov r0, fp
  36482. 802d480: 4631 mov r1, r6
  36483. /*
  36484. printLen = p->tot_len;
  36485. memcpy(printBuf, p->payload , printLen);
  36486. printf(printBuf);
  36487. */
  36488. receivedBufLen = p->tot_len;
  36489. 802d482: f8aa 2000 strh.w r2, [sl]
  36490. memcpy(receiveBuf, p->payload , receivedBufLen);
  36491. 802d486: f7f4 fc0d bl 8021ca4 <memcpy>
  36492. receiveBuf[receivedBufLen] = '\0';
  36493. 802d48a: f8ba 3000 ldrh.w r3, [sl]
  36494. // printf("receive %s \r\n", receiveBuf);
  36495. /* Get cookie "uname" value */
  36496. CookiePtr = strstr(receiveBuf, "uname=");
  36497. 802d48e: 49a0 ldr r1, [pc, #640] ; (802d710 <http_recv+0x2d8>)
  36498. printf(printBuf);
  36499. */
  36500. receivedBufLen = p->tot_len;
  36501. memcpy(receiveBuf, p->payload , receivedBufLen);
  36502. receiveBuf[receivedBufLen] = '\0';
  36503. 802d490: f80b 9003 strb.w r9, [fp, r3]
  36504. // printf("receive %s \r\n", receiveBuf);
  36505. /* Get cookie "uname" value */
  36506. CookiePtr = strstr(receiveBuf, "uname=");
  36507. 802d494: 4658 mov r0, fp
  36508. 802d496: f7f5 f917 bl 80226c8 <strstr>
  36509. strncpy(CookieBuf, CookiePtr, 50);
  36510. 802d49a: f10d 0a34 add.w sl, sp, #52 ; 0x34
  36511. memcpy(receiveBuf, p->payload , receivedBufLen);
  36512. receiveBuf[receivedBufLen] = '\0';
  36513. // printf("receive %s \r\n", receiveBuf);
  36514. /* Get cookie "uname" value */
  36515. CookiePtr = strstr(receiveBuf, "uname=");
  36516. 802d49e: 4601 mov r1, r0
  36517. strncpy(CookieBuf, CookiePtr, 50);
  36518. 802d4a0: 2232 movs r2, #50 ; 0x32
  36519. 802d4a2: 4650 mov r0, sl
  36520. 802d4a4: f7f4 ff48 bl 8022338 <strncpy>
  36521. //printf("********CookieBuf1= %s\r\n", CookieBuf);
  36522. memset(name, 0, MAX_WEB_COOKIE_LEN);
  36523. 802d4a8: 4649 mov r1, r9
  36524. 802d4aa: 2210 movs r2, #16
  36525. 802d4ac: a805 add r0, sp, #20
  36526. 802d4ae: f7f4 fcb3 bl 8021e18 <memset>
  36527. GetCookieValue(CookieBuf, "uname=", name, &nameLen);
  36528. 802d4b2: f10d 030a add.w r3, sp, #10
  36529. 802d4b6: aa05 add r2, sp, #20
  36530. 802d4b8: 4995 ldr r1, [pc, #596] ; (802d710 <http_recv+0x2d8>)
  36531. 802d4ba: 4650 mov r0, sl
  36532. 802d4bc: f7ff fde6 bl 802d08c <GetCookieValue>
  36533. //printf("********CookieBuf2= %s\r\n", CookieBuf);
  36534. //printf("********uname= %s\r\n", name);
  36535. /* Get cookie "id" value */
  36536. CookiePtr = strstr(receiveBuf, "id=");
  36537. 802d4c0: 4658 mov r0, fp
  36538. 802d4c2: 4994 ldr r1, [pc, #592] ; (802d714 <http_recv+0x2dc>)
  36539. 802d4c4: f7f5 f900 bl 80226c8 <strstr>
  36540. strncpy(CookieBuf, CookiePtr, 50);
  36541. //printf("********CookieBuf1= %s\r\n", CookieBuf);
  36542. memset(id, 0, MAX_WEB_COOKIE_LEN);
  36543. 802d4c8: f10d 0b24 add.w fp, sp, #36 ; 0x24
  36544. GetCookieValue(CookieBuf, "uname=", name, &nameLen);
  36545. //printf("********CookieBuf2= %s\r\n", CookieBuf);
  36546. //printf("********uname= %s\r\n", name);
  36547. /* Get cookie "id" value */
  36548. CookiePtr = strstr(receiveBuf, "id=");
  36549. 802d4cc: 4601 mov r1, r0
  36550. strncpy(CookieBuf, CookiePtr, 50);
  36551. 802d4ce: 2232 movs r2, #50 ; 0x32
  36552. 802d4d0: 4650 mov r0, sl
  36553. 802d4d2: f7f4 ff31 bl 8022338 <strncpy>
  36554. //printf("********CookieBuf1= %s\r\n", CookieBuf);
  36555. memset(id, 0, MAX_WEB_COOKIE_LEN);
  36556. 802d4d6: 4649 mov r1, r9
  36557. 802d4d8: 2210 movs r2, #16
  36558. 802d4da: 4658 mov r0, fp
  36559. 802d4dc: f7f4 fc9c bl 8021e18 <memset>
  36560. GetCookieValue(CookieBuf, "id=", id, &idLen);
  36561. 802d4e0: f10d 030b add.w r3, sp, #11
  36562. 802d4e4: 4650 mov r0, sl
  36563. 802d4e6: 498b ldr r1, [pc, #556] ; (802d714 <http_recv+0x2dc>)
  36564. 802d4e8: 465a mov r2, fp
  36565. 802d4ea: f7ff fdcf bl 802d08c <GetCookieValue>
  36566. /* Id of currently logged-in user */
  36567. uint8_t user_id;
  36568. if( DataFlag == 0 && DataFlag2 == 0 ){
  36569. 802d4ee: 4b8a ldr r3, [pc, #552] ; (802d718 <http_recv+0x2e0>)
  36570. 802d4f0: 681b ldr r3, [r3, #0]
  36571. 802d4f2: 2b00 cmp r3, #0
  36572. 802d4f4: d134 bne.n 802d560 <http_recv+0x128>
  36573. 802d4f6: 4b89 ldr r3, [pc, #548] ; (802d71c <http_recv+0x2e4>)
  36574. 802d4f8: 681b ldr r3, [r3, #0]
  36575. 802d4fa: 2b00 cmp r3, #0
  36576. 802d4fc: d130 bne.n 802d560 <http_recv+0x128>
  36577. /* Level of currently logged-in user */
  36578. seclevel = 0xFF;
  36579. 802d4fe: 4a88 ldr r2, [pc, #544] ; (802d720 <http_recv+0x2e8>)
  36580. 802d500: 21ff movs r1, #255 ; 0xff
  36581. 802d502: 4699 mov r9, r3
  36582. /**
  36583. * @brief Чтение Cookie пользователя
  36584. */
  36585. static void HTTP_GetUserCookie(uint8_t user_id, char *str, uint8_t *len)
  36586. {
  36587. sprintf(str, "%s", users[user_id].cookie);
  36588. 802d504: 4b87 ldr r3, [pc, #540] ; (802d724 <http_recv+0x2ec>)
  36589. /* Id of currently logged-in user */
  36590. uint8_t user_id;
  36591. if( DataFlag == 0 && DataFlag2 == 0 ){
  36592. /* Level of currently logged-in user */
  36593. seclevel = 0xFF;
  36594. 802d506: 7011 strb r1, [r2, #0]
  36595. /**
  36596. * @brief Чтение Cookie пользователя
  36597. */
  36598. static void HTTP_GetUserCookie(uint8_t user_id, char *str, uint8_t *len)
  36599. {
  36600. sprintf(str, "%s", users[user_id].cookie);
  36601. 802d508: 2214 movs r2, #20
  36602. 802d50a: fb02 3209 mla r2, r2, r9, r3
  36603. 802d50e: 4986 ldr r1, [pc, #536] ; (802d728 <http_recv+0x2f0>)
  36604. 802d510: 9301 str r3, [sp, #4]
  36605. 802d512: 4650 mov r0, sl
  36606. 802d514: f7fa fbe8 bl 8027ce8 <tfp_sprintf>
  36607. *len = strlen(str);
  36608. 802d518: 4650 mov r0, sl
  36609. 802d51a: f7f4 fe55 bl 80221c8 <strlen>
  36610. 802d51e: 4602 mov r2, r0
  36611. 802d520: f88d 000b strb.w r0, [sp, #11]
  36612. if( DataFlag == 0 && DataFlag2 == 0 ){
  36613. /* Level of currently logged-in user */
  36614. seclevel = 0xFF;
  36615. for (user_id = 0; user_id < MAX_WEB_USERS; user_id++) {
  36616. HTTP_GetUserCookie(user_id, CookieBuf, &idLen);
  36617. if (strncmp(id, CookieBuf, idLen) == 0 ) {
  36618. 802d524: b2d2 uxtb r2, r2
  36619. 802d526: 4658 mov r0, fp
  36620. 802d528: 4651 mov r1, sl
  36621. 802d52a: f7f4 feaf bl 802228c <strncmp>
  36622. 802d52e: fa5f f889 uxtb.w r8, r9
  36623. 802d532: 4a7e ldr r2, [pc, #504] ; (802d72c <http_recv+0x2f4>)
  36624. 802d534: 9b01 ldr r3, [sp, #4]
  36625. 802d536: b940 cbnz r0, 802d54a <http_recv+0x112>
  36626. GetUserLevelInt(user_id, &seclevel);
  36627. 802d538: 4640 mov r0, r8
  36628. 802d53a: 4979 ldr r1, [pc, #484] ; (802d720 <http_recv+0x2e8>)
  36629. 802d53c: 9201 str r2, [sp, #4]
  36630. 802d53e: f7fa fee9 bl 8028314 <GetUserLevelInt>
  36631. Authenticated = true;
  36632. 802d542: 9a01 ldr r2, [sp, #4]
  36633. 802d544: 2301 movs r3, #1
  36634. 802d546: 7013 strb r3, [r2, #0]
  36635. break;
  36636. 802d548: e00a b.n 802d560 <http_recv+0x128>
  36637. }
  36638. Authenticated = false;
  36639. 802d54a: 2100 movs r1, #0
  36640. 802d54c: 7011 strb r1, [r2, #0]
  36641. 802d54e: f109 0901 add.w r9, r9, #1
  36642. seclevel = 0xFF;
  36643. 802d552: 4a73 ldr r2, [pc, #460] ; (802d720 <http_recv+0x2e8>)
  36644. 802d554: 21ff movs r1, #255 ; 0xff
  36645. uint8_t user_id;
  36646. if( DataFlag == 0 && DataFlag2 == 0 ){
  36647. /* Level of currently logged-in user */
  36648. seclevel = 0xFF;
  36649. for (user_id = 0; user_id < MAX_WEB_USERS; user_id++) {
  36650. 802d556: f1b9 0f02 cmp.w r9, #2
  36651. GetUserLevelInt(user_id, &seclevel);
  36652. Authenticated = true;
  36653. break;
  36654. }
  36655. Authenticated = false;
  36656. seclevel = 0xFF;
  36657. 802d55a: 7011 strb r1, [r2, #0]
  36658. uint8_t user_id;
  36659. if( DataFlag == 0 && DataFlag2 == 0 ){
  36660. /* Level of currently logged-in user */
  36661. seclevel = 0xFF;
  36662. for (user_id = 0; user_id < MAX_WEB_USERS; user_id++) {
  36663. 802d55c: d1d4 bne.n 802d508 <http_recv+0xd0>
  36664. 802d55e: 46c8 mov r8, r9
  36665. }
  36666. Authenticated = false;
  36667. seclevel = 0xFF;
  36668. }
  36669. }
  36670. if (DataFlag >= 1)
  36671. 802d560: 4b6d ldr r3, [pc, #436] ; (802d718 <http_recv+0x2e0>)
  36672. 802d562: 681a ldr r2, [r3, #0]
  36673. 802d564: 4b71 ldr r3, [pc, #452] ; (802d72c <http_recv+0x2f4>)
  36674. 802d566: b102 cbz r2, 802d56a <http_recv+0x132>
  36675. 802d568: e002 b.n 802d570 <http_recv+0x138>
  36676. Authenticated = true;
  36677. else if(DataFlag2 >= 1)
  36678. 802d56a: 4a6c ldr r2, [pc, #432] ; (802d71c <http_recv+0x2e4>)
  36679. 802d56c: 6812 ldr r2, [r2, #0]
  36680. 802d56e: b10a cbz r2, 802d574 <http_recv+0x13c>
  36681. Authenticated = true;
  36682. 802d570: 2201 movs r2, #1
  36683. 802d572: 701a strb r2, [r3, #0]
  36684. if ( Authenticated == false && sSettings.sRADIUS.Auth_enable == false)
  36685. 802d574: 781b ldrb r3, [r3, #0]
  36686. 802d576: 2b00 cmp r3, #0
  36687. 802d578: f040 8114 bne.w 802d7a4 <http_recv+0x36c>
  36688. 802d57c: 4b6c ldr r3, [pc, #432] ; (802d730 <http_recv+0x2f8>)
  36689. 802d57e: f893 3378 ldrb.w r3, [r3, #888] ; 0x378
  36690. 802d582: b943 cbnz r3, 802d596 <http_recv+0x15e>
  36691. {
  36692. HTTP_LOGIN(sendBuf, &sendBufLoadLen);
  36693. 802d584: f8df 81e8 ldr.w r8, [pc, #488] ; 802d770 <http_recv+0x338>
  36694. 802d588: 4e6a ldr r6, [pc, #424] ; (802d734 <http_recv+0x2fc>)
  36695. 802d58a: 4640 mov r0, r8
  36696. 802d58c: 4631 mov r1, r6
  36697. 802d58e: f7ff f8ed bl 802c76c <HTTP_LOGIN>
  36698. 802d592: f000 bc72 b.w 802de7a <http_recv+0xa42>
  36699. tcp_sent(pcb, http_sent);
  36700. }
  36701. else if ( Authenticated == false )//&& sSettings.sRADIUS.Auth_enable == true
  36702. {
  36703. if (strncmp(data, "GET /main.css", 13) == 0) // +
  36704. 802d596: 4630 mov r0, r6
  36705. 802d598: 4967 ldr r1, [pc, #412] ; (802d738 <http_recv+0x300>)
  36706. 802d59a: 220d movs r2, #13
  36707. 802d59c: f7f4 fe76 bl 802228c <strncmp>
  36708. 802d5a0: b900 cbnz r0, 802d5a4 <http_recv+0x16c>
  36709. 802d5a2: e105 b.n 802d7b0 <http_recv+0x378>
  36710. hs->file = file.data;
  36711. hs->left = file.len;
  36712. send_data(pcb, hs);
  36713. tcp_sent(pcb, http_sent);
  36714. }
  36715. else if (strncmp(data, "GET /rotek.png", 14) == 0) // +
  36716. 802d5a4: 4630 mov r0, r6
  36717. 802d5a6: 4965 ldr r1, [pc, #404] ; (802d73c <http_recv+0x304>)
  36718. 802d5a8: 220e movs r2, #14
  36719. 802d5aa: f7f4 fe6f bl 802228c <strncmp>
  36720. 802d5ae: b900 cbnz r0, 802d5b2 <http_recv+0x17a>
  36721. 802d5b0: e106 b.n 802d7c0 <http_recv+0x388>
  36722. hs->file = file.data;
  36723. hs->left = file.len;
  36724. send_data(pcb, hs);
  36725. tcp_sent(pcb, http_sent);
  36726. }
  36727. else if (strncmp(data, "GET /favicon.ico", 16) == 0) // ?
  36728. 802d5b2: 4630 mov r0, r6
  36729. 802d5b4: 4962 ldr r1, [pc, #392] ; (802d740 <http_recv+0x308>)
  36730. 802d5b6: 2210 movs r2, #16
  36731. 802d5b8: f7f4 fe68 bl 802228c <strncmp>
  36732. 802d5bc: b900 cbnz r0, 802d5c0 <http_recv+0x188>
  36733. 802d5be: e107 b.n 802d7d0 <http_recv+0x398>
  36734. hs->file = file.data;
  36735. hs->left = file.len;
  36736. send_data(pcb, hs);
  36737. tcp_sent(pcb, http_sent);
  36738. }
  36739. else if (strncmp(data, "GET /role.js", 12) == 0)
  36740. 802d5c0: 4630 mov r0, r6
  36741. 802d5c2: 4960 ldr r1, [pc, #384] ; (802d744 <http_recv+0x30c>)
  36742. 802d5c4: 220c movs r2, #12
  36743. 802d5c6: f7f4 fe61 bl 802228c <strncmp>
  36744. 802d5ca: b900 cbnz r0, 802d5ce <http_recv+0x196>
  36745. 802d5cc: e110 b.n 802d7f0 <http_recv+0x3b8>
  36746. hs->left = file.len;
  36747. send_data(pcb, hs);
  36748. tcp_sent(pcb, http_sent);
  36749. }
  36750. else if ((strncmp(data, "POST /login.cgi", 15) == 0) || (log_post_reqn > 0))
  36751. 802d5ce: 4630 mov r0, r6
  36752. 802d5d0: 495d ldr r1, [pc, #372] ; (802d748 <http_recv+0x310>)
  36753. 802d5d2: 220f movs r2, #15
  36754. 802d5d4: f7f4 fe5a bl 802228c <strncmp>
  36755. 802d5d8: b118 cbz r0, 802d5e2 <http_recv+0x1aa>
  36756. 802d5da: 4b5c ldr r3, [pc, #368] ; (802d74c <http_recv+0x314>)
  36757. 802d5dc: 681b ldr r3, [r3, #0]
  36758. 802d5de: 2b00 cmp r3, #0
  36759. 802d5e0: d07e beq.n 802d6e0 <http_recv+0x2a8>
  36760. uint32_t i, offset = 0, req_data_received = 0;
  36761. //printf("request 1: %d\r\n", receivedBufLen);
  36762. /* parse packet for Content-length field */
  36763. post_data_count = Parse_Content_Length(data, p->tot_len);
  36764. 802d5e2: 4630 mov r0, r6
  36765. 802d5e4: 8939 ldrh r1, [r7, #8]
  36766. 802d5e6: f8df 8180 ldr.w r8, [pc, #384] ; 802d768 <http_recv+0x330>
  36767. 802d5ea: f7fe fe9b bl 802c324 <Parse_Content_Length>
  36768. //printf("Content-length: %d\r\n", (int)post_data_count);
  36769. if (post_data_count < MAX_POST_REQ_LEN) {
  36770. 802d5ee: 28ff cmp r0, #255 ; 0xff
  36771. uint32_t i, offset = 0, req_data_received = 0;
  36772. //printf("request 1: %d\r\n", receivedBufLen);
  36773. /* parse packet for Content-length field */
  36774. post_data_count = Parse_Content_Length(data, p->tot_len);
  36775. 802d5f0: f8c8 0000 str.w r0, [r8]
  36776. //printf("Content-length: %d\r\n", (int)post_data_count);
  36777. if (post_data_count < MAX_POST_REQ_LEN) {
  36778. 802d5f4: d86b bhi.n 802d6ce <http_recv+0x296>
  36779. memset(post_req_data, 0, MAX_POST_REQ_LEN);
  36780. 802d5f6: 4856 ldr r0, [pc, #344] ; (802d750 <http_recv+0x318>)
  36781. /* parse packet for "\r\n\r\n" */
  36782. for (i = 0; i < receivedBufLen; i++)
  36783. 802d5f8: f8df 915c ldr.w r9, [pc, #348] ; 802d758 <http_recv+0x320>
  36784. post_data_count = Parse_Content_Length(data, p->tot_len);
  36785. //printf("Content-length: %d\r\n", (int)post_data_count);
  36786. if (post_data_count < MAX_POST_REQ_LEN) {
  36787. memset(post_req_data, 0, MAX_POST_REQ_LEN);
  36788. 802d5fc: 2100 movs r1, #0
  36789. 802d5fe: f44f 7280 mov.w r2, #256 ; 0x100
  36790. 802d602: f7f4 fc09 bl 8021e18 <memset>
  36791. /* parse packet for "\r\n\r\n" */
  36792. for (i = 0; i < receivedBufLen; i++)
  36793. 802d606: f04f 0800 mov.w r8, #0
  36794. 802d60a: e00b b.n 802d624 <http_recv+0x1ec>
  36795. {
  36796. if (strncmp ((char*)(data+i), "\r\n\r\n", 4) == 0)
  36797. 802d60c: eb06 0008 add.w r0, r6, r8
  36798. 802d610: 4950 ldr r1, [pc, #320] ; (802d754 <http_recv+0x31c>)
  36799. 802d612: 2204 movs r2, #4
  36800. 802d614: f7f4 fe3a bl 802228c <strncmp>
  36801. 802d618: b910 cbnz r0, 802d620 <http_recv+0x1e8>
  36802. {
  36803. offset = i+4;
  36804. 802d61a: f108 0804 add.w r8, r8, #4
  36805. //printf("offset: %d\r\n", (int)offset);
  36806. break;
  36807. 802d61e: e007 b.n 802d630 <http_recv+0x1f8>
  36808. if (post_data_count < MAX_POST_REQ_LEN) {
  36809. memset(post_req_data, 0, MAX_POST_REQ_LEN);
  36810. /* parse packet for "\r\n\r\n" */
  36811. for (i = 0; i < receivedBufLen; i++)
  36812. 802d620: f108 0801 add.w r8, r8, #1
  36813. 802d624: f8b9 3000 ldrh.w r3, [r9]
  36814. 802d628: 4598 cmp r8, r3
  36815. 802d62a: d3ef bcc.n 802d60c <http_recv+0x1d4>
  36816. tcp_sent(pcb, http_sent);
  36817. }
  36818. else if ((strncmp(data, "POST /login.cgi", 15) == 0) || (log_post_reqn > 0))
  36819. {
  36820. uint32_t i, offset = 0, req_data_received = 0;
  36821. 802d62c: f04f 0800 mov.w r8, #0
  36822. //printf("offset: %d\r\n", (int)offset);
  36823. break;
  36824. }
  36825. }
  36826. req_data_received = receivedBufLen - offset;
  36827. 802d630: 4b49 ldr r3, [pc, #292] ; (802d758 <http_recv+0x320>)
  36828. 802d632: f8b3 a000 ldrh.w sl, [r3]
  36829. //printf("req data received: %d\r\n", (int)req_data_received);
  36830. /* Check if "\r\n\r\n" was found */
  36831. if (offset != 0) {
  36832. 802d636: f1b8 0f00 cmp.w r8, #0
  36833. 802d63a: d02b beq.n 802d694 <http_recv+0x25c>
  36834. /* if data was splited in two packets */
  36835. if (req_data_received < post_data_count) {
  36836. 802d63c: f8df 9128 ldr.w r9, [pc, #296] ; 802d768 <http_recv+0x330>
  36837. /* Copy request data to buffer */
  36838. snprintf(post_req_data, req_data_received, "%s", receiveBuf);
  36839. 802d640: 4843 ldr r0, [pc, #268] ; (802d750 <http_recv+0x318>)
  36840. /* Check if "\r\n\r\n" was found */
  36841. if (offset != 0) {
  36842. /* if data was splited in two packets */
  36843. if (req_data_received < post_data_count) {
  36844. 802d642: f8d9 2000 ldr.w r2, [r9]
  36845. //printf("offset: %d\r\n", (int)offset);
  36846. break;
  36847. }
  36848. }
  36849. req_data_received = receivedBufLen - offset;
  36850. 802d646: ebc8 0a0a rsb sl, r8, sl
  36851. /* Check if "\r\n\r\n" was found */
  36852. if (offset != 0) {
  36853. /* if data was splited in two packets */
  36854. if (req_data_received < post_data_count) {
  36855. 802d64a: 4592 cmp sl, r2
  36856. 802d64c: d20c bcs.n 802d668 <http_recv+0x230>
  36857. /* Copy request data to buffer */
  36858. snprintf(post_req_data, req_data_received, "%s", receiveBuf);
  36859. 802d64e: 4b43 ldr r3, [pc, #268] ; (802d75c <http_recv+0x324>)
  36860. 802d650: 4a35 ldr r2, [pc, #212] ; (802d728 <http_recv+0x2f0>)
  36861. 802d652: 4651 mov r1, sl
  36862. 802d654: f7fa fb2a bl 8027cac <tfp_snprintf>
  36863. //printf("copied: %d\r\n", (int)req_data_received);
  36864. post_data_count -= req_data_received;
  36865. 802d658: f8d9 3000 ldr.w r3, [r9]
  36866. 802d65c: ebca 0303 rsb r3, sl, r3
  36867. 802d660: f8c9 3000 str.w r3, [r9]
  36868. 802d664: f000 bc20 b.w 802dea8 <http_recv+0xa70>
  36869. }
  36870. /* if data received completely */
  36871. else {
  36872. strncat(post_req_data, (char *)(data + offset), post_data_count);
  36873. 802d668: eb06 0108 add.w r1, r6, r8
  36874. 802d66c: f7f4 fddc bl 8022228 <strncat>
  36875. //printf("post_req_data: %s\r\n", post_req_data);
  36876. if (HTTP_ConfirmWebPwd(post_req_data, sendBuf, strlen(post_req_data), &sendBufLoadLen) == SEND_REQUIRED_YES) {
  36877. 802d670: 4837 ldr r0, [pc, #220] ; (802d750 <http_recv+0x318>)
  36878. 802d672: f8df 80fc ldr.w r8, [pc, #252] ; 802d770 <http_recv+0x338>
  36879. 802d676: 4e2f ldr r6, [pc, #188] ; (802d734 <http_recv+0x2fc>)
  36880. 802d678: f7f4 fda6 bl 80221c8 <strlen>
  36881. 802d67c: 4641 mov r1, r8
  36882. 802d67e: b282 uxth r2, r0
  36883. 802d680: 4633 mov r3, r6
  36884. 802d682: 4833 ldr r0, [pc, #204] ; (802d750 <http_recv+0x318>)
  36885. 802d684: f7ff f8f8 bl 802c878 <HTTP_ConfirmWebPwd>
  36886. 802d688: 2800 cmp r0, #0
  36887. 802d68a: d173 bne.n 802d774 <http_recv+0x33c>
  36888. hs->file = sendBuf;
  36889. 802d68c: f8c4 8000 str.w r8, [r4]
  36890. hs->left = sendBufLoadLen;
  36891. 802d690: 8833 ldrh r3, [r6, #0]
  36892. 802d692: e076 b.n 802d782 <http_recv+0x34a>
  36893. /* request was fragmented before "\r\n\r\n" */
  36894. else {
  36895. //printf("no data found!\r\n");
  36896. /* wait next packet */
  36897. log_post_reqn++;
  36898. 802d694: 4e2d ldr r6, [pc, #180] ; (802d74c <http_recv+0x314>)
  36899. 802d696: 6833 ldr r3, [r6, #0]
  36900. 802d698: 3301 adds r3, #1
  36901. /* wait max 2 requests */
  36902. if (log_post_reqn > 1) {
  36903. 802d69a: 2b01 cmp r3, #1
  36904. /* request was fragmented before "\r\n\r\n" */
  36905. else {
  36906. //printf("no data found!\r\n");
  36907. /* wait next packet */
  36908. log_post_reqn++;
  36909. 802d69c: 6033 str r3, [r6, #0]
  36910. /* wait max 2 requests */
  36911. if (log_post_reqn > 1) {
  36912. 802d69e: f240 8403 bls.w 802dea8 <http_recv+0xa70>
  36913. /* Redirect to login page */
  36914. fs_open("/login.html", &file);
  36915. 802d6a2: a903 add r1, sp, #12
  36916. 802d6a4: 482e ldr r0, [pc, #184] ; (802d760 <http_recv+0x328>)
  36917. 802d6a6: f7fe fe8b bl 802c3c0 <fs_open>
  36918. hs->file = file.data;
  36919. 802d6aa: 9b03 ldr r3, [sp, #12]
  36920. 802d6ac: 6023 str r3, [r4, #0]
  36921. hs->left = file.len;
  36922. 802d6ae: 9b04 ldr r3, [sp, #16]
  36923. send_data(pcb, hs);
  36924. 802d6b0: 4628 mov r0, r5
  36925. /* wait max 2 requests */
  36926. if (log_post_reqn > 1) {
  36927. /* Redirect to login page */
  36928. fs_open("/login.html", &file);
  36929. hs->file = file.data;
  36930. hs->left = file.len;
  36931. 802d6b2: 6063 str r3, [r4, #4]
  36932. send_data(pcb, hs);
  36933. 802d6b4: 4621 mov r1, r4
  36934. 802d6b6: f7fe febf bl 802c438 <send_data>
  36935. tcp_sent(pcb, http_sent);
  36936. 802d6ba: 4628 mov r0, r5
  36937. 802d6bc: 4929 ldr r1, [pc, #164] ; (802d764 <http_recv+0x32c>)
  36938. 802d6be: f002 fdab bl 8030218 <tcp_sent>
  36939. /* End reqest */
  36940. post_data_count = 0;
  36941. 802d6c2: 4b29 ldr r3, [pc, #164] ; (802d768 <http_recv+0x330>)
  36942. log_post_reqn = 0;
  36943. 802d6c4: f8c6 8000 str.w r8, [r6]
  36944. hs->left = file.len;
  36945. send_data(pcb, hs);
  36946. tcp_sent(pcb, http_sent);
  36947. /* End reqest */
  36948. post_data_count = 0;
  36949. 802d6c8: f8c3 8000 str.w r8, [r3]
  36950. 802d6cc: e3ec b.n 802dea8 <http_recv+0xa70>
  36951. log_post_reqn = 0;
  36952. }
  36953. }
  36954. }
  36955. else {
  36956. printf("Too long POST request!\r\n");
  36957. 802d6ce: 4827 ldr r0, [pc, #156] ; (802d76c <http_recv+0x334>)
  36958. 802d6d0: f7fa fabe bl 8027c50 <tfp_printf>
  36959. /* Ignore request */
  36960. post_data_count = 0;
  36961. log_post_reqn = 0;
  36962. 802d6d4: 4a1d ldr r2, [pc, #116] ; (802d74c <http_recv+0x314>)
  36963. }
  36964. }
  36965. else {
  36966. printf("Too long POST request!\r\n");
  36967. /* Ignore request */
  36968. post_data_count = 0;
  36969. 802d6d6: 2300 movs r3, #0
  36970. 802d6d8: f8c8 3000 str.w r3, [r8]
  36971. log_post_reqn = 0;
  36972. 802d6dc: 6013 str r3, [r2, #0]
  36973. 802d6de: e05f b.n 802d7a0 <http_recv+0x368>
  36974. hs->left = file.len;
  36975. send_data(pcb, hs);
  36976. tcp_sent(pcb, http_sent);
  36977. }
  36978. }
  36979. else if (post_data_count > 0)
  36980. 802d6e0: 4b21 ldr r3, [pc, #132] ; (802d768 <http_recv+0x330>)
  36981. 802d6e2: 681a ldr r2, [r3, #0]
  36982. 802d6e4: 2a00 cmp r2, #0
  36983. 802d6e6: d05b beq.n 802d7a0 <http_recv+0x368>
  36984. {
  36985. strncat(post_req_data, data, post_data_count);
  36986. 802d6e8: 4631 mov r1, r6
  36987. 802d6ea: 4819 ldr r0, [pc, #100] ; (802d750 <http_recv+0x318>)
  36988. 802d6ec: f7f4 fd9c bl 8022228 <strncat>
  36989. //printf("copied: %d\r\n", (int)post_data_count);
  36990. //printf("post_req_data: %s\r\n", post_req_data);
  36991. if (HTTP_ConfirmWebPwd(post_req_data, sendBuf, strlen(post_req_data), &sendBufLoadLen) == SEND_REQUIRED_YES) {
  36992. 802d6f0: 4817 ldr r0, [pc, #92] ; (802d750 <http_recv+0x318>)
  36993. 802d6f2: f7f4 fd69 bl 80221c8 <strlen>
  36994. 802d6f6: 491e ldr r1, [pc, #120] ; (802d770 <http_recv+0x338>)
  36995. 802d6f8: 4b0e ldr r3, [pc, #56] ; (802d734 <http_recv+0x2fc>)
  36996. 802d6fa: b282 uxth r2, r0
  36997. 802d6fc: 4814 ldr r0, [pc, #80] ; (802d750 <http_recv+0x318>)
  36998. 802d6fe: f7ff f8bb bl 802c878 <HTTP_ConfirmWebPwd>
  36999. 802d702: bbb8 cbnz r0, 802d774 <http_recv+0x33c>
  37000. hs->file = sendBuf;
  37001. 802d704: 4b1a ldr r3, [pc, #104] ; (802d770 <http_recv+0x338>)
  37002. 802d706: 6023 str r3, [r4, #0]
  37003. hs->left = sendBufLoadLen;
  37004. 802d708: 4b0a ldr r3, [pc, #40] ; (802d734 <http_recv+0x2fc>)
  37005. 802d70a: 881b ldrh r3, [r3, #0]
  37006. 802d70c: e039 b.n 802d782 <http_recv+0x34a>
  37007. 802d70e: bf00 nop
  37008. 802d710: 0803fe82 .word 0x0803fe82
  37009. 802d714: 0803fe97 .word 0x0803fe97
  37010. 802d718: 20000d70 .word 0x20000d70
  37011. 802d71c: 20000d84 .word 0x20000d84
  37012. 802d720: 20000721 .word 0x20000721
  37013. 802d724: 2000eaa0 .word 0x2000eaa0
  37014. 802d728: 080402f4 .word 0x080402f4
  37015. 802d72c: 20000d5f .word 0x20000d5f
  37016. 802d730: 2000d414 .word 0x2000d414
  37017. 802d734: 20000d5c .word 0x20000d5c
  37018. 802d738: 080403a0 .word 0x080403a0
  37019. 802d73c: 080403ae .word 0x080403ae
  37020. 802d740: 080403bd .word 0x080403bd
  37021. 802d744: 080403ce .word 0x080403ce
  37022. 802d748: 080403db .word 0x080403db
  37023. 802d74c: 2000ea9c .word 0x2000ea9c
  37024. 802d750: 2000e99c .word 0x2000e99c
  37025. 802d754: 080405bd .word 0x080405bd
  37026. 802d758: 20000d88 .word 0x20000d88
  37027. 802d75c: 2000e3c0 .word 0x2000e3c0
  37028. 802d760: 080403eb .word 0x080403eb
  37029. 802d764: 0802c4ab .word 0x0802c4ab
  37030. 802d768: 2000eac8 .word 0x2000eac8
  37031. 802d76c: 080403f7 .word 0x080403f7
  37032. 802d770: 2000dbf0 .word 0x2000dbf0
  37033. tcp_sent(pcb, http_sent);
  37034. }
  37035. else {
  37036. /* Redirect to login page */
  37037. fs_open("/login.html", &file);
  37038. 802d774: 488f ldr r0, [pc, #572] ; (802d9b4 <http_recv+0x57c>)
  37039. 802d776: a903 add r1, sp, #12
  37040. 802d778: f7fe fe22 bl 802c3c0 <fs_open>
  37041. hs->file = file.data;
  37042. 802d77c: 9b03 ldr r3, [sp, #12]
  37043. 802d77e: 6023 str r3, [r4, #0]
  37044. hs->left = file.len;
  37045. 802d780: 9b04 ldr r3, [sp, #16]
  37046. 802d782: 6063 str r3, [r4, #4]
  37047. send_data(pcb, hs);
  37048. 802d784: 4628 mov r0, r5
  37049. 802d786: 4621 mov r1, r4
  37050. 802d788: f7fe fe56 bl 802c438 <send_data>
  37051. tcp_sent(pcb, http_sent);
  37052. 802d78c: 4628 mov r0, r5
  37053. 802d78e: 498a ldr r1, [pc, #552] ; (802d9b8 <http_recv+0x580>)
  37054. 802d790: f002 fd42 bl 8030218 <tcp_sent>
  37055. }
  37056. /* End reqest */
  37057. post_data_count = 0;
  37058. 802d794: 4a89 ldr r2, [pc, #548] ; (802d9bc <http_recv+0x584>)
  37059. 802d796: 2300 movs r3, #0
  37060. 802d798: 6013 str r3, [r2, #0]
  37061. log_post_reqn = 0;
  37062. 802d79a: 4a89 ldr r2, [pc, #548] ; (802d9c0 <http_recv+0x588>)
  37063. 802d79c: 6013 str r3, [r2, #0]
  37064. 802d79e: e383 b.n 802dea8 <http_recv+0xa70>
  37065. }
  37066. else
  37067. {
  37068. fs_open("/login.html", &file);
  37069. 802d7a0: 4884 ldr r0, [pc, #528] ; (802d9b4 <http_recv+0x57c>)
  37070. 802d7a2: e372 b.n 802de8a <http_recv+0xa52>
  37071. }
  37072. else if ( Authenticated == true ) {
  37073. if (strncmp(data, "GET /main.css", 13) == 0) // +
  37074. 802d7a4: 4630 mov r0, r6
  37075. 802d7a6: 4987 ldr r1, [pc, #540] ; (802d9c4 <http_recv+0x58c>)
  37076. 802d7a8: 220d movs r2, #13
  37077. 802d7aa: f7f4 fd6f bl 802228c <strncmp>
  37078. 802d7ae: b908 cbnz r0, 802d7b4 <http_recv+0x37c>
  37079. {
  37080. fs_open("/main.css", &file);
  37081. 802d7b0: 4885 ldr r0, [pc, #532] ; (802d9c8 <http_recv+0x590>)
  37082. 802d7b2: e36a b.n 802de8a <http_recv+0xa52>
  37083. hs->file = file.data;
  37084. hs->left = file.len;
  37085. send_data(pcb, hs);
  37086. tcp_sent(pcb, http_sent);
  37087. }
  37088. else if (strncmp(data, "GET /rotek.png", 14) == 0) // +
  37089. 802d7b4: 4630 mov r0, r6
  37090. 802d7b6: 4985 ldr r1, [pc, #532] ; (802d9cc <http_recv+0x594>)
  37091. 802d7b8: 220e movs r2, #14
  37092. 802d7ba: f7f4 fd67 bl 802228c <strncmp>
  37093. 802d7be: b908 cbnz r0, 802d7c4 <http_recv+0x38c>
  37094. {
  37095. fs_open("/rotek.png", &file);
  37096. 802d7c0: 4883 ldr r0, [pc, #524] ; (802d9d0 <http_recv+0x598>)
  37097. 802d7c2: e362 b.n 802de8a <http_recv+0xa52>
  37098. hs->file = file.data;
  37099. hs->left = file.len;
  37100. send_data(pcb, hs);
  37101. tcp_sent(pcb, http_sent);
  37102. }
  37103. else if (strncmp(data, "GET /favicon.ico", 16) == 0) // ?
  37104. 802d7c4: 4630 mov r0, r6
  37105. 802d7c6: 4983 ldr r1, [pc, #524] ; (802d9d4 <http_recv+0x59c>)
  37106. 802d7c8: 2210 movs r2, #16
  37107. 802d7ca: f7f4 fd5f bl 802228c <strncmp>
  37108. 802d7ce: b908 cbnz r0, 802d7d4 <http_recv+0x39c>
  37109. {
  37110. fs_open("/favicon.ico", &file);
  37111. 802d7d0: 4881 ldr r0, [pc, #516] ; (802d9d8 <http_recv+0x5a0>)
  37112. 802d7d2: e35a b.n 802de8a <http_recv+0xa52>
  37113. hs->file = file.data;
  37114. hs->left = file.len;
  37115. send_data(pcb, hs);
  37116. tcp_sent(pcb, http_sent);
  37117. }
  37118. else if (strncmp(data, "GET /main.js", 12) == 0) // +
  37119. 802d7d4: 4630 mov r0, r6
  37120. 802d7d6: 4981 ldr r1, [pc, #516] ; (802d9dc <http_recv+0x5a4>)
  37121. 802d7d8: 220c movs r2, #12
  37122. 802d7da: f7f4 fd57 bl 802228c <strncmp>
  37123. 802d7de: b908 cbnz r0, 802d7e4 <http_recv+0x3ac>
  37124. {
  37125. fs_open("/main.js", &file);
  37126. 802d7e0: 487f ldr r0, [pc, #508] ; (802d9e0 <http_recv+0x5a8>)
  37127. 802d7e2: e352 b.n 802de8a <http_recv+0xa52>
  37128. hs->left = file.len;
  37129. send_data(pcb, hs);
  37130. tcp_sent(pcb, http_sent);
  37131. }
  37132. else if (strncmp(data, "GET /role.js", 12) == 0)
  37133. 802d7e4: 4630 mov r0, r6
  37134. 802d7e6: 497f ldr r1, [pc, #508] ; (802d9e4 <http_recv+0x5ac>)
  37135. 802d7e8: 220c movs r2, #12
  37136. 802d7ea: f7f4 fd4f bl 802228c <strncmp>
  37137. 802d7ee: b908 cbnz r0, 802d7f4 <http_recv+0x3bc>
  37138. {
  37139. fs_open("/role.js", &file);
  37140. 802d7f0: 487d ldr r0, [pc, #500] ; (802d9e8 <http_recv+0x5b0>)
  37141. 802d7f2: e34a b.n 802de8a <http_recv+0xa52>
  37142. hs->left = file.len;
  37143. send_data(pcb, hs);
  37144. tcp_sent(pcb, http_sent);
  37145. }
  37146. else if (strncmp(data, "GET /settings.html", 18) == 0) // +
  37147. 802d7f4: 4630 mov r0, r6
  37148. 802d7f6: 497d ldr r1, [pc, #500] ; (802d9ec <http_recv+0x5b4>)
  37149. 802d7f8: 2212 movs r2, #18
  37150. 802d7fa: f7f4 fd47 bl 802228c <strncmp>
  37151. 802d7fe: b940 cbnz r0, 802d812 <http_recv+0x3da>
  37152. {
  37153. HTTP_UpdateUserLoginTime(user_id);
  37154. 802d800: 4640 mov r0, r8
  37155. 802d802: f7fe fdcb bl 802c39c <HTTP_UpdateUserLoginTime>
  37156. if (seclevel == 0){
  37157. 802d806: 4b7a ldr r3, [pc, #488] ; (802d9f0 <http_recv+0x5b8>)
  37158. 802d808: 781b ldrb r3, [r3, #0]
  37159. 802d80a: 2b00 cmp r3, #0
  37160. 802d80c: f040 833c bne.w 802de88 <http_recv+0xa50>
  37161. 802d810: e2eb b.n 802ddea <http_recv+0x9b2>
  37162. hs->left = file.len;
  37163. send_data(pcb, hs);
  37164. tcp_sent(pcb, http_sent);
  37165. }
  37166. }
  37167. else if (strncmp(data, "GET /info.html", 14) == 0) // +
  37168. 802d812: 4630 mov r0, r6
  37169. 802d814: 4977 ldr r1, [pc, #476] ; (802d9f4 <http_recv+0x5bc>)
  37170. 802d816: 220e movs r2, #14
  37171. 802d818: f7f4 fd38 bl 802228c <strncmp>
  37172. 802d81c: b920 cbnz r0, 802d828 <http_recv+0x3f0>
  37173. {
  37174. HTTP_UpdateUserLoginTime(user_id);
  37175. 802d81e: 4640 mov r0, r8
  37176. 802d820: f7fe fdbc bl 802c39c <HTTP_UpdateUserLoginTime>
  37177. fs_open("/info.html", &file);
  37178. 802d824: 4874 ldr r0, [pc, #464] ; (802d9f8 <http_recv+0x5c0>)
  37179. 802d826: e330 b.n 802de8a <http_recv+0xa52>
  37180. hs->file = file.data;
  37181. hs->left = file.len;
  37182. send_data(pcb, hs);
  37183. tcp_sent(pcb, http_sent);
  37184. }
  37185. else if (strncmp(data, "GET /history.html", 17) == 0)
  37186. 802d828: 4630 mov r0, r6
  37187. 802d82a: 4974 ldr r1, [pc, #464] ; (802d9fc <http_recv+0x5c4>)
  37188. 802d82c: 2211 movs r2, #17
  37189. 802d82e: f7f4 fd2d bl 802228c <strncmp>
  37190. 802d832: b920 cbnz r0, 802d83e <http_recv+0x406>
  37191. {
  37192. HTTP_UpdateUserLoginTime(user_id);
  37193. 802d834: 4640 mov r0, r8
  37194. 802d836: f7fe fdb1 bl 802c39c <HTTP_UpdateUserLoginTime>
  37195. fs_open("/history.html", &file);
  37196. 802d83a: 4871 ldr r0, [pc, #452] ; (802da00 <http_recv+0x5c8>)
  37197. 802d83c: e325 b.n 802de8a <http_recv+0xa52>
  37198. hs->file = file.data;
  37199. hs->left = file.len;
  37200. send_data(pcb, hs);
  37201. tcp_sent(pcb, http_sent);
  37202. }
  37203. else if (strncmp(data, "GET /ups_history.html", 21) == 0)
  37204. 802d83e: 4630 mov r0, r6
  37205. 802d840: 4970 ldr r1, [pc, #448] ; (802da04 <http_recv+0x5cc>)
  37206. 802d842: 2215 movs r2, #21
  37207. 802d844: f7f4 fd22 bl 802228c <strncmp>
  37208. 802d848: b920 cbnz r0, 802d854 <http_recv+0x41c>
  37209. {
  37210. HTTP_UpdateUserLoginTime(user_id);
  37211. 802d84a: 4640 mov r0, r8
  37212. 802d84c: f7fe fda6 bl 802c39c <HTTP_UpdateUserLoginTime>
  37213. fs_open("/ups_history.html", &file);
  37214. 802d850: 486d ldr r0, [pc, #436] ; (802da08 <http_recv+0x5d0>)
  37215. 802d852: e31a b.n 802de8a <http_recv+0xa52>
  37216. hs->file = file.data;
  37217. hs->left = file.len;
  37218. send_data(pcb, hs);
  37219. tcp_sent(pcb, http_sent);
  37220. }
  37221. else if (strncmp(data, "GET /getJson.cgi", 16) == 0) // +
  37222. 802d854: 4630 mov r0, r6
  37223. 802d856: 496d ldr r1, [pc, #436] ; (802da0c <http_recv+0x5d4>)
  37224. 802d858: 2210 movs r2, #16
  37225. 802d85a: f7f4 fd17 bl 802228c <strncmp>
  37226. 802d85e: b940 cbnz r0, 802d872 <http_recv+0x43a>
  37227. {
  37228. HTTP_GetParamsPage1(sendBuf);
  37229. 802d860: 4e6b ldr r6, [pc, #428] ; (802da10 <http_recv+0x5d8>)
  37230. 802d862: 4630 mov r0, r6
  37231. 802d864: f000 fb50 bl 802df08 <HTTP_GetParamsPage1>
  37232. hs->file = sendBuf;
  37233. 802d868: 6026 str r6, [r4, #0]
  37234. hs->left = strlen(sendBuf);
  37235. 802d86a: 4630 mov r0, r6
  37236. 802d86c: f7f4 fcac bl 80221c8 <strlen>
  37237. 802d870: e131 b.n 802dad6 <http_recv+0x69e>
  37238. send_data(pcb, hs);
  37239. tcp_sent(pcb, http_sent);
  37240. }
  37241. else if (strncmp(data, "GET /settings.cgi", 17) == 0) // +
  37242. 802d872: 4630 mov r0, r6
  37243. 802d874: 4967 ldr r1, [pc, #412] ; (802da14 <http_recv+0x5dc>)
  37244. 802d876: 2211 movs r2, #17
  37245. 802d878: f7f4 fd08 bl 802228c <strncmp>
  37246. 802d87c: b990 cbnz r0, 802d8a4 <http_recv+0x46c>
  37247. {
  37248. if (seclevel == 0) {
  37249. 802d87e: 4b5c ldr r3, [pc, #368] ; (802d9f0 <http_recv+0x5b8>)
  37250. 802d880: 781b ldrb r3, [r3, #0]
  37251. 802d882: 2b00 cmp r3, #0
  37252. 802d884: f040 8310 bne.w 802dea8 <http_recv+0xa70>
  37253. SET_PAGE = SET_PAGE_PAGE2;
  37254. 802d888: 4b63 ldr r3, [pc, #396] ; (802da18 <http_recv+0x5e0>)
  37255. if (HTTP_SettingsPage(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen) == SEND_REQUIRED_YES)
  37256. 802d88a: f8df 8184 ldr.w r8, [pc, #388] ; 802da10 <http_recv+0x5d8>
  37257. 802d88e: 4e63 ldr r6, [pc, #396] ; (802da1c <http_recv+0x5e4>)
  37258. 802d890: 4863 ldr r0, [pc, #396] ; (802da20 <http_recv+0x5e8>)
  37259. tcp_sent(pcb, http_sent);
  37260. }
  37261. else if (strncmp(data, "GET /settings.cgi", 17) == 0) // +
  37262. {
  37263. if (seclevel == 0) {
  37264. SET_PAGE = SET_PAGE_PAGE2;
  37265. 802d892: 2202 movs r2, #2
  37266. 802d894: 701a strb r2, [r3, #0]
  37267. if (HTTP_SettingsPage(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen) == SEND_REQUIRED_YES)
  37268. 802d896: 4b63 ldr r3, [pc, #396] ; (802da24 <http_recv+0x5ec>)
  37269. 802d898: 4641 mov r1, r8
  37270. 802d89a: 881a ldrh r2, [r3, #0]
  37271. 802d89c: 4633 mov r3, r6
  37272. 802d89e: f7fe ff0b bl 802c6b8 <HTTP_SettingsPage>
  37273. 802d8a2: e12a b.n 802dafa <http_recv+0x6c2>
  37274. send_data(pcb, hs);
  37275. tcp_sent(pcb, http_sent);
  37276. }*/
  37277. }
  37278. }
  37279. else if (strncmp(data, "POST /settings.cgi", 18) == 0 || (DataFlag2 >= 1))
  37280. 802d8a4: 4630 mov r0, r6
  37281. 802d8a6: 4960 ldr r1, [pc, #384] ; (802da28 <http_recv+0x5f0>)
  37282. 802d8a8: 2212 movs r2, #18
  37283. 802d8aa: f7f4 fcef bl 802228c <strncmp>
  37284. 802d8ae: b120 cbz r0, 802d8ba <http_recv+0x482>
  37285. 802d8b0: 4b5e ldr r3, [pc, #376] ; (802da2c <http_recv+0x5f4>)
  37286. 802d8b2: 681b ldr r3, [r3, #0]
  37287. 802d8b4: 2b00 cmp r3, #0
  37288. 802d8b6: f000 8110 beq.w 802dada <http_recv+0x6a2>
  37289. {
  37290. if (seclevel == 0) {
  37291. 802d8ba: 4b4d ldr r3, [pc, #308] ; (802d9f0 <http_recv+0x5b8>)
  37292. 802d8bc: 781a ldrb r2, [r3, #0]
  37293. 802d8be: 2a00 cmp r2, #0
  37294. 802d8c0: f040 82f2 bne.w 802dea8 <http_recv+0xa70>
  37295. DataOffset = 0;
  37296. /* POST Packet received */
  37297. if (DataFlag2 == 0)
  37298. 802d8c4: 4b59 ldr r3, [pc, #356] ; (802da2c <http_recv+0x5f4>)
  37299. 802d8c6: f8d3 8000 ldr.w r8, [r3]
  37300. 802d8ca: f1b8 0f00 cmp.w r8, #0
  37301. 802d8ce: d12f bne.n 802d930 <http_recv+0x4f8>
  37302. {
  37303. BrowserFlag = 0;
  37304. 802d8d0: 4b57 ldr r3, [pc, #348] ; (802da30 <http_recv+0x5f8>)
  37305. TotalReceived = 0;
  37306. memset(sendBuf, 0, strlen(sendBuf));
  37307. 802d8d2: 484f ldr r0, [pc, #316] ; (802da10 <http_recv+0x5d8>)
  37308. DataOffset = 0;
  37309. /* POST Packet received */
  37310. if (DataFlag2 == 0)
  37311. {
  37312. BrowserFlag = 0;
  37313. 802d8d4: f8c3 8000 str.w r8, [r3]
  37314. TotalReceived = 0;
  37315. 802d8d8: 4b56 ldr r3, [pc, #344] ; (802da34 <http_recv+0x5fc>)
  37316. /* parse packet for Content-length field */
  37317. size = Parse_Content_Length(data, p->tot_len);
  37318. /* parse packet for the octet-stream field */
  37319. for (i = 0; i < receivedBufLen; i++)
  37320. 802d8da: f8df 9148 ldr.w r9, [pc, #328] ; 802da24 <http_recv+0x5ec>
  37321. /* POST Packet received */
  37322. if (DataFlag2 == 0)
  37323. {
  37324. BrowserFlag = 0;
  37325. TotalReceived = 0;
  37326. 802d8de: f8c3 8000 str.w r8, [r3]
  37327. memset(sendBuf, 0, strlen(sendBuf));
  37328. 802d8e2: f7f4 fc71 bl 80221c8 <strlen>
  37329. 802d8e6: 4641 mov r1, r8
  37330. 802d8e8: 4602 mov r2, r0
  37331. 802d8ea: 4849 ldr r0, [pc, #292] ; (802da10 <http_recv+0x5d8>)
  37332. 802d8ec: f7f4 fa94 bl 8021e18 <memset>
  37333. /* parse packet for Content-length field */
  37334. size = Parse_Content_Length(data, p->tot_len);
  37335. 802d8f0: 4630 mov r0, r6
  37336. 802d8f2: 8939 ldrh r1, [r7, #8]
  37337. 802d8f4: f7fe fd16 bl 802c324 <Parse_Content_Length>
  37338. 802d8f8: 4b4f ldr r3, [pc, #316] ; (802da38 <http_recv+0x600>)
  37339. 802d8fa: 6018 str r0, [r3, #0]
  37340. /* parse packet for the octet-stream field */
  37341. for (i = 0; i < receivedBufLen; i++)
  37342. 802d8fc: e008 b.n 802d910 <http_recv+0x4d8>
  37343. {
  37344. if (strncmp ((char*)(data+i), "managerIP", 8)==0)
  37345. 802d8fe: eb06 0008 add.w r0, r6, r8
  37346. 802d902: 494e ldr r1, [pc, #312] ; (802da3c <http_recv+0x604>)
  37347. 802d904: 2208 movs r2, #8
  37348. 802d906: f7f4 fcc1 bl 802228c <strncmp>
  37349. 802d90a: b138 cbz r0, 802d91c <http_recv+0x4e4>
  37350. /* parse packet for Content-length field */
  37351. size = Parse_Content_Length(data, p->tot_len);
  37352. /* parse packet for the octet-stream field */
  37353. for (i = 0; i < receivedBufLen; i++)
  37354. 802d90c: f108 0801 add.w r8, r8, #1
  37355. 802d910: f8b9 3000 ldrh.w r3, [r9]
  37356. 802d914: 4598 cmp r8, r3
  37357. 802d916: d3f2 bcc.n 802d8fe <http_recv+0x4c6>
  37358. }
  37359. }
  37360. /* case of MSIE8 : we do not receive data in the POST packet*/
  37361. if (DataOffset == 0)
  37362. {
  37363. DataFlag2++;
  37364. 802d918: 4b44 ldr r3, [pc, #272] ; (802da2c <http_recv+0x5f4>)
  37365. 802d91a: e12d b.n 802db78 <http_recv+0x740>
  37366. DataOffset = i;
  37367. break;
  37368. }
  37369. }
  37370. /* case of MSIE8 : we do not receive data in the POST packet*/
  37371. if (DataOffset == 0)
  37372. 802d91c: f1b8 0f00 cmp.w r8, #0
  37373. 802d920: d0fa beq.n 802d918 <http_recv+0x4e0>
  37374. }
  37375. /* case of Mozilla Firefox v3.6 : we receive data in the POST packet*/
  37376. else
  37377. {
  37378. //TotalReceived = receivedBufLen - (ContentLengthOffset + 4);
  37379. TotalReceived = receivedBufLen - DataOffset;
  37380. 802d922: 4b40 ldr r3, [pc, #256] ; (802da24 <http_recv+0x5ec>)
  37381. 802d924: 881a ldrh r2, [r3, #0]
  37382. 802d926: 4b43 ldr r3, [pc, #268] ; (802da34 <http_recv+0x5fc>)
  37383. 802d928: ebc8 0202 rsb r2, r8, r2
  37384. 802d92c: 601a str r2, [r3, #0]
  37385. 802d92e: e000 b.n 802d932 <http_recv+0x4fa>
  37386. }
  37387. }
  37388. else if (strncmp(data, "POST /settings.cgi", 18) == 0 || (DataFlag2 >= 1))
  37389. {
  37390. if (seclevel == 0) {
  37391. DataOffset = 0;
  37392. 802d930: 4690 mov r8, r2
  37393. {
  37394. //TotalReceived = receivedBufLen - (ContentLengthOffset + 4);
  37395. TotalReceived = receivedBufLen - DataOffset;
  37396. }
  37397. }
  37398. if (((DataFlag2 ==1)&&(BrowserFlag==1)) || ((DataFlag2 ==0)&&(BrowserFlag==0)))
  37399. 802d932: 4b3e ldr r3, [pc, #248] ; (802da2c <http_recv+0x5f4>)
  37400. 802d934: 681a ldr r2, [r3, #0]
  37401. 802d936: 2a01 cmp r2, #1
  37402. 802d938: d103 bne.n 802d942 <http_recv+0x50a>
  37403. 802d93a: 4a3d ldr r2, [pc, #244] ; (802da30 <http_recv+0x5f8>)
  37404. 802d93c: 6812 ldr r2, [r2, #0]
  37405. 802d93e: 2a01 cmp r2, #1
  37406. 802d940: d006 beq.n 802d950 <http_recv+0x518>
  37407. 802d942: 681b ldr r3, [r3, #0]
  37408. 802d944: 2b00 cmp r3, #0
  37409. 802d946: d17d bne.n 802da44 <http_recv+0x60c>
  37410. 802d948: 4b39 ldr r3, [pc, #228] ; (802da30 <http_recv+0x5f8>)
  37411. 802d94a: 681b ldr r3, [r3, #0]
  37412. 802d94c: 2b00 cmp r3, #0
  37413. 802d94e: d179 bne.n 802da44 <http_recv+0x60c>
  37414. {
  37415. if ((DataFlag2 ==0)&&(BrowserFlag==0))
  37416. 802d950: 4b36 ldr r3, [pc, #216] ; (802da2c <http_recv+0x5f4>)
  37417. 802d952: 6819 ldr r1, [r3, #0]
  37418. 802d954: 461a mov r2, r3
  37419. 802d956: b919 cbnz r1, 802d960 <http_recv+0x528>
  37420. 802d958: 4935 ldr r1, [pc, #212] ; (802da30 <http_recv+0x5f8>)
  37421. 802d95a: 6809 ldr r1, [r1, #0]
  37422. 802d95c: b901 cbnz r1, 802d960 <http_recv+0x528>
  37423. 802d95e: e022 b.n 802d9a6 <http_recv+0x56e>
  37424. {
  37425. DataFlag2++;
  37426. }
  37427. else if ((DataFlag2 ==1)&&(BrowserFlag==1))
  37428. 802d960: 6813 ldr r3, [r2, #0]
  37429. 802d962: 2b01 cmp r3, #1
  37430. 802d964: d122 bne.n 802d9ac <http_recv+0x574>
  37431. 802d966: 4b32 ldr r3, [pc, #200] ; (802da30 <http_recv+0x5f8>)
  37432. 802d968: 681b ldr r3, [r3, #0]
  37433. 802d96a: 2b01 cmp r3, #1
  37434. 802d96c: d11e bne.n 802d9ac <http_recv+0x574>
  37435. 802d96e: e009 b.n 802d984 <http_recv+0x54c>
  37436. {
  37437. /* parse packet for the octet-stream field */
  37438. for (i = 0; i < receivedBufLen; i++)
  37439. {
  37440. if (strncmp ((char*)(data+i), "managerIP", 8)==0)
  37441. 802d970: eb06 0009 add.w r0, r6, r9
  37442. 802d974: 4931 ldr r1, [pc, #196] ; (802da3c <http_recv+0x604>)
  37443. 802d976: 2208 movs r2, #8
  37444. 802d978: f7f4 fc88 bl 802228c <strncmp>
  37445. 802d97c: b158 cbz r0, 802d996 <http_recv+0x55e>
  37446. DataFlag2++;
  37447. }
  37448. else if ((DataFlag2 ==1)&&(BrowserFlag==1))
  37449. {
  37450. /* parse packet for the octet-stream field */
  37451. for (i = 0; i < receivedBufLen; i++)
  37452. 802d97e: f109 0901 add.w r9, r9, #1
  37453. 802d982: e003 b.n 802d98c <http_recv+0x554>
  37454. 802d984: f8df a09c ldr.w sl, [pc, #156] ; 802da24 <http_recv+0x5ec>
  37455. {
  37456. if ((DataFlag2 ==0)&&(BrowserFlag==0))
  37457. {
  37458. DataFlag2++;
  37459. }
  37460. else if ((DataFlag2 ==1)&&(BrowserFlag==1))
  37461. 802d988: f04f 0900 mov.w r9, #0
  37462. {
  37463. /* parse packet for the octet-stream field */
  37464. for (i = 0; i < receivedBufLen; i++)
  37465. 802d98c: f8ba 3000 ldrh.w r3, [sl]
  37466. 802d990: 4599 cmp r9, r3
  37467. 802d992: d3ed bcc.n 802d970 <http_recv+0x538>
  37468. 802d994: e000 b.n 802d998 <http_recv+0x560>
  37469. {
  37470. if (strncmp ((char*)(data+i), "managerIP", 8)==0)
  37471. 802d996: 46c8 mov r8, r9
  37472. {
  37473. DataOffset = i;
  37474. break;
  37475. }
  37476. }
  37477. TotalReceived += receivedBufLen;
  37478. 802d998: 4b26 ldr r3, [pc, #152] ; (802da34 <http_recv+0x5fc>)
  37479. 802d99a: 4a22 ldr r2, [pc, #136] ; (802da24 <http_recv+0x5ec>)
  37480. 802d99c: 8811 ldrh r1, [r2, #0]
  37481. 802d99e: 681a ldr r2, [r3, #0]
  37482. 802d9a0: 188a adds r2, r1, r2
  37483. 802d9a2: 601a str r2, [r3, #0]
  37484. DataFlag2++;
  37485. 802d9a4: 4b21 ldr r3, [pc, #132] ; (802da2c <http_recv+0x5f4>)
  37486. 802d9a6: 681a ldr r2, [r3, #0]
  37487. 802d9a8: 3201 adds r2, #1
  37488. 802d9aa: 601a str r2, [r3, #0]
  37489. }
  37490. TotalData =0 ;
  37491. 802d9ac: 2200 movs r2, #0
  37492. 802d9ae: 4b24 ldr r3, [pc, #144] ; (802da40 <http_recv+0x608>)
  37493. 802d9b0: e04d b.n 802da4e <http_recv+0x616>
  37494. 802d9b2: bf00 nop
  37495. 802d9b4: 080403eb .word 0x080403eb
  37496. 802d9b8: 0802c4ab .word 0x0802c4ab
  37497. 802d9bc: 2000eac8 .word 0x2000eac8
  37498. 802d9c0: 2000ea9c .word 0x2000ea9c
  37499. 802d9c4: 080403a0 .word 0x080403a0
  37500. 802d9c8: 080403a4 .word 0x080403a4
  37501. 802d9cc: 080403ae .word 0x080403ae
  37502. 802d9d0: 080403b2 .word 0x080403b2
  37503. 802d9d4: 080403bd .word 0x080403bd
  37504. 802d9d8: 080403c1 .word 0x080403c1
  37505. 802d9dc: 08040410 .word 0x08040410
  37506. 802d9e0: 08040414 .word 0x08040414
  37507. 802d9e4: 080403ce .word 0x080403ce
  37508. 802d9e8: 080403d2 .word 0x080403d2
  37509. 802d9ec: 0804041d .word 0x0804041d
  37510. 802d9f0: 20000721 .word 0x20000721
  37511. 802d9f4: 0804043c .word 0x0804043c
  37512. 802d9f8: 08040440 .word 0x08040440
  37513. 802d9fc: 0804044b .word 0x0804044b
  37514. 802da00: 0804044f .word 0x0804044f
  37515. 802da04: 0804045d .word 0x0804045d
  37516. 802da08: 08040461 .word 0x08040461
  37517. 802da0c: 08040473 .word 0x08040473
  37518. 802da10: 2000dbf0 .word 0x2000dbf0
  37519. 802da14: 08040484 .word 0x08040484
  37520. 802da18: 20000d5e .word 0x20000d5e
  37521. 802da1c: 20000d5c .word 0x20000d5c
  37522. 802da20: 2000e3c0 .word 0x2000e3c0
  37523. 802da24: 20000d88 .word 0x20000d88
  37524. 802da28: 08040496 .word 0x08040496
  37525. 802da2c: 20000d84 .word 0x20000d84
  37526. 802da30: 20000d64 .word 0x20000d64
  37527. 802da34: 20000d7c .word 0x20000d7c
  37528. 802da38: 20000d80 .word 0x20000d80
  37529. 802da3c: 080404a9 .word 0x080404a9
  37530. 802da40: 20000d74 .word 0x20000d74
  37531. }
  37532. /* DataFlag >1 => the packet is data only */
  37533. else
  37534. {
  37535. TotalReceived +=receivedBufLen;
  37536. 802da44: 4a99 ldr r2, [pc, #612] ; (802dcac <http_recv+0x874>)
  37537. 802da46: 4b9a ldr r3, [pc, #616] ; (802dcb0 <http_recv+0x878>)
  37538. 802da48: 8811 ldrh r1, [r2, #0]
  37539. 802da4a: 681a ldr r2, [r3, #0]
  37540. 802da4c: 188a adds r2, r1, r2
  37541. 802da4e: 601a str r2, [r3, #0]
  37542. }
  37543. ptr = (char*)(data + DataOffset);
  37544. receivedBufLen-= DataOffset;
  37545. 802da50: 4b96 ldr r3, [pc, #600] ; (802dcac <http_recv+0x874>)
  37546. 802da52: 881a ldrh r2, [r3, #0]
  37547. else
  37548. {
  37549. TotalReceived +=receivedBufLen;
  37550. }
  37551. ptr = (char*)(data + DataOffset);
  37552. 802da54: eb06 0108 add.w r1, r6, r8
  37553. receivedBufLen-= DataOffset;
  37554. 802da58: ebc8 0802 rsb r8, r8, r2
  37555. 802da5c: fa1f f288 uxth.w r2, r8
  37556. 802da60: 801a strh r2, [r3, #0]
  37557. /* update Total data received counter */
  37558. TotalData +=receivedBufLen;
  37559. 802da62: 4b94 ldr r3, [pc, #592] ; (802dcb4 <http_recv+0x87c>)
  37560. /* check if last data packet */
  37561. if (TotalReceived == size)
  37562. 802da64: f8df 8284 ldr.w r8, [pc, #644] ; 802dcec <http_recv+0x8b4>
  37563. ptr = (char*)(data + DataOffset);
  37564. receivedBufLen-= DataOffset;
  37565. /* update Total data received counter */
  37566. TotalData +=receivedBufLen;
  37567. 802da68: 6818 ldr r0, [r3, #0]
  37568. 802da6a: 1810 adds r0, r2, r0
  37569. 802da6c: 6018 str r0, [r3, #0]
  37570. /* check if last data packet */
  37571. if (TotalReceived == size)
  37572. 802da6e: 4890 ldr r0, [pc, #576] ; (802dcb0 <http_recv+0x878>)
  37573. 802da70: f8d8 3000 ldr.w r3, [r8]
  37574. 802da74: 6800 ldr r0, [r0, #0]
  37575. 802da76: 4298 cmp r0, r3
  37576. 802da78: f040 8110 bne.w 802dc9c <http_recv+0x864>
  37577. {
  37578. //DBG printf("State: Received %d bytes\r\n", (int)TotalReceived);
  37579. strncat(&sendBuf, ptr, receivedBufLen);
  37580. 802da7c: 4e8e ldr r6, [pc, #568] ; (802dcb8 <http_recv+0x880>)
  37581. 802da7e: 4630 mov r0, r6
  37582. 802da80: f7f4 fbd2 bl 8022228 <strncat>
  37583. strncat(&sendBuf, " ", 1);
  37584. 802da84: 2201 movs r2, #1
  37585. 802da86: 498d ldr r1, [pc, #564] ; (802dcbc <http_recv+0x884>)
  37586. 802da88: 4630 mov r0, r6
  37587. 802da8a: f7f4 fbcd bl 8022228 <strncat>
  37588. //ВBG printf("receive %s /r/n", sendBuf);
  37589. HTTP_SetSettings(sendBuf, strlen(&sendBuf));
  37590. 802da8e: 4630 mov r0, r6
  37591. 802da90: f7f4 fb9a bl 80221c8 <strlen>
  37592. 802da94: b281 uxth r1, r0
  37593. 802da96: 4630 mov r0, r6
  37594. 802da98: f7ff f8f4 bl 802cc84 <HTTP_SetSettings>
  37595. DataFlag2=0;
  37596. 802da9c: 4b88 ldr r3, [pc, #544] ; (802dcc0 <http_recv+0x888>)
  37597. 802da9e: 2100 movs r1, #0
  37598. 802daa0: 6019 str r1, [r3, #0]
  37599. BrowserFlag = 0;
  37600. 802daa2: 4b88 ldr r3, [pc, #544] ; (802dcc4 <http_recv+0x88c>)
  37601. memset(sendBuf, 0, size);
  37602. 802daa4: f8d8 2000 ldr.w r2, [r8]
  37603. strncat(&sendBuf, " ", 1);
  37604. //ВBG printf("receive %s /r/n", sendBuf);
  37605. HTTP_SetSettings(sendBuf, strlen(&sendBuf));
  37606. DataFlag2=0;
  37607. BrowserFlag = 0;
  37608. 802daa8: 6019 str r1, [r3, #0]
  37609. memset(sendBuf, 0, size);
  37610. 802daaa: 4630 mov r0, r6
  37611. 802daac: f7f4 f9b4 bl 8021e18 <memset>
  37612. strcpy(sendBuf, "HTTP/1.1 200 OK\r\n");
  37613. 802dab0: 4985 ldr r1, [pc, #532] ; (802dcc8 <http_recv+0x890>)
  37614. 802dab2: 4630 mov r0, r6
  37615. 802dab4: f7f4 fb2a bl 802210c <strcpy>
  37616. strcat(sendBuf, "\r\n\r\n");
  37617. 802dab8: 4984 ldr r1, [pc, #528] ; (802dccc <http_recv+0x894>)
  37618. 802daba: 4630 mov r0, r6
  37619. 802dabc: f7f4 fa12 bl 8021ee4 <strcat>
  37620. strcat(sendBuf,"<!DOCTYPE html><html lang=""><head><meta http-equiv=\"refresh\" content=\"0;url=/settings.html\"/></head></html>\r\n\r\n");
  37621. 802dac0: 4983 ldr r1, [pc, #524] ; (802dcd0 <http_recv+0x898>)
  37622. 802dac2: 4630 mov r0, r6
  37623. 802dac4: f7f4 fa0e bl 8021ee4 <strcat>
  37624. sendBufLoadLen = strlen(sendBuf);
  37625. 802dac8: 4630 mov r0, r6
  37626. 802daca: f7f4 fb7d bl 80221c8 <strlen>
  37627. 802dace: 4b81 ldr r3, [pc, #516] ; (802dcd4 <http_recv+0x89c>)
  37628. 802dad0: 8018 strh r0, [r3, #0]
  37629. hs->file = sendBuf;
  37630. 802dad2: 6026 str r6, [r4, #0]
  37631. hs->left = sendBufLoadLen;
  37632. 802dad4: b280 uxth r0, r0
  37633. 802dad6: 6060 str r0, [r4, #4]
  37634. 802dad8: e1de b.n 802de98 <http_recv+0xa60>
  37635. //memcpy(receiveBufTemp, ptr, receivedBufLen);
  37636. }
  37637. }
  37638. }
  37639. }
  37640. else if (strncmp(data, "GET /info.cgi", 13) == 0) // +
  37641. 802dada: 4630 mov r0, r6
  37642. 802dadc: 497e ldr r1, [pc, #504] ; (802dcd8 <http_recv+0x8a0>)
  37643. 802dade: 220d movs r2, #13
  37644. 802dae0: f7f4 fbd4 bl 802228c <strncmp>
  37645. 802dae4: b968 cbnz r0, 802db02 <http_recv+0x6ca>
  37646. {
  37647. if (HTTP_InfoPage(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen) == SEND_REQUIRED_YES)
  37648. 802dae6: 4b71 ldr r3, [pc, #452] ; (802dcac <http_recv+0x874>)
  37649. 802dae8: f8df 81cc ldr.w r8, [pc, #460] ; 802dcb8 <http_recv+0x880>
  37650. 802daec: 4e79 ldr r6, [pc, #484] ; (802dcd4 <http_recv+0x89c>)
  37651. 802daee: 881a ldrh r2, [r3, #0]
  37652. 802daf0: 487a ldr r0, [pc, #488] ; (802dcdc <http_recv+0x8a4>)
  37653. 802daf2: 4641 mov r1, r8
  37654. 802daf4: 4633 mov r3, r6
  37655. 802daf6: f7fe fe03 bl 802c700 <HTTP_InfoPage>
  37656. 802dafa: 2800 cmp r0, #0
  37657. 802dafc: f040 81d4 bne.w 802dea8 <http_recv+0xa70>
  37658. 802db00: e1bb b.n 802de7a <http_recv+0xa42>
  37659. hs->left = file.len;
  37660. send_data(pcb, hs);
  37661. tcp_sent(pcb, http_sent);
  37662. }*/
  37663. }
  37664. else if (strncmp(data, "POST /info.cgi", 14) == 0 || (DataFlag >= 1))
  37665. 802db02: 4630 mov r0, r6
  37666. 802db04: 4976 ldr r1, [pc, #472] ; (802dce0 <http_recv+0x8a8>)
  37667. 802db06: 220e movs r2, #14
  37668. 802db08: f7f4 fbc0 bl 802228c <strncmp>
  37669. 802db0c: b120 cbz r0, 802db18 <http_recv+0x6e0>
  37670. 802db0e: 4b75 ldr r3, [pc, #468] ; (802dce4 <http_recv+0x8ac>)
  37671. 802db10: 681b ldr r3, [r3, #0]
  37672. 802db12: 2b00 cmp r3, #0
  37673. 802db14: f000 80f0 beq.w 802dcf8 <http_recv+0x8c0>
  37674. {
  37675. if (seclevel == 0) {
  37676. 802db18: 4b73 ldr r3, [pc, #460] ; (802dce8 <http_recv+0x8b0>)
  37677. 802db1a: 781a ldrb r2, [r3, #0]
  37678. 802db1c: 2a00 cmp r2, #0
  37679. 802db1e: f040 81c3 bne.w 802dea8 <http_recv+0xa70>
  37680. DataOffset = 0;
  37681. /* POST Packet received */
  37682. if (DataFlag == 0)
  37683. 802db22: 4b70 ldr r3, [pc, #448] ; (802dce4 <http_recv+0x8ac>)
  37684. 802db24: f8d3 8000 ldr.w r8, [r3]
  37685. 802db28: f1b8 0f00 cmp.w r8, #0
  37686. 802db2c: d135 bne.n 802db9a <http_recv+0x762>
  37687. {
  37688. BrowserFlag = 0;
  37689. 802db2e: 4b65 ldr r3, [pc, #404] ; (802dcc4 <http_recv+0x88c>)
  37690. TotalReceived = 0;
  37691. memset(sendBuf, 0, strlen(sendBuf));
  37692. 802db30: 4861 ldr r0, [pc, #388] ; (802dcb8 <http_recv+0x880>)
  37693. DataOffset = 0;
  37694. /* POST Packet received */
  37695. if (DataFlag == 0)
  37696. {
  37697. BrowserFlag = 0;
  37698. 802db32: f8c3 8000 str.w r8, [r3]
  37699. TotalReceived = 0;
  37700. 802db36: 4b5e ldr r3, [pc, #376] ; (802dcb0 <http_recv+0x878>)
  37701. /* parse packet for Content-length field */
  37702. size = Parse_Content_Length(data, p->tot_len);
  37703. /* parse packet for the octet-stream field */
  37704. for (i = 0; i < receivedBufLen; i++)
  37705. 802db38: f8df 9170 ldr.w r9, [pc, #368] ; 802dcac <http_recv+0x874>
  37706. /* POST Packet received */
  37707. if (DataFlag == 0)
  37708. {
  37709. BrowserFlag = 0;
  37710. TotalReceived = 0;
  37711. 802db3c: f8c3 8000 str.w r8, [r3]
  37712. memset(sendBuf, 0, strlen(sendBuf));
  37713. 802db40: f7f4 fb42 bl 80221c8 <strlen>
  37714. 802db44: 4641 mov r1, r8
  37715. 802db46: 4602 mov r2, r0
  37716. 802db48: 485b ldr r0, [pc, #364] ; (802dcb8 <http_recv+0x880>)
  37717. 802db4a: f7f4 f965 bl 8021e18 <memset>
  37718. /* parse packet for Content-length field */
  37719. size = Parse_Content_Length(data, p->tot_len);
  37720. 802db4e: 4630 mov r0, r6
  37721. 802db50: 8939 ldrh r1, [r7, #8]
  37722. 802db52: f7fe fbe7 bl 802c324 <Parse_Content_Length>
  37723. 802db56: 4b65 ldr r3, [pc, #404] ; (802dcec <http_recv+0x8b4>)
  37724. 802db58: 6018 str r0, [r3, #0]
  37725. /* parse packet for the octet-stream field */
  37726. for (i = 0; i < receivedBufLen; i++)
  37727. 802db5a: e008 b.n 802db6e <http_recv+0x736>
  37728. {
  37729. if (strncmp ((char*)(data+i), "owner", 5)==0)
  37730. 802db5c: eb06 0008 add.w r0, r6, r8
  37731. 802db60: 4963 ldr r1, [pc, #396] ; (802dcf0 <http_recv+0x8b8>)
  37732. 802db62: 2205 movs r2, #5
  37733. 802db64: f7f4 fb92 bl 802228c <strncmp>
  37734. 802db68: b168 cbz r0, 802db86 <http_recv+0x74e>
  37735. /* parse packet for Content-length field */
  37736. size = Parse_Content_Length(data, p->tot_len);
  37737. /* parse packet for the octet-stream field */
  37738. for (i = 0; i < receivedBufLen; i++)
  37739. 802db6a: f108 0801 add.w r8, r8, #1
  37740. 802db6e: f8b9 3000 ldrh.w r3, [r9]
  37741. 802db72: 4598 cmp r8, r3
  37742. 802db74: d3f2 bcc.n 802db5c <http_recv+0x724>
  37743. }
  37744. }
  37745. /* case of MSIE8 : we do not receive data in the POST packet*/
  37746. if (DataOffset == 0)
  37747. {
  37748. DataFlag++;
  37749. 802db76: 4b5b ldr r3, [pc, #364] ; (802dce4 <http_recv+0x8ac>)
  37750. 802db78: 681a ldr r2, [r3, #0]
  37751. 802db7a: 3201 adds r2, #1
  37752. 802db7c: 601a str r2, [r3, #0]
  37753. BrowserFlag = 1;
  37754. 802db7e: 4b51 ldr r3, [pc, #324] ; (802dcc4 <http_recv+0x88c>)
  37755. 802db80: 2201 movs r2, #1
  37756. 802db82: 601a str r2, [r3, #0]
  37757. 802db84: e190 b.n 802dea8 <http_recv+0xa70>
  37758. DataOffset = i;
  37759. break;
  37760. }
  37761. }
  37762. /* case of MSIE8 : we do not receive data in the POST packet*/
  37763. if (DataOffset == 0)
  37764. 802db86: f1b8 0f00 cmp.w r8, #0
  37765. 802db8a: d0f4 beq.n 802db76 <http_recv+0x73e>
  37766. }
  37767. /* case of Mozilla Firefox v3.6 : we receive data in the POST packet*/
  37768. else
  37769. {
  37770. //TotalReceived = receivedBufLen - (ContentLengthOffset + 4);
  37771. TotalReceived = receivedBufLen - DataOffset;
  37772. 802db8c: 4b47 ldr r3, [pc, #284] ; (802dcac <http_recv+0x874>)
  37773. 802db8e: 881a ldrh r2, [r3, #0]
  37774. 802db90: 4b47 ldr r3, [pc, #284] ; (802dcb0 <http_recv+0x878>)
  37775. 802db92: ebc8 0202 rsb r2, r8, r2
  37776. 802db96: 601a str r2, [r3, #0]
  37777. 802db98: e000 b.n 802db9c <http_recv+0x764>
  37778. }*/
  37779. }
  37780. else if (strncmp(data, "POST /info.cgi", 14) == 0 || (DataFlag >= 1))
  37781. {
  37782. if (seclevel == 0) {
  37783. DataOffset = 0;
  37784. 802db9a: 4690 mov r8, r2
  37785. {
  37786. //TotalReceived = receivedBufLen - (ContentLengthOffset + 4);
  37787. TotalReceived = receivedBufLen - DataOffset;
  37788. }
  37789. }
  37790. if (((DataFlag ==1)&&(BrowserFlag==1)) || ((DataFlag ==0)&&(BrowserFlag==0)))
  37791. 802db9c: 4b51 ldr r3, [pc, #324] ; (802dce4 <http_recv+0x8ac>)
  37792. 802db9e: 681a ldr r2, [r3, #0]
  37793. 802dba0: 2a01 cmp r2, #1
  37794. 802dba2: d103 bne.n 802dbac <http_recv+0x774>
  37795. 802dba4: 4a47 ldr r2, [pc, #284] ; (802dcc4 <http_recv+0x88c>)
  37796. 802dba6: 6812 ldr r2, [r2, #0]
  37797. 802dba8: 2a01 cmp r2, #1
  37798. 802dbaa: d006 beq.n 802dbba <http_recv+0x782>
  37799. 802dbac: 681b ldr r3, [r3, #0]
  37800. 802dbae: 2b00 cmp r3, #0
  37801. 802dbb0: d134 bne.n 802dc1c <http_recv+0x7e4>
  37802. 802dbb2: 4b44 ldr r3, [pc, #272] ; (802dcc4 <http_recv+0x88c>)
  37803. 802dbb4: 681b ldr r3, [r3, #0]
  37804. 802dbb6: 2b00 cmp r3, #0
  37805. 802dbb8: d130 bne.n 802dc1c <http_recv+0x7e4>
  37806. {
  37807. if ((DataFlag ==0)&&(BrowserFlag==0))
  37808. 802dbba: 4b4a ldr r3, [pc, #296] ; (802dce4 <http_recv+0x8ac>)
  37809. 802dbbc: 6819 ldr r1, [r3, #0]
  37810. 802dbbe: 461a mov r2, r3
  37811. 802dbc0: b919 cbnz r1, 802dbca <http_recv+0x792>
  37812. 802dbc2: 4940 ldr r1, [pc, #256] ; (802dcc4 <http_recv+0x88c>)
  37813. 802dbc4: 6809 ldr r1, [r1, #0]
  37814. 802dbc6: b901 cbnz r1, 802dbca <http_recv+0x792>
  37815. 802dbc8: e022 b.n 802dc10 <http_recv+0x7d8>
  37816. {
  37817. DataFlag++;
  37818. }
  37819. else if ((DataFlag ==1)&&(BrowserFlag==1))
  37820. 802dbca: 6813 ldr r3, [r2, #0]
  37821. 802dbcc: 2b01 cmp r3, #1
  37822. 802dbce: d122 bne.n 802dc16 <http_recv+0x7de>
  37823. 802dbd0: 4b3c ldr r3, [pc, #240] ; (802dcc4 <http_recv+0x88c>)
  37824. 802dbd2: 681b ldr r3, [r3, #0]
  37825. 802dbd4: 2b01 cmp r3, #1
  37826. 802dbd6: d11e bne.n 802dc16 <http_recv+0x7de>
  37827. 802dbd8: e009 b.n 802dbee <http_recv+0x7b6>
  37828. {
  37829. /* parse packet for the octet-stream field */
  37830. for (i = 0; i < receivedBufLen; i++)
  37831. {
  37832. if (strncmp ((char*)(data+i), "owner", 5)==0)
  37833. 802dbda: eb06 0009 add.w r0, r6, r9
  37834. 802dbde: 4944 ldr r1, [pc, #272] ; (802dcf0 <http_recv+0x8b8>)
  37835. 802dbe0: 2205 movs r2, #5
  37836. 802dbe2: f7f4 fb53 bl 802228c <strncmp>
  37837. 802dbe6: b158 cbz r0, 802dc00 <http_recv+0x7c8>
  37838. DataFlag++;
  37839. }
  37840. else if ((DataFlag ==1)&&(BrowserFlag==1))
  37841. {
  37842. /* parse packet for the octet-stream field */
  37843. for (i = 0; i < receivedBufLen; i++)
  37844. 802dbe8: f109 0901 add.w r9, r9, #1
  37845. 802dbec: e003 b.n 802dbf6 <http_recv+0x7be>
  37846. 802dbee: f8df a0bc ldr.w sl, [pc, #188] ; 802dcac <http_recv+0x874>
  37847. {
  37848. if ((DataFlag ==0)&&(BrowserFlag==0))
  37849. {
  37850. DataFlag++;
  37851. }
  37852. else if ((DataFlag ==1)&&(BrowserFlag==1))
  37853. 802dbf2: f04f 0900 mov.w r9, #0
  37854. {
  37855. /* parse packet for the octet-stream field */
  37856. for (i = 0; i < receivedBufLen; i++)
  37857. 802dbf6: f8ba 3000 ldrh.w r3, [sl]
  37858. 802dbfa: 4599 cmp r9, r3
  37859. 802dbfc: d3ed bcc.n 802dbda <http_recv+0x7a2>
  37860. 802dbfe: e000 b.n 802dc02 <http_recv+0x7ca>
  37861. {
  37862. if (strncmp ((char*)(data+i), "owner", 5)==0)
  37863. 802dc00: 46c8 mov r8, r9
  37864. {
  37865. DataOffset = i;
  37866. break;
  37867. }
  37868. }
  37869. TotalReceived += receivedBufLen;
  37870. 802dc02: 4b2b ldr r3, [pc, #172] ; (802dcb0 <http_recv+0x878>)
  37871. 802dc04: 4a29 ldr r2, [pc, #164] ; (802dcac <http_recv+0x874>)
  37872. 802dc06: 8811 ldrh r1, [r2, #0]
  37873. 802dc08: 681a ldr r2, [r3, #0]
  37874. 802dc0a: 188a adds r2, r1, r2
  37875. 802dc0c: 601a str r2, [r3, #0]
  37876. DataFlag++;
  37877. 802dc0e: 4b35 ldr r3, [pc, #212] ; (802dce4 <http_recv+0x8ac>)
  37878. 802dc10: 681a ldr r2, [r3, #0]
  37879. 802dc12: 3201 adds r2, #1
  37880. 802dc14: 601a str r2, [r3, #0]
  37881. }
  37882. TotalData =0 ;
  37883. 802dc16: 2200 movs r2, #0
  37884. 802dc18: 4b26 ldr r3, [pc, #152] ; (802dcb4 <http_recv+0x87c>)
  37885. 802dc1a: e004 b.n 802dc26 <http_recv+0x7ee>
  37886. }
  37887. /* DataFlag >1 => the packet is data only */
  37888. else
  37889. {
  37890. TotalReceived +=receivedBufLen;
  37891. 802dc1c: 4a23 ldr r2, [pc, #140] ; (802dcac <http_recv+0x874>)
  37892. 802dc1e: 4b24 ldr r3, [pc, #144] ; (802dcb0 <http_recv+0x878>)
  37893. 802dc20: 8811 ldrh r1, [r2, #0]
  37894. 802dc22: 681a ldr r2, [r3, #0]
  37895. 802dc24: 188a adds r2, r1, r2
  37896. 802dc26: 601a str r2, [r3, #0]
  37897. }
  37898. ptr = (char*)(data + DataOffset);
  37899. receivedBufLen-= DataOffset;
  37900. 802dc28: 4b20 ldr r3, [pc, #128] ; (802dcac <http_recv+0x874>)
  37901. 802dc2a: 881a ldrh r2, [r3, #0]
  37902. else
  37903. {
  37904. TotalReceived +=receivedBufLen;
  37905. }
  37906. ptr = (char*)(data + DataOffset);
  37907. 802dc2c: eb06 0108 add.w r1, r6, r8
  37908. receivedBufLen-= DataOffset;
  37909. 802dc30: ebc8 0802 rsb r8, r8, r2
  37910. 802dc34: fa1f f288 uxth.w r2, r8
  37911. 802dc38: 801a strh r2, [r3, #0]
  37912. /* update Total data received counter */
  37913. TotalData +=receivedBufLen;
  37914. 802dc3a: 4b1e ldr r3, [pc, #120] ; (802dcb4 <http_recv+0x87c>)
  37915. /* check if last data packet */
  37916. if (TotalReceived == size)
  37917. 802dc3c: f8df 80ac ldr.w r8, [pc, #172] ; 802dcec <http_recv+0x8b4>
  37918. ptr = (char*)(data + DataOffset);
  37919. receivedBufLen-= DataOffset;
  37920. /* update Total data received counter */
  37921. TotalData +=receivedBufLen;
  37922. 802dc40: 6818 ldr r0, [r3, #0]
  37923. 802dc42: 1810 adds r0, r2, r0
  37924. 802dc44: 6018 str r0, [r3, #0]
  37925. /* check if last data packet */
  37926. if (TotalReceived == size)
  37927. 802dc46: 481a ldr r0, [pc, #104] ; (802dcb0 <http_recv+0x878>)
  37928. 802dc48: f8d8 3000 ldr.w r3, [r8]
  37929. 802dc4c: 6800 ldr r0, [r0, #0]
  37930. 802dc4e: 4298 cmp r0, r3
  37931. 802dc50: d124 bne.n 802dc9c <http_recv+0x864>
  37932. {
  37933. strncat(&sendBuf, ptr, receivedBufLen);
  37934. 802dc52: 4e19 ldr r6, [pc, #100] ; (802dcb8 <http_recv+0x880>)
  37935. 802dc54: 4630 mov r0, r6
  37936. 802dc56: f7f4 fae7 bl 8022228 <strncat>
  37937. strncat(&sendBuf, " ", 1);
  37938. 802dc5a: 2201 movs r2, #1
  37939. 802dc5c: 4917 ldr r1, [pc, #92] ; (802dcbc <http_recv+0x884>)
  37940. 802dc5e: 4630 mov r0, r6
  37941. 802dc60: f7f4 fae2 bl 8022228 <strncat>
  37942. HTTP_SetInfo(sendBuf, strlen(&sendBuf));
  37943. 802dc64: 4630 mov r0, r6
  37944. 802dc66: f7f4 faaf bl 80221c8 <strlen>
  37945. 802dc6a: b281 uxth r1, r0
  37946. 802dc6c: 4630 mov r0, r6
  37947. 802dc6e: f7fe ffb7 bl 802cbe0 <HTTP_SetInfo>
  37948. DataFlag=0;
  37949. 802dc72: 4b1c ldr r3, [pc, #112] ; (802dce4 <http_recv+0x8ac>)
  37950. 802dc74: 2100 movs r1, #0
  37951. 802dc76: 6019 str r1, [r3, #0]
  37952. BrowserFlag = 0;
  37953. 802dc78: 4b12 ldr r3, [pc, #72] ; (802dcc4 <http_recv+0x88c>)
  37954. memset(sendBuf, 0, size);
  37955. 802dc7a: f8d8 2000 ldr.w r2, [r8]
  37956. strncat(&sendBuf, ptr, receivedBufLen);
  37957. strncat(&sendBuf, " ", 1);
  37958. HTTP_SetInfo(sendBuf, strlen(&sendBuf));
  37959. DataFlag=0;
  37960. BrowserFlag = 0;
  37961. 802dc7e: 6019 str r1, [r3, #0]
  37962. memset(sendBuf, 0, size);
  37963. 802dc80: 4630 mov r0, r6
  37964. 802dc82: f7f4 f8c9 bl 8021e18 <memset>
  37965. strcpy(sendBuf, "HTTP/1.1 200 OK\r\n");
  37966. 802dc86: 4910 ldr r1, [pc, #64] ; (802dcc8 <http_recv+0x890>)
  37967. 802dc88: 4630 mov r0, r6
  37968. 802dc8a: f7f4 fa3f bl 802210c <strcpy>
  37969. strcat(sendBuf, "\r\n\r\n");
  37970. 802dc8e: 490f ldr r1, [pc, #60] ; (802dccc <http_recv+0x894>)
  37971. 802dc90: 4630 mov r0, r6
  37972. 802dc92: f7f4 f927 bl 8021ee4 <strcat>
  37973. strcat(sendBuf,"<!DOCTYPE html><html lang=""><head><meta http-equiv=\"refresh\" content=\"0;url=/info.html\"/></head></html>\r\n\r\n");
  37974. 802dc96: 4630 mov r0, r6
  37975. 802dc98: 4916 ldr r1, [pc, #88] ; (802dcf4 <http_recv+0x8bc>)
  37976. 802dc9a: e713 b.n 802dac4 <http_recv+0x68c>
  37977. }
  37978. /* not last data packet */
  37979. else
  37980. {
  37981. /* write data in flash */
  37982. if(receivedBufLen)
  37983. 802dc9c: 2a00 cmp r2, #0
  37984. 802dc9e: f000 8103 beq.w 802dea8 <http_recv+0xa70>
  37985. {
  37986. strncat(&sendBuf, ptr, receivedBufLen);
  37987. 802dca2: 4805 ldr r0, [pc, #20] ; (802dcb8 <http_recv+0x880>)
  37988. 802dca4: f7f4 fac0 bl 8022228 <strncat>
  37989. 802dca8: e0fe b.n 802dea8 <http_recv+0xa70>
  37990. 802dcaa: bf00 nop
  37991. 802dcac: 20000d88 .word 0x20000d88
  37992. 802dcb0: 20000d7c .word 0x20000d7c
  37993. 802dcb4: 20000d74 .word 0x20000d74
  37994. 802dcb8: 2000dbf0 .word 0x2000dbf0
  37995. 802dcbc: 080392c9 .word 0x080392c9
  37996. 802dcc0: 20000d84 .word 0x20000d84
  37997. 802dcc4: 20000d64 .word 0x20000d64
  37998. 802dcc8: 080404b3 .word 0x080404b3
  37999. 802dccc: 080405bd .word 0x080405bd
  38000. 802dcd0: 080404c5 .word 0x080404c5
  38001. 802dcd4: 20000d5c .word 0x20000d5c
  38002. 802dcd8: 08040534 .word 0x08040534
  38003. 802dcdc: 2000e3c0 .word 0x2000e3c0
  38004. 802dce0: 08040542 .word 0x08040542
  38005. 802dce4: 20000d70 .word 0x20000d70
  38006. 802dce8: 20000721 .word 0x20000721
  38007. 802dcec: 20000d80 .word 0x20000d80
  38008. 802dcf0: 08040551 .word 0x08040551
  38009. 802dcf4: 08040557 .word 0x08040557
  38010. }
  38011. }
  38012. }
  38013. }
  38014. else if (strncmp(data, "GET /history.cgi", 16) == 0)
  38015. 802dcf8: 4630 mov r0, r6
  38016. 802dcfa: 496f ldr r1, [pc, #444] ; (802deb8 <http_recv+0xa80>)
  38017. 802dcfc: 2210 movs r2, #16
  38018. 802dcfe: f7f4 fac5 bl 802228c <strncmp>
  38019. 802dd02: b9e8 cbnz r0, 802dd40 <http_recv+0x908>
  38020. {
  38021. int res;
  38022. res = HTTP_HistoryPage(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen);
  38023. 802dd04: 4e6d ldr r6, [pc, #436] ; (802debc <http_recv+0xa84>)
  38024. 802dd06: 4b6e ldr r3, [pc, #440] ; (802dec0 <http_recv+0xa88>)
  38025. 802dd08: f8df 81c4 ldr.w r8, [pc, #452] ; 802ded0 <http_recv+0xa98>
  38026. 802dd0c: 881a ldrh r2, [r3, #0]
  38027. 802dd0e: 486d ldr r0, [pc, #436] ; (802dec4 <http_recv+0xa8c>)
  38028. 802dd10: 4633 mov r3, r6
  38029. 802dd12: 4641 mov r1, r8
  38030. 802dd14: f7ff fa90 bl 802d238 <HTTP_HistoryPage>
  38031. if (res == SEND_REQUIRED_FILE)
  38032. 802dd18: 2802 cmp r0, #2
  38033. 802dd1a: 4633 mov r3, r6
  38034. 802dd1c: d10a bne.n 802dd34 <http_recv+0x8fc>
  38035. {
  38036. hs->file = sendBuf;
  38037. hs->left = sendBufLoadLen;
  38038. 802dd1e: 8833 ldrh r3, [r6, #0]
  38039. res = HTTP_HistoryPage(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen);
  38040. if (res == SEND_REQUIRED_FILE)
  38041. {
  38042. hs->file = sendBuf;
  38043. 802dd20: f8c4 8000 str.w r8, [r4]
  38044. hs->left = sendBufLoadLen;
  38045. send_data(pcb, hs);
  38046. 802dd24: 4628 mov r0, r5
  38047. 802dd26: 4621 mov r1, r4
  38048. res = HTTP_HistoryPage(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen);
  38049. if (res == SEND_REQUIRED_FILE)
  38050. {
  38051. hs->file = sendBuf;
  38052. hs->left = sendBufLoadLen;
  38053. 802dd28: 6063 str r3, [r4, #4]
  38054. send_data(pcb, hs);
  38055. 802dd2a: f7fe fb85 bl 802c438 <send_data>
  38056. tcp_sent(pcb, http_sent_history);
  38057. 802dd2e: 4628 mov r0, r5
  38058. 802dd30: 4965 ldr r1, [pc, #404] ; (802dec8 <http_recv+0xa90>)
  38059. 802dd32: e01f b.n 802dd74 <http_recv+0x93c>
  38060. tcp_err(pcb, http_sent_log_err);
  38061. }
  38062. else if (res == SEND_REQUIRED_YES) {
  38063. 802dd34: 2800 cmp r0, #0
  38064. 802dd36: f040 80b7 bne.w 802dea8 <http_recv+0xa70>
  38065. hs->file = sendBuf;
  38066. 802dd3a: f8c4 8000 str.w r8, [r4]
  38067. 802dd3e: e026 b.n 802dd8e <http_recv+0x956>
  38068. hs->left = sendBufLoadLen;
  38069. send_data(pcb, hs);
  38070. tcp_sent(pcb, http_sent);
  38071. }
  38072. }
  38073. else if (strncmp(data, "GET /ups_history.cgi", 19) == 0)
  38074. 802dd40: 4630 mov r0, r6
  38075. 802dd42: 4962 ldr r1, [pc, #392] ; (802decc <http_recv+0xa94>)
  38076. 802dd44: 2213 movs r2, #19
  38077. 802dd46: f7f4 faa1 bl 802228c <strncmp>
  38078. 802dd4a: bb10 cbnz r0, 802dd92 <http_recv+0x95a>
  38079. {
  38080. int res;
  38081. res = HTTP_UpsHistoryPage(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen);
  38082. 802dd4c: 4b5c ldr r3, [pc, #368] ; (802dec0 <http_recv+0xa88>)
  38083. 802dd4e: 485d ldr r0, [pc, #372] ; (802dec4 <http_recv+0xa8c>)
  38084. 802dd50: 881a ldrh r2, [r3, #0]
  38085. 802dd52: 495f ldr r1, [pc, #380] ; (802ded0 <http_recv+0xa98>)
  38086. 802dd54: 4b59 ldr r3, [pc, #356] ; (802debc <http_recv+0xa84>)
  38087. 802dd56: f7ff fa0f bl 802d178 <HTTP_UpsHistoryPage>
  38088. if (res == SEND_REQUIRED_FILE)
  38089. 802dd5a: 2802 cmp r0, #2
  38090. 802dd5c: d111 bne.n 802dd82 <http_recv+0x94a>
  38091. {
  38092. hs->file = sendBuf;
  38093. 802dd5e: 4b5c ldr r3, [pc, #368] ; (802ded0 <http_recv+0xa98>)
  38094. 802dd60: 6023 str r3, [r4, #0]
  38095. hs->left = sendBufLoadLen;
  38096. 802dd62: 4b56 ldr r3, [pc, #344] ; (802debc <http_recv+0xa84>)
  38097. 802dd64: 881b ldrh r3, [r3, #0]
  38098. send_data(pcb, hs);
  38099. 802dd66: 4628 mov r0, r5
  38100. 802dd68: 4621 mov r1, r4
  38101. res = HTTP_UpsHistoryPage(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen);
  38102. if (res == SEND_REQUIRED_FILE)
  38103. {
  38104. hs->file = sendBuf;
  38105. hs->left = sendBufLoadLen;
  38106. 802dd6a: 6063 str r3, [r4, #4]
  38107. send_data(pcb, hs);
  38108. 802dd6c: f7fe fb64 bl 802c438 <send_data>
  38109. tcp_sent(pcb, http_sent_log);
  38110. 802dd70: 4958 ldr r1, [pc, #352] ; (802ded4 <http_recv+0xa9c>)
  38111. 802dd72: 4628 mov r0, r5
  38112. 802dd74: f002 fa50 bl 8030218 <tcp_sent>
  38113. tcp_err(pcb, http_sent_log_err);
  38114. 802dd78: 4628 mov r0, r5
  38115. 802dd7a: 4957 ldr r1, [pc, #348] ; (802ded8 <http_recv+0xaa0>)
  38116. 802dd7c: f002 fa4e bl 803021c <tcp_err>
  38117. 802dd80: e092 b.n 802dea8 <http_recv+0xa70>
  38118. }
  38119. else if (res == SEND_REQUIRED_YES) {
  38120. 802dd82: 2800 cmp r0, #0
  38121. 802dd84: f040 8090 bne.w 802dea8 <http_recv+0xa70>
  38122. hs->file = sendBuf;
  38123. 802dd88: 4b51 ldr r3, [pc, #324] ; (802ded0 <http_recv+0xa98>)
  38124. 802dd8a: 6023 str r3, [r4, #0]
  38125. hs->left = sendBufLoadLen;
  38126. 802dd8c: 4b4b ldr r3, [pc, #300] ; (802debc <http_recv+0xa84>)
  38127. 802dd8e: 881b ldrh r3, [r3, #0]
  38128. 802dd90: e081 b.n 802de96 <http_recv+0xa5e>
  38129. send_data(pcb, hs);
  38130. tcp_sent(pcb, http_sent);
  38131. }
  38132. }
  38133. /* Тест АКБ ИБП */
  38134. else if (strncmp(data, "GET /bat_test.cgi", 17) == 0)
  38135. 802dd92: 4630 mov r0, r6
  38136. 802dd94: 4951 ldr r1, [pc, #324] ; (802dedc <http_recv+0xaa4>)
  38137. 802dd96: 2211 movs r2, #17
  38138. 802dd98: f7f4 fa78 bl 802228c <strncmp>
  38139. 802dd9c: b950 cbnz r0, 802ddb4 <http_recv+0x97c>
  38140. {
  38141. HTTP_UPSTest(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen);
  38142. 802dd9e: f8df 8130 ldr.w r8, [pc, #304] ; 802ded0 <http_recv+0xa98>
  38143. 802dda2: 4e46 ldr r6, [pc, #280] ; (802debc <http_recv+0xa84>)
  38144. 802dda4: 4b46 ldr r3, [pc, #280] ; (802dec0 <http_recv+0xa88>)
  38145. 802dda6: 4847 ldr r0, [pc, #284] ; (802dec4 <http_recv+0xa8c>)
  38146. 802dda8: 881a ldrh r2, [r3, #0]
  38147. 802ddaa: 4641 mov r1, r8
  38148. 802ddac: 4633 mov r3, r6
  38149. 802ddae: f7fe fe93 bl 802cad8 <HTTP_UPSTest>
  38150. 802ddb2: e062 b.n 802de7a <http_recv+0xa42>
  38151. hs->left = sendBufLoadLen;
  38152. send_data(pcb, hs);
  38153. tcp_sent(pcb, http_sent);
  38154. }
  38155. /* Выключение ИБП */
  38156. else if (strncmp(data, "GET /ups_power.cgi", 18) == 0)
  38157. 802ddb4: 4630 mov r0, r6
  38158. 802ddb6: 494a ldr r1, [pc, #296] ; (802dee0 <http_recv+0xaa8>)
  38159. 802ddb8: 2212 movs r2, #18
  38160. 802ddba: f7f4 fa67 bl 802228c <strncmp>
  38161. 802ddbe: b950 cbnz r0, 802ddd6 <http_recv+0x99e>
  38162. {
  38163. HTTP_UPSshutdown(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen);
  38164. 802ddc0: f8df 810c ldr.w r8, [pc, #268] ; 802ded0 <http_recv+0xa98>
  38165. 802ddc4: 4e3d ldr r6, [pc, #244] ; (802debc <http_recv+0xa84>)
  38166. 802ddc6: 4b3e ldr r3, [pc, #248] ; (802dec0 <http_recv+0xa88>)
  38167. 802ddc8: 483e ldr r0, [pc, #248] ; (802dec4 <http_recv+0xa8c>)
  38168. 802ddca: 881a ldrh r2, [r3, #0]
  38169. 802ddcc: 4641 mov r1, r8
  38170. 802ddce: 4633 mov r3, r6
  38171. 802ddd0: f7fe fe0c bl 802c9ec <HTTP_UPSshutdown>
  38172. 802ddd4: e051 b.n 802de7a <http_recv+0xa42>
  38173. hs->left = sendBufLoadLen;
  38174. send_data(pcb, hs);
  38175. tcp_sent(pcb, http_sent);
  38176. }
  38177. /* Сброс настроек и сохранине */
  38178. else if (strncmp(data, "GET /reset.cgi", 14) == 0)
  38179. 802ddd6: 4630 mov r0, r6
  38180. 802ddd8: 4942 ldr r1, [pc, #264] ; (802dee4 <http_recv+0xaac>)
  38181. 802ddda: 220e movs r2, #14
  38182. 802dddc: f7f4 fa56 bl 802228c <strncmp>
  38183. 802dde0: b928 cbnz r0, 802ddee <http_recv+0x9b6>
  38184. {
  38185. HTTP_ResetSettings();
  38186. 802dde2: f000 fd2d bl 802e840 <HTTP_ResetSettings>
  38187. HTTP_SaveSettings();
  38188. 802dde6: f000 fd3f bl 802e868 <HTTP_SaveSettings>
  38189. fs_open("/settings.html", &file);
  38190. 802ddea: 483f ldr r0, [pc, #252] ; (802dee8 <http_recv+0xab0>)
  38191. 802ddec: e04d b.n 802de8a <http_recv+0xa52>
  38192. hs->left = file.len;
  38193. send_data(pcb, hs);
  38194. tcp_sent(pcb, http_sent);
  38195. }
  38196. /* Перезагрузка контроллера */
  38197. else if (strncmp(data, "GET /reboot.cgi", 15) == 0)
  38198. 802ddee: 4630 mov r0, r6
  38199. 802ddf0: 493e ldr r1, [pc, #248] ; (802deec <http_recv+0xab4>)
  38200. 802ddf2: 220f movs r2, #15
  38201. 802ddf4: f7f4 fa4a bl 802228c <strncmp>
  38202. 802ddf8: b910 cbnz r0, 802de00 <http_recv+0x9c8>
  38203. {
  38204. HTTP_Reboot();
  38205. 802ddfa: f000 fd61 bl 802e8c0 <HTTP_Reboot>
  38206. 802ddfe: e053 b.n 802dea8 <http_recv+0xa70>
  38207. }
  38208. /* Подтверждение новых сетевых настроек */
  38209. else if (strncmp(data, "GET /confirm.cgi", 16) == 0)
  38210. 802de00: 4630 mov r0, r6
  38211. 802de02: 493b ldr r1, [pc, #236] ; (802def0 <http_recv+0xab8>)
  38212. 802de04: 2210 movs r2, #16
  38213. 802de06: f7f4 fa41 bl 802228c <strncmp>
  38214. 802de0a: b920 cbnz r0, 802de16 <http_recv+0x9de>
  38215. {
  38216. SetWebReinitFlag(false);
  38217. 802de0c: f7fa fbd8 bl 80285c0 <SetWebReinitFlag>
  38218. SetConfirmWebParamsFlag();
  38219. 802de10: f7fa fbdc bl 80285cc <SetConfirmWebParamsFlag>
  38220. 802de14: e038 b.n 802de88 <http_recv+0xa50>
  38221. hs->left = file.len;
  38222. send_data(pcb, hs);
  38223. tcp_sent(pcb, http_sent);
  38224. }
  38225. /* Проверка пароля, переход в bootloader */
  38226. else if (strncmp(data, "GET /fw_update.cgi", 18) == 0)
  38227. 802de16: 4630 mov r0, r6
  38228. 802de18: 4936 ldr r1, [pc, #216] ; (802def4 <http_recv+0xabc>)
  38229. 802de1a: 2212 movs r2, #18
  38230. 802de1c: f7f4 fa36 bl 802228c <strncmp>
  38231. 802de20: b950 cbnz r0, 802de38 <http_recv+0xa00>
  38232. {
  38233. HTTP_ConfirmBootPwd(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen);
  38234. 802de22: f8df 80ac ldr.w r8, [pc, #172] ; 802ded0 <http_recv+0xa98>
  38235. 802de26: 4e25 ldr r6, [pc, #148] ; (802debc <http_recv+0xa84>)
  38236. 802de28: 4b25 ldr r3, [pc, #148] ; (802dec0 <http_recv+0xa88>)
  38237. 802de2a: 4826 ldr r0, [pc, #152] ; (802dec4 <http_recv+0xa8c>)
  38238. 802de2c: 881a ldrh r2, [r3, #0]
  38239. 802de2e: 4641 mov r1, r8
  38240. 802de30: 4633 mov r3, r6
  38241. 802de32: f7fe fc89 bl 802c748 <HTTP_ConfirmBootPwd>
  38242. 802de36: e020 b.n 802de7a <http_recv+0xa42>
  38243. hs->left = sendBufLoadLen;
  38244. send_data(pcb, hs);
  38245. tcp_sent(pcb, http_sent);
  38246. }
  38247. /* Смена пароля пользователя */
  38248. else if (strncmp(data, "GET /changepwd.cgi", 18) == 0)
  38249. 802de38: 4630 mov r0, r6
  38250. 802de3a: 492f ldr r1, [pc, #188] ; (802def8 <http_recv+0xac0>)
  38251. 802de3c: 2212 movs r2, #18
  38252. 802de3e: f7f4 fa25 bl 802228c <strncmp>
  38253. 802de42: b950 cbnz r0, 802de5a <http_recv+0xa22>
  38254. {
  38255. HTTP_ChangeUserPwd(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen);
  38256. 802de44: f8df 8088 ldr.w r8, [pc, #136] ; 802ded0 <http_recv+0xa98>
  38257. 802de48: 4e1c ldr r6, [pc, #112] ; (802debc <http_recv+0xa84>)
  38258. 802de4a: 4b1d ldr r3, [pc, #116] ; (802dec0 <http_recv+0xa88>)
  38259. 802de4c: 481d ldr r0, [pc, #116] ; (802dec4 <http_recv+0xa8c>)
  38260. 802de4e: 881a ldrh r2, [r3, #0]
  38261. 802de50: 4641 mov r1, r8
  38262. 802de52: 4633 mov r3, r6
  38263. 802de54: f7ff fa52 bl 802d2fc <HTTP_ChangeUserPwd>
  38264. 802de58: e00f b.n 802de7a <http_recv+0xa42>
  38265. hs->left = sendBufLoadLen;
  38266. send_data(pcb, hs);
  38267. tcp_sent(pcb, http_sent);
  38268. }
  38269. // На производстве
  38270. else if (strncmp(data, "GET /setProdate.cgi", 19) == 0)
  38271. 802de5a: 4630 mov r0, r6
  38272. 802de5c: 4927 ldr r1, [pc, #156] ; (802defc <http_recv+0xac4>)
  38273. 802de5e: 2213 movs r2, #19
  38274. 802de60: f7f4 fa14 bl 802228c <strncmp>
  38275. 802de64: b968 cbnz r0, 802de82 <http_recv+0xa4a>
  38276. {
  38277. HTTP_Prodate(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen);
  38278. 802de66: 4b16 ldr r3, [pc, #88] ; (802dec0 <http_recv+0xa88>)
  38279. 802de68: f8df 8064 ldr.w r8, [pc, #100] ; 802ded0 <http_recv+0xa98>
  38280. 802de6c: 4e13 ldr r6, [pc, #76] ; (802debc <http_recv+0xa84>)
  38281. 802de6e: 881a ldrh r2, [r3, #0]
  38282. 802de70: 4814 ldr r0, [pc, #80] ; (802dec4 <http_recv+0xa8c>)
  38283. 802de72: 4641 mov r1, r8
  38284. 802de74: 4633 mov r3, r6
  38285. 802de76: f7ff f94b bl 802d110 <HTTP_Prodate>
  38286. hs->file = sendBuf;
  38287. 802de7a: f8c4 8000 str.w r8, [r4]
  38288. hs->left = sendBufLoadLen;
  38289. 802de7e: 8833 ldrh r3, [r6, #0]
  38290. 802de80: e009 b.n 802de96 <http_recv+0xa5e>
  38291. send_data(pcb, hs);
  38292. tcp_sent(pcb, http_sent);
  38293. }
  38294. else
  38295. {
  38296. HTTP_UpdateUserLoginTime(user_id);
  38297. 802de82: 4640 mov r0, r8
  38298. 802de84: f7fe fa8a bl 802c39c <HTTP_UpdateUserLoginTime>
  38299. fs_open("/index.html", &file); // +
  38300. 802de88: 481d ldr r0, [pc, #116] ; (802df00 <http_recv+0xac8>)
  38301. 802de8a: a903 add r1, sp, #12
  38302. 802de8c: f7fe fa98 bl 802c3c0 <fs_open>
  38303. hs->file = file.data;
  38304. 802de90: 9b03 ldr r3, [sp, #12]
  38305. 802de92: 6023 str r3, [r4, #0]
  38306. hs->left = file.len;
  38307. 802de94: 9b04 ldr r3, [sp, #16]
  38308. 802de96: 6063 str r3, [r4, #4]
  38309. send_data(pcb, hs);
  38310. 802de98: 4628 mov r0, r5
  38311. 802de9a: 4621 mov r1, r4
  38312. 802de9c: f7fe facc bl 802c438 <send_data>
  38313. tcp_sent(pcb, http_sent);
  38314. 802dea0: 4628 mov r0, r5
  38315. 802dea2: 4918 ldr r1, [pc, #96] ; (802df04 <http_recv+0xacc>)
  38316. 802dea4: f002 f9b8 bl 8030218 <tcp_sent>
  38317. }
  38318. }
  38319. }
  38320. pbuf_free(p);
  38321. 802dea8: 4638 mov r0, r7
  38322. 802deaa: f001 feed bl 802fc88 <pbuf_free>
  38323. /* if (err == ERR_OK && p == NULL)
  38324. {
  38325. close_conn(pcb, hs);
  38326. }*/
  38327. return ERR_OK;
  38328. }
  38329. 802deae: 2000 movs r0, #0
  38330. 802deb0: b01b add sp, #108 ; 0x6c
  38331. 802deb2: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  38332. 802deb6: bf00 nop
  38333. 802deb8: 080405c2 .word 0x080405c2
  38334. 802debc: 20000d5c .word 0x20000d5c
  38335. 802dec0: 20000d88 .word 0x20000d88
  38336. 802dec4: 2000e3c0 .word 0x2000e3c0
  38337. 802dec8: 0802c565 .word 0x0802c565
  38338. 802decc: 080405d3 .word 0x080405d3
  38339. 802ded0: 2000dbf0 .word 0x2000dbf0
  38340. 802ded4: 0802c4c5 .word 0x0802c4c5
  38341. 802ded8: 0802c319 .word 0x0802c319
  38342. 802dedc: 080405e8 .word 0x080405e8
  38343. 802dee0: 080405fa .word 0x080405fa
  38344. 802dee4: 0804060d .word 0x0804060d
  38345. 802dee8: 08040421 .word 0x08040421
  38346. 802deec: 0804061c .word 0x0804061c
  38347. 802def0: 0804062c .word 0x0804062c
  38348. 802def4: 0804063d .word 0x0804063d
  38349. 802def8: 08040650 .word 0x08040650
  38350. 802defc: 08040663 .word 0x08040663
  38351. 802df00: 08040430 .word 0x08040430
  38352. 802df04: 0802c4ab .word 0x0802c4ab
  38353. 0802df08 <HTTP_GetParamsPage1>:
  38354. /**
  38355. * @brief Возвращяет строку с настройками на первой странице
  38356. * @retval None
  38357. */
  38358. void HTTP_GetParamsPage1(char *buf)
  38359. {
  38360. 802df08: b510 push {r4, lr}
  38361. char str[40];
  38362. uint8_t len;
  38363. memset(buf, 0, 1000);
  38364. 802df0a: f44f 727a mov.w r2, #1000 ; 0x3e8
  38365. /**
  38366. * @brief Возвращяет строку с настройками на первой странице
  38367. * @retval None
  38368. */
  38369. void HTTP_GetParamsPage1(char *buf)
  38370. {
  38371. 802df0e: b08c sub sp, #48 ; 0x30
  38372. 802df10: 4604 mov r4, r0
  38373. char str[40];
  38374. uint8_t len;
  38375. memset(buf, 0, 1000);
  38376. 802df12: 2100 movs r1, #0
  38377. 802df14: f7f3 ff80 bl 8021e18 <memset>
  38378. // Headers для поддержки saffari
  38379. strcpy(buf, "HTTP/1.0 200 OK\r\nContent-Type:text/html\r\n\r\n");
  38380. 802df18: 4620 mov r0, r4
  38381. 802df1a: 496f ldr r1, [pc, #444] ; (802e0d8 <HTTP_GetParamsPage1+0x1d0>)
  38382. 802df1c: f7f4 f8f6 bl 802210c <strcpy>
  38383. // Параметры UPS
  38384. GetInputVoltageStr(str, &len);
  38385. 802df20: a802 add r0, sp, #8
  38386. 802df22: f10d 0107 add.w r1, sp, #7
  38387. 802df26: f7f9 ff17 bl 8027d58 <GetInputVoltageStr>
  38388. strcat(buf, "{\"AC\":\"");
  38389. 802df2a: 4620 mov r0, r4
  38390. 802df2c: 496b ldr r1, [pc, #428] ; (802e0dc <HTTP_GetParamsPage1+0x1d4>)
  38391. 802df2e: f7f3 ffd9 bl 8021ee4 <strcat>
  38392. strncat(buf, str, len);
  38393. 802df32: f89d 2007 ldrb.w r2, [sp, #7]
  38394. 802df36: a902 add r1, sp, #8
  38395. 802df38: 4620 mov r0, r4
  38396. 802df3a: f7f4 f975 bl 8022228 <strncat>
  38397. GetOutputVoltageStr(str, &len);
  38398. 802df3e: a802 add r0, sp, #8
  38399. 802df40: f10d 0107 add.w r1, sp, #7
  38400. 802df44: f7f9 ff1e bl 8027d84 <GetOutputVoltageStr>
  38401. strcat(buf, "\",\"DC\":\"");
  38402. 802df48: 4620 mov r0, r4
  38403. 802df4a: 4965 ldr r1, [pc, #404] ; (802e0e0 <HTTP_GetParamsPage1+0x1d8>)
  38404. 802df4c: f7f3 ffca bl 8021ee4 <strcat>
  38405. strncat(buf, str, len);
  38406. 802df50: f89d 2007 ldrb.w r2, [sp, #7]
  38407. 802df54: a902 add r1, sp, #8
  38408. 802df56: 4620 mov r0, r4
  38409. 802df58: f7f4 f966 bl 8022228 <strncat>
  38410. GetInputFreqStr(str, &len);
  38411. 802df5c: a802 add r0, sp, #8
  38412. 802df5e: f10d 0107 add.w r1, sp, #7
  38413. 802df62: f7f9 fecd bl 8027d00 <GetInputFreqStr>
  38414. strcat(buf, "\",\"in_freq\":\"");
  38415. 802df66: 4620 mov r0, r4
  38416. 802df68: 495e ldr r1, [pc, #376] ; (802e0e4 <HTTP_GetParamsPage1+0x1dc>)
  38417. 802df6a: f7f3 ffbb bl 8021ee4 <strcat>
  38418. strncat(buf, str, len);
  38419. 802df6e: f89d 2007 ldrb.w r2, [sp, #7]
  38420. 802df72: a902 add r1, sp, #8
  38421. 802df74: 4620 mov r0, r4
  38422. 802df76: f7f4 f957 bl 8022228 <strncat>
  38423. GetOutputFreqStr(str, &len);
  38424. 802df7a: a802 add r0, sp, #8
  38425. 802df7c: f10d 0107 add.w r1, sp, #7
  38426. 802df80: f7f9 fed4 bl 8027d2c <GetOutputFreqStr>
  38427. strcat(buf, "\",\"out_freq\":\"");
  38428. 802df84: 4620 mov r0, r4
  38429. 802df86: 4958 ldr r1, [pc, #352] ; (802e0e8 <HTTP_GetParamsPage1+0x1e0>)
  38430. 802df88: f7f3 ffac bl 8021ee4 <strcat>
  38431. strncat(buf, str, len);
  38432. 802df8c: f89d 2007 ldrb.w r2, [sp, #7]
  38433. 802df90: a902 add r1, sp, #8
  38434. 802df92: 4620 mov r0, r4
  38435. 802df94: f7f4 f948 bl 8022228 <strncat>
  38436. GetPowerStr(str, &len);
  38437. 802df98: a802 add r0, sp, #8
  38438. 802df9a: f10d 0107 add.w r1, sp, #7
  38439. 802df9e: f7f9 ff07 bl 8027db0 <GetPowerStr>
  38440. strcat(buf, "\",\"pwr\":\"");
  38441. 802dfa2: 4620 mov r0, r4
  38442. 802dfa4: 4951 ldr r1, [pc, #324] ; (802e0ec <HTTP_GetParamsPage1+0x1e4>)
  38443. 802dfa6: f7f3 ff9d bl 8021ee4 <strcat>
  38444. strncat(buf, str, len);
  38445. 802dfaa: f89d 2007 ldrb.w r2, [sp, #7]
  38446. 802dfae: a902 add r1, sp, #8
  38447. 802dfb0: 4620 mov r0, r4
  38448. 802dfb2: f7f4 f939 bl 8022228 <strncat>
  38449. GetBatCapacityStr(str, &len);
  38450. 802dfb6: a802 add r0, sp, #8
  38451. 802dfb8: f10d 0107 add.w r1, sp, #7
  38452. 802dfbc: f7f9 ff0a bl 8027dd4 <GetBatCapacityStr>
  38453. strcat(buf, "\",\"bat_cap\":\"");
  38454. 802dfc0: 4620 mov r0, r4
  38455. 802dfc2: 494b ldr r1, [pc, #300] ; (802e0f0 <HTTP_GetParamsPage1+0x1e8>)
  38456. 802dfc4: f7f3 ff8e bl 8021ee4 <strcat>
  38457. strncat(buf, str, len);
  38458. 802dfc8: f89d 2007 ldrb.w r2, [sp, #7]
  38459. 802dfcc: a902 add r1, sp, #8
  38460. 802dfce: 4620 mov r0, r4
  38461. 802dfd0: f7f4 f92a bl 8022228 <strncat>
  38462. GetInternalTempStr(str, &len);
  38463. 802dfd4: a802 add r0, sp, #8
  38464. 802dfd6: f10d 0107 add.w r1, sp, #7
  38465. 802dfda: f7f9 ff1f bl 8027e1c <GetInternalTempStr>
  38466. strcat(buf, "\",\"inner_temp\":\"");
  38467. 802dfde: 4620 mov r0, r4
  38468. 802dfe0: 4944 ldr r1, [pc, #272] ; (802e0f4 <HTTP_GetParamsPage1+0x1ec>)
  38469. 802dfe2: f7f3 ff7f bl 8021ee4 <strcat>
  38470. strncat(buf, str, len);
  38471. 802dfe6: f89d 2007 ldrb.w r2, [sp, #7]
  38472. 802dfea: a902 add r1, sp, #8
  38473. 802dfec: 4620 mov r0, r4
  38474. 802dfee: f7f4 f91b bl 8022228 <strncat>
  38475. GetRuntimeStr(str, &len);
  38476. 802dff2: a802 add r0, sp, #8
  38477. 802dff4: f10d 0107 add.w r1, sp, #7
  38478. 802dff8: f7f9 fefe bl 8027df8 <GetRuntimeStr>
  38479. strcat(buf, "\",\"bat_time_left\":\"");
  38480. 802dffc: 4620 mov r0, r4
  38481. 802dffe: 493e ldr r1, [pc, #248] ; (802e0f8 <HTTP_GetParamsPage1+0x1f0>)
  38482. 802e000: f7f3 ff70 bl 8021ee4 <strcat>
  38483. strncat(buf, str, len);
  38484. 802e004: a902 add r1, sp, #8
  38485. 802e006: f89d 2007 ldrb.w r2, [sp, #7]
  38486. 802e00a: 4620 mov r0, r4
  38487. 802e00c: f7f4 f90c bl 8022228 <strncat>
  38488. GetDINStatusStr(str, &len, 0);
  38489. 802e010: 2200 movs r2, #0
  38490. 802e012: a802 add r0, sp, #8
  38491. 802e014: f10d 0107 add.w r1, sp, #7
  38492. 802e018: f7fa f804 bl 8028024 <GetDINStatusStr>
  38493. strcat(buf, "\",\"di1\":\"");
  38494. 802e01c: 4620 mov r0, r4
  38495. 802e01e: 4937 ldr r1, [pc, #220] ; (802e0fc <HTTP_GetParamsPage1+0x1f4>)
  38496. 802e020: f7f3 ff60 bl 8021ee4 <strcat>
  38497. strncat(buf, str, len);
  38498. 802e024: a902 add r1, sp, #8
  38499. 802e026: f89d 2007 ldrb.w r2, [sp, #7]
  38500. 802e02a: 4620 mov r0, r4
  38501. 802e02c: f7f4 f8fc bl 8022228 <strncat>
  38502. GetDOUTStatusStr(str, &len, 0);
  38503. 802e030: a802 add r0, sp, #8
  38504. 802e032: f10d 0107 add.w r1, sp, #7
  38505. 802e036: 2200 movs r2, #0
  38506. 802e038: f7fa f82e bl 8028098 <GetDOUTStatusStr>
  38507. strcat(buf, "\",\"ro1\":\"");
  38508. 802e03c: 4620 mov r0, r4
  38509. 802e03e: 4930 ldr r1, [pc, #192] ; (802e100 <HTTP_GetParamsPage1+0x1f8>)
  38510. 802e040: f7f3 ff50 bl 8021ee4 <strcat>
  38511. strncat(buf, str, len);
  38512. 802e044: a902 add r1, sp, #8
  38513. 802e046: f89d 2007 ldrb.w r2, [sp, #7]
  38514. 802e04a: 4620 mov r0, r4
  38515. 802e04c: f7f4 f8ec bl 8022228 <strncat>
  38516. GetDOUTStatusStr(str, &len, 1);
  38517. 802e050: 2201 movs r2, #1
  38518. 802e052: a802 add r0, sp, #8
  38519. 802e054: f10d 0107 add.w r1, sp, #7
  38520. 802e058: f7fa f81e bl 8028098 <GetDOUTStatusStr>
  38521. strcat(buf, "\",\"ro2\":\"");
  38522. 802e05c: 4620 mov r0, r4
  38523. 802e05e: 4929 ldr r1, [pc, #164] ; (802e104 <HTTP_GetParamsPage1+0x1fc>)
  38524. 802e060: f7f3 ff40 bl 8021ee4 <strcat>
  38525. strncat(buf, str, len);
  38526. 802e064: f89d 2007 ldrb.w r2, [sp, #7]
  38527. 802e068: a902 add r1, sp, #8
  38528. 802e06a: 4620 mov r0, r4
  38529. 802e06c: f7f4 f8dc bl 8022228 <strncat>
  38530. // Мониторинг
  38531. // load_monitor (нагрузка, 0 - норма, 1 - fail)
  38532. // temp_monitor (внутренняя температура, 0 - норма, 1 - fail)
  38533. // connect_monitor (связь с UPSом, 0 - норма, 1 - fail)
  38534. GetAlarmMonitorStr(str, &len);
  38535. 802e070: a802 add r0, sp, #8
  38536. 802e072: f10d 0107 add.w r1, sp, #7
  38537. 802e076: f7f9 fee7 bl 8027e48 <GetAlarmMonitorStr>
  38538. strcat(buf, "\",\"m_alarm\":\"");
  38539. 802e07a: 4620 mov r0, r4
  38540. 802e07c: 4922 ldr r1, [pc, #136] ; (802e108 <HTTP_GetParamsPage1+0x200>)
  38541. 802e07e: f7f3 ff31 bl 8021ee4 <strcat>
  38542. strncat(buf, str, len);
  38543. 802e082: f89d 2007 ldrb.w r2, [sp, #7]
  38544. 802e086: a902 add r1, sp, #8
  38545. 802e088: 4620 mov r0, r4
  38546. 802e08a: f7f4 f8cd bl 8022228 <strncat>
  38547. GetAlarmStr(str, &len);
  38548. 802e08e: a802 add r0, sp, #8
  38549. 802e090: f10d 0107 add.w r1, sp, #7
  38550. 802e094: f7f9 ff02 bl 8027e9c <GetAlarmStr>
  38551. strcat(buf, "\",\"u_alarm\":\"");
  38552. 802e098: 4620 mov r0, r4
  38553. 802e09a: 491c ldr r1, [pc, #112] ; (802e10c <HTTP_GetParamsPage1+0x204>)
  38554. 802e09c: f7f3 ff22 bl 8021ee4 <strcat>
  38555. strncat(buf, str, len);
  38556. 802e0a0: f89d 2007 ldrb.w r2, [sp, #7]
  38557. 802e0a4: a902 add r1, sp, #8
  38558. 802e0a6: 4620 mov r0, r4
  38559. 802e0a8: f7f4 f8be bl 8022228 <strncat>
  38560. // Признак изменения сетевых настроек
  38561. GetWebReinitFlag(str, &len);
  38562. 802e0ac: a802 add r0, sp, #8
  38563. 802e0ae: f10d 0107 add.w r1, sp, #7
  38564. 802e0b2: f7fa fa5f bl 8028574 <GetWebReinitFlag>
  38565. strcat(buf, "\",\"netsettings_changed\":\"");
  38566. 802e0b6: 4620 mov r0, r4
  38567. 802e0b8: 4915 ldr r1, [pc, #84] ; (802e110 <HTTP_GetParamsPage1+0x208>)
  38568. 802e0ba: f7f3 ff13 bl 8021ee4 <strcat>
  38569. strncat(buf, str, len);
  38570. 802e0be: a902 add r1, sp, #8
  38571. 802e0c0: f89d 2007 ldrb.w r2, [sp, #7]
  38572. 802e0c4: 4620 mov r0, r4
  38573. 802e0c6: f7f4 f8af bl 8022228 <strncat>
  38574. strncat(buf, "\"}", 2);
  38575. 802e0ca: 4620 mov r0, r4
  38576. 802e0cc: 4911 ldr r1, [pc, #68] ; (802e114 <HTTP_GetParamsPage1+0x20c>)
  38577. 802e0ce: 2202 movs r2, #2
  38578. 802e0d0: f7f4 f8aa bl 8022228 <strncat>
  38579. //printf(buf);
  38580. }
  38581. 802e0d4: b00c add sp, #48 ; 0x30
  38582. 802e0d6: bd10 pop {r4, pc}
  38583. 802e0d8: 0804439c .word 0x0804439c
  38584. 802e0dc: 080443c8 .word 0x080443c8
  38585. 802e0e0: 080443d0 .word 0x080443d0
  38586. 802e0e4: 080443d9 .word 0x080443d9
  38587. 802e0e8: 080443e7 .word 0x080443e7
  38588. 802e0ec: 080443f6 .word 0x080443f6
  38589. 802e0f0: 08044400 .word 0x08044400
  38590. 802e0f4: 0804440e .word 0x0804440e
  38591. 802e0f8: 0804441f .word 0x0804441f
  38592. 802e0fc: 08044433 .word 0x08044433
  38593. 802e100: 0804443d .word 0x0804443d
  38594. 802e104: 08044447 .word 0x08044447
  38595. 802e108: 08044451 .word 0x08044451
  38596. 802e10c: 0804445f .word 0x0804445f
  38597. 802e110: 0804446d .word 0x0804446d
  38598. 802e114: 08044487 .word 0x08044487
  38599. 0802e118 <HTTP_GetSettings>:
  38600. /**
  38601. * @brief Возвращяет строку с настройками на второй странице
  38602. * @retval None
  38603. */
  38604. void HTTP_GetSettings(char *buf)
  38605. {
  38606. 802e118: b510 push {r4, lr}
  38607. char str[30];
  38608. uint8_t len;
  38609. /* Headers для поддержки saffari */
  38610. strcpy(buf, "HTTP/1.0 200 OK\r\nContent-Type:text/html\r\n\r\n");
  38611. 802e11a: 49bf ldr r1, [pc, #764] ; (802e418 <HTTP_GetSettings+0x300>)
  38612. /**
  38613. * @brief Возвращяет строку с настройками на второй странице
  38614. * @retval None
  38615. */
  38616. void HTTP_GetSettings(char *buf)
  38617. {
  38618. 802e11c: b08a sub sp, #40 ; 0x28
  38619. 802e11e: 4604 mov r4, r0
  38620. char str[30];
  38621. uint8_t len;
  38622. /* Headers для поддержки saffari */
  38623. strcpy(buf, "HTTP/1.0 200 OK\r\nContent-Type:text/html\r\n\r\n");
  38624. 802e120: f7f3 fff4 bl 802210c <strcpy>
  38625. /* SNMP */
  38626. GetReadCommunity(str, &len);
  38627. 802e124: a802 add r0, sp, #8
  38628. 802e126: f10d 0107 add.w r1, sp, #7
  38629. 802e12a: f7fa f953 bl 80283d4 <GetReadCommunity>
  38630. strcat(buf, "{\"read_community\":\"");
  38631. 802e12e: 4620 mov r0, r4
  38632. 802e130: 49ba ldr r1, [pc, #744] ; (802e41c <HTTP_GetSettings+0x304>)
  38633. 802e132: f7f3 fed7 bl 8021ee4 <strcat>
  38634. strncat(buf, str, len);
  38635. 802e136: f89d 2007 ldrb.w r2, [sp, #7]
  38636. 802e13a: a902 add r1, sp, #8
  38637. 802e13c: 4620 mov r0, r4
  38638. 802e13e: f7f4 f873 bl 8022228 <strncat>
  38639. GetWriteCommunity(str, &len);
  38640. 802e142: a802 add r0, sp, #8
  38641. 802e144: f10d 0107 add.w r1, sp, #7
  38642. 802e148: f7fa f954 bl 80283f4 <GetWriteCommunity>
  38643. strcat(buf, "\",\"write_community\":\"");
  38644. 802e14c: 4620 mov r0, r4
  38645. 802e14e: 49b4 ldr r1, [pc, #720] ; (802e420 <HTTP_GetSettings+0x308>)
  38646. 802e150: f7f3 fec8 bl 8021ee4 <strcat>
  38647. strncat(buf, str, len);
  38648. 802e154: f89d 2007 ldrb.w r2, [sp, #7]
  38649. 802e158: a902 add r1, sp, #8
  38650. 802e15a: 4620 mov r0, r4
  38651. 802e15c: f7f4 f864 bl 8022228 <strncat>
  38652. GetManagerIp(str, &len);
  38653. 802e160: a802 add r0, sp, #8
  38654. 802e162: f10d 0107 add.w r1, sp, #7
  38655. 802e166: f7fa f955 bl 8028414 <GetManagerIp>
  38656. strcat(buf, "\",\"managerIP\":\"");
  38657. 802e16a: 4620 mov r0, r4
  38658. 802e16c: 49ad ldr r1, [pc, #692] ; (802e424 <HTTP_GetSettings+0x30c>)
  38659. 802e16e: f7f3 feb9 bl 8021ee4 <strcat>
  38660. strncat(buf, str, len);
  38661. 802e172: f89d 2007 ldrb.w r2, [sp, #7]
  38662. 802e176: a902 add r1, sp, #8
  38663. 802e178: 4620 mov r0, r4
  38664. 802e17a: f7f4 f855 bl 8022228 <strncat>
  38665. GetManagerIp2(str, &len);
  38666. 802e17e: a802 add r0, sp, #8
  38667. 802e180: f10d 0107 add.w r1, sp, #7
  38668. 802e184: f7fa f956 bl 8028434 <GetManagerIp2>
  38669. strcat(buf, "\",\"managerIP2\":\"");
  38670. 802e188: 4620 mov r0, r4
  38671. 802e18a: 49a7 ldr r1, [pc, #668] ; (802e428 <HTTP_GetSettings+0x310>)
  38672. 802e18c: f7f3 feaa bl 8021ee4 <strcat>
  38673. strncat(buf, str, len);
  38674. 802e190: f89d 2007 ldrb.w r2, [sp, #7]
  38675. 802e194: a902 add r1, sp, #8
  38676. 802e196: 4620 mov r0, r4
  38677. 802e198: f7f4 f846 bl 8022228 <strncat>
  38678. GetManagerIp3(str, &len);
  38679. 802e19c: a802 add r0, sp, #8
  38680. 802e19e: f10d 0107 add.w r1, sp, #7
  38681. 802e1a2: f7fa f957 bl 8028454 <GetManagerIp3>
  38682. strcat(buf, "\",\"managerIP3\":\"");
  38683. 802e1a6: 4620 mov r0, r4
  38684. 802e1a8: 49a0 ldr r1, [pc, #640] ; (802e42c <HTTP_GetSettings+0x314>)
  38685. 802e1aa: f7f3 fe9b bl 8021ee4 <strcat>
  38686. strncat(buf, str, len);
  38687. 802e1ae: f89d 2007 ldrb.w r2, [sp, #7]
  38688. 802e1b2: a902 add r1, sp, #8
  38689. 802e1b4: 4620 mov r0, r4
  38690. 802e1b6: f7f4 f837 bl 8022228 <strncat>
  38691. GetManagerIp4(str, &len);
  38692. 802e1ba: a802 add r0, sp, #8
  38693. 802e1bc: f10d 0107 add.w r1, sp, #7
  38694. 802e1c0: f7fa f958 bl 8028474 <GetManagerIp4>
  38695. strcat(buf, "\",\"managerIP4\":\"");
  38696. 802e1c4: 4620 mov r0, r4
  38697. 802e1c6: 499a ldr r1, [pc, #616] ; (802e430 <HTTP_GetSettings+0x318>)
  38698. 802e1c8: f7f3 fe8c bl 8021ee4 <strcat>
  38699. strncat(buf, str, len);
  38700. 802e1cc: f89d 2007 ldrb.w r2, [sp, #7]
  38701. 802e1d0: a902 add r1, sp, #8
  38702. 802e1d2: 4620 mov r0, r4
  38703. 802e1d4: f7f4 f828 bl 8022228 <strncat>
  38704. GetManagerIp5(str, &len);
  38705. 802e1d8: a802 add r0, sp, #8
  38706. 802e1da: f10d 0107 add.w r1, sp, #7
  38707. 802e1de: f7fa f959 bl 8028494 <GetManagerIp5>
  38708. strcat(buf, "\",\"managerIP5\":\"");
  38709. 802e1e2: 4620 mov r0, r4
  38710. 802e1e4: 4993 ldr r1, [pc, #588] ; (802e434 <HTTP_GetSettings+0x31c>)
  38711. 802e1e6: f7f3 fe7d bl 8021ee4 <strcat>
  38712. strncat(buf, str, len);
  38713. 802e1ea: a902 add r1, sp, #8
  38714. 802e1ec: f89d 2007 ldrb.w r2, [sp, #7]
  38715. 802e1f0: 4620 mov r0, r4
  38716. 802e1f2: f7f4 f819 bl 8022228 <strncat>
  38717. /*Параметры реле и сухих контактов*/
  38718. GetDINTypeActStr(str, &len, 0);
  38719. 802e1f6: 2200 movs r2, #0
  38720. 802e1f8: a802 add r0, sp, #8
  38721. 802e1fa: f10d 0107 add.w r1, sp, #7
  38722. 802e1fe: f7f9 fefd bl 8027ffc <GetDINTypeActStr>
  38723. strcat(buf, "\",\"di1\":\"");
  38724. 802e202: 4620 mov r0, r4
  38725. 802e204: 498c ldr r1, [pc, #560] ; (802e438 <HTTP_GetSettings+0x320>)
  38726. 802e206: f7f3 fe6d bl 8021ee4 <strcat>
  38727. strncat(buf, str, len);
  38728. 802e20a: a902 add r1, sp, #8
  38729. 802e20c: f89d 2007 ldrb.w r2, [sp, #7]
  38730. 802e210: 4620 mov r0, r4
  38731. 802e212: f7f4 f809 bl 8022228 <strncat>
  38732. GetROTypeActStr(str, &len, 0);
  38733. 802e216: 2200 movs r2, #0
  38734. 802e218: a802 add r0, sp, #8
  38735. 802e21a: f10d 0107 add.w r1, sp, #7
  38736. 802e21e: f7f9 ff27 bl 8028070 <GetROTypeActStr>
  38737. strcat(buf, "\",\"ro1\":\"");
  38738. 802e222: 4620 mov r0, r4
  38739. 802e224: 4985 ldr r1, [pc, #532] ; (802e43c <HTTP_GetSettings+0x324>)
  38740. 802e226: f7f3 fe5d bl 8021ee4 <strcat>
  38741. strncat(buf, str, len);
  38742. 802e22a: a902 add r1, sp, #8
  38743. 802e22c: f89d 2007 ldrb.w r2, [sp, #7]
  38744. 802e230: 4620 mov r0, r4
  38745. 802e232: f7f3 fff9 bl 8022228 <strncat>
  38746. GetROTypeActStr(str, &len, 1);
  38747. 802e236: 2201 movs r2, #1
  38748. 802e238: a802 add r0, sp, #8
  38749. 802e23a: f10d 0107 add.w r1, sp, #7
  38750. 802e23e: f7f9 ff17 bl 8028070 <GetROTypeActStr>
  38751. strcat(buf, "\",\"ro2\":\"");
  38752. 802e242: 4620 mov r0, r4
  38753. 802e244: 497e ldr r1, [pc, #504] ; (802e440 <HTTP_GetSettings+0x328>)
  38754. 802e246: f7f3 fe4d bl 8021ee4 <strcat>
  38755. strncat(buf, str, len);
  38756. 802e24a: f89d 2007 ldrb.w r2, [sp, #7]
  38757. 802e24e: a902 add r1, sp, #8
  38758. 802e250: 4620 mov r0, r4
  38759. 802e252: f7f3 ffe9 bl 8022228 <strncat>
  38760. /* WEB */
  38761. GetIpStr(str, &len);
  38762. 802e256: a802 add r0, sp, #8
  38763. 802e258: f10d 0107 add.w r1, sp, #7
  38764. 802e25c: f7fa f864 bl 8028328 <GetIpStr>
  38765. strcat(buf, "\",\"ipaddr\":\"");
  38766. 802e260: 4620 mov r0, r4
  38767. 802e262: 4978 ldr r1, [pc, #480] ; (802e444 <HTTP_GetSettings+0x32c>)
  38768. 802e264: f7f3 fe3e bl 8021ee4 <strcat>
  38769. strncat(buf, str, len);
  38770. 802e268: f89d 2007 ldrb.w r2, [sp, #7]
  38771. 802e26c: a902 add r1, sp, #8
  38772. 802e26e: 4620 mov r0, r4
  38773. 802e270: f7f3 ffda bl 8022228 <strncat>
  38774. GetGatewayStr(str, &len);
  38775. 802e274: a802 add r0, sp, #8
  38776. 802e276: f10d 0107 add.w r1, sp, #7
  38777. 802e27a: f7fa f86b bl 8028354 <GetGatewayStr>
  38778. strcat(buf, "\",\"gw\":\"");
  38779. 802e27e: 4620 mov r0, r4
  38780. 802e280: 4971 ldr r1, [pc, #452] ; (802e448 <HTTP_GetSettings+0x330>)
  38781. 802e282: f7f3 fe2f bl 8021ee4 <strcat>
  38782. strncat(buf, str, len);
  38783. 802e286: f89d 2007 ldrb.w r2, [sp, #7]
  38784. 802e28a: a902 add r1, sp, #8
  38785. 802e28c: 4620 mov r0, r4
  38786. 802e28e: f7f3 ffcb bl 8022228 <strncat>
  38787. GetMaskStr(str, &len);
  38788. 802e292: a802 add r0, sp, #8
  38789. 802e294: f10d 0107 add.w r1, sp, #7
  38790. 802e298: f7fa f872 bl 8028380 <GetMaskStr>
  38791. strcat(buf, "\",\"mask\":\"");
  38792. 802e29c: 4620 mov r0, r4
  38793. 802e29e: 496b ldr r1, [pc, #428] ; (802e44c <HTTP_GetSettings+0x334>)
  38794. 802e2a0: f7f3 fe20 bl 8021ee4 <strcat>
  38795. strncat(buf, str, len);
  38796. 802e2a4: f89d 2007 ldrb.w r2, [sp, #7]
  38797. 802e2a8: a902 add r1, sp, #8
  38798. 802e2aa: 4620 mov r0, r4
  38799. 802e2ac: f7f3 ffbc bl 8022228 <strncat>
  38800. GetDhcpStateStr(str, &len);
  38801. 802e2b0: a802 add r0, sp, #8
  38802. 802e2b2: f10d 0107 add.w r1, sp, #7
  38803. 802e2b6: f7fa f879 bl 80283ac <GetDhcpStateStr>
  38804. strcat(buf, "\",\"dhcp\":");
  38805. 802e2ba: 4620 mov r0, r4
  38806. 802e2bc: 4964 ldr r1, [pc, #400] ; (802e450 <HTTP_GetSettings+0x338>)
  38807. 802e2be: f7f3 fe11 bl 8021ee4 <strcat>
  38808. strncat(buf, str, len);
  38809. 802e2c2: f89d 2007 ldrb.w r2, [sp, #7]
  38810. 802e2c6: a902 add r1, sp, #8
  38811. 802e2c8: 4620 mov r0, r4
  38812. 802e2ca: f7f3 ffad bl 8022228 <strncat>
  38813. GetAuthEnableStateStr(str, &len);
  38814. 802e2ce: a802 add r0, sp, #8
  38815. 802e2d0: f10d 0107 add.w r1, sp, #7
  38816. 802e2d4: f7fa f940 bl 8028558 <GetAuthEnableStateStr>
  38817. strcat(buf, ",\"swauth\":");
  38818. 802e2d8: 4620 mov r0, r4
  38819. 802e2da: 495e ldr r1, [pc, #376] ; (802e454 <HTTP_GetSettings+0x33c>)
  38820. 802e2dc: f7f3 fe02 bl 8021ee4 <strcat>
  38821. strncat(buf, str, len);
  38822. 802e2e0: f89d 2007 ldrb.w r2, [sp, #7]
  38823. 802e2e4: a902 add r1, sp, #8
  38824. 802e2e6: 4620 mov r0, r4
  38825. 802e2e8: f7f3 ff9e bl 8022228 <strncat>
  38826. /* RADIUS */
  38827. GetRDSIpStr(str, &len);
  38828. 802e2ec: a802 add r0, sp, #8
  38829. 802e2ee: f10d 0107 add.w r1, sp, #7
  38830. 802e2f2: f7fa f8df bl 80284b4 <GetRDSIpStr>
  38831. strcat(buf, ",\"rs_server\":\"");
  38832. 802e2f6: 4620 mov r0, r4
  38833. 802e2f8: 4957 ldr r1, [pc, #348] ; (802e458 <HTTP_GetSettings+0x340>)
  38834. 802e2fa: f7f3 fdf3 bl 8021ee4 <strcat>
  38835. strncat(buf, str, len);
  38836. 802e2fe: f89d 2007 ldrb.w r2, [sp, #7]
  38837. 802e302: a902 add r1, sp, #8
  38838. 802e304: 4620 mov r0, r4
  38839. 802e306: f7f3 ff8f bl 8022228 <strncat>
  38840. GetRDSPortStr(str, &len);
  38841. 802e30a: a802 add r0, sp, #8
  38842. 802e30c: f10d 0107 add.w r1, sp, #7
  38843. 802e310: f7fa f8e0 bl 80284d4 <GetRDSPortStr>
  38844. strcat(buf, "\",\"rs_port\":\"");
  38845. 802e314: 4620 mov r0, r4
  38846. 802e316: 4951 ldr r1, [pc, #324] ; (802e45c <HTTP_GetSettings+0x344>)
  38847. 802e318: f7f3 fde4 bl 8021ee4 <strcat>
  38848. strncat(buf, str, len);
  38849. 802e31c: f89d 2007 ldrb.w r2, [sp, #7]
  38850. 802e320: a902 add r1, sp, #8
  38851. 802e322: 4620 mov r0, r4
  38852. 802e324: f7f3 ff80 bl 8022228 <strncat>
  38853. GetRDSPasswordkStr(str, &len);
  38854. 802e328: a802 add r0, sp, #8
  38855. 802e32a: f10d 0107 add.w r1, sp, #7
  38856. 802e32e: f7fa f8f5 bl 802851c <GetRDSPasswordkStr>
  38857. strcat(buf, "\",\"rs_pwd\":\"");
  38858. 802e332: 4620 mov r0, r4
  38859. 802e334: 494a ldr r1, [pc, #296] ; (802e460 <HTTP_GetSettings+0x348>)
  38860. 802e336: f7f3 fdd5 bl 8021ee4 <strcat>
  38861. strncat(buf, str, len);
  38862. 802e33a: f89d 2007 ldrb.w r2, [sp, #7]
  38863. 802e33e: a902 add r1, sp, #8
  38864. 802e340: 4620 mov r0, r4
  38865. 802e342: f7f3 ff71 bl 8022228 <strncat>
  38866. GetRDSKeyAccesstStr(str, &len);
  38867. 802e346: a802 add r0, sp, #8
  38868. 802e348: f10d 0107 add.w r1, sp, #7
  38869. 802e34c: f7fa f8d4 bl 80284f8 <GetRDSKeyAccesstStr>
  38870. strcat(buf, "\",\"rs_key\":\"");
  38871. 802e350: 4620 mov r0, r4
  38872. 802e352: 4944 ldr r1, [pc, #272] ; (802e464 <HTTP_GetSettings+0x34c>)
  38873. 802e354: f7f3 fdc6 bl 8021ee4 <strcat>
  38874. strncat(buf, str, len);
  38875. 802e358: f89d 2007 ldrb.w r2, [sp, #7]
  38876. 802e35c: a902 add r1, sp, #8
  38877. 802e35e: 4620 mov r0, r4
  38878. 802e360: f7f3 ff62 bl 8022228 <strncat>
  38879. GetRDSEnableStateStr(str, &len);
  38880. 802e364: a802 add r0, sp, #8
  38881. 802e366: f10d 0107 add.w r1, sp, #7
  38882. 802e36a: f7fa f8e7 bl 802853c <GetRDSEnableStateStr>
  38883. strcat(buf, "\",\"rs_enabled\":");
  38884. 802e36e: 4620 mov r0, r4
  38885. 802e370: 493d ldr r1, [pc, #244] ; (802e468 <HTTP_GetSettings+0x350>)
  38886. 802e372: f7f3 fdb7 bl 8021ee4 <strcat>
  38887. strncat(buf, str, len);
  38888. 802e376: f89d 2007 ldrb.w r2, [sp, #7]
  38889. 802e37a: a902 add r1, sp, #8
  38890. 802e37c: 4620 mov r0, r4
  38891. 802e37e: f7f3 ff53 bl 8022228 <strncat>
  38892. /* Параметры даты и времени */
  38893. GetDateStr(str, &len);
  38894. 802e382: a802 add r0, sp, #8
  38895. 802e384: f10d 0107 add.w r1, sp, #7
  38896. 802e388: f7f9 fd9a bl 8027ec0 <GetDateStr>
  38897. strcat(buf, ",\"date\":\"");
  38898. 802e38c: 4620 mov r0, r4
  38899. 802e38e: 4937 ldr r1, [pc, #220] ; (802e46c <HTTP_GetSettings+0x354>)
  38900. 802e390: f7f3 fda8 bl 8021ee4 <strcat>
  38901. strncat(buf, str, len);
  38902. 802e394: f89d 2007 ldrb.w r2, [sp, #7]
  38903. 802e398: a902 add r1, sp, #8
  38904. 802e39a: 4620 mov r0, r4
  38905. 802e39c: f7f3 ff44 bl 8022228 <strncat>
  38906. GetTimeStr(str, &len);
  38907. 802e3a0: a802 add r0, sp, #8
  38908. 802e3a2: f10d 0107 add.w r1, sp, #7
  38909. 802e3a6: f7f9 fda9 bl 8027efc <GetTimeStr>
  38910. strcat(buf, "\",\"time\":\"");
  38911. 802e3aa: 4620 mov r0, r4
  38912. 802e3ac: 4930 ldr r1, [pc, #192] ; (802e470 <HTTP_GetSettings+0x358>)
  38913. 802e3ae: f7f3 fd99 bl 8021ee4 <strcat>
  38914. strncat(buf, str, len);
  38915. 802e3b2: f89d 2007 ldrb.w r2, [sp, #7]
  38916. 802e3b6: a902 add r1, sp, #8
  38917. 802e3b8: 4620 mov r0, r4
  38918. 802e3ba: f7f3 ff35 bl 8022228 <strncat>
  38919. /* Параметры SNTP */
  38920. GetSntpStateStr(str, &len);
  38921. 802e3be: a802 add r0, sp, #8
  38922. 802e3c0: f10d 0107 add.w r1, sp, #7
  38923. 802e3c4: f7f9 fdc8 bl 8027f58 <GetSntpStateStr>
  38924. strcat(buf, "\",\"ntp\":\"");
  38925. 802e3c8: 4620 mov r0, r4
  38926. 802e3ca: 492a ldr r1, [pc, #168] ; (802e474 <HTTP_GetSettings+0x35c>)
  38927. 802e3cc: f7f3 fd8a bl 8021ee4 <strcat>
  38928. strncat(buf, str, len);
  38929. 802e3d0: f89d 2007 ldrb.w r2, [sp, #7]
  38930. 802e3d4: a902 add r1, sp, #8
  38931. 802e3d6: 4620 mov r0, r4
  38932. 802e3d8: f7f3 ff26 bl 8022228 <strncat>
  38933. GetSntpServerIpStr(str, &len);
  38934. 802e3dc: a802 add r0, sp, #8
  38935. 802e3de: f10d 0107 add.w r1, sp, #7
  38936. 802e3e2: f7f9 fdd3 bl 8027f8c <GetSntpServerIpStr>
  38937. strcat(buf, "\",\"ntpservip\":\"");
  38938. 802e3e6: 4620 mov r0, r4
  38939. 802e3e8: 4923 ldr r1, [pc, #140] ; (802e478 <HTTP_GetSettings+0x360>)
  38940. 802e3ea: f7f3 fd7b bl 8021ee4 <strcat>
  38941. strncat(buf, str, len);
  38942. 802e3ee: f89d 2007 ldrb.w r2, [sp, #7]
  38943. 802e3f2: a902 add r1, sp, #8
  38944. 802e3f4: 4620 mov r0, r4
  38945. 802e3f6: f7f3 ff17 bl 8022228 <strncat>
  38946. GetSntpTimeZoneStr(str, &len);
  38947. 802e3fa: a802 add r0, sp, #8
  38948. 802e3fc: f10d 0107 add.w r1, sp, #7
  38949. 802e400: f7f9 fdd4 bl 8027fac <GetSntpTimeZoneStr>
  38950. strcat(buf, "\",\"utc\":\"");
  38951. 802e404: 4620 mov r0, r4
  38952. 802e406: 491d ldr r1, [pc, #116] ; (802e47c <HTTP_GetSettings+0x364>)
  38953. 802e408: f7f3 fd6c bl 8021ee4 <strcat>
  38954. strncat(buf, str, len);
  38955. 802e40c: f89d 2007 ldrb.w r2, [sp, #7]
  38956. 802e410: a902 add r1, sp, #8
  38957. 802e412: 4620 mov r0, r4
  38958. 802e414: e034 b.n 802e480 <HTTP_GetSettings+0x368>
  38959. 802e416: bf00 nop
  38960. 802e418: 0804439c .word 0x0804439c
  38961. 802e41c: 0804448a .word 0x0804448a
  38962. 802e420: 0804449e .word 0x0804449e
  38963. 802e424: 080444b4 .word 0x080444b4
  38964. 802e428: 080444c4 .word 0x080444c4
  38965. 802e42c: 080444d5 .word 0x080444d5
  38966. 802e430: 080444e6 .word 0x080444e6
  38967. 802e434: 080444f7 .word 0x080444f7
  38968. 802e438: 08044433 .word 0x08044433
  38969. 802e43c: 0804443d .word 0x0804443d
  38970. 802e440: 08044447 .word 0x08044447
  38971. 802e444: 08044508 .word 0x08044508
  38972. 802e448: 08044515 .word 0x08044515
  38973. 802e44c: 0804451e .word 0x0804451e
  38974. 802e450: 08044529 .word 0x08044529
  38975. 802e454: 08044533 .word 0x08044533
  38976. 802e458: 0804453e .word 0x0804453e
  38977. 802e45c: 0804454d .word 0x0804454d
  38978. 802e460: 0804455b .word 0x0804455b
  38979. 802e464: 08044568 .word 0x08044568
  38980. 802e468: 08044575 .word 0x08044575
  38981. 802e46c: 08044585 .word 0x08044585
  38982. 802e470: 0804458f .word 0x0804458f
  38983. 802e474: 0804459a .word 0x0804459a
  38984. 802e478: 080445a4 .word 0x080445a4
  38985. 802e47c: 080445b4 .word 0x080445b4
  38986. 802e480: f7f3 fed2 bl 8022228 <strncat>
  38987. GetUnixTimeStr(str, &len);
  38988. 802e484: a802 add r0, sp, #8
  38989. 802e486: f10d 0107 add.w r1, sp, #7
  38990. 802e48a: f7f9 fd4f bl 8027f2c <GetUnixTimeStr>
  38991. strcat(buf, "\",\"utm\":\"");
  38992. 802e48e: 4620 mov r0, r4
  38993. 802e490: 4916 ldr r1, [pc, #88] ; (802e4ec <HTTP_GetSettings+0x3d4>)
  38994. 802e492: f7f3 fd27 bl 8021ee4 <strcat>
  38995. strncat(buf, str, len);
  38996. 802e496: f89d 2007 ldrb.w r2, [sp, #7]
  38997. 802e49a: a902 add r1, sp, #8
  38998. 802e49c: 4620 mov r0, r4
  38999. 802e49e: f7f3 fec3 bl 8022228 <strncat>
  39000. GetSntpLastDataStr(str, &len);
  39001. 802e4a2: a802 add r0, sp, #8
  39002. 802e4a4: f10d 0107 add.w r1, sp, #7
  39003. 802e4a8: f7f9 fd98 bl 8027fdc <GetSntpLastDataStr>
  39004. strcat(buf, "\",\"lastsynctime\":\"");
  39005. 802e4ac: 4620 mov r0, r4
  39006. 802e4ae: 4910 ldr r1, [pc, #64] ; (802e4f0 <HTTP_GetSettings+0x3d8>)
  39007. 802e4b0: f7f3 fd18 bl 8021ee4 <strcat>
  39008. strncat(buf, str, len);
  39009. 802e4b4: f89d 2007 ldrb.w r2, [sp, #7]
  39010. 802e4b8: a902 add r1, sp, #8
  39011. 802e4ba: 4620 mov r0, r4
  39012. 802e4bc: f7f3 feb4 bl 8022228 <strncat>
  39013. /* Признак изменения сетевых настроек */
  39014. GetWebReinitFlag(str, &len);
  39015. 802e4c0: a802 add r0, sp, #8
  39016. 802e4c2: f10d 0107 add.w r1, sp, #7
  39017. 802e4c6: f7fa f855 bl 8028574 <GetWebReinitFlag>
  39018. strcat(buf, "\",\"netsettings_changed\":\"");
  39019. 802e4ca: 4620 mov r0, r4
  39020. 802e4cc: 4909 ldr r1, [pc, #36] ; (802e4f4 <HTTP_GetSettings+0x3dc>)
  39021. 802e4ce: f7f3 fd09 bl 8021ee4 <strcat>
  39022. strncat(buf, str, len);
  39023. 802e4d2: a902 add r1, sp, #8
  39024. 802e4d4: f89d 2007 ldrb.w r2, [sp, #7]
  39025. 802e4d8: 4620 mov r0, r4
  39026. 802e4da: f7f3 fea5 bl 8022228 <strncat>
  39027. strncat(buf, "\"}", 2);
  39028. 802e4de: 4620 mov r0, r4
  39029. 802e4e0: 4905 ldr r1, [pc, #20] ; (802e4f8 <HTTP_GetSettings+0x3e0>)
  39030. 802e4e2: 2202 movs r2, #2
  39031. 802e4e4: f7f3 fea0 bl 8022228 <strncat>
  39032. //printf(buf);
  39033. }
  39034. 802e4e8: b00a add sp, #40 ; 0x28
  39035. 802e4ea: bd10 pop {r4, pc}
  39036. 802e4ec: 080445be .word 0x080445be
  39037. 802e4f0: 080445c8 .word 0x080445c8
  39038. 802e4f4: 0804446d .word 0x0804446d
  39039. 802e4f8: 08044487 .word 0x08044487
  39040. 0802e4fc <HTTP_GetInfo>:
  39041. * @brief Возвращяет строку с информацией об устройстве
  39042. * @retval None
  39043. */
  39044. // TODO Согласовать максимальную длину строк
  39045. void HTTP_GetInfo(char *buf)
  39046. {
  39047. 802e4fc: b510 push {r4, lr}
  39048. char str[40];
  39049. uint8_t len;
  39050. /* Headers для поддержки saffari */
  39051. strcpy(buf, "HTTP/1.0 200 OK\r\nContent-Type:text/html\r\n\r\n");
  39052. 802e4fe: 4960 ldr r1, [pc, #384] ; (802e680 <HTTP_GetInfo+0x184>)
  39053. * @brief Возвращяет строку с информацией об устройстве
  39054. * @retval None
  39055. */
  39056. // TODO Согласовать максимальную длину строк
  39057. void HTTP_GetInfo(char *buf)
  39058. {
  39059. 802e500: b08c sub sp, #48 ; 0x30
  39060. 802e502: 4604 mov r4, r0
  39061. char str[40];
  39062. uint8_t len;
  39063. /* Headers для поддержки saffari */
  39064. strcpy(buf, "HTTP/1.0 200 OK\r\nContent-Type:text/html\r\n\r\n");
  39065. 802e504: f7f3 fe02 bl 802210c <strcpy>
  39066. GetWorkTimeStr(str, &len);
  39067. 802e508: a802 add r0, sp, #8
  39068. 802e50a: f10d 0107 add.w r1, sp, #7
  39069. 802e50e: f7f9 fdfb bl 8028108 <GetWorkTimeStr>
  39070. strcat(buf, "{\"uptime\":\"");
  39071. 802e512: 4620 mov r0, r4
  39072. 802e514: 495b ldr r1, [pc, #364] ; (802e684 <HTTP_GetInfo+0x188>)
  39073. 802e516: f7f3 fce5 bl 8021ee4 <strcat>
  39074. strncat(buf, str, len);
  39075. 802e51a: f89d 2007 ldrb.w r2, [sp, #7]
  39076. 802e51e: a902 add r1, sp, #8
  39077. 802e520: 4620 mov r0, r4
  39078. 802e522: f7f3 fe81 bl 8022228 <strncat>
  39079. GetModelStr(str, &len);
  39080. 802e526: a802 add r0, sp, #8
  39081. 802e528: f10d 0107 add.w r1, sp, #7
  39082. 802e52c: f7f9 fe12 bl 8028154 <GetModelStr>
  39083. strcat(buf, "\",\"model\":\"");
  39084. 802e530: 4620 mov r0, r4
  39085. 802e532: 4955 ldr r1, [pc, #340] ; (802e688 <HTTP_GetInfo+0x18c>)
  39086. 802e534: f7f3 fcd6 bl 8021ee4 <strcat>
  39087. strncat(buf, str, len);
  39088. 802e538: f89d 2007 ldrb.w r2, [sp, #7]
  39089. 802e53c: a902 add r1, sp, #8
  39090. 802e53e: 4620 mov r0, r4
  39091. 802e540: f7f3 fe72 bl 8022228 <strncat>
  39092. GetProductionDataStr(str, &len);
  39093. 802e544: a802 add r0, sp, #8
  39094. 802e546: f10d 0107 add.w r1, sp, #7
  39095. 802e54a: f7f9 fe15 bl 8028178 <GetProductionDataStr>
  39096. strcat(buf, "\",\"prodate\":\"");
  39097. 802e54e: 4620 mov r0, r4
  39098. 802e550: 494e ldr r1, [pc, #312] ; (802e68c <HTTP_GetInfo+0x190>)
  39099. 802e552: f7f3 fcc7 bl 8021ee4 <strcat>
  39100. strncat(buf, str, len);
  39101. 802e556: f89d 2007 ldrb.w r2, [sp, #7]
  39102. 802e55a: a902 add r1, sp, #8
  39103. 802e55c: 4620 mov r0, r4
  39104. 802e55e: f7f3 fe63 bl 8022228 <strncat>
  39105. GetVersionStr(str, &len);
  39106. 802e562: a802 add r0, sp, #8
  39107. 802e564: f10d 0107 add.w r1, sp, #7
  39108. 802e568: f7f9 fe18 bl 802819c <GetVersionStr>
  39109. strcat(buf, "\",\"fwversion\":\"");
  39110. 802e56c: 4620 mov r0, r4
  39111. 802e56e: 4948 ldr r1, [pc, #288] ; (802e690 <HTTP_GetInfo+0x194>)
  39112. 802e570: f7f3 fcb8 bl 8021ee4 <strcat>
  39113. strncat(buf, str, len);
  39114. 802e574: f89d 2007 ldrb.w r2, [sp, #7]
  39115. 802e578: a902 add r1, sp, #8
  39116. 802e57a: 4620 mov r0, r4
  39117. 802e57c: f7f3 fe54 bl 8022228 <strncat>
  39118. GetMacStr(str, &len);
  39119. 802e580: a802 add r0, sp, #8
  39120. 802e582: f10d 0107 add.w r1, sp, #7
  39121. 802e586: f7f9 fe1b bl 80281c0 <GetMacStr>
  39122. strcat(buf, "\",\"macaddr\":\"");
  39123. 802e58a: 4620 mov r0, r4
  39124. 802e58c: 4941 ldr r1, [pc, #260] ; (802e694 <HTTP_GetInfo+0x198>)
  39125. 802e58e: f7f3 fca9 bl 8021ee4 <strcat>
  39126. strncat(buf, str, len);
  39127. 802e592: f89d 2007 ldrb.w r2, [sp, #7]
  39128. 802e596: a902 add r1, sp, #8
  39129. 802e598: 4620 mov r0, r4
  39130. 802e59a: f7f3 fe45 bl 8022228 <strncat>
  39131. GetSerialNumberStr(str, &len);
  39132. 802e59e: a802 add r0, sp, #8
  39133. 802e5a0: f10d 0107 add.w r1, sp, #7
  39134. 802e5a4: f7f9 fe1e bl 80281e4 <GetSerialNumberStr>
  39135. strcat(buf, "\",\"serno\":\"");
  39136. 802e5a8: 4620 mov r0, r4
  39137. 802e5aa: 493b ldr r1, [pc, #236] ; (802e698 <HTTP_GetInfo+0x19c>)
  39138. 802e5ac: f7f3 fc9a bl 8021ee4 <strcat>
  39139. strncat(buf, str, len);
  39140. 802e5b0: f89d 2007 ldrb.w r2, [sp, #7]
  39141. 802e5b4: a902 add r1, sp, #8
  39142. 802e5b6: 4620 mov r0, r4
  39143. 802e5b8: f7f3 fe36 bl 8022228 <strncat>
  39144. GetOwnerStr(str, &len);
  39145. 802e5bc: a802 add r0, sp, #8
  39146. 802e5be: f10d 0107 add.w r1, sp, #7
  39147. 802e5c2: f7f9 fe21 bl 8028208 <GetOwnerStr>
  39148. strcat(buf, "\",\"owner\":\"");
  39149. 802e5c6: 4620 mov r0, r4
  39150. 802e5c8: 4934 ldr r1, [pc, #208] ; (802e69c <HTTP_GetInfo+0x1a0>)
  39151. 802e5ca: f7f3 fc8b bl 8021ee4 <strcat>
  39152. strncat(buf, str, len);
  39153. 802e5ce: f89d 2007 ldrb.w r2, [sp, #7]
  39154. 802e5d2: a902 add r1, sp, #8
  39155. 802e5d4: 4620 mov r0, r4
  39156. 802e5d6: f7f3 fe27 bl 8022228 <strncat>
  39157. GetLocationStr(str, &len);
  39158. 802e5da: a802 add r0, sp, #8
  39159. 802e5dc: f10d 0107 add.w r1, sp, #7
  39160. 802e5e0: f7f9 fe24 bl 802822c <GetLocationStr>
  39161. strcat(buf, "\",\"sysLocation\":\"");
  39162. 802e5e4: 4620 mov r0, r4
  39163. 802e5e6: 492e ldr r1, [pc, #184] ; (802e6a0 <HTTP_GetInfo+0x1a4>)
  39164. 802e5e8: f7f3 fc7c bl 8021ee4 <strcat>
  39165. strncat(buf, str, len);
  39166. 802e5ec: f89d 2007 ldrb.w r2, [sp, #7]
  39167. 802e5f0: a902 add r1, sp, #8
  39168. 802e5f2: 4620 mov r0, r4
  39169. 802e5f4: f7f3 fe18 bl 8022228 <strncat>
  39170. GetCommentsStr(str, &len);
  39171. 802e5f8: a802 add r0, sp, #8
  39172. 802e5fa: f10d 0107 add.w r1, sp, #7
  39173. 802e5fe: f7f9 fe27 bl 8028250 <GetCommentsStr>
  39174. strcat(buf, "\",\"comment\":\"");
  39175. 802e602: 4620 mov r0, r4
  39176. 802e604: 4927 ldr r1, [pc, #156] ; (802e6a4 <HTTP_GetInfo+0x1a8>)
  39177. 802e606: f7f3 fc6d bl 8021ee4 <strcat>
  39178. strncat(buf, str, len);
  39179. 802e60a: f89d 2007 ldrb.w r2, [sp, #7]
  39180. 802e60e: a902 add r1, sp, #8
  39181. 802e610: 4620 mov r0, r4
  39182. 802e612: f7f3 fe09 bl 8022228 <strncat>
  39183. GetUPSModelStr(str, &len);
  39184. 802e616: a802 add r0, sp, #8
  39185. 802e618: f10d 0107 add.w r1, sp, #7
  39186. 802e61c: f7f9 fe2a bl 8028274 <GetUPSModelStr>
  39187. strcat(buf, "\",\"ups_model\":\"");
  39188. 802e620: 4620 mov r0, r4
  39189. 802e622: 4921 ldr r1, [pc, #132] ; (802e6a8 <HTTP_GetInfo+0x1ac>)
  39190. 802e624: f7f3 fc5e bl 8021ee4 <strcat>
  39191. strncat(buf, str, len);
  39192. 802e628: f89d 2007 ldrb.w r2, [sp, #7]
  39193. 802e62c: a902 add r1, sp, #8
  39194. 802e62e: 4620 mov r0, r4
  39195. 802e630: f7f3 fdfa bl 8022228 <strncat>
  39196. GetUPSVersionStr(str, &len);
  39197. 802e634: a802 add r0, sp, #8
  39198. 802e636: f10d 0107 add.w r1, sp, #7
  39199. 802e63a: f7f9 fe2d bl 8028298 <GetUPSVersionStr>
  39200. strcat(buf, "\",\"ups_fwversion\":\"");
  39201. 802e63e: 4620 mov r0, r4
  39202. 802e640: 491a ldr r1, [pc, #104] ; (802e6ac <HTTP_GetInfo+0x1b0>)
  39203. 802e642: f7f3 fc4f bl 8021ee4 <strcat>
  39204. strncat(buf, str, len);
  39205. 802e646: f89d 2007 ldrb.w r2, [sp, #7]
  39206. 802e64a: a902 add r1, sp, #8
  39207. 802e64c: 4620 mov r0, r4
  39208. 802e64e: f7f3 fdeb bl 8022228 <strncat>
  39209. /* Признак изменения сетевых настроек */
  39210. GetWebReinitFlag(str, &len);
  39211. 802e652: a802 add r0, sp, #8
  39212. 802e654: f10d 0107 add.w r1, sp, #7
  39213. 802e658: f7f9 ff8c bl 8028574 <GetWebReinitFlag>
  39214. strcat(buf, "\",\"netsettings_changed\":\"");
  39215. 802e65c: 4620 mov r0, r4
  39216. 802e65e: 4914 ldr r1, [pc, #80] ; (802e6b0 <HTTP_GetInfo+0x1b4>)
  39217. 802e660: f7f3 fc40 bl 8021ee4 <strcat>
  39218. strncat(buf, str, len);
  39219. 802e664: a902 add r1, sp, #8
  39220. 802e666: f89d 2007 ldrb.w r2, [sp, #7]
  39221. 802e66a: 4620 mov r0, r4
  39222. 802e66c: f7f3 fddc bl 8022228 <strncat>
  39223. strncat(buf, "\"}", 2);
  39224. 802e670: 4620 mov r0, r4
  39225. 802e672: 4910 ldr r1, [pc, #64] ; (802e6b4 <HTTP_GetInfo+0x1b8>)
  39226. 802e674: 2202 movs r2, #2
  39227. 802e676: f7f3 fdd7 bl 8022228 <strncat>
  39228. }
  39229. 802e67a: b00c add sp, #48 ; 0x30
  39230. 802e67c: bd10 pop {r4, pc}
  39231. 802e67e: bf00 nop
  39232. 802e680: 0804439c .word 0x0804439c
  39233. 802e684: 080445db .word 0x080445db
  39234. 802e688: 080445e7 .word 0x080445e7
  39235. 802e68c: 080445f3 .word 0x080445f3
  39236. 802e690: 08044601 .word 0x08044601
  39237. 802e694: 08044611 .word 0x08044611
  39238. 802e698: 0804461f .word 0x0804461f
  39239. 802e69c: 0804462b .word 0x0804462b
  39240. 802e6a0: 08044637 .word 0x08044637
  39241. 802e6a4: 08044649 .word 0x08044649
  39242. 802e6a8: 08044657 .word 0x08044657
  39243. 802e6ac: 08044667 .word 0x08044667
  39244. 802e6b0: 0804446d .word 0x0804446d
  39245. 802e6b4: 08044487 .word 0x08044487
  39246. 0802e6b8 <HTTP_GetHistoryPage>:
  39247. void HTTP_GetHistoryPage(char* buf, uint32_t pageNumber)
  39248. {
  39249. 802e6b8: b530 push {r4, r5, lr}
  39250. 802e6ba: 4605 mov r5, r0
  39251. 802e6bc: b087 sub sp, #28
  39252. 802e6be: 460c mov r4, r1
  39253. char str[16];
  39254. uint16_t len;
  39255. strcpy(buf, "HTTP/1.1 200 OK\r\nContent-Type:text/html\r\n\r\n");
  39256. 802e6c0: 4927 ldr r1, [pc, #156] ; (802e760 <HTTP_GetHistoryPage+0xa8>)
  39257. 802e6c2: f7f3 fd23 bl 802210c <strcpy>
  39258. strcat(buf, "{\"page\": [");
  39259. 802e6c6: 4628 mov r0, r5
  39260. 802e6c8: 4926 ldr r1, [pc, #152] ; (802e764 <HTTP_GetHistoryPage+0xac>)
  39261. 802e6ca: f7f3 fc0b bl 8021ee4 <strcat>
  39262. History_GetPage(buf, pageNumber);
  39263. 802e6ce: 4621 mov r1, r4
  39264. 802e6d0: 4628 mov r0, r5
  39265. 802e6d2: f7fb ff11 bl 802a4f8 <History_GetPage>
  39266. len = strlen(buf);
  39267. 802e6d6: 4628 mov r0, r5
  39268. 802e6d8: f7f3 fd76 bl 80221c8 <strlen>
  39269. 802e6dc: f8ad 0006 strh.w r0, [sp, #6]
  39270. buf +=len-1;
  39271. 802e6e0: b280 uxth r0, r0
  39272. 802e6e2: 1e43 subs r3, r0, #1
  39273. 802e6e4: 18ec adds r4, r5, r3
  39274. *buf = 0;
  39275. 802e6e6: 2100 movs r1, #0
  39276. buf -=len-1;
  39277. 802e6e8: f1c0 0001 rsb r0, r0, #1
  39278. strcat(buf, "{\"page\": [");
  39279. History_GetPage(buf, pageNumber);
  39280. len = strlen(buf);
  39281. buf +=len-1;
  39282. *buf = 0;
  39283. 802e6ec: 54e9 strb r1, [r5, r3]
  39284. buf -=len-1;
  39285. 802e6ee: 1824 adds r4, r4, r0
  39286. /* Количество страниц */
  39287. memset(str, 0, 16);
  39288. 802e6f0: 2210 movs r2, #16
  39289. 802e6f2: a802 add r0, sp, #8
  39290. 802e6f4: f7f3 fb90 bl 8021e18 <memset>
  39291. sprintf(str, "%i", History_GetPageCount());
  39292. 802e6f8: f7fb feec bl 802a4d4 <History_GetPageCount>
  39293. 802e6fc: 491a ldr r1, [pc, #104] ; (802e768 <HTTP_GetHistoryPage+0xb0>)
  39294. 802e6fe: 4602 mov r2, r0
  39295. 802e700: a802 add r0, sp, #8
  39296. 802e702: f7f9 faf1 bl 8027ce8 <tfp_sprintf>
  39297. strcat(buf, "],\"pages\":\"");
  39298. 802e706: 4620 mov r0, r4
  39299. 802e708: 4918 ldr r1, [pc, #96] ; (802e76c <HTTP_GetHistoryPage+0xb4>)
  39300. 802e70a: f7f3 fbeb bl 8021ee4 <strcat>
  39301. strcat(buf, str);
  39302. 802e70e: a902 add r1, sp, #8
  39303. 802e710: 4620 mov r0, r4
  39304. 802e712: f7f3 fbe7 bl 8021ee4 <strcat>
  39305. /* Часовой пояс */
  39306. GetSntpTimeZoneStr(str, (uint8_t*)&len);
  39307. 802e716: a802 add r0, sp, #8
  39308. 802e718: f10d 0106 add.w r1, sp, #6
  39309. 802e71c: f7f9 fc46 bl 8027fac <GetSntpTimeZoneStr>
  39310. strcat(buf, "\",\"utc\":\"");
  39311. 802e720: 4620 mov r0, r4
  39312. 802e722: 4913 ldr r1, [pc, #76] ; (802e770 <HTTP_GetHistoryPage+0xb8>)
  39313. 802e724: f7f3 fbde bl 8021ee4 <strcat>
  39314. strncat(buf, str, len);
  39315. 802e728: f8bd 2006 ldrh.w r2, [sp, #6]
  39316. 802e72c: a902 add r1, sp, #8
  39317. 802e72e: 4620 mov r0, r4
  39318. 802e730: f7f3 fd7a bl 8022228 <strncat>
  39319. GetUnixTimeStr(str, (uint8_t*)&len);
  39320. 802e734: a802 add r0, sp, #8
  39321. 802e736: f10d 0106 add.w r1, sp, #6
  39322. 802e73a: f7f9 fbf7 bl 8027f2c <GetUnixTimeStr>
  39323. strcat(buf, "\",\"utm\":\"");
  39324. 802e73e: 4620 mov r0, r4
  39325. 802e740: 490c ldr r1, [pc, #48] ; (802e774 <HTTP_GetHistoryPage+0xbc>)
  39326. 802e742: f7f3 fbcf bl 8021ee4 <strcat>
  39327. strncat(buf, str, len);
  39328. 802e746: a902 add r1, sp, #8
  39329. 802e748: 4620 mov r0, r4
  39330. 802e74a: f8bd 2006 ldrh.w r2, [sp, #6]
  39331. 802e74e: f7f3 fd6b bl 8022228 <strncat>
  39332. strcat(buf, "\"}");
  39333. 802e752: 4620 mov r0, r4
  39334. 802e754: 4908 ldr r1, [pc, #32] ; (802e778 <HTTP_GetHistoryPage+0xc0>)
  39335. 802e756: f7f3 fbc5 bl 8021ee4 <strcat>
  39336. //printf(buf);
  39337. }
  39338. 802e75a: b007 add sp, #28
  39339. 802e75c: bd30 pop {r4, r5, pc}
  39340. 802e75e: bf00 nop
  39341. 802e760: 0804467b .word 0x0804467b
  39342. 802e764: 080446a7 .word 0x080446a7
  39343. 802e768: 080446b2 .word 0x080446b2
  39344. 802e76c: 080446b5 .word 0x080446b5
  39345. 802e770: 080445b4 .word 0x080445b4
  39346. 802e774: 080445be .word 0x080445be
  39347. 802e778: 08044487 .word 0x08044487
  39348. 0802e77c <HTTP_GetUpsHistoryPage>:
  39349. void HTTP_GetUpsHistoryPage(char* buf, uint32_t pageNumber)
  39350. {
  39351. 802e77c: b530 push {r4, r5, lr}
  39352. 802e77e: 4605 mov r5, r0
  39353. 802e780: b087 sub sp, #28
  39354. 802e782: 460c mov r4, r1
  39355. char str[16];
  39356. uint16_t len;
  39357. strcpy(buf, "HTTP/1.1 200 OK\r\nContent-Type:text/html\r\n\r\n");
  39358. 802e784: 4927 ldr r1, [pc, #156] ; (802e824 <HTTP_GetUpsHistoryPage+0xa8>)
  39359. 802e786: f7f3 fcc1 bl 802210c <strcpy>
  39360. strcat(buf, "{\"page\": [");
  39361. 802e78a: 4628 mov r0, r5
  39362. 802e78c: 4926 ldr r1, [pc, #152] ; (802e828 <HTTP_GetUpsHistoryPage+0xac>)
  39363. 802e78e: f7f3 fba9 bl 8021ee4 <strcat>
  39364. LOG_GetPage(buf, pageNumber);
  39365. 802e792: 4621 mov r1, r4
  39366. 802e794: 4628 mov r0, r5
  39367. 802e796: f7fb fdc3 bl 802a320 <LOG_GetPage>
  39368. len = strlen(buf);
  39369. 802e79a: 4628 mov r0, r5
  39370. 802e79c: f7f3 fd14 bl 80221c8 <strlen>
  39371. 802e7a0: f8ad 0006 strh.w r0, [sp, #6]
  39372. buf +=len-1;
  39373. 802e7a4: b280 uxth r0, r0
  39374. 802e7a6: 1e43 subs r3, r0, #1
  39375. 802e7a8: 18ec adds r4, r5, r3
  39376. *buf = 0;
  39377. 802e7aa: 2100 movs r1, #0
  39378. buf -=len-1;
  39379. 802e7ac: f1c0 0001 rsb r0, r0, #1
  39380. strcat(buf, "{\"page\": [");
  39381. LOG_GetPage(buf, pageNumber);
  39382. len = strlen(buf);
  39383. buf +=len-1;
  39384. *buf = 0;
  39385. 802e7b0: 54e9 strb r1, [r5, r3]
  39386. buf -=len-1;
  39387. 802e7b2: 1824 adds r4, r4, r0
  39388. /* Количество страниц */
  39389. memset(str, 0, 16);
  39390. 802e7b4: 2210 movs r2, #16
  39391. 802e7b6: a802 add r0, sp, #8
  39392. 802e7b8: f7f3 fb2e bl 8021e18 <memset>
  39393. sprintf(str, "%i", LOG_GetPageCount());
  39394. 802e7bc: f7fb fd9e bl 802a2fc <LOG_GetPageCount>
  39395. 802e7c0: 491a ldr r1, [pc, #104] ; (802e82c <HTTP_GetUpsHistoryPage+0xb0>)
  39396. 802e7c2: 4602 mov r2, r0
  39397. 802e7c4: a802 add r0, sp, #8
  39398. 802e7c6: f7f9 fa8f bl 8027ce8 <tfp_sprintf>
  39399. strcat(buf, "],\"pages\":\"");
  39400. 802e7ca: 4620 mov r0, r4
  39401. 802e7cc: 4918 ldr r1, [pc, #96] ; (802e830 <HTTP_GetUpsHistoryPage+0xb4>)
  39402. 802e7ce: f7f3 fb89 bl 8021ee4 <strcat>
  39403. strcat(buf, str);
  39404. 802e7d2: a902 add r1, sp, #8
  39405. 802e7d4: 4620 mov r0, r4
  39406. 802e7d6: f7f3 fb85 bl 8021ee4 <strcat>
  39407. /* Часовой пояс */
  39408. GetSntpTimeZoneStr(str, (uint8_t*)&len);
  39409. 802e7da: a802 add r0, sp, #8
  39410. 802e7dc: f10d 0106 add.w r1, sp, #6
  39411. 802e7e0: f7f9 fbe4 bl 8027fac <GetSntpTimeZoneStr>
  39412. strcat(buf, "\",\"utc\":\"");
  39413. 802e7e4: 4620 mov r0, r4
  39414. 802e7e6: 4913 ldr r1, [pc, #76] ; (802e834 <HTTP_GetUpsHistoryPage+0xb8>)
  39415. 802e7e8: f7f3 fb7c bl 8021ee4 <strcat>
  39416. strncat(buf, str, len);
  39417. 802e7ec: f8bd 2006 ldrh.w r2, [sp, #6]
  39418. 802e7f0: a902 add r1, sp, #8
  39419. 802e7f2: 4620 mov r0, r4
  39420. 802e7f4: f7f3 fd18 bl 8022228 <strncat>
  39421. GetUnixTimeStr(str, (uint8_t*)&len);
  39422. 802e7f8: a802 add r0, sp, #8
  39423. 802e7fa: f10d 0106 add.w r1, sp, #6
  39424. 802e7fe: f7f9 fb95 bl 8027f2c <GetUnixTimeStr>
  39425. strcat(buf, "\",\"utm\":\"");
  39426. 802e802: 4620 mov r0, r4
  39427. 802e804: 490c ldr r1, [pc, #48] ; (802e838 <HTTP_GetUpsHistoryPage+0xbc>)
  39428. 802e806: f7f3 fb6d bl 8021ee4 <strcat>
  39429. strncat(buf, str, len);
  39430. 802e80a: a902 add r1, sp, #8
  39431. 802e80c: 4620 mov r0, r4
  39432. 802e80e: f8bd 2006 ldrh.w r2, [sp, #6]
  39433. 802e812: f7f3 fd09 bl 8022228 <strncat>
  39434. strcat(buf, "\"}");
  39435. 802e816: 4620 mov r0, r4
  39436. 802e818: 4908 ldr r1, [pc, #32] ; (802e83c <HTTP_GetUpsHistoryPage+0xc0>)
  39437. 802e81a: f7f3 fb63 bl 8021ee4 <strcat>
  39438. //printf(buf);
  39439. }
  39440. 802e81e: b007 add sp, #28
  39441. 802e820: bd30 pop {r4, r5, pc}
  39442. 802e822: bf00 nop
  39443. 802e824: 0804467b .word 0x0804467b
  39444. 802e828: 080446a7 .word 0x080446a7
  39445. 802e82c: 080446b2 .word 0x080446b2
  39446. 802e830: 080446b5 .word 0x080446b5
  39447. 802e834: 080445b4 .word 0x080445b4
  39448. 802e838: 080445be .word 0x080445be
  39449. 802e83c: 08044487 .word 0x08044487
  39450. 0802e840 <HTTP_ResetSettings>:
  39451. /**
  39452. * @brief Сброс настроек (всё кроме сетевых параметров)
  39453. */
  39454. void HTTP_ResetSettings(void)
  39455. {
  39456. 802e840: b508 push {r3, lr}
  39457. //taskENTER_CRITICAL();
  39458. SNMP_SendUserTrap(DEVICE_RESTORED);
  39459. 802e842: 2003 movs r0, #3
  39460. 802e844: f009 fa4c bl 8037ce0 <SNMP_SendUserTrap>
  39461. log_event_data(LOG_SYSTEM_DEFCONFIG, "Администратор");
  39462. 802e848: 4906 ldr r1, [pc, #24] ; (802e864 <HTTP_ResetSettings+0x24>)
  39463. 802e84a: 2001 movs r0, #1
  39464. 802e84c: f7fb fd0a bl 802a264 <log_event_data>
  39465. vTaskDelay(500);
  39466. 802e850: f44f 70fa mov.w r0, #500 ; 0x1f4
  39467. 802e854: f7fd f92c bl 802bab0 <vTaskDelay>
  39468. SETTINGS_SetPartDefault();
  39469. 802e858: f7fa fac8 bl 8028dec <SETTINGS_SetPartDefault>
  39470. SETTINGS_Save();
  39471. //taskEXIT_CRITICAL();
  39472. }
  39473. 802e85c: e8bd 4008 ldmia.w sp!, {r3, lr}
  39474. SNMP_SendUserTrap(DEVICE_RESTORED);
  39475. log_event_data(LOG_SYSTEM_DEFCONFIG, "Администратор");
  39476. vTaskDelay(500);
  39477. SETTINGS_SetPartDefault();
  39478. SETTINGS_Save();
  39479. 802e860: f7fa ba58 b.w 8028d14 <SETTINGS_Save>
  39480. 802e864: 0803928f .word 0x0803928f
  39481. 0802e868 <HTTP_SaveSettings>:
  39482. /**
  39483. * @brief Сохранение настроек
  39484. */
  39485. void HTTP_SaveSettings(void)
  39486. {
  39487. 802e868: b508 push {r3, lr}
  39488. // taskENTER_CRITICAL();
  39489. SETTINGS_Save();
  39490. 802e86a: f7fa fa53 bl 8028d14 <SETTINGS_Save>
  39491. log_event_data(LOG_SETTING_SAVE, "Администратор");
  39492. 802e86e: 4903 ldr r1, [pc, #12] ; (802e87c <HTTP_SaveSettings+0x14>)
  39493. 802e870: 2004 movs r0, #4
  39494. // taskEXIT_CRITICAL();
  39495. }
  39496. 802e872: e8bd 4008 ldmia.w sp!, {r3, lr}
  39497. {
  39498. // taskENTER_CRITICAL();
  39499. SETTINGS_Save();
  39500. log_event_data(LOG_SETTING_SAVE, "Администратор");
  39501. 802e876: f7fb bcf5 b.w 802a264 <log_event_data>
  39502. 802e87a: bf00 nop
  39503. 802e87c: 0803928f .word 0x0803928f
  39504. 0802e880 <vTaskReboot>:
  39505. /**
  39506. * @brief
  39507. */
  39508. void vTaskReboot(void * pvParameters)
  39509. {
  39510. 802e880: b510 push {r4, lr}
  39511. 802e882: 4604 mov r4, r0
  39512. for (;;)
  39513. {
  39514. mode = *(bool*)pvParameters;
  39515. if (mode)
  39516. 802e884: 7823 ldrb r3, [r4, #0]
  39517. 802e886: b16b cbz r3, 802e8a4 <vTaskReboot+0x24>
  39518. {
  39519. SNMP_SendUserTrap(FW_VERSION_UPDATE);
  39520. 802e888: 2001 movs r0, #1
  39521. 802e88a: f009 fa29 bl 8037ce0 <SNMP_SendUserTrap>
  39522. log_event_data(LOG_UPDATE_SOFT, "Администратор");
  39523. 802e88e: 2002 movs r0, #2
  39524. 802e890: 490a ldr r1, [pc, #40] ; (802e8bc <vTaskReboot+0x3c>)
  39525. 802e892: f7fb fce7 bl 802a264 <log_event_data>
  39526. SetLoadMode();
  39527. 802e896: f7f9 fe87 bl 80285a8 <SetLoadMode>
  39528. HTTP_SaveSettings();
  39529. 802e89a: f7ff ffe5 bl 802e868 <HTTP_SaveSettings>
  39530. vTaskDelay(2000);
  39531. 802e89e: f44f 60fa mov.w r0, #2000 ; 0x7d0
  39532. 802e8a2: e001 b.n 802e8a8 <vTaskReboot+0x28>
  39533. vTaskDelay(1010);
  39534. Reboot();
  39535. }
  39536. else
  39537. {
  39538. vTaskDelay(1000);
  39539. 802e8a4: f44f 707a mov.w r0, #1000 ; 0x3e8
  39540. 802e8a8: f7fd f902 bl 802bab0 <vTaskDelay>
  39541. /* Блокируем управление ключем на тау секунд*/
  39542. //IO_KeyBlockOn();
  39543. vTaskDelay(1010);
  39544. 802e8ac: f240 30f2 movw r0, #1010 ; 0x3f2
  39545. 802e8b0: f7fd f8fe bl 802bab0 <vTaskDelay>
  39546. Reboot();
  39547. 802e8b4: f7fa ffdc bl 8029870 <Reboot>
  39548. 802e8b8: e7e4 b.n 802e884 <vTaskReboot+0x4>
  39549. 802e8ba: bf00 nop
  39550. 802e8bc: 0803928f .word 0x0803928f
  39551. 0802e8c0 <HTTP_Reboot>:
  39552. /**
  39553. * @brief Перезагрузка контроллера
  39554. */
  39555. void HTTP_Reboot(void)
  39556. {
  39557. 802e8c0: b508 push {r3, lr}
  39558. vTaskDelay(1010);
  39559. 802e8c2: f240 30f2 movw r0, #1010 ; 0x3f2
  39560. 802e8c6: f7fd f8f3 bl 802bab0 <vTaskDelay>
  39561. Reboot();
  39562. }
  39563. 802e8ca: e8bd 4008 ldmia.w sp!, {r3, lr}
  39564. * @brief Перезагрузка контроллера
  39565. */
  39566. void HTTP_Reboot(void)
  39567. {
  39568. vTaskDelay(1010);
  39569. Reboot();
  39570. 802e8ce: f7fa bfcf b.w 8029870 <Reboot>
  39571. 802e8d2: 0000 movs r0, r0
  39572. 0802e8d4 <HTTP_StartResetTask>:
  39573. * bootloader и перезаписаны настройки
  39574. *
  39575. * false - обычная перезагрузка
  39576. */
  39577. void HTTP_StartResetTask(bool fBootMode)
  39578. {
  39579. 802e8d4: b51f push {r0, r1, r2, r3, r4, lr}
  39580. static bool temp;
  39581. temp = fBootMode;
  39582. 802e8d6: 4b07 ldr r3, [pc, #28] ; (802e8f4 <HTTP_StartResetTask+0x20>)
  39583. xTaskCreate(vTaskReboot, "RebootTask", configMINIMAL_STACK_SIZE,
  39584. 802e8d8: 4907 ldr r1, [pc, #28] ; (802e8f8 <HTTP_StartResetTask+0x24>)
  39585. */
  39586. void HTTP_StartResetTask(bool fBootMode)
  39587. {
  39588. static bool temp;
  39589. temp = fBootMode;
  39590. 802e8da: 7018 strb r0, [r3, #0]
  39591. xTaskCreate(vTaskReboot, "RebootTask", configMINIMAL_STACK_SIZE,
  39592. 802e8dc: 2200 movs r2, #0
  39593. 802e8de: 9200 str r2, [sp, #0]
  39594. 802e8e0: 9201 str r2, [sp, #4]
  39595. 802e8e2: 9202 str r2, [sp, #8]
  39596. 802e8e4: 9203 str r2, [sp, #12]
  39597. 802e8e6: 4805 ldr r0, [pc, #20] ; (802e8fc <HTTP_StartResetTask+0x28>)
  39598. 802e8e8: 2280 movs r2, #128 ; 0x80
  39599. 802e8ea: f7fc fe47 bl 802b57c <xTaskGenericCreate>
  39600. (void*)&temp, tskIDLE_PRIORITY, NULL);
  39601. }
  39602. 802e8ee: b005 add sp, #20
  39603. 802e8f0: bd00 pop {pc}
  39604. 802e8f2: bf00 nop
  39605. 802e8f4: 20000d8a .word 0x20000d8a
  39606. 802e8f8: 080446c1 .word 0x080446c1
  39607. 802e8fc: 0802e881 .word 0x0802e881
  39608. 0802e900 <tcpip_thread>:
  39609. tcpip_thread(void *arg)
  39610. {
  39611. struct tcpip_msg *msg;
  39612. LWIP_UNUSED_ARG(arg);
  39613. if (tcpip_init_done != NULL) {
  39614. 802e900: 4b1e ldr r3, [pc, #120] ; (802e97c <tcpip_thread+0x7c>)
  39615. 802e902: 681b ldr r3, [r3, #0]
  39616. *
  39617. * @param arg unused argument
  39618. */
  39619. static void
  39620. tcpip_thread(void *arg)
  39621. {
  39622. 802e904: b507 push {r0, r1, r2, lr}
  39623. struct tcpip_msg *msg;
  39624. LWIP_UNUSED_ARG(arg);
  39625. if (tcpip_init_done != NULL) {
  39626. 802e906: b113 cbz r3, 802e90e <tcpip_thread+0xe>
  39627. tcpip_init_done(tcpip_init_done_arg);
  39628. 802e908: 4a1d ldr r2, [pc, #116] ; (802e980 <tcpip_thread+0x80>)
  39629. 802e90a: 6810 ldr r0, [r2, #0]
  39630. 802e90c: 4798 blx r3
  39631. LOCK_TCPIP_CORE();
  39632. while (1) { /* MAIN Loop */
  39633. UNLOCK_TCPIP_CORE();
  39634. LWIP_TCPIP_THREAD_ALIVE();
  39635. /* wait for a message, timeouts are processed while waiting */
  39636. sys_timeouts_mbox_fetch(&mbox, (void **)&msg);
  39637. 802e90e: 481d ldr r0, [pc, #116] ; (802e984 <tcpip_thread+0x84>)
  39638. 802e910: a901 add r1, sp, #4
  39639. 802e912: f003 fd0d bl 8032330 <sys_timeouts_mbox_fetch>
  39640. LOCK_TCPIP_CORE();
  39641. switch (msg->type) {
  39642. 802e916: 9b01 ldr r3, [sp, #4]
  39643. 802e918: 781a ldrb r2, [r3, #0]
  39644. 802e91a: 2a05 cmp r2, #5
  39645. 802e91c: d8f7 bhi.n 802e90e <tcpip_thread+0xe>
  39646. 802e91e: e8df f002 tbb [pc, r2]
  39647. 802e922: 0703 .short 0x0703
  39648. 802e924: 28201b15 .word 0x28201b15
  39649. #if LWIP_NETCONN
  39650. case TCPIP_MSG_API:
  39651. LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: API message %p\n", (void *)msg));
  39652. msg->msg.apimsg->function(&(msg->msg.apimsg->msg));
  39653. 802e928: 6898 ldr r0, [r3, #8]
  39654. 802e92a: 6803 ldr r3, [r0, #0]
  39655. 802e92c: 3004 adds r0, #4
  39656. 802e92e: e7ed b.n 802e90c <tcpip_thread+0xc>
  39657. #if !LWIP_TCPIP_CORE_LOCKING_INPUT
  39658. case TCPIP_MSG_INPKT:
  39659. LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: PACKET %p\n", (void *)msg));
  39660. #if LWIP_ETHERNET
  39661. if (msg->msg.inp.netif->flags & (NETIF_FLAG_ETHARP | NETIF_FLAG_ETHERNET)) {
  39662. 802e930: 68d9 ldr r1, [r3, #12]
  39663. ethernet_input(msg->msg.inp.p, msg->msg.inp.netif);
  39664. 802e932: 6898 ldr r0, [r3, #8]
  39665. #if !LWIP_TCPIP_CORE_LOCKING_INPUT
  39666. case TCPIP_MSG_INPKT:
  39667. LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: PACKET %p\n", (void *)msg));
  39668. #if LWIP_ETHERNET
  39669. if (msg->msg.inp.netif->flags & (NETIF_FLAG_ETHARP | NETIF_FLAG_ETHERNET)) {
  39670. 802e934: f891 202d ldrb.w r2, [r1, #45] ; 0x2d
  39671. 802e938: f012 0f60 tst.w r2, #96 ; 0x60
  39672. 802e93c: d002 beq.n 802e944 <tcpip_thread+0x44>
  39673. ethernet_input(msg->msg.inp.p, msg->msg.inp.netif);
  39674. 802e93e: f008 fb71 bl 8037024 <ethernet_input>
  39675. 802e942: e001 b.n 802e948 <tcpip_thread+0x48>
  39676. } else
  39677. #endif /* LWIP_ETHERNET */
  39678. {
  39679. ip_input(msg->msg.inp.p, msg->msg.inp.netif);
  39680. 802e944: f004 f94e bl 8032be4 <ip_input>
  39681. }
  39682. memp_free(MEMP_TCPIP_MSG_INPKT, msg);
  39683. 802e948: 2008 movs r0, #8
  39684. 802e94a: e00e b.n 802e96a <tcpip_thread+0x6a>
  39685. #endif /* LWIP_NETIF_API */
  39686. #if LWIP_TCPIP_TIMEOUT
  39687. case TCPIP_MSG_TIMEOUT:
  39688. LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: TIMEOUT %p\n", (void *)msg));
  39689. sys_timeout(msg->msg.tmo.msecs, msg->msg.tmo.h, msg->msg.tmo.arg);
  39690. 802e94c: f103 0008 add.w r0, r3, #8
  39691. 802e950: c807 ldmia r0, {r0, r1, r2}
  39692. 802e952: f003 fc1f bl 8032194 <sys_timeout>
  39693. 802e956: e007 b.n 802e968 <tcpip_thread+0x68>
  39694. memp_free(MEMP_TCPIP_MSG_API, msg);
  39695. break;
  39696. case TCPIP_MSG_UNTIMEOUT:
  39697. LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: UNTIMEOUT %p\n", (void *)msg));
  39698. sys_untimeout(msg->msg.tmo.h, msg->msg.tmo.arg);
  39699. 802e958: 68d8 ldr r0, [r3, #12]
  39700. 802e95a: 6919 ldr r1, [r3, #16]
  39701. 802e95c: f003 fcc4 bl 80322e8 <sys_untimeout>
  39702. 802e960: e002 b.n 802e968 <tcpip_thread+0x68>
  39703. break;
  39704. #endif /* LWIP_TCPIP_TIMEOUT */
  39705. case TCPIP_MSG_CALLBACK:
  39706. LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: CALLBACK %p\n", (void *)msg));
  39707. msg->msg.cb.function(msg->msg.cb.ctx);
  39708. 802e962: 689a ldr r2, [r3, #8]
  39709. 802e964: 68d8 ldr r0, [r3, #12]
  39710. 802e966: 4790 blx r2
  39711. memp_free(MEMP_TCPIP_MSG_API, msg);
  39712. 802e968: 2007 movs r0, #7
  39713. 802e96a: 9901 ldr r1, [sp, #4]
  39714. 802e96c: f001 f882 bl 802fa74 <memp_free>
  39715. break;
  39716. 802e970: e7cd b.n 802e90e <tcpip_thread+0xe>
  39717. case TCPIP_MSG_CALLBACK_STATIC:
  39718. LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: CALLBACK_STATIC %p\n", (void *)msg));
  39719. msg->msg.cb.function(msg->msg.cb.ctx);
  39720. 802e972: 689a ldr r2, [r3, #8]
  39721. 802e974: 68d8 ldr r0, [r3, #12]
  39722. 802e976: 4790 blx r2
  39723. break;
  39724. 802e978: e7c9 b.n 802e90e <tcpip_thread+0xe>
  39725. 802e97a: bf00 nop
  39726. 802e97c: 20000d94 .word 0x20000d94
  39727. 802e980: 20000d90 .word 0x20000d90
  39728. 802e984: 20000d8c .word 0x20000d8c
  39729. 0802e988 <tcpip_input>:
  39730. * NETIF_FLAG_ETHERNET flags)
  39731. * @param inp the network interface on which the packet was received
  39732. */
  39733. err_t
  39734. tcpip_input(struct pbuf *p, struct netif *inp)
  39735. {
  39736. 802e988: b5f8 push {r3, r4, r5, r6, r7, lr}
  39737. UNLOCK_TCPIP_CORE();
  39738. return ret;
  39739. #else /* LWIP_TCPIP_CORE_LOCKING_INPUT */
  39740. struct tcpip_msg *msg;
  39741. if (!sys_mbox_valid(&mbox)) {
  39742. 802e98a: 4d0e ldr r5, [pc, #56] ; (802e9c4 <tcpip_input+0x3c>)
  39743. 802e98c: 682b ldr r3, [r5, #0]
  39744. * NETIF_FLAG_ETHERNET flags)
  39745. * @param inp the network interface on which the packet was received
  39746. */
  39747. err_t
  39748. tcpip_input(struct pbuf *p, struct netif *inp)
  39749. {
  39750. 802e98e: 4606 mov r6, r0
  39751. 802e990: 460f mov r7, r1
  39752. UNLOCK_TCPIP_CORE();
  39753. return ret;
  39754. #else /* LWIP_TCPIP_CORE_LOCKING_INPUT */
  39755. struct tcpip_msg *msg;
  39756. if (!sys_mbox_valid(&mbox)) {
  39757. 802e992: b193 cbz r3, 802e9ba <tcpip_input+0x32>
  39758. return ERR_VAL;
  39759. }
  39760. msg = (struct tcpip_msg *)memp_malloc(MEMP_TCPIP_MSG_INPKT);
  39761. 802e994: 2008 movs r0, #8
  39762. 802e996: f001 f857 bl 802fa48 <memp_malloc>
  39763. if (msg == NULL) {
  39764. 802e99a: 4604 mov r4, r0
  39765. 802e99c: b178 cbz r0, 802e9be <tcpip_input+0x36>
  39766. return ERR_MEM;
  39767. }
  39768. msg->type = TCPIP_MSG_INPKT;
  39769. 802e99e: 2301 movs r3, #1
  39770. 802e9a0: 7003 strb r3, [r0, #0]
  39771. msg->msg.inp.p = p;
  39772. 802e9a2: 6086 str r6, [r0, #8]
  39773. msg->msg.inp.netif = inp;
  39774. 802e9a4: 60c7 str r7, [r0, #12]
  39775. if (sys_mbox_trypost(&mbox, msg) != ERR_OK) {
  39776. 802e9a6: 4621 mov r1, r4
  39777. 802e9a8: 4628 mov r0, r5
  39778. 802e9aa: f008 fd89 bl 80374c0 <sys_mbox_trypost>
  39779. 802e9ae: b138 cbz r0, 802e9c0 <tcpip_input+0x38>
  39780. memp_free(MEMP_TCPIP_MSG_INPKT, msg);
  39781. 802e9b0: 2008 movs r0, #8
  39782. 802e9b2: 4621 mov r1, r4
  39783. 802e9b4: f001 f85e bl 802fa74 <memp_free>
  39784. 802e9b8: e001 b.n 802e9be <tcpip_input+0x36>
  39785. return ret;
  39786. #else /* LWIP_TCPIP_CORE_LOCKING_INPUT */
  39787. struct tcpip_msg *msg;
  39788. if (!sys_mbox_valid(&mbox)) {
  39789. return ERR_VAL;
  39790. 802e9ba: 20fa movs r0, #250 ; 0xfa
  39791. 802e9bc: e000 b.n 802e9c0 <tcpip_input+0x38>
  39792. }
  39793. msg = (struct tcpip_msg *)memp_malloc(MEMP_TCPIP_MSG_INPKT);
  39794. if (msg == NULL) {
  39795. return ERR_MEM;
  39796. 802e9be: 20ff movs r0, #255 ; 0xff
  39797. memp_free(MEMP_TCPIP_MSG_INPKT, msg);
  39798. return ERR_MEM;
  39799. }
  39800. return ERR_OK;
  39801. #endif /* LWIP_TCPIP_CORE_LOCKING_INPUT */
  39802. }
  39803. 802e9c0: b240 sxtb r0, r0
  39804. 802e9c2: bdf8 pop {r3, r4, r5, r6, r7, pc}
  39805. 802e9c4: 20000d8c .word 0x20000d8c
  39806. 0802e9c8 <tcpip_init>:
  39807. * @param initfunc a function to call when tcpip_thread is running and finished initializing
  39808. * @param arg argument to pass to initfunc
  39809. */
  39810. void
  39811. tcpip_init(tcpip_init_done_fn initfunc, void *arg)
  39812. {
  39813. 802e9c8: b537 push {r0, r1, r2, r4, r5, lr}
  39814. 802e9ca: 4604 mov r4, r0
  39815. 802e9cc: 460d mov r5, r1
  39816. lwip_init();
  39817. 802e9ce: f000 feb3 bl 802f738 <lwip_init>
  39818. tcpip_init_done = initfunc;
  39819. 802e9d2: 4b09 ldr r3, [pc, #36] ; (802e9f8 <tcpip_init+0x30>)
  39820. tcpip_init_done_arg = arg;
  39821. if(sys_mbox_new(&mbox, TCPIP_MBOX_SIZE) != ERR_OK) {
  39822. 802e9d4: 4809 ldr r0, [pc, #36] ; (802e9fc <tcpip_init+0x34>)
  39823. void
  39824. tcpip_init(tcpip_init_done_fn initfunc, void *arg)
  39825. {
  39826. lwip_init();
  39827. tcpip_init_done = initfunc;
  39828. 802e9d6: 601c str r4, [r3, #0]
  39829. tcpip_init_done_arg = arg;
  39830. 802e9d8: 4b09 ldr r3, [pc, #36] ; (802ea00 <tcpip_init+0x38>)
  39831. if(sys_mbox_new(&mbox, TCPIP_MBOX_SIZE) != ERR_OK) {
  39832. 802e9da: 2132 movs r1, #50 ; 0x32
  39833. tcpip_init(tcpip_init_done_fn initfunc, void *arg)
  39834. {
  39835. lwip_init();
  39836. tcpip_init_done = initfunc;
  39837. tcpip_init_done_arg = arg;
  39838. 802e9dc: 601d str r5, [r3, #0]
  39839. if(sys_mbox_new(&mbox, TCPIP_MBOX_SIZE) != ERR_OK) {
  39840. 802e9de: f008 fd61 bl 80374a4 <sys_mbox_new>
  39841. if(sys_mutex_new(&lock_tcpip_core) != ERR_OK) {
  39842. LWIP_ASSERT("failed to create lock_tcpip_core", 0);
  39843. }
  39844. #endif /* LWIP_TCPIP_CORE_LOCKING */
  39845. sys_thread_new(TCPIP_THREAD_NAME, tcpip_thread, NULL, TCPIP_THREAD_STACKSIZE, TCPIP_THREAD_PRIO);
  39846. 802e9e2: 2303 movs r3, #3
  39847. 802e9e4: 9300 str r3, [sp, #0]
  39848. 802e9e6: 4907 ldr r1, [pc, #28] ; (802ea04 <tcpip_init+0x3c>)
  39849. 802e9e8: 4807 ldr r0, [pc, #28] ; (802ea08 <tcpip_init+0x40>)
  39850. 802e9ea: 2200 movs r2, #0
  39851. 802e9ec: f44f 73c8 mov.w r3, #400 ; 0x190
  39852. 802e9f0: f008 fdd7 bl 80375a2 <sys_thread_new>
  39853. }
  39854. 802e9f4: bd3e pop {r1, r2, r3, r4, r5, pc}
  39855. 802e9f6: bf00 nop
  39856. 802e9f8: 20000d94 .word 0x20000d94
  39857. 802e9fc: 20000d8c .word 0x20000d8c
  39858. 802ea00: 20000d90 .word 0x20000d90
  39859. 802ea04: 0802e901 .word 0x0802e901
  39860. 802ea08: 080446cc .word 0x080446cc
  39861. 0802ea0c <lwip_htons>:
  39862. * @return n in network byte order
  39863. */
  39864. u16_t
  39865. lwip_htons(u16_t n)
  39866. {
  39867. return ((n & 0xff) << 8) | ((n & 0xff00) >> 8);
  39868. 802ea0c: 0a03 lsrs r3, r0, #8
  39869. 802ea0e: ea43 2000 orr.w r0, r3, r0, lsl #8
  39870. }
  39871. 802ea12: b280 uxth r0, r0
  39872. 802ea14: 4770 bx lr
  39873. 0802ea16 <lwip_ntohs>:
  39874. * @return n in network byte order
  39875. */
  39876. u16_t
  39877. lwip_htons(u16_t n)
  39878. {
  39879. return ((n & 0xff) << 8) | ((n & 0xff00) >> 8);
  39880. 802ea16: 0a03 lsrs r3, r0, #8
  39881. 802ea18: ea43 2000 orr.w r0, r3, r0, lsl #8
  39882. */
  39883. u16_t
  39884. lwip_ntohs(u16_t n)
  39885. {
  39886. return lwip_htons(n);
  39887. }
  39888. 802ea1c: b280 uxth r0, r0
  39889. 802ea1e: 4770 bx lr
  39890. 0802ea20 <lwip_htonl>:
  39891. {
  39892. return ((n & 0xff) << 24) |
  39893. ((n & 0xff00) << 8) |
  39894. ((n & 0xff0000UL) >> 8) |
  39895. ((n & 0xff000000UL) >> 24);
  39896. }
  39897. 802ea20: ba00 rev r0, r0
  39898. 802ea22: 4770 bx lr
  39899. 0802ea24 <lwip_ntohl>:
  39900. * @return n in host byte order
  39901. */
  39902. u32_t
  39903. lwip_ntohl(u32_t n)
  39904. {
  39905. return lwip_htonl(n);
  39906. 802ea24: f7ff bffc b.w 802ea20 <lwip_htonl>
  39907. 0802ea28 <dhcp_set_state>:
  39908. * If the state changed, reset the number of tries.
  39909. */
  39910. static void
  39911. dhcp_set_state(struct dhcp *dhcp, u8_t new_state)
  39912. {
  39913. if (new_state != dhcp->state) {
  39914. 802ea28: 7b03 ldrb r3, [r0, #12]
  39915. 802ea2a: 428b cmp r3, r1
  39916. 802ea2c: d003 beq.n 802ea36 <dhcp_set_state+0xe>
  39917. dhcp->state = new_state;
  39918. dhcp->tries = 0;
  39919. 802ea2e: 2300 movs r3, #0
  39920. */
  39921. static void
  39922. dhcp_set_state(struct dhcp *dhcp, u8_t new_state)
  39923. {
  39924. if (new_state != dhcp->state) {
  39925. dhcp->state = new_state;
  39926. 802ea30: 7301 strb r1, [r0, #12]
  39927. dhcp->tries = 0;
  39928. 802ea32: 7343 strb r3, [r0, #13]
  39929. dhcp->request_timeout = 0;
  39930. 802ea34: 8343 strh r3, [r0, #26]
  39931. 802ea36: 4770 bx lr
  39932. 0802ea38 <dhcp_option>:
  39933. */
  39934. static void
  39935. dhcp_option(struct dhcp *dhcp, u8_t option_type, u8_t option_len)
  39936. {
  39937. LWIP_ASSERT("dhcp_option: dhcp->options_out_len + 2 + option_len <= DHCP_OPTIONS_LEN", dhcp->options_out_len + 2U + option_len <= DHCP_OPTIONS_LEN);
  39938. dhcp->msg_out->options[dhcp->options_out_len++] = option_type;
  39939. 802ea38: 8b03 ldrh r3, [r0, #24]
  39940. * DHCP message.
  39941. *
  39942. */
  39943. static void
  39944. dhcp_option(struct dhcp *dhcp, u8_t option_type, u8_t option_len)
  39945. {
  39946. 802ea3a: b510 push {r4, lr}
  39947. LWIP_ASSERT("dhcp_option: dhcp->options_out_len + 2 + option_len <= DHCP_OPTIONS_LEN", dhcp->options_out_len + 2U + option_len <= DHCP_OPTIONS_LEN);
  39948. dhcp->msg_out->options[dhcp->options_out_len++] = option_type;
  39949. 802ea3c: 6944 ldr r4, [r0, #20]
  39950. 802ea3e: 18e4 adds r4, r4, r3
  39951. 802ea40: f884 10f0 strb.w r1, [r4, #240] ; 0xf0
  39952. dhcp->msg_out->options[dhcp->options_out_len++] = option_len;
  39953. 802ea44: 6941 ldr r1, [r0, #20]
  39954. */
  39955. static void
  39956. dhcp_option(struct dhcp *dhcp, u8_t option_type, u8_t option_len)
  39957. {
  39958. LWIP_ASSERT("dhcp_option: dhcp->options_out_len + 2 + option_len <= DHCP_OPTIONS_LEN", dhcp->options_out_len + 2U + option_len <= DHCP_OPTIONS_LEN);
  39959. dhcp->msg_out->options[dhcp->options_out_len++] = option_type;
  39960. 802ea46: 1c5c adds r4, r3, #1
  39961. dhcp->msg_out->options[dhcp->options_out_len++] = option_len;
  39962. 802ea48: fa11 f184 uxtah r1, r1, r4
  39963. 802ea4c: 3302 adds r3, #2
  39964. 802ea4e: f881 20f0 strb.w r2, [r1, #240] ; 0xf0
  39965. 802ea52: 8303 strh r3, [r0, #24]
  39966. 802ea54: bd10 pop {r4, pc}
  39967. 0802ea56 <dhcp_option_byte>:
  39968. */
  39969. static void
  39970. dhcp_option_byte(struct dhcp *dhcp, u8_t value)
  39971. {
  39972. LWIP_ASSERT("dhcp_option_byte: dhcp->options_out_len < DHCP_OPTIONS_LEN", dhcp->options_out_len < DHCP_OPTIONS_LEN);
  39973. dhcp->msg_out->options[dhcp->options_out_len++] = value;
  39974. 802ea56: 8b03 ldrh r3, [r0, #24]
  39975. 802ea58: 6942 ldr r2, [r0, #20]
  39976. 802ea5a: 18d2 adds r2, r2, r3
  39977. 802ea5c: 3301 adds r3, #1
  39978. 802ea5e: f882 10f0 strb.w r1, [r2, #240] ; 0xf0
  39979. 802ea62: 8303 strh r3, [r0, #24]
  39980. 802ea64: 4770 bx lr
  39981. 0802ea66 <dhcp_option_short>:
  39982. static void
  39983. dhcp_option_short(struct dhcp *dhcp, u16_t value)
  39984. {
  39985. LWIP_ASSERT("dhcp_option_short: dhcp->options_out_len + 2 <= DHCP_OPTIONS_LEN", dhcp->options_out_len + 2U <= DHCP_OPTIONS_LEN);
  39986. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0xff00U) >> 8);
  39987. 802ea66: 8b03 ldrh r3, [r0, #24]
  39988. 802ea68: 6942 ldr r2, [r0, #20]
  39989. 802ea6a: 18d2 adds r2, r2, r3
  39990. dhcp->msg_out->options[dhcp->options_out_len++] = value;
  39991. }
  39992. static void
  39993. dhcp_option_short(struct dhcp *dhcp, u16_t value)
  39994. {
  39995. 802ea6c: b510 push {r4, lr}
  39996. LWIP_ASSERT("dhcp_option_short: dhcp->options_out_len + 2 <= DHCP_OPTIONS_LEN", dhcp->options_out_len + 2U <= DHCP_OPTIONS_LEN);
  39997. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0xff00U) >> 8);
  39998. 802ea6e: 0a0c lsrs r4, r1, #8
  39999. 802ea70: f882 40f0 strb.w r4, [r2, #240] ; 0xf0
  40000. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t) (value & 0x00ffU);
  40001. 802ea74: 6942 ldr r2, [r0, #20]
  40002. static void
  40003. dhcp_option_short(struct dhcp *dhcp, u16_t value)
  40004. {
  40005. LWIP_ASSERT("dhcp_option_short: dhcp->options_out_len + 2 <= DHCP_OPTIONS_LEN", dhcp->options_out_len + 2U <= DHCP_OPTIONS_LEN);
  40006. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0xff00U) >> 8);
  40007. 802ea76: 1c5c adds r4, r3, #1
  40008. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t) (value & 0x00ffU);
  40009. 802ea78: fa12 f284 uxtah r2, r2, r4
  40010. 802ea7c: 3302 adds r3, #2
  40011. 802ea7e: f882 10f0 strb.w r1, [r2, #240] ; 0xf0
  40012. 802ea82: 8303 strh r3, [r0, #24]
  40013. 802ea84: bd10 pop {r4, pc}
  40014. 0802ea86 <dhcp_option_long>:
  40015. static void
  40016. dhcp_option_long(struct dhcp *dhcp, u32_t value)
  40017. {
  40018. LWIP_ASSERT("dhcp_option_long: dhcp->options_out_len + 4 <= DHCP_OPTIONS_LEN", dhcp->options_out_len + 4U <= DHCP_OPTIONS_LEN);
  40019. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0xff000000UL) >> 24);
  40020. 802ea86: 8b03 ldrh r3, [r0, #24]
  40021. 802ea88: 6942 ldr r2, [r0, #20]
  40022. 802ea8a: 18d2 adds r2, r2, r3
  40023. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t) (value & 0x00ffU);
  40024. }
  40025. static void
  40026. dhcp_option_long(struct dhcp *dhcp, u32_t value)
  40027. {
  40028. 802ea8c: b510 push {r4, lr}
  40029. LWIP_ASSERT("dhcp_option_long: dhcp->options_out_len + 4 <= DHCP_OPTIONS_LEN", dhcp->options_out_len + 4U <= DHCP_OPTIONS_LEN);
  40030. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0xff000000UL) >> 24);
  40031. 802ea8e: 0e0c lsrs r4, r1, #24
  40032. 802ea90: f882 40f0 strb.w r4, [r2, #240] ; 0xf0
  40033. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0x00ff0000UL) >> 16);
  40034. 802ea94: 6942 ldr r2, [r0, #20]
  40035. static void
  40036. dhcp_option_long(struct dhcp *dhcp, u32_t value)
  40037. {
  40038. LWIP_ASSERT("dhcp_option_long: dhcp->options_out_len + 4 <= DHCP_OPTIONS_LEN", dhcp->options_out_len + 4U <= DHCP_OPTIONS_LEN);
  40039. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0xff000000UL) >> 24);
  40040. 802ea96: 1c5c adds r4, r3, #1
  40041. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0x00ff0000UL) >> 16);
  40042. 802ea98: fa12 f284 uxtah r2, r2, r4
  40043. 802ea9c: f3c1 4407 ubfx r4, r1, #16, #8
  40044. 802eaa0: f882 40f0 strb.w r4, [r2, #240] ; 0xf0
  40045. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0x0000ff00UL) >> 8);
  40046. 802eaa4: 6942 ldr r2, [r0, #20]
  40047. static void
  40048. dhcp_option_long(struct dhcp *dhcp, u32_t value)
  40049. {
  40050. LWIP_ASSERT("dhcp_option_long: dhcp->options_out_len + 4 <= DHCP_OPTIONS_LEN", dhcp->options_out_len + 4U <= DHCP_OPTIONS_LEN);
  40051. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0xff000000UL) >> 24);
  40052. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0x00ff0000UL) >> 16);
  40053. 802eaa6: 1c9c adds r4, r3, #2
  40054. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0x0000ff00UL) >> 8);
  40055. 802eaa8: fa12 f284 uxtah r2, r2, r4
  40056. 802eaac: f3c1 2407 ubfx r4, r1, #8, #8
  40057. 802eab0: f882 40f0 strb.w r4, [r2, #240] ; 0xf0
  40058. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0x000000ffUL));
  40059. 802eab4: 6942 ldr r2, [r0, #20]
  40060. dhcp_option_long(struct dhcp *dhcp, u32_t value)
  40061. {
  40062. LWIP_ASSERT("dhcp_option_long: dhcp->options_out_len + 4 <= DHCP_OPTIONS_LEN", dhcp->options_out_len + 4U <= DHCP_OPTIONS_LEN);
  40063. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0xff000000UL) >> 24);
  40064. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0x00ff0000UL) >> 16);
  40065. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0x0000ff00UL) >> 8);
  40066. 802eab6: 1cdc adds r4, r3, #3
  40067. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0x000000ffUL));
  40068. 802eab8: fa12 f284 uxtah r2, r2, r4
  40069. 802eabc: 3304 adds r3, #4
  40070. 802eabe: f882 10f0 strb.w r1, [r2, #240] ; 0xf0
  40071. 802eac2: 8303 strh r3, [r0, #24]
  40072. 802eac4: bd10 pop {r4, pc}
  40073. 0802eac6 <dhcp_option_trailer>:
  40074. * @param dhcp DHCP state structure
  40075. */
  40076. static void
  40077. dhcp_option_trailer(struct dhcp *dhcp)
  40078. {
  40079. LWIP_ERROR("dhcp_option_trailer: dhcp != NULL", (dhcp != NULL), return;);
  40080. 802eac6: b190 cbz r0, 802eaee <dhcp_option_trailer+0x28>
  40081. LWIP_ASSERT("dhcp_option_trailer: dhcp->msg_out != NULL\n", dhcp->msg_out != NULL);
  40082. LWIP_ASSERT("dhcp_option_trailer: dhcp->options_out_len < DHCP_OPTIONS_LEN\n", dhcp->options_out_len < DHCP_OPTIONS_LEN);
  40083. dhcp->msg_out->options[dhcp->options_out_len++] = DHCP_OPTION_END;
  40084. 802eac8: 8b03 ldrh r3, [r0, #24]
  40085. 802eaca: 6942 ldr r2, [r0, #20]
  40086. 802eacc: 18d2 adds r2, r2, r3
  40087. 802eace: 21ff movs r1, #255 ; 0xff
  40088. 802ead0: 3301 adds r3, #1
  40089. 802ead2: f882 10f0 strb.w r1, [r2, #240] ; 0xf0
  40090. 802ead6: 8303 strh r3, [r0, #24]
  40091. /* packet is too small, or not 4 byte aligned? */
  40092. while (((dhcp->options_out_len < DHCP_MIN_OPTIONS_LEN) || (dhcp->options_out_len & 3)) &&
  40093. (dhcp->options_out_len < DHCP_OPTIONS_LEN)) {
  40094. /* add a fill/padding byte */
  40095. dhcp->msg_out->options[dhcp->options_out_len++] = 0;
  40096. 802ead8: 2100 movs r1, #0
  40097. LWIP_ERROR("dhcp_option_trailer: dhcp != NULL", (dhcp != NULL), return;);
  40098. LWIP_ASSERT("dhcp_option_trailer: dhcp->msg_out != NULL\n", dhcp->msg_out != NULL);
  40099. LWIP_ASSERT("dhcp_option_trailer: dhcp->options_out_len < DHCP_OPTIONS_LEN\n", dhcp->options_out_len < DHCP_OPTIONS_LEN);
  40100. dhcp->msg_out->options[dhcp->options_out_len++] = DHCP_OPTION_END;
  40101. /* packet is too small, or not 4 byte aligned? */
  40102. while (((dhcp->options_out_len < DHCP_MIN_OPTIONS_LEN) || (dhcp->options_out_len & 3)) &&
  40103. 802eada: e005 b.n 802eae8 <dhcp_option_trailer+0x22>
  40104. (dhcp->options_out_len < DHCP_OPTIONS_LEN)) {
  40105. /* add a fill/padding byte */
  40106. dhcp->msg_out->options[dhcp->options_out_len++] = 0;
  40107. 802eadc: 6942 ldr r2, [r0, #20]
  40108. 802eade: 18d2 adds r2, r2, r3
  40109. 802eae0: 3301 adds r3, #1
  40110. 802eae2: f882 10f0 strb.w r1, [r2, #240] ; 0xf0
  40111. 802eae6: 8303 strh r3, [r0, #24]
  40112. LWIP_ERROR("dhcp_option_trailer: dhcp != NULL", (dhcp != NULL), return;);
  40113. LWIP_ASSERT("dhcp_option_trailer: dhcp->msg_out != NULL\n", dhcp->msg_out != NULL);
  40114. LWIP_ASSERT("dhcp_option_trailer: dhcp->options_out_len < DHCP_OPTIONS_LEN\n", dhcp->options_out_len < DHCP_OPTIONS_LEN);
  40115. dhcp->msg_out->options[dhcp->options_out_len++] = DHCP_OPTION_END;
  40116. /* packet is too small, or not 4 byte aligned? */
  40117. while (((dhcp->options_out_len < DHCP_MIN_OPTIONS_LEN) || (dhcp->options_out_len & 3)) &&
  40118. 802eae8: 8b03 ldrh r3, [r0, #24]
  40119. 802eaea: 2b43 cmp r3, #67 ; 0x43
  40120. 802eaec: d9f6 bls.n 802eadc <dhcp_option_trailer+0x16>
  40121. 802eaee: 4770 bx lr
  40122. 0802eaf0 <dhcp_create_msg>:
  40123. * @param dhcp dhcp control struct
  40124. * @param message_type message type of the request
  40125. */
  40126. static err_t
  40127. dhcp_create_msg(struct netif *netif, struct dhcp *dhcp, u8_t message_type)
  40128. {
  40129. 802eaf0: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  40130. 802eaf4: 460c mov r4, r1
  40131. 802eaf6: 4617 mov r7, r2
  40132. if (!xid_initialised) {
  40133. xid = DHCP_GLOBAL_XID;
  40134. xid_initialised = !xid_initialised;
  40135. }
  40136. #endif
  40137. LWIP_ERROR("dhcp_create_msg: netif != NULL", (netif != NULL), return ERR_ARG;);
  40138. 802eaf8: 4606 mov r6, r0
  40139. 802eafa: 2800 cmp r0, #0
  40140. 802eafc: f000 808e beq.w 802ec1c <dhcp_create_msg+0x12c>
  40141. LWIP_ERROR("dhcp_create_msg: dhcp != NULL", (dhcp != NULL), return ERR_VAL;);
  40142. 802eb00: 2900 cmp r1, #0
  40143. 802eb02: f000 808d beq.w 802ec20 <dhcp_create_msg+0x130>
  40144. LWIP_ASSERT("dhcp_create_msg: dhcp->p_out == NULL", dhcp->p_out == NULL);
  40145. LWIP_ASSERT("dhcp_create_msg: dhcp->msg_out == NULL", dhcp->msg_out == NULL);
  40146. dhcp->p_out = pbuf_alloc(PBUF_TRANSPORT, sizeof(struct dhcp_msg), PBUF_RAM);
  40147. 802eb06: 2000 movs r0, #0
  40148. 802eb08: f44f 719a mov.w r1, #308 ; 0x134
  40149. 802eb0c: 4602 mov r2, r0
  40150. 802eb0e: f001 f908 bl 802fd22 <pbuf_alloc>
  40151. 802eb12: 6120 str r0, [r4, #16]
  40152. if (dhcp->p_out == NULL) {
  40153. 802eb14: 2800 cmp r0, #0
  40154. 802eb16: f000 8085 beq.w 802ec24 <dhcp_create_msg+0x134>
  40155. }
  40156. LWIP_ASSERT("dhcp_create_msg: check that first pbuf can hold struct dhcp_msg",
  40157. (dhcp->p_out->len >= sizeof(struct dhcp_msg)));
  40158. /* reuse transaction identifier in retransmissions */
  40159. if (dhcp->tries == 0) {
  40160. 802eb1a: 7b62 ldrb r2, [r4, #13]
  40161. 802eb1c: 4b43 ldr r3, [pc, #268] ; (802ec2c <dhcp_create_msg+0x13c>)
  40162. 802eb1e: b912 cbnz r2, 802eb26 <dhcp_create_msg+0x36>
  40163. #if DHCP_CREATE_RAND_XID && defined(LWIP_RAND)
  40164. xid = LWIP_RAND();
  40165. #else /* DHCP_CREATE_RAND_XID && defined(LWIP_RAND) */
  40166. xid++;
  40167. 802eb20: 681a ldr r2, [r3, #0]
  40168. 802eb22: 3201 adds r2, #1
  40169. 802eb24: 601a str r2, [r3, #0]
  40170. #endif /* DHCP_CREATE_RAND_XID && defined(LWIP_RAND) */
  40171. }
  40172. dhcp->xid = xid;
  40173. 802eb26: 681b ldr r3, [r3, #0]
  40174. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE,
  40175. ("transaction id xid(%"X32_F")\n", xid));
  40176. dhcp->msg_out = (struct dhcp_msg *)dhcp->p_out->payload;
  40177. 802eb28: 6842 ldr r2, [r0, #4]
  40178. xid = LWIP_RAND();
  40179. #else /* DHCP_CREATE_RAND_XID && defined(LWIP_RAND) */
  40180. xid++;
  40181. #endif /* DHCP_CREATE_RAND_XID && defined(LWIP_RAND) */
  40182. }
  40183. dhcp->xid = xid;
  40184. 802eb2a: 6023 str r3, [r4, #0]
  40185. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE,
  40186. ("transaction id xid(%"X32_F")\n", xid));
  40187. dhcp->msg_out = (struct dhcp_msg *)dhcp->p_out->payload;
  40188. dhcp->msg_out->op = DHCP_BOOTREQUEST;
  40189. 802eb2c: 2301 movs r3, #1
  40190. }
  40191. dhcp->xid = xid;
  40192. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE,
  40193. ("transaction id xid(%"X32_F")\n", xid));
  40194. dhcp->msg_out = (struct dhcp_msg *)dhcp->p_out->payload;
  40195. 802eb2e: 6162 str r2, [r4, #20]
  40196. dhcp->msg_out->op = DHCP_BOOTREQUEST;
  40197. 802eb30: 7013 strb r3, [r2, #0]
  40198. /* TODO: make link layer independent */
  40199. dhcp->msg_out->htype = DHCP_HTYPE_ETH;
  40200. 802eb32: 6962 ldr r2, [r4, #20]
  40201. 802eb34: 7053 strb r3, [r2, #1]
  40202. dhcp->msg_out->hlen = netif->hwaddr_len;
  40203. 802eb36: 6963 ldr r3, [r4, #20]
  40204. 802eb38: f896 2026 ldrb.w r2, [r6, #38] ; 0x26
  40205. 802eb3c: 709a strb r2, [r3, #2]
  40206. dhcp->msg_out->hops = 0;
  40207. 802eb3e: 6963 ldr r3, [r4, #20]
  40208. 802eb40: 2500 movs r5, #0
  40209. 802eb42: 70dd strb r5, [r3, #3]
  40210. dhcp->msg_out->xid = htonl(dhcp->xid);
  40211. 802eb44: 6820 ldr r0, [r4, #0]
  40212. 802eb46: f8d4 8014 ldr.w r8, [r4, #20]
  40213. 802eb4a: f7ff ff69 bl 802ea20 <lwip_htonl>
  40214. 802eb4e: f8c8 0004 str.w r0, [r8, #4]
  40215. dhcp->msg_out->secs = 0;
  40216. 802eb52: 6963 ldr r3, [r4, #20]
  40217. /* we don't need the broadcast flag since we can receive unicast traffic
  40218. before being fully configured! */
  40219. dhcp->msg_out->flags = 0;
  40220. ip_addr_set_zero(&dhcp->msg_out->ciaddr);
  40221. /* set ciaddr to netif->ip_addr based on message_type and state */
  40222. if ((message_type == DHCP_INFORM) || (message_type == DHCP_DECLINE) ||
  40223. 802eb54: 2f08 cmp r7, #8
  40224. /* TODO: make link layer independent */
  40225. dhcp->msg_out->htype = DHCP_HTYPE_ETH;
  40226. dhcp->msg_out->hlen = netif->hwaddr_len;
  40227. dhcp->msg_out->hops = 0;
  40228. dhcp->msg_out->xid = htonl(dhcp->xid);
  40229. dhcp->msg_out->secs = 0;
  40230. 802eb56: 721d strb r5, [r3, #8]
  40231. 802eb58: 725d strb r5, [r3, #9]
  40232. /* we don't need the broadcast flag since we can receive unicast traffic
  40233. before being fully configured! */
  40234. dhcp->msg_out->flags = 0;
  40235. 802eb5a: 729d strb r5, [r3, #10]
  40236. 802eb5c: 72dd strb r5, [r3, #11]
  40237. ip_addr_set_zero(&dhcp->msg_out->ciaddr);
  40238. 802eb5e: 731d strb r5, [r3, #12]
  40239. 802eb60: 735d strb r5, [r3, #13]
  40240. 802eb62: 739d strb r5, [r3, #14]
  40241. 802eb64: 73dd strb r5, [r3, #15]
  40242. /* set ciaddr to netif->ip_addr based on message_type and state */
  40243. if ((message_type == DHCP_INFORM) || (message_type == DHCP_DECLINE) ||
  40244. 802eb66: d007 beq.n 802eb78 <dhcp_create_msg+0x88>
  40245. 802eb68: 2f04 cmp r7, #4
  40246. 802eb6a: d005 beq.n 802eb78 <dhcp_create_msg+0x88>
  40247. 802eb6c: 2f03 cmp r7, #3
  40248. 802eb6e: d105 bne.n 802eb7c <dhcp_create_msg+0x8c>
  40249. ((message_type == DHCP_REQUEST) && /* DHCP_BOUND not used for sending! */
  40250. ((dhcp->state==DHCP_RENEWING) || dhcp->state==DHCP_REBINDING))) {
  40251. 802eb70: 7b22 ldrb r2, [r4, #12]
  40252. before being fully configured! */
  40253. dhcp->msg_out->flags = 0;
  40254. ip_addr_set_zero(&dhcp->msg_out->ciaddr);
  40255. /* set ciaddr to netif->ip_addr based on message_type and state */
  40256. if ((message_type == DHCP_INFORM) || (message_type == DHCP_DECLINE) ||
  40257. ((message_type == DHCP_REQUEST) && /* DHCP_BOUND not used for sending! */
  40258. 802eb72: 3a04 subs r2, #4
  40259. 802eb74: 2a01 cmp r2, #1
  40260. 802eb76: d801 bhi.n 802eb7c <dhcp_create_msg+0x8c>
  40261. ((dhcp->state==DHCP_RENEWING) || dhcp->state==DHCP_REBINDING))) {
  40262. ip_addr_copy(dhcp->msg_out->ciaddr, netif->ip_addr);
  40263. 802eb78: 6872 ldr r2, [r6, #4]
  40264. 802eb7a: 60da str r2, [r3, #12]
  40265. }
  40266. ip_addr_set_zero(&dhcp->msg_out->yiaddr);
  40267. 802eb7c: 2500 movs r5, #0
  40268. 802eb7e: 741d strb r5, [r3, #16]
  40269. 802eb80: 745d strb r5, [r3, #17]
  40270. 802eb82: 749d strb r5, [r3, #18]
  40271. 802eb84: 74dd strb r5, [r3, #19]
  40272. ip_addr_set_zero(&dhcp->msg_out->siaddr);
  40273. 802eb86: 751d strb r5, [r3, #20]
  40274. 802eb88: 755d strb r5, [r3, #21]
  40275. 802eb8a: 759d strb r5, [r3, #22]
  40276. 802eb8c: 75dd strb r5, [r3, #23]
  40277. ip_addr_set_zero(&dhcp->msg_out->giaddr);
  40278. 802eb8e: 761d strb r5, [r3, #24]
  40279. 802eb90: 765d strb r5, [r3, #25]
  40280. 802eb92: 769d strb r5, [r3, #26]
  40281. 802eb94: 76dd strb r5, [r3, #27]
  40282. for (i = 0; i < DHCP_CHADDR_LEN; i++) {
  40283. /* copy netif hardware address, pad with zeroes */
  40284. dhcp->msg_out->chaddr[i] = (i < netif->hwaddr_len) ? netif->hwaddr[i] : 0/* pad byte*/;
  40285. 802eb96: f896 1026 ldrb.w r1, [r6, #38] ; 0x26
  40286. 802eb9a: 6962 ldr r2, [r4, #20]
  40287. 802eb9c: b2ab uxth r3, r5
  40288. 802eb9e: 4299 cmp r1, r3
  40289. * @param netif the netif under DHCP control
  40290. * @param dhcp dhcp control struct
  40291. * @param message_type message type of the request
  40292. */
  40293. static err_t
  40294. dhcp_create_msg(struct netif *netif, struct dhcp *dhcp, u8_t message_type)
  40295. 802eba0: bf88 it hi
  40296. 802eba2: 1973 addhi r3, r6, r5
  40297. ip_addr_set_zero(&dhcp->msg_out->yiaddr);
  40298. ip_addr_set_zero(&dhcp->msg_out->siaddr);
  40299. ip_addr_set_zero(&dhcp->msg_out->giaddr);
  40300. for (i = 0; i < DHCP_CHADDR_LEN; i++) {
  40301. /* copy netif hardware address, pad with zeroes */
  40302. dhcp->msg_out->chaddr[i] = (i < netif->hwaddr_len) ? netif->hwaddr[i] : 0/* pad byte*/;
  40303. 802eba4: 442a add r2, r5
  40304. 802eba6: bf8c ite hi
  40305. 802eba8: f893 3027 ldrbhi.w r3, [r3, #39] ; 0x27
  40306. 802ebac: 2300 movls r3, #0
  40307. 802ebae: 3501 adds r5, #1
  40308. ip_addr_copy(dhcp->msg_out->ciaddr, netif->ip_addr);
  40309. }
  40310. ip_addr_set_zero(&dhcp->msg_out->yiaddr);
  40311. ip_addr_set_zero(&dhcp->msg_out->siaddr);
  40312. ip_addr_set_zero(&dhcp->msg_out->giaddr);
  40313. for (i = 0; i < DHCP_CHADDR_LEN; i++) {
  40314. 802ebb0: 2d10 cmp r5, #16
  40315. /* copy netif hardware address, pad with zeroes */
  40316. dhcp->msg_out->chaddr[i] = (i < netif->hwaddr_len) ? netif->hwaddr[i] : 0/* pad byte*/;
  40317. 802ebb2: 7713 strb r3, [r2, #28]
  40318. ip_addr_copy(dhcp->msg_out->ciaddr, netif->ip_addr);
  40319. }
  40320. ip_addr_set_zero(&dhcp->msg_out->yiaddr);
  40321. ip_addr_set_zero(&dhcp->msg_out->siaddr);
  40322. ip_addr_set_zero(&dhcp->msg_out->giaddr);
  40323. for (i = 0; i < DHCP_CHADDR_LEN; i++) {
  40324. 802ebb4: d1ef bne.n 802eb96 <dhcp_create_msg+0xa6>
  40325. 802ebb6: 2300 movs r3, #0
  40326. /* copy netif hardware address, pad with zeroes */
  40327. dhcp->msg_out->chaddr[i] = (i < netif->hwaddr_len) ? netif->hwaddr[i] : 0/* pad byte*/;
  40328. }
  40329. for (i = 0; i < DHCP_SNAME_LEN; i++) {
  40330. dhcp->msg_out->sname[i] = 0;
  40331. 802ebb8: 4619 mov r1, r3
  40332. 802ebba: 6962 ldr r2, [r4, #20]
  40333. 802ebbc: 18d2 adds r2, r2, r3
  40334. 802ebbe: 3301 adds r3, #1
  40335. ip_addr_set_zero(&dhcp->msg_out->giaddr);
  40336. for (i = 0; i < DHCP_CHADDR_LEN; i++) {
  40337. /* copy netif hardware address, pad with zeroes */
  40338. dhcp->msg_out->chaddr[i] = (i < netif->hwaddr_len) ? netif->hwaddr[i] : 0/* pad byte*/;
  40339. }
  40340. for (i = 0; i < DHCP_SNAME_LEN; i++) {
  40341. 802ebc0: 2b40 cmp r3, #64 ; 0x40
  40342. dhcp->msg_out->sname[i] = 0;
  40343. 802ebc2: f882 102c strb.w r1, [r2, #44] ; 0x2c
  40344. ip_addr_set_zero(&dhcp->msg_out->giaddr);
  40345. for (i = 0; i < DHCP_CHADDR_LEN; i++) {
  40346. /* copy netif hardware address, pad with zeroes */
  40347. dhcp->msg_out->chaddr[i] = (i < netif->hwaddr_len) ? netif->hwaddr[i] : 0/* pad byte*/;
  40348. }
  40349. for (i = 0; i < DHCP_SNAME_LEN; i++) {
  40350. 802ebc6: d1f8 bne.n 802ebba <dhcp_create_msg+0xca>
  40351. 802ebc8: 2200 movs r2, #0
  40352. dhcp->msg_out->sname[i] = 0;
  40353. }
  40354. for (i = 0; i < DHCP_FILE_LEN; i++) {
  40355. dhcp->msg_out->file[i] = 0;
  40356. 802ebca: 4610 mov r0, r2
  40357. 802ebcc: 6963 ldr r3, [r4, #20]
  40358. 802ebce: 1899 adds r1, r3, r2
  40359. 802ebd0: 3201 adds r2, #1
  40360. 802ebd2: 2300 movs r3, #0
  40361. dhcp->msg_out->chaddr[i] = (i < netif->hwaddr_len) ? netif->hwaddr[i] : 0/* pad byte*/;
  40362. }
  40363. for (i = 0; i < DHCP_SNAME_LEN; i++) {
  40364. dhcp->msg_out->sname[i] = 0;
  40365. }
  40366. for (i = 0; i < DHCP_FILE_LEN; i++) {
  40367. 802ebd4: 2a80 cmp r2, #128 ; 0x80
  40368. dhcp->msg_out->file[i] = 0;
  40369. 802ebd6: f881 006c strb.w r0, [r1, #108] ; 0x6c
  40370. dhcp->msg_out->chaddr[i] = (i < netif->hwaddr_len) ? netif->hwaddr[i] : 0/* pad byte*/;
  40371. }
  40372. for (i = 0; i < DHCP_SNAME_LEN; i++) {
  40373. dhcp->msg_out->sname[i] = 0;
  40374. }
  40375. for (i = 0; i < DHCP_FILE_LEN; i++) {
  40376. 802ebda: d1f7 bne.n 802ebcc <dhcp_create_msg+0xdc>
  40377. dhcp->msg_out->file[i] = 0;
  40378. }
  40379. dhcp->msg_out->cookie = PP_HTONL(DHCP_MAGIC_COOKIE);
  40380. 802ebdc: 6962 ldr r2, [r4, #20]
  40381. 802ebde: f06f 007d mvn.w r0, #125 ; 0x7d
  40382. 802ebe2: 2163 movs r1, #99 ; 0x63
  40383. 802ebe4: f882 00ed strb.w r0, [r2, #237] ; 0xed
  40384. 802ebe8: 2053 movs r0, #83 ; 0x53
  40385. 802ebea: f882 10ec strb.w r1, [r2, #236] ; 0xec
  40386. 802ebee: f882 00ee strb.w r0, [r2, #238] ; 0xee
  40387. 802ebf2: f882 10ef strb.w r1, [r2, #239] ; 0xef
  40388. dhcp->options_out_len = 0;
  40389. 802ebf6: 8323 strh r3, [r4, #24]
  40390. /* fill options field with an incrementing array (for debugging purposes) */
  40391. for (i = 0; i < DHCP_OPTIONS_LEN; i++) {
  40392. dhcp->msg_out->options[i] = (u8_t)i; /* for debugging only, no matter if truncated */
  40393. 802ebf8: 6962 ldr r2, [r4, #20]
  40394. 802ebfa: 18d2 adds r2, r2, r3
  40395. 802ebfc: f882 30f0 strb.w r3, [r2, #240] ; 0xf0
  40396. 802ec00: 3301 adds r3, #1
  40397. dhcp->msg_out->file[i] = 0;
  40398. }
  40399. dhcp->msg_out->cookie = PP_HTONL(DHCP_MAGIC_COOKIE);
  40400. dhcp->options_out_len = 0;
  40401. /* fill options field with an incrementing array (for debugging purposes) */
  40402. for (i = 0; i < DHCP_OPTIONS_LEN; i++) {
  40403. 802ec02: 2b44 cmp r3, #68 ; 0x44
  40404. 802ec04: d1f8 bne.n 802ebf8 <dhcp_create_msg+0x108>
  40405. dhcp->msg_out->options[i] = (u8_t)i; /* for debugging only, no matter if truncated */
  40406. }
  40407. /* Add option MESSAGE_TYPE */
  40408. dhcp_option(dhcp, DHCP_OPTION_MESSAGE_TYPE, DHCP_OPTION_MESSAGE_TYPE_LEN);
  40409. 802ec06: 4620 mov r0, r4
  40410. 802ec08: 2135 movs r1, #53 ; 0x35
  40411. 802ec0a: 2201 movs r2, #1
  40412. 802ec0c: f7ff ff14 bl 802ea38 <dhcp_option>
  40413. dhcp_option_byte(dhcp, message_type);
  40414. 802ec10: 4620 mov r0, r4
  40415. 802ec12: 4639 mov r1, r7
  40416. 802ec14: f7ff ff1f bl 802ea56 <dhcp_option_byte>
  40417. return ERR_OK;
  40418. 802ec18: 2000 movs r0, #0
  40419. 802ec1a: e004 b.n 802ec26 <dhcp_create_msg+0x136>
  40420. if (!xid_initialised) {
  40421. xid = DHCP_GLOBAL_XID;
  40422. xid_initialised = !xid_initialised;
  40423. }
  40424. #endif
  40425. LWIP_ERROR("dhcp_create_msg: netif != NULL", (netif != NULL), return ERR_ARG;);
  40426. 802ec1c: 20f2 movs r0, #242 ; 0xf2
  40427. 802ec1e: e002 b.n 802ec26 <dhcp_create_msg+0x136>
  40428. LWIP_ERROR("dhcp_create_msg: dhcp != NULL", (dhcp != NULL), return ERR_VAL;);
  40429. 802ec20: 20fa movs r0, #250 ; 0xfa
  40430. 802ec22: e000 b.n 802ec26 <dhcp_create_msg+0x136>
  40431. LWIP_ASSERT("dhcp_create_msg: dhcp->msg_out == NULL", dhcp->msg_out == NULL);
  40432. dhcp->p_out = pbuf_alloc(PBUF_TRANSPORT, sizeof(struct dhcp_msg), PBUF_RAM);
  40433. if (dhcp->p_out == NULL) {
  40434. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS,
  40435. ("dhcp_create_msg(): could not allocate pbuf\n"));
  40436. return ERR_MEM;
  40437. 802ec24: 20ff movs r0, #255 ; 0xff
  40438. }
  40439. /* Add option MESSAGE_TYPE */
  40440. dhcp_option(dhcp, DHCP_OPTION_MESSAGE_TYPE, DHCP_OPTION_MESSAGE_TYPE_LEN);
  40441. dhcp_option_byte(dhcp, message_type);
  40442. return ERR_OK;
  40443. }
  40444. 802ec26: b240 sxtb r0, r0
  40445. 802ec28: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  40446. 802ec2c: 20000724 .word 0x20000724
  40447. 0802ec30 <dhcp_delete_msg>:
  40448. *
  40449. * @param dhcp the dhcp struct to free the request from
  40450. */
  40451. static void
  40452. dhcp_delete_msg(struct dhcp *dhcp)
  40453. {
  40454. 802ec30: b510 push {r4, lr}
  40455. LWIP_ERROR("dhcp_delete_msg: dhcp != NULL", (dhcp != NULL), return;);
  40456. 802ec32: 4604 mov r4, r0
  40457. 802ec34: b130 cbz r0, 802ec44 <dhcp_delete_msg+0x14>
  40458. LWIP_ASSERT("dhcp_delete_msg: dhcp->p_out != NULL", dhcp->p_out != NULL);
  40459. LWIP_ASSERT("dhcp_delete_msg: dhcp->msg_out != NULL", dhcp->msg_out != NULL);
  40460. if (dhcp->p_out != NULL) {
  40461. 802ec36: 6900 ldr r0, [r0, #16]
  40462. 802ec38: b108 cbz r0, 802ec3e <dhcp_delete_msg+0xe>
  40463. pbuf_free(dhcp->p_out);
  40464. 802ec3a: f001 f825 bl 802fc88 <pbuf_free>
  40465. }
  40466. dhcp->p_out = NULL;
  40467. 802ec3e: 2300 movs r3, #0
  40468. 802ec40: 6123 str r3, [r4, #16]
  40469. dhcp->msg_out = NULL;
  40470. 802ec42: 6163 str r3, [r4, #20]
  40471. 802ec44: bd10 pop {r4, pc}
  40472. 802ec46: 0000 movs r0, r0
  40473. 0802ec48 <dhcp_discover>:
  40474. *
  40475. * @param netif the netif under DHCP control
  40476. */
  40477. static err_t
  40478. dhcp_discover(struct netif *netif)
  40479. {
  40480. 802ec48: b573 push {r0, r1, r4, r5, r6, lr}
  40481. struct dhcp *dhcp = netif->dhcp;
  40482. 802ec4a: 6a04 ldr r4, [r0, #32]
  40483. err_t result = ERR_OK;
  40484. u16_t msecs;
  40485. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_discover()\n"));
  40486. ip_addr_set_any(&dhcp->offered_ip_addr);
  40487. 802ec4c: 2300 movs r3, #0
  40488. *
  40489. * @param netif the netif under DHCP control
  40490. */
  40491. static err_t
  40492. dhcp_discover(struct netif *netif)
  40493. {
  40494. 802ec4e: 4605 mov r5, r0
  40495. struct dhcp *dhcp = netif->dhcp;
  40496. err_t result = ERR_OK;
  40497. u16_t msecs;
  40498. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_discover()\n"));
  40499. ip_addr_set_any(&dhcp->offered_ip_addr);
  40500. 802ec50: 6263 str r3, [r4, #36] ; 0x24
  40501. dhcp_set_state(dhcp, DHCP_SELECTING);
  40502. 802ec52: 4620 mov r0, r4
  40503. 802ec54: 2106 movs r1, #6
  40504. 802ec56: f7ff fee7 bl 802ea28 <dhcp_set_state>
  40505. /* create and initialize the DHCP message header */
  40506. result = dhcp_create_msg(netif, dhcp, DHCP_DISCOVER);
  40507. 802ec5a: 4628 mov r0, r5
  40508. 802ec5c: 4621 mov r1, r4
  40509. 802ec5e: 2201 movs r2, #1
  40510. 802ec60: f7ff ff46 bl 802eaf0 <dhcp_create_msg>
  40511. if (result == ERR_OK) {
  40512. 802ec64: 4606 mov r6, r0
  40513. 802ec66: 2800 cmp r0, #0
  40514. 802ec68: d130 bne.n 802eccc <dhcp_discover+0x84>
  40515. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_discover: making request\n"));
  40516. dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN);
  40517. 802ec6a: 2202 movs r2, #2
  40518. 802ec6c: 4620 mov r0, r4
  40519. 802ec6e: 2139 movs r1, #57 ; 0x39
  40520. 802ec70: f7ff fee2 bl 802ea38 <dhcp_option>
  40521. dhcp_option_short(dhcp, DHCP_MAX_MSG_LEN(netif));
  40522. 802ec74: 4620 mov r0, r4
  40523. 802ec76: 8ca9 ldrh r1, [r5, #36] ; 0x24
  40524. 802ec78: f7ff fef5 bl 802ea66 <dhcp_option_short>
  40525. dhcp_option(dhcp, DHCP_OPTION_PARAMETER_REQUEST_LIST, 4/*num options*/);
  40526. 802ec7c: 2204 movs r2, #4
  40527. 802ec7e: 4620 mov r0, r4
  40528. 802ec80: 2137 movs r1, #55 ; 0x37
  40529. 802ec82: f7ff fed9 bl 802ea38 <dhcp_option>
  40530. dhcp_option_byte(dhcp, DHCP_OPTION_SUBNET_MASK);
  40531. 802ec86: 4620 mov r0, r4
  40532. 802ec88: 2101 movs r1, #1
  40533. 802ec8a: f7ff fee4 bl 802ea56 <dhcp_option_byte>
  40534. dhcp_option_byte(dhcp, DHCP_OPTION_ROUTER);
  40535. 802ec8e: 4620 mov r0, r4
  40536. 802ec90: 2103 movs r1, #3
  40537. 802ec92: f7ff fee0 bl 802ea56 <dhcp_option_byte>
  40538. dhcp_option_byte(dhcp, DHCP_OPTION_BROADCAST);
  40539. 802ec96: 4620 mov r0, r4
  40540. 802ec98: 211c movs r1, #28
  40541. 802ec9a: f7ff fedc bl 802ea56 <dhcp_option_byte>
  40542. dhcp_option_byte(dhcp, DHCP_OPTION_DNS_SERVER);
  40543. 802ec9e: 2106 movs r1, #6
  40544. 802eca0: 4620 mov r0, r4
  40545. 802eca2: f7ff fed8 bl 802ea56 <dhcp_option_byte>
  40546. dhcp_option_trailer(dhcp);
  40547. 802eca6: 4620 mov r0, r4
  40548. 802eca8: f7ff ff0d bl 802eac6 <dhcp_option_trailer>
  40549. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_discover: realloc()ing\n"));
  40550. pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len);
  40551. 802ecac: 8b21 ldrh r1, [r4, #24]
  40552. 802ecae: 6920 ldr r0, [r4, #16]
  40553. 802ecb0: 31f0 adds r1, #240 ; 0xf0
  40554. 802ecb2: b289 uxth r1, r1
  40555. 802ecb4: f001 f80f bl 802fcd6 <pbuf_realloc>
  40556. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_discover: sendto(DISCOVER, IP_ADDR_BROADCAST, DHCP_SERVER_PORT)\n"));
  40557. udp_sendto_if(dhcp->pcb, dhcp->p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT, netif);
  40558. 802ecb8: 9500 str r5, [sp, #0]
  40559. 802ecba: 6860 ldr r0, [r4, #4]
  40560. 802ecbc: 6921 ldr r1, [r4, #16]
  40561. 802ecbe: 4a0f ldr r2, [pc, #60] ; (802ecfc <dhcp_discover+0xb4>)
  40562. 802ecc0: 2343 movs r3, #67 ; 0x43
  40563. 802ecc2: f003 fc81 bl 80325c8 <udp_sendto_if>
  40564. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_discover: deleting()ing\n"));
  40565. dhcp_delete_msg(dhcp);
  40566. 802ecc6: 4620 mov r0, r4
  40567. 802ecc8: f7ff ffb2 bl 802ec30 <dhcp_delete_msg>
  40568. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_discover: SELECTING\n"));
  40569. } else {
  40570. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_discover: could not allocate DHCP request\n"));
  40571. }
  40572. dhcp->tries++;
  40573. 802eccc: 7b63 ldrb r3, [r4, #13]
  40574. 802ecce: 3301 adds r3, #1
  40575. 802ecd0: b2db uxtb r3, r3
  40576. if(dhcp->tries >= LWIP_DHCP_AUTOIP_COOP_TRIES && dhcp->autoip_coop_state == DHCP_AUTOIP_COOP_STATE_OFF) {
  40577. dhcp->autoip_coop_state = DHCP_AUTOIP_COOP_STATE_ON;
  40578. autoip_start(netif);
  40579. }
  40580. #endif /* LWIP_DHCP_AUTOIP_COOP */
  40581. msecs = (dhcp->tries < 6 ? 1 << dhcp->tries : 60) * 1000;
  40582. 802ecd2: 2b05 cmp r3, #5
  40583. 802ecd4: bf98 it ls
  40584. 802ecd6: f44f 727a movls.w r2, #1000 ; 0x3e8
  40585. dhcp_delete_msg(dhcp);
  40586. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_discover: SELECTING\n"));
  40587. } else {
  40588. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_discover: could not allocate DHCP request\n"));
  40589. }
  40590. dhcp->tries++;
  40591. 802ecda: 7363 strb r3, [r4, #13]
  40592. if(dhcp->tries >= LWIP_DHCP_AUTOIP_COOP_TRIES && dhcp->autoip_coop_state == DHCP_AUTOIP_COOP_STATE_OFF) {
  40593. dhcp->autoip_coop_state = DHCP_AUTOIP_COOP_STATE_ON;
  40594. autoip_start(netif);
  40595. }
  40596. #endif /* LWIP_DHCP_AUTOIP_COOP */
  40597. msecs = (dhcp->tries < 6 ? 1 << dhcp->tries : 60) * 1000;
  40598. 802ecdc: bf9a itte ls
  40599. 802ecde: fa02 f303 lslls.w r3, r2, r3
  40600. 802ece2: b29b uxthls r3, r3
  40601. 802ece4: f64e 2360 movwhi r3, #60000 ; 0xea60
  40602. dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS;
  40603. 802ece8: f44f 72fa mov.w r2, #500 ; 0x1f4
  40604. 802ecec: f203 13f3 addw r3, r3, #499 ; 0x1f3
  40605. 802ecf0: fb93 f3f2 sdiv r3, r3, r2
  40606. 802ecf4: 8363 strh r3, [r4, #26]
  40607. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_discover(): set request timeout %"U16_F" msecs\n", msecs));
  40608. return result;
  40609. }
  40610. 802ecf6: 4630 mov r0, r6
  40611. 802ecf8: bd7c pop {r2, r3, r4, r5, r6, pc}
  40612. 802ecfa: bf00 nop
  40613. 802ecfc: 08044740 .word 0x08044740
  40614. 0802ed00 <dhcp_rebind>:
  40615. *
  40616. * @param netif network interface which must rebind with a DHCP server
  40617. */
  40618. static err_t
  40619. dhcp_rebind(struct netif *netif)
  40620. {
  40621. 802ed00: b573 push {r0, r1, r4, r5, r6, lr}
  40622. struct dhcp *dhcp = netif->dhcp;
  40623. 802ed02: 6a04 ldr r4, [r0, #32]
  40624. *
  40625. * @param netif network interface which must rebind with a DHCP server
  40626. */
  40627. static err_t
  40628. dhcp_rebind(struct netif *netif)
  40629. {
  40630. 802ed04: 4605 mov r5, r0
  40631. struct dhcp *dhcp = netif->dhcp;
  40632. err_t result;
  40633. u16_t msecs;
  40634. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_rebind()\n"));
  40635. dhcp_set_state(dhcp, DHCP_REBINDING);
  40636. 802ed06: 2104 movs r1, #4
  40637. 802ed08: 4620 mov r0, r4
  40638. 802ed0a: f7ff fe8d bl 802ea28 <dhcp_set_state>
  40639. /* create and initialize the DHCP message header */
  40640. result = dhcp_create_msg(netif, dhcp, DHCP_REQUEST);
  40641. 802ed0e: 4628 mov r0, r5
  40642. 802ed10: 4621 mov r1, r4
  40643. 802ed12: 2203 movs r2, #3
  40644. 802ed14: f7ff feec bl 802eaf0 <dhcp_create_msg>
  40645. if (result == ERR_OK) {
  40646. 802ed18: 4606 mov r6, r0
  40647. 802ed1a: b9d8 cbnz r0, 802ed54 <dhcp_rebind+0x54>
  40648. dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN);
  40649. 802ed1c: 2202 movs r2, #2
  40650. 802ed1e: 4620 mov r0, r4
  40651. 802ed20: 2139 movs r1, #57 ; 0x39
  40652. 802ed22: f7ff fe89 bl 802ea38 <dhcp_option>
  40653. dhcp_option_short(dhcp, DHCP_MAX_MSG_LEN(netif));
  40654. 802ed26: 8ca9 ldrh r1, [r5, #36] ; 0x24
  40655. 802ed28: 4620 mov r0, r4
  40656. 802ed2a: f7ff fe9c bl 802ea66 <dhcp_option_short>
  40657. dhcp_option(dhcp, DHCP_OPTION_SERVER_ID, 4);
  40658. dhcp_option_long(dhcp, ntohl(dhcp->server_ip_addr.addr));
  40659. #endif
  40660. dhcp_option_trailer(dhcp);
  40661. 802ed2e: 4620 mov r0, r4
  40662. 802ed30: f7ff fec9 bl 802eac6 <dhcp_option_trailer>
  40663. pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len);
  40664. 802ed34: 8b21 ldrh r1, [r4, #24]
  40665. 802ed36: 6920 ldr r0, [r4, #16]
  40666. 802ed38: 31f0 adds r1, #240 ; 0xf0
  40667. 802ed3a: b289 uxth r1, r1
  40668. 802ed3c: f000 ffcb bl 802fcd6 <pbuf_realloc>
  40669. /* broadcast to server */
  40670. udp_sendto_if(dhcp->pcb, dhcp->p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT, netif);
  40671. 802ed40: 9500 str r5, [sp, #0]
  40672. 802ed42: 6860 ldr r0, [r4, #4]
  40673. 802ed44: 6921 ldr r1, [r4, #16]
  40674. 802ed46: 4a0e ldr r2, [pc, #56] ; (802ed80 <dhcp_rebind+0x80>)
  40675. 802ed48: 2343 movs r3, #67 ; 0x43
  40676. 802ed4a: f003 fc3d bl 80325c8 <udp_sendto_if>
  40677. dhcp_delete_msg(dhcp);
  40678. 802ed4e: 4620 mov r0, r4
  40679. 802ed50: f7ff ff6e bl 802ec30 <dhcp_delete_msg>
  40680. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_rebind: REBINDING\n"));
  40681. } else {
  40682. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_rebind: could not allocate DHCP request\n"));
  40683. }
  40684. dhcp->tries++;
  40685. 802ed54: 7b63 ldrb r3, [r4, #13]
  40686. 802ed56: 3301 adds r3, #1
  40687. 802ed58: b2db uxtb r3, r3
  40688. msecs = dhcp->tries < 10 ? dhcp->tries * 1000 : 10 * 1000;
  40689. 802ed5a: 2b09 cmp r3, #9
  40690. dhcp_delete_msg(dhcp);
  40691. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_rebind: REBINDING\n"));
  40692. } else {
  40693. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_rebind: could not allocate DHCP request\n"));
  40694. }
  40695. dhcp->tries++;
  40696. 802ed5c: 7363 strb r3, [r4, #13]
  40697. msecs = dhcp->tries < 10 ? dhcp->tries * 1000 : 10 * 1000;
  40698. 802ed5e: d804 bhi.n 802ed6a <dhcp_rebind+0x6a>
  40699. 802ed60: f44f 727a mov.w r2, #1000 ; 0x3e8
  40700. 802ed64: 4353 muls r3, r2
  40701. 802ed66: b29b uxth r3, r3
  40702. 802ed68: e001 b.n 802ed6e <dhcp_rebind+0x6e>
  40703. 802ed6a: f242 7310 movw r3, #10000 ; 0x2710
  40704. dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS;
  40705. 802ed6e: f44f 72fa mov.w r2, #500 ; 0x1f4
  40706. 802ed72: f203 13f3 addw r3, r3, #499 ; 0x1f3
  40707. 802ed76: fb93 f3f2 sdiv r3, r3, r2
  40708. 802ed7a: 8363 strh r3, [r4, #26]
  40709. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_rebind(): set request timeout %"U16_F" msecs\n", msecs));
  40710. return result;
  40711. }
  40712. 802ed7c: 4630 mov r0, r6
  40713. 802ed7e: bd7c pop {r2, r3, r4, r5, r6, pc}
  40714. 802ed80: 08044740 .word 0x08044740
  40715. 0802ed84 <dhcp_reboot>:
  40716. *
  40717. * @param netif network interface which must reboot
  40718. */
  40719. static err_t
  40720. dhcp_reboot(struct netif *netif)
  40721. {
  40722. 802ed84: b573 push {r0, r1, r4, r5, r6, lr}
  40723. struct dhcp *dhcp = netif->dhcp;
  40724. 802ed86: 6a04 ldr r4, [r0, #32]
  40725. *
  40726. * @param netif network interface which must reboot
  40727. */
  40728. static err_t
  40729. dhcp_reboot(struct netif *netif)
  40730. {
  40731. 802ed88: 4605 mov r5, r0
  40732. struct dhcp *dhcp = netif->dhcp;
  40733. err_t result;
  40734. u16_t msecs;
  40735. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_reboot()\n"));
  40736. dhcp_set_state(dhcp, DHCP_REBOOTING);
  40737. 802ed8a: 2103 movs r1, #3
  40738. 802ed8c: 4620 mov r0, r4
  40739. 802ed8e: f7ff fe4b bl 802ea28 <dhcp_set_state>
  40740. /* create and initialize the DHCP message header */
  40741. result = dhcp_create_msg(netif, dhcp, DHCP_REQUEST);
  40742. 802ed92: 4628 mov r0, r5
  40743. 802ed94: 4621 mov r1, r4
  40744. 802ed96: 2203 movs r2, #3
  40745. 802ed98: f7ff feaa bl 802eaf0 <dhcp_create_msg>
  40746. if (result == ERR_OK) {
  40747. 802ed9c: 4606 mov r6, r0
  40748. 802ed9e: bb40 cbnz r0, 802edf2 <dhcp_reboot+0x6e>
  40749. dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN);
  40750. 802eda0: 2202 movs r2, #2
  40751. 802eda2: 4620 mov r0, r4
  40752. 802eda4: 2139 movs r1, #57 ; 0x39
  40753. 802eda6: f7ff fe47 bl 802ea38 <dhcp_option>
  40754. dhcp_option_short(dhcp, 576);
  40755. 802edaa: 4620 mov r0, r4
  40756. 802edac: f44f 7110 mov.w r1, #576 ; 0x240
  40757. 802edb0: f7ff fe59 bl 802ea66 <dhcp_option_short>
  40758. dhcp_option(dhcp, DHCP_OPTION_REQUESTED_IP, 4);
  40759. 802edb4: 2204 movs r2, #4
  40760. 802edb6: 2132 movs r1, #50 ; 0x32
  40761. 802edb8: 4620 mov r0, r4
  40762. 802edba: f7ff fe3d bl 802ea38 <dhcp_option>
  40763. dhcp_option_long(dhcp, ntohl(ip4_addr_get_u32(&dhcp->offered_ip_addr)));
  40764. 802edbe: 6a60 ldr r0, [r4, #36] ; 0x24
  40765. 802edc0: f7ff fe30 bl 802ea24 <lwip_ntohl>
  40766. 802edc4: 4601 mov r1, r0
  40767. 802edc6: 4620 mov r0, r4
  40768. 802edc8: f7ff fe5d bl 802ea86 <dhcp_option_long>
  40769. dhcp_option_trailer(dhcp);
  40770. 802edcc: 4620 mov r0, r4
  40771. 802edce: f7ff fe7a bl 802eac6 <dhcp_option_trailer>
  40772. pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len);
  40773. 802edd2: 8b21 ldrh r1, [r4, #24]
  40774. 802edd4: 6920 ldr r0, [r4, #16]
  40775. 802edd6: 31f0 adds r1, #240 ; 0xf0
  40776. 802edd8: b289 uxth r1, r1
  40777. 802edda: f000 ff7c bl 802fcd6 <pbuf_realloc>
  40778. /* broadcast to server */
  40779. udp_sendto_if(dhcp->pcb, dhcp->p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT, netif);
  40780. 802edde: 9500 str r5, [sp, #0]
  40781. 802ede0: 6860 ldr r0, [r4, #4]
  40782. 802ede2: 6921 ldr r1, [r4, #16]
  40783. 802ede4: 4a0e ldr r2, [pc, #56] ; (802ee20 <dhcp_reboot+0x9c>)
  40784. 802ede6: 2343 movs r3, #67 ; 0x43
  40785. 802ede8: f003 fbee bl 80325c8 <udp_sendto_if>
  40786. dhcp_delete_msg(dhcp);
  40787. 802edec: 4620 mov r0, r4
  40788. 802edee: f7ff ff1f bl 802ec30 <dhcp_delete_msg>
  40789. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_reboot: REBOOTING\n"));
  40790. } else {
  40791. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_reboot: could not allocate DHCP request\n"));
  40792. }
  40793. dhcp->tries++;
  40794. 802edf2: 7b63 ldrb r3, [r4, #13]
  40795. 802edf4: 3301 adds r3, #1
  40796. 802edf6: b2db uxtb r3, r3
  40797. msecs = dhcp->tries < 10 ? dhcp->tries * 1000 : 10 * 1000;
  40798. 802edf8: 2b09 cmp r3, #9
  40799. dhcp_delete_msg(dhcp);
  40800. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_reboot: REBOOTING\n"));
  40801. } else {
  40802. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_reboot: could not allocate DHCP request\n"));
  40803. }
  40804. dhcp->tries++;
  40805. 802edfa: 7363 strb r3, [r4, #13]
  40806. msecs = dhcp->tries < 10 ? dhcp->tries * 1000 : 10 * 1000;
  40807. 802edfc: d804 bhi.n 802ee08 <dhcp_reboot+0x84>
  40808. 802edfe: f44f 727a mov.w r2, #1000 ; 0x3e8
  40809. 802ee02: 4353 muls r3, r2
  40810. 802ee04: b29b uxth r3, r3
  40811. 802ee06: e001 b.n 802ee0c <dhcp_reboot+0x88>
  40812. 802ee08: f242 7310 movw r3, #10000 ; 0x2710
  40813. dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS;
  40814. 802ee0c: f44f 72fa mov.w r2, #500 ; 0x1f4
  40815. 802ee10: f203 13f3 addw r3, r3, #499 ; 0x1f3
  40816. 802ee14: fb93 f3f2 sdiv r3, r3, r2
  40817. 802ee18: 8363 strh r3, [r4, #26]
  40818. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_reboot(): set request timeout %"U16_F" msecs\n", msecs));
  40819. return result;
  40820. }
  40821. 802ee1a: 4630 mov r0, r6
  40822. 802ee1c: bd7c pop {r2, r3, r4, r5, r6, pc}
  40823. 802ee1e: bf00 nop
  40824. 802ee20: 08044740 .word 0x08044740
  40825. 0802ee24 <dhcp_select>:
  40826. * @param netif the netif under DHCP control
  40827. * @return lwIP specific error (see error.h)
  40828. */
  40829. static err_t
  40830. dhcp_select(struct netif *netif)
  40831. {
  40832. 802ee24: b573 push {r0, r1, r4, r5, r6, lr}
  40833. struct dhcp *dhcp = netif->dhcp;
  40834. 802ee26: 6a04 ldr r4, [r0, #32]
  40835. * @param netif the netif under DHCP control
  40836. * @return lwIP specific error (see error.h)
  40837. */
  40838. static err_t
  40839. dhcp_select(struct netif *netif)
  40840. {
  40841. 802ee28: 4605 mov r5, r0
  40842. struct dhcp *dhcp = netif->dhcp;
  40843. err_t result;
  40844. u16_t msecs;
  40845. 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));
  40846. dhcp_set_state(dhcp, DHCP_REQUESTING);
  40847. 802ee2a: 2101 movs r1, #1
  40848. 802ee2c: 4620 mov r0, r4
  40849. 802ee2e: f7ff fdfb bl 802ea28 <dhcp_set_state>
  40850. /* create and initialize the DHCP message header */
  40851. result = dhcp_create_msg(netif, dhcp, DHCP_REQUEST);
  40852. 802ee32: 4628 mov r0, r5
  40853. 802ee34: 4621 mov r1, r4
  40854. 802ee36: 2203 movs r2, #3
  40855. 802ee38: f7ff fe5a bl 802eaf0 <dhcp_create_msg>
  40856. if (result == ERR_OK) {
  40857. 802ee3c: 4606 mov r6, r0
  40858. 802ee3e: 2800 cmp r0, #0
  40859. 802ee40: d148 bne.n 802eed4 <dhcp_select+0xb0>
  40860. dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN);
  40861. 802ee42: 2202 movs r2, #2
  40862. 802ee44: 4620 mov r0, r4
  40863. 802ee46: 2139 movs r1, #57 ; 0x39
  40864. 802ee48: f7ff fdf6 bl 802ea38 <dhcp_option>
  40865. dhcp_option_short(dhcp, DHCP_MAX_MSG_LEN(netif));
  40866. 802ee4c: 4620 mov r0, r4
  40867. 802ee4e: 8ca9 ldrh r1, [r5, #36] ; 0x24
  40868. 802ee50: f7ff fe09 bl 802ea66 <dhcp_option_short>
  40869. /* MUST request the offered IP address */
  40870. dhcp_option(dhcp, DHCP_OPTION_REQUESTED_IP, 4);
  40871. 802ee54: 2204 movs r2, #4
  40872. 802ee56: 2132 movs r1, #50 ; 0x32
  40873. 802ee58: 4620 mov r0, r4
  40874. 802ee5a: f7ff fded bl 802ea38 <dhcp_option>
  40875. dhcp_option_long(dhcp, ntohl(ip4_addr_get_u32(&dhcp->offered_ip_addr)));
  40876. 802ee5e: 6a60 ldr r0, [r4, #36] ; 0x24
  40877. 802ee60: f7ff fde0 bl 802ea24 <lwip_ntohl>
  40878. 802ee64: 4601 mov r1, r0
  40879. 802ee66: 4620 mov r0, r4
  40880. 802ee68: f7ff fe0d bl 802ea86 <dhcp_option_long>
  40881. dhcp_option(dhcp, DHCP_OPTION_SERVER_ID, 4);
  40882. 802ee6c: 2204 movs r2, #4
  40883. 802ee6e: 2136 movs r1, #54 ; 0x36
  40884. 802ee70: 4620 mov r0, r4
  40885. 802ee72: f7ff fde1 bl 802ea38 <dhcp_option>
  40886. dhcp_option_long(dhcp, ntohl(ip4_addr_get_u32(&dhcp->server_ip_addr)));
  40887. 802ee76: 6a20 ldr r0, [r4, #32]
  40888. 802ee78: f7ff fdd4 bl 802ea24 <lwip_ntohl>
  40889. 802ee7c: 4601 mov r1, r0
  40890. 802ee7e: 4620 mov r0, r4
  40891. 802ee80: f7ff fe01 bl 802ea86 <dhcp_option_long>
  40892. dhcp_option(dhcp, DHCP_OPTION_PARAMETER_REQUEST_LIST, 4/*num options*/);
  40893. 802ee84: 2204 movs r2, #4
  40894. 802ee86: 4620 mov r0, r4
  40895. 802ee88: 2137 movs r1, #55 ; 0x37
  40896. 802ee8a: f7ff fdd5 bl 802ea38 <dhcp_option>
  40897. dhcp_option_byte(dhcp, DHCP_OPTION_SUBNET_MASK);
  40898. 802ee8e: 4620 mov r0, r4
  40899. 802ee90: 2101 movs r1, #1
  40900. 802ee92: f7ff fde0 bl 802ea56 <dhcp_option_byte>
  40901. dhcp_option_byte(dhcp, DHCP_OPTION_ROUTER);
  40902. 802ee96: 4620 mov r0, r4
  40903. 802ee98: 2103 movs r1, #3
  40904. 802ee9a: f7ff fddc bl 802ea56 <dhcp_option_byte>
  40905. dhcp_option_byte(dhcp, DHCP_OPTION_BROADCAST);
  40906. 802ee9e: 4620 mov r0, r4
  40907. 802eea0: 211c movs r1, #28
  40908. 802eea2: f7ff fdd8 bl 802ea56 <dhcp_option_byte>
  40909. dhcp_option_byte(dhcp, DHCP_OPTION_DNS_SERVER);
  40910. 802eea6: 2106 movs r1, #6
  40911. 802eea8: 4620 mov r0, r4
  40912. 802eeaa: f7ff fdd4 bl 802ea56 <dhcp_option_byte>
  40913. #if LWIP_NETIF_HOSTNAME
  40914. dhcp_option_hostname(dhcp, netif);
  40915. #endif /* LWIP_NETIF_HOSTNAME */
  40916. dhcp_option_trailer(dhcp);
  40917. 802eeae: 4620 mov r0, r4
  40918. 802eeb0: f7ff fe09 bl 802eac6 <dhcp_option_trailer>
  40919. /* shrink the pbuf to the actual content length */
  40920. pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len);
  40921. 802eeb4: 8b21 ldrh r1, [r4, #24]
  40922. 802eeb6: 6920 ldr r0, [r4, #16]
  40923. 802eeb8: 31f0 adds r1, #240 ; 0xf0
  40924. 802eeba: b289 uxth r1, r1
  40925. 802eebc: f000 ff0b bl 802fcd6 <pbuf_realloc>
  40926. /* send broadcast to any DHCP server */
  40927. udp_sendto_if(dhcp->pcb, dhcp->p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT, netif);
  40928. 802eec0: 9500 str r5, [sp, #0]
  40929. 802eec2: 6860 ldr r0, [r4, #4]
  40930. 802eec4: 6921 ldr r1, [r4, #16]
  40931. 802eec6: 4a0f ldr r2, [pc, #60] ; (802ef04 <dhcp_select+0xe0>)
  40932. 802eec8: 2343 movs r3, #67 ; 0x43
  40933. 802eeca: f003 fb7d bl 80325c8 <udp_sendto_if>
  40934. dhcp_delete_msg(dhcp);
  40935. 802eece: 4620 mov r0, r4
  40936. 802eed0: f7ff feae bl 802ec30 <dhcp_delete_msg>
  40937. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_select: REQUESTING\n"));
  40938. } else {
  40939. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("dhcp_select: could not allocate DHCP request\n"));
  40940. }
  40941. dhcp->tries++;
  40942. 802eed4: 7b63 ldrb r3, [r4, #13]
  40943. 802eed6: 3301 adds r3, #1
  40944. 802eed8: b2db uxtb r3, r3
  40945. msecs = (dhcp->tries < 6 ? 1 << dhcp->tries : 60) * 1000;
  40946. 802eeda: 2b05 cmp r3, #5
  40947. 802eedc: bf98 it ls
  40948. 802eede: f44f 727a movls.w r2, #1000 ; 0x3e8
  40949. dhcp_delete_msg(dhcp);
  40950. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_select: REQUESTING\n"));
  40951. } else {
  40952. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("dhcp_select: could not allocate DHCP request\n"));
  40953. }
  40954. dhcp->tries++;
  40955. 802eee2: 7363 strb r3, [r4, #13]
  40956. msecs = (dhcp->tries < 6 ? 1 << dhcp->tries : 60) * 1000;
  40957. 802eee4: bf9a itte ls
  40958. 802eee6: fa02 f303 lslls.w r3, r2, r3
  40959. 802eeea: b29b uxthls r3, r3
  40960. 802eeec: f64e 2360 movwhi r3, #60000 ; 0xea60
  40961. dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS;
  40962. 802eef0: f44f 72fa mov.w r2, #500 ; 0x1f4
  40963. 802eef4: f203 13f3 addw r3, r3, #499 ; 0x1f3
  40964. 802eef8: fb93 f3f2 sdiv r3, r3, r2
  40965. 802eefc: 8363 strh r3, [r4, #26]
  40966. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_select(): set request timeout %"U16_F" msecs\n", msecs));
  40967. return result;
  40968. }
  40969. 802eefe: 4630 mov r0, r6
  40970. 802ef00: bd7c pop {r2, r3, r4, r5, r6, pc}
  40971. 802ef02: bf00 nop
  40972. 802ef04: 08044740 .word 0x08044740
  40973. 0802ef08 <dhcp_check>:
  40974. *
  40975. * @param netif the netif under DHCP control
  40976. */
  40977. static void
  40978. dhcp_check(struct netif *netif)
  40979. {
  40980. 802ef08: b538 push {r3, r4, r5, lr}
  40981. struct dhcp *dhcp = netif->dhcp;
  40982. 802ef0a: 6a04 ldr r4, [r0, #32]
  40983. *
  40984. * @param netif the netif under DHCP control
  40985. */
  40986. static void
  40987. dhcp_check(struct netif *netif)
  40988. {
  40989. 802ef0c: 4605 mov r5, r0
  40990. struct dhcp *dhcp = netif->dhcp;
  40991. err_t result;
  40992. u16_t msecs;
  40993. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_check(netif=%p) %c%c\n", (void *)netif, (s16_t)netif->name[0],
  40994. (s16_t)netif->name[1]));
  40995. dhcp_set_state(dhcp, DHCP_CHECKING);
  40996. 802ef0e: 2108 movs r1, #8
  40997. 802ef10: 4620 mov r0, r4
  40998. 802ef12: f7ff fd89 bl 802ea28 <dhcp_set_state>
  40999. /* create an ARP query for the offered IP address, expecting that no host
  41000. responds, as the IP address should not be in use. */
  41001. result = etharp_query(netif, &dhcp->offered_ip_addr, NULL);
  41002. 802ef16: 4628 mov r0, r5
  41003. 802ef18: f104 0124 add.w r1, r4, #36 ; 0x24
  41004. 802ef1c: 2200 movs r2, #0
  41005. 802ef1e: f007 ff61 bl 8036de4 <etharp_query>
  41006. if (result != ERR_OK) {
  41007. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("dhcp_check: could not perform ARP query\n"));
  41008. }
  41009. dhcp->tries++;
  41010. 802ef22: 7b63 ldrb r3, [r4, #13]
  41011. 802ef24: 3301 adds r3, #1
  41012. 802ef26: 7363 strb r3, [r4, #13]
  41013. msecs = 500;
  41014. dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS;
  41015. 802ef28: 2301 movs r3, #1
  41016. 802ef2a: 8363 strh r3, [r4, #26]
  41017. 802ef2c: bd38 pop {r3, r4, r5, pc}
  41018. 0802ef2e <dhcp_bind>:
  41019. *
  41020. * @param netif network interface to bind to the offered address
  41021. */
  41022. static void
  41023. dhcp_bind(struct netif *netif)
  41024. {
  41025. 802ef2e: b537 push {r0, r1, r2, r4, r5, lr}
  41026. u32_t timeout;
  41027. struct dhcp *dhcp;
  41028. ip_addr_t sn_mask, gw_addr;
  41029. LWIP_ERROR("dhcp_bind: netif != NULL", (netif != NULL), return;);
  41030. 802ef30: 4605 mov r5, r0
  41031. 802ef32: 2800 cmp r0, #0
  41032. 802ef34: d059 beq.n 802efea <dhcp_bind+0xbc>
  41033. dhcp = netif->dhcp;
  41034. 802ef36: 6a04 ldr r4, [r0, #32]
  41035. LWIP_ERROR("dhcp_bind: dhcp != NULL", (dhcp != NULL), return;);
  41036. 802ef38: 2c00 cmp r4, #0
  41037. 802ef3a: d056 beq.n 802efea <dhcp_bind+0xbc>
  41038. 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));
  41039. /* temporary DHCP lease? */
  41040. if (dhcp->offered_t1_renew != 0xffffffffUL) {
  41041. 802ef3c: 6b63 ldr r3, [r4, #52] ; 0x34
  41042. 802ef3e: 1c58 adds r0, r3, #1
  41043. 802ef40: d00d beq.n 802ef5e <dhcp_bind+0x30>
  41044. /* set renewal period timer */
  41045. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_bind(): t1 renewal timer %"U32_F" secs\n", dhcp->offered_t1_renew));
  41046. timeout = (dhcp->offered_t1_renew + DHCP_COARSE_TIMER_SECS / 2) / DHCP_COARSE_TIMER_SECS;
  41047. 802ef42: 223c movs r2, #60 ; 0x3c
  41048. 802ef44: 331e adds r3, #30
  41049. 802ef46: fbb3 f3f2 udiv r3, r3, r2
  41050. if(timeout > 0xffff) {
  41051. timeout = 0xffff;
  41052. }
  41053. dhcp->t1_timeout = (u16_t)timeout;
  41054. 802ef4a: f64f 72ff movw r2, #65535 ; 0xffff
  41055. 802ef4e: 4293 cmp r3, r2
  41056. 802ef50: bf28 it cs
  41057. 802ef52: 4613 movcs r3, r2
  41058. 802ef54: b29b uxth r3, r3
  41059. 802ef56: 83a3 strh r3, [r4, #28]
  41060. if (dhcp->t1_timeout == 0) {
  41061. 802ef58: b90b cbnz r3, 802ef5e <dhcp_bind+0x30>
  41062. dhcp->t1_timeout = 1;
  41063. 802ef5a: 2301 movs r3, #1
  41064. 802ef5c: 83a3 strh r3, [r4, #28]
  41065. }
  41066. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_bind(): set request timeout %"U32_F" msecs\n", dhcp->offered_t1_renew*1000));
  41067. }
  41068. /* set renewal period timer */
  41069. if (dhcp->offered_t2_rebind != 0xffffffffUL) {
  41070. 802ef5e: 6ba3 ldr r3, [r4, #56] ; 0x38
  41071. 802ef60: 1c59 adds r1, r3, #1
  41072. 802ef62: d00d beq.n 802ef80 <dhcp_bind+0x52>
  41073. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_bind(): t2 rebind timer %"U32_F" secs\n", dhcp->offered_t2_rebind));
  41074. timeout = (dhcp->offered_t2_rebind + DHCP_COARSE_TIMER_SECS / 2) / DHCP_COARSE_TIMER_SECS;
  41075. 802ef64: 223c movs r2, #60 ; 0x3c
  41076. 802ef66: 331e adds r3, #30
  41077. 802ef68: fbb3 f3f2 udiv r3, r3, r2
  41078. if(timeout > 0xffff) {
  41079. timeout = 0xffff;
  41080. }
  41081. dhcp->t2_timeout = (u16_t)timeout;
  41082. 802ef6c: f64f 72ff movw r2, #65535 ; 0xffff
  41083. 802ef70: 4293 cmp r3, r2
  41084. 802ef72: bf28 it cs
  41085. 802ef74: 4613 movcs r3, r2
  41086. 802ef76: b29b uxth r3, r3
  41087. 802ef78: 83e3 strh r3, [r4, #30]
  41088. if (dhcp->t2_timeout == 0) {
  41089. 802ef7a: b90b cbnz r3, 802ef80 <dhcp_bind+0x52>
  41090. dhcp->t2_timeout = 1;
  41091. 802ef7c: 2301 movs r3, #1
  41092. 802ef7e: 83e3 strh r3, [r4, #30]
  41093. }
  41094. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_bind(): set request timeout %"U32_F" msecs\n", dhcp->offered_t2_rebind*1000));
  41095. }
  41096. /* If we have sub 1 minute lease, t2 and t1 will kick in at the same time. */
  41097. if ((dhcp->t1_timeout >= dhcp->t2_timeout) && (dhcp->t2_timeout > 0)) {
  41098. 802ef80: 8be3 ldrh r3, [r4, #30]
  41099. 802ef82: 8ba2 ldrh r2, [r4, #28]
  41100. 802ef84: 429a cmp r2, r3
  41101. 802ef86: d302 bcc.n 802ef8e <dhcp_bind+0x60>
  41102. 802ef88: b10b cbz r3, 802ef8e <dhcp_bind+0x60>
  41103. dhcp->t1_timeout = 0;
  41104. 802ef8a: 2300 movs r3, #0
  41105. 802ef8c: 83a3 strh r3, [r4, #28]
  41106. }
  41107. if (dhcp->subnet_mask_given) {
  41108. 802ef8e: 7ba3 ldrb r3, [r4, #14]
  41109. 802ef90: b10b cbz r3, 802ef96 <dhcp_bind+0x68>
  41110. /* copy offered network mask */
  41111. ip_addr_copy(sn_mask, dhcp->offered_sn_mask);
  41112. 802ef92: 6aa3 ldr r3, [r4, #40] ; 0x28
  41113. 802ef94: e00b b.n 802efae <dhcp_bind+0x80>
  41114. } else {
  41115. /* subnet mask not given, choose a safe subnet mask given the network class */
  41116. u8_t first_octet = ip4_addr1(&dhcp->offered_ip_addr);
  41117. 802ef96: f894 3024 ldrb.w r3, [r4, #36] ; 0x24
  41118. if (first_octet <= 127) {
  41119. 802ef9a: 061a lsls r2, r3, #24
  41120. 802ef9c: d401 bmi.n 802efa2 <dhcp_bind+0x74>
  41121. ip4_addr_set_u32(&sn_mask, PP_HTONL(0xff000000UL));
  41122. 802ef9e: 23ff movs r3, #255 ; 0xff
  41123. 802efa0: e005 b.n 802efae <dhcp_bind+0x80>
  41124. } else if (first_octet >= 192) {
  41125. 802efa2: 2bbf cmp r3, #191 ; 0xbf
  41126. ip4_addr_set_u32(&sn_mask, PP_HTONL(0xffffff00UL));
  41127. 802efa4: bf8c ite hi
  41128. 802efa6: f06f 437f mvnhi.w r3, #4278190080 ; 0xff000000
  41129. } else {
  41130. ip4_addr_set_u32(&sn_mask, PP_HTONL(0xffff0000UL));
  41131. 802efaa: f64f 73ff movwls r3, #65535 ; 0xffff
  41132. 802efae: 9300 str r3, [sp, #0]
  41133. }
  41134. }
  41135. ip_addr_copy(gw_addr, dhcp->offered_gw_addr);
  41136. 802efb0: 6ae3 ldr r3, [r4, #44] ; 0x2c
  41137. 802efb2: 9301 str r3, [sp, #4]
  41138. /* gateway address not given? */
  41139. if (ip_addr_isany(&gw_addr)) {
  41140. 802efb4: b92b cbnz r3, 802efc2 <dhcp_bind+0x94>
  41141. /* copy network address */
  41142. ip_addr_get_network(&gw_addr, &dhcp->offered_ip_addr, &sn_mask);
  41143. 802efb6: 6a63 ldr r3, [r4, #36] ; 0x24
  41144. 802efb8: 9a00 ldr r2, [sp, #0]
  41145. 802efba: 4013 ands r3, r2
  41146. /* use first host address on network as gateway */
  41147. ip4_addr_set_u32(&gw_addr, ip4_addr_get_u32(&gw_addr) | PP_HTONL(0x00000001UL));
  41148. 802efbc: f043 7380 orr.w r3, r3, #16777216 ; 0x1000000
  41149. 802efc0: 9301 str r3, [sp, #4]
  41150. }
  41151. #endif /* LWIP_DHCP_AUTOIP_COOP */
  41152. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_bind(): IP: 0x%08"X32_F"\n",
  41153. ip4_addr_get_u32(&dhcp->offered_ip_addr)));
  41154. netif_set_ipaddr(netif, &dhcp->offered_ip_addr);
  41155. 802efc2: 4628 mov r0, r5
  41156. 802efc4: f104 0124 add.w r1, r4, #36 ; 0x24
  41157. 802efc8: f000 fd6a bl 802faa0 <netif_set_ipaddr>
  41158. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_bind(): SN: 0x%08"X32_F"\n",
  41159. ip4_addr_get_u32(&sn_mask)));
  41160. netif_set_netmask(netif, &sn_mask);
  41161. 802efcc: 4628 mov r0, r5
  41162. 802efce: 4669 mov r1, sp
  41163. 802efd0: f000 fda6 bl 802fb20 <netif_set_netmask>
  41164. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_bind(): GW: 0x%08"X32_F"\n",
  41165. ip4_addr_get_u32(&gw_addr)));
  41166. netif_set_gw(netif, &gw_addr);
  41167. 802efd4: a901 add r1, sp, #4
  41168. 802efd6: 4628 mov r0, r5
  41169. 802efd8: f000 fd9e bl 802fb18 <netif_set_gw>
  41170. /* bring the interface up */
  41171. netif_set_up(netif);
  41172. 802efdc: 4628 mov r0, r5
  41173. 802efde: f000 fdf5 bl 802fbcc <netif_set_up>
  41174. /* netif is now bound to DHCP leased address */
  41175. dhcp_set_state(dhcp, DHCP_BOUND);
  41176. 802efe2: 4620 mov r0, r4
  41177. 802efe4: 210a movs r1, #10
  41178. 802efe6: f7ff fd1f bl 802ea28 <dhcp_set_state>
  41179. }
  41180. 802efea: bd3e pop {r1, r2, r3, r4, r5, pc}
  41181. 0802efec <dhcp_recv>:
  41182. /**
  41183. * If an incoming DHCP message is in response to us, then trigger the state machine
  41184. */
  41185. static void
  41186. dhcp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, ip_addr_t *addr, u16_t port)
  41187. {
  41188. 802efec: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  41189. 802eff0: 4692 mov sl, r2
  41190. 802eff2: b08b sub sp, #44 ; 0x2c
  41191. LWIP_UNUSED_ARG(addr);
  41192. LWIP_UNUSED_ARG(port);
  41193. LWIP_ASSERT("reply wasn't freed", dhcp->msg_in == NULL);
  41194. if (p->len < DHCP_MIN_REPLY_LEN) {
  41195. 802eff4: f8ba 300a ldrh.w r3, [sl, #10]
  41196. */
  41197. static void
  41198. dhcp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, ip_addr_t *addr, u16_t port)
  41199. {
  41200. struct netif *netif = (struct netif *)arg;
  41201. struct dhcp *dhcp = netif->dhcp;
  41202. 802eff8: f8d0 8020 ldr.w r8, [r0, #32]
  41203. struct dhcp_msg *reply_msg = (struct dhcp_msg *)p->payload;
  41204. 802effc: 6852 ldr r2, [r2, #4]
  41205. LWIP_UNUSED_ARG(addr);
  41206. LWIP_UNUSED_ARG(port);
  41207. LWIP_ASSERT("reply wasn't freed", dhcp->msg_in == NULL);
  41208. if (p->len < DHCP_MIN_REPLY_LEN) {
  41209. 802effe: 2b2b cmp r3, #43 ; 0x2b
  41210. /**
  41211. * If an incoming DHCP message is in response to us, then trigger the state machine
  41212. */
  41213. static void
  41214. dhcp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, ip_addr_t *addr, u16_t port)
  41215. {
  41216. 802f000: 4605 mov r5, r0
  41217. LWIP_UNUSED_ARG(addr);
  41218. LWIP_UNUSED_ARG(port);
  41219. LWIP_ASSERT("reply wasn't freed", dhcp->msg_in == NULL);
  41220. if (p->len < DHCP_MIN_REPLY_LEN) {
  41221. 802f002: f240 81b8 bls.w 802f376 <dhcp_recv+0x38a>
  41222. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("DHCP reply message or pbuf too short\n"));
  41223. goto free_pbuf_and_return;
  41224. }
  41225. if (reply_msg->op != DHCP_BOOTREPLY) {
  41226. 802f006: 7813 ldrb r3, [r2, #0]
  41227. 802f008: 2b02 cmp r3, #2
  41228. 802f00a: f040 81b4 bne.w 802f376 <dhcp_recv+0x38a>
  41229. 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));
  41230. goto free_pbuf_and_return;
  41231. }
  41232. /* iterate through hardware address and match against DHCP message */
  41233. for (i = 0; i < netif->hwaddr_len; i++) {
  41234. 802f00e: f890 1026 ldrb.w r1, [r0, #38] ; 0x26
  41235. 802f012: 2300 movs r3, #0
  41236. 802f014: e008 b.n 802f028 <dhcp_recv+0x3c>
  41237. /**
  41238. * If an incoming DHCP message is in response to us, then trigger the state machine
  41239. */
  41240. static void
  41241. dhcp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, ip_addr_t *addr, u16_t port)
  41242. 802f016: 18e8 adds r0, r5, r3
  41243. 802f018: 3301 adds r3, #1
  41244. 802f01a: 18d4 adds r4, r2, r3
  41245. 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));
  41246. goto free_pbuf_and_return;
  41247. }
  41248. /* iterate through hardware address and match against DHCP message */
  41249. for (i = 0; i < netif->hwaddr_len; i++) {
  41250. if (netif->hwaddr[i] != reply_msg->chaddr[i]) {
  41251. 802f01c: f890 0027 ldrb.w r0, [r0, #39] ; 0x27
  41252. 802f020: 7ee4 ldrb r4, [r4, #27]
  41253. 802f022: 4284 cmp r4, r0
  41254. 802f024: f040 81a7 bne.w 802f376 <dhcp_recv+0x38a>
  41255. if (reply_msg->op != DHCP_BOOTREPLY) {
  41256. 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));
  41257. goto free_pbuf_and_return;
  41258. }
  41259. /* iterate through hardware address and match against DHCP message */
  41260. for (i = 0; i < netif->hwaddr_len; i++) {
  41261. 802f028: b2d8 uxtb r0, r3
  41262. 802f02a: 4288 cmp r0, r1
  41263. 802f02c: d3f3 bcc.n 802f016 <dhcp_recv+0x2a>
  41264. (u16_t)i, (u16_t)netif->hwaddr[i], (u16_t)i, (u16_t)reply_msg->chaddr[i]));
  41265. goto free_pbuf_and_return;
  41266. }
  41267. }
  41268. /* match transaction ID against what we expected */
  41269. if (ntohl(reply_msg->xid) != dhcp->xid) {
  41270. 802f02e: 6850 ldr r0, [r2, #4]
  41271. 802f030: f7ff fcf8 bl 802ea24 <lwip_ntohl>
  41272. 802f034: f8d8 3000 ldr.w r3, [r8]
  41273. 802f038: 4298 cmp r0, r3
  41274. 802f03a: f040 819c bne.w 802f376 <dhcp_recv+0x38a>
  41275. struct pbuf *q;
  41276. int parse_file_as_options = 0;
  41277. int parse_sname_as_options = 0;
  41278. /* clear received options */
  41279. dhcp_clear_all_options(dhcp);
  41280. 802f03e: 2100 movs r1, #0
  41281. 802f040: 220a movs r2, #10
  41282. 802f042: 489d ldr r0, [pc, #628] ; (802f2b8 <dhcp_recv+0x2cc>)
  41283. 802f044: f7f2 fee8 bl 8021e18 <memset>
  41284. /* check that beginning of dhcp_msg (up to and including chaddr) is in first pbuf */
  41285. if (p->len < DHCP_SNAME_OFS) {
  41286. 802f048: f8ba 300a ldrh.w r3, [sl, #10]
  41287. 802f04c: 2b2b cmp r3, #43 ; 0x2b
  41288. 802f04e: f240 8192 bls.w 802f376 <dhcp_recv+0x38a>
  41289. return ERR_BUF;
  41290. }
  41291. dhcp->msg_in = (struct dhcp_msg *)p->payload;
  41292. 802f052: f8da 3004 ldr.w r3, [sl, #4]
  41293. /* parse options */
  41294. /* start with options field */
  41295. options_idx = DHCP_OPTIONS_OFS;
  41296. /* parse options to the end of the received packet */
  41297. options_idx_max = p->tot_len;
  41298. 802f056: f8ba 9008 ldrh.w r9, [sl, #8]
  41299. dhcp_clear_all_options(dhcp);
  41300. /* check that beginning of dhcp_msg (up to and including chaddr) is in first pbuf */
  41301. if (p->len < DHCP_SNAME_OFS) {
  41302. return ERR_BUF;
  41303. }
  41304. dhcp->msg_in = (struct dhcp_msg *)p->payload;
  41305. 802f05a: f8c8 3008 str.w r3, [r8, #8]
  41306. u16_t offset_max;
  41307. u16_t options_idx;
  41308. u16_t options_idx_max;
  41309. struct pbuf *q;
  41310. int parse_file_as_options = 0;
  41311. int parse_sname_as_options = 0;
  41312. 802f05e: f04f 0b00 mov.w fp, #0
  41313. #endif /* LWIP_DHCP_BOOTP_FILE */
  41314. /* parse options */
  41315. /* start with options field */
  41316. options_idx = DHCP_OPTIONS_OFS;
  41317. 802f062: 22f0 movs r2, #240 ; 0xf0
  41318. 802f064: e004 b.n 802f070 <dhcp_recv+0x84>
  41319. parse_file_as_options = 0;
  41320. options_idx = DHCP_FILE_OFS;
  41321. options_idx_max = DHCP_FILE_OFS + DHCP_FILE_LEN;
  41322. goto again;
  41323. } else if (parse_sname_as_options) {
  41324. parse_sname_as_options = 0;
  41325. 802f066: f04f 0b00 mov.w fp, #0
  41326. options_idx = DHCP_SNAME_OFS;
  41327. options_idx_max = DHCP_SNAME_OFS + DHCP_SNAME_LEN;
  41328. 802f06a: f04f 096c mov.w r9, #108 ; 0x6c
  41329. options_idx = DHCP_FILE_OFS;
  41330. options_idx_max = DHCP_FILE_OFS + DHCP_FILE_LEN;
  41331. goto again;
  41332. } else if (parse_sname_as_options) {
  41333. parse_sname_as_options = 0;
  41334. options_idx = DHCP_SNAME_OFS;
  41335. 802f06e: 222c movs r2, #44 ; 0x2c
  41336. #endif /* LWIP_DHCP_BOOTP_FILE */
  41337. /* parse options */
  41338. /* start with options field */
  41339. options_idx = DHCP_OPTIONS_OFS;
  41340. 802f070: 4657 mov r7, sl
  41341. 802f072: e009 b.n 802f088 <dhcp_recv+0x9c>
  41342. again:
  41343. q = p;
  41344. while((q != NULL) && (options_idx >= q->len)) {
  41345. options_idx -= q->len;
  41346. options_idx_max -= q->len;
  41347. q = q->next;
  41348. 802f074: 683f ldr r7, [r7, #0]
  41349. /* parse options to the end of the received packet */
  41350. options_idx_max = p->tot_len;
  41351. again:
  41352. q = p;
  41353. while((q != NULL) && (options_idx >= q->len)) {
  41354. options_idx -= q->len;
  41355. 802f076: 1ad2 subs r2, r2, r3
  41356. options_idx_max -= q->len;
  41357. 802f078: ebc3 0909 rsb r9, r3, r9
  41358. /* parse options to the end of the received packet */
  41359. options_idx_max = p->tot_len;
  41360. again:
  41361. q = p;
  41362. while((q != NULL) && (options_idx >= q->len)) {
  41363. options_idx -= q->len;
  41364. 802f07c: b292 uxth r2, r2
  41365. options_idx_max -= q->len;
  41366. 802f07e: fa1f f989 uxth.w r9, r9
  41367. options_idx = DHCP_OPTIONS_OFS;
  41368. /* parse options to the end of the received packet */
  41369. options_idx_max = p->tot_len;
  41370. again:
  41371. q = p;
  41372. while((q != NULL) && (options_idx >= q->len)) {
  41373. 802f082: 2f00 cmp r7, #0
  41374. 802f084: f000 8177 beq.w 802f376 <dhcp_recv+0x38a>
  41375. 802f088: 897b ldrh r3, [r7, #10]
  41376. 802f08a: 429a cmp r2, r3
  41377. 802f08c: d2f2 bcs.n 802f074 <dhcp_recv+0x88>
  41378. if (q == NULL) {
  41379. return ERR_BUF;
  41380. }
  41381. offset = options_idx;
  41382. offset_max = options_idx_max;
  41383. options = (u8_t*)q->payload;
  41384. 802f08e: 6878 ldr r0, [r7, #4]
  41385. 802f090: 9003 str r0, [sp, #12]
  41386. 802f092: e0db b.n 802f24c <dhcp_recv+0x260>
  41387. u8_t len;
  41388. u8_t decode_len = 0;
  41389. int decode_idx = -1;
  41390. u16_t val_offset = offset + 2;
  41391. /* len byte might be in the next pbuf */
  41392. if (offset + 1 < q->len) {
  41393. 802f094: 897b ldrh r3, [r7, #10]
  41394. 802f096: 1c50 adds r0, r2, #1
  41395. 802f098: 4298 cmp r0, r3
  41396. 802f09a: da03 bge.n 802f0a4 <dhcp_recv+0xb8>
  41397. len = options[offset + 1];
  41398. 802f09c: 9803 ldr r0, [sp, #12]
  41399. 802f09e: 1883 adds r3, r0, r2
  41400. 802f0a0: 785b ldrb r3, [r3, #1]
  41401. 802f0a2: e003 b.n 802f0ac <dhcp_recv+0xc0>
  41402. } else {
  41403. len = (q->next != NULL ? ((u8_t*)q->next->payload)[0] : 0);
  41404. 802f0a4: 683b ldr r3, [r7, #0]
  41405. 802f0a6: b10b cbz r3, 802f0ac <dhcp_recv+0xc0>
  41406. 802f0a8: 685b ldr r3, [r3, #4]
  41407. 802f0aa: 781b ldrb r3, [r3, #0]
  41408. }
  41409. /* LWIP_DEBUGF(DHCP_DEBUG, ("msg_offset=%"U16_F", q->len=%"U16_F, msg_offset, q->len)); */
  41410. decode_len = len;
  41411. switch(op) {
  41412. 802f0ac: 2933 cmp r1, #51 ; 0x33
  41413. 802f0ae: d038 beq.n 802f122 <dhcp_recv+0x136>
  41414. 802f0b0: d807 bhi.n 802f0c2 <dhcp_recv+0xd6>
  41415. 802f0b2: 2901 cmp r1, #1
  41416. 802f0b4: d019 beq.n 802f0ea <dhcp_recv+0xfe>
  41417. 802f0b6: d311 bcc.n 802f0dc <dhcp_recv+0xf0>
  41418. 802f0b8: 2903 cmp r1, #3
  41419. 802f0ba: d01d beq.n 802f0f8 <dhcp_recv+0x10c>
  41420. 802f0bc: 2906 cmp r1, #6
  41421. 802f0be: d155 bne.n 802f16c <dhcp_recv+0x180>
  41422. 802f0c0: e021 b.n 802f106 <dhcp_recv+0x11a>
  41423. 802f0c2: 2936 cmp r1, #54 ; 0x36
  41424. 802f0c4: d03d beq.n 802f142 <dhcp_recv+0x156>
  41425. 802f0c6: d804 bhi.n 802f0d2 <dhcp_recv+0xe6>
  41426. 802f0c8: 2934 cmp r1, #52 ; 0x34
  41427. 802f0ca: d031 beq.n 802f130 <dhcp_recv+0x144>
  41428. 802f0cc: 2935 cmp r1, #53 ; 0x35
  41429. 802f0ce: d14d bne.n 802f16c <dhcp_recv+0x180>
  41430. 802f0d0: e035 b.n 802f13e <dhcp_recv+0x152>
  41431. 802f0d2: 293a cmp r1, #58 ; 0x3a
  41432. 802f0d4: d03c beq.n 802f150 <dhcp_recv+0x164>
  41433. 802f0d6: 293b cmp r1, #59 ; 0x3b
  41434. 802f0d8: d148 bne.n 802f16c <dhcp_recv+0x180>
  41435. 802f0da: e040 b.n 802f15e <dhcp_recv+0x172>
  41436. /* case(DHCP_OPTION_END): handled above */
  41437. case(DHCP_OPTION_PAD):
  41438. /* special option: no len encoded */
  41439. decode_len = len = 0;
  41440. /* will be increased below */
  41441. offset--;
  41442. 802f0dc: 1e51 subs r1, r2, #1
  41443. decode_len = len;
  41444. switch(op) {
  41445. /* case(DHCP_OPTION_END): handled above */
  41446. case(DHCP_OPTION_PAD):
  41447. /* special option: no len encoded */
  41448. decode_len = len = 0;
  41449. 802f0de: 2300 movs r3, #0
  41450. /* will be increased below */
  41451. offset--;
  41452. 802f0e0: b289 uxth r1, r1
  41453. /* at least 1 byte to read and no end marker, then at least 3 bytes to read? */
  41454. while((q != NULL) && (options[offset] != DHCP_OPTION_END) && (offset < offset_max)) {
  41455. u8_t op = options[offset];
  41456. u8_t len;
  41457. u8_t decode_len = 0;
  41458. int decode_idx = -1;
  41459. 802f0e2: f04f 34ff mov.w r4, #4294967295
  41460. decode_len = len;
  41461. switch(op) {
  41462. /* case(DHCP_OPTION_END): handled above */
  41463. case(DHCP_OPTION_PAD):
  41464. /* special option: no len encoded */
  41465. decode_len = len = 0;
  41466. 802f0e6: 461e mov r6, r3
  41467. 802f0e8: e044 b.n 802f174 <dhcp_recv+0x188>
  41468. /* will be increased below */
  41469. offset--;
  41470. break;
  41471. case(DHCP_OPTION_SUBNET_MASK):
  41472. LWIP_ERROR("len == 4", len == 4, return ERR_VAL;);
  41473. 802f0ea: 2b04 cmp r3, #4
  41474. 802f0ec: f040 8143 bne.w 802f376 <dhcp_recv+0x38a>
  41475. 802f0f0: 461e mov r6, r3
  41476. 802f0f2: 4611 mov r1, r2
  41477. decode_idx = DHCP_OPTION_IDX_SUBNET_MASK;
  41478. 802f0f4: 2406 movs r4, #6
  41479. 802f0f6: e03d b.n 802f174 <dhcp_recv+0x188>
  41480. break;
  41481. case(DHCP_OPTION_ROUTER):
  41482. decode_len = 4; /* only copy the first given router */
  41483. LWIP_ERROR("len >= decode_len", len >= decode_len, return ERR_VAL;);
  41484. 802f0f8: 2b03 cmp r3, #3
  41485. 802f0fa: f240 813c bls.w 802f376 <dhcp_recv+0x38a>
  41486. 802f0fe: 4611 mov r1, r2
  41487. decode_idx = DHCP_OPTION_IDX_ROUTER;
  41488. 802f100: 2407 movs r4, #7
  41489. case(DHCP_OPTION_SUBNET_MASK):
  41490. LWIP_ERROR("len == 4", len == 4, return ERR_VAL;);
  41491. decode_idx = DHCP_OPTION_IDX_SUBNET_MASK;
  41492. break;
  41493. case(DHCP_OPTION_ROUTER):
  41494. decode_len = 4; /* only copy the first given router */
  41495. 802f102: 2604 movs r6, #4
  41496. 802f104: e036 b.n 802f174 <dhcp_recv+0x188>
  41497. LWIP_ERROR("len >= decode_len", len >= decode_len, return ERR_VAL;);
  41498. decode_idx = DHCP_OPTION_IDX_ROUTER;
  41499. break;
  41500. case(DHCP_OPTION_DNS_SERVER):
  41501. /* special case: there might be more than one server */
  41502. LWIP_ERROR("len % 4 == 0", len % 4 == 0, return ERR_VAL;);
  41503. 802f106: 0799 lsls r1, r3, #30
  41504. 802f108: f040 8135 bne.w 802f376 <dhcp_recv+0x38a>
  41505. /* limit number of DNS servers */
  41506. decode_len = LWIP_MIN(len, 4 * DNS_MAX_SERVERS);
  41507. 802f10c: 2b08 cmp r3, #8
  41508. 802f10e: bf34 ite cc
  41509. 802f110: 461e movcc r6, r3
  41510. 802f112: 2608 movcs r6, #8
  41511. 802f114: b2f6 uxtb r6, r6
  41512. LWIP_ERROR("len >= decode_len", len >= decode_len, return ERR_VAL;);
  41513. 802f116: 42b3 cmp r3, r6
  41514. 802f118: f0c0 812d bcc.w 802f376 <dhcp_recv+0x38a>
  41515. 802f11c: 4611 mov r1, r2
  41516. decode_idx = DHCP_OPTION_IDX_DNS_SERVER;
  41517. 802f11e: 2408 movs r4, #8
  41518. 802f120: e028 b.n 802f174 <dhcp_recv+0x188>
  41519. break;
  41520. case(DHCP_OPTION_LEASE_TIME):
  41521. LWIP_ERROR("len == 4", len == 4, return ERR_VAL;);
  41522. 802f122: 2b04 cmp r3, #4
  41523. 802f124: f040 8127 bne.w 802f376 <dhcp_recv+0x38a>
  41524. 802f128: 461e mov r6, r3
  41525. 802f12a: 4611 mov r1, r2
  41526. decode_idx = DHCP_OPTION_IDX_LEASE_TIME;
  41527. 802f12c: 2403 movs r4, #3
  41528. 802f12e: e021 b.n 802f174 <dhcp_recv+0x188>
  41529. break;
  41530. case(DHCP_OPTION_OVERLOAD):
  41531. LWIP_ERROR("len == 1", len == 1, return ERR_VAL;);
  41532. 802f130: 2b01 cmp r3, #1
  41533. 802f132: f040 8120 bne.w 802f376 <dhcp_recv+0x38a>
  41534. 802f136: 461e mov r6, r3
  41535. 802f138: 4611 mov r1, r2
  41536. decode_idx = DHCP_OPTION_IDX_OVERLOAD;
  41537. 802f13a: 2400 movs r4, #0
  41538. 802f13c: e01a b.n 802f174 <dhcp_recv+0x188>
  41539. break;
  41540. case(DHCP_OPTION_MESSAGE_TYPE):
  41541. LWIP_ERROR("len == 1", len == 1, return ERR_VAL;);
  41542. 802f13e: 2b01 cmp r3, #1
  41543. 802f140: e007 b.n 802f152 <dhcp_recv+0x166>
  41544. decode_idx = DHCP_OPTION_IDX_MSG_TYPE;
  41545. break;
  41546. case(DHCP_OPTION_SERVER_ID):
  41547. LWIP_ERROR("len == 4", len == 4, return ERR_VAL;);
  41548. 802f142: 2b04 cmp r3, #4
  41549. 802f144: f040 8117 bne.w 802f376 <dhcp_recv+0x38a>
  41550. 802f148: 461e mov r6, r3
  41551. 802f14a: 4611 mov r1, r2
  41552. decode_idx = DHCP_OPTION_IDX_SERVER_ID;
  41553. 802f14c: 2402 movs r4, #2
  41554. 802f14e: e011 b.n 802f174 <dhcp_recv+0x188>
  41555. break;
  41556. case(DHCP_OPTION_T1):
  41557. LWIP_ERROR("len == 4", len == 4, return ERR_VAL;);
  41558. 802f150: 2b04 cmp r3, #4
  41559. 802f152: f040 8110 bne.w 802f376 <dhcp_recv+0x38a>
  41560. 802f156: 461e mov r6, r3
  41561. 802f158: 4611 mov r1, r2
  41562. decode_idx = DHCP_OPTION_IDX_T1;
  41563. 802f15a: 461c mov r4, r3
  41564. 802f15c: e00a b.n 802f174 <dhcp_recv+0x188>
  41565. break;
  41566. case(DHCP_OPTION_T2):
  41567. LWIP_ERROR("len == 4", len == 4, return ERR_VAL;);
  41568. 802f15e: 2b04 cmp r3, #4
  41569. 802f160: f040 8109 bne.w 802f376 <dhcp_recv+0x38a>
  41570. 802f164: 461e mov r6, r3
  41571. 802f166: 4611 mov r1, r2
  41572. decode_idx = DHCP_OPTION_IDX_T2;
  41573. 802f168: 2405 movs r4, #5
  41574. 802f16a: e003 b.n 802f174 <dhcp_recv+0x188>
  41575. } else {
  41576. len = (q->next != NULL ? ((u8_t*)q->next->payload)[0] : 0);
  41577. }
  41578. /* LWIP_DEBUGF(DHCP_DEBUG, ("msg_offset=%"U16_F", q->len=%"U16_F, msg_offset, q->len)); */
  41579. decode_len = len;
  41580. switch(op) {
  41581. 802f16c: 4611 mov r1, r2
  41582. /* at least 1 byte to read and no end marker, then at least 3 bytes to read? */
  41583. while((q != NULL) && (options[offset] != DHCP_OPTION_END) && (offset < offset_max)) {
  41584. u8_t op = options[offset];
  41585. u8_t len;
  41586. u8_t decode_len = 0;
  41587. int decode_idx = -1;
  41588. 802f16e: f04f 34ff mov.w r4, #4294967295
  41589. case(DHCP_OPTION_T2):
  41590. LWIP_ERROR("len == 4", len == 4, return ERR_VAL;);
  41591. decode_idx = DHCP_OPTION_IDX_T2;
  41592. break;
  41593. default:
  41594. decode_len = 0;
  41595. 802f172: 2600 movs r6, #0
  41596. LWIP_DEBUGF(DHCP_DEBUG, ("skipping option %"U16_F" in options\n", op));
  41597. break;
  41598. }
  41599. offset += len + 2;
  41600. 802f174: 3102 adds r1, #2
  41601. 802f176: fa13 f381 uxtah r3, r3, r1
  41602. 802f17a: b29b uxth r3, r3
  41603. 802f17c: 9301 str r3, [sp, #4]
  41604. if (decode_len > 0) {
  41605. 802f17e: 2e00 cmp r6, #0
  41606. 802f180: d04f beq.n 802f222 <dhcp_recv+0x236>
  41607. while((q != NULL) && (options[offset] != DHCP_OPTION_END) && (offset < offset_max)) {
  41608. u8_t op = options[offset];
  41609. u8_t len;
  41610. u8_t decode_len = 0;
  41611. int decode_idx = -1;
  41612. u16_t val_offset = offset + 2;
  41613. 802f182: 3202 adds r2, #2
  41614. 802f184: b292 uxth r2, r2
  41615. LWIP_DEBUGF(DHCP_DEBUG, ("skipping option %"U16_F" in options\n", op));
  41616. break;
  41617. }
  41618. offset += len + 2;
  41619. if (decode_len > 0) {
  41620. u32_t value = 0;
  41621. 802f186: a90a add r1, sp, #40 ; 0x28
  41622. while((q != NULL) && (options[offset] != DHCP_OPTION_END) && (offset < offset_max)) {
  41623. u8_t op = options[offset];
  41624. u8_t len;
  41625. u8_t decode_len = 0;
  41626. int decode_idx = -1;
  41627. u16_t val_offset = offset + 2;
  41628. 802f188: 9205 str r2, [sp, #20]
  41629. LWIP_DEBUGF(DHCP_DEBUG, ("skipping option %"U16_F" in options\n", op));
  41630. break;
  41631. }
  41632. offset += len + 2;
  41633. if (decode_len > 0) {
  41634. u32_t value = 0;
  41635. 802f18a: 2300 movs r3, #0
  41636. /**
  41637. * If an incoming DHCP message is in response to us, then trigger the state machine
  41638. */
  41639. static void
  41640. dhcp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, ip_addr_t *addr, u16_t port)
  41641. 802f18c: 4a4b ldr r2, [pc, #300] ; (802f2bc <dhcp_recv+0x2d0>)
  41642. LWIP_DEBUGF(DHCP_DEBUG, ("skipping option %"U16_F" in options\n", op));
  41643. break;
  41644. }
  41645. offset += len + 2;
  41646. if (decode_len > 0) {
  41647. u32_t value = 0;
  41648. 802f18e: f841 3d04 str.w r3, [r1, #-4]!
  41649. /**
  41650. * If an incoming DHCP message is in response to us, then trigger the state machine
  41651. */
  41652. static void
  41653. dhcp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, ip_addr_t *addr, u16_t port)
  41654. 802f192: eb02 0284 add.w r2, r2, r4, lsl #2
  41655. LWIP_DEBUGF(DHCP_DEBUG, ("skipping option %"U16_F" in options\n", op));
  41656. break;
  41657. }
  41658. offset += len + 2;
  41659. if (decode_len > 0) {
  41660. u32_t value = 0;
  41661. 802f196: 9104 str r1, [sp, #16]
  41662. /**
  41663. * If an incoming DHCP message is in response to us, then trigger the state machine
  41664. */
  41665. static void
  41666. dhcp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, ip_addr_t *addr, u16_t port)
  41667. 802f198: 9206 str r2, [sp, #24]
  41668. 802f19a: 9302 str r3, [sp, #8]
  41669. 802f19c: 9805 ldr r0, [sp, #20]
  41670. 802f19e: 9902 ldr r1, [sp, #8]
  41671. if (decode_len > 0) {
  41672. u32_t value = 0;
  41673. u16_t copy_len;
  41674. decode_next:
  41675. LWIP_ASSERT("check decode_idx", decode_idx >= 0 && decode_idx < DHCP_OPTION_IDX_MAX);
  41676. if (!dhcp_option_given(dhcp, decode_idx)) {
  41677. 802f1a0: 4a45 ldr r2, [pc, #276] ; (802f2b8 <dhcp_recv+0x2cc>)
  41678. /**
  41679. * If an incoming DHCP message is in response to us, then trigger the state machine
  41680. */
  41681. static void
  41682. dhcp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, ip_addr_t *addr, u16_t port)
  41683. 802f1a2: 1843 adds r3, r0, r1
  41684. if (decode_len > 0) {
  41685. u32_t value = 0;
  41686. u16_t copy_len;
  41687. decode_next:
  41688. LWIP_ASSERT("check decode_idx", decode_idx >= 0 && decode_idx < DHCP_OPTION_IDX_MAX);
  41689. if (!dhcp_option_given(dhcp, decode_idx)) {
  41690. 802f1a4: 4844 ldr r0, [pc, #272] ; (802f2b8 <dhcp_recv+0x2cc>)
  41691. 802f1a6: 18a2 adds r2, r4, r2
  41692. 802f1a8: 9207 str r2, [sp, #28]
  41693. 802f1aa: 5c22 ldrb r2, [r4, r0]
  41694. /**
  41695. * If an incoming DHCP message is in response to us, then trigger the state machine
  41696. */
  41697. static void
  41698. dhcp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, ip_addr_t *addr, u16_t port)
  41699. 802f1ac: ebc1 0c06 rsb ip, r1, r6
  41700. 802f1b0: b29b uxth r3, r3
  41701. 802f1b2: fa5f fc8c uxtb.w ip, ip
  41702. if (decode_len > 0) {
  41703. u32_t value = 0;
  41704. u16_t copy_len;
  41705. decode_next:
  41706. LWIP_ASSERT("check decode_idx", decode_idx >= 0 && decode_idx < DHCP_OPTION_IDX_MAX);
  41707. if (!dhcp_option_given(dhcp, decode_idx)) {
  41708. 802f1b6: 2a00 cmp r2, #0
  41709. 802f1b8: d133 bne.n 802f222 <dhcp_recv+0x236>
  41710. copy_len = LWIP_MIN(decode_len, 4);
  41711. pbuf_copy_partial(q, &value, copy_len, val_offset);
  41712. 802f1ba: f1bc 0f03 cmp.w ip, #3
  41713. 802f1be: bf94 ite ls
  41714. 802f1c0: 4662 movls r2, ip
  41715. 802f1c2: 2204 movhi r2, #4
  41716. 802f1c4: 4638 mov r0, r7
  41717. 802f1c6: 9904 ldr r1, [sp, #16]
  41718. 802f1c8: f8cd c000 str.w ip, [sp]
  41719. 802f1cc: f000 feaa bl 802ff24 <pbuf_copy_partial>
  41720. if (decode_len > 4) {
  41721. 802f1d0: f8dd c000 ldr.w ip, [sp]
  41722. 802f1d4: f1bc 0f04 cmp.w ip, #4
  41723. 802f1d8: d90f bls.n 802f1fa <dhcp_recv+0x20e>
  41724. /* decode more than one u32_t */
  41725. LWIP_ERROR("decode_len % 4 == 0", decode_len % 4 == 0, return ERR_VAL;);
  41726. 802f1da: f01c 0f03 tst.w ip, #3
  41727. 802f1de: f040 80ca bne.w 802f376 <dhcp_recv+0x38a>
  41728. dhcp_got_option(dhcp, decode_idx);
  41729. 802f1e2: 9907 ldr r1, [sp, #28]
  41730. dhcp_set_option_value(dhcp, decode_idx, htonl(value));
  41731. 802f1e4: 9809 ldr r0, [sp, #36] ; 0x24
  41732. copy_len = LWIP_MIN(decode_len, 4);
  41733. pbuf_copy_partial(q, &value, copy_len, val_offset);
  41734. if (decode_len > 4) {
  41735. /* decode more than one u32_t */
  41736. LWIP_ERROR("decode_len % 4 == 0", decode_len % 4 == 0, return ERR_VAL;);
  41737. dhcp_got_option(dhcp, decode_idx);
  41738. 802f1e6: 2201 movs r2, #1
  41739. 802f1e8: 700a strb r2, [r1, #0]
  41740. dhcp_set_option_value(dhcp, decode_idx, htonl(value));
  41741. 802f1ea: f7ff fc19 bl 802ea20 <lwip_htonl>
  41742. 802f1ee: 9b02 ldr r3, [sp, #8]
  41743. 802f1f0: 9906 ldr r1, [sp, #24]
  41744. decode_len -= 4;
  41745. val_offset += 4;
  41746. decode_idx++;
  41747. 802f1f2: 3401 adds r4, #1
  41748. pbuf_copy_partial(q, &value, copy_len, val_offset);
  41749. if (decode_len > 4) {
  41750. /* decode more than one u32_t */
  41751. LWIP_ERROR("decode_len % 4 == 0", decode_len % 4 == 0, return ERR_VAL;);
  41752. dhcp_got_option(dhcp, decode_idx);
  41753. dhcp_set_option_value(dhcp, decode_idx, htonl(value));
  41754. 802f1f4: 50c8 str r0, [r1, r3]
  41755. 802f1f6: 3304 adds r3, #4
  41756. 802f1f8: e7cf b.n 802f19a <dhcp_recv+0x1ae>
  41757. decode_len -= 4;
  41758. val_offset += 4;
  41759. decode_idx++;
  41760. goto decode_next;
  41761. } else if (decode_len == 4) {
  41762. 802f1fa: d104 bne.n 802f206 <dhcp_recv+0x21a>
  41763. value = ntohl(value);
  41764. 802f1fc: 9809 ldr r0, [sp, #36] ; 0x24
  41765. 802f1fe: f7ff fc11 bl 802ea24 <lwip_ntohl>
  41766. 802f202: 9009 str r0, [sp, #36] ; 0x24
  41767. 802f204: e006 b.n 802f214 <dhcp_recv+0x228>
  41768. } else {
  41769. LWIP_ERROR("invalid decode_len", decode_len == 1, return ERR_VAL;);
  41770. 802f206: f1bc 0f01 cmp.w ip, #1
  41771. 802f20a: f040 80b4 bne.w 802f376 <dhcp_recv+0x38a>
  41772. value = ((u8_t*)&value)[0];
  41773. 802f20e: f89d 3024 ldrb.w r3, [sp, #36] ; 0x24
  41774. 802f212: 9309 str r3, [sp, #36] ; 0x24
  41775. }
  41776. dhcp_got_option(dhcp, decode_idx);
  41777. 802f214: 4a28 ldr r2, [pc, #160] ; (802f2b8 <dhcp_recv+0x2cc>)
  41778. dhcp_set_option_value(dhcp, decode_idx, value);
  41779. 802f216: 4829 ldr r0, [pc, #164] ; (802f2bc <dhcp_recv+0x2d0>)
  41780. value = ntohl(value);
  41781. } else {
  41782. LWIP_ERROR("invalid decode_len", decode_len == 1, return ERR_VAL;);
  41783. value = ((u8_t*)&value)[0];
  41784. }
  41785. dhcp_got_option(dhcp, decode_idx);
  41786. 802f218: 2301 movs r3, #1
  41787. 802f21a: 5513 strb r3, [r2, r4]
  41788. dhcp_set_option_value(dhcp, decode_idx, value);
  41789. 802f21c: 9b09 ldr r3, [sp, #36] ; 0x24
  41790. 802f21e: f840 3024 str.w r3, [r0, r4, lsl #2]
  41791. }
  41792. }
  41793. if (offset >= q->len) {
  41794. 802f222: 897b ldrh r3, [r7, #10]
  41795. 802f224: 9901 ldr r1, [sp, #4]
  41796. 802f226: 4299 cmp r1, r3
  41797. 802f228: d30f bcc.n 802f24a <dhcp_recv+0x25e>
  41798. offset -= q->len;
  41799. 802f22a: 1aca subs r2, r1, r3
  41800. offset_max -= q->len;
  41801. 802f22c: ebc3 0909 rsb r9, r3, r9
  41802. dhcp_got_option(dhcp, decode_idx);
  41803. dhcp_set_option_value(dhcp, decode_idx, value);
  41804. }
  41805. }
  41806. if (offset >= q->len) {
  41807. offset -= q->len;
  41808. 802f230: b292 uxth r2, r2
  41809. offset_max -= q->len;
  41810. 802f232: fa1f f989 uxth.w r9, r9
  41811. if ((offset < offset_max) && offset_max) {
  41812. 802f236: 454a cmp r2, r9
  41813. dhcp_got_option(dhcp, decode_idx);
  41814. dhcp_set_option_value(dhcp, decode_idx, value);
  41815. }
  41816. }
  41817. if (offset >= q->len) {
  41818. offset -= q->len;
  41819. 802f238: 9201 str r2, [sp, #4]
  41820. offset_max -= q->len;
  41821. if ((offset < offset_max) && offset_max) {
  41822. 802f23a: d303 bcc.n 802f244 <dhcp_recv+0x258>
  41823. break;
  41824. }
  41825. }
  41826. }
  41827. /* is this an overloaded message? */
  41828. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_OVERLOAD)) {
  41829. 802f23c: 4a1e ldr r2, [pc, #120] ; (802f2b8 <dhcp_recv+0x2cc>)
  41830. 802f23e: 7813 ldrb r3, [r2, #0]
  41831. 802f240: b963 cbnz r3, 802f25c <dhcp_recv+0x270>
  41832. 802f242: e09f b.n 802f384 <dhcp_recv+0x398>
  41833. }
  41834. if (offset >= q->len) {
  41835. offset -= q->len;
  41836. offset_max -= q->len;
  41837. if ((offset < offset_max) && offset_max) {
  41838. q = q->next;
  41839. 802f244: 683f ldr r7, [r7, #0]
  41840. LWIP_ASSERT("next pbuf was null", q);
  41841. options = (u8_t*)q->payload;
  41842. 802f246: 687b ldr r3, [r7, #4]
  41843. 802f248: 9303 str r3, [sp, #12]
  41844. u32_t value = 0;
  41845. u16_t copy_len;
  41846. decode_next:
  41847. LWIP_ASSERT("check decode_idx", decode_idx >= 0 && decode_idx < DHCP_OPTION_IDX_MAX);
  41848. if (!dhcp_option_given(dhcp, decode_idx)) {
  41849. copy_len = LWIP_MIN(decode_len, 4);
  41850. 802f24a: 9a01 ldr r2, [sp, #4]
  41851. }
  41852. offset = options_idx;
  41853. offset_max = options_idx_max;
  41854. options = (u8_t*)q->payload;
  41855. /* at least 1 byte to read and no end marker, then at least 3 bytes to read? */
  41856. while((q != NULL) && (options[offset] != DHCP_OPTION_END) && (offset < offset_max)) {
  41857. 802f24c: 9803 ldr r0, [sp, #12]
  41858. 802f24e: 5c81 ldrb r1, [r0, r2]
  41859. 802f250: 29ff cmp r1, #255 ; 0xff
  41860. 802f252: d0f3 beq.n 802f23c <dhcp_recv+0x250>
  41861. 802f254: 454a cmp r2, r9
  41862. 802f256: f4ff af1d bcc.w 802f094 <dhcp_recv+0xa8>
  41863. 802f25a: e7ef b.n 802f23c <dhcp_recv+0x250>
  41864. }
  41865. }
  41866. }
  41867. /* is this an overloaded message? */
  41868. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_OVERLOAD)) {
  41869. u32_t overload = dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_OVERLOAD);
  41870. 802f25c: 4b17 ldr r3, [pc, #92] ; (802f2bc <dhcp_recv+0x2d0>)
  41871. dhcp_clear_option(dhcp, DHCP_OPTION_IDX_OVERLOAD);
  41872. 802f25e: 4916 ldr r1, [pc, #88] ; (802f2b8 <dhcp_recv+0x2cc>)
  41873. }
  41874. }
  41875. }
  41876. /* is this an overloaded message? */
  41877. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_OVERLOAD)) {
  41878. u32_t overload = dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_OVERLOAD);
  41879. 802f260: 681b ldr r3, [r3, #0]
  41880. dhcp_clear_option(dhcp, DHCP_OPTION_IDX_OVERLOAD);
  41881. 802f262: 2200 movs r2, #0
  41882. if (overload == DHCP_OVERLOAD_FILE) {
  41883. 802f264: 2b01 cmp r3, #1
  41884. }
  41885. }
  41886. /* is this an overloaded message? */
  41887. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_OVERLOAD)) {
  41888. u32_t overload = dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_OVERLOAD);
  41889. dhcp_clear_option(dhcp, DHCP_OPTION_IDX_OVERLOAD);
  41890. 802f266: 700a strb r2, [r1, #0]
  41891. if (overload == DHCP_OVERLOAD_FILE) {
  41892. 802f268: f000 8093 beq.w 802f392 <dhcp_recv+0x3a6>
  41893. parse_file_as_options = 1;
  41894. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("overloaded file field\n"));
  41895. } else if (overload == DHCP_OVERLOAD_SNAME) {
  41896. 802f26c: 2b02 cmp r3, #2
  41897. 802f26e: f43f aefa beq.w 802f066 <dhcp_recv+0x7a>
  41898. parse_sname_as_options = 1;
  41899. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("overloaded sname field\n"));
  41900. } else if (overload == DHCP_OVERLOAD_SNAME_FILE) {
  41901. 802f272: 2b03 cmp r3, #3
  41902. 802f274: f040 8086 bne.w 802f384 <dhcp_recv+0x398>
  41903. 802f278: e089 b.n 802f38e <dhcp_recv+0x3a2>
  41904. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("DHCP_OPTION_MESSAGE_TYPE option not found\n"));
  41905. goto free_pbuf_and_return;
  41906. }
  41907. /* read DHCP message type */
  41908. msg_type = (u8_t)dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_MSG_TYPE);
  41909. 802f27a: 4a10 ldr r2, [pc, #64] ; (802f2bc <dhcp_recv+0x2d0>)
  41910. 802f27c: 7911 ldrb r1, [r2, #4]
  41911. /* message type is DHCP ACK? */
  41912. if (msg_type == DHCP_ACK) {
  41913. 802f27e: 2905 cmp r1, #5
  41914. 802f280: d140 bne.n 802f304 <dhcp_recv+0x318>
  41915. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("DHCP_ACK received\n"));
  41916. /* in requesting state? */
  41917. if (dhcp->state == DHCP_REQUESTING) {
  41918. 802f282: f898 100c ldrb.w r1, [r8, #12]
  41919. 802f286: 2901 cmp r1, #1
  41920. 802f288: d135 bne.n 802f2f6 <dhcp_recv+0x30a>
  41921. * @param netif the netif under DHCP control
  41922. */
  41923. static void
  41924. dhcp_handle_ack(struct netif *netif)
  41925. {
  41926. struct dhcp *dhcp = netif->dhcp;
  41927. 802f28a: 6a2c ldr r4, [r5, #32]
  41928. #if LWIP_DHCP_BOOTP_FILE
  41929. ip_addr_set_zero(&dhcp->offered_si_addr);
  41930. #endif /* LWIP_DHCP_BOOTP_FILE */
  41931. /* lease time given? */
  41932. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_LEASE_TIME)) {
  41933. 802f28c: 78db ldrb r3, [r3, #3]
  41934. #if LWIP_DNS
  41935. u8_t n;
  41936. #endif /* LWIP_DNS */
  41937. /* clear options we might not get from the ACK */
  41938. ip_addr_set_zero(&dhcp->offered_sn_mask);
  41939. 802f28e: f8c4 b028 str.w fp, [r4, #40] ; 0x28
  41940. ip_addr_set_zero(&dhcp->offered_gw_addr);
  41941. 802f292: f8c4 b02c str.w fp, [r4, #44] ; 0x2c
  41942. #if LWIP_DHCP_BOOTP_FILE
  41943. ip_addr_set_zero(&dhcp->offered_si_addr);
  41944. #endif /* LWIP_DHCP_BOOTP_FILE */
  41945. /* lease time given? */
  41946. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_LEASE_TIME)) {
  41947. 802f296: b10b cbz r3, 802f29c <dhcp_recv+0x2b0>
  41948. /* remember offered lease time */
  41949. dhcp->offered_t0_lease = dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_LEASE_TIME);
  41950. 802f298: 68d3 ldr r3, [r2, #12]
  41951. 802f29a: 6323 str r3, [r4, #48] ; 0x30
  41952. }
  41953. /* renewal period given? */
  41954. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_T1)) {
  41955. 802f29c: 4b06 ldr r3, [pc, #24] ; (802f2b8 <dhcp_recv+0x2cc>)
  41956. 802f29e: 791a ldrb r2, [r3, #4]
  41957. 802f2a0: b112 cbz r2, 802f2a8 <dhcp_recv+0x2bc>
  41958. /* remember given renewal period */
  41959. dhcp->offered_t1_renew = dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_T1);
  41960. 802f2a2: 4a06 ldr r2, [pc, #24] ; (802f2bc <dhcp_recv+0x2d0>)
  41961. 802f2a4: 6912 ldr r2, [r2, #16]
  41962. 802f2a6: e001 b.n 802f2ac <dhcp_recv+0x2c0>
  41963. } else {
  41964. /* calculate safe periods for renewal */
  41965. dhcp->offered_t1_renew = dhcp->offered_t0_lease / 2;
  41966. 802f2a8: 6b22 ldr r2, [r4, #48] ; 0x30
  41967. 802f2aa: 0852 lsrs r2, r2, #1
  41968. }
  41969. /* renewal period given? */
  41970. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_T2)) {
  41971. 802f2ac: 795b ldrb r3, [r3, #5]
  41972. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_T1)) {
  41973. /* remember given renewal period */
  41974. dhcp->offered_t1_renew = dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_T1);
  41975. } else {
  41976. /* calculate safe periods for renewal */
  41977. dhcp->offered_t1_renew = dhcp->offered_t0_lease / 2;
  41978. 802f2ae: 6362 str r2, [r4, #52] ; 0x34
  41979. }
  41980. /* renewal period given? */
  41981. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_T2)) {
  41982. 802f2b0: b133 cbz r3, 802f2c0 <dhcp_recv+0x2d4>
  41983. /* remember given rebind period */
  41984. dhcp->offered_t2_rebind = dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_T2);
  41985. 802f2b2: 4b02 ldr r3, [pc, #8] ; (802f2bc <dhcp_recv+0x2d0>)
  41986. 802f2b4: 695b ldr r3, [r3, #20]
  41987. 802f2b6: e004 b.n 802f2c2 <dhcp_recv+0x2d6>
  41988. 802f2b8: 2000eacc .word 0x2000eacc
  41989. 802f2bc: 2000ead8 .word 0x2000ead8
  41990. } else {
  41991. /* calculate safe periods for rebinding */
  41992. dhcp->offered_t2_rebind = dhcp->offered_t0_lease;
  41993. 802f2c0: 6b23 ldr r3, [r4, #48] ; 0x30
  41994. 802f2c2: 63a3 str r3, [r4, #56] ; 0x38
  41995. }
  41996. /* (y)our internet address */
  41997. ip_addr_copy(dhcp->offered_ip_addr, dhcp->msg_in->yiaddr);
  41998. 802f2c4: 68a3 ldr r3, [r4, #8]
  41999. boot file name copied in dhcp_parse_reply if not overloaded */
  42000. ip_addr_copy(dhcp->offered_si_addr, dhcp->msg_in->siaddr);
  42001. #endif /* LWIP_DHCP_BOOTP_FILE */
  42002. /* subnet mask given? */
  42003. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_SUBNET_MASK)) {
  42004. 802f2c6: 4a39 ldr r2, [pc, #228] ; (802f3ac <dhcp_recv+0x3c0>)
  42005. /* calculate safe periods for rebinding */
  42006. dhcp->offered_t2_rebind = dhcp->offered_t0_lease;
  42007. }
  42008. /* (y)our internet address */
  42009. ip_addr_copy(dhcp->offered_ip_addr, dhcp->msg_in->yiaddr);
  42010. 802f2c8: 691b ldr r3, [r3, #16]
  42011. 802f2ca: 6263 str r3, [r4, #36] ; 0x24
  42012. boot file name copied in dhcp_parse_reply if not overloaded */
  42013. ip_addr_copy(dhcp->offered_si_addr, dhcp->msg_in->siaddr);
  42014. #endif /* LWIP_DHCP_BOOTP_FILE */
  42015. /* subnet mask given? */
  42016. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_SUBNET_MASK)) {
  42017. 802f2cc: 7993 ldrb r3, [r2, #6]
  42018. 802f2ce: 4616 mov r6, r2
  42019. 802f2d0: b12b cbz r3, 802f2de <dhcp_recv+0x2f2>
  42020. /* remember given subnet mask */
  42021. ip4_addr_set_u32(&dhcp->offered_sn_mask, htonl(dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_SUBNET_MASK)));
  42022. 802f2d2: 4b37 ldr r3, [pc, #220] ; (802f3b0 <dhcp_recv+0x3c4>)
  42023. 802f2d4: 6998 ldr r0, [r3, #24]
  42024. 802f2d6: f7ff fba3 bl 802ea20 <lwip_htonl>
  42025. dhcp->subnet_mask_given = 1;
  42026. 802f2da: 2301 movs r3, #1
  42027. #endif /* LWIP_DHCP_BOOTP_FILE */
  42028. /* subnet mask given? */
  42029. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_SUBNET_MASK)) {
  42030. /* remember given subnet mask */
  42031. ip4_addr_set_u32(&dhcp->offered_sn_mask, htonl(dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_SUBNET_MASK)));
  42032. 802f2dc: 62a0 str r0, [r4, #40] ; 0x28
  42033. dhcp->subnet_mask_given = 1;
  42034. } else {
  42035. dhcp->subnet_mask_given = 0;
  42036. 802f2de: 73a3 strb r3, [r4, #14]
  42037. }
  42038. /* gateway router */
  42039. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_ROUTER)) {
  42040. 802f2e0: 79f3 ldrb r3, [r6, #7]
  42041. 802f2e2: b123 cbz r3, 802f2ee <dhcp_recv+0x302>
  42042. ip4_addr_set_u32(&dhcp->offered_gw_addr, htonl(dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_ROUTER)));
  42043. 802f2e4: 4b32 ldr r3, [pc, #200] ; (802f3b0 <dhcp_recv+0x3c4>)
  42044. 802f2e6: 69d8 ldr r0, [r3, #28]
  42045. 802f2e8: f7ff fb9a bl 802ea20 <lwip_htonl>
  42046. 802f2ec: 62e0 str r0, [r4, #44] ; 0x2c
  42047. /* in requesting state? */
  42048. if (dhcp->state == DHCP_REQUESTING) {
  42049. dhcp_handle_ack(netif);
  42050. #if DHCP_DOES_ARP_CHECK
  42051. /* check if the acknowledged lease address is already in use */
  42052. dhcp_check(netif);
  42053. 802f2ee: 4628 mov r0, r5
  42054. 802f2f0: f7ff fe0a bl 802ef08 <dhcp_check>
  42055. 802f2f4: e03f b.n 802f376 <dhcp_recv+0x38a>
  42056. /* bind interface to the acknowledged lease address */
  42057. dhcp_bind(netif);
  42058. #endif
  42059. }
  42060. /* already bound to the given lease address? */
  42061. else if ((dhcp->state == DHCP_REBOOTING) || (dhcp->state == DHCP_REBINDING) || (dhcp->state == DHCP_RENEWING)) {
  42062. 802f2f6: 3903 subs r1, #3
  42063. 802f2f8: 2902 cmp r1, #2
  42064. 802f2fa: d83c bhi.n 802f376 <dhcp_recv+0x38a>
  42065. dhcp_bind(netif);
  42066. 802f2fc: 4628 mov r0, r5
  42067. 802f2fe: f7ff fe16 bl 802ef2e <dhcp_bind>
  42068. 802f302: e038 b.n 802f376 <dhcp_recv+0x38a>
  42069. }
  42070. }
  42071. /* received a DHCP_NAK in appropriate state? */
  42072. else if ((msg_type == DHCP_NAK) &&
  42073. 802f304: 2906 cmp r1, #6
  42074. 802f306: d121 bne.n 802f34c <dhcp_recv+0x360>
  42075. 802f308: f898 300c ldrb.w r3, [r8, #12]
  42076. 802f30c: 2b05 cmp r3, #5
  42077. 802f30e: d832 bhi.n 802f376 <dhcp_recv+0x38a>
  42078. 802f310: f998 300c ldrsb.w r3, [r8, #12]
  42079. 802f314: f04f 42b8 mov.w r2, #1543503872 ; 0x5c000000
  42080. 802f318: 409a lsls r2, r3
  42081. 802f31a: d52c bpl.n 802f376 <dhcp_recv+0x38a>
  42082. {
  42083. struct dhcp *dhcp = netif->dhcp;
  42084. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_handle_nak(netif=%p) %c%c%"U16_F"\n",
  42085. (void*)netif, netif->name[0], netif->name[1], (u16_t)netif->num));
  42086. /* Set the interface down since the address must no longer be used, as per RFC2131 */
  42087. netif_set_down(netif);
  42088. 802f31c: 4628 mov r0, r5
  42089. * @param netif the netif under DHCP control
  42090. */
  42091. static void
  42092. dhcp_handle_nak(struct netif *netif)
  42093. {
  42094. struct dhcp *dhcp = netif->dhcp;
  42095. 802f31e: 6a2c ldr r4, [r5, #32]
  42096. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_handle_nak(netif=%p) %c%c%"U16_F"\n",
  42097. (void*)netif, netif->name[0], netif->name[1], (u16_t)netif->num));
  42098. /* Set the interface down since the address must no longer be used, as per RFC2131 */
  42099. netif_set_down(netif);
  42100. 802f320: f000 fc6e bl 802fc00 <netif_set_down>
  42101. /* remove IP address from interface */
  42102. netif_set_ipaddr(netif, IP_ADDR_ANY);
  42103. 802f324: 4628 mov r0, r5
  42104. 802f326: 4923 ldr r1, [pc, #140] ; (802f3b4 <dhcp_recv+0x3c8>)
  42105. 802f328: f000 fbba bl 802faa0 <netif_set_ipaddr>
  42106. netif_set_gw(netif, IP_ADDR_ANY);
  42107. 802f32c: 4628 mov r0, r5
  42108. 802f32e: 4921 ldr r1, [pc, #132] ; (802f3b4 <dhcp_recv+0x3c8>)
  42109. 802f330: f000 fbf2 bl 802fb18 <netif_set_gw>
  42110. netif_set_netmask(netif, IP_ADDR_ANY);
  42111. 802f334: 4628 mov r0, r5
  42112. 802f336: 491f ldr r1, [pc, #124] ; (802f3b4 <dhcp_recv+0x3c8>)
  42113. 802f338: f000 fbf2 bl 802fb20 <netif_set_netmask>
  42114. /* Change to a defined state */
  42115. dhcp_set_state(dhcp, DHCP_BACKING_OFF);
  42116. 802f33c: 4620 mov r0, r4
  42117. 802f33e: 210c movs r1, #12
  42118. 802f340: f7ff fb72 bl 802ea28 <dhcp_set_state>
  42119. /* We can immediately restart discovery */
  42120. dhcp_discover(netif);
  42121. 802f344: 4628 mov r0, r5
  42122. 802f346: f7ff fc7f bl 802ec48 <dhcp_discover>
  42123. 802f34a: e014 b.n 802f376 <dhcp_recv+0x38a>
  42124. (dhcp->state == DHCP_REBINDING) || (dhcp->state == DHCP_RENEWING ))) {
  42125. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("DHCP_NAK received\n"));
  42126. dhcp_handle_nak(netif);
  42127. }
  42128. /* received a DHCP_OFFER in DHCP_SELECTING state? */
  42129. else if ((msg_type == DHCP_OFFER) && (dhcp->state == DHCP_SELECTING)) {
  42130. 802f34c: 2902 cmp r1, #2
  42131. 802f34e: d112 bne.n 802f376 <dhcp_recv+0x38a>
  42132. 802f350: f898 100c ldrb.w r1, [r8, #12]
  42133. 802f354: 2906 cmp r1, #6
  42134. 802f356: d10e bne.n 802f376 <dhcp_recv+0x38a>
  42135. {
  42136. struct dhcp *dhcp = netif->dhcp;
  42137. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_handle_offer(netif=%p) %c%c%"U16_F"\n",
  42138. (void*)netif, netif->name[0], netif->name[1], (u16_t)netif->num));
  42139. /* obtain the server address */
  42140. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_SERVER_ID)) {
  42141. 802f358: 789b ldrb r3, [r3, #2]
  42142. dhcp_handle_nak(netif);
  42143. }
  42144. /* received a DHCP_OFFER in DHCP_SELECTING state? */
  42145. else if ((msg_type == DHCP_OFFER) && (dhcp->state == DHCP_SELECTING)) {
  42146. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("DHCP_OFFER received in DHCP_SELECTING state\n"));
  42147. dhcp->request_timeout = 0;
  42148. 802f35a: f8a8 b01a strh.w fp, [r8, #26]
  42149. * @param netif the netif under DHCP control
  42150. */
  42151. static void
  42152. dhcp_handle_offer(struct netif *netif)
  42153. {
  42154. struct dhcp *dhcp = netif->dhcp;
  42155. 802f35e: 6a2c ldr r4, [r5, #32]
  42156. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_handle_offer(netif=%p) %c%c%"U16_F"\n",
  42157. (void*)netif, netif->name[0], netif->name[1], (u16_t)netif->num));
  42158. /* obtain the server address */
  42159. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_SERVER_ID)) {
  42160. 802f360: b14b cbz r3, 802f376 <dhcp_recv+0x38a>
  42161. ip4_addr_set_u32(&dhcp->server_ip_addr, htonl(dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_SERVER_ID)));
  42162. 802f362: 6890 ldr r0, [r2, #8]
  42163. 802f364: f7ff fb5c bl 802ea20 <lwip_htonl>
  42164. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_handle_offer(): server 0x%08"X32_F"\n",
  42165. ip4_addr_get_u32(&dhcp->server_ip_addr)));
  42166. /* remember offered address */
  42167. ip_addr_copy(dhcp->offered_ip_addr, dhcp->msg_in->yiaddr);
  42168. 802f368: 68a3 ldr r3, [r4, #8]
  42169. struct dhcp *dhcp = netif->dhcp;
  42170. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_handle_offer(netif=%p) %c%c%"U16_F"\n",
  42171. (void*)netif, netif->name[0], netif->name[1], (u16_t)netif->num));
  42172. /* obtain the server address */
  42173. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_SERVER_ID)) {
  42174. ip4_addr_set_u32(&dhcp->server_ip_addr, htonl(dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_SERVER_ID)));
  42175. 802f36a: 6220 str r0, [r4, #32]
  42176. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_handle_offer(): server 0x%08"X32_F"\n",
  42177. ip4_addr_get_u32(&dhcp->server_ip_addr)));
  42178. /* remember offered address */
  42179. ip_addr_copy(dhcp->offered_ip_addr, dhcp->msg_in->yiaddr);
  42180. 802f36c: 691b ldr r3, [r3, #16]
  42181. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_handle_offer(): offer for 0x%08"X32_F"\n",
  42182. ip4_addr_get_u32(&dhcp->offered_ip_addr)));
  42183. dhcp_select(netif);
  42184. 802f36e: 4628 mov r0, r5
  42185. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_SERVER_ID)) {
  42186. ip4_addr_set_u32(&dhcp->server_ip_addr, htonl(dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_SERVER_ID)));
  42187. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_handle_offer(): server 0x%08"X32_F"\n",
  42188. ip4_addr_get_u32(&dhcp->server_ip_addr)));
  42189. /* remember offered address */
  42190. ip_addr_copy(dhcp->offered_ip_addr, dhcp->msg_in->yiaddr);
  42191. 802f370: 6263 str r3, [r4, #36] ; 0x24
  42192. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_handle_offer(): offer for 0x%08"X32_F"\n",
  42193. ip4_addr_get_u32(&dhcp->offered_ip_addr)));
  42194. dhcp_select(netif);
  42195. 802f372: f7ff fd57 bl 802ee24 <dhcp_select>
  42196. dhcp->request_timeout = 0;
  42197. /* remember offered lease */
  42198. dhcp_handle_offer(netif);
  42199. }
  42200. free_pbuf_and_return:
  42201. dhcp->msg_in = NULL;
  42202. 802f376: 2300 movs r3, #0
  42203. 802f378: f8c8 3008 str.w r3, [r8, #8]
  42204. pbuf_free(p);
  42205. 802f37c: 4650 mov r0, sl
  42206. 802f37e: f000 fc83 bl 802fc88 <pbuf_free>
  42207. 802f382: e010 b.n 802f3a6 <dhcp_recv+0x3ba>
  42208. /* if both are overloaded, parse file first and then sname (RFC 2131 ch. 4.1) */
  42209. parse_file_as_options = 0;
  42210. options_idx = DHCP_FILE_OFS;
  42211. options_idx_max = DHCP_FILE_OFS + DHCP_FILE_LEN;
  42212. goto again;
  42213. } else if (parse_sname_as_options) {
  42214. 802f384: f1bb 0f00 cmp.w fp, #0
  42215. 802f388: f47f ae6d bne.w 802f066 <dhcp_recv+0x7a>
  42216. 802f38c: e005 b.n 802f39a <dhcp_recv+0x3ae>
  42217. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("overloaded file field\n"));
  42218. } else if (overload == DHCP_OVERLOAD_SNAME) {
  42219. parse_sname_as_options = 1;
  42220. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("overloaded sname field\n"));
  42221. } else if (overload == DHCP_OVERLOAD_SNAME_FILE) {
  42222. parse_sname_as_options = 1;
  42223. 802f38e: f04f 0b01 mov.w fp, #1
  42224. }
  42225. if (parse_file_as_options) {
  42226. /* if both are overloaded, parse file first and then sname (RFC 2131 ch. 4.1) */
  42227. parse_file_as_options = 0;
  42228. options_idx = DHCP_FILE_OFS;
  42229. options_idx_max = DHCP_FILE_OFS + DHCP_FILE_LEN;
  42230. 802f392: f04f 09ec mov.w r9, #236 ; 0xec
  42231. #endif /* LWIP_DHCP_BOOTP_FILE */
  42232. }
  42233. if (parse_file_as_options) {
  42234. /* if both are overloaded, parse file first and then sname (RFC 2131 ch. 4.1) */
  42235. parse_file_as_options = 0;
  42236. options_idx = DHCP_FILE_OFS;
  42237. 802f396: 226c movs r2, #108 ; 0x6c
  42238. 802f398: e66a b.n 802f070 <dhcp_recv+0x84>
  42239. goto free_pbuf_and_return;
  42240. }
  42241. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("searching DHCP_OPTION_MESSAGE_TYPE\n"));
  42242. /* obtain pointer to DHCP message type */
  42243. if (!dhcp_option_given(dhcp, DHCP_OPTION_IDX_MSG_TYPE)) {
  42244. 802f39a: 4b04 ldr r3, [pc, #16] ; (802f3ac <dhcp_recv+0x3c0>)
  42245. 802f39c: 785a ldrb r2, [r3, #1]
  42246. 802f39e: 2a00 cmp r2, #0
  42247. 802f3a0: f47f af6b bne.w 802f27a <dhcp_recv+0x28e>
  42248. 802f3a4: e7e7 b.n 802f376 <dhcp_recv+0x38a>
  42249. dhcp_handle_offer(netif);
  42250. }
  42251. free_pbuf_and_return:
  42252. dhcp->msg_in = NULL;
  42253. pbuf_free(p);
  42254. }
  42255. 802f3a6: b00b add sp, #44 ; 0x2c
  42256. 802f3a8: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  42257. 802f3ac: 2000eacc .word 0x2000eacc
  42258. 802f3b0: 2000ead8 .word 0x2000ead8
  42259. 802f3b4: 08044744 .word 0x08044744
  42260. 0802f3b8 <dhcp_arp_reply>:
  42261. *
  42262. * @param netif the network interface on which the reply was received
  42263. * @param addr The IP address we received a reply from
  42264. */
  42265. void dhcp_arp_reply(struct netif *netif, ip_addr_t *addr)
  42266. {
  42267. 802f3b8: b537 push {r0, r1, r2, r4, r5, lr}
  42268. LWIP_ERROR("netif != NULL", (netif != NULL), return;);
  42269. 802f3ba: 4605 mov r5, r0
  42270. 802f3bc: 2800 cmp r0, #0
  42271. 802f3be: d037 beq.n 802f430 <dhcp_arp_reply+0x78>
  42272. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_arp_reply()\n"));
  42273. /* is a DHCP client doing an ARP check? */
  42274. if ((netif->dhcp != NULL) && (netif->dhcp->state == DHCP_CHECKING)) {
  42275. 802f3c0: 6a04 ldr r4, [r0, #32]
  42276. 802f3c2: 2c00 cmp r4, #0
  42277. 802f3c4: d034 beq.n 802f430 <dhcp_arp_reply+0x78>
  42278. 802f3c6: 7b23 ldrb r3, [r4, #12]
  42279. 802f3c8: 2b08 cmp r3, #8
  42280. 802f3ca: d131 bne.n 802f430 <dhcp_arp_reply+0x78>
  42281. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_arp_reply(): CHECKING, arp reply for 0x%08"X32_F"\n",
  42282. ip4_addr_get_u32(addr)));
  42283. /* did a host respond with the address we
  42284. were offered by the DHCP server? */
  42285. if (ip_addr_cmp(addr, &netif->dhcp->offered_ip_addr)) {
  42286. 802f3cc: 680a ldr r2, [r1, #0]
  42287. 802f3ce: 6a63 ldr r3, [r4, #36] ; 0x24
  42288. 802f3d0: 429a cmp r2, r3
  42289. 802f3d2: d12d bne.n 802f430 <dhcp_arp_reply+0x78>
  42290. {
  42291. struct dhcp *dhcp = netif->dhcp;
  42292. err_t result = ERR_OK;
  42293. u16_t msecs;
  42294. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_decline()\n"));
  42295. dhcp_set_state(dhcp, DHCP_BACKING_OFF);
  42296. 802f3d4: 4620 mov r0, r4
  42297. 802f3d6: 210c movs r1, #12
  42298. 802f3d8: f7ff fb26 bl 802ea28 <dhcp_set_state>
  42299. /* create and initialize the DHCP message header */
  42300. result = dhcp_create_msg(netif, dhcp, DHCP_DECLINE);
  42301. 802f3dc: 4628 mov r0, r5
  42302. 802f3de: 4621 mov r1, r4
  42303. 802f3e0: 2204 movs r2, #4
  42304. 802f3e2: f7ff fb85 bl 802eaf0 <dhcp_create_msg>
  42305. if (result == ERR_OK) {
  42306. 802f3e6: b9f0 cbnz r0, 802f426 <dhcp_arp_reply+0x6e>
  42307. dhcp_option(dhcp, DHCP_OPTION_REQUESTED_IP, 4);
  42308. 802f3e8: 2204 movs r2, #4
  42309. 802f3ea: 2132 movs r1, #50 ; 0x32
  42310. 802f3ec: 4620 mov r0, r4
  42311. 802f3ee: f7ff fb23 bl 802ea38 <dhcp_option>
  42312. dhcp_option_long(dhcp, ntohl(ip4_addr_get_u32(&dhcp->offered_ip_addr)));
  42313. 802f3f2: 6a60 ldr r0, [r4, #36] ; 0x24
  42314. 802f3f4: f7ff fb16 bl 802ea24 <lwip_ntohl>
  42315. 802f3f8: 4601 mov r1, r0
  42316. 802f3fa: 4620 mov r0, r4
  42317. 802f3fc: f7ff fb43 bl 802ea86 <dhcp_option_long>
  42318. dhcp_option_trailer(dhcp);
  42319. 802f400: 4620 mov r0, r4
  42320. 802f402: f7ff fb60 bl 802eac6 <dhcp_option_trailer>
  42321. /* resize pbuf to reflect true size of options */
  42322. pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len);
  42323. 802f406: 8b21 ldrh r1, [r4, #24]
  42324. 802f408: 6920 ldr r0, [r4, #16]
  42325. 802f40a: 31f0 adds r1, #240 ; 0xf0
  42326. 802f40c: b289 uxth r1, r1
  42327. 802f40e: f000 fc62 bl 802fcd6 <pbuf_realloc>
  42328. /* per section 4.4.4, broadcast DECLINE messages */
  42329. udp_sendto_if(dhcp->pcb, dhcp->p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT, netif);
  42330. 802f412: 9500 str r5, [sp, #0]
  42331. 802f414: 6860 ldr r0, [r4, #4]
  42332. 802f416: 6921 ldr r1, [r4, #16]
  42333. 802f418: 4a06 ldr r2, [pc, #24] ; (802f434 <dhcp_arp_reply+0x7c>)
  42334. 802f41a: 2343 movs r3, #67 ; 0x43
  42335. 802f41c: f003 f8d4 bl 80325c8 <udp_sendto_if>
  42336. dhcp_delete_msg(dhcp);
  42337. 802f420: 4620 mov r0, r4
  42338. 802f422: f7ff fc05 bl 802ec30 <dhcp_delete_msg>
  42339. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_decline: BACKING OFF\n"));
  42340. } else {
  42341. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS,
  42342. ("dhcp_decline: could not allocate DHCP request\n"));
  42343. }
  42344. dhcp->tries++;
  42345. 802f426: 7b63 ldrb r3, [r4, #13]
  42346. 802f428: 3301 adds r3, #1
  42347. 802f42a: 7363 strb r3, [r4, #13]
  42348. msecs = 10*1000;
  42349. dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS;
  42350. 802f42c: 2314 movs r3, #20
  42351. 802f42e: 8363 strh r3, [r4, #26]
  42352. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE | LWIP_DBG_LEVEL_WARNING,
  42353. ("dhcp_arp_reply(): arp reply matched with offered address, declining\n"));
  42354. dhcp_decline(netif);
  42355. }
  42356. }
  42357. }
  42358. 802f430: bd3e pop {r1, r2, r3, r4, r5, pc}
  42359. 802f432: bf00 nop
  42360. 802f434: 08044740 .word 0x08044740
  42361. 0802f438 <dhcp_renew>:
  42362. *
  42363. * @param netif network interface which must renew its lease
  42364. */
  42365. err_t
  42366. dhcp_renew(struct netif *netif)
  42367. {
  42368. 802f438: b573 push {r0, r1, r4, r5, r6, lr}
  42369. struct dhcp *dhcp = netif->dhcp;
  42370. 802f43a: 6a04 ldr r4, [r0, #32]
  42371. *
  42372. * @param netif network interface which must renew its lease
  42373. */
  42374. err_t
  42375. dhcp_renew(struct netif *netif)
  42376. {
  42377. 802f43c: 4605 mov r5, r0
  42378. struct dhcp *dhcp = netif->dhcp;
  42379. err_t result;
  42380. u16_t msecs;
  42381. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_renew()\n"));
  42382. dhcp_set_state(dhcp, DHCP_RENEWING);
  42383. 802f43e: 2105 movs r1, #5
  42384. 802f440: 4620 mov r0, r4
  42385. 802f442: f7ff faf1 bl 802ea28 <dhcp_set_state>
  42386. /* create and initialize the DHCP message header */
  42387. result = dhcp_create_msg(netif, dhcp, DHCP_REQUEST);
  42388. 802f446: 4628 mov r0, r5
  42389. 802f448: 4621 mov r1, r4
  42390. 802f44a: 2203 movs r2, #3
  42391. 802f44c: f7ff fb50 bl 802eaf0 <dhcp_create_msg>
  42392. if (result == ERR_OK) {
  42393. 802f450: 4606 mov r6, r0
  42394. 802f452: b9e0 cbnz r0, 802f48e <dhcp_renew+0x56>
  42395. dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN);
  42396. 802f454: 2202 movs r2, #2
  42397. 802f456: 4620 mov r0, r4
  42398. 802f458: 2139 movs r1, #57 ; 0x39
  42399. 802f45a: f7ff faed bl 802ea38 <dhcp_option>
  42400. dhcp_option_short(dhcp, DHCP_MAX_MSG_LEN(netif));
  42401. 802f45e: 8ca9 ldrh r1, [r5, #36] ; 0x24
  42402. 802f460: 4620 mov r0, r4
  42403. 802f462: f7ff fb00 bl 802ea66 <dhcp_option_short>
  42404. #if LWIP_NETIF_HOSTNAME
  42405. dhcp_option_hostname(dhcp, netif);
  42406. #endif /* LWIP_NETIF_HOSTNAME */
  42407. /* append DHCP message trailer */
  42408. dhcp_option_trailer(dhcp);
  42409. 802f466: 4620 mov r0, r4
  42410. 802f468: f7ff fb2d bl 802eac6 <dhcp_option_trailer>
  42411. pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len);
  42412. 802f46c: 8b21 ldrh r1, [r4, #24]
  42413. 802f46e: 6920 ldr r0, [r4, #16]
  42414. 802f470: 31f0 adds r1, #240 ; 0xf0
  42415. 802f472: b289 uxth r1, r1
  42416. 802f474: f000 fc2f bl 802fcd6 <pbuf_realloc>
  42417. udp_sendto_if(dhcp->pcb, dhcp->p_out, &dhcp->server_ip_addr, DHCP_SERVER_PORT, netif);
  42418. 802f478: 9500 str r5, [sp, #0]
  42419. 802f47a: 6860 ldr r0, [r4, #4]
  42420. 802f47c: 6921 ldr r1, [r4, #16]
  42421. 802f47e: f104 0220 add.w r2, r4, #32
  42422. 802f482: 2343 movs r3, #67 ; 0x43
  42423. 802f484: f003 f8a0 bl 80325c8 <udp_sendto_if>
  42424. dhcp_delete_msg(dhcp);
  42425. 802f488: 4620 mov r0, r4
  42426. 802f48a: f7ff fbd1 bl 802ec30 <dhcp_delete_msg>
  42427. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_renew: RENEWING\n"));
  42428. } else {
  42429. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_renew: could not allocate DHCP request\n"));
  42430. }
  42431. dhcp->tries++;
  42432. 802f48e: 7b63 ldrb r3, [r4, #13]
  42433. 802f490: 3301 adds r3, #1
  42434. 802f492: b2db uxtb r3, r3
  42435. /* back-off on retries, but to a maximum of 20 seconds */
  42436. msecs = dhcp->tries < 10 ? dhcp->tries * 2000 : 20 * 1000;
  42437. 802f494: 2b09 cmp r3, #9
  42438. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_renew: RENEWING\n"));
  42439. } else {
  42440. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_renew: could not allocate DHCP request\n"));
  42441. }
  42442. dhcp->tries++;
  42443. 802f496: 7363 strb r3, [r4, #13]
  42444. /* back-off on retries, but to a maximum of 20 seconds */
  42445. msecs = dhcp->tries < 10 ? dhcp->tries * 2000 : 20 * 1000;
  42446. 802f498: d804 bhi.n 802f4a4 <dhcp_renew+0x6c>
  42447. 802f49a: f44f 62fa mov.w r2, #2000 ; 0x7d0
  42448. 802f49e: 4353 muls r3, r2
  42449. 802f4a0: b29b uxth r3, r3
  42450. 802f4a2: e001 b.n 802f4a8 <dhcp_renew+0x70>
  42451. 802f4a4: f644 6320 movw r3, #20000 ; 0x4e20
  42452. dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS;
  42453. 802f4a8: f44f 72fa mov.w r2, #500 ; 0x1f4
  42454. 802f4ac: f203 13f3 addw r3, r3, #499 ; 0x1f3
  42455. 802f4b0: fb93 f3f2 sdiv r3, r3, r2
  42456. 802f4b4: 8363 strh r3, [r4, #26]
  42457. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_renew(): set request timeout %"U16_F" msecs\n", msecs));
  42458. return result;
  42459. }
  42460. 802f4b6: 4630 mov r0, r6
  42461. 802f4b8: bd7c pop {r2, r3, r4, r5, r6, pc}
  42462. 802f4ba: 0000 movs r0, r0
  42463. 0802f4bc <dhcp_coarse_tmr>:
  42464. /**
  42465. * The DHCP timer that checks for lease renewal/rebind timeouts.
  42466. */
  42467. void
  42468. dhcp_coarse_tmr()
  42469. {
  42470. 802f4bc: b538 push {r3, r4, r5, lr}
  42471. struct netif *netif = netif_list;
  42472. 802f4be: 4b15 ldr r3, [pc, #84] ; (802f514 <dhcp_coarse_tmr+0x58>)
  42473. 802f4c0: 4d15 ldr r5, [pc, #84] ; (802f518 <dhcp_coarse_tmr+0x5c>)
  42474. 802f4c2: 681c ldr r4, [r3, #0]
  42475. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_coarse_tmr()\n"));
  42476. /* iterate through all network interfaces */
  42477. while (netif != NULL) {
  42478. 802f4c4: e023 b.n 802f50e <dhcp_coarse_tmr+0x52>
  42479. /* only act on DHCP configured interfaces */
  42480. if (netif->dhcp != NULL) {
  42481. 802f4c6: 6a23 ldr r3, [r4, #32]
  42482. 802f4c8: b303 cbz r3, 802f50c <dhcp_coarse_tmr+0x50>
  42483. /* timer is active (non zero), and triggers (zeroes) now? */
  42484. if (netif->dhcp->t2_timeout-- == 1) {
  42485. 802f4ca: 8bda ldrh r2, [r3, #30]
  42486. 802f4cc: 1e51 subs r1, r2, #1
  42487. 802f4ce: 2a01 cmp r2, #1
  42488. 802f4d0: 83d9 strh r1, [r3, #30]
  42489. 802f4d2: d10b bne.n 802f4ec <dhcp_coarse_tmr+0x30>
  42490. 802f4d4: 7b1a ldrb r2, [r3, #12]
  42491. 802f4d6: 2a0a cmp r2, #10
  42492. 802f4d8: d818 bhi.n 802f50c <dhcp_coarse_tmr+0x50>
  42493. 802f4da: f993 300c ldrsb.w r3, [r3, #12]
  42494. 802f4de: fa15 f303 lsls.w r3, r5, r3
  42495. 802f4e2: d513 bpl.n 802f50c <dhcp_coarse_tmr+0x50>
  42496. /* just retry to rebind */
  42497. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE,
  42498. ("dhcp_t2_timeout(): must rebind\n"));
  42499. /* This slightly different to RFC2131: DHCPREQUEST will be sent from state
  42500. DHCP_REBINDING, not DHCP_BOUND */
  42501. dhcp_rebind(netif);
  42502. 802f4e4: 4620 mov r0, r4
  42503. 802f4e6: f7ff fc0b bl 802ed00 <dhcp_rebind>
  42504. 802f4ea: e00f b.n 802f50c <dhcp_coarse_tmr+0x50>
  42505. if (netif->dhcp->t2_timeout-- == 1) {
  42506. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_coarse_tmr(): t2 timeout\n"));
  42507. /* this clients' rebind timeout triggered */
  42508. dhcp_t2_timeout(netif);
  42509. /* timer is active (non zero), and triggers (zeroes) now */
  42510. } else if (netif->dhcp->t1_timeout-- == 1) {
  42511. 802f4ec: 8b9a ldrh r2, [r3, #28]
  42512. 802f4ee: 1e51 subs r1, r2, #1
  42513. 802f4f0: 2a01 cmp r2, #1
  42514. 802f4f2: 8399 strh r1, [r3, #28]
  42515. 802f4f4: d10a bne.n 802f50c <dhcp_coarse_tmr+0x50>
  42516. 802f4f6: 7b1a ldrb r2, [r3, #12]
  42517. 802f4f8: 2a0a cmp r2, #10
  42518. 802f4fa: d807 bhi.n 802f50c <dhcp_coarse_tmr+0x50>
  42519. 802f4fc: f993 300c ldrsb.w r3, [r3, #12]
  42520. 802f500: fa15 f303 lsls.w r3, r5, r3
  42521. 802f504: d502 bpl.n 802f50c <dhcp_coarse_tmr+0x50>
  42522. * eventually time-out if renew tries fail. */
  42523. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE,
  42524. ("dhcp_t1_timeout(): must renew\n"));
  42525. /* This slightly different to RFC2131: DHCPREQUEST will be sent from state
  42526. DHCP_RENEWING, not DHCP_BOUND */
  42527. dhcp_renew(netif);
  42528. 802f506: 4620 mov r0, r4
  42529. 802f508: f7ff ff96 bl 802f438 <dhcp_renew>
  42530. /* this clients' renewal timeout triggered */
  42531. dhcp_t1_timeout(netif);
  42532. }
  42533. }
  42534. /* proceed to next netif */
  42535. netif = netif->next;
  42536. 802f50c: 6824 ldr r4, [r4, #0]
  42537. dhcp_coarse_tmr()
  42538. {
  42539. struct netif *netif = netif_list;
  42540. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_coarse_tmr()\n"));
  42541. /* iterate through all network interfaces */
  42542. while (netif != NULL) {
  42543. 802f50e: 2c00 cmp r4, #0
  42544. 802f510: d1d9 bne.n 802f4c6 <dhcp_coarse_tmr+0xa>
  42545. }
  42546. }
  42547. /* proceed to next netif */
  42548. netif = netif->next;
  42549. }
  42550. }
  42551. 802f512: bd38 pop {r3, r4, r5, pc}
  42552. 802f514: 2000ff14 .word 0x2000ff14
  42553. 802f518: 44200000 .word 0x44200000
  42554. 0802f51c <dhcp_release>:
  42555. *
  42556. * @param netif network interface which must release its lease
  42557. */
  42558. err_t
  42559. dhcp_release(struct netif *netif)
  42560. {
  42561. 802f51c: b573 push {r0, r1, r4, r5, r6, lr}
  42562. struct dhcp *dhcp = netif->dhcp;
  42563. 802f51e: 6a04 ldr r4, [r0, #32]
  42564. *
  42565. * @param netif network interface which must release its lease
  42566. */
  42567. err_t
  42568. dhcp_release(struct netif *netif)
  42569. {
  42570. 802f520: 4605 mov r5, r0
  42571. err_t result;
  42572. u16_t msecs;
  42573. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_release()\n"));
  42574. /* idle DHCP client */
  42575. dhcp_set_state(dhcp, DHCP_OFF);
  42576. 802f522: 2100 movs r1, #0
  42577. 802f524: 4620 mov r0, r4
  42578. 802f526: f7ff fa7f bl 802ea28 <dhcp_set_state>
  42579. /* clean old DHCP offer */
  42580. ip_addr_set_zero(&dhcp->server_ip_addr);
  42581. 802f52a: 2300 movs r3, #0
  42582. 802f52c: 6223 str r3, [r4, #32]
  42583. ip_addr_set_zero(&dhcp->offered_ip_addr);
  42584. 802f52e: 6263 str r3, [r4, #36] ; 0x24
  42585. ip_addr_set_zero(&dhcp->offered_sn_mask);
  42586. 802f530: 62a3 str r3, [r4, #40] ; 0x28
  42587. ip_addr_set_zero(&dhcp->offered_gw_addr);
  42588. 802f532: 62e3 str r3, [r4, #44] ; 0x2c
  42589. #if LWIP_DHCP_BOOTP_FILE
  42590. ip_addr_set_zero(&dhcp->offered_si_addr);
  42591. #endif /* LWIP_DHCP_BOOTP_FILE */
  42592. dhcp->offered_t0_lease = dhcp->offered_t1_renew = dhcp->offered_t2_rebind = 0;
  42593. 802f534: 63a3 str r3, [r4, #56] ; 0x38
  42594. 802f536: 6363 str r3, [r4, #52] ; 0x34
  42595. 802f538: 6323 str r3, [r4, #48] ; 0x30
  42596. /* create and initialize the DHCP message header */
  42597. result = dhcp_create_msg(netif, dhcp, DHCP_RELEASE);
  42598. 802f53a: 4628 mov r0, r5
  42599. 802f53c: 4621 mov r1, r4
  42600. 802f53e: 2207 movs r2, #7
  42601. 802f540: f7ff fad6 bl 802eaf0 <dhcp_create_msg>
  42602. if (result == ERR_OK) {
  42603. 802f544: 4606 mov r6, r0
  42604. 802f546: b998 cbnz r0, 802f570 <dhcp_release+0x54>
  42605. dhcp_option_trailer(dhcp);
  42606. 802f548: 4620 mov r0, r4
  42607. 802f54a: f7ff fabc bl 802eac6 <dhcp_option_trailer>
  42608. pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len);
  42609. 802f54e: 8b21 ldrh r1, [r4, #24]
  42610. 802f550: 6920 ldr r0, [r4, #16]
  42611. 802f552: 31f0 adds r1, #240 ; 0xf0
  42612. 802f554: b289 uxth r1, r1
  42613. 802f556: f000 fbbe bl 802fcd6 <pbuf_realloc>
  42614. udp_sendto_if(dhcp->pcb, dhcp->p_out, &dhcp->server_ip_addr, DHCP_SERVER_PORT, netif);
  42615. 802f55a: 9500 str r5, [sp, #0]
  42616. 802f55c: 6860 ldr r0, [r4, #4]
  42617. 802f55e: 6921 ldr r1, [r4, #16]
  42618. 802f560: f104 0220 add.w r2, r4, #32
  42619. 802f564: 2343 movs r3, #67 ; 0x43
  42620. 802f566: f003 f82f bl 80325c8 <udp_sendto_if>
  42621. dhcp_delete_msg(dhcp);
  42622. 802f56a: 4620 mov r0, r4
  42623. 802f56c: f7ff fb60 bl 802ec30 <dhcp_delete_msg>
  42624. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_release: RELEASED, DHCP_OFF\n"));
  42625. } else {
  42626. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_release: could not allocate DHCP request\n"));
  42627. }
  42628. dhcp->tries++;
  42629. 802f570: 7b63 ldrb r3, [r4, #13]
  42630. 802f572: 3301 adds r3, #1
  42631. 802f574: b2db uxtb r3, r3
  42632. msecs = dhcp->tries < 10 ? dhcp->tries * 1000 : 10 * 1000;
  42633. 802f576: 2b09 cmp r3, #9
  42634. dhcp_delete_msg(dhcp);
  42635. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_release: RELEASED, DHCP_OFF\n"));
  42636. } else {
  42637. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_release: could not allocate DHCP request\n"));
  42638. }
  42639. dhcp->tries++;
  42640. 802f578: 7363 strb r3, [r4, #13]
  42641. msecs = dhcp->tries < 10 ? dhcp->tries * 1000 : 10 * 1000;
  42642. 802f57a: d804 bhi.n 802f586 <dhcp_release+0x6a>
  42643. 802f57c: f44f 727a mov.w r2, #1000 ; 0x3e8
  42644. 802f580: 4353 muls r3, r2
  42645. 802f582: b29b uxth r3, r3
  42646. 802f584: e001 b.n 802f58a <dhcp_release+0x6e>
  42647. 802f586: f242 7310 movw r3, #10000 ; 0x2710
  42648. dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS;
  42649. 802f58a: f44f 72fa mov.w r2, #500 ; 0x1f4
  42650. 802f58e: f203 13f3 addw r3, r3, #499 ; 0x1f3
  42651. 802f592: fb93 f3f2 sdiv r3, r3, r2
  42652. 802f596: 8363 strh r3, [r4, #26]
  42653. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_release(): set request timeout %"U16_F" msecs\n", msecs));
  42654. /* bring the interface down */
  42655. netif_set_down(netif);
  42656. 802f598: 4628 mov r0, r5
  42657. 802f59a: f000 fb31 bl 802fc00 <netif_set_down>
  42658. /* remove IP address from interface */
  42659. netif_set_ipaddr(netif, IP_ADDR_ANY);
  42660. 802f59e: 4628 mov r0, r5
  42661. 802f5a0: 4906 ldr r1, [pc, #24] ; (802f5bc <dhcp_release+0xa0>)
  42662. 802f5a2: f000 fa7d bl 802faa0 <netif_set_ipaddr>
  42663. netif_set_gw(netif, IP_ADDR_ANY);
  42664. 802f5a6: 4628 mov r0, r5
  42665. 802f5a8: 4904 ldr r1, [pc, #16] ; (802f5bc <dhcp_release+0xa0>)
  42666. 802f5aa: f000 fab5 bl 802fb18 <netif_set_gw>
  42667. netif_set_netmask(netif, IP_ADDR_ANY);
  42668. 802f5ae: 4628 mov r0, r5
  42669. 802f5b0: 4902 ldr r1, [pc, #8] ; (802f5bc <dhcp_release+0xa0>)
  42670. 802f5b2: f000 fab5 bl 802fb20 <netif_set_netmask>
  42671. return result;
  42672. }
  42673. 802f5b6: 4630 mov r0, r6
  42674. 802f5b8: bd7c pop {r2, r3, r4, r5, r6, pc}
  42675. 802f5ba: bf00 nop
  42676. 802f5bc: 08044744 .word 0x08044744
  42677. 0802f5c0 <dhcp_fine_tmr>:
  42678. * A DHCP server is expected to respond within a short period of time.
  42679. * This timer checks whether an outstanding DHCP request is timed out.
  42680. */
  42681. void
  42682. dhcp_fine_tmr()
  42683. {
  42684. 802f5c0: b538 push {r3, r4, r5, lr}
  42685. struct netif *netif = netif_list;
  42686. 802f5c2: 4b26 ldr r3, [pc, #152] ; (802f65c <dhcp_fine_tmr+0x9c>)
  42687. /* timer is active (non zero), and is about to trigger now */
  42688. if (netif->dhcp->request_timeout > 1) {
  42689. netif->dhcp->request_timeout--;
  42690. }
  42691. else if (netif->dhcp->request_timeout == 1) {
  42692. netif->dhcp->request_timeout--;
  42693. 802f5c4: 2500 movs r5, #0
  42694. * This timer checks whether an outstanding DHCP request is timed out.
  42695. */
  42696. void
  42697. dhcp_fine_tmr()
  42698. {
  42699. struct netif *netif = netif_list;
  42700. 802f5c6: 681c ldr r4, [r3, #0]
  42701. /* loop through netif's */
  42702. while (netif != NULL) {
  42703. 802f5c8: e044 b.n 802f654 <dhcp_fine_tmr+0x94>
  42704. /* only act on DHCP configured interfaces */
  42705. if (netif->dhcp != NULL) {
  42706. 802f5ca: 6a23 ldr r3, [r4, #32]
  42707. 802f5cc: 2b00 cmp r3, #0
  42708. 802f5ce: d040 beq.n 802f652 <dhcp_fine_tmr+0x92>
  42709. /* timer is active (non zero), and is about to trigger now */
  42710. if (netif->dhcp->request_timeout > 1) {
  42711. 802f5d0: 8b5a ldrh r2, [r3, #26]
  42712. 802f5d2: 2a01 cmp r2, #1
  42713. 802f5d4: d902 bls.n 802f5dc <dhcp_fine_tmr+0x1c>
  42714. netif->dhcp->request_timeout--;
  42715. 802f5d6: 3a01 subs r2, #1
  42716. 802f5d8: 835a strh r2, [r3, #26]
  42717. 802f5da: e03a b.n 802f652 <dhcp_fine_tmr+0x92>
  42718. }
  42719. else if (netif->dhcp->request_timeout == 1) {
  42720. 802f5dc: d139 bne.n 802f652 <dhcp_fine_tmr+0x92>
  42721. dhcp_timeout(struct netif *netif)
  42722. {
  42723. struct dhcp *dhcp = netif->dhcp;
  42724. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_timeout()\n"));
  42725. /* back-off period has passed, or server selection timed out */
  42726. if ((dhcp->state == DHCP_BACKING_OFF) || (dhcp->state == DHCP_SELECTING)) {
  42727. 802f5de: 7b1a ldrb r2, [r3, #12]
  42728. /* timer is active (non zero), and is about to trigger now */
  42729. if (netif->dhcp->request_timeout > 1) {
  42730. netif->dhcp->request_timeout--;
  42731. }
  42732. else if (netif->dhcp->request_timeout == 1) {
  42733. netif->dhcp->request_timeout--;
  42734. 802f5e0: 835d strh r5, [r3, #26]
  42735. dhcp_timeout(struct netif *netif)
  42736. {
  42737. struct dhcp *dhcp = netif->dhcp;
  42738. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_timeout()\n"));
  42739. /* back-off period has passed, or server selection timed out */
  42740. if ((dhcp->state == DHCP_BACKING_OFF) || (dhcp->state == DHCP_SELECTING)) {
  42741. 802f5e2: 2a0c cmp r2, #12
  42742. 802f5e4: d028 beq.n 802f638 <dhcp_fine_tmr+0x78>
  42743. 802f5e6: 2a06 cmp r2, #6
  42744. 802f5e8: d100 bne.n 802f5ec <dhcp_fine_tmr+0x2c>
  42745. 802f5ea: e025 b.n 802f638 <dhcp_fine_tmr+0x78>
  42746. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_timeout(): restarting discovery\n"));
  42747. dhcp_discover(netif);
  42748. /* receiving the requested lease timed out */
  42749. } else if (dhcp->state == DHCP_REQUESTING) {
  42750. 802f5ec: 2a01 cmp r2, #1
  42751. 802f5ee: d106 bne.n 802f5fe <dhcp_fine_tmr+0x3e>
  42752. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_timeout(): REQUESTING, DHCP request timed out\n"));
  42753. if (dhcp->tries <= 5) {
  42754. 802f5f0: 7b5b ldrb r3, [r3, #13]
  42755. 802f5f2: 2b05 cmp r3, #5
  42756. dhcp_select(netif);
  42757. 802f5f4: 4620 mov r0, r4
  42758. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_timeout(): restarting discovery\n"));
  42759. dhcp_discover(netif);
  42760. /* receiving the requested lease timed out */
  42761. } else if (dhcp->state == DHCP_REQUESTING) {
  42762. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_timeout(): REQUESTING, DHCP request timed out\n"));
  42763. if (dhcp->tries <= 5) {
  42764. 802f5f6: d81d bhi.n 802f634 <dhcp_fine_tmr+0x74>
  42765. dhcp_select(netif);
  42766. 802f5f8: f7ff fc14 bl 802ee24 <dhcp_select>
  42767. 802f5fc: e029 b.n 802f652 <dhcp_fine_tmr+0x92>
  42768. dhcp_release(netif);
  42769. dhcp_discover(netif);
  42770. }
  42771. #if DHCP_DOES_ARP_CHECK
  42772. /* received no ARP reply for the offered address (which is good) */
  42773. } else if (dhcp->state == DHCP_CHECKING) {
  42774. 802f5fe: 2a08 cmp r2, #8
  42775. 802f600: d109 bne.n 802f616 <dhcp_fine_tmr+0x56>
  42776. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_timeout(): CHECKING, ARP request timed out\n"));
  42777. if (dhcp->tries <= 1) {
  42778. 802f602: 7b5b ldrb r3, [r3, #13]
  42779. 802f604: 2b01 cmp r3, #1
  42780. dhcp_check(netif);
  42781. 802f606: 4620 mov r0, r4
  42782. }
  42783. #if DHCP_DOES_ARP_CHECK
  42784. /* received no ARP reply for the offered address (which is good) */
  42785. } else if (dhcp->state == DHCP_CHECKING) {
  42786. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_timeout(): CHECKING, ARP request timed out\n"));
  42787. if (dhcp->tries <= 1) {
  42788. 802f608: d802 bhi.n 802f610 <dhcp_fine_tmr+0x50>
  42789. dhcp_check(netif);
  42790. 802f60a: f7ff fc7d bl 802ef08 <dhcp_check>
  42791. 802f60e: e020 b.n 802f652 <dhcp_fine_tmr+0x92>
  42792. /* no ARP replies on the offered address,
  42793. looks like the IP address is indeed free */
  42794. } else {
  42795. /* bind the interface to the offered address */
  42796. dhcp_bind(netif);
  42797. 802f610: f7ff fc8d bl 802ef2e <dhcp_bind>
  42798. 802f614: e01d b.n 802f652 <dhcp_fine_tmr+0x92>
  42799. }
  42800. #endif /* DHCP_DOES_ARP_CHECK */
  42801. }
  42802. /* did not get response to renew request? */
  42803. else if (dhcp->state == DHCP_RENEWING) {
  42804. 802f616: 2a05 cmp r2, #5
  42805. 802f618: d103 bne.n 802f622 <dhcp_fine_tmr+0x62>
  42806. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_timeout(): RENEWING, DHCP request timed out\n"));
  42807. /* just retry renewal */
  42808. /* note that the rebind timer will eventually time-out if renew does not work */
  42809. dhcp_renew(netif);
  42810. 802f61a: 4620 mov r0, r4
  42811. 802f61c: f7ff ff0c bl 802f438 <dhcp_renew>
  42812. 802f620: e017 b.n 802f652 <dhcp_fine_tmr+0x92>
  42813. /* did not get response to rebind request? */
  42814. } else if (dhcp->state == DHCP_REBINDING) {
  42815. 802f622: 2a04 cmp r2, #4
  42816. 802f624: d10a bne.n 802f63c <dhcp_fine_tmr+0x7c>
  42817. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_timeout(): REBINDING, DHCP request timed out\n"));
  42818. if (dhcp->tries <= 8) {
  42819. 802f626: 7b5b ldrb r3, [r3, #13]
  42820. 802f628: 2b08 cmp r3, #8
  42821. dhcp_rebind(netif);
  42822. 802f62a: 4620 mov r0, r4
  42823. /* note that the rebind timer will eventually time-out if renew does not work */
  42824. dhcp_renew(netif);
  42825. /* did not get response to rebind request? */
  42826. } else if (dhcp->state == DHCP_REBINDING) {
  42827. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_timeout(): REBINDING, DHCP request timed out\n"));
  42828. if (dhcp->tries <= 8) {
  42829. 802f62c: d802 bhi.n 802f634 <dhcp_fine_tmr+0x74>
  42830. dhcp_rebind(netif);
  42831. 802f62e: f7ff fb67 bl 802ed00 <dhcp_rebind>
  42832. 802f632: e00e b.n 802f652 <dhcp_fine_tmr+0x92>
  42833. } else {
  42834. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_timeout(): RELEASING, DISCOVERING\n"));
  42835. dhcp_release(netif);
  42836. 802f634: f7ff ff72 bl 802f51c <dhcp_release>
  42837. dhcp_discover(netif);
  42838. 802f638: 4620 mov r0, r4
  42839. 802f63a: e008 b.n 802f64e <dhcp_fine_tmr+0x8e>
  42840. }
  42841. } else if (dhcp->state == DHCP_REBOOTING) {
  42842. 802f63c: 2a03 cmp r2, #3
  42843. 802f63e: d108 bne.n 802f652 <dhcp_fine_tmr+0x92>
  42844. if (dhcp->tries < REBOOT_TRIES) {
  42845. 802f640: 7b5b ldrb r3, [r3, #13]
  42846. 802f642: 2b01 cmp r3, #1
  42847. dhcp_reboot(netif);
  42848. 802f644: 4620 mov r0, r4
  42849. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_timeout(): RELEASING, DISCOVERING\n"));
  42850. dhcp_release(netif);
  42851. dhcp_discover(netif);
  42852. }
  42853. } else if (dhcp->state == DHCP_REBOOTING) {
  42854. if (dhcp->tries < REBOOT_TRIES) {
  42855. 802f646: d802 bhi.n 802f64e <dhcp_fine_tmr+0x8e>
  42856. dhcp_reboot(netif);
  42857. 802f648: f7ff fb9c bl 802ed84 <dhcp_reboot>
  42858. 802f64c: e001 b.n 802f652 <dhcp_fine_tmr+0x92>
  42859. } else {
  42860. dhcp_discover(netif);
  42861. 802f64e: f7ff fafb bl 802ec48 <dhcp_discover>
  42862. /* this client's request timeout triggered */
  42863. dhcp_timeout(netif);
  42864. }
  42865. }
  42866. /* proceed to next network interface */
  42867. netif = netif->next;
  42868. 802f652: 6824 ldr r4, [r4, #0]
  42869. void
  42870. dhcp_fine_tmr()
  42871. {
  42872. struct netif *netif = netif_list;
  42873. /* loop through netif's */
  42874. while (netif != NULL) {
  42875. 802f654: 2c00 cmp r4, #0
  42876. 802f656: d1b8 bne.n 802f5ca <dhcp_fine_tmr+0xa>
  42877. }
  42878. }
  42879. /* proceed to next network interface */
  42880. netif = netif->next;
  42881. }
  42882. }
  42883. 802f658: bd38 pop {r3, r4, r5, pc}
  42884. 802f65a: bf00 nop
  42885. 802f65c: 2000ff14 .word 0x2000ff14
  42886. 0802f660 <dhcp_stop>:
  42887. *
  42888. * @param netif The network interface to stop DHCP on
  42889. */
  42890. void
  42891. dhcp_stop(struct netif *netif)
  42892. {
  42893. 802f660: b510 push {r4, lr}
  42894. struct dhcp *dhcp;
  42895. LWIP_ERROR("dhcp_stop: netif != NULL", (netif != NULL), return;);
  42896. 802f662: b198 cbz r0, 802f68c <dhcp_stop+0x2c>
  42897. dhcp = netif->dhcp;
  42898. /* Remove the flag that says this netif is handled by DHCP. */
  42899. netif->flags &= ~NETIF_FLAG_DHCP;
  42900. 802f664: f890 302d ldrb.w r3, [r0, #45] ; 0x2d
  42901. void
  42902. dhcp_stop(struct netif *netif)
  42903. {
  42904. struct dhcp *dhcp;
  42905. LWIP_ERROR("dhcp_stop: netif != NULL", (netif != NULL), return;);
  42906. dhcp = netif->dhcp;
  42907. 802f668: 6a04 ldr r4, [r0, #32]
  42908. /* Remove the flag that says this netif is handled by DHCP. */
  42909. netif->flags &= ~NETIF_FLAG_DHCP;
  42910. 802f66a: f023 0308 bic.w r3, r3, #8
  42911. 802f66e: f880 302d strb.w r3, [r0, #45] ; 0x2d
  42912. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_stop()\n"));
  42913. /* netif is DHCP configured? */
  42914. if (dhcp != NULL) {
  42915. 802f672: b15c cbz r4, 802f68c <dhcp_stop+0x2c>
  42916. autoip_stop(netif);
  42917. dhcp->autoip_coop_state = DHCP_AUTOIP_COOP_STATE_OFF;
  42918. }
  42919. #endif /* LWIP_DHCP_AUTOIP_COOP */
  42920. if (dhcp->pcb != NULL) {
  42921. 802f674: 6860 ldr r0, [r4, #4]
  42922. 802f676: b118 cbz r0, 802f680 <dhcp_stop+0x20>
  42923. udp_remove(dhcp->pcb);
  42924. 802f678: f003 f852 bl 8032720 <udp_remove>
  42925. dhcp->pcb = NULL;
  42926. 802f67c: 2300 movs r3, #0
  42927. 802f67e: 6063 str r3, [r4, #4]
  42928. }
  42929. LWIP_ASSERT("reply wasn't freed", dhcp->msg_in == NULL);
  42930. dhcp_set_state(dhcp, DHCP_OFF);
  42931. 802f680: 4620 mov r0, r4
  42932. 802f682: 2100 movs r1, #0
  42933. }
  42934. }
  42935. 802f684: e8bd 4010 ldmia.w sp!, {r4, lr}
  42936. if (dhcp->pcb != NULL) {
  42937. udp_remove(dhcp->pcb);
  42938. dhcp->pcb = NULL;
  42939. }
  42940. LWIP_ASSERT("reply wasn't freed", dhcp->msg_in == NULL);
  42941. dhcp_set_state(dhcp, DHCP_OFF);
  42942. 802f688: f7ff b9ce b.w 802ea28 <dhcp_set_state>
  42943. 802f68c: bd10 pop {r4, pc}
  42944. 802f68e: 0000 movs r0, r0
  42945. 0802f690 <dhcp_start>:
  42946. * - ERR_OK - No error
  42947. * - ERR_MEM - Out of memory
  42948. */
  42949. err_t
  42950. dhcp_start(struct netif *netif)
  42951. {
  42952. 802f690: b538 push {r3, r4, r5, lr}
  42953. struct dhcp *dhcp;
  42954. err_t result = ERR_OK;
  42955. LWIP_ERROR("netif != NULL", (netif != NULL), return ERR_ARG;);
  42956. 802f692: 4604 mov r4, r0
  42957. 802f694: b908 cbnz r0, 802f69a <dhcp_start+0xa>
  42958. 802f696: 20f2 movs r0, #242 ; 0xf2
  42959. 802f698: e047 b.n 802f72a <dhcp_start+0x9a>
  42960. dhcp = netif->dhcp;
  42961. 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));
  42962. /* Remove the flag that says this netif is handled by DHCP,
  42963. it is set when we succeeded starting. */
  42964. netif->flags &= ~NETIF_FLAG_DHCP;
  42965. 802f69a: f890 302d ldrb.w r3, [r0, #45] ; 0x2d
  42966. {
  42967. struct dhcp *dhcp;
  42968. err_t result = ERR_OK;
  42969. LWIP_ERROR("netif != NULL", (netif != NULL), return ERR_ARG;);
  42970. dhcp = netif->dhcp;
  42971. 802f69e: 6a05 ldr r5, [r0, #32]
  42972. 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));
  42973. /* Remove the flag that says this netif is handled by DHCP,
  42974. it is set when we succeeded starting. */
  42975. netif->flags &= ~NETIF_FLAG_DHCP;
  42976. 802f6a0: f023 0208 bic.w r2, r3, #8
  42977. /* check hwtype of the netif */
  42978. if ((netif->flags & NETIF_FLAG_ETHARP) == 0) {
  42979. 802f6a4: f003 0320 and.w r3, r3, #32
  42980. 802f6a8: b2db uxtb r3, r3
  42981. LWIP_ERROR("netif != NULL", (netif != NULL), return ERR_ARG;);
  42982. dhcp = netif->dhcp;
  42983. 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));
  42984. /* Remove the flag that says this netif is handled by DHCP,
  42985. it is set when we succeeded starting. */
  42986. netif->flags &= ~NETIF_FLAG_DHCP;
  42987. 802f6aa: f880 202d strb.w r2, [r0, #45] ; 0x2d
  42988. /* check hwtype of the netif */
  42989. if ((netif->flags & NETIF_FLAG_ETHARP) == 0) {
  42990. 802f6ae: 2b00 cmp r3, #0
  42991. 802f6b0: d0f1 beq.n 802f696 <dhcp_start+0x6>
  42992. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_start(): No ETHARP netif\n"));
  42993. return ERR_ARG;
  42994. }
  42995. /* check MTU of the netif */
  42996. if (netif->mtu < DHCP_MAX_MSG_LEN_MIN_REQUIRED) {
  42997. 802f6b2: 8c83 ldrh r3, [r0, #36] ; 0x24
  42998. 802f6b4: f5b3 7f10 cmp.w r3, #576 ; 0x240
  42999. 802f6b8: d200 bcs.n 802f6bc <dhcp_start+0x2c>
  43000. 802f6ba: e02e b.n 802f71a <dhcp_start+0x8a>
  43001. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_start(): Cannot use this netif with DHCP: MTU is too small\n"));
  43002. return ERR_MEM;
  43003. }
  43004. /* no DHCP client attached yet? */
  43005. if (dhcp == NULL) {
  43006. 802f6bc: b935 cbnz r5, 802f6cc <dhcp_start+0x3c>
  43007. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_start(): starting new DHCP client\n"));
  43008. dhcp = (struct dhcp *)mem_malloc(sizeof(struct dhcp));
  43009. 802f6be: 203c movs r0, #60 ; 0x3c
  43010. 802f6c0: f000 f938 bl 802f934 <mem_malloc>
  43011. if (dhcp == NULL) {
  43012. 802f6c4: 4605 mov r5, r0
  43013. 802f6c6: b340 cbz r0, 802f71a <dhcp_start+0x8a>
  43014. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_start(): could not allocate dhcp\n"));
  43015. return ERR_MEM;
  43016. }
  43017. /* store this dhcp client in the netif */
  43018. netif->dhcp = dhcp;
  43019. 802f6c8: 6220 str r0, [r4, #32]
  43020. 802f6ca: e003 b.n 802f6d4 <dhcp_start+0x44>
  43021. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_start(): allocated dhcp"));
  43022. /* already has DHCP client attached */
  43023. } else {
  43024. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_start(): restarting DHCP configuration\n"));
  43025. if (dhcp->pcb != NULL) {
  43026. 802f6cc: 6868 ldr r0, [r5, #4]
  43027. 802f6ce: b108 cbz r0, 802f6d4 <dhcp_start+0x44>
  43028. udp_remove(dhcp->pcb);
  43029. 802f6d0: f003 f826 bl 8032720 <udp_remove>
  43030. LWIP_ASSERT("pbuf p_out wasn't freed", dhcp->p_out == NULL);
  43031. LWIP_ASSERT("reply wasn't freed", dhcp->msg_in == NULL );
  43032. }
  43033. /* clear data structure */
  43034. memset(dhcp, 0, sizeof(struct dhcp));
  43035. 802f6d4: 2100 movs r1, #0
  43036. 802f6d6: 223c movs r2, #60 ; 0x3c
  43037. 802f6d8: 4628 mov r0, r5
  43038. 802f6da: f7f2 fb9d bl 8021e18 <memset>
  43039. /* dhcp_set_state(&dhcp, DHCP_OFF); */
  43040. /* allocate UDP PCB */
  43041. dhcp->pcb = udp_new();
  43042. 802f6de: f003 f83b bl 8032758 <udp_new>
  43043. 802f6e2: 6068 str r0, [r5, #4]
  43044. if (dhcp->pcb == NULL) {
  43045. 802f6e4: b1c8 cbz r0, 802f71a <dhcp_start+0x8a>
  43046. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_start(): could not obtain pcb\n"));
  43047. return ERR_MEM;
  43048. }
  43049. ip_set_option(dhcp->pcb, SOF_BROADCAST);
  43050. 802f6e6: 7a03 ldrb r3, [r0, #8]
  43051. /* set up local and remote port for the pcb */
  43052. udp_bind(dhcp->pcb, IP_ADDR_ANY, DHCP_CLIENT_PORT);
  43053. 802f6e8: 4911 ldr r1, [pc, #68] ; (802f730 <dhcp_start+0xa0>)
  43054. dhcp->pcb = udp_new();
  43055. if (dhcp->pcb == NULL) {
  43056. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_start(): could not obtain pcb\n"));
  43057. return ERR_MEM;
  43058. }
  43059. ip_set_option(dhcp->pcb, SOF_BROADCAST);
  43060. 802f6ea: f043 0320 orr.w r3, r3, #32
  43061. 802f6ee: 7203 strb r3, [r0, #8]
  43062. /* set up local and remote port for the pcb */
  43063. udp_bind(dhcp->pcb, IP_ADDR_ANY, DHCP_CLIENT_PORT);
  43064. 802f6f0: 2244 movs r2, #68 ; 0x44
  43065. 802f6f2: 6868 ldr r0, [r5, #4]
  43066. 802f6f4: f002 ff18 bl 8032528 <udp_bind>
  43067. udp_connect(dhcp->pcb, IP_ADDR_ANY, DHCP_SERVER_PORT);
  43068. 802f6f8: 490d ldr r1, [pc, #52] ; (802f730 <dhcp_start+0xa0>)
  43069. 802f6fa: 6868 ldr r0, [r5, #4]
  43070. 802f6fc: 2243 movs r2, #67 ; 0x43
  43071. 802f6fe: f002 ffdd bl 80326bc <udp_connect>
  43072. /* set up the recv callback and argument */
  43073. udp_recv(dhcp->pcb, dhcp_recv, netif);
  43074. 802f702: 6868 ldr r0, [r5, #4]
  43075. 802f704: 490b ldr r1, [pc, #44] ; (802f734 <dhcp_start+0xa4>)
  43076. 802f706: 4622 mov r2, r4
  43077. 802f708: f003 f806 bl 8032718 <udp_recv>
  43078. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_start(): starting DHCP configuration\n"));
  43079. /* (re)start the DHCP negotiation */
  43080. result = dhcp_discover(netif);
  43081. 802f70c: 4620 mov r0, r4
  43082. 802f70e: f7ff fa9b bl 802ec48 <dhcp_discover>
  43083. if (result != ERR_OK) {
  43084. 802f712: b120 cbz r0, 802f71e <dhcp_start+0x8e>
  43085. /* free resources allocated above */
  43086. dhcp_stop(netif);
  43087. 802f714: 4620 mov r0, r4
  43088. 802f716: f7ff ffa3 bl 802f660 <dhcp_stop>
  43089. return ERR_MEM;
  43090. 802f71a: 20ff movs r0, #255 ; 0xff
  43091. 802f71c: e005 b.n 802f72a <dhcp_start+0x9a>
  43092. }
  43093. /* Set the flag that says this netif is handled by DHCP. */
  43094. netif->flags |= NETIF_FLAG_DHCP;
  43095. 802f71e: f894 302d ldrb.w r3, [r4, #45] ; 0x2d
  43096. 802f722: f043 0308 orr.w r3, r3, #8
  43097. 802f726: f884 302d strb.w r3, [r4, #45] ; 0x2d
  43098. return result;
  43099. }
  43100. 802f72a: b240 sxtb r0, r0
  43101. 802f72c: bd38 pop {r3, r4, r5, pc}
  43102. 802f72e: bf00 nop
  43103. 802f730: 08044744 .word 0x08044744
  43104. 802f734: 0802efed .word 0x0802efed
  43105. 0802f738 <lwip_init>:
  43106. /**
  43107. * Perform Sanity check of user-configurable values, and initialize all modules.
  43108. */
  43109. void
  43110. lwip_init(void)
  43111. {
  43112. 802f738: b508 push {r3, lr}
  43113. /* Modules initialization */
  43114. stats_init();
  43115. #if !NO_SYS
  43116. sys_init();
  43117. 802f73a: f007 ff2f bl 803759c <sys_init>
  43118. #endif /* !NO_SYS */
  43119. mem_init();
  43120. 802f73e: f000 f80f bl 802f760 <mem_init>
  43121. memp_init();
  43122. 802f742: f000 f95b bl 802f9fc <memp_init>
  43123. pbuf_init();
  43124. netif_init();
  43125. 802f746: f000 f9a9 bl 802fa9c <netif_init>
  43126. #endif /* LWIP_ARP */
  43127. #if LWIP_RAW
  43128. raw_init();
  43129. #endif /* LWIP_RAW */
  43130. #if LWIP_UDP
  43131. udp_init();
  43132. 802f74a: f002 fe27 bl 803239c <udp_init>
  43133. #endif /* LWIP_UDP */
  43134. #if LWIP_TCP
  43135. tcp_init();
  43136. 802f74e: f000 fc8b bl 8030068 <tcp_init>
  43137. #endif /* LWIP_TCP */
  43138. #if LWIP_SNMP
  43139. snmp_init();
  43140. 802f752: f005 fde1 bl 8035318 <snmp_init>
  43141. #endif /* LWIP_DNS */
  43142. #if LWIP_TIMERS
  43143. sys_timeouts_init();
  43144. #endif /* LWIP_TIMERS */
  43145. }
  43146. 802f756: e8bd 4008 ldmia.w sp!, {r3, lr}
  43147. #if LWIP_DNS
  43148. dns_init();
  43149. #endif /* LWIP_DNS */
  43150. #if LWIP_TIMERS
  43151. sys_timeouts_init();
  43152. 802f75a: f002 bd49 b.w 80321f0 <sys_timeouts_init>
  43153. 802f75e: 0000 movs r0, r0
  43154. 0802f760 <mem_init>:
  43155. LWIP_ASSERT("Sanity check alignment",
  43156. (SIZEOF_STRUCT_MEM & (MEM_ALIGNMENT-1)) == 0);
  43157. /* align the heap */
  43158. ram = (u8_t *)LWIP_MEM_ALIGN(LWIP_RAM_HEAP_POINTER);
  43159. 802f760: 4b0b ldr r3, [pc, #44] ; (802f790 <mem_init+0x30>)
  43160. 802f762: 4a0c ldr r2, [pc, #48] ; (802f794 <mem_init+0x34>)
  43161. mem = (struct mem *)(void *)ram;
  43162. mem->next = MEM_SIZE_ALIGNED;
  43163. mem->prev = 0;
  43164. mem->used = 0;
  43165. /* initialize the end of the heap */
  43166. ram_end = (struct mem *)(void *)&ram[MEM_SIZE_ALIGNED];
  43167. 802f764: 480c ldr r0, [pc, #48] ; (802f798 <mem_init+0x38>)
  43168. LWIP_ASSERT("Sanity check alignment",
  43169. (SIZEOF_STRUCT_MEM & (MEM_ALIGNMENT-1)) == 0);
  43170. /* align the heap */
  43171. ram = (u8_t *)LWIP_MEM_ALIGN(LWIP_RAM_HEAP_POINTER);
  43172. 802f766: f023 0303 bic.w r3, r3, #3
  43173. 802f76a: 6013 str r3, [r2, #0]
  43174. /* initialize the start of the heap */
  43175. mem = (struct mem *)(void *)ram;
  43176. mem->next = MEM_SIZE_ALIGNED;
  43177. 802f76c: f44f 51a0 mov.w r1, #5120 ; 0x1400
  43178. mem->prev = 0;
  43179. 802f770: 2200 movs r2, #0
  43180. 802f772: 805a strh r2, [r3, #2]
  43181. mem->used = 0;
  43182. 802f774: 711a strb r2, [r3, #4]
  43183. /* initialize the end of the heap */
  43184. ram_end = (struct mem *)(void *)&ram[MEM_SIZE_ALIGNED];
  43185. 802f776: 185a adds r2, r3, r1
  43186. 802f778: 6002 str r2, [r0, #0]
  43187. ram_end->used = 1;
  43188. 802f77a: 2001 movs r0, #1
  43189. 802f77c: 7110 strb r0, [r2, #4]
  43190. ram_end->next = MEM_SIZE_ALIGNED;
  43191. ram_end->prev = MEM_SIZE_ALIGNED;
  43192. 802f77e: 8051 strh r1, [r2, #2]
  43193. /* align the heap */
  43194. ram = (u8_t *)LWIP_MEM_ALIGN(LWIP_RAM_HEAP_POINTER);
  43195. /* initialize the start of the heap */
  43196. mem = (struct mem *)(void *)ram;
  43197. mem->next = MEM_SIZE_ALIGNED;
  43198. 802f780: 8019 strh r1, [r3, #0]
  43199. /* initialize the lowest-free pointer to the start of the heap */
  43200. lfree = (struct mem *)(void *)ram;
  43201. MEM_STATS_AVAIL(avail, MEM_SIZE_ALIGNED);
  43202. if(sys_mutex_new(&mem_mutex) != ERR_OK) {
  43203. 802f782: 4806 ldr r0, [pc, #24] ; (802f79c <mem_init+0x3c>)
  43204. mem->prev = 0;
  43205. mem->used = 0;
  43206. /* initialize the end of the heap */
  43207. ram_end = (struct mem *)(void *)&ram[MEM_SIZE_ALIGNED];
  43208. ram_end->used = 1;
  43209. ram_end->next = MEM_SIZE_ALIGNED;
  43210. 802f784: 8011 strh r1, [r2, #0]
  43211. ram_end->prev = MEM_SIZE_ALIGNED;
  43212. /* initialize the lowest-free pointer to the start of the heap */
  43213. lfree = (struct mem *)(void *)ram;
  43214. 802f786: 4a06 ldr r2, [pc, #24] ; (802f7a0 <mem_init+0x40>)
  43215. 802f788: 6013 str r3, [r2, #0]
  43216. MEM_STATS_AVAIL(avail, MEM_SIZE_ALIGNED);
  43217. if(sys_mutex_new(&mem_mutex) != ERR_OK) {
  43218. 802f78a: f007 bee9 b.w 8037560 <sys_mutex_new>
  43219. 802f78e: bf00 nop
  43220. 802f790: 2000eb03 .word 0x2000eb03
  43221. 802f794: 20000da4 .word 0x20000da4
  43222. 802f798: 20000d9c .word 0x20000d9c
  43223. 802f79c: 20000da0 .word 0x20000da0
  43224. 802f7a0: 20000d98 .word 0x20000d98
  43225. 0802f7a4 <mem_free>:
  43226. * @param rmem is the data portion of a struct mem as returned by a previous
  43227. * call to mem_malloc()
  43228. */
  43229. void
  43230. mem_free(void *rmem)
  43231. {
  43232. 802f7a4: b570 push {r4, r5, r6, lr}
  43233. struct mem *mem;
  43234. LWIP_MEM_FREE_DECL_PROTECT();
  43235. if (rmem == NULL) {
  43236. 802f7a6: 4604 mov r4, r0
  43237. 802f7a8: 2800 cmp r0, #0
  43238. 802f7aa: d04c beq.n 802f846 <mem_free+0xa2>
  43239. LWIP_ASSERT("mem_free: sanity check alignment", (((mem_ptr_t)rmem) & (MEM_ALIGNMENT-1)) == 0);
  43240. LWIP_ASSERT("mem_free: legal memory", (u8_t *)rmem >= (u8_t *)ram &&
  43241. (u8_t *)rmem < (u8_t *)ram_end);
  43242. if ((u8_t *)rmem < (u8_t *)ram || (u8_t *)rmem >= (u8_t *)ram_end) {
  43243. 802f7ac: 4b26 ldr r3, [pc, #152] ; (802f848 <mem_free+0xa4>)
  43244. 802f7ae: 681b ldr r3, [r3, #0]
  43245. 802f7b0: 4298 cmp r0, r3
  43246. 802f7b2: d303 bcc.n 802f7bc <mem_free+0x18>
  43247. 802f7b4: 4b25 ldr r3, [pc, #148] ; (802f84c <mem_free+0xa8>)
  43248. 802f7b6: 681b ldr r3, [r3, #0]
  43249. 802f7b8: 4298 cmp r0, r3
  43250. 802f7ba: d305 bcc.n 802f7c8 <mem_free+0x24>
  43251. SYS_ARCH_DECL_PROTECT(lev);
  43252. LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SEVERE, ("mem_free: illegal memory\n"));
  43253. /* protect mem stats from concurrent access */
  43254. SYS_ARCH_PROTECT(lev);
  43255. 802f7bc: f007 ff08 bl 80375d0 <sys_arch_protect>
  43256. plug_holes(mem);
  43257. #if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT
  43258. mem_free_count = 1;
  43259. #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
  43260. LWIP_MEM_FREE_UNPROTECT();
  43261. }
  43262. 802f7c0: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
  43263. SYS_ARCH_DECL_PROTECT(lev);
  43264. LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SEVERE, ("mem_free: illegal memory\n"));
  43265. /* protect mem stats from concurrent access */
  43266. SYS_ARCH_PROTECT(lev);
  43267. MEM_STATS_INC(illegal);
  43268. SYS_ARCH_UNPROTECT(lev);
  43269. 802f7c4: f007 bf0e b.w 80375e4 <sys_arch_unprotect>
  43270. return;
  43271. }
  43272. /* protect the heap from concurrent access */
  43273. LWIP_MEM_FREE_PROTECT();
  43274. 802f7c8: 4821 ldr r0, [pc, #132] ; (802f850 <mem_free+0xac>)
  43275. 802f7ca: f007 fed5 bl 8037578 <sys_mutex_lock>
  43276. /* Get the corresponding struct mem ... */
  43277. mem = (struct mem *)(void *)((u8_t *)rmem - SIZEOF_STRUCT_MEM);
  43278. /* ... which has to be in a used state ... */
  43279. LWIP_ASSERT("mem_free: mem->used", mem->used);
  43280. /* ... and is now unused. */
  43281. mem->used = 0;
  43282. 802f7ce: 2300 movs r3, #0
  43283. 802f7d0: f804 3c04 strb.w r3, [r4, #-4]
  43284. if (mem < lfree) {
  43285. 802f7d4: 4b1f ldr r3, [pc, #124] ; (802f854 <mem_free+0xb0>)
  43286. LWIP_ASSERT("plug_holes: mem->used == 0", mem->used == 0);
  43287. /* plug hole forward */
  43288. LWIP_ASSERT("plug_holes: mem->next <= MEM_SIZE_ALIGNED", mem->next <= MEM_SIZE_ALIGNED);
  43289. nmem = (struct mem *)(void *)&ram[mem->next];
  43290. 802f7d6: f834 0c08 ldrh.w r0, [r4, #-8]
  43291. /* ... which has to be in a used state ... */
  43292. LWIP_ASSERT("mem_free: mem->used", mem->used);
  43293. /* ... and is now unused. */
  43294. mem->used = 0;
  43295. if (mem < lfree) {
  43296. 802f7da: 6819 ldr r1, [r3, #0]
  43297. return;
  43298. }
  43299. /* protect the heap from concurrent access */
  43300. LWIP_MEM_FREE_PROTECT();
  43301. /* Get the corresponding struct mem ... */
  43302. mem = (struct mem *)(void *)((u8_t *)rmem - SIZEOF_STRUCT_MEM);
  43303. 802f7dc: f1a4 0208 sub.w r2, r4, #8
  43304. /* ... which has to be in a used state ... */
  43305. LWIP_ASSERT("mem_free: mem->used", mem->used);
  43306. /* ... and is now unused. */
  43307. mem->used = 0;
  43308. if (mem < lfree) {
  43309. 802f7e0: 428a cmp r2, r1
  43310. /* the newly freed struct is now the lowest */
  43311. lfree = mem;
  43312. 802f7e2: bf38 it cc
  43313. 802f7e4: 601a strcc r2, [r3, #0]
  43314. LWIP_ASSERT("plug_holes: mem->used == 0", mem->used == 0);
  43315. /* plug hole forward */
  43316. LWIP_ASSERT("plug_holes: mem->next <= MEM_SIZE_ALIGNED", mem->next <= MEM_SIZE_ALIGNED);
  43317. nmem = (struct mem *)(void *)&ram[mem->next];
  43318. 802f7e6: 4b18 ldr r3, [pc, #96] ; (802f848 <mem_free+0xa4>)
  43319. 802f7e8: 681b ldr r3, [r3, #0]
  43320. 802f7ea: 1819 adds r1, r3, r0
  43321. if (mem != nmem && nmem->used == 0 && (u8_t *)nmem != (u8_t *)ram_end) {
  43322. 802f7ec: 428a cmp r2, r1
  43323. 802f7ee: d011 beq.n 802f814 <mem_free+0x70>
  43324. 802f7f0: 790d ldrb r5, [r1, #4]
  43325. 802f7f2: b97d cbnz r5, 802f814 <mem_free+0x70>
  43326. 802f7f4: 4d15 ldr r5, [pc, #84] ; (802f84c <mem_free+0xa8>)
  43327. 802f7f6: 682d ldr r5, [r5, #0]
  43328. 802f7f8: 42a9 cmp r1, r5
  43329. 802f7fa: d00b beq.n 802f814 <mem_free+0x70>
  43330. /* if mem->next is unused and not end of ram, combine mem and mem->next */
  43331. if (lfree == nmem) {
  43332. 802f7fc: 4d15 ldr r5, [pc, #84] ; (802f854 <mem_free+0xb0>)
  43333. 802f7fe: 682e ldr r6, [r5, #0]
  43334. 802f800: 428e cmp r6, r1
  43335. lfree = mem;
  43336. }
  43337. mem->next = nmem->next;
  43338. 802f802: 5a19 ldrh r1, [r3, r0]
  43339. nmem = (struct mem *)(void *)&ram[mem->next];
  43340. if (mem != nmem && nmem->used == 0 && (u8_t *)nmem != (u8_t *)ram_end) {
  43341. /* if mem->next is unused and not end of ram, combine mem and mem->next */
  43342. if (lfree == nmem) {
  43343. lfree = mem;
  43344. 802f804: bf08 it eq
  43345. 802f806: 602a streq r2, [r5, #0]
  43346. }
  43347. mem->next = nmem->next;
  43348. 802f808: f824 1c08 strh.w r1, [r4, #-8]
  43349. ((struct mem *)(void *)&ram[nmem->next])->prev = (mem_size_t)((u8_t *)mem - ram);
  43350. 802f80c: 5a19 ldrh r1, [r3, r0]
  43351. 802f80e: 1859 adds r1, r3, r1
  43352. 802f810: 1ad0 subs r0, r2, r3
  43353. 802f812: 8048 strh r0, [r1, #2]
  43354. }
  43355. /* plug hole backward */
  43356. pmem = (struct mem *)(void *)&ram[mem->prev];
  43357. 802f814: f834 0c06 ldrh.w r0, [r4, #-6]
  43358. 802f818: 1819 adds r1, r3, r0
  43359. if (pmem != mem && pmem->used == 0) {
  43360. 802f81a: 4291 cmp r1, r2
  43361. 802f81c: d00e beq.n 802f83c <mem_free+0x98>
  43362. 802f81e: 790d ldrb r5, [r1, #4]
  43363. 802f820: b965 cbnz r5, 802f83c <mem_free+0x98>
  43364. /* if mem->prev is unused, combine mem and mem->prev */
  43365. if (lfree == mem) {
  43366. 802f822: 4d0c ldr r5, [pc, #48] ; (802f854 <mem_free+0xb0>)
  43367. 802f824: 682e ldr r6, [r5, #0]
  43368. 802f826: 4296 cmp r6, r2
  43369. lfree = pmem;
  43370. }
  43371. pmem->next = mem->next;
  43372. 802f828: f834 2c08 ldrh.w r2, [r4, #-8]
  43373. /* plug hole backward */
  43374. pmem = (struct mem *)(void *)&ram[mem->prev];
  43375. if (pmem != mem && pmem->used == 0) {
  43376. /* if mem->prev is unused, combine mem and mem->prev */
  43377. if (lfree == mem) {
  43378. lfree = pmem;
  43379. 802f82c: bf08 it eq
  43380. 802f82e: 6029 streq r1, [r5, #0]
  43381. }
  43382. pmem->next = mem->next;
  43383. 802f830: 521a strh r2, [r3, r0]
  43384. ((struct mem *)(void *)&ram[mem->next])->prev = (mem_size_t)((u8_t *)pmem - ram);
  43385. 802f832: f834 2c08 ldrh.w r2, [r4, #-8]
  43386. 802f836: 189a adds r2, r3, r2
  43387. 802f838: 1acb subs r3, r1, r3
  43388. 802f83a: 8053 strh r3, [r2, #2]
  43389. /* finally, see if prev or next are free also */
  43390. plug_holes(mem);
  43391. #if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT
  43392. mem_free_count = 1;
  43393. #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
  43394. LWIP_MEM_FREE_UNPROTECT();
  43395. 802f83c: 4804 ldr r0, [pc, #16] ; (802f850 <mem_free+0xac>)
  43396. }
  43397. 802f83e: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
  43398. /* finally, see if prev or next are free also */
  43399. plug_holes(mem);
  43400. #if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT
  43401. mem_free_count = 1;
  43402. #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
  43403. LWIP_MEM_FREE_UNPROTECT();
  43404. 802f842: f007 bea5 b.w 8037590 <sys_mutex_unlock>
  43405. 802f846: bd70 pop {r4, r5, r6, pc}
  43406. 802f848: 20000da4 .word 0x20000da4
  43407. 802f84c: 20000d9c .word 0x20000d9c
  43408. 802f850: 20000da0 .word 0x20000da0
  43409. 802f854: 20000d98 .word 0x20000d98
  43410. 0802f858 <mem_trim>:
  43411. * or NULL if newsize is > old size, in which case rmem is NOT touched
  43412. * or freed!
  43413. */
  43414. void *
  43415. mem_trim(void *rmem, mem_size_t newsize)
  43416. {
  43417. 802f858: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  43418. /* use the FREE_PROTECT here: it protects with sem OR SYS_ARCH_PROTECT */
  43419. LWIP_MEM_FREE_DECL_PROTECT();
  43420. /* Expand the size of the allocated memory region so that we can
  43421. adjust for alignment. */
  43422. newsize = LWIP_MEM_ALIGN_SIZE(newsize);
  43423. 802f85c: 3103 adds r1, #3
  43424. 802f85e: f64f 75fc movw r5, #65532 ; 0xfffc
  43425. 802f862: 400d ands r5, r1
  43426. if(newsize < MIN_SIZE_ALIGNED) {
  43427. 802f864: 2d0b cmp r5, #11
  43428. * or NULL if newsize is > old size, in which case rmem is NOT touched
  43429. * or freed!
  43430. */
  43431. void *
  43432. mem_trim(void *rmem, mem_size_t newsize)
  43433. {
  43434. 802f866: 4604 mov r4, r0
  43435. /* Expand the size of the allocated memory region so that we can
  43436. adjust for alignment. */
  43437. newsize = LWIP_MEM_ALIGN_SIZE(newsize);
  43438. if(newsize < MIN_SIZE_ALIGNED) {
  43439. 802f868: d903 bls.n 802f872 <mem_trim+0x1a>
  43440. /* every data block must be at least MIN_SIZE_ALIGNED long */
  43441. newsize = MIN_SIZE_ALIGNED;
  43442. }
  43443. if (newsize > MEM_SIZE_ALIGNED) {
  43444. 802f86a: f5b5 5fa0 cmp.w r5, #5120 ; 0x1400
  43445. 802f86e: d901 bls.n 802f874 <mem_trim+0x1c>
  43446. 802f870: e053 b.n 802f91a <mem_trim+0xc2>
  43447. adjust for alignment. */
  43448. newsize = LWIP_MEM_ALIGN_SIZE(newsize);
  43449. if(newsize < MIN_SIZE_ALIGNED) {
  43450. /* every data block must be at least MIN_SIZE_ALIGNED long */
  43451. newsize = MIN_SIZE_ALIGNED;
  43452. 802f872: 250c movs r5, #12
  43453. }
  43454. LWIP_ASSERT("mem_trim: legal memory", (u8_t *)rmem >= (u8_t *)ram &&
  43455. (u8_t *)rmem < (u8_t *)ram_end);
  43456. if ((u8_t *)rmem < (u8_t *)ram || (u8_t *)rmem >= (u8_t *)ram_end) {
  43457. 802f874: f8df 80b8 ldr.w r8, [pc, #184] ; 802f930 <mem_trim+0xd8>
  43458. 802f878: f8d8 3000 ldr.w r3, [r8]
  43459. 802f87c: 429c cmp r4, r3
  43460. 802f87e: d303 bcc.n 802f888 <mem_trim+0x30>
  43461. 802f880: 4a28 ldr r2, [pc, #160] ; (802f924 <mem_trim+0xcc>)
  43462. 802f882: 6812 ldr r2, [r2, #0]
  43463. 802f884: 4294 cmp r4, r2
  43464. 802f886: d304 bcc.n 802f892 <mem_trim+0x3a>
  43465. SYS_ARCH_DECL_PROTECT(lev);
  43466. LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SEVERE, ("mem_trim: illegal memory\n"));
  43467. /* protect mem stats from concurrent access */
  43468. SYS_ARCH_PROTECT(lev);
  43469. 802f888: f007 fea2 bl 80375d0 <sys_arch_protect>
  43470. MEM_STATS_INC(illegal);
  43471. SYS_ARCH_UNPROTECT(lev);
  43472. 802f88c: f007 feaa bl 80375e4 <sys_arch_unprotect>
  43473. return rmem;
  43474. 802f890: e044 b.n 802f91c <mem_trim+0xc4>
  43475. }
  43476. /* Get the corresponding struct mem ... */
  43477. mem = (struct mem *)(void *)((u8_t *)rmem - SIZEOF_STRUCT_MEM);
  43478. 802f892: f1a4 0608 sub.w r6, r4, #8
  43479. /* ... and its offset pointer */
  43480. ptr = (mem_size_t)((u8_t *)mem - ram);
  43481. size = mem->next - ptr - SIZEOF_STRUCT_MEM;
  43482. 802f896: f834 7c08 ldrh.w r7, [r4, #-8]
  43483. return rmem;
  43484. }
  43485. /* Get the corresponding struct mem ... */
  43486. mem = (struct mem *)(void *)((u8_t *)rmem - SIZEOF_STRUCT_MEM);
  43487. /* ... and its offset pointer */
  43488. ptr = (mem_size_t)((u8_t *)mem - ram);
  43489. 802f89a: 1af6 subs r6, r6, r3
  43490. size = mem->next - ptr - SIZEOF_STRUCT_MEM;
  43491. 802f89c: 3f08 subs r7, #8
  43492. return rmem;
  43493. }
  43494. /* Get the corresponding struct mem ... */
  43495. mem = (struct mem *)(void *)((u8_t *)rmem - SIZEOF_STRUCT_MEM);
  43496. /* ... and its offset pointer */
  43497. ptr = (mem_size_t)((u8_t *)mem - ram);
  43498. 802f89e: b2b6 uxth r6, r6
  43499. size = mem->next - ptr - SIZEOF_STRUCT_MEM;
  43500. 802f8a0: 1bbf subs r7, r7, r6
  43501. 802f8a2: b2bf uxth r7, r7
  43502. LWIP_ASSERT("mem_trim can only shrink memory", newsize <= size);
  43503. if (newsize > size) {
  43504. 802f8a4: 42bd cmp r5, r7
  43505. 802f8a6: d838 bhi.n 802f91a <mem_trim+0xc2>
  43506. /* not supported */
  43507. return NULL;
  43508. }
  43509. if (newsize == size) {
  43510. 802f8a8: d038 beq.n 802f91c <mem_trim+0xc4>
  43511. /* No change in size, simply return */
  43512. return rmem;
  43513. }
  43514. /* protect the heap from concurrent access */
  43515. LWIP_MEM_FREE_PROTECT();
  43516. 802f8aa: 481f ldr r0, [pc, #124] ; (802f928 <mem_trim+0xd0>)
  43517. 802f8ac: f007 fe64 bl 8037578 <sys_mutex_lock>
  43518. mem2 = (struct mem *)(void *)&ram[mem->next];
  43519. 802f8b0: f8d8 3000 ldr.w r3, [r8]
  43520. 802f8b4: f834 1c08 ldrh.w r1, [r4, #-8]
  43521. 802f8b8: 185a adds r2, r3, r1
  43522. if(mem2->used == 0) {
  43523. 802f8ba: 7910 ldrb r0, [r2, #4]
  43524. 802f8bc: b978 cbnz r0, 802f8de <mem_trim+0x86>
  43525. /* The next struct is unused, we can simply move it at little */
  43526. mem_size_t next;
  43527. /* remember the old next pointer */
  43528. next = mem2->next;
  43529. 802f8be: 5a5f ldrh r7, [r3, r1]
  43530. /* create new struct mem which is moved directly after the shrinked mem */
  43531. ptr2 = ptr + SIZEOF_STRUCT_MEM + newsize;
  43532. 802f8c0: f106 0108 add.w r1, r6, #8
  43533. 802f8c4: 186d adds r5, r5, r1
  43534. if (lfree == mem2) {
  43535. 802f8c6: 4919 ldr r1, [pc, #100] ; (802f92c <mem_trim+0xd4>)
  43536. 802f8c8: 6808 ldr r0, [r1, #0]
  43537. /* The next struct is unused, we can simply move it at little */
  43538. mem_size_t next;
  43539. /* remember the old next pointer */
  43540. next = mem2->next;
  43541. /* create new struct mem which is moved directly after the shrinked mem */
  43542. ptr2 = ptr + SIZEOF_STRUCT_MEM + newsize;
  43543. 802f8ca: b2ad uxth r5, r5
  43544. if (lfree == mem2) {
  43545. 802f8cc: 4290 cmp r0, r2
  43546. 802f8ce: eb03 0205 add.w r2, r3, r5
  43547. lfree = (struct mem *)(void *)&ram[ptr2];
  43548. 802f8d2: bf08 it eq
  43549. 802f8d4: 600a streq r2, [r1, #0]
  43550. }
  43551. mem2 = (struct mem *)(void *)&ram[ptr2];
  43552. mem2->used = 0;
  43553. 802f8d6: 2100 movs r1, #0
  43554. 802f8d8: 7111 strb r1, [r2, #4]
  43555. /* restore the next pointer */
  43556. mem2->next = next;
  43557. 802f8da: 535f strh r7, [r3, r5]
  43558. 802f8dc: e010 b.n 802f900 <mem_trim+0xa8>
  43559. if (mem2->next != MEM_SIZE_ALIGNED) {
  43560. ((struct mem *)(void *)&ram[mem2->next])->prev = ptr2;
  43561. }
  43562. MEM_STATS_DEC_USED(used, (size - newsize));
  43563. /* no need to plug holes, we've already done that */
  43564. } else if (newsize + SIZEOF_STRUCT_MEM + MIN_SIZE_ALIGNED <= size) {
  43565. 802f8de: f105 0214 add.w r2, r5, #20
  43566. 802f8e2: 42ba cmp r2, r7
  43567. 802f8e4: d815 bhi.n 802f912 <mem_trim+0xba>
  43568. * @todo we could leave out MIN_SIZE_ALIGNED. We would create an empty
  43569. * region that couldn't hold data, but when mem->next gets freed,
  43570. * the 2 regions would be combined, resulting in more free memory */
  43571. ptr2 = ptr + SIZEOF_STRUCT_MEM + newsize;
  43572. mem2 = (struct mem *)(void *)&ram[ptr2];
  43573. if (mem2 < lfree) {
  43574. 802f8e6: 4811 ldr r0, [pc, #68] ; (802f92c <mem_trim+0xd4>)
  43575. * Old size ('size') must be big enough to contain at least 'newsize' plus a struct mem
  43576. * ('SIZEOF_STRUCT_MEM') with some data ('MIN_SIZE_ALIGNED').
  43577. * @todo we could leave out MIN_SIZE_ALIGNED. We would create an empty
  43578. * region that couldn't hold data, but when mem->next gets freed,
  43579. * the 2 regions would be combined, resulting in more free memory */
  43580. ptr2 = ptr + SIZEOF_STRUCT_MEM + newsize;
  43581. 802f8e8: f106 0208 add.w r2, r6, #8
  43582. 802f8ec: 18ad adds r5, r5, r2
  43583. mem2 = (struct mem *)(void *)&ram[ptr2];
  43584. if (mem2 < lfree) {
  43585. 802f8ee: 6807 ldr r7, [r0, #0]
  43586. * Old size ('size') must be big enough to contain at least 'newsize' plus a struct mem
  43587. * ('SIZEOF_STRUCT_MEM') with some data ('MIN_SIZE_ALIGNED').
  43588. * @todo we could leave out MIN_SIZE_ALIGNED. We would create an empty
  43589. * region that couldn't hold data, but when mem->next gets freed,
  43590. * the 2 regions would be combined, resulting in more free memory */
  43591. ptr2 = ptr + SIZEOF_STRUCT_MEM + newsize;
  43592. 802f8f0: b2ad uxth r5, r5
  43593. mem2 = (struct mem *)(void *)&ram[ptr2];
  43594. 802f8f2: 195a adds r2, r3, r5
  43595. if (mem2 < lfree) {
  43596. 802f8f4: 42ba cmp r2, r7
  43597. lfree = mem2;
  43598. 802f8f6: bf38 it cc
  43599. 802f8f8: 6002 strcc r2, [r0, #0]
  43600. }
  43601. mem2->used = 0;
  43602. mem2->next = mem->next;
  43603. 802f8fa: 5359 strh r1, [r3, r5]
  43604. ptr2 = ptr + SIZEOF_STRUCT_MEM + newsize;
  43605. mem2 = (struct mem *)(void *)&ram[ptr2];
  43606. if (mem2 < lfree) {
  43607. lfree = mem2;
  43608. }
  43609. mem2->used = 0;
  43610. 802f8fc: 2000 movs r0, #0
  43611. 802f8fe: 7110 strb r0, [r2, #4]
  43612. mem2->next = mem->next;
  43613. mem2->prev = ptr;
  43614. 802f900: 8056 strh r6, [r2, #2]
  43615. mem->next = ptr2;
  43616. 802f902: f824 5c08 strh.w r5, [r4, #-8]
  43617. if (mem2->next != MEM_SIZE_ALIGNED) {
  43618. 802f906: 5b5a ldrh r2, [r3, r5]
  43619. 802f908: f5b2 5fa0 cmp.w r2, #5120 ; 0x1400
  43620. ((struct mem *)(void *)&ram[mem2->next])->prev = ptr2;
  43621. 802f90c: bf1c itt ne
  43622. 802f90e: 189b addne r3, r3, r2
  43623. 802f910: 805d strhne r5, [r3, #2]
  43624. -> the remaining space stays unused since it is too small
  43625. } */
  43626. #if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT
  43627. mem_free_count = 1;
  43628. #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
  43629. LWIP_MEM_FREE_UNPROTECT();
  43630. 802f912: 4805 ldr r0, [pc, #20] ; (802f928 <mem_trim+0xd0>)
  43631. 802f914: f007 fe3c bl 8037590 <sys_mutex_unlock>
  43632. return rmem;
  43633. 802f918: e000 b.n 802f91c <mem_trim+0xc4>
  43634. /* every data block must be at least MIN_SIZE_ALIGNED long */
  43635. newsize = MIN_SIZE_ALIGNED;
  43636. }
  43637. if (newsize > MEM_SIZE_ALIGNED) {
  43638. return NULL;
  43639. 802f91a: 2400 movs r4, #0
  43640. #if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT
  43641. mem_free_count = 1;
  43642. #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
  43643. LWIP_MEM_FREE_UNPROTECT();
  43644. return rmem;
  43645. }
  43646. 802f91c: 4620 mov r0, r4
  43647. 802f91e: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  43648. 802f922: bf00 nop
  43649. 802f924: 20000d9c .word 0x20000d9c
  43650. 802f928: 20000da0 .word 0x20000da0
  43651. 802f92c: 20000d98 .word 0x20000d98
  43652. 802f930: 20000da4 .word 0x20000da4
  43653. 0802f934 <mem_malloc>:
  43654. *
  43655. * Note that the returned value will always be aligned (as defined by MEM_ALIGNMENT).
  43656. */
  43657. void *
  43658. mem_malloc(mem_size_t size)
  43659. {
  43660. 802f934: b5f8 push {r3, r4, r5, r6, r7, lr}
  43661. #if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT
  43662. u8_t local_mem_free_count = 0;
  43663. #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
  43664. LWIP_MEM_ALLOC_DECL_PROTECT();
  43665. if (size == 0) {
  43666. 802f936: 2800 cmp r0, #0
  43667. 802f938: d056 beq.n 802f9e8 <mem_malloc+0xb4>
  43668. return NULL;
  43669. }
  43670. /* Expand the size of the allocated memory region so that we can
  43671. adjust for alignment. */
  43672. size = LWIP_MEM_ALIGN_SIZE(size);
  43673. 802f93a: 3003 adds r0, #3
  43674. 802f93c: f64f 74fc movw r4, #65532 ; 0xfffc
  43675. 802f940: 4004 ands r4, r0
  43676. if(size < MIN_SIZE_ALIGNED) {
  43677. 802f942: 2c0b cmp r4, #11
  43678. 802f944: d903 bls.n 802f94e <mem_malloc+0x1a>
  43679. /* every data block must be at least MIN_SIZE_ALIGNED long */
  43680. size = MIN_SIZE_ALIGNED;
  43681. }
  43682. if (size > MEM_SIZE_ALIGNED) {
  43683. 802f946: f5b4 5fa0 cmp.w r4, #5120 ; 0x1400
  43684. 802f94a: d901 bls.n 802f950 <mem_malloc+0x1c>
  43685. 802f94c: e04b b.n 802f9e6 <mem_malloc+0xb2>
  43686. adjust for alignment. */
  43687. size = LWIP_MEM_ALIGN_SIZE(size);
  43688. if(size < MIN_SIZE_ALIGNED) {
  43689. /* every data block must be at least MIN_SIZE_ALIGNED long */
  43690. size = MIN_SIZE_ALIGNED;
  43691. 802f94e: 240c movs r4, #12
  43692. if (size > MEM_SIZE_ALIGNED) {
  43693. return NULL;
  43694. }
  43695. /* protect the heap from concurrent access */
  43696. sys_mutex_lock(&mem_mutex);
  43697. 802f950: 4826 ldr r0, [pc, #152] ; (802f9ec <mem_malloc+0xb8>)
  43698. 802f952: f007 fe11 bl 8037578 <sys_mutex_lock>
  43699. #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
  43700. /* Scan through the heap searching for a free block that is big enough,
  43701. * beginning with the lowest free block.
  43702. */
  43703. for (ptr = (mem_size_t)((u8_t *)lfree - ram); ptr < MEM_SIZE_ALIGNED - size;
  43704. 802f956: 4b26 ldr r3, [pc, #152] ; (802f9f0 <mem_malloc+0xbc>)
  43705. 802f958: 6819 ldr r1, [r3, #0]
  43706. 802f95a: 4b26 ldr r3, [pc, #152] ; (802f9f4 <mem_malloc+0xc0>)
  43707. 802f95c: 681a ldr r2, [r3, #0]
  43708. 802f95e: 1a8b subs r3, r1, r2
  43709. 802f960: b29b uxth r3, r3
  43710. 802f962: f5c4 5ea0 rsb lr, r4, #5120 ; 0x1400
  43711. 802f966: e039 b.n 802f9dc <mem_malloc+0xa8>
  43712. ptr = ((struct mem *)(void *)&ram[ptr])->next) {
  43713. mem = (struct mem *)(void *)&ram[ptr];
  43714. 802f968: 18d5 adds r5, r2, r3
  43715. local_mem_free_count = 1;
  43716. break;
  43717. }
  43718. #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
  43719. if ((!mem->used) &&
  43720. 802f96a: 792f ldrb r7, [r5, #4]
  43721. 802f96c: 2f00 cmp r7, #0
  43722. 802f96e: d134 bne.n 802f9da <mem_malloc+0xa6>
  43723. (mem->next - (ptr + SIZEOF_STRUCT_MEM)) >= size) {
  43724. 802f970: 5ad6 ldrh r6, [r2, r3]
  43725. 802f972: f1a6 0008 sub.w r0, r6, #8
  43726. 802f976: 1ac0 subs r0, r0, r3
  43727. local_mem_free_count = 1;
  43728. break;
  43729. }
  43730. #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
  43731. if ((!mem->used) &&
  43732. 802f978: 42a0 cmp r0, r4
  43733. 802f97a: d32e bcc.n 802f9da <mem_malloc+0xa6>
  43734. (mem->next - (ptr + SIZEOF_STRUCT_MEM)) >= size) {
  43735. /* mem is not used and at least perfect fit is possible:
  43736. * mem->next - (ptr + SIZEOF_STRUCT_MEM) gives us the 'user data size' of mem */
  43737. if (mem->next - (ptr + SIZEOF_STRUCT_MEM) >= (size + SIZEOF_STRUCT_MEM + MIN_SIZE_ALIGNED)) {
  43738. 802f97c: f104 0e14 add.w lr, r4, #20
  43739. 802f980: 4570 cmp r0, lr
  43740. 802f982: d310 bcc.n 802f9a6 <mem_malloc+0x72>
  43741. * struct mem would fit in but no data between mem2 and mem2->next
  43742. * @todo we could leave out MIN_SIZE_ALIGNED. We would create an empty
  43743. * region that couldn't hold data, but when mem->next gets freed,
  43744. * the 2 regions would be combined, resulting in more free memory
  43745. */
  43746. ptr2 = ptr + SIZEOF_STRUCT_MEM + size;
  43747. 802f984: 3408 adds r4, #8
  43748. 802f986: 191c adds r4, r3, r4
  43749. 802f988: b2a4 uxth r4, r4
  43750. /* create mem2 struct */
  43751. mem2 = (struct mem *)(void *)&ram[ptr2];
  43752. 802f98a: 1910 adds r0, r2, r4
  43753. mem2->used = 0;
  43754. mem2->next = mem->next;
  43755. 802f98c: 5316 strh r6, [r2, r4]
  43756. mem2->prev = ptr;
  43757. 802f98e: 8043 strh r3, [r0, #2]
  43758. /* and insert it between mem and mem->next */
  43759. mem->next = ptr2;
  43760. 802f990: 802c strh r4, [r5, #0]
  43761. mem->used = 1;
  43762. 802f992: 2301 movs r3, #1
  43763. * the 2 regions would be combined, resulting in more free memory
  43764. */
  43765. ptr2 = ptr + SIZEOF_STRUCT_MEM + size;
  43766. /* create mem2 struct */
  43767. mem2 = (struct mem *)(void *)&ram[ptr2];
  43768. mem2->used = 0;
  43769. 802f994: 7107 strb r7, [r0, #4]
  43770. mem2->next = mem->next;
  43771. mem2->prev = ptr;
  43772. /* and insert it between mem and mem->next */
  43773. mem->next = ptr2;
  43774. mem->used = 1;
  43775. 802f996: 712b strb r3, [r5, #4]
  43776. if (mem2->next != MEM_SIZE_ALIGNED) {
  43777. 802f998: 5b13 ldrh r3, [r2, r4]
  43778. 802f99a: f5b3 5fa0 cmp.w r3, #5120 ; 0x1400
  43779. 802f99e: d004 beq.n 802f9aa <mem_malloc+0x76>
  43780. ((struct mem *)(void *)&ram[mem2->next])->prev = ptr2;
  43781. 802f9a0: 18d2 adds r2, r2, r3
  43782. 802f9a2: 8054 strh r4, [r2, #2]
  43783. 802f9a4: e001 b.n 802f9aa <mem_malloc+0x76>
  43784. * take care of this).
  43785. * -> near fit or excact fit: do not split, no mem2 creation
  43786. * also can't move mem->next directly behind mem, since mem->next
  43787. * will always be used at this point!
  43788. */
  43789. mem->used = 1;
  43790. 802f9a6: 2301 movs r3, #1
  43791. 802f9a8: 712b strb r3, [r5, #4]
  43792. MEM_STATS_INC_USED(used, mem->next - (mem_size_t)((u8_t *)mem - ram));
  43793. }
  43794. #if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT
  43795. mem_malloc_adjust_lfree:
  43796. #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
  43797. if (mem == lfree) {
  43798. 802f9aa: 428d cmp r5, r1
  43799. 802f9ac: d10f bne.n 802f9ce <mem_malloc+0x9a>
  43800. struct mem *cur = lfree;
  43801. /* Find next free block after mem and update lowest free pointer */
  43802. while (cur->used && cur != ram_end) {
  43803. 802f9ae: 4b12 ldr r3, [pc, #72] ; (802f9f8 <mem_malloc+0xc4>)
  43804. 802f9b0: 681a ldr r2, [r3, #0]
  43805. /* If mem_free or mem_trim have run, we have to restart since they
  43806. could have altered our current struct mem or lfree. */
  43807. goto mem_malloc_adjust_lfree;
  43808. }
  43809. #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
  43810. cur = (struct mem *)(void *)&ram[cur->next];
  43811. 802f9b2: 4b10 ldr r3, [pc, #64] ; (802f9f4 <mem_malloc+0xc0>)
  43812. 802f9b4: 6819 ldr r1, [r3, #0]
  43813. 802f9b6: 462b mov r3, r5
  43814. 802f9b8: e001 b.n 802f9be <mem_malloc+0x8a>
  43815. 802f9ba: 881b ldrh r3, [r3, #0]
  43816. 802f9bc: 18cb adds r3, r1, r3
  43817. mem_malloc_adjust_lfree:
  43818. #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
  43819. if (mem == lfree) {
  43820. struct mem *cur = lfree;
  43821. /* Find next free block after mem and update lowest free pointer */
  43822. while (cur->used && cur != ram_end) {
  43823. 802f9be: 7918 ldrb r0, [r3, #4]
  43824. 802f9c0: b910 cbnz r0, 802f9c8 <mem_malloc+0x94>
  43825. goto mem_malloc_adjust_lfree;
  43826. }
  43827. #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
  43828. cur = (struct mem *)(void *)&ram[cur->next];
  43829. }
  43830. lfree = cur;
  43831. 802f9c2: 4a0b ldr r2, [pc, #44] ; (802f9f0 <mem_malloc+0xbc>)
  43832. 802f9c4: 6013 str r3, [r2, #0]
  43833. 802f9c6: e002 b.n 802f9ce <mem_malloc+0x9a>
  43834. mem_malloc_adjust_lfree:
  43835. #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
  43836. if (mem == lfree) {
  43837. struct mem *cur = lfree;
  43838. /* Find next free block after mem and update lowest free pointer */
  43839. while (cur->used && cur != ram_end) {
  43840. 802f9c8: 4293 cmp r3, r2
  43841. 802f9ca: d1f6 bne.n 802f9ba <mem_malloc+0x86>
  43842. 802f9cc: e7f9 b.n 802f9c2 <mem_malloc+0x8e>
  43843. }
  43844. lfree = cur;
  43845. LWIP_ASSERT("mem_malloc: !lfree->used", ((lfree == ram_end) || (!lfree->used)));
  43846. }
  43847. LWIP_MEM_ALLOC_UNPROTECT();
  43848. sys_mutex_unlock(&mem_mutex);
  43849. 802f9ce: 4807 ldr r0, [pc, #28] ; (802f9ec <mem_malloc+0xb8>)
  43850. 802f9d0: f007 fdde bl 8037590 <sys_mutex_unlock>
  43851. LWIP_ASSERT("mem_malloc: allocated memory properly aligned.",
  43852. ((mem_ptr_t)mem + SIZEOF_STRUCT_MEM) % MEM_ALIGNMENT == 0);
  43853. LWIP_ASSERT("mem_malloc: sanity check alignment",
  43854. (((mem_ptr_t)mem) & (MEM_ALIGNMENT-1)) == 0);
  43855. return (u8_t *)mem + SIZEOF_STRUCT_MEM;
  43856. 802f9d4: f105 0008 add.w r0, r5, #8
  43857. 802f9d8: bdf8 pop {r3, r4, r5, r6, r7, pc}
  43858. /* Scan through the heap searching for a free block that is big enough,
  43859. * beginning with the lowest free block.
  43860. */
  43861. for (ptr = (mem_size_t)((u8_t *)lfree - ram); ptr < MEM_SIZE_ALIGNED - size;
  43862. ptr = ((struct mem *)(void *)&ram[ptr])->next) {
  43863. 802f9da: 882b ldrh r3, [r5, #0]
  43864. #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
  43865. /* Scan through the heap searching for a free block that is big enough,
  43866. * beginning with the lowest free block.
  43867. */
  43868. for (ptr = (mem_size_t)((u8_t *)lfree - ram); ptr < MEM_SIZE_ALIGNED - size;
  43869. 802f9dc: 4573 cmp r3, lr
  43870. 802f9de: dbc3 blt.n 802f968 <mem_malloc+0x34>
  43871. } while(local_mem_free_count != 0);
  43872. #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
  43873. LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("mem_malloc: could not allocate %"S16_F" bytes\n", (s16_t)size));
  43874. MEM_STATS_INC(err);
  43875. LWIP_MEM_ALLOC_UNPROTECT();
  43876. sys_mutex_unlock(&mem_mutex);
  43877. 802f9e0: 4802 ldr r0, [pc, #8] ; (802f9ec <mem_malloc+0xb8>)
  43878. 802f9e2: f007 fdd5 bl 8037590 <sys_mutex_unlock>
  43879. u8_t local_mem_free_count = 0;
  43880. #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
  43881. LWIP_MEM_ALLOC_DECL_PROTECT();
  43882. if (size == 0) {
  43883. return NULL;
  43884. 802f9e6: 2000 movs r0, #0
  43885. LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("mem_malloc: could not allocate %"S16_F" bytes\n", (s16_t)size));
  43886. MEM_STATS_INC(err);
  43887. LWIP_MEM_ALLOC_UNPROTECT();
  43888. sys_mutex_unlock(&mem_mutex);
  43889. return NULL;
  43890. }
  43891. 802f9e8: bdf8 pop {r3, r4, r5, r6, r7, pc}
  43892. 802f9ea: bf00 nop
  43893. 802f9ec: 20000da0 .word 0x20000da0
  43894. 802f9f0: 20000d98 .word 0x20000d98
  43895. 802f9f4: 20000da4 .word 0x20000da4
  43896. 802f9f8: 20000d9c .word 0x20000d9c
  43897. 0802f9fc <memp_init>:
  43898. MEMP_STATS_AVAIL(err, i, 0);
  43899. MEMP_STATS_AVAIL(avail, i, memp_num[i]);
  43900. }
  43901. #if !MEMP_SEPARATE_POOLS
  43902. memp = (struct memp *)LWIP_MEM_ALIGN(memp_memory);
  43903. 802f9fc: 4a0e ldr r2, [pc, #56] ; (802fa38 <memp_init+0x3c>)
  43904. 802f9fe: 490f ldr r1, [pc, #60] ; (802fa3c <memp_init+0x40>)
  43905. *
  43906. * Carves out memp_memory into linked lists for each pool-type.
  43907. */
  43908. void
  43909. memp_init(void)
  43910. {
  43911. 802fa00: b5f0 push {r4, r5, r6, r7, lr}
  43912. MEMP_STATS_AVAIL(err, i, 0);
  43913. MEMP_STATS_AVAIL(avail, i, memp_num[i]);
  43914. }
  43915. #if !MEMP_SEPARATE_POOLS
  43916. memp = (struct memp *)LWIP_MEM_ALIGN(memp_memory);
  43917. 802fa02: 2300 movs r3, #0
  43918. memp_tab[i] = NULL;
  43919. #if MEMP_SEPARATE_POOLS
  43920. memp = (struct memp*)memp_bases[i];
  43921. #endif /* MEMP_SEPARATE_POOLS */
  43922. /* create a linked list of memp elements */
  43923. for (j = 0; j < memp_num[i]; ++j) {
  43924. 802fa04: 4e0e ldr r6, [pc, #56] ; (802fa40 <memp_init+0x44>)
  43925. memp->next = memp_tab[i];
  43926. memp_tab[i] = memp;
  43927. memp = (struct memp *)(void *)((u8_t *)memp + MEMP_SIZE + memp_sizes[i]
  43928. 802fa06: 4f0f ldr r7, [pc, #60] ; (802fa44 <memp_init+0x48>)
  43929. MEMP_STATS_AVAIL(err, i, 0);
  43930. MEMP_STATS_AVAIL(avail, i, memp_num[i]);
  43931. }
  43932. #if !MEMP_SEPARATE_POOLS
  43933. memp = (struct memp *)LWIP_MEM_ALIGN(memp_memory);
  43934. 802fa08: f022 0203 bic.w r2, r2, #3
  43935. #endif /* !MEMP_SEPARATE_POOLS */
  43936. /* for every pool: */
  43937. for (i = 0; i < MEMP_MAX; ++i) {
  43938. memp_tab[i] = NULL;
  43939. 802fa0c: 461d mov r5, r3
  43940. 802fa0e: f841 5b04 str.w r5, [r1], #4
  43941. #if MEMP_SEPARATE_POOLS
  43942. memp = (struct memp*)memp_bases[i];
  43943. #endif /* MEMP_SEPARATE_POOLS */
  43944. /* create a linked list of memp elements */
  43945. for (j = 0; j < memp_num[i]; ++j) {
  43946. 802fa12: f833 c006 ldrh.w ip, [r3, r6]
  43947. 802fa16: 2000 movs r0, #0
  43948. 802fa18: e008 b.n 802fa2c <memp_init+0x30>
  43949. memp->next = memp_tab[i];
  43950. 802fa1a: f851 4c04 ldr.w r4, [r1, #-4]
  43951. 802fa1e: 6014 str r4, [r2, #0]
  43952. memp_tab[i] = memp;
  43953. memp = (struct memp *)(void *)((u8_t *)memp + MEMP_SIZE + memp_sizes[i]
  43954. 802fa20: 5bdc ldrh r4, [r3, r7]
  43955. memp = (struct memp*)memp_bases[i];
  43956. #endif /* MEMP_SEPARATE_POOLS */
  43957. /* create a linked list of memp elements */
  43958. for (j = 0; j < memp_num[i]; ++j) {
  43959. memp->next = memp_tab[i];
  43960. memp_tab[i] = memp;
  43961. 802fa22: f841 2c04 str.w r2, [r1, #-4]
  43962. memp_tab[i] = NULL;
  43963. #if MEMP_SEPARATE_POOLS
  43964. memp = (struct memp*)memp_bases[i];
  43965. #endif /* MEMP_SEPARATE_POOLS */
  43966. /* create a linked list of memp elements */
  43967. for (j = 0; j < memp_num[i]; ++j) {
  43968. 802fa26: 3001 adds r0, #1
  43969. memp->next = memp_tab[i];
  43970. memp_tab[i] = memp;
  43971. memp = (struct memp *)(void *)((u8_t *)memp + MEMP_SIZE + memp_sizes[i]
  43972. 802fa28: 1912 adds r2, r2, r4
  43973. memp_tab[i] = NULL;
  43974. #if MEMP_SEPARATE_POOLS
  43975. memp = (struct memp*)memp_bases[i];
  43976. #endif /* MEMP_SEPARATE_POOLS */
  43977. /* create a linked list of memp elements */
  43978. for (j = 0; j < memp_num[i]; ++j) {
  43979. 802fa2a: b280 uxth r0, r0
  43980. 802fa2c: 4560 cmp r0, ip
  43981. 802fa2e: d1f4 bne.n 802fa1a <memp_init+0x1e>
  43982. 802fa30: 3302 adds r3, #2
  43983. #if !MEMP_SEPARATE_POOLS
  43984. memp = (struct memp *)LWIP_MEM_ALIGN(memp_memory);
  43985. #endif /* !MEMP_SEPARATE_POOLS */
  43986. /* for every pool: */
  43987. for (i = 0; i < MEMP_MAX; ++i) {
  43988. 802fa32: 2b20 cmp r3, #32
  43989. 802fa34: d1eb bne.n 802fa0e <memp_init+0x12>
  43990. #if MEMP_OVERFLOW_CHECK
  43991. memp_overflow_init();
  43992. /* check everything a first time to see if it worked */
  43993. memp_overflow_check_all();
  43994. #endif /* MEMP_OVERFLOW_CHECK */
  43995. }
  43996. 802fa36: bdf0 pop {r4, r5, r6, r7, pc}
  43997. 802fa38: 20000dab .word 0x20000dab
  43998. 802fa3c: 2000c3e8 .word 0x2000c3e8
  43999. 802fa40: 080446da .word 0x080446da
  44000. 802fa44: 080446fa .word 0x080446fa
  44001. 0802fa48 <memp_malloc>:
  44002. #endif
  44003. {
  44004. struct memp *memp;
  44005. SYS_ARCH_DECL_PROTECT(old_level);
  44006. LWIP_ERROR("memp_malloc: type < MEMP_MAX", (type < MEMP_MAX), return NULL;);
  44007. 802fa48: 280f cmp r0, #15
  44008. #if !MEMP_OVERFLOW_CHECK
  44009. memp_malloc(memp_t type)
  44010. #else
  44011. memp_malloc_fn(memp_t type, const char* file, const int line)
  44012. #endif
  44013. {
  44014. 802fa4a: b538 push {r3, r4, r5, lr}
  44015. 802fa4c: 4605 mov r5, r0
  44016. struct memp *memp;
  44017. SYS_ARCH_DECL_PROTECT(old_level);
  44018. LWIP_ERROR("memp_malloc: type < MEMP_MAX", (type < MEMP_MAX), return NULL;);
  44019. 802fa4e: d80b bhi.n 802fa68 <memp_malloc+0x20>
  44020. SYS_ARCH_PROTECT(old_level);
  44021. 802fa50: f007 fdbe bl 80375d0 <sys_arch_protect>
  44022. #if MEMP_OVERFLOW_CHECK >= 2
  44023. memp_overflow_check_all();
  44024. #endif /* MEMP_OVERFLOW_CHECK >= 2 */
  44025. memp = memp_tab[type];
  44026. 802fa54: 4b06 ldr r3, [pc, #24] ; (802fa70 <memp_malloc+0x28>)
  44027. 802fa56: f853 4025 ldr.w r4, [r3, r5, lsl #2]
  44028. if (memp != NULL) {
  44029. 802fa5a: b114 cbz r4, 802fa62 <memp_malloc+0x1a>
  44030. memp_tab[type] = memp->next;
  44031. 802fa5c: 6822 ldr r2, [r4, #0]
  44032. 802fa5e: f843 2025 str.w r2, [r3, r5, lsl #2]
  44033. } else {
  44034. LWIP_DEBUGF(MEMP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("memp_malloc: out of memory in pool %s\n", memp_desc[type]));
  44035. MEMP_STATS_INC(err, type);
  44036. }
  44037. SYS_ARCH_UNPROTECT(old_level);
  44038. 802fa62: f007 fdbf bl 80375e4 <sys_arch_unprotect>
  44039. return memp;
  44040. 802fa66: e000 b.n 802fa6a <memp_malloc+0x22>
  44041. #endif
  44042. {
  44043. struct memp *memp;
  44044. SYS_ARCH_DECL_PROTECT(old_level);
  44045. LWIP_ERROR("memp_malloc: type < MEMP_MAX", (type < MEMP_MAX), return NULL;);
  44046. 802fa68: 2400 movs r4, #0
  44047. }
  44048. SYS_ARCH_UNPROTECT(old_level);
  44049. return memp;
  44050. }
  44051. 802fa6a: 4620 mov r0, r4
  44052. 802fa6c: bd38 pop {r3, r4, r5, pc}
  44053. 802fa6e: bf00 nop
  44054. 802fa70: 2000c3e8 .word 0x2000c3e8
  44055. 0802fa74 <memp_free>:
  44056. * @param type the pool where to put mem
  44057. * @param mem the memp element to free
  44058. */
  44059. void
  44060. memp_free(memp_t type, void *mem)
  44061. {
  44062. 802fa74: b538 push {r3, r4, r5, lr}
  44063. 802fa76: 4605 mov r5, r0
  44064. struct memp *memp;
  44065. SYS_ARCH_DECL_PROTECT(old_level);
  44066. if (mem == NULL) {
  44067. 802fa78: 460c mov r4, r1
  44068. 802fa7a: b159 cbz r1, 802fa94 <memp_free+0x20>
  44069. LWIP_ASSERT("memp_free: mem properly aligned",
  44070. ((mem_ptr_t)mem % MEM_ALIGNMENT) == 0);
  44071. memp = (struct memp *)(void *)((u8_t*)mem - MEMP_SIZE);
  44072. SYS_ARCH_PROTECT(old_level);
  44073. 802fa7c: f007 fda8 bl 80375d0 <sys_arch_protect>
  44074. #endif /* MEMP_OVERFLOW_CHECK >= 2 */
  44075. #endif /* MEMP_OVERFLOW_CHECK */
  44076. MEMP_STATS_DEC(used, type);
  44077. memp->next = memp_tab[type];
  44078. 802fa80: 4b05 ldr r3, [pc, #20] ; (802fa98 <memp_free+0x24>)
  44079. 802fa82: f853 2025 ldr.w r2, [r3, r5, lsl #2]
  44080. 802fa86: 6022 str r2, [r4, #0]
  44081. memp_tab[type] = memp;
  44082. 802fa88: f843 4025 str.w r4, [r3, r5, lsl #2]
  44083. #if MEMP_SANITY_CHECK
  44084. LWIP_ASSERT("memp sanity", memp_sanity());
  44085. #endif /* MEMP_SANITY_CHECK */
  44086. SYS_ARCH_UNPROTECT(old_level);
  44087. }
  44088. 802fa8c: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr}
  44089. #if MEMP_SANITY_CHECK
  44090. LWIP_ASSERT("memp sanity", memp_sanity());
  44091. #endif /* MEMP_SANITY_CHECK */
  44092. SYS_ARCH_UNPROTECT(old_level);
  44093. 802fa90: f007 bda8 b.w 80375e4 <sys_arch_unprotect>
  44094. 802fa94: bd38 pop {r3, r4, r5, pc}
  44095. 802fa96: bf00 nop
  44096. 802fa98: 2000c3e8 .word 0x2000c3e8
  44097. 0802fa9c <netif_init>:
  44098. }
  44099. #endif /* LWIP_HAVE_LOOPIF */
  44100. void
  44101. netif_init(void)
  44102. {
  44103. 802fa9c: 4770 bx lr
  44104. 802fa9e: 0000 movs r0, r0
  44105. 0802faa0 <netif_set_ipaddr>:
  44106. * @note call netif_set_addr() if you also want to change netmask and
  44107. * default gateway
  44108. */
  44109. void
  44110. netif_set_ipaddr(struct netif *netif, ip_addr_t *ipaddr)
  44111. {
  44112. 802faa0: b570 push {r4, r5, r6, lr}
  44113. 802faa2: 4604 mov r4, r0
  44114. #if LWIP_TCP
  44115. struct tcp_pcb *pcb;
  44116. struct tcp_pcb_listen *lpcb;
  44117. /* address is actually being changed? */
  44118. if (ipaddr && (ip_addr_cmp(ipaddr, &(netif->ip_addr))) == 0) {
  44119. 802faa4: 460d mov r5, r1
  44120. 802faa6: b941 cbnz r1, 802faba <netif_set_ipaddr+0x1a>
  44121. ip_addr_set(&(lpcb->local_ip), ipaddr);
  44122. }
  44123. }
  44124. }
  44125. #endif
  44126. snmp_delete_ipaddridx_tree(netif);
  44127. 802faa8: 4620 mov r0, r4
  44128. 802faaa: f004 fdb5 bl 8034618 <snmp_delete_ipaddridx_tree>
  44129. snmp_delete_iprteidx_tree(0,netif);
  44130. 802faae: 2000 movs r0, #0
  44131. 802fab0: 4621 mov r1, r4
  44132. 802fab2: f004 fe47 bl 8034744 <snmp_delete_iprteidx_tree>
  44133. /* set new IP address to netif */
  44134. ip_addr_set(&(netif->ip_addr), ipaddr);
  44135. 802fab6: b9fd cbnz r5, 802faf8 <netif_set_ipaddr+0x58>
  44136. 802fab8: e01f b.n 802fafa <netif_set_ipaddr+0x5a>
  44137. #if LWIP_TCP
  44138. struct tcp_pcb *pcb;
  44139. struct tcp_pcb_listen *lpcb;
  44140. /* address is actually being changed? */
  44141. if (ipaddr && (ip_addr_cmp(ipaddr, &(netif->ip_addr))) == 0) {
  44142. 802faba: 680a ldr r2, [r1, #0]
  44143. 802fabc: 6843 ldr r3, [r0, #4]
  44144. 802fabe: 429a cmp r2, r3
  44145. 802fac0: d0f2 beq.n 802faa8 <netif_set_ipaddr+0x8>
  44146. /* extern struct tcp_pcb *tcp_active_pcbs; defined by tcp.h */
  44147. LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_STATE, ("netif_set_ipaddr: netif address being changed\n"));
  44148. pcb = tcp_active_pcbs;
  44149. 802fac2: 4b13 ldr r3, [pc, #76] ; (802fb10 <netif_set_ipaddr+0x70>)
  44150. 802fac4: 6818 ldr r0, [r3, #0]
  44151. while (pcb != NULL) {
  44152. 802fac6: e007 b.n 802fad8 <netif_set_ipaddr+0x38>
  44153. /* PCB bound to current local interface address? */
  44154. if (ip_addr_cmp(&(pcb->local_ip), &(netif->ip_addr))
  44155. 802fac8: 6802 ldr r2, [r0, #0]
  44156. 802faca: 6863 ldr r3, [r4, #4]
  44157. 802facc: 68c6 ldr r6, [r0, #12]
  44158. 802face: 429a cmp r2, r3
  44159. 802fad0: d101 bne.n 802fad6 <netif_set_ipaddr+0x36>
  44160. #endif /* LWIP_AUTOIP */
  44161. ) {
  44162. /* this connection must be aborted */
  44163. struct tcp_pcb *next = pcb->next;
  44164. LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_STATE, ("netif_set_ipaddr: aborting TCP pcb %p\n", (void *)pcb));
  44165. tcp_abort(pcb);
  44166. 802fad2: f000 fd89 bl 80305e8 <tcp_abort>
  44167. pcb = next;
  44168. } else {
  44169. pcb = pcb->next;
  44170. 802fad6: 4630 mov r0, r6
  44171. /* address is actually being changed? */
  44172. if (ipaddr && (ip_addr_cmp(ipaddr, &(netif->ip_addr))) == 0) {
  44173. /* extern struct tcp_pcb *tcp_active_pcbs; defined by tcp.h */
  44174. LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_STATE, ("netif_set_ipaddr: netif address being changed\n"));
  44175. pcb = tcp_active_pcbs;
  44176. while (pcb != NULL) {
  44177. 802fad8: 2800 cmp r0, #0
  44178. 802fada: d1f5 bne.n 802fac8 <netif_set_ipaddr+0x28>
  44179. pcb = next;
  44180. } else {
  44181. pcb = pcb->next;
  44182. }
  44183. }
  44184. for (lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = lpcb->next) {
  44185. 802fadc: 4b0d ldr r3, [pc, #52] ; (802fb14 <netif_set_ipaddr+0x74>)
  44186. 802fade: 681b ldr r3, [r3, #0]
  44187. 802fae0: e007 b.n 802faf2 <netif_set_ipaddr+0x52>
  44188. /* PCB bound to current local interface address? */
  44189. if ((!(ip_addr_isany(&(lpcb->local_ip)))) &&
  44190. 802fae2: 681a ldr r2, [r3, #0]
  44191. 802fae4: b122 cbz r2, 802faf0 <netif_set_ipaddr+0x50>
  44192. 802fae6: 6861 ldr r1, [r4, #4]
  44193. 802fae8: 428a cmp r2, r1
  44194. (ip_addr_cmp(&(lpcb->local_ip), &(netif->ip_addr)))) {
  44195. /* The PCB is listening to the old ipaddr and
  44196. * is set to listen to the new one instead */
  44197. ip_addr_set(&(lpcb->local_ip), ipaddr);
  44198. 802faea: bf04 itt eq
  44199. 802faec: 682a ldreq r2, [r5, #0]
  44200. 802faee: 601a streq r2, [r3, #0]
  44201. pcb = next;
  44202. } else {
  44203. pcb = pcb->next;
  44204. }
  44205. }
  44206. for (lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = lpcb->next) {
  44207. 802faf0: 68db ldr r3, [r3, #12]
  44208. 802faf2: 2b00 cmp r3, #0
  44209. 802faf4: d1f5 bne.n 802fae2 <netif_set_ipaddr+0x42>
  44210. 802faf6: e7d7 b.n 802faa8 <netif_set_ipaddr+0x8>
  44211. }
  44212. #endif
  44213. snmp_delete_ipaddridx_tree(netif);
  44214. snmp_delete_iprteidx_tree(0,netif);
  44215. /* set new IP address to netif */
  44216. ip_addr_set(&(netif->ip_addr), ipaddr);
  44217. 802faf8: 682d ldr r5, [r5, #0]
  44218. snmp_insert_ipaddridx_tree(netif);
  44219. 802fafa: 4620 mov r0, r4
  44220. }
  44221. #endif
  44222. snmp_delete_ipaddridx_tree(netif);
  44223. snmp_delete_iprteidx_tree(0,netif);
  44224. /* set new IP address to netif */
  44225. ip_addr_set(&(netif->ip_addr), ipaddr);
  44226. 802fafc: 6065 str r5, [r4, #4]
  44227. snmp_insert_ipaddridx_tree(netif);
  44228. 802fafe: f004 fd49 bl 8034594 <snmp_insert_ipaddridx_tree>
  44229. snmp_insert_iprteidx_tree(0,netif);
  44230. 802fb02: 2000 movs r0, #0
  44231. 802fb04: 4621 mov r1, r4
  44232. netif->name[0], netif->name[1],
  44233. ip4_addr1_16(&netif->ip_addr),
  44234. ip4_addr2_16(&netif->ip_addr),
  44235. ip4_addr3_16(&netif->ip_addr),
  44236. ip4_addr4_16(&netif->ip_addr)));
  44237. }
  44238. 802fb06: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
  44239. snmp_delete_ipaddridx_tree(netif);
  44240. snmp_delete_iprteidx_tree(0,netif);
  44241. /* set new IP address to netif */
  44242. ip_addr_set(&(netif->ip_addr), ipaddr);
  44243. snmp_insert_ipaddridx_tree(netif);
  44244. snmp_insert_iprteidx_tree(0,netif);
  44245. 802fb0a: f004 bdcf b.w 80346ac <snmp_insert_iprteidx_tree>
  44246. 802fb0e: bf00 nop
  44247. 802fb10: 2000ff20 .word 0x2000ff20
  44248. 802fb14: 2000ff28 .word 0x2000ff28
  44249. 0802fb18 <netif_set_gw>:
  44250. * @note call netif_set_addr() if you also want to change ip address and netmask
  44251. */
  44252. void
  44253. netif_set_gw(struct netif *netif, ip_addr_t *gw)
  44254. {
  44255. ip_addr_set(&(netif->gw), gw);
  44256. 802fb18: b101 cbz r1, 802fb1c <netif_set_gw+0x4>
  44257. 802fb1a: 6809 ldr r1, [r1, #0]
  44258. 802fb1c: 60c1 str r1, [r0, #12]
  44259. 802fb1e: 4770 bx lr
  44260. 0802fb20 <netif_set_netmask>:
  44261. * @note call netif_set_addr() if you also want to change ip address and
  44262. * default gateway
  44263. */
  44264. void
  44265. netif_set_netmask(struct netif *netif, ip_addr_t *netmask)
  44266. {
  44267. 802fb20: b538 push {r3, r4, r5, lr}
  44268. 802fb22: 4604 mov r4, r0
  44269. 802fb24: 460d mov r5, r1
  44270. snmp_delete_iprteidx_tree(0, netif);
  44271. 802fb26: 2000 movs r0, #0
  44272. 802fb28: 4621 mov r1, r4
  44273. 802fb2a: f004 fe0b bl 8034744 <snmp_delete_iprteidx_tree>
  44274. /* set new netmask to netif */
  44275. ip_addr_set(&(netif->netmask), netmask);
  44276. 802fb2e: b105 cbz r5, 802fb32 <netif_set_netmask+0x12>
  44277. 802fb30: 682d ldr r5, [r5, #0]
  44278. snmp_insert_iprteidx_tree(0, netif);
  44279. 802fb32: 2000 movs r0, #0
  44280. 802fb34: 4621 mov r1, r4
  44281. void
  44282. netif_set_netmask(struct netif *netif, ip_addr_t *netmask)
  44283. {
  44284. snmp_delete_iprteidx_tree(0, netif);
  44285. /* set new netmask to netif */
  44286. ip_addr_set(&(netif->netmask), netmask);
  44287. 802fb36: 60a5 str r5, [r4, #8]
  44288. netif->name[0], netif->name[1],
  44289. ip4_addr1_16(&netif->netmask),
  44290. ip4_addr2_16(&netif->netmask),
  44291. ip4_addr3_16(&netif->netmask),
  44292. ip4_addr4_16(&netif->netmask)));
  44293. }
  44294. 802fb38: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr}
  44295. netif_set_netmask(struct netif *netif, ip_addr_t *netmask)
  44296. {
  44297. snmp_delete_iprteidx_tree(0, netif);
  44298. /* set new netmask to netif */
  44299. ip_addr_set(&(netif->netmask), netmask);
  44300. snmp_insert_iprteidx_tree(0, netif);
  44301. 802fb3c: f004 bdb6 b.w 80346ac <snmp_insert_iprteidx_tree>
  44302. 0802fb40 <netif_set_addr>:
  44303. * @param gw the new default gateway
  44304. */
  44305. void
  44306. netif_set_addr(struct netif *netif, ip_addr_t *ipaddr, ip_addr_t *netmask,
  44307. ip_addr_t *gw)
  44308. {
  44309. 802fb40: b570 push {r4, r5, r6, lr}
  44310. 802fb42: 4605 mov r5, r0
  44311. 802fb44: 4616 mov r6, r2
  44312. 802fb46: 461c mov r4, r3
  44313. netif_set_ipaddr(netif, ipaddr);
  44314. 802fb48: f7ff ffaa bl 802faa0 <netif_set_ipaddr>
  44315. netif_set_netmask(netif, netmask);
  44316. 802fb4c: 4628 mov r0, r5
  44317. 802fb4e: 4631 mov r1, r6
  44318. 802fb50: f7ff ffe6 bl 802fb20 <netif_set_netmask>
  44319. * @note call netif_set_addr() if you also want to change ip address and netmask
  44320. */
  44321. void
  44322. netif_set_gw(struct netif *netif, ip_addr_t *gw)
  44323. {
  44324. ip_addr_set(&(netif->gw), gw);
  44325. 802fb54: b104 cbz r4, 802fb58 <netif_set_addr+0x18>
  44326. 802fb56: 6824 ldr r4, [r4, #0]
  44327. 802fb58: 60ec str r4, [r5, #12]
  44328. 802fb5a: bd70 pop {r4, r5, r6, pc}
  44329. 0802fb5c <netif_add>:
  44330. * @return netif, or NULL if failed.
  44331. */
  44332. struct netif *
  44333. netif_add(struct netif *netif, ip_addr_t *ipaddr, ip_addr_t *netmask,
  44334. ip_addr_t *gw, void *state, netif_init_fn init, netif_input_fn input)
  44335. {
  44336. 802fb5c: b5f8 push {r3, r4, r5, r6, r7, lr}
  44337. netif->loop_first = NULL;
  44338. netif->loop_last = NULL;
  44339. #endif /* ENABLE_LOOPBACK */
  44340. /* remember netif specific state information data */
  44341. netif->state = state;
  44342. 802fb5e: 9e06 ldr r6, [sp, #24]
  44343. 802fb60: 61c6 str r6, [r0, #28]
  44344. netif->num = netif_num++;
  44345. 802fb62: 4e10 ldr r6, [pc, #64] ; (802fba4 <netif_add+0x48>)
  44346. 802fb64: 7837 ldrb r7, [r6, #0]
  44347. 802fb66: f880 7030 strb.w r7, [r0, #48] ; 0x30
  44348. 802fb6a: 3701 adds r7, #1
  44349. 802fb6c: 7037 strb r7, [r6, #0]
  44350. netif->input = input;
  44351. 802fb6e: 9e08 ldr r6, [sp, #32]
  44352. {
  44353. LWIP_ASSERT("No init function given", init != NULL);
  44354. /* reset new interface configuration state */
  44355. ip_addr_set_zero(&netif->ip_addr);
  44356. 802fb70: 2500 movs r5, #0
  44357. * @return netif, or NULL if failed.
  44358. */
  44359. struct netif *
  44360. netif_add(struct netif *netif, ip_addr_t *ipaddr, ip_addr_t *netmask,
  44361. ip_addr_t *gw, void *state, netif_init_fn init, netif_input_fn input)
  44362. {
  44363. 802fb72: 4604 mov r4, r0
  44364. LWIP_ASSERT("No init function given", init != NULL);
  44365. /* reset new interface configuration state */
  44366. ip_addr_set_zero(&netif->ip_addr);
  44367. 802fb74: 6045 str r5, [r0, #4]
  44368. ip_addr_set_zero(&netif->netmask);
  44369. 802fb76: 6085 str r5, [r0, #8]
  44370. ip_addr_set_zero(&netif->gw);
  44371. 802fb78: 60c5 str r5, [r0, #12]
  44372. netif->flags = 0;
  44373. 802fb7a: f880 502d strb.w r5, [r0, #45] ; 0x2d
  44374. #if LWIP_DHCP
  44375. /* netif not under DHCP control by default */
  44376. netif->dhcp = NULL;
  44377. 802fb7e: 6205 str r5, [r0, #32]
  44378. #endif /* ENABLE_LOOPBACK */
  44379. /* remember netif specific state information data */
  44380. netif->state = state;
  44381. netif->num = netif_num++;
  44382. netif->input = input;
  44383. 802fb80: 6106 str r6, [r0, #16]
  44384. NETIF_SET_HWADDRHINT(netif, NULL);
  44385. #if ENABLE_LOOPBACK && LWIP_LOOPBACK_MAX_PBUFS
  44386. netif->loop_cnt_current = 0;
  44387. #endif /* ENABLE_LOOPBACK && LWIP_LOOPBACK_MAX_PBUFS */
  44388. netif_set_addr(netif, ipaddr, netmask, gw);
  44389. 802fb82: f7ff ffdd bl 802fb40 <netif_set_addr>
  44390. /* call user specified initialization function for netif */
  44391. if (init(netif) != ERR_OK) {
  44392. 802fb86: 4620 mov r0, r4
  44393. 802fb88: 9b07 ldr r3, [sp, #28]
  44394. 802fb8a: 4798 blx r3
  44395. 802fb8c: b930 cbnz r0, 802fb9c <netif_add+0x40>
  44396. return NULL;
  44397. }
  44398. /* add this netif to the list */
  44399. netif->next = netif_list;
  44400. 802fb8e: 4b06 ldr r3, [pc, #24] ; (802fba8 <netif_add+0x4c>)
  44401. 802fb90: 681a ldr r2, [r3, #0]
  44402. 802fb92: 6022 str r2, [r4, #0]
  44403. netif_list = netif;
  44404. 802fb94: 601c str r4, [r3, #0]
  44405. snmp_inc_iflist();
  44406. 802fb96: f004 fbe1 bl 803435c <snmp_inc_iflist>
  44407. LWIP_DEBUGF(NETIF_DEBUG, (" netmask "));
  44408. ip_addr_debug_print(NETIF_DEBUG, netmask);
  44409. LWIP_DEBUGF(NETIF_DEBUG, (" gw "));
  44410. ip_addr_debug_print(NETIF_DEBUG, gw);
  44411. LWIP_DEBUGF(NETIF_DEBUG, ("\n"));
  44412. return netif;
  44413. 802fb9a: e000 b.n 802fb9e <netif_add+0x42>
  44414. netif_set_addr(netif, ipaddr, netmask, gw);
  44415. /* call user specified initialization function for netif */
  44416. if (init(netif) != ERR_OK) {
  44417. return NULL;
  44418. 802fb9c: 462c mov r4, r5
  44419. ip_addr_debug_print(NETIF_DEBUG, netmask);
  44420. LWIP_DEBUGF(NETIF_DEBUG, (" gw "));
  44421. ip_addr_debug_print(NETIF_DEBUG, gw);
  44422. LWIP_DEBUGF(NETIF_DEBUG, ("\n"));
  44423. return netif;
  44424. }
  44425. 802fb9e: 4620 mov r0, r4
  44426. 802fba0: bdf8 pop {r3, r4, r5, r6, r7, pc}
  44427. 802fba2: bf00 nop
  44428. 802fba4: 2000c428 .word 0x2000c428
  44429. 802fba8: 2000ff14 .word 0x2000ff14
  44430. 0802fbac <netif_set_default>:
  44431. *
  44432. * @param netif the default network interface
  44433. */
  44434. void
  44435. netif_set_default(struct netif *netif)
  44436. {
  44437. 802fbac: b510 push {r4, lr}
  44438. if (netif == NULL) {
  44439. 802fbae: 4604 mov r4, r0
  44440. /* remove default route */
  44441. snmp_delete_iprteidx_tree(1, netif);
  44442. 802fbb0: 4621 mov r1, r4
  44443. 802fbb2: 2001 movs r0, #1
  44444. * @param netif the default network interface
  44445. */
  44446. void
  44447. netif_set_default(struct netif *netif)
  44448. {
  44449. if (netif == NULL) {
  44450. 802fbb4: b914 cbnz r4, 802fbbc <netif_set_default+0x10>
  44451. /* remove default route */
  44452. snmp_delete_iprteidx_tree(1, netif);
  44453. 802fbb6: f004 fdc5 bl 8034744 <snmp_delete_iprteidx_tree>
  44454. 802fbba: e001 b.n 802fbc0 <netif_set_default+0x14>
  44455. } else {
  44456. /* install default route */
  44457. snmp_insert_iprteidx_tree(1, netif);
  44458. 802fbbc: f004 fd76 bl 80346ac <snmp_insert_iprteidx_tree>
  44459. }
  44460. netif_default = netif;
  44461. 802fbc0: 4b01 ldr r3, [pc, #4] ; (802fbc8 <netif_set_default+0x1c>)
  44462. 802fbc2: 601c str r4, [r3, #0]
  44463. 802fbc4: bd10 pop {r4, pc}
  44464. 802fbc6: bf00 nop
  44465. 802fbc8: 2000ff18 .word 0x2000ff18
  44466. 0802fbcc <netif_set_up>:
  44467. * up once configured.
  44468. *
  44469. * @see dhcp_start()
  44470. */
  44471. void netif_set_up(struct netif *netif)
  44472. {
  44473. 802fbcc: b510 push {r4, lr}
  44474. if (!(netif->flags & NETIF_FLAG_UP)) {
  44475. 802fbce: f890 302d ldrb.w r3, [r0, #45] ; 0x2d
  44476. 802fbd2: 07da lsls r2, r3, #31
  44477. * up once configured.
  44478. *
  44479. * @see dhcp_start()
  44480. */
  44481. void netif_set_up(struct netif *netif)
  44482. {
  44483. 802fbd4: 4604 mov r4, r0
  44484. if (!(netif->flags & NETIF_FLAG_UP)) {
  44485. 802fbd6: d412 bmi.n 802fbfe <netif_set_up+0x32>
  44486. netif->flags |= NETIF_FLAG_UP;
  44487. 802fbd8: f043 0301 orr.w r3, r3, #1
  44488. 802fbdc: f880 302d strb.w r3, [r0, #45] ; 0x2d
  44489. #if LWIP_SNMP
  44490. snmp_get_sysuptime(&netif->ts);
  44491. 802fbe0: 3038 adds r0, #56 ; 0x38
  44492. 802fbe2: f004 fb55 bl 8034290 <snmp_get_sysuptime>
  44493. * @note: Enabling DHCP on a down interface will make it come
  44494. * up once configured.
  44495. *
  44496. * @see dhcp_start()
  44497. */
  44498. void netif_set_up(struct netif *netif)
  44499. 802fbe6: f894 302d ldrb.w r3, [r4, #45] ; 0x2d
  44500. NETIF_STATUS_CALLBACK(netif);
  44501. if (netif->flags & NETIF_FLAG_LINK_UP) {
  44502. #if LWIP_ARP
  44503. /* For Ethernet network interfaces, we would like to send a "gratuitous ARP" */
  44504. if (netif->flags & (NETIF_FLAG_ETHARP)) {
  44505. 802fbea: f003 0330 and.w r3, r3, #48 ; 0x30
  44506. 802fbee: 2b30 cmp r3, #48 ; 0x30
  44507. 802fbf0: d105 bne.n 802fbfe <netif_set_up+0x32>
  44508. etharp_gratuitous(netif);
  44509. 802fbf2: 4620 mov r0, r4
  44510. 802fbf4: 1d21 adds r1, r4, #4
  44511. igmp_report_groups( netif);
  44512. }
  44513. #endif /* LWIP_IGMP */
  44514. }
  44515. }
  44516. }
  44517. 802fbf6: e8bd 4010 ldmia.w sp!, {r4, lr}
  44518. if (netif->flags & NETIF_FLAG_LINK_UP) {
  44519. #if LWIP_ARP
  44520. /* For Ethernet network interfaces, we would like to send a "gratuitous ARP" */
  44521. if (netif->flags & (NETIF_FLAG_ETHARP)) {
  44522. etharp_gratuitous(netif);
  44523. 802fbfa: f007 b89d b.w 8036d38 <etharp_request>
  44524. 802fbfe: bd10 pop {r4, pc}
  44525. 0802fc00 <netif_set_down>:
  44526. * up once configured.
  44527. *
  44528. * @see dhcp_start()
  44529. */
  44530. void netif_set_down(struct netif *netif)
  44531. {
  44532. 802fc00: b510 push {r4, lr}
  44533. if (netif->flags & NETIF_FLAG_UP) {
  44534. 802fc02: f890 302d ldrb.w r3, [r0, #45] ; 0x2d
  44535. 802fc06: 07d9 lsls r1, r3, #31
  44536. * up once configured.
  44537. *
  44538. * @see dhcp_start()
  44539. */
  44540. void netif_set_down(struct netif *netif)
  44541. {
  44542. 802fc08: 4604 mov r4, r0
  44543. if (netif->flags & NETIF_FLAG_UP) {
  44544. 802fc0a: d511 bpl.n 802fc30 <netif_set_down+0x30>
  44545. netif->flags &= ~NETIF_FLAG_UP;
  44546. 802fc0c: f023 0301 bic.w r3, r3, #1
  44547. 802fc10: f880 302d strb.w r3, [r0, #45] ; 0x2d
  44548. #if LWIP_SNMP
  44549. snmp_get_sysuptime(&netif->ts);
  44550. 802fc14: 3038 adds r0, #56 ; 0x38
  44551. 802fc16: f004 fb3b bl 8034290 <snmp_get_sysuptime>
  44552. #endif
  44553. #if LWIP_ARP
  44554. if (netif->flags & NETIF_FLAG_ETHARP) {
  44555. 802fc1a: f894 302d ldrb.w r3, [r4, #45] ; 0x2d
  44556. 802fc1e: f003 0320 and.w r3, r3, #32
  44557. 802fc22: b2db uxtb r3, r3
  44558. 802fc24: b123 cbz r3, 802fc30 <netif_set_down+0x30>
  44559. etharp_cleanup_netif(netif);
  44560. 802fc26: 4620 mov r0, r4
  44561. }
  44562. #endif /* LWIP_ARP */
  44563. NETIF_STATUS_CALLBACK(netif);
  44564. }
  44565. }
  44566. 802fc28: e8bd 4010 ldmia.w sp!, {r4, lr}
  44567. snmp_get_sysuptime(&netif->ts);
  44568. #endif
  44569. #if LWIP_ARP
  44570. if (netif->flags & NETIF_FLAG_ETHARP) {
  44571. etharp_cleanup_netif(netif);
  44572. 802fc2c: f007 b854 b.w 8036cd8 <etharp_cleanup_netif>
  44573. 802fc30: bd10 pop {r4, pc}
  44574. 0802fc32 <pbuf_header>:
  44575. * @return non-zero on failure, zero on success.
  44576. *
  44577. */
  44578. u8_t
  44579. pbuf_header(struct pbuf *p, s16_t header_size_increment)
  44580. {
  44581. 802fc32: b510 push {r4, lr}
  44582. u16_t type;
  44583. void *payload;
  44584. u16_t increment_magnitude;
  44585. LWIP_ASSERT("p != NULL", p != NULL);
  44586. if ((header_size_increment == 0) || (p == NULL)) {
  44587. 802fc34: b321 cbz r1, 802fc80 <pbuf_header+0x4e>
  44588. 802fc36: b330 cbz r0, 802fc86 <pbuf_header+0x54>
  44589. return 0;
  44590. }
  44591. if (header_size_increment < 0){
  44592. 802fc38: 2900 cmp r1, #0
  44593. 802fc3a: da05 bge.n 802fc48 <pbuf_header+0x16>
  44594. increment_magnitude = -header_size_increment;
  44595. 802fc3c: 424b negs r3, r1
  44596. /* Check that we aren't going to move off the end of the pbuf */
  44597. LWIP_ERROR("increment_magnitude <= p->len", (increment_magnitude <= p->len), return 1;);
  44598. 802fc3e: 8942 ldrh r2, [r0, #10]
  44599. if ((header_size_increment == 0) || (p == NULL)) {
  44600. return 0;
  44601. }
  44602. if (header_size_increment < 0){
  44603. increment_magnitude = -header_size_increment;
  44604. 802fc40: b29b uxth r3, r3
  44605. /* Check that we aren't going to move off the end of the pbuf */
  44606. LWIP_ERROR("increment_magnitude <= p->len", (increment_magnitude <= p->len), return 1;);
  44607. 802fc42: 429a cmp r2, r3
  44608. 802fc44: d201 bcs.n 802fc4a <pbuf_header+0x18>
  44609. 802fc46: e01d b.n 802fc84 <pbuf_header+0x52>
  44610. } else {
  44611. increment_magnitude = header_size_increment;
  44612. 802fc48: b28b uxth r3, r1
  44613. LWIP_ASSERT("p->payload - increment_magnitude >= p + SIZEOF_STRUCT_PBUF",
  44614. (u8_t *)p->payload - increment_magnitude >= (u8_t *)p + SIZEOF_STRUCT_PBUF);
  44615. #endif
  44616. }
  44617. type = p->type;
  44618. 802fc4a: 7b02 ldrb r2, [r0, #12]
  44619. /* remember current payload pointer */
  44620. payload = p->payload;
  44621. 802fc4c: 6844 ldr r4, [r0, #4]
  44622. /* pbuf types containing payloads? */
  44623. if (type == PBUF_RAM || type == PBUF_POOL) {
  44624. 802fc4e: b10a cbz r2, 802fc54 <pbuf_header+0x22>
  44625. 802fc50: 2a03 cmp r2, #3
  44626. 802fc52: d105 bne.n 802fc60 <pbuf_header+0x2e>
  44627. /* set new payload pointer */
  44628. p->payload = (u8_t *)p->payload - header_size_increment;
  44629. 802fc54: 1a64 subs r4, r4, r1
  44630. /* boundary check fails? */
  44631. if ((u8_t *)p->payload < (u8_t *)p + SIZEOF_STRUCT_PBUF) {
  44632. 802fc56: f100 0310 add.w r3, r0, #16
  44633. 802fc5a: 429c cmp r4, r3
  44634. 802fc5c: d312 bcc.n 802fc84 <pbuf_header+0x52>
  44635. 802fc5e: e008 b.n 802fc72 <pbuf_header+0x40>
  44636. p->payload = payload;
  44637. /* bail out unsuccesfully */
  44638. return 1;
  44639. }
  44640. /* pbuf types refering to external payloads? */
  44641. } else if (type == PBUF_REF || type == PBUF_ROM) {
  44642. 802fc60: 3a01 subs r2, #1
  44643. 802fc62: 2a01 cmp r2, #1
  44644. 802fc64: d80e bhi.n 802fc84 <pbuf_header+0x52>
  44645. /* hide a header in the payload? */
  44646. if ((header_size_increment < 0) && (increment_magnitude <= p->len)) {
  44647. 802fc66: 2900 cmp r1, #0
  44648. 802fc68: da0c bge.n 802fc84 <pbuf_header+0x52>
  44649. 802fc6a: 8942 ldrh r2, [r0, #10]
  44650. 802fc6c: 429a cmp r2, r3
  44651. 802fc6e: d309 bcc.n 802fc84 <pbuf_header+0x52>
  44652. /* increase payload pointer */
  44653. p->payload = (u8_t *)p->payload - header_size_increment;
  44654. 802fc70: 1a64 subs r4, r4, r1
  44655. /* Unknown type */
  44656. LWIP_ASSERT("bad pbuf type", 0);
  44657. return 1;
  44658. }
  44659. /* modify pbuf length fields */
  44660. p->len += header_size_increment;
  44661. 802fc72: 8943 ldrh r3, [r0, #10]
  44662. /* pbuf types refering to external payloads? */
  44663. } else if (type == PBUF_REF || type == PBUF_ROM) {
  44664. /* hide a header in the payload? */
  44665. if ((header_size_increment < 0) && (increment_magnitude <= p->len)) {
  44666. /* increase payload pointer */
  44667. p->payload = (u8_t *)p->payload - header_size_increment;
  44668. 802fc74: 6044 str r4, [r0, #4]
  44669. /* Unknown type */
  44670. LWIP_ASSERT("bad pbuf type", 0);
  44671. return 1;
  44672. }
  44673. /* modify pbuf length fields */
  44674. p->len += header_size_increment;
  44675. 802fc76: 18cb adds r3, r1, r3
  44676. 802fc78: 8143 strh r3, [r0, #10]
  44677. p->tot_len += header_size_increment;
  44678. 802fc7a: 8903 ldrh r3, [r0, #8]
  44679. 802fc7c: 18c9 adds r1, r1, r3
  44680. 802fc7e: 8101 strh r1, [r0, #8]
  44681. LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_header: old %p new %p (%"S16_F")\n",
  44682. (void *)payload, (void *)p->payload, header_size_increment));
  44683. return 0;
  44684. 802fc80: 2000 movs r0, #0
  44685. 802fc82: bd10 pop {r4, pc}
  44686. }
  44687. if (header_size_increment < 0){
  44688. increment_magnitude = -header_size_increment;
  44689. /* Check that we aren't going to move off the end of the pbuf */
  44690. LWIP_ERROR("increment_magnitude <= p->len", (increment_magnitude <= p->len), return 1;);
  44691. 802fc84: 2001 movs r0, #1
  44692. LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_header: old %p new %p (%"S16_F")\n",
  44693. (void *)payload, (void *)p->payload, header_size_increment));
  44694. return 0;
  44695. }
  44696. 802fc86: bd10 pop {r4, pc}
  44697. 0802fc88 <pbuf_free>:
  44698. * 1->1->1 becomes .......
  44699. *
  44700. */
  44701. u8_t
  44702. pbuf_free(struct pbuf *p)
  44703. {
  44704. 802fc88: b570 push {r4, r5, r6, lr}
  44705. u16_t type;
  44706. struct pbuf *q;
  44707. u8_t count;
  44708. if (p == NULL) {
  44709. 802fc8a: 4604 mov r4, r0
  44710. 802fc8c: b300 cbz r0, 802fcd0 <pbuf_free+0x48>
  44711. 802fc8e: 2500 movs r5, #0
  44712. u16_t ref;
  44713. SYS_ARCH_DECL_PROTECT(old_level);
  44714. /* Since decrementing ref cannot be guaranteed to be a single machine operation
  44715. * we must protect it. We put the new ref into a local variable to prevent
  44716. * further protection. */
  44717. SYS_ARCH_PROTECT(old_level);
  44718. 802fc90: f007 fc9e bl 80375d0 <sys_arch_protect>
  44719. /* all pbufs in a chain are referenced at least once */
  44720. LWIP_ASSERT("pbuf_free: p->ref > 0", p->ref > 0);
  44721. /* decrease reference count (number of pointers to pbuf) */
  44722. ref = --(p->ref);
  44723. 802fc94: 89e6 ldrh r6, [r4, #14]
  44724. 802fc96: 3e01 subs r6, #1
  44725. 802fc98: b2b6 uxth r6, r6
  44726. 802fc9a: 81e6 strh r6, [r4, #14]
  44727. SYS_ARCH_UNPROTECT(old_level);
  44728. 802fc9c: f007 fca2 bl 80375e4 <sys_arch_unprotect>
  44729. /* this pbuf is no longer referenced to? */
  44730. if (ref == 0) {
  44731. 802fca0: b9be cbnz r6, 802fcd2 <pbuf_free+0x4a>
  44732. /* remember next pbuf in chain for next iteration */
  44733. q = p->next;
  44734. LWIP_DEBUGF( PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_free: deallocating %p\n", (void *)p));
  44735. type = p->type;
  44736. 802fca2: 7b23 ldrb r3, [r4, #12]
  44737. ref = --(p->ref);
  44738. SYS_ARCH_UNPROTECT(old_level);
  44739. /* this pbuf is no longer referenced to? */
  44740. if (ref == 0) {
  44741. /* remember next pbuf in chain for next iteration */
  44742. q = p->next;
  44743. 802fca4: 6826 ldr r6, [r4, #0]
  44744. pc->custom_free_function(p);
  44745. } else
  44746. #endif /* LWIP_SUPPORT_CUSTOM_PBUF */
  44747. {
  44748. /* is this a pbuf from the pool? */
  44749. if (type == PBUF_POOL) {
  44750. 802fca6: 2b03 cmp r3, #3
  44751. 802fca8: d101 bne.n 802fcae <pbuf_free+0x26>
  44752. memp_free(MEMP_PBUF_POOL, p);
  44753. 802fcaa: 200f movs r0, #15
  44754. 802fcac: e003 b.n 802fcb6 <pbuf_free+0x2e>
  44755. /* is this a ROM or RAM referencing pbuf? */
  44756. } else if (type == PBUF_ROM || type == PBUF_REF) {
  44757. 802fcae: 3b01 subs r3, #1
  44758. 802fcb0: 2b01 cmp r3, #1
  44759. 802fcb2: d804 bhi.n 802fcbe <pbuf_free+0x36>
  44760. memp_free(MEMP_PBUF, p);
  44761. 802fcb4: 200e movs r0, #14
  44762. 802fcb6: 4621 mov r1, r4
  44763. 802fcb8: f7ff fedc bl 802fa74 <memp_free>
  44764. 802fcbc: e002 b.n 802fcc4 <pbuf_free+0x3c>
  44765. /* type == PBUF_RAM */
  44766. } else {
  44767. mem_free(p);
  44768. 802fcbe: 4620 mov r0, r4
  44769. 802fcc0: f7ff fd70 bl 802f7a4 <mem_free>
  44770. }
  44771. }
  44772. count++;
  44773. 802fcc4: 3501 adds r5, #1
  44774. 802fcc6: b2ed uxtb r5, r5
  44775. p->type == PBUF_REF || p->type == PBUF_POOL);
  44776. count = 0;
  44777. /* de-allocate all consecutive pbufs from the head of the chain that
  44778. * obtain a zero reference count after decrementing*/
  44779. while (p != NULL) {
  44780. 802fcc8: 4634 mov r4, r6
  44781. 802fcca: 2e00 cmp r6, #0
  44782. 802fccc: d1e0 bne.n 802fc90 <pbuf_free+0x8>
  44783. 802fcce: e000 b.n 802fcd2 <pbuf_free+0x4a>
  44784. if (p == NULL) {
  44785. LWIP_ASSERT("p != NULL", p != NULL);
  44786. /* if assertions are disabled, proceed with debug output */
  44787. LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_LEVEL_SERIOUS,
  44788. ("pbuf_free(p == NULL) was called.\n"));
  44789. return 0;
  44790. 802fcd0: 4605 mov r5, r0
  44791. }
  44792. }
  44793. PERF_STOP("pbuf_free");
  44794. /* return number of de-allocated pbufs */
  44795. return count;
  44796. }
  44797. 802fcd2: 4628 mov r0, r5
  44798. 802fcd4: bd70 pop {r4, r5, r6, pc}
  44799. 0802fcd6 <pbuf_realloc>:
  44800. *
  44801. * @note Despite its name, pbuf_realloc cannot grow the size of a pbuf (chain).
  44802. */
  44803. void
  44804. pbuf_realloc(struct pbuf *p, u16_t new_len)
  44805. {
  44806. 802fcd6: b538 push {r3, r4, r5, lr}
  44807. p->type == PBUF_ROM ||
  44808. p->type == PBUF_RAM ||
  44809. p->type == PBUF_REF);
  44810. /* desired length larger than current length? */
  44811. if (new_len >= p->tot_len) {
  44812. 802fcd8: 8903 ldrh r3, [r0, #8]
  44813. 802fcda: 4299 cmp r1, r3
  44814. 802fcdc: d220 bcs.n 802fd20 <pbuf_realloc+0x4a>
  44815. return;
  44816. }
  44817. /* the pbuf chain grows by (new_len - p->tot_len) bytes
  44818. * (which may be negative in case of shrinking) */
  44819. grow = new_len - p->tot_len;
  44820. 802fcde: 1aca subs r2, r1, r3
  44821. /* first, step over any pbufs that should remain in the chain */
  44822. rem_len = new_len;
  44823. q = p;
  44824. /* should this pbuf be kept? */
  44825. while (rem_len > q->len) {
  44826. 802fce0: 460d mov r5, r1
  44827. 802fce2: 4604 mov r4, r0
  44828. 802fce4: e005 b.n 802fcf2 <pbuf_realloc+0x1c>
  44829. /* decrease remaining length by pbuf length */
  44830. rem_len -= q->len;
  44831. 802fce6: 1aed subs r5, r5, r3
  44832. /* decrease total length indicator */
  44833. LWIP_ASSERT("grow < max_u16_t", grow < 0xffff);
  44834. q->tot_len += (u16_t)grow;
  44835. 802fce8: 8923 ldrh r3, [r4, #8]
  44836. 802fcea: 18d3 adds r3, r2, r3
  44837. 802fcec: 8123 strh r3, [r4, #8]
  44838. /* proceed to next pbuf in chain */
  44839. q = q->next;
  44840. 802fcee: 6824 ldr r4, [r4, #0]
  44841. rem_len = new_len;
  44842. q = p;
  44843. /* should this pbuf be kept? */
  44844. while (rem_len > q->len) {
  44845. /* decrease remaining length by pbuf length */
  44846. rem_len -= q->len;
  44847. 802fcf0: b2ad uxth r5, r5
  44848. /* first, step over any pbufs that should remain in the chain */
  44849. rem_len = new_len;
  44850. q = p;
  44851. /* should this pbuf be kept? */
  44852. while (rem_len > q->len) {
  44853. 802fcf2: 8963 ldrh r3, [r4, #10]
  44854. 802fcf4: 429d cmp r5, r3
  44855. 802fcf6: d8f6 bhi.n 802fce6 <pbuf_realloc+0x10>
  44856. /* we have now reached the new last pbuf (in q) */
  44857. /* rem_len == desired length for pbuf q */
  44858. /* shrink allocated memory for PBUF_RAM */
  44859. /* (other types merely adjust their length fields */
  44860. if ((q->type == PBUF_RAM) && (rem_len != q->len)) {
  44861. 802fcf8: 7b22 ldrb r2, [r4, #12]
  44862. 802fcfa: b94a cbnz r2, 802fd10 <pbuf_realloc+0x3a>
  44863. 802fcfc: 429d cmp r5, r3
  44864. 802fcfe: d007 beq.n 802fd10 <pbuf_realloc+0x3a>
  44865. /* reallocate and adjust the length of the pbuf that will be split */
  44866. q = (struct pbuf *)mem_trim(q, (u16_t)((u8_t *)q->payload - (u8_t *)q) + rem_len);
  44867. 802fd00: 6863 ldr r3, [r4, #4]
  44868. 802fd02: 1b1b subs r3, r3, r4
  44869. 802fd04: 18e9 adds r1, r5, r3
  44870. 802fd06: 4620 mov r0, r4
  44871. 802fd08: b289 uxth r1, r1
  44872. 802fd0a: f7ff fda5 bl 802f858 <mem_trim>
  44873. 802fd0e: 4604 mov r4, r0
  44874. /* adjust length fields for new last pbuf */
  44875. q->len = rem_len;
  44876. q->tot_len = q->len;
  44877. /* any remaining pbufs in chain? */
  44878. if (q->next != NULL) {
  44879. 802fd10: 6820 ldr r0, [r4, #0]
  44880. /* reallocate and adjust the length of the pbuf that will be split */
  44881. q = (struct pbuf *)mem_trim(q, (u16_t)((u8_t *)q->payload - (u8_t *)q) + rem_len);
  44882. LWIP_ASSERT("mem_trim returned q == NULL", q != NULL);
  44883. }
  44884. /* adjust length fields for new last pbuf */
  44885. q->len = rem_len;
  44886. 802fd12: 8165 strh r5, [r4, #10]
  44887. q->tot_len = q->len;
  44888. 802fd14: 8125 strh r5, [r4, #8]
  44889. /* any remaining pbufs in chain? */
  44890. if (q->next != NULL) {
  44891. 802fd16: b108 cbz r0, 802fd1c <pbuf_realloc+0x46>
  44892. /* free remaining pbufs in chain */
  44893. pbuf_free(q->next);
  44894. 802fd18: f7ff ffb6 bl 802fc88 <pbuf_free>
  44895. }
  44896. /* q is last packet in chain */
  44897. q->next = NULL;
  44898. 802fd1c: 2300 movs r3, #0
  44899. 802fd1e: 6023 str r3, [r4, #0]
  44900. 802fd20: bd38 pop {r3, r4, r5, pc}
  44901. 0802fd22 <pbuf_alloc>:
  44902. * @return the allocated pbuf. If multiple pbufs where allocated, this
  44903. * is the first pbuf of a pbuf chain.
  44904. */
  44905. struct pbuf *
  44906. pbuf_alloc(pbuf_layer layer, u16_t length, pbuf_type type)
  44907. {
  44908. 802fd22: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
  44909. 802fd26: 460d mov r5, r1
  44910. 802fd28: 4617 mov r7, r2
  44911. u16_t offset;
  44912. s32_t rem_len; /* remaining length */
  44913. LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_alloc(length=%"U16_F")\n", length));
  44914. /* determine header offset */
  44915. switch (layer) {
  44916. 802fd2a: 2803 cmp r0, #3
  44917. 802fd2c: d87c bhi.n 802fe28 <pbuf_alloc+0x106>
  44918. 802fd2e: e8df f000 tbb [pc, r0]
  44919. 802fd32: 0802 .short 0x0802
  44920. 802fd34: 0604 .short 0x0604
  44921. case PBUF_TRANSPORT:
  44922. /* add room for transport (often TCP) layer header */
  44923. offset = PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN;
  44924. 802fd36: 2636 movs r6, #54 ; 0x36
  44925. 802fd38: e004 b.n 802fd44 <pbuf_alloc+0x22>
  44926. /* add room for IP layer header */
  44927. offset = PBUF_LINK_HLEN + PBUF_IP_HLEN;
  44928. break;
  44929. case PBUF_LINK:
  44930. /* add room for link layer header */
  44931. offset = PBUF_LINK_HLEN;
  44932. 802fd3a: 260e movs r6, #14
  44933. break;
  44934. 802fd3c: e002 b.n 802fd44 <pbuf_alloc+0x22>
  44935. case PBUF_RAW:
  44936. offset = 0;
  44937. 802fd3e: 2600 movs r6, #0
  44938. break;
  44939. 802fd40: e000 b.n 802fd44 <pbuf_alloc+0x22>
  44940. /* add room for transport (often TCP) layer header */
  44941. offset = PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN;
  44942. break;
  44943. case PBUF_IP:
  44944. /* add room for IP layer header */
  44945. offset = PBUF_LINK_HLEN + PBUF_IP_HLEN;
  44946. 802fd42: 2622 movs r6, #34 ; 0x22
  44947. default:
  44948. LWIP_ASSERT("pbuf_alloc: bad pbuf layer", 0);
  44949. return NULL;
  44950. }
  44951. switch (type) {
  44952. 802fd44: 2f03 cmp r7, #3
  44953. 802fd46: d86f bhi.n 802fe28 <pbuf_alloc+0x106>
  44954. 802fd48: e8df f007 tbb [pc, r7]
  44955. 802fd4c: 025e5e46 .word 0x025e5e46
  44956. case PBUF_POOL:
  44957. /* allocate head of pbuf chain into p */
  44958. p = (struct pbuf *)memp_malloc(MEMP_PBUF_POOL);
  44959. 802fd50: 200f movs r0, #15
  44960. 802fd52: f7ff fe79 bl 802fa48 <memp_malloc>
  44961. LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_alloc: allocated pbuf %p\n", (void *)p));
  44962. if (p == NULL) {
  44963. 802fd56: 4604 mov r4, r0
  44964. 802fd58: b900 cbnz r0, 802fd5c <pbuf_alloc+0x3a>
  44965. 802fd5a: e065 b.n 802fe28 <pbuf_alloc+0x106>
  44966. }
  44967. p->type = type;
  44968. p->next = NULL;
  44969. /* make the payload pointer point 'offset' bytes into pbuf data memory */
  44970. p->payload = LWIP_MEM_ALIGN((void *)((u8_t *)p + (SIZEOF_STRUCT_PBUF + offset)));
  44971. 802fd5c: 1982 adds r2, r0, r6
  44972. LWIP_ASSERT("pbuf_alloc: pbuf p->payload properly aligned",
  44973. ((mem_ptr_t)p->payload % MEM_ALIGNMENT) == 0);
  44974. /* the total length of the pbuf chain is the requested size */
  44975. p->tot_len = length;
  44976. /* set the length of the first pbuf in the chain */
  44977. p->len = LWIP_MIN(length, PBUF_POOL_BUFSIZE_ALIGNED - LWIP_MEM_ALIGN_SIZE(offset));
  44978. 802fd5e: 3603 adds r6, #3
  44979. 802fd60: f026 0603 bic.w r6, r6, #3
  44980. }
  44981. p->type = type;
  44982. p->next = NULL;
  44983. /* make the payload pointer point 'offset' bytes into pbuf data memory */
  44984. p->payload = LWIP_MEM_ALIGN((void *)((u8_t *)p + (SIZEOF_STRUCT_PBUF + offset)));
  44985. 802fd64: 3213 adds r2, #19
  44986. LWIP_ASSERT("pbuf_alloc: pbuf p->payload properly aligned",
  44987. ((mem_ptr_t)p->payload % MEM_ALIGNMENT) == 0);
  44988. /* the total length of the pbuf chain is the requested size */
  44989. p->tot_len = length;
  44990. /* set the length of the first pbuf in the chain */
  44991. p->len = LWIP_MIN(length, PBUF_POOL_BUFSIZE_ALIGNED - LWIP_MEM_ALIGN_SIZE(offset));
  44992. 802fd66: f5c6 66c0 rsb r6, r6, #1536 ; 0x600
  44993. LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_alloc: allocated pbuf %p\n", (void *)p));
  44994. if (p == NULL) {
  44995. PBUF_POOL_IS_EMPTY();
  44996. return NULL;
  44997. }
  44998. p->type = type;
  44999. 802fd6a: 2303 movs r3, #3
  45000. p->next = NULL;
  45001. /* make the payload pointer point 'offset' bytes into pbuf data memory */
  45002. p->payload = LWIP_MEM_ALIGN((void *)((u8_t *)p + (SIZEOF_STRUCT_PBUF + offset)));
  45003. 802fd6c: f022 0203 bic.w r2, r2, #3
  45004. LWIP_ASSERT("pbuf_alloc: pbuf p->payload properly aligned",
  45005. ((mem_ptr_t)p->payload % MEM_ALIGNMENT) == 0);
  45006. /* the total length of the pbuf chain is the requested size */
  45007. p->tot_len = length;
  45008. /* set the length of the first pbuf in the chain */
  45009. p->len = LWIP_MIN(length, PBUF_POOL_BUFSIZE_ALIGNED - LWIP_MEM_ALIGN_SIZE(offset));
  45010. 802fd70: 3604 adds r6, #4
  45011. 802fd72: 42ae cmp r6, r5
  45012. 802fd74: bfa8 it ge
  45013. 802fd76: 462e movge r6, r5
  45014. LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_alloc: allocated pbuf %p\n", (void *)p));
  45015. if (p == NULL) {
  45016. PBUF_POOL_IS_EMPTY();
  45017. return NULL;
  45018. }
  45019. p->type = type;
  45020. 802fd78: 7303 strb r3, [r0, #12]
  45021. p->next = NULL;
  45022. /* make the payload pointer point 'offset' bytes into pbuf data memory */
  45023. p->payload = LWIP_MEM_ALIGN((void *)((u8_t *)p + (SIZEOF_STRUCT_PBUF + offset)));
  45024. 802fd7a: 6042 str r2, [r0, #4]
  45025. if (p == NULL) {
  45026. PBUF_POOL_IS_EMPTY();
  45027. return NULL;
  45028. }
  45029. p->type = type;
  45030. p->next = NULL;
  45031. 802fd7c: 2300 movs r3, #0
  45032. ((u8_t*)p->payload + p->len <=
  45033. (u8_t*)p + SIZEOF_STRUCT_PBUF + PBUF_POOL_BUFSIZE_ALIGNED));
  45034. LWIP_ASSERT("PBUF_POOL_BUFSIZE must be bigger than MEM_ALIGNMENT",
  45035. (PBUF_POOL_BUFSIZE_ALIGNED - LWIP_MEM_ALIGN_SIZE(offset)) > 0 );
  45036. /* set reference count (needed here in case we fail) */
  45037. p->ref = 1;
  45038. 802fd7e: 2201 movs r2, #1
  45039. LWIP_ASSERT("pbuf_alloc: pbuf p->payload properly aligned",
  45040. ((mem_ptr_t)p->payload % MEM_ALIGNMENT) == 0);
  45041. /* the total length of the pbuf chain is the requested size */
  45042. p->tot_len = length;
  45043. /* set the length of the first pbuf in the chain */
  45044. p->len = LWIP_MIN(length, PBUF_POOL_BUFSIZE_ALIGNED - LWIP_MEM_ALIGN_SIZE(offset));
  45045. 802fd80: 8146 strh r6, [r0, #10]
  45046. if (p == NULL) {
  45047. PBUF_POOL_IS_EMPTY();
  45048. return NULL;
  45049. }
  45050. p->type = type;
  45051. p->next = NULL;
  45052. 802fd82: 6003 str r3, [r0, #0]
  45053. /* make the payload pointer point 'offset' bytes into pbuf data memory */
  45054. p->payload = LWIP_MEM_ALIGN((void *)((u8_t *)p + (SIZEOF_STRUCT_PBUF + offset)));
  45055. LWIP_ASSERT("pbuf_alloc: pbuf p->payload properly aligned",
  45056. ((mem_ptr_t)p->payload % MEM_ALIGNMENT) == 0);
  45057. /* the total length of the pbuf chain is the requested size */
  45058. p->tot_len = length;
  45059. 802fd84: 8105 strh r5, [r0, #8]
  45060. ((u8_t*)p->payload + p->len <=
  45061. (u8_t*)p + SIZEOF_STRUCT_PBUF + PBUF_POOL_BUFSIZE_ALIGNED));
  45062. LWIP_ASSERT("PBUF_POOL_BUFSIZE must be bigger than MEM_ALIGNMENT",
  45063. (PBUF_POOL_BUFSIZE_ALIGNED - LWIP_MEM_ALIGN_SIZE(offset)) > 0 );
  45064. /* set reference count (needed here in case we fail) */
  45065. p->ref = 1;
  45066. 802fd86: 81c2 strh r2, [r0, #14]
  45067. /* now allocate the tail of the pbuf chain */
  45068. /* remember first pbuf for linkage in next iteration */
  45069. r = p;
  45070. /* remaining length to be allocated */
  45071. rem_len = length - p->len;
  45072. 802fd88: 1bae subs r6, r5, r6
  45073. /* any remaining pbufs to be allocated? */
  45074. while (rem_len > 0) {
  45075. 802fd8a: 4607 mov r7, r0
  45076. 802fd8c: 4698 mov r8, r3
  45077. r->next = q;
  45078. /* set total length of this pbuf and next in chain */
  45079. LWIP_ASSERT("rem_len < max_u16_t", rem_len < 0xffff);
  45080. q->tot_len = (u16_t)rem_len;
  45081. /* this pbuf length is pool size, unless smaller sized tail */
  45082. q->len = LWIP_MIN((u16_t)rem_len, PBUF_POOL_BUFSIZE_ALIGNED);
  45083. 802fd8e: f240 6903 movw r9, #1539 ; 0x603
  45084. 802fd92: f240 6a04 movw sl, #1540 ; 0x604
  45085. /* remember first pbuf for linkage in next iteration */
  45086. r = p;
  45087. /* remaining length to be allocated */
  45088. rem_len = length - p->len;
  45089. /* any remaining pbufs to be allocated? */
  45090. while (rem_len > 0) {
  45091. 802fd96: e01c b.n 802fdd2 <pbuf_alloc+0xb0>
  45092. q = (struct pbuf *)memp_malloc(MEMP_PBUF_POOL);
  45093. 802fd98: 200f movs r0, #15
  45094. 802fd9a: f7ff fe55 bl 802fa48 <memp_malloc>
  45095. if (q == NULL) {
  45096. 802fd9e: 4605 mov r5, r0
  45097. 802fda0: b918 cbnz r0, 802fdaa <pbuf_alloc+0x88>
  45098. PBUF_POOL_IS_EMPTY();
  45099. /* free chain so far allocated */
  45100. pbuf_free(p);
  45101. 802fda2: 4620 mov r0, r4
  45102. 802fda4: f7ff ff70 bl 802fc88 <pbuf_free>
  45103. 802fda8: e03e b.n 802fe28 <pbuf_alloc+0x106>
  45104. /* bail out unsuccesfully */
  45105. return NULL;
  45106. }
  45107. q->type = type;
  45108. 802fdaa: 2303 movs r3, #3
  45109. /* set total length of this pbuf and next in chain */
  45110. LWIP_ASSERT("rem_len < max_u16_t", rem_len < 0xffff);
  45111. q->tot_len = (u16_t)rem_len;
  45112. /* this pbuf length is pool size, unless smaller sized tail */
  45113. q->len = LWIP_MIN((u16_t)rem_len, PBUF_POOL_BUFSIZE_ALIGNED);
  45114. q->payload = (void *)((u8_t *)q + SIZEOF_STRUCT_PBUF);
  45115. 802fdac: f100 0210 add.w r2, r0, #16
  45116. /* free chain so far allocated */
  45117. pbuf_free(p);
  45118. /* bail out unsuccesfully */
  45119. return NULL;
  45120. }
  45121. q->type = type;
  45122. 802fdb0: 7303 strb r3, [r0, #12]
  45123. q->next = NULL;
  45124. /* make previous pbuf point to this pbuf */
  45125. r->next = q;
  45126. /* set total length of this pbuf and next in chain */
  45127. LWIP_ASSERT("rem_len < max_u16_t", rem_len < 0xffff);
  45128. q->tot_len = (u16_t)rem_len;
  45129. 802fdb2: b2b3 uxth r3, r6
  45130. 802fdb4: 8103 strh r3, [r0, #8]
  45131. /* this pbuf length is pool size, unless smaller sized tail */
  45132. q->len = LWIP_MIN((u16_t)rem_len, PBUF_POOL_BUFSIZE_ALIGNED);
  45133. q->payload = (void *)((u8_t *)q + SIZEOF_STRUCT_PBUF);
  45134. 802fdb6: 6042 str r2, [r0, #4]
  45135. r->next = q;
  45136. /* set total length of this pbuf and next in chain */
  45137. LWIP_ASSERT("rem_len < max_u16_t", rem_len < 0xffff);
  45138. q->tot_len = (u16_t)rem_len;
  45139. /* this pbuf length is pool size, unless smaller sized tail */
  45140. q->len = LWIP_MIN((u16_t)rem_len, PBUF_POOL_BUFSIZE_ALIGNED);
  45141. 802fdb8: 454b cmp r3, r9
  45142. 802fdba: bf88 it hi
  45143. 802fdbc: 4653 movhi r3, sl
  45144. LWIP_ASSERT("pbuf_alloc: pbuf q->payload properly aligned",
  45145. ((mem_ptr_t)q->payload % MEM_ALIGNMENT) == 0);
  45146. LWIP_ASSERT("check p->payload + p->len does not overflow pbuf",
  45147. ((u8_t*)p->payload + p->len <=
  45148. (u8_t*)p + SIZEOF_STRUCT_PBUF + PBUF_POOL_BUFSIZE_ALIGNED));
  45149. q->ref = 1;
  45150. 802fdbe: 2201 movs r2, #1
  45151. /* bail out unsuccesfully */
  45152. return NULL;
  45153. }
  45154. q->type = type;
  45155. q->flags = 0;
  45156. q->next = NULL;
  45157. 802fdc0: f8c0 8000 str.w r8, [r0]
  45158. pbuf_free(p);
  45159. /* bail out unsuccesfully */
  45160. return NULL;
  45161. }
  45162. q->type = type;
  45163. q->flags = 0;
  45164. 802fdc4: f880 800d strb.w r8, [r0, #13]
  45165. q->next = NULL;
  45166. /* make previous pbuf point to this pbuf */
  45167. r->next = q;
  45168. 802fdc8: 6038 str r0, [r7, #0]
  45169. /* set total length of this pbuf and next in chain */
  45170. LWIP_ASSERT("rem_len < max_u16_t", rem_len < 0xffff);
  45171. q->tot_len = (u16_t)rem_len;
  45172. /* this pbuf length is pool size, unless smaller sized tail */
  45173. q->len = LWIP_MIN((u16_t)rem_len, PBUF_POOL_BUFSIZE_ALIGNED);
  45174. 802fdca: 8143 strh r3, [r0, #10]
  45175. LWIP_ASSERT("pbuf_alloc: pbuf q->payload properly aligned",
  45176. ((mem_ptr_t)q->payload % MEM_ALIGNMENT) == 0);
  45177. LWIP_ASSERT("check p->payload + p->len does not overflow pbuf",
  45178. ((u8_t*)p->payload + p->len <=
  45179. (u8_t*)p + SIZEOF_STRUCT_PBUF + PBUF_POOL_BUFSIZE_ALIGNED));
  45180. q->ref = 1;
  45181. 802fdcc: 81c2 strh r2, [r0, #14]
  45182. /* calculate remaining length to be allocated */
  45183. rem_len -= q->len;
  45184. 802fdce: 1af6 subs r6, r6, r3
  45185. 802fdd0: 4607 mov r7, r0
  45186. /* remember first pbuf for linkage in next iteration */
  45187. r = p;
  45188. /* remaining length to be allocated */
  45189. rem_len = length - p->len;
  45190. /* any remaining pbufs to be allocated? */
  45191. while (rem_len > 0) {
  45192. 802fdd2: 2e00 cmp r6, #0
  45193. 802fdd4: dce0 bgt.n 802fd98 <pbuf_alloc+0x76>
  45194. 802fdd6: e022 b.n 802fe1e <pbuf_alloc+0xfc>
  45195. /*r->next = NULL;*/
  45196. break;
  45197. case PBUF_RAM:
  45198. /* If pbuf is to be allocated in RAM, allocate memory for it. */
  45199. p = (struct pbuf*)mem_malloc(LWIP_MEM_ALIGN_SIZE(SIZEOF_STRUCT_PBUF + offset) + LWIP_MEM_ALIGN_SIZE(length));
  45200. 802fdd8: f106 0013 add.w r0, r6, #19
  45201. 802fddc: 1ceb adds r3, r5, #3
  45202. 802fdde: f023 0303 bic.w r3, r3, #3
  45203. 802fde2: f020 0003 bic.w r0, r0, #3
  45204. 802fde6: 18c0 adds r0, r0, r3
  45205. 802fde8: b280 uxth r0, r0
  45206. 802fdea: f7ff fda3 bl 802f934 <mem_malloc>
  45207. if (p == NULL) {
  45208. 802fdee: 4604 mov r4, r0
  45209. 802fdf0: b1d0 cbz r0, 802fe28 <pbuf_alloc+0x106>
  45210. return NULL;
  45211. }
  45212. /* Set up internal structure of the pbuf. */
  45213. p->payload = LWIP_MEM_ALIGN((void *)((u8_t *)p + SIZEOF_STRUCT_PBUF + offset));
  45214. 802fdf2: 1986 adds r6, r0, r6
  45215. 802fdf4: 3613 adds r6, #19
  45216. p->len = p->tot_len = length;
  45217. p->next = NULL;
  45218. 802fdf6: 2300 movs r3, #0
  45219. p = (struct pbuf*)mem_malloc(LWIP_MEM_ALIGN_SIZE(SIZEOF_STRUCT_PBUF + offset) + LWIP_MEM_ALIGN_SIZE(length));
  45220. if (p == NULL) {
  45221. return NULL;
  45222. }
  45223. /* Set up internal structure of the pbuf. */
  45224. p->payload = LWIP_MEM_ALIGN((void *)((u8_t *)p + SIZEOF_STRUCT_PBUF + offset));
  45225. 802fdf8: f026 0603 bic.w r6, r6, #3
  45226. 802fdfc: 6046 str r6, [r0, #4]
  45227. p->len = p->tot_len = length;
  45228. 802fdfe: 8105 strh r5, [r0, #8]
  45229. 802fe00: 8145 strh r5, [r0, #10]
  45230. p->next = NULL;
  45231. 802fe02: 6003 str r3, [r0, #0]
  45232. p->type = type;
  45233. 802fe04: 7303 strb r3, [r0, #12]
  45234. 802fe06: e00a b.n 802fe1e <pbuf_alloc+0xfc>
  45235. /* pbuf references existing (non-volatile static constant) ROM payload? */
  45236. case PBUF_ROM:
  45237. /* pbuf references existing (externally allocated) RAM payload? */
  45238. case PBUF_REF:
  45239. /* only allocate memory for the pbuf structure */
  45240. p = (struct pbuf *)memp_malloc(MEMP_PBUF);
  45241. 802fe08: 200e movs r0, #14
  45242. 802fe0a: f7ff fe1d bl 802fa48 <memp_malloc>
  45243. if (p == NULL) {
  45244. 802fe0e: 4604 mov r4, r0
  45245. 802fe10: b150 cbz r0, 802fe28 <pbuf_alloc+0x106>
  45246. ("pbuf_alloc: Could not allocate MEMP_PBUF for PBUF_%s.\n",
  45247. (type == PBUF_ROM) ? "ROM" : "REF"));
  45248. return NULL;
  45249. }
  45250. /* caller must set this field properly, afterwards */
  45251. p->payload = NULL;
  45252. 802fe12: 2300 movs r3, #0
  45253. 802fe14: 6043 str r3, [r0, #4]
  45254. p->len = p->tot_len = length;
  45255. 802fe16: 8105 strh r5, [r0, #8]
  45256. 802fe18: 8145 strh r5, [r0, #10]
  45257. p->next = NULL;
  45258. 802fe1a: 6003 str r3, [r0, #0]
  45259. p->type = type;
  45260. 802fe1c: 7307 strb r7, [r0, #12]
  45261. default:
  45262. LWIP_ASSERT("pbuf_alloc: erroneous type", 0);
  45263. return NULL;
  45264. }
  45265. /* set reference count */
  45266. p->ref = 1;
  45267. 802fe1e: 2301 movs r3, #1
  45268. 802fe20: 81e3 strh r3, [r4, #14]
  45269. /* set flags */
  45270. p->flags = 0;
  45271. 802fe22: 2300 movs r3, #0
  45272. 802fe24: 7363 strb r3, [r4, #13]
  45273. LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_alloc(length=%"U16_F") == %p\n", length, (void *)p));
  45274. return p;
  45275. 802fe26: e000 b.n 802fe2a <pbuf_alloc+0x108>
  45276. p->next = NULL;
  45277. p->type = type;
  45278. break;
  45279. default:
  45280. LWIP_ASSERT("pbuf_alloc: erroneous type", 0);
  45281. return NULL;
  45282. 802fe28: 2400 movs r4, #0
  45283. p->ref = 1;
  45284. /* set flags */
  45285. p->flags = 0;
  45286. LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_alloc(length=%"U16_F") == %p\n", length, (void *)p));
  45287. return p;
  45288. }
  45289. 802fe2a: 4620 mov r0, r4
  45290. 802fe2c: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc}
  45291. 0802fe30 <pbuf_clen>:
  45292. * @return the number of pbufs in a chain
  45293. */
  45294. u8_t
  45295. pbuf_clen(struct pbuf *p)
  45296. {
  45297. 802fe30: 4603 mov r3, r0
  45298. u8_t len;
  45299. len = 0;
  45300. 802fe32: 2000 movs r0, #0
  45301. while (p != NULL) {
  45302. 802fe34: e002 b.n 802fe3c <pbuf_clen+0xc>
  45303. ++len;
  45304. 802fe36: 3001 adds r0, #1
  45305. p = p->next;
  45306. 802fe38: 681b ldr r3, [r3, #0]
  45307. {
  45308. u8_t len;
  45309. len = 0;
  45310. while (p != NULL) {
  45311. ++len;
  45312. 802fe3a: b2c0 uxtb r0, r0
  45313. pbuf_clen(struct pbuf *p)
  45314. {
  45315. u8_t len;
  45316. len = 0;
  45317. while (p != NULL) {
  45318. 802fe3c: 2b00 cmp r3, #0
  45319. 802fe3e: d1fa bne.n 802fe36 <pbuf_clen+0x6>
  45320. ++len;
  45321. p = p->next;
  45322. }
  45323. return len;
  45324. }
  45325. 802fe40: 4770 bx lr
  45326. 0802fe42 <pbuf_ref>:
  45327. * @param p pbuf to increase reference counter of
  45328. *
  45329. */
  45330. void
  45331. pbuf_ref(struct pbuf *p)
  45332. {
  45333. 802fe42: b510 push {r4, lr}
  45334. SYS_ARCH_DECL_PROTECT(old_level);
  45335. /* pbuf given? */
  45336. if (p != NULL) {
  45337. 802fe44: 4604 mov r4, r0
  45338. 802fe46: b140 cbz r0, 802fe5a <pbuf_ref+0x18>
  45339. SYS_ARCH_PROTECT(old_level);
  45340. 802fe48: f007 fbc2 bl 80375d0 <sys_arch_protect>
  45341. ++(p->ref);
  45342. 802fe4c: 89e3 ldrh r3, [r4, #14]
  45343. 802fe4e: 3301 adds r3, #1
  45344. 802fe50: 81e3 strh r3, [r4, #14]
  45345. SYS_ARCH_UNPROTECT(old_level);
  45346. }
  45347. }
  45348. 802fe52: e8bd 4010 ldmia.w sp!, {r4, lr}
  45349. SYS_ARCH_DECL_PROTECT(old_level);
  45350. /* pbuf given? */
  45351. if (p != NULL) {
  45352. SYS_ARCH_PROTECT(old_level);
  45353. ++(p->ref);
  45354. SYS_ARCH_UNPROTECT(old_level);
  45355. 802fe56: f007 bbc5 b.w 80375e4 <sys_arch_unprotect>
  45356. 802fe5a: bd10 pop {r4, pc}
  45357. 0802fe5c <pbuf_cat>:
  45358. * @see pbuf_chain()
  45359. */
  45360. void
  45361. pbuf_cat(struct pbuf *h, struct pbuf *t)
  45362. {
  45363. 802fe5c: b510 push {r4, lr}
  45364. struct pbuf *p;
  45365. LWIP_ERROR("(h != NULL) && (t != NULL) (programmer violates API)",
  45366. 802fe5e: b168 cbz r0, 802fe7c <pbuf_cat+0x20>
  45367. 802fe60: b161 cbz r1, 802fe7c <pbuf_cat+0x20>
  45368. 802fe62: e003 b.n 802fe6c <pbuf_cat+0x10>
  45369. ((h != NULL) && (t != NULL)), return;);
  45370. /* proceed to last pbuf of chain */
  45371. for (p = h; p->next != NULL; p = p->next) {
  45372. /* add total length of second chain to all totals of first chain */
  45373. p->tot_len += t->tot_len;
  45374. 802fe64: 8904 ldrh r4, [r0, #8]
  45375. 802fe66: 191b adds r3, r3, r4
  45376. 802fe68: 8103 strh r3, [r0, #8]
  45377. LWIP_ERROR("(h != NULL) && (t != NULL) (programmer violates API)",
  45378. ((h != NULL) && (t != NULL)), return;);
  45379. /* proceed to last pbuf of chain */
  45380. for (p = h; p->next != NULL; p = p->next) {
  45381. 802fe6a: 4610 mov r0, r2
  45382. 802fe6c: 6802 ldr r2, [r0, #0]
  45383. 802fe6e: 890b ldrh r3, [r1, #8]
  45384. 802fe70: 2a00 cmp r2, #0
  45385. 802fe72: d1f7 bne.n 802fe64 <pbuf_cat+0x8>
  45386. }
  45387. /* { p is last pbuf of first h chain, p->next == NULL } */
  45388. LWIP_ASSERT("p->tot_len == p->len (of last pbuf in chain)", p->tot_len == p->len);
  45389. LWIP_ASSERT("p->next == NULL", p->next == NULL);
  45390. /* add total length of second chain to last pbuf total of first chain */
  45391. p->tot_len += t->tot_len;
  45392. 802fe74: 8902 ldrh r2, [r0, #8]
  45393. /* chain last pbuf of head (p) with first of tail (t) */
  45394. p->next = t;
  45395. 802fe76: 6001 str r1, [r0, #0]
  45396. }
  45397. /* { p is last pbuf of first h chain, p->next == NULL } */
  45398. LWIP_ASSERT("p->tot_len == p->len (of last pbuf in chain)", p->tot_len == p->len);
  45399. LWIP_ASSERT("p->next == NULL", p->next == NULL);
  45400. /* add total length of second chain to last pbuf total of first chain */
  45401. p->tot_len += t->tot_len;
  45402. 802fe78: 189b adds r3, r3, r2
  45403. 802fe7a: 8103 strh r3, [r0, #8]
  45404. 802fe7c: bd10 pop {r4, pc}
  45405. 0802fe7e <pbuf_chain>:
  45406. * The ->ref field of the first pbuf of the tail chain is adjusted.
  45407. *
  45408. */
  45409. void
  45410. pbuf_chain(struct pbuf *h, struct pbuf *t)
  45411. {
  45412. 802fe7e: b510 push {r4, lr}
  45413. 802fe80: 460c mov r4, r1
  45414. pbuf_cat(h, t);
  45415. 802fe82: f7ff ffeb bl 802fe5c <pbuf_cat>
  45416. /* t is now referenced by h */
  45417. pbuf_ref(t);
  45418. 802fe86: 4620 mov r0, r4
  45419. LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_chain: %p references %p\n", (void *)h, (void *)t));
  45420. }
  45421. 802fe88: e8bd 4010 ldmia.w sp!, {r4, lr}
  45422. void
  45423. pbuf_chain(struct pbuf *h, struct pbuf *t)
  45424. {
  45425. pbuf_cat(h, t);
  45426. /* t is now referenced by h */
  45427. pbuf_ref(t);
  45428. 802fe8c: f7ff bfd9 b.w 802fe42 <pbuf_ref>
  45429. 0802fe90 <pbuf_copy>:
  45430. * ERR_ARG if one of the pbufs is NULL or p_to is not big
  45431. * enough to hold p_from
  45432. */
  45433. err_t
  45434. pbuf_copy(struct pbuf *p_to, struct pbuf *p_from)
  45435. {
  45436. 802fe90: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  45437. 802fe94: 460c mov r4, r1
  45438. LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_copy(%p, %p)\n",
  45439. (void*)p_to, (void*)p_from));
  45440. /* is the target big enough to hold the source? */
  45441. LWIP_ERROR("pbuf_copy: target not big enough to hold source", ((p_to != NULL) &&
  45442. 802fe96: 4605 mov r5, r0
  45443. 802fe98: b908 cbnz r0, 802fe9e <pbuf_copy+0xe>
  45444. 802fe9a: 20f2 movs r0, #242 ; 0xf2
  45445. 802fe9c: e03f b.n 802ff1e <pbuf_copy+0x8e>
  45446. 802fe9e: 2900 cmp r1, #0
  45447. 802fea0: d0fb beq.n 802fe9a <pbuf_copy+0xa>
  45448. 802fea2: 8902 ldrh r2, [r0, #8]
  45449. 802fea4: 890b ldrh r3, [r1, #8]
  45450. 802fea6: 429a cmp r2, r3
  45451. 802fea8: d3f7 bcc.n 802fe9a <pbuf_copy+0xa>
  45452. 802feaa: 2600 movs r6, #0
  45453. 802feac: 4637 mov r7, r6
  45454. /* iterate through pbuf chain */
  45455. do
  45456. {
  45457. /* copy one part of the original chain */
  45458. if ((p_to->len - offset_to) >= (p_from->len - offset_from)) {
  45459. 802feae: f8b4 800a ldrh.w r8, [r4, #10]
  45460. 802feb2: 896b ldrh r3, [r5, #10]
  45461. len = p_from->len - offset_from;
  45462. } else {
  45463. /* current p_from does not fit into current p_to */
  45464. len = p_to->len - offset_to;
  45465. }
  45466. MEMCPY((u8_t*)p_to->payload + offset_to, (u8_t*)p_from->payload + offset_from, len);
  45467. 802feb4: 6861 ldr r1, [r4, #4]
  45468. 802feb6: 6868 ldr r0, [r5, #4]
  45469. /* iterate through pbuf chain */
  45470. do
  45471. {
  45472. /* copy one part of the original chain */
  45473. if ((p_to->len - offset_to) >= (p_from->len - offset_from)) {
  45474. 802feb8: ebc6 0808 rsb r8, r6, r8
  45475. 802febc: 1bdb subs r3, r3, r7
  45476. 802febe: 4543 cmp r3, r8
  45477. /* complete current p_from fits into current p_to */
  45478. len = p_from->len - offset_from;
  45479. } else {
  45480. /* current p_from does not fit into current p_to */
  45481. len = p_to->len - offset_to;
  45482. 802fec0: bfb4 ite lt
  45483. 802fec2: fa1f f883 uxthlt.w r8, r3
  45484. do
  45485. {
  45486. /* copy one part of the original chain */
  45487. if ((p_to->len - offset_to) >= (p_from->len - offset_from)) {
  45488. /* complete current p_from fits into current p_to */
  45489. len = p_from->len - offset_from;
  45490. 802fec6: fa1f f888 uxthge.w r8, r8
  45491. } else {
  45492. /* current p_from does not fit into current p_to */
  45493. len = p_to->len - offset_to;
  45494. }
  45495. MEMCPY((u8_t*)p_to->payload + offset_to, (u8_t*)p_from->payload + offset_from, len);
  45496. 802feca: 19c0 adds r0, r0, r7
  45497. 802fecc: 1989 adds r1, r1, r6
  45498. 802fece: 4642 mov r2, r8
  45499. 802fed0: f7f1 fee8 bl 8021ca4 <memcpy>
  45500. offset_to += len;
  45501. offset_from += len;
  45502. 802fed4: 4446 add r6, r8
  45503. LWIP_ASSERT("offset_to <= p_to->len", offset_to <= p_to->len);
  45504. LWIP_ASSERT("offset_from <= p_from->len", offset_from <= p_from->len);
  45505. if (offset_from >= p_from->len) {
  45506. 802fed6: 8963 ldrh r3, [r4, #10]
  45507. /* current p_from does not fit into current p_to */
  45508. len = p_to->len - offset_to;
  45509. }
  45510. MEMCPY((u8_t*)p_to->payload + offset_to, (u8_t*)p_from->payload + offset_from, len);
  45511. offset_to += len;
  45512. offset_from += len;
  45513. 802fed8: b2b6 uxth r6, r6
  45514. LWIP_ASSERT("offset_to <= p_to->len", offset_to <= p_to->len);
  45515. LWIP_ASSERT("offset_from <= p_from->len", offset_from <= p_from->len);
  45516. if (offset_from >= p_from->len) {
  45517. 802feda: 42b3 cmp r3, r6
  45518. } else {
  45519. /* current p_from does not fit into current p_to */
  45520. len = p_to->len - offset_to;
  45521. }
  45522. MEMCPY((u8_t*)p_to->payload + offset_to, (u8_t*)p_from->payload + offset_from, len);
  45523. offset_to += len;
  45524. 802fedc: 4447 add r7, r8
  45525. if (offset_from >= p_from->len) {
  45526. /* on to next p_from (if any) */
  45527. offset_from = 0;
  45528. p_from = p_from->next;
  45529. }
  45530. if (offset_to == p_to->len) {
  45531. 802fede: 896b ldrh r3, [r5, #10]
  45532. LWIP_ASSERT("offset_to <= p_to->len", offset_to <= p_to->len);
  45533. LWIP_ASSERT("offset_from <= p_from->len", offset_from <= p_from->len);
  45534. if (offset_from >= p_from->len) {
  45535. /* on to next p_from (if any) */
  45536. offset_from = 0;
  45537. p_from = p_from->next;
  45538. 802fee0: bf98 it ls
  45539. 802fee2: 6824 ldrls r4, [r4, #0]
  45540. } else {
  45541. /* current p_from does not fit into current p_to */
  45542. len = p_to->len - offset_to;
  45543. }
  45544. MEMCPY((u8_t*)p_to->payload + offset_to, (u8_t*)p_from->payload + offset_from, len);
  45545. offset_to += len;
  45546. 802fee4: b2bf uxth r7, r7
  45547. offset_from += len;
  45548. LWIP_ASSERT("offset_to <= p_to->len", offset_to <= p_to->len);
  45549. LWIP_ASSERT("offset_from <= p_from->len", offset_from <= p_from->len);
  45550. if (offset_from >= p_from->len) {
  45551. /* on to next p_from (if any) */
  45552. offset_from = 0;
  45553. 802fee6: bf98 it ls
  45554. 802fee8: 2600 movls r6, #0
  45555. p_from = p_from->next;
  45556. }
  45557. if (offset_to == p_to->len) {
  45558. 802feea: 42bb cmp r3, r7
  45559. 802feec: d105 bne.n 802fefa <pbuf_copy+0x6a>
  45560. /* on to next p_to (if any) */
  45561. offset_to = 0;
  45562. p_to = p_to->next;
  45563. 802feee: 682d ldr r5, [r5, #0]
  45564. LWIP_ERROR("p_to != NULL", (p_to != NULL) || (p_from == NULL) , return ERR_ARG;);
  45565. 802fef0: b915 cbnz r5, 802fef8 <pbuf_copy+0x68>
  45566. 802fef2: 2c00 cmp r4, #0
  45567. 802fef4: d1d1 bne.n 802fe9a <pbuf_copy+0xa>
  45568. 802fef6: e00f b.n 802ff18 <pbuf_copy+0x88>
  45569. offset_from = 0;
  45570. p_from = p_from->next;
  45571. }
  45572. if (offset_to == p_to->len) {
  45573. /* on to next p_to (if any) */
  45574. offset_to = 0;
  45575. 802fef8: 2700 movs r7, #0
  45576. p_to = p_to->next;
  45577. LWIP_ERROR("p_to != NULL", (p_to != NULL) || (p_from == NULL) , return ERR_ARG;);
  45578. }
  45579. if((p_from != NULL) && (p_from->len == p_from->tot_len)) {
  45580. 802fefa: b12c cbz r4, 802ff08 <pbuf_copy+0x78>
  45581. 802fefc: 8962 ldrh r2, [r4, #10]
  45582. 802fefe: 8923 ldrh r3, [r4, #8]
  45583. 802ff00: 429a cmp r2, r3
  45584. 802ff02: d101 bne.n 802ff08 <pbuf_copy+0x78>
  45585. /* don't copy more than one packet! */
  45586. LWIP_ERROR("pbuf_copy() does not allow packet queues!\n",
  45587. 802ff04: 6823 ldr r3, [r4, #0]
  45588. 802ff06: b94b cbnz r3, 802ff1c <pbuf_copy+0x8c>
  45589. (p_from->next == NULL), return ERR_VAL;);
  45590. }
  45591. if((p_to != NULL) && (p_to->len == p_to->tot_len)) {
  45592. 802ff08: 896a ldrh r2, [r5, #10]
  45593. 802ff0a: 892b ldrh r3, [r5, #8]
  45594. 802ff0c: 429a cmp r2, r3
  45595. 802ff0e: d101 bne.n 802ff14 <pbuf_copy+0x84>
  45596. /* don't copy more than one packet! */
  45597. LWIP_ERROR("pbuf_copy() does not allow packet queues!\n",
  45598. 802ff10: 682b ldr r3, [r5, #0]
  45599. 802ff12: b91b cbnz r3, 802ff1c <pbuf_copy+0x8c>
  45600. (p_to->next == NULL), return ERR_VAL;);
  45601. }
  45602. } while (p_from);
  45603. 802ff14: 2c00 cmp r4, #0
  45604. 802ff16: d1ca bne.n 802feae <pbuf_copy+0x1e>
  45605. LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_copy: end of chain reached.\n"));
  45606. return ERR_OK;
  45607. 802ff18: 4620 mov r0, r4
  45608. 802ff1a: e000 b.n 802ff1e <pbuf_copy+0x8e>
  45609. LWIP_ERROR("p_to != NULL", (p_to != NULL) || (p_from == NULL) , return ERR_ARG;);
  45610. }
  45611. if((p_from != NULL) && (p_from->len == p_from->tot_len)) {
  45612. /* don't copy more than one packet! */
  45613. LWIP_ERROR("pbuf_copy() does not allow packet queues!\n",
  45614. 802ff1c: 20fa movs r0, #250 ; 0xfa
  45615. (p_to->next == NULL), return ERR_VAL;);
  45616. }
  45617. } while (p_from);
  45618. LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_copy: end of chain reached.\n"));
  45619. return ERR_OK;
  45620. }
  45621. 802ff1e: b240 sxtb r0, r0
  45622. 802ff20: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  45623. 0802ff24 <pbuf_copy_partial>:
  45624. * @param offset offset into the packet buffer from where to begin copying len bytes
  45625. * @return the number of bytes copied, or 0 on failure
  45626. */
  45627. u16_t
  45628. pbuf_copy_partial(struct pbuf *buf, void *dataptr, u16_t len, u16_t offset)
  45629. {
  45630. 802ff24: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr}
  45631. 802ff28: 4688 mov r8, r1
  45632. 802ff2a: 4616 mov r6, r2
  45633. struct pbuf *p;
  45634. u16_t left;
  45635. u16_t buf_copy_len;
  45636. u16_t copied_total = 0;
  45637. LWIP_ERROR("pbuf_copy_partial: invalid buf", (buf != NULL), return 0;);
  45638. 802ff2c: b328 cbz r0, 802ff7a <pbuf_copy_partial+0x56>
  45639. LWIP_ERROR("pbuf_copy_partial: invalid dataptr", (dataptr != NULL), return 0;);
  45640. 802ff2e: b331 cbz r1, 802ff7e <pbuf_copy_partial+0x5a>
  45641. 802ff30: 2400 movs r4, #0
  45642. 802ff32: 4605 mov r5, r0
  45643. 802ff34: 46a1 mov r9, r4
  45644. 802ff36: e01c b.n 802ff72 <pbuf_copy_partial+0x4e>
  45645. return 0;
  45646. }
  45647. /* Note some systems use byte copy if dataptr or one of the pbuf payload pointers are unaligned. */
  45648. for(p = buf; len != 0 && p != NULL; p = p->next) {
  45649. if ((offset != 0) && (offset >= p->len)) {
  45650. 802ff38: b12b cbz r3, 802ff46 <pbuf_copy_partial+0x22>
  45651. 802ff3a: 896a ldrh r2, [r5, #10]
  45652. 802ff3c: 4293 cmp r3, r2
  45653. 802ff3e: d302 bcc.n 802ff46 <pbuf_copy_partial+0x22>
  45654. /* don't copy from this buffer -> on to the next */
  45655. offset -= p->len;
  45656. 802ff40: 1a9b subs r3, r3, r2
  45657. 802ff42: b29b uxth r3, r3
  45658. 802ff44: e014 b.n 802ff70 <pbuf_copy_partial+0x4c>
  45659. } else {
  45660. /* copy from this buffer. maybe only partially. */
  45661. buf_copy_len = p->len - offset;
  45662. 802ff46: 896f ldrh r7, [r5, #10]
  45663. if (buf_copy_len > len)
  45664. buf_copy_len = len;
  45665. /* copy the necessary parts of the buffer */
  45666. MEMCPY(&((char*)dataptr)[left], &((char*)p->payload)[offset], buf_copy_len);
  45667. 802ff48: 6869 ldr r1, [r5, #4]
  45668. if ((offset != 0) && (offset >= p->len)) {
  45669. /* don't copy from this buffer -> on to the next */
  45670. offset -= p->len;
  45671. } else {
  45672. /* copy from this buffer. maybe only partially. */
  45673. buf_copy_len = p->len - offset;
  45674. 802ff4a: 1aff subs r7, r7, r3
  45675. 802ff4c: b2bf uxth r7, r7
  45676. 802ff4e: 42b7 cmp r7, r6
  45677. 802ff50: bf28 it cs
  45678. 802ff52: 4637 movcs r7, r6
  45679. if (buf_copy_len > len)
  45680. buf_copy_len = len;
  45681. /* copy the necessary parts of the buffer */
  45682. MEMCPY(&((char*)dataptr)[left], &((char*)p->payload)[offset], buf_copy_len);
  45683. 802ff54: eb08 0009 add.w r0, r8, r9
  45684. 802ff58: 18c9 adds r1, r1, r3
  45685. 802ff5a: 463a mov r2, r7
  45686. copied_total += buf_copy_len;
  45687. 802ff5c: 193c adds r4, r7, r4
  45688. left += buf_copy_len;
  45689. 802ff5e: 44b9 add r9, r7
  45690. len -= buf_copy_len;
  45691. 802ff60: 1bf6 subs r6, r6, r7
  45692. /* copy from this buffer. maybe only partially. */
  45693. buf_copy_len = p->len - offset;
  45694. if (buf_copy_len > len)
  45695. buf_copy_len = len;
  45696. /* copy the necessary parts of the buffer */
  45697. MEMCPY(&((char*)dataptr)[left], &((char*)p->payload)[offset], buf_copy_len);
  45698. 802ff62: f7f1 fe9f bl 8021ca4 <memcpy>
  45699. copied_total += buf_copy_len;
  45700. 802ff66: b2a4 uxth r4, r4
  45701. left += buf_copy_len;
  45702. 802ff68: fa1f f989 uxth.w r9, r9
  45703. len -= buf_copy_len;
  45704. 802ff6c: b2b6 uxth r6, r6
  45705. offset = 0;
  45706. 802ff6e: 2300 movs r3, #0
  45707. if((buf == NULL) || (dataptr == NULL)) {
  45708. return 0;
  45709. }
  45710. /* Note some systems use byte copy if dataptr or one of the pbuf payload pointers are unaligned. */
  45711. for(p = buf; len != 0 && p != NULL; p = p->next) {
  45712. 802ff70: 682d ldr r5, [r5, #0]
  45713. 802ff72: b12e cbz r6, 802ff80 <pbuf_copy_partial+0x5c>
  45714. 802ff74: 2d00 cmp r5, #0
  45715. 802ff76: d1df bne.n 802ff38 <pbuf_copy_partial+0x14>
  45716. 802ff78: e002 b.n 802ff80 <pbuf_copy_partial+0x5c>
  45717. struct pbuf *p;
  45718. u16_t left;
  45719. u16_t buf_copy_len;
  45720. u16_t copied_total = 0;
  45721. LWIP_ERROR("pbuf_copy_partial: invalid buf", (buf != NULL), return 0;);
  45722. 802ff7a: 4604 mov r4, r0
  45723. 802ff7c: e000 b.n 802ff80 <pbuf_copy_partial+0x5c>
  45724. 802ff7e: 460c mov r4, r1
  45725. len -= buf_copy_len;
  45726. offset = 0;
  45727. }
  45728. }
  45729. return copied_total;
  45730. }
  45731. 802ff80: 4620 mov r0, r4
  45732. 802ff82: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc}
  45733. 802ff86: 0000 movs r0, r0
  45734. 0802ff88 <raw_input>:
  45735. * caller).
  45736. *
  45737. */
  45738. u8_t
  45739. raw_input(struct pbuf *p, struct netif *inp)
  45740. {
  45741. 802ff88: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
  45742. u8_t eaten = 0;
  45743. LWIP_UNUSED_ARG(inp);
  45744. iphdr = (struct ip_hdr *)p->payload;
  45745. proto = IPH_PROTO(iphdr);
  45746. 802ff8c: 6843 ldr r3, [r0, #4]
  45747. /* loop through all raw pcbs until the packet is eaten by one */
  45748. /* this allows multiple pcbs to match against the packet by design */
  45749. while ((eaten == 0) && (pcb != NULL)) {
  45750. if ((pcb->protocol == proto) &&
  45751. (ip_addr_isany(&pcb->local_ip) ||
  45752. ip_addr_cmp(&(pcb->local_ip), &current_iphdr_dest))) {
  45753. 802ff8e: f8df a074 ldr.w sl, [pc, #116] ; 8030004 <raw_input+0x7c>
  45754. u8_t eaten = 0;
  45755. LWIP_UNUSED_ARG(inp);
  45756. iphdr = (struct ip_hdr *)p->payload;
  45757. proto = IPH_PROTO(iphdr);
  45758. 802ff92: f893 9009 ldrb.w r9, [r3, #9]
  45759. prev = NULL;
  45760. pcb = raw_pcbs;
  45761. 802ff96: 4b19 ldr r3, [pc, #100] ; (802fffc <raw_input+0x74>)
  45762. * caller).
  45763. *
  45764. */
  45765. u8_t
  45766. raw_input(struct pbuf *p, struct netif *inp)
  45767. {
  45768. 802ff98: 4606 mov r6, r0
  45769. iphdr = (struct ip_hdr *)p->payload;
  45770. proto = IPH_PROTO(iphdr);
  45771. prev = NULL;
  45772. pcb = raw_pcbs;
  45773. 802ff9a: 681c ldr r4, [r3, #0]
  45774. LWIP_UNUSED_ARG(inp);
  45775. iphdr = (struct ip_hdr *)p->payload;
  45776. proto = IPH_PROTO(iphdr);
  45777. prev = NULL;
  45778. 802ff9c: 2500 movs r5, #0
  45779. eaten = 1;
  45780. if (prev != NULL) {
  45781. /* move the pcb to the front of raw_pcbs so that is
  45782. found faster next time */
  45783. prev->next = pcb->next;
  45784. pcb->next = raw_pcbs;
  45785. 802ff9e: 4698 mov r8, r3
  45786. 802ffa0: e023 b.n 802ffea <raw_input+0x62>
  45787. prev = NULL;
  45788. pcb = raw_pcbs;
  45789. /* loop through all raw pcbs until the packet is eaten by one */
  45790. /* this allows multiple pcbs to match against the packet by design */
  45791. while ((eaten == 0) && (pcb != NULL)) {
  45792. if ((pcb->protocol == proto) &&
  45793. 802ffa2: 7c23 ldrb r3, [r4, #16]
  45794. 802ffa4: 454b cmp r3, r9
  45795. 802ffa6: d118 bne.n 802ffda <raw_input+0x52>
  45796. (ip_addr_isany(&pcb->local_ip) ||
  45797. 802ffa8: 6823 ldr r3, [r4, #0]
  45798. 802ffaa: b11b cbz r3, 802ffb4 <raw_input+0x2c>
  45799. 802ffac: f8da 2000 ldr.w r2, [sl]
  45800. 802ffb0: 4293 cmp r3, r2
  45801. 802ffb2: d112 bne.n 802ffda <raw_input+0x52>
  45802. /* broadcast filter? */
  45803. if (ip_get_option(pcb, SOF_BROADCAST) || !ip_addr_isbroadcast(&current_iphdr_dest, inp))
  45804. #endif /* IP_SOF_BROADCAST_RECV */
  45805. {
  45806. /* receive callback function available? */
  45807. if (pcb->recv != NULL) {
  45808. 802ffb4: 6967 ldr r7, [r4, #20]
  45809. 802ffb6: b187 cbz r7, 802ffda <raw_input+0x52>
  45810. /* the receive callback function did not eat the packet? */
  45811. if (pcb->recv(pcb->recv_arg, pcb, p, ip_current_src_addr()) != 0) {
  45812. 802ffb8: 69a0 ldr r0, [r4, #24]
  45813. 802ffba: 4b11 ldr r3, [pc, #68] ; (8030000 <raw_input+0x78>)
  45814. 802ffbc: 4621 mov r1, r4
  45815. 802ffbe: 4632 mov r2, r6
  45816. 802ffc0: 47b8 blx r7
  45817. 802ffc2: b150 cbz r0, 802ffda <raw_input+0x52>
  45818. /* receive function ate the packet */
  45819. p = NULL;
  45820. eaten = 1;
  45821. if (prev != NULL) {
  45822. 802ffc4: b15d cbz r5, 802ffde <raw_input+0x56>
  45823. /* move the pcb to the front of raw_pcbs so that is
  45824. found faster next time */
  45825. prev->next = pcb->next;
  45826. 802ffc6: 68e3 ldr r3, [r4, #12]
  45827. 802ffc8: 60eb str r3, [r5, #12]
  45828. pcb->next = raw_pcbs;
  45829. 802ffca: f8d8 3000 ldr.w r3, [r8]
  45830. raw_pcbs = pcb;
  45831. 802ffce: f8c8 4000 str.w r4, [r8]
  45832. eaten = 1;
  45833. if (prev != NULL) {
  45834. /* move the pcb to the front of raw_pcbs so that is
  45835. found faster next time */
  45836. prev->next = pcb->next;
  45837. pcb->next = raw_pcbs;
  45838. 802ffd2: 60e3 str r3, [r4, #12]
  45839. /* receive callback function available? */
  45840. if (pcb->recv != NULL) {
  45841. /* the receive callback function did not eat the packet? */
  45842. if (pcb->recv(pcb->recv_arg, pcb, p, ip_current_src_addr()) != 0) {
  45843. /* receive function ate the packet */
  45844. p = NULL;
  45845. 802ffd4: 2600 movs r6, #0
  45846. eaten = 1;
  45847. 802ffd6: 2301 movs r3, #1
  45848. 802ffd8: e003 b.n 802ffe2 <raw_input+0x5a>
  45849. pcb = raw_pcbs;
  45850. /* loop through all raw pcbs until the packet is eaten by one */
  45851. /* this allows multiple pcbs to match against the packet by design */
  45852. while ((eaten == 0) && (pcb != NULL)) {
  45853. if ((pcb->protocol == proto) &&
  45854. (ip_addr_isany(&pcb->local_ip) ||
  45855. 802ffda: 2300 movs r3, #0
  45856. 802ffdc: e001 b.n 802ffe2 <raw_input+0x5a>
  45857. if (pcb->recv != NULL) {
  45858. /* the receive callback function did not eat the packet? */
  45859. if (pcb->recv(pcb->recv_arg, pcb, p, ip_current_src_addr()) != 0) {
  45860. /* receive function ate the packet */
  45861. p = NULL;
  45862. eaten = 1;
  45863. 802ffde: 2301 movs r3, #1
  45864. /* receive callback function available? */
  45865. if (pcb->recv != NULL) {
  45866. /* the receive callback function did not eat the packet? */
  45867. if (pcb->recv(pcb->recv_arg, pcb, p, ip_current_src_addr()) != 0) {
  45868. /* receive function ate the packet */
  45869. p = NULL;
  45870. 802ffe0: 462e mov r6, r5
  45871. /* no receive callback function was set for this raw PCB */
  45872. }
  45873. /* drop the packet */
  45874. }
  45875. prev = pcb;
  45876. pcb = pcb->next;
  45877. 802ffe2: 68e2 ldr r2, [r4, #12]
  45878. 802ffe4: 4625 mov r5, r4
  45879. prev = NULL;
  45880. pcb = raw_pcbs;
  45881. /* loop through all raw pcbs until the packet is eaten by one */
  45882. /* this allows multiple pcbs to match against the packet by design */
  45883. while ((eaten == 0) && (pcb != NULL)) {
  45884. 802ffe6: b92b cbnz r3, 802fff4 <raw_input+0x6c>
  45885. /* no receive callback function was set for this raw PCB */
  45886. }
  45887. /* drop the packet */
  45888. }
  45889. prev = pcb;
  45890. pcb = pcb->next;
  45891. 802ffe8: 4614 mov r4, r2
  45892. prev = NULL;
  45893. pcb = raw_pcbs;
  45894. /* loop through all raw pcbs until the packet is eaten by one */
  45895. /* this allows multiple pcbs to match against the packet by design */
  45896. while ((eaten == 0) && (pcb != NULL)) {
  45897. 802ffea: 2c00 cmp r4, #0
  45898. 802ffec: d1d9 bne.n 802ffa2 <raw_input+0x1a>
  45899. 802ffee: 4620 mov r0, r4
  45900. 802fff0: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc}
  45901. 802fff4: 2001 movs r0, #1
  45902. }
  45903. prev = pcb;
  45904. pcb = pcb->next;
  45905. }
  45906. return eaten;
  45907. }
  45908. 802fff6: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc}
  45909. 802fffa: bf00 nop
  45910. 802fffc: 2000c42c .word 0x2000c42c
  45911. 8030000: 2000ff40 .word 0x2000ff40
  45912. 8030004: 2000ff48 .word 0x2000ff48
  45913. 08030008 <tcp_accept_null>:
  45914. LWIP_UNUSED_ARG(arg);
  45915. LWIP_UNUSED_ARG(pcb);
  45916. LWIP_UNUSED_ARG(err);
  45917. return ERR_ABRT;
  45918. }
  45919. 8030008: f06f 0009 mvn.w r0, #9
  45920. 803000c: 4770 bx lr
  45921. 803000e: 0000 movs r0, r0
  45922. 08030010 <tcp_new_port>:
  45923. *
  45924. * @return a new (free) local TCP port number
  45925. */
  45926. static u16_t
  45927. tcp_new_port(void)
  45928. {
  45929. 8030010: 4b13 ldr r3, [pc, #76] ; (8030060 <tcp_new_port+0x50>)
  45930. 8030012: b570 push {r4, r5, r6, lr}
  45931. 8030014: 8818 ldrh r0, [r3, #0]
  45932. if (tcp_port++ == TCP_LOCAL_PORT_RANGE_END) {
  45933. tcp_port = TCP_LOCAL_PORT_RANGE_START;
  45934. }
  45935. /* Check all PCB lists. */
  45936. for (i = 0; i < NUM_TCP_PCB_LISTS; i++) {
  45937. for(pcb = *tcp_pcb_lists[i]; pcb != NULL; pcb = pcb->next) {
  45938. 8030016: 4d13 ldr r5, [pc, #76] ; (8030064 <tcp_new_port+0x54>)
  45939. *
  45940. * @return a new (free) local TCP port number
  45941. */
  45942. static u16_t
  45943. tcp_new_port(void)
  45944. {
  45945. 8030018: f44f 4280 mov.w r2, #16384 ; 0x4000
  45946. u8_t i;
  45947. u16_t n = 0;
  45948. struct tcp_pcb *pcb;
  45949. again:
  45950. if (tcp_port++ == TCP_LOCAL_PORT_RANGE_END) {
  45951. 803001c: f64f 74ff movw r4, #65535 ; 0xffff
  45952. 8030020: 42a0 cmp r0, r4
  45953. 8030022: d002 beq.n 803002a <tcp_new_port+0x1a>
  45954. 8030024: 3001 adds r0, #1
  45955. 8030026: b280 uxth r0, r0
  45956. 8030028: e001 b.n 803002e <tcp_new_port+0x1e>
  45957. tcp_port = TCP_LOCAL_PORT_RANGE_START;
  45958. 803002a: f44f 4040 mov.w r0, #49152 ; 0xc000
  45959. 803002e: 2300 movs r3, #0
  45960. }
  45961. /* Check all PCB lists. */
  45962. for (i = 0; i < NUM_TCP_PCB_LISTS; i++) {
  45963. for(pcb = *tcp_pcb_lists[i]; pcb != NULL; pcb = pcb->next) {
  45964. 8030030: 5959 ldr r1, [r3, r5]
  45965. 8030032: 6809 ldr r1, [r1, #0]
  45966. 8030034: e00b b.n 803004e <tcp_new_port+0x3e>
  45967. if (pcb->local_port == tcp_port) {
  45968. 8030036: 8b4e ldrh r6, [r1, #26]
  45969. 8030038: 4286 cmp r6, r0
  45970. 803003a: d107 bne.n 803004c <tcp_new_port+0x3c>
  45971. 803003c: 3a01 subs r2, #1
  45972. 803003e: b292 uxth r2, r2
  45973. if (++n > (TCP_LOCAL_PORT_RANGE_END - TCP_LOCAL_PORT_RANGE_START)) {
  45974. 8030040: 2a00 cmp r2, #0
  45975. 8030042: d1ed bne.n 8030020 <tcp_new_port+0x10>
  45976. 8030044: 4b06 ldr r3, [pc, #24] ; (8030060 <tcp_new_port+0x50>)
  45977. 8030046: 8018 strh r0, [r3, #0]
  45978. return 0;
  45979. 8030048: 4610 mov r0, r2
  45980. 803004a: bd70 pop {r4, r5, r6, pc}
  45981. if (tcp_port++ == TCP_LOCAL_PORT_RANGE_END) {
  45982. tcp_port = TCP_LOCAL_PORT_RANGE_START;
  45983. }
  45984. /* Check all PCB lists. */
  45985. for (i = 0; i < NUM_TCP_PCB_LISTS; i++) {
  45986. for(pcb = *tcp_pcb_lists[i]; pcb != NULL; pcb = pcb->next) {
  45987. 803004c: 68c9 ldr r1, [r1, #12]
  45988. 803004e: 2900 cmp r1, #0
  45989. 8030050: d1f1 bne.n 8030036 <tcp_new_port+0x26>
  45990. 8030052: 3304 adds r3, #4
  45991. again:
  45992. if (tcp_port++ == TCP_LOCAL_PORT_RANGE_END) {
  45993. tcp_port = TCP_LOCAL_PORT_RANGE_START;
  45994. }
  45995. /* Check all PCB lists. */
  45996. for (i = 0; i < NUM_TCP_PCB_LISTS; i++) {
  45997. 8030054: 2b10 cmp r3, #16
  45998. 8030056: d1eb bne.n 8030030 <tcp_new_port+0x20>
  45999. 8030058: 4b01 ldr r3, [pc, #4] ; (8030060 <tcp_new_port+0x50>)
  46000. 803005a: 8018 strh r0, [r3, #0]
  46001. goto again;
  46002. }
  46003. }
  46004. }
  46005. return tcp_port;
  46006. }
  46007. 803005c: bd70 pop {r4, r5, r6, pc}
  46008. 803005e: bf00 nop
  46009. 8030060: 2000072c .word 0x2000072c
  46010. 8030064: 0804471c .word 0x0804471c
  46011. 08030068 <tcp_init>:
  46012. /**
  46013. * Initialize this module.
  46014. */
  46015. void
  46016. tcp_init(void)
  46017. {
  46018. 8030068: 4770 bx lr
  46019. 803006a: 0000 movs r0, r0
  46020. 0803006c <tcp_bind>:
  46021. * ERR_VAL if bind failed because the PCB is not in a valid state
  46022. * ERR_OK if bound
  46023. */
  46024. err_t
  46025. tcp_bind(struct tcp_pcb *pcb, ip_addr_t *ipaddr, u16_t port)
  46026. {
  46027. 803006c: b5f8 push {r3, r4, r5, r6, r7, lr}
  46028. int i;
  46029. int max_pcb_list = NUM_TCP_PCB_LISTS;
  46030. struct tcp_pcb *cpcb;
  46031. LWIP_ERROR("tcp_bind: can only bind in state CLOSED", pcb->state == CLOSED, return ERR_VAL);
  46032. 803006e: 7e03 ldrb r3, [r0, #24]
  46033. * ERR_VAL if bind failed because the PCB is not in a valid state
  46034. * ERR_OK if bound
  46035. */
  46036. err_t
  46037. tcp_bind(struct tcp_pcb *pcb, ip_addr_t *ipaddr, u16_t port)
  46038. {
  46039. 8030070: 4604 mov r4, r0
  46040. 8030072: 460d mov r5, r1
  46041. int i;
  46042. int max_pcb_list = NUM_TCP_PCB_LISTS;
  46043. struct tcp_pcb *cpcb;
  46044. LWIP_ERROR("tcp_bind: can only bind in state CLOSED", pcb->state == CLOSED, return ERR_VAL);
  46045. 8030074: bb33 cbnz r3, 80300c4 <tcp_bind+0x58>
  46046. if (ip_get_option(pcb, SOF_REUSEADDR)) {
  46047. max_pcb_list = NUM_TCP_PCB_LISTS_NO_TIME_WAIT;
  46048. }
  46049. #endif /* SO_REUSE */
  46050. if (port == 0) {
  46051. 8030076: b91a cbnz r2, 8030080 <tcp_bind+0x14>
  46052. port = tcp_new_port();
  46053. 8030078: f7ff ffca bl 8030010 <tcp_new_port>
  46054. if (port == 0) {
  46055. 803007c: 4602 mov r2, r0
  46056. 803007e: b318 cbz r0, 80300c8 <tcp_bind+0x5c>
  46057. }
  46058. }
  46059. /* Check if the address already is in use (on all lists) */
  46060. for (i = 0; i < max_pcb_list; i++) {
  46061. for(cpcb = *tcp_pcb_lists[i]; cpcb != NULL; cpcb = cpcb->next) {
  46062. 8030080: 4f14 ldr r7, [pc, #80] ; (80300d4 <tcp_bind+0x68>)
  46063. * ERR_VAL if bind failed because the PCB is not in a valid state
  46064. * ERR_OK if bound
  46065. */
  46066. err_t
  46067. tcp_bind(struct tcp_pcb *pcb, ip_addr_t *ipaddr, u16_t port)
  46068. {
  46069. 8030082: 2100 movs r1, #0
  46070. }
  46071. }
  46072. /* Check if the address already is in use (on all lists) */
  46073. for (i = 0; i < max_pcb_list; i++) {
  46074. for(cpcb = *tcp_pcb_lists[i]; cpcb != NULL; cpcb = cpcb->next) {
  46075. 8030084: 59cb ldr r3, [r1, r7]
  46076. 8030086: 681b ldr r3, [r3, #0]
  46077. 8030088: e00a b.n 80300a0 <tcp_bind+0x34>
  46078. if (cpcb->local_port == port) {
  46079. 803008a: 8b58 ldrh r0, [r3, #26]
  46080. 803008c: 4290 cmp r0, r2
  46081. 803008e: d106 bne.n 803009e <tcp_bind+0x32>
  46082. tcp_connect. */
  46083. if (!ip_get_option(pcb, SOF_REUSEADDR) ||
  46084. !ip_get_option(cpcb, SOF_REUSEADDR))
  46085. #endif /* SO_REUSE */
  46086. {
  46087. if (ip_addr_isany(&(cpcb->local_ip)) ||
  46088. 8030090: 681e ldr r6, [r3, #0]
  46089. 8030092: b1de cbz r6, 80300cc <tcp_bind+0x60>
  46090. 8030094: b1d5 cbz r5, 80300cc <tcp_bind+0x60>
  46091. ip_addr_isany(ipaddr) ||
  46092. 8030096: 6828 ldr r0, [r5, #0]
  46093. 8030098: b1c0 cbz r0, 80300cc <tcp_bind+0x60>
  46094. 803009a: 4286 cmp r6, r0
  46095. 803009c: d016 beq.n 80300cc <tcp_bind+0x60>
  46096. }
  46097. }
  46098. /* Check if the address already is in use (on all lists) */
  46099. for (i = 0; i < max_pcb_list; i++) {
  46100. for(cpcb = *tcp_pcb_lists[i]; cpcb != NULL; cpcb = cpcb->next) {
  46101. 803009e: 68db ldr r3, [r3, #12]
  46102. 80300a0: 2b00 cmp r3, #0
  46103. 80300a2: d1f2 bne.n 803008a <tcp_bind+0x1e>
  46104. 80300a4: 3104 adds r1, #4
  46105. return ERR_BUF;
  46106. }
  46107. }
  46108. /* Check if the address already is in use (on all lists) */
  46109. for (i = 0; i < max_pcb_list; i++) {
  46110. 80300a6: 2910 cmp r1, #16
  46111. 80300a8: d1ec bne.n 8030084 <tcp_bind+0x18>
  46112. }
  46113. }
  46114. }
  46115. }
  46116. if (!ip_addr_isany(ipaddr)) {
  46117. 80300aa: b115 cbz r5, 80300b2 <tcp_bind+0x46>
  46118. 80300ac: 682b ldr r3, [r5, #0]
  46119. 80300ae: b103 cbz r3, 80300b2 <tcp_bind+0x46>
  46120. pcb->local_ip = *ipaddr;
  46121. 80300b0: 6023 str r3, [r4, #0]
  46122. }
  46123. pcb->local_port = port;
  46124. TCP_REG(&tcp_bound_pcbs, pcb);
  46125. 80300b2: 4b09 ldr r3, [pc, #36] ; (80300d8 <tcp_bind+0x6c>)
  46126. }
  46127. if (!ip_addr_isany(ipaddr)) {
  46128. pcb->local_ip = *ipaddr;
  46129. }
  46130. pcb->local_port = port;
  46131. 80300b4: 8362 strh r2, [r4, #26]
  46132. TCP_REG(&tcp_bound_pcbs, pcb);
  46133. 80300b6: 681a ldr r2, [r3, #0]
  46134. 80300b8: 601c str r4, [r3, #0]
  46135. 80300ba: 60e2 str r2, [r4, #12]
  46136. 80300bc: f002 f8de bl 803227c <tcp_timer_needed>
  46137. LWIP_DEBUGF(TCP_DEBUG, ("tcp_bind: bind to port %"U16_F"\n", port));
  46138. return ERR_OK;
  46139. 80300c0: 2000 movs r0, #0
  46140. 80300c2: e004 b.n 80300ce <tcp_bind+0x62>
  46141. {
  46142. int i;
  46143. int max_pcb_list = NUM_TCP_PCB_LISTS;
  46144. struct tcp_pcb *cpcb;
  46145. LWIP_ERROR("tcp_bind: can only bind in state CLOSED", pcb->state == CLOSED, return ERR_VAL);
  46146. 80300c4: 20fa movs r0, #250 ; 0xfa
  46147. 80300c6: e002 b.n 80300ce <tcp_bind+0x62>
  46148. #endif /* SO_REUSE */
  46149. if (port == 0) {
  46150. port = tcp_new_port();
  46151. if (port == 0) {
  46152. return ERR_BUF;
  46153. 80300c8: 20fe movs r0, #254 ; 0xfe
  46154. 80300ca: e000 b.n 80300ce <tcp_bind+0x62>
  46155. #endif /* SO_REUSE */
  46156. {
  46157. if (ip_addr_isany(&(cpcb->local_ip)) ||
  46158. ip_addr_isany(ipaddr) ||
  46159. ip_addr_cmp(&(cpcb->local_ip), ipaddr)) {
  46160. return ERR_USE;
  46161. 80300cc: 20f8 movs r0, #248 ; 0xf8
  46162. }
  46163. pcb->local_port = port;
  46164. TCP_REG(&tcp_bound_pcbs, pcb);
  46165. LWIP_DEBUGF(TCP_DEBUG, ("tcp_bind: bind to port %"U16_F"\n", port));
  46166. return ERR_OK;
  46167. }
  46168. 80300ce: b240 sxtb r0, r0
  46169. 80300d0: bdf8 pop {r3, r4, r5, r6, r7, pc}
  46170. 80300d2: bf00 nop
  46171. 80300d4: 0804471c .word 0x0804471c
  46172. 80300d8: 2000ff30 .word 0x2000ff30
  46173. 080300dc <tcp_listen_with_backlog>:
  46174. * called like this:
  46175. * tpcb = tcp_listen(tpcb);
  46176. */
  46177. struct tcp_pcb *
  46178. tcp_listen_with_backlog(struct tcp_pcb *pcb, u8_t backlog)
  46179. {
  46180. 80300dc: b538 push {r3, r4, r5, lr}
  46181. struct tcp_pcb_listen *lpcb;
  46182. LWIP_UNUSED_ARG(backlog);
  46183. LWIP_ERROR("tcp_listen: pcb already connected", pcb->state == CLOSED, return NULL);
  46184. 80300de: 7e03 ldrb r3, [r0, #24]
  46185. * called like this:
  46186. * tpcb = tcp_listen(tpcb);
  46187. */
  46188. struct tcp_pcb *
  46189. tcp_listen_with_backlog(struct tcp_pcb *pcb, u8_t backlog)
  46190. {
  46191. 80300e0: 4604 mov r4, r0
  46192. struct tcp_pcb_listen *lpcb;
  46193. LWIP_UNUSED_ARG(backlog);
  46194. LWIP_ERROR("tcp_listen: pcb already connected", pcb->state == CLOSED, return NULL);
  46195. 80300e2: b10b cbz r3, 80300e8 <tcp_listen_with_backlog+0xc>
  46196. 80300e4: 2000 movs r0, #0
  46197. 80300e6: bd38 pop {r3, r4, r5, pc}
  46198. }
  46199. }
  46200. }
  46201. }
  46202. #endif /* SO_REUSE */
  46203. lpcb = (struct tcp_pcb_listen *)memp_malloc(MEMP_TCP_PCB_LISTEN);
  46204. 80300e8: 2003 movs r0, #3
  46205. 80300ea: f7ff fcad bl 802fa48 <memp_malloc>
  46206. if (lpcb == NULL) {
  46207. 80300ee: 4605 mov r5, r0
  46208. 80300f0: 2800 cmp r0, #0
  46209. 80300f2: d0f7 beq.n 80300e4 <tcp_listen_with_backlog+0x8>
  46210. return NULL;
  46211. }
  46212. lpcb->callback_arg = pcb->callback_arg;
  46213. 80300f4: 6923 ldr r3, [r4, #16]
  46214. 80300f6: 6103 str r3, [r0, #16]
  46215. lpcb->local_port = pcb->local_port;
  46216. 80300f8: 8b63 ldrh r3, [r4, #26]
  46217. 80300fa: 8343 strh r3, [r0, #26]
  46218. lpcb->state = LISTEN;
  46219. 80300fc: 2301 movs r3, #1
  46220. 80300fe: 7603 strb r3, [r0, #24]
  46221. lpcb->prio = pcb->prio;
  46222. 8030100: 7e63 ldrb r3, [r4, #25]
  46223. 8030102: 7643 strb r3, [r0, #25]
  46224. lpcb->so_options = pcb->so_options;
  46225. ip_set_option(lpcb, SOF_ACCEPTCONN);
  46226. 8030104: 7a23 ldrb r3, [r4, #8]
  46227. 8030106: f043 0302 orr.w r3, r3, #2
  46228. 803010a: 7203 strb r3, [r0, #8]
  46229. lpcb->ttl = pcb->ttl;
  46230. 803010c: 7aa3 ldrb r3, [r4, #10]
  46231. 803010e: 7283 strb r3, [r0, #10]
  46232. lpcb->tos = pcb->tos;
  46233. 8030110: 7a63 ldrb r3, [r4, #9]
  46234. 8030112: 7243 strb r3, [r0, #9]
  46235. ip_addr_copy(lpcb->local_ip, pcb->local_ip);
  46236. 8030114: 6823 ldr r3, [r4, #0]
  46237. 8030116: 6003 str r3, [r0, #0]
  46238. if (pcb->local_port != 0) {
  46239. 8030118: 8b63 ldrh r3, [r4, #26]
  46240. 803011a: b1ab cbz r3, 8030148 <tcp_listen_with_backlog+0x6c>
  46241. TCP_RMV(&tcp_bound_pcbs, pcb);
  46242. 803011c: 4a11 ldr r2, [pc, #68] ; (8030164 <tcp_listen_with_backlog+0x88>)
  46243. 803011e: 6813 ldr r3, [r2, #0]
  46244. 8030120: 42a3 cmp r3, r4
  46245. 8030122: d101 bne.n 8030128 <tcp_listen_with_backlog+0x4c>
  46246. 8030124: 68e3 ldr r3, [r4, #12]
  46247. 8030126: e00c b.n 8030142 <tcp_listen_with_backlog+0x66>
  46248. 8030128: 4a0f ldr r2, [pc, #60] ; (8030168 <tcp_listen_with_backlog+0x8c>)
  46249. 803012a: 6013 str r3, [r2, #0]
  46250. 803012c: e007 b.n 803013e <tcp_listen_with_backlog+0x62>
  46251. 803012e: 68d9 ldr r1, [r3, #12]
  46252. 8030130: 42a1 cmp r1, r4
  46253. 8030132: d103 bne.n 803013c <tcp_listen_with_backlog+0x60>
  46254. 8030134: 6013 str r3, [r2, #0]
  46255. 8030136: 68e2 ldr r2, [r4, #12]
  46256. 8030138: 60da str r2, [r3, #12]
  46257. 803013a: e003 b.n 8030144 <tcp_listen_with_backlog+0x68>
  46258. 803013c: 460b mov r3, r1
  46259. 803013e: 2b00 cmp r3, #0
  46260. 8030140: d1f5 bne.n 803012e <tcp_listen_with_backlog+0x52>
  46261. 8030142: 6013 str r3, [r2, #0]
  46262. 8030144: 2300 movs r3, #0
  46263. 8030146: 60e3 str r3, [r4, #12]
  46264. }
  46265. memp_free(MEMP_TCP_PCB, pcb);
  46266. 8030148: 2002 movs r0, #2
  46267. 803014a: 4621 mov r1, r4
  46268. 803014c: f7ff fc92 bl 802fa74 <memp_free>
  46269. #if LWIP_CALLBACK_API
  46270. lpcb->accept = tcp_accept_null;
  46271. 8030150: 4b06 ldr r3, [pc, #24] ; (803016c <tcp_listen_with_backlog+0x90>)
  46272. 8030152: 616b str r3, [r5, #20]
  46273. #endif /* LWIP_CALLBACK_API */
  46274. #if TCP_LISTEN_BACKLOG
  46275. lpcb->accepts_pending = 0;
  46276. lpcb->backlog = (backlog ? backlog : 1);
  46277. #endif /* TCP_LISTEN_BACKLOG */
  46278. TCP_REG(&tcp_listen_pcbs.pcbs, (struct tcp_pcb *)lpcb);
  46279. 8030154: 4b06 ldr r3, [pc, #24] ; (8030170 <tcp_listen_with_backlog+0x94>)
  46280. 8030156: 681a ldr r2, [r3, #0]
  46281. 8030158: 601d str r5, [r3, #0]
  46282. 803015a: 60ea str r2, [r5, #12]
  46283. 803015c: f002 f88e bl 803227c <tcp_timer_needed>
  46284. return (struct tcp_pcb *)lpcb;
  46285. 8030160: 4628 mov r0, r5
  46286. }
  46287. 8030162: bd38 pop {r3, r4, r5, pc}
  46288. 8030164: 2000ff30 .word 0x2000ff30
  46289. 8030168: 2000ff2c .word 0x2000ff2c
  46290. 803016c: 08030009 .word 0x08030009
  46291. 8030170: 2000ff28 .word 0x2000ff28
  46292. 08030174 <tcp_update_rcv_ann_wnd>:
  46293. *
  46294. * Returns how much extra window would be advertised if we sent an
  46295. * update now.
  46296. */
  46297. u32_t tcp_update_rcv_ann_wnd(struct tcp_pcb *pcb)
  46298. {
  46299. 8030174: b530 push {r4, r5, lr}
  46300. u32_t new_right_edge = pcb->rcv_nxt + pcb->rcv_wnd;
  46301. if (TCP_SEQ_GEQ(new_right_edge, pcb->rcv_ann_right_edge + LWIP_MIN((TCP_WND / 2), pcb->mss))) {
  46302. 8030176: 6b01 ldr r1, [r0, #48] ; 0x30
  46303. * Returns how much extra window would be advertised if we sent an
  46304. * update now.
  46305. */
  46306. u32_t tcp_update_rcv_ann_wnd(struct tcp_pcb *pcb)
  46307. {
  46308. u32_t new_right_edge = pcb->rcv_nxt + pcb->rcv_wnd;
  46309. 8030178: 8d84 ldrh r4, [r0, #44] ; 0x2c
  46310. if (TCP_SEQ_GEQ(new_right_edge, pcb->rcv_ann_right_edge + LWIP_MIN((TCP_WND / 2), pcb->mss))) {
  46311. 803017a: 8ec5 ldrh r5, [r0, #54] ; 0x36
  46312. * Returns how much extra window would be advertised if we sent an
  46313. * update now.
  46314. */
  46315. u32_t tcp_update_rcv_ann_wnd(struct tcp_pcb *pcb)
  46316. {
  46317. u32_t new_right_edge = pcb->rcv_nxt + pcb->rcv_wnd;
  46318. 803017c: 6a82 ldr r2, [r0, #40] ; 0x28
  46319. *
  46320. * Returns how much extra window would be advertised if we sent an
  46321. * update now.
  46322. */
  46323. u32_t tcp_update_rcv_ann_wnd(struct tcp_pcb *pcb)
  46324. {
  46325. 803017e: 4603 mov r3, r0
  46326. u32_t new_right_edge = pcb->rcv_nxt + pcb->rcv_wnd;
  46327. if (TCP_SEQ_GEQ(new_right_edge, pcb->rcv_ann_right_edge + LWIP_MIN((TCP_WND / 2), pcb->mss))) {
  46328. 8030180: f640 3068 movw r0, #2920 ; 0xb68
  46329. 8030184: 4285 cmp r5, r0
  46330. 8030186: bf28 it cs
  46331. 8030188: 4605 movcs r5, r0
  46332. * Returns how much extra window would be advertised if we sent an
  46333. * update now.
  46334. */
  46335. u32_t tcp_update_rcv_ann_wnd(struct tcp_pcb *pcb)
  46336. {
  46337. u32_t new_right_edge = pcb->rcv_nxt + pcb->rcv_wnd;
  46338. 803018a: 1a60 subs r0, r4, r1
  46339. if (TCP_SEQ_GEQ(new_right_edge, pcb->rcv_ann_right_edge + LWIP_MIN((TCP_WND / 2), pcb->mss))) {
  46340. 803018c: 1880 adds r0, r0, r2
  46341. 803018e: 1b45 subs r5, r0, r5
  46342. 8030190: 2d00 cmp r5, #0
  46343. 8030192: db01 blt.n 8030198 <tcp_update_rcv_ann_wnd+0x24>
  46344. /* we can advertise more window */
  46345. pcb->rcv_ann_wnd = pcb->rcv_wnd;
  46346. 8030194: 85dc strh r4, [r3, #46] ; 0x2e
  46347. return new_right_edge - pcb->rcv_ann_right_edge;
  46348. 8030196: bd30 pop {r4, r5, pc}
  46349. } else {
  46350. if (TCP_SEQ_GT(pcb->rcv_nxt, pcb->rcv_ann_right_edge)) {
  46351. 8030198: 1a50 subs r0, r2, r1
  46352. 803019a: 2800 cmp r0, #0
  46353. 803019c: f04f 0000 mov.w r0, #0
  46354. 80301a0: dd01 ble.n 80301a6 <tcp_update_rcv_ann_wnd+0x32>
  46355. /* Can happen due to other end sending out of advertised window,
  46356. * but within actual available (but not yet advertised) window */
  46357. pcb->rcv_ann_wnd = 0;
  46358. 80301a2: 85d8 strh r0, [r3, #46] ; 0x2e
  46359. 80301a4: bd30 pop {r4, r5, pc}
  46360. } else {
  46361. /* keep the right edge of window constant */
  46362. u32_t new_rcv_ann_wnd = pcb->rcv_ann_right_edge - pcb->rcv_nxt;
  46363. 80301a6: 1a8a subs r2, r1, r2
  46364. LWIP_ASSERT("new_rcv_ann_wnd <= 0xffff", new_rcv_ann_wnd <= 0xffff);
  46365. pcb->rcv_ann_wnd = (u16_t)new_rcv_ann_wnd;
  46366. 80301a8: 85da strh r2, [r3, #46] ; 0x2e
  46367. }
  46368. return 0;
  46369. }
  46370. }
  46371. 80301aa: bd30 pop {r4, r5, pc}
  46372. 080301ac <tcp_recved>:
  46373. LWIP_ASSERT("don't call tcp_recved for listen-pcbs",
  46374. pcb->state != LISTEN);
  46375. LWIP_ASSERT("tcp_recved: len would wrap rcv_wnd\n",
  46376. len <= 0xffff - pcb->rcv_wnd );
  46377. pcb->rcv_wnd += len;
  46378. 80301ac: 8d83 ldrh r3, [r0, #44] ; 0x2c
  46379. 80301ae: 18c9 adds r1, r1, r3
  46380. 80301b0: b289 uxth r1, r1
  46381. if (pcb->rcv_wnd > TCP_WND) {
  46382. 80301b2: f241 63d0 movw r3, #5840 ; 0x16d0
  46383. 80301b6: 4299 cmp r1, r3
  46384. * @param pcb the tcp_pcb for which data is read
  46385. * @param len the amount of bytes that have been read by the application
  46386. */
  46387. void
  46388. tcp_recved(struct tcp_pcb *pcb, u16_t len)
  46389. {
  46390. 80301b8: b510 push {r4, lr}
  46391. LWIP_ASSERT("tcp_recved: len would wrap rcv_wnd\n",
  46392. len <= 0xffff - pcb->rcv_wnd );
  46393. pcb->rcv_wnd += len;
  46394. if (pcb->rcv_wnd > TCP_WND) {
  46395. pcb->rcv_wnd = TCP_WND;
  46396. 80301ba: bf8c ite hi
  46397. 80301bc: 8583 strhhi r3, [r0, #44] ; 0x2c
  46398. LWIP_ASSERT("don't call tcp_recved for listen-pcbs",
  46399. pcb->state != LISTEN);
  46400. LWIP_ASSERT("tcp_recved: len would wrap rcv_wnd\n",
  46401. len <= 0xffff - pcb->rcv_wnd );
  46402. pcb->rcv_wnd += len;
  46403. 80301be: 8581 strhls r1, [r0, #44] ; 0x2c
  46404. * @param pcb the tcp_pcb for which data is read
  46405. * @param len the amount of bytes that have been read by the application
  46406. */
  46407. void
  46408. tcp_recved(struct tcp_pcb *pcb, u16_t len)
  46409. {
  46410. 80301c0: 4604 mov r4, r0
  46411. pcb->rcv_wnd += len;
  46412. if (pcb->rcv_wnd > TCP_WND) {
  46413. pcb->rcv_wnd = TCP_WND;
  46414. }
  46415. wnd_inflation = tcp_update_rcv_ann_wnd(pcb);
  46416. 80301c2: f7ff ffd7 bl 8030174 <tcp_update_rcv_ann_wnd>
  46417. /* If the change in the right edge of window is significant (default
  46418. * watermark is TCP_WND/4), then send an explicit update now.
  46419. * Otherwise wait for a packet to be sent in the normal course of
  46420. * events (or more window to be available later) */
  46421. if (wnd_inflation >= TCP_WND_UPDATE_THRESHOLD) {
  46422. 80301c6: f240 53b3 movw r3, #1459 ; 0x5b3
  46423. 80301ca: 4298 cmp r0, r3
  46424. 80301cc: dd08 ble.n 80301e0 <tcp_recved+0x34>
  46425. tcp_ack_now(pcb);
  46426. 80301ce: 7fa3 ldrb r3, [r4, #30]
  46427. tcp_output(pcb);
  46428. 80301d0: 4620 mov r0, r4
  46429. /* If the change in the right edge of window is significant (default
  46430. * watermark is TCP_WND/4), then send an explicit update now.
  46431. * Otherwise wait for a packet to be sent in the normal course of
  46432. * events (or more window to be available later) */
  46433. if (wnd_inflation >= TCP_WND_UPDATE_THRESHOLD) {
  46434. tcp_ack_now(pcb);
  46435. 80301d2: f043 0302 orr.w r3, r3, #2
  46436. 80301d6: 77a3 strb r3, [r4, #30]
  46437. tcp_output(pcb);
  46438. }
  46439. LWIP_DEBUGF(TCP_DEBUG, ("tcp_recved: recveived %"U16_F" bytes, wnd %"U16_F" (%"U16_F").\n",
  46440. len, pcb->rcv_wnd, TCP_WND - pcb->rcv_wnd));
  46441. }
  46442. 80301d8: e8bd 4010 ldmia.w sp!, {r4, lr}
  46443. * watermark is TCP_WND/4), then send an explicit update now.
  46444. * Otherwise wait for a packet to be sent in the normal course of
  46445. * events (or more window to be available later) */
  46446. if (wnd_inflation >= TCP_WND_UPDATE_THRESHOLD) {
  46447. tcp_ack_now(pcb);
  46448. tcp_output(pcb);
  46449. 80301dc: f001 bd90 b.w 8031d00 <tcp_output>
  46450. 80301e0: bd10 pop {r4, pc}
  46451. 080301e2 <tcp_seg_free>:
  46452. *
  46453. * @param seg single tcp_seg to free
  46454. */
  46455. void
  46456. tcp_seg_free(struct tcp_seg *seg)
  46457. {
  46458. 80301e2: b510 push {r4, lr}
  46459. if (seg != NULL) {
  46460. 80301e4: 4604 mov r4, r0
  46461. 80301e6: b148 cbz r0, 80301fc <tcp_seg_free+0x1a>
  46462. if (seg->p != NULL) {
  46463. 80301e8: 6840 ldr r0, [r0, #4]
  46464. 80301ea: b108 cbz r0, 80301f0 <tcp_seg_free+0xe>
  46465. pbuf_free(seg->p);
  46466. 80301ec: f7ff fd4c bl 802fc88 <pbuf_free>
  46467. #if TCP_DEBUG
  46468. seg->p = NULL;
  46469. #endif /* TCP_DEBUG */
  46470. }
  46471. memp_free(MEMP_TCP_SEG, seg);
  46472. 80301f0: 2004 movs r0, #4
  46473. 80301f2: 4621 mov r1, r4
  46474. }
  46475. }
  46476. 80301f4: e8bd 4010 ldmia.w sp!, {r4, lr}
  46477. pbuf_free(seg->p);
  46478. #if TCP_DEBUG
  46479. seg->p = NULL;
  46480. #endif /* TCP_DEBUG */
  46481. }
  46482. memp_free(MEMP_TCP_SEG, seg);
  46483. 80301f8: f7ff bc3c b.w 802fa74 <memp_free>
  46484. 80301fc: bd10 pop {r4, pc}
  46485. 080301fe <tcp_segs_free>:
  46486. *
  46487. * @param seg tcp_seg list of TCP segments to free
  46488. */
  46489. void
  46490. tcp_segs_free(struct tcp_seg *seg)
  46491. {
  46492. 80301fe: b510 push {r4, lr}
  46493. while (seg != NULL) {
  46494. 8030200: e003 b.n 803020a <tcp_segs_free+0xc>
  46495. struct tcp_seg *next = seg->next;
  46496. 8030202: 6804 ldr r4, [r0, #0]
  46497. tcp_seg_free(seg);
  46498. 8030204: f7ff ffed bl 80301e2 <tcp_seg_free>
  46499. seg = next;
  46500. 8030208: 4620 mov r0, r4
  46501. * @param seg tcp_seg list of TCP segments to free
  46502. */
  46503. void
  46504. tcp_segs_free(struct tcp_seg *seg)
  46505. {
  46506. while (seg != NULL) {
  46507. 803020a: 2800 cmp r0, #0
  46508. 803020c: d1f9 bne.n 8030202 <tcp_segs_free+0x4>
  46509. struct tcp_seg *next = seg->next;
  46510. tcp_seg_free(seg);
  46511. seg = next;
  46512. }
  46513. }
  46514. 803020e: bd10 pop {r4, pc}
  46515. 08030210 <tcp_arg>:
  46516. void
  46517. tcp_arg(struct tcp_pcb *pcb, void *arg)
  46518. {
  46519. /* This function is allowed to be called for both listen pcbs and
  46520. connection pcbs. */
  46521. pcb->callback_arg = arg;
  46522. 8030210: 6101 str r1, [r0, #16]
  46523. 8030212: 4770 bx lr
  46524. 08030214 <tcp_recv>:
  46525. */
  46526. void
  46527. tcp_recv(struct tcp_pcb *pcb, tcp_recv_fn recv)
  46528. {
  46529. LWIP_ASSERT("invalid socket state for recv callback", pcb->state != LISTEN);
  46530. pcb->recv = recv;
  46531. 8030214: 67c1 str r1, [r0, #124] ; 0x7c
  46532. 8030216: 4770 bx lr
  46533. 08030218 <tcp_sent>:
  46534. */
  46535. void
  46536. tcp_sent(struct tcp_pcb *pcb, tcp_sent_fn sent)
  46537. {
  46538. LWIP_ASSERT("invalid socket state for sent callback", pcb->state != LISTEN);
  46539. pcb->sent = sent;
  46540. 8030218: 6781 str r1, [r0, #120] ; 0x78
  46541. 803021a: 4770 bx lr
  46542. 0803021c <tcp_err>:
  46543. */
  46544. void
  46545. tcp_err(struct tcp_pcb *pcb, tcp_err_fn err)
  46546. {
  46547. LWIP_ASSERT("invalid socket state for err callback", pcb->state != LISTEN);
  46548. pcb->errf = err;
  46549. 803021c: f8c0 1088 str.w r1, [r0, #136] ; 0x88
  46550. 8030220: 4770 bx lr
  46551. 08030222 <tcp_accept>:
  46552. void
  46553. tcp_accept(struct tcp_pcb *pcb, tcp_accept_fn accept)
  46554. {
  46555. /* This function is allowed to be called for both listen pcbs and
  46556. connection pcbs. */
  46557. pcb->accept = accept;
  46558. 8030222: 6141 str r1, [r0, #20]
  46559. 8030224: 4770 bx lr
  46560. 08030226 <tcp_poll>:
  46561. void
  46562. tcp_poll(struct tcp_pcb *pcb, tcp_poll_fn poll, u8_t interval)
  46563. {
  46564. LWIP_ASSERT("invalid socket state for poll", pcb->state != LISTEN);
  46565. #if LWIP_CALLBACK_API
  46566. pcb->poll = poll;
  46567. 8030226: f8c0 1084 str.w r1, [r0, #132] ; 0x84
  46568. #else /* LWIP_CALLBACK_API */
  46569. LWIP_UNUSED_ARG(poll);
  46570. #endif /* LWIP_CALLBACK_API */
  46571. pcb->pollinterval = interval;
  46572. 803022a: f880 2020 strb.w r2, [r0, #32]
  46573. 803022e: 4770 bx lr
  46574. 08030230 <tcp_pcb_purge>:
  46575. * @param pcb tcp_pcb to purge. The pcb itself is not deallocated!
  46576. */
  46577. void
  46578. tcp_pcb_purge(struct tcp_pcb *pcb)
  46579. {
  46580. if (pcb->state != CLOSED &&
  46581. 8030230: 7e03 ldrb r3, [r0, #24]
  46582. *
  46583. * @param pcb tcp_pcb to purge. The pcb itself is not deallocated!
  46584. */
  46585. void
  46586. tcp_pcb_purge(struct tcp_pcb *pcb)
  46587. {
  46588. 8030232: b510 push {r4, lr}
  46589. 8030234: 4604 mov r4, r0
  46590. if (pcb->state != CLOSED &&
  46591. 8030236: b1bb cbz r3, 8030268 <tcp_pcb_purge+0x38>
  46592. 8030238: 2b0a cmp r3, #10
  46593. 803023a: d015 beq.n 8030268 <tcp_pcb_purge+0x38>
  46594. pcb->state != TIME_WAIT &&
  46595. 803023c: 2b01 cmp r3, #1
  46596. 803023e: d013 beq.n 8030268 <tcp_pcb_purge+0x38>
  46597. }
  46598. }
  46599. #endif /* TCP_LISTEN_BACKLOG */
  46600. if (pcb->refused_data != NULL) {
  46601. 8030240: 6f40 ldr r0, [r0, #116] ; 0x74
  46602. 8030242: b118 cbz r0, 803024c <tcp_pcb_purge+0x1c>
  46603. LWIP_DEBUGF(TCP_DEBUG, ("tcp_pcb_purge: data left on ->refused_data\n"));
  46604. pbuf_free(pcb->refused_data);
  46605. 8030244: f7ff fd20 bl 802fc88 <pbuf_free>
  46606. pcb->refused_data = NULL;
  46607. 8030248: 2300 movs r3, #0
  46608. 803024a: 6763 str r3, [r4, #116] ; 0x74
  46609. pcb->ooseq = NULL;
  46610. #endif /* TCP_QUEUE_OOSEQ */
  46611. /* Stop the retransmission timer as it will expect data on unacked
  46612. queue if it fires */
  46613. pcb->rtime = -1;
  46614. 803024c: f64f 73ff movw r3, #65535 ; 0xffff
  46615. 8030250: 86a3 strh r3, [r4, #52] ; 0x34
  46616. tcp_segs_free(pcb->unsent);
  46617. 8030252: 6ee0 ldr r0, [r4, #108] ; 0x6c
  46618. 8030254: f7ff ffd3 bl 80301fe <tcp_segs_free>
  46619. tcp_segs_free(pcb->unacked);
  46620. 8030258: 6f20 ldr r0, [r4, #112] ; 0x70
  46621. 803025a: f7ff ffd0 bl 80301fe <tcp_segs_free>
  46622. pcb->unacked = pcb->unsent = NULL;
  46623. 803025e: 2300 movs r3, #0
  46624. 8030260: 66e3 str r3, [r4, #108] ; 0x6c
  46625. 8030262: 6723 str r3, [r4, #112] ; 0x70
  46626. #if TCP_OVERSIZE
  46627. pcb->unsent_oversize = 0;
  46628. 8030264: f8a4 306a strh.w r3, [r4, #106] ; 0x6a
  46629. 8030268: bd10 pop {r4, pc}
  46630. 803026a: 0000 movs r0, r0
  46631. 0803026c <tcp_slowtmr>:
  46632. u8_t pcb_reset; /* flag if a RST should be sent when removing */
  46633. err_t err;
  46634. err = ERR_OK;
  46635. ++tcp_ticks;
  46636. 803026c: 4b9c ldr r3, [pc, #624] ; (80304e0 <tcp_slowtmr+0x274>)
  46637. *
  46638. * Automatically called from tcp_tmr().
  46639. */
  46640. void
  46641. tcp_slowtmr(void)
  46642. {
  46643. 803026e: e92d 4ff7 stmdb sp!, {r0, r1, r2, r4, r5, r6, r7, r8, r9, sl, fp, lr}
  46644. u8_t pcb_reset; /* flag if a RST should be sent when removing */
  46645. err_t err;
  46646. err = ERR_OK;
  46647. ++tcp_ticks;
  46648. 8030272: 681a ldr r2, [r3, #0]
  46649. err_arg = pcb->callback_arg;
  46650. pcb2 = pcb;
  46651. pcb = pcb->next;
  46652. memp_free(MEMP_TCP_PCB, pcb2);
  46653. tcp_active_pcbs_changed = 0;
  46654. 8030274: f8df 8284 ldr.w r8, [pc, #644] ; 80304fc <tcp_slowtmr+0x290>
  46655. u8_t pcb_reset; /* flag if a RST should be sent when removing */
  46656. err_t err;
  46657. err = ERR_OK;
  46658. ++tcp_ticks;
  46659. 8030278: 3201 adds r2, #1
  46660. 803027a: 601a str r2, [r3, #0]
  46661. ++tcp_timer_ctr;
  46662. 803027c: 4b99 ldr r3, [pc, #612] ; (80304e4 <tcp_slowtmr+0x278>)
  46663. 803027e: 781a ldrb r2, [r3, #0]
  46664. 8030280: 3201 adds r2, #1
  46665. 8030282: 701a strb r2, [r3, #0]
  46666. 8030284: 46c1 mov r9, r8
  46667. tcp_slowtmr_start:
  46668. /* Steps through all of the active PCBs. */
  46669. prev = NULL;
  46670. pcb = tcp_active_pcbs;
  46671. 8030286: 4b98 ldr r3, [pc, #608] ; (80304e8 <tcp_slowtmr+0x27c>)
  46672. while (pcb != NULL) {
  46673. LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: processing active pcb\n"));
  46674. LWIP_ASSERT("tcp_slowtmr: active pcb->state != CLOSED\n", pcb->state != CLOSED);
  46675. LWIP_ASSERT("tcp_slowtmr: active pcb->state != LISTEN\n", pcb->state != LISTEN);
  46676. LWIP_ASSERT("tcp_slowtmr: active pcb->state != TIME-WAIT\n", pcb->state != TIME_WAIT);
  46677. if (pcb->last_timer == tcp_timer_ctr) {
  46678. 8030288: f8df a258 ldr.w sl, [pc, #600] ; 80304e4 <tcp_slowtmr+0x278>
  46679. ++tcp_timer_ctr;
  46680. tcp_slowtmr_start:
  46681. /* Steps through all of the active PCBs. */
  46682. prev = NULL;
  46683. pcb = tcp_active_pcbs;
  46684. 803028c: 681c ldr r4, [r3, #0]
  46685. ++tcp_ticks;
  46686. ++tcp_timer_ctr;
  46687. tcp_slowtmr_start:
  46688. /* Steps through all of the active PCBs. */
  46689. prev = NULL;
  46690. 803028e: 2600 movs r6, #0
  46691. pcb = tcp_active_pcbs;
  46692. if (pcb == NULL) {
  46693. LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: no active pcbs\n"));
  46694. }
  46695. while (pcb != NULL) {
  46696. 8030290: e0ff b.n 8030492 <tcp_slowtmr+0x226>
  46697. LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: processing active pcb\n"));
  46698. LWIP_ASSERT("tcp_slowtmr: active pcb->state != CLOSED\n", pcb->state != CLOSED);
  46699. LWIP_ASSERT("tcp_slowtmr: active pcb->state != LISTEN\n", pcb->state != LISTEN);
  46700. LWIP_ASSERT("tcp_slowtmr: active pcb->state != TIME-WAIT\n", pcb->state != TIME_WAIT);
  46701. if (pcb->last_timer == tcp_timer_ctr) {
  46702. 8030292: f89a 3000 ldrb.w r3, [sl]
  46703. 8030296: f894 2021 ldrb.w r2, [r4, #33] ; 0x21
  46704. 803029a: 429a cmp r2, r3
  46705. 803029c: d101 bne.n 80302a2 <tcp_slowtmr+0x36>
  46706. /* skip this pcb, we have already processed it */
  46707. pcb = pcb->next;
  46708. 803029e: 68e7 ldr r7, [r4, #12]
  46709. continue;
  46710. 80302a0: e0f6 b.n 8030490 <tcp_slowtmr+0x224>
  46711. pcb->last_timer = tcp_timer_ctr;
  46712. pcb_remove = 0;
  46713. pcb_reset = 0;
  46714. if (pcb->state == SYN_SENT && pcb->nrtx == TCP_SYNMAXRTX) {
  46715. 80302a2: 7e21 ldrb r1, [r4, #24]
  46716. if (pcb->last_timer == tcp_timer_ctr) {
  46717. /* skip this pcb, we have already processed it */
  46718. pcb = pcb->next;
  46719. continue;
  46720. }
  46721. pcb->last_timer = tcp_timer_ctr;
  46722. 80302a4: f884 3021 strb.w r3, [r4, #33] ; 0x21
  46723. pcb_remove = 0;
  46724. pcb_reset = 0;
  46725. if (pcb->state == SYN_SENT && pcb->nrtx == TCP_SYNMAXRTX) {
  46726. 80302a8: 2902 cmp r1, #2
  46727. 80302aa: f894 2046 ldrb.w r2, [r4, #70] ; 0x46
  46728. 80302ae: d101 bne.n 80302b4 <tcp_slowtmr+0x48>
  46729. 80302b0: 2a06 cmp r2, #6
  46730. 80302b2: d051 beq.n 8030358 <tcp_slowtmr+0xec>
  46731. ++pcb_remove;
  46732. LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: max SYN retries reached\n"));
  46733. }
  46734. else if (pcb->nrtx == TCP_MAXRTX) {
  46735. 80302b4: 2a0c cmp r2, #12
  46736. 80302b6: d04f beq.n 8030358 <tcp_slowtmr+0xec>
  46737. ++pcb_remove;
  46738. LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: max DATA retries reached\n"));
  46739. } else {
  46740. if (pcb->persist_backoff > 0) {
  46741. 80302b8: f894 3091 ldrb.w r3, [r4, #145] ; 0x91
  46742. 80302bc: b1c3 cbz r3, 80302f0 <tcp_slowtmr+0x84>
  46743. /* If snd_wnd is zero, use persist timer to send 1 byte probes
  46744. * instead of using the standard retransmission mechanism. */
  46745. pcb->persist_cnt++;
  46746. if (pcb->persist_cnt >= tcp_persist_backoff[pcb->persist_backoff-1]) {
  46747. 80302be: 498b ldr r1, [pc, #556] ; (80304ec <tcp_slowtmr+0x280>)
  46748. LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: max DATA retries reached\n"));
  46749. } else {
  46750. if (pcb->persist_backoff > 0) {
  46751. /* If snd_wnd is zero, use persist timer to send 1 byte probes
  46752. * instead of using the standard retransmission mechanism. */
  46753. pcb->persist_cnt++;
  46754. 80302c0: f894 2090 ldrb.w r2, [r4, #144] ; 0x90
  46755. if (pcb->persist_cnt >= tcp_persist_backoff[pcb->persist_backoff-1]) {
  46756. 80302c4: 18c9 adds r1, r1, r3
  46757. LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: max DATA retries reached\n"));
  46758. } else {
  46759. if (pcb->persist_backoff > 0) {
  46760. /* If snd_wnd is zero, use persist timer to send 1 byte probes
  46761. * instead of using the standard retransmission mechanism. */
  46762. pcb->persist_cnt++;
  46763. 80302c6: 3201 adds r2, #1
  46764. if (pcb->persist_cnt >= tcp_persist_backoff[pcb->persist_backoff-1]) {
  46765. 80302c8: f811 1c01 ldrb.w r1, [r1, #-1]
  46766. LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: max DATA retries reached\n"));
  46767. } else {
  46768. if (pcb->persist_backoff > 0) {
  46769. /* If snd_wnd is zero, use persist timer to send 1 byte probes
  46770. * instead of using the standard retransmission mechanism. */
  46771. pcb->persist_cnt++;
  46772. 80302cc: b2d2 uxtb r2, r2
  46773. if (pcb->persist_cnt >= tcp_persist_backoff[pcb->persist_backoff-1]) {
  46774. 80302ce: 4291 cmp r1, r2
  46775. LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: max DATA retries reached\n"));
  46776. } else {
  46777. if (pcb->persist_backoff > 0) {
  46778. /* If snd_wnd is zero, use persist timer to send 1 byte probes
  46779. * instead of using the standard retransmission mechanism. */
  46780. pcb->persist_cnt++;
  46781. 80302d0: f884 2090 strb.w r2, [r4, #144] ; 0x90
  46782. if (pcb->persist_cnt >= tcp_persist_backoff[pcb->persist_backoff-1]) {
  46783. 80302d4: d900 bls.n 80302d8 <tcp_slowtmr+0x6c>
  46784. 80302d6: e03d b.n 8030354 <tcp_slowtmr+0xe8>
  46785. pcb->persist_cnt = 0;
  46786. 80302d8: 2200 movs r2, #0
  46787. if (pcb->persist_backoff < sizeof(tcp_persist_backoff)) {
  46788. 80302da: 2b06 cmp r3, #6
  46789. if (pcb->persist_backoff > 0) {
  46790. /* If snd_wnd is zero, use persist timer to send 1 byte probes
  46791. * instead of using the standard retransmission mechanism. */
  46792. pcb->persist_cnt++;
  46793. if (pcb->persist_cnt >= tcp_persist_backoff[pcb->persist_backoff-1]) {
  46794. pcb->persist_cnt = 0;
  46795. 80302dc: f884 2090 strb.w r2, [r4, #144] ; 0x90
  46796. if (pcb->persist_backoff < sizeof(tcp_persist_backoff)) {
  46797. 80302e0: d802 bhi.n 80302e8 <tcp_slowtmr+0x7c>
  46798. pcb->persist_backoff++;
  46799. 80302e2: 3301 adds r3, #1
  46800. 80302e4: f884 3091 strb.w r3, [r4, #145] ; 0x91
  46801. }
  46802. tcp_zero_window_probe(pcb);
  46803. 80302e8: 4620 mov r0, r4
  46804. 80302ea: f001 ff04 bl 80320f6 <tcp_zero_window_probe>
  46805. 80302ee: e031 b.n 8030354 <tcp_slowtmr+0xe8>
  46806. }
  46807. } else {
  46808. /* Increase the retransmission timer if it is running */
  46809. if(pcb->rtime >= 0) {
  46810. 80302f0: 8ea3 ldrh r3, [r4, #52] ; 0x34
  46811. 80302f2: 0418 lsls r0, r3, #16
  46812. 80302f4: d401 bmi.n 80302fa <tcp_slowtmr+0x8e>
  46813. ++pcb->rtime;
  46814. 80302f6: 3301 adds r3, #1
  46815. 80302f8: 86a3 strh r3, [r4, #52] ; 0x34
  46816. }
  46817. if (pcb->unacked != NULL && pcb->rtime >= pcb->rto) {
  46818. 80302fa: 6f23 ldr r3, [r4, #112] ; 0x70
  46819. 80302fc: b353 cbz r3, 8030354 <tcp_slowtmr+0xe8>
  46820. 80302fe: f9b4 0034 ldrsh.w r0, [r4, #52] ; 0x34
  46821. 8030302: f9b4 3044 ldrsh.w r3, [r4, #68] ; 0x44
  46822. 8030306: 4298 cmp r0, r3
  46823. 8030308: db24 blt.n 8030354 <tcp_slowtmr+0xe8>
  46824. " pcb->rto %"S16_F"\n",
  46825. pcb->rtime, pcb->rto));
  46826. /* Double retransmission time-out unless we are trying to
  46827. * connect to somebody (i.e., we are in SYN_SENT). */
  46828. if (pcb->state != SYN_SENT) {
  46829. 803030a: 2902 cmp r1, #2
  46830. 803030c: d00b beq.n 8030326 <tcp_slowtmr+0xba>
  46831. pcb->rto = ((pcb->sa >> 3) + pcb->sv) << tcp_backoff[pcb->nrtx];
  46832. 803030e: f9b4 1040 ldrsh.w r1, [r4, #64] ; 0x40
  46833. 8030312: f9b4 3042 ldrsh.w r3, [r4, #66] ; 0x42
  46834. 8030316: eb03 03e1 add.w r3, r3, r1, asr #3
  46835. 803031a: 4975 ldr r1, [pc, #468] ; (80304f0 <tcp_slowtmr+0x284>)
  46836. 803031c: 5c8a ldrb r2, [r1, r2]
  46837. 803031e: fa03 f302 lsl.w r3, r3, r2
  46838. 8030322: f8a4 3044 strh.w r3, [r4, #68] ; 0x44
  46839. }
  46840. /* Reset the retransmission timer. */
  46841. pcb->rtime = 0;
  46842. 8030326: 2300 movs r3, #0
  46843. /* Reduce congestion window and ssthresh. */
  46844. eff_wnd = LWIP_MIN(pcb->cwnd, pcb->snd_wnd);
  46845. 8030328: f8b4 104c ldrh.w r1, [r4, #76] ; 0x4c
  46846. if (pcb->state != SYN_SENT) {
  46847. pcb->rto = ((pcb->sa >> 3) + pcb->sv) << tcp_backoff[pcb->nrtx];
  46848. }
  46849. /* Reset the retransmission timer. */
  46850. pcb->rtime = 0;
  46851. 803032c: 86a3 strh r3, [r4, #52] ; 0x34
  46852. /* Reduce congestion window and ssthresh. */
  46853. eff_wnd = LWIP_MIN(pcb->cwnd, pcb->snd_wnd);
  46854. 803032e: f8b4 3060 ldrh.w r3, [r4, #96] ; 0x60
  46855. pcb->ssthresh = eff_wnd >> 1;
  46856. 8030332: 4299 cmp r1, r3
  46857. 8030334: bf28 it cs
  46858. 8030336: 4619 movcs r1, r3
  46859. if (pcb->ssthresh < (pcb->mss << 1)) {
  46860. 8030338: 8ee3 ldrh r3, [r4, #54] ; 0x36
  46861. /* Reset the retransmission timer. */
  46862. pcb->rtime = 0;
  46863. /* Reduce congestion window and ssthresh. */
  46864. eff_wnd = LWIP_MIN(pcb->cwnd, pcb->snd_wnd);
  46865. pcb->ssthresh = eff_wnd >> 1;
  46866. 803033a: 0849 lsrs r1, r1, #1
  46867. if (pcb->ssthresh < (pcb->mss << 1)) {
  46868. 803033c: 005a lsls r2, r3, #1
  46869. 803033e: 4291 cmp r1, r2
  46870. /* Reset the retransmission timer. */
  46871. pcb->rtime = 0;
  46872. /* Reduce congestion window and ssthresh. */
  46873. eff_wnd = LWIP_MIN(pcb->cwnd, pcb->snd_wnd);
  46874. pcb->ssthresh = eff_wnd >> 1;
  46875. 8030340: f8a4 104e strh.w r1, [r4, #78] ; 0x4e
  46876. if (pcb->ssthresh < (pcb->mss << 1)) {
  46877. pcb->ssthresh = (pcb->mss << 1);
  46878. }
  46879. pcb->cwnd = pcb->mss;
  46880. 8030344: f8a4 304c strh.w r3, [r4, #76] ; 0x4c
  46881. /* Reduce congestion window and ssthresh. */
  46882. eff_wnd = LWIP_MIN(pcb->cwnd, pcb->snd_wnd);
  46883. pcb->ssthresh = eff_wnd >> 1;
  46884. if (pcb->ssthresh < (pcb->mss << 1)) {
  46885. pcb->ssthresh = (pcb->mss << 1);
  46886. 8030348: bfb8 it lt
  46887. 803034a: f8a4 204e strhlt.w r2, [r4, #78] ; 0x4e
  46888. " ssthresh %"U16_F"\n",
  46889. pcb->cwnd, pcb->ssthresh));
  46890. /* The following needs to be called AFTER cwnd is set to one
  46891. mss - STJ */
  46892. tcp_rexmit_rto(pcb);
  46893. 803034e: 4620 mov r0, r4
  46894. 8030350: f001 fe40 bl 8031fd4 <tcp_rexmit_rto>
  46895. pcb = pcb->next;
  46896. continue;
  46897. }
  46898. pcb->last_timer = tcp_timer_ctr;
  46899. pcb_remove = 0;
  46900. 8030354: 2500 movs r5, #0
  46901. 8030356: e000 b.n 803035a <tcp_slowtmr+0xee>
  46902. pcb_reset = 0;
  46903. if (pcb->state == SYN_SENT && pcb->nrtx == TCP_SYNMAXRTX) {
  46904. ++pcb_remove;
  46905. 8030358: 2501 movs r5, #1
  46906. tcp_rexmit_rto(pcb);
  46907. }
  46908. }
  46909. }
  46910. /* Check if this PCB has stayed too long in FIN-WAIT-2 */
  46911. if (pcb->state == FIN_WAIT_2) {
  46912. 803035a: 7e23 ldrb r3, [r4, #24]
  46913. 803035c: 2b06 cmp r3, #6
  46914. 803035e: d10c bne.n 803037a <tcp_slowtmr+0x10e>
  46915. /* If this PCB is in FIN_WAIT_2 because of SHUT_WR don't let it time out. */
  46916. if (pcb->flags & TF_RXCLOSED) {
  46917. 8030360: 7fa2 ldrb r2, [r4, #30]
  46918. 8030362: f002 0210 and.w r2, r2, #16
  46919. 8030366: b2d2 uxtb r2, r2
  46920. 8030368: b13a cbz r2, 803037a <tcp_slowtmr+0x10e>
  46921. /* PCB was fully closed (either through close() or SHUT_RDWR):
  46922. normal FIN-WAIT timeout handling. */
  46923. if ((u32_t)(tcp_ticks - pcb->tmr) >
  46924. 803036a: 4a5d ldr r2, [pc, #372] ; (80304e0 <tcp_slowtmr+0x274>)
  46925. 803036c: 6811 ldr r1, [r2, #0]
  46926. 803036e: 6a62 ldr r2, [r4, #36] ; 0x24
  46927. 8030370: 1a8a subs r2, r1, r2
  46928. 8030372: 2a28 cmp r2, #40 ; 0x28
  46929. 8030374: d901 bls.n 803037a <tcp_slowtmr+0x10e>
  46930. TCP_FIN_WAIT_TIMEOUT / TCP_SLOW_INTERVAL) {
  46931. ++pcb_remove;
  46932. 8030376: 3501 adds r5, #1
  46933. 8030378: b2ed uxtb r5, r5
  46934. }
  46935. }
  46936. }
  46937. /* Check if KEEPALIVE should be sent */
  46938. if(ip_get_option(pcb, SOF_KEEPALIVE) &&
  46939. 803037a: 7a27 ldrb r7, [r4, #8]
  46940. 803037c: f007 0708 and.w r7, r7, #8
  46941. 8030380: b2ff uxtb r7, r7
  46942. 8030382: b34f cbz r7, 80303d8 <tcp_slowtmr+0x16c>
  46943. 8030384: 2b04 cmp r3, #4
  46944. 8030386: d001 beq.n 803038c <tcp_slowtmr+0x120>
  46945. ((pcb->state == ESTABLISHED) ||
  46946. 8030388: 2b07 cmp r3, #7
  46947. 803038a: d124 bne.n 80303d6 <tcp_slowtmr+0x16a>
  46948. (pcb->state == CLOSE_WAIT))) {
  46949. if((u32_t)(tcp_ticks - pcb->tmr) >
  46950. 803038c: 4b54 ldr r3, [pc, #336] ; (80304e0 <tcp_slowtmr+0x274>)
  46951. (pcb->keep_idle + TCP_KEEP_DUR(pcb)) / TCP_SLOW_INTERVAL)
  46952. 803038e: f8d4 008c ldr.w r0, [r4, #140] ; 0x8c
  46953. /* Check if KEEPALIVE should be sent */
  46954. if(ip_get_option(pcb, SOF_KEEPALIVE) &&
  46955. ((pcb->state == ESTABLISHED) ||
  46956. (pcb->state == CLOSE_WAIT))) {
  46957. if((u32_t)(tcp_ticks - pcb->tmr) >
  46958. 8030392: 681a ldr r2, [r3, #0]
  46959. 8030394: 6a63 ldr r3, [r4, #36] ; 0x24
  46960. 8030396: 1ad2 subs r2, r2, r3
  46961. (pcb->keep_idle + TCP_KEEP_DUR(pcb)) / TCP_SLOW_INTERVAL)
  46962. 8030398: f500 2324 add.w r3, r0, #671744 ; 0xa4000
  46963. 803039c: f603 43b8 addw r3, r3, #3256 ; 0xcb8
  46964. 80303a0: f44f 71fa mov.w r1, #500 ; 0x1f4
  46965. 80303a4: fbb3 f3f1 udiv r3, r3, r1
  46966. /* Check if KEEPALIVE should be sent */
  46967. if(ip_get_option(pcb, SOF_KEEPALIVE) &&
  46968. ((pcb->state == ESTABLISHED) ||
  46969. (pcb->state == CLOSE_WAIT))) {
  46970. if((u32_t)(tcp_ticks - pcb->tmr) >
  46971. 80303a8: 429a cmp r2, r3
  46972. 80303aa: d903 bls.n 80303b4 <tcp_slowtmr+0x148>
  46973. {
  46974. LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: KEEPALIVE timeout. Aborting connection to %"U16_F".%"U16_F".%"U16_F".%"U16_F".\n",
  46975. ip4_addr1_16(&pcb->remote_ip), ip4_addr2_16(&pcb->remote_ip),
  46976. ip4_addr3_16(&pcb->remote_ip), ip4_addr4_16(&pcb->remote_ip)));
  46977. ++pcb_remove;
  46978. 80303ac: 3501 adds r5, #1
  46979. 80303ae: b2ed uxtb r5, r5
  46980. ++pcb_reset;
  46981. 80303b0: 2701 movs r7, #1
  46982. 80303b2: e011 b.n 80303d8 <tcp_slowtmr+0x16c>
  46983. }
  46984. else if((u32_t)(tcp_ticks - pcb->tmr) >
  46985. (pcb->keep_idle + pcb->keep_cnt_sent * TCP_KEEP_INTVL(pcb))
  46986. 80303b4: f894 3092 ldrb.w r3, [r4, #146] ; 0x92
  46987. 80303b8: 4f4e ldr r7, [pc, #312] ; (80304f4 <tcp_slowtmr+0x288>)
  46988. 80303ba: fb07 0003 mla r0, r7, r3, r0
  46989. / TCP_SLOW_INTERVAL)
  46990. 80303be: fbb0 f1f1 udiv r1, r0, r1
  46991. ip4_addr3_16(&pcb->remote_ip), ip4_addr4_16(&pcb->remote_ip)));
  46992. ++pcb_remove;
  46993. ++pcb_reset;
  46994. }
  46995. else if((u32_t)(tcp_ticks - pcb->tmr) >
  46996. 80303c2: 428a cmp r2, r1
  46997. 80303c4: d907 bls.n 80303d6 <tcp_slowtmr+0x16a>
  46998. (pcb->keep_idle + pcb->keep_cnt_sent * TCP_KEEP_INTVL(pcb))
  46999. / TCP_SLOW_INTERVAL)
  47000. {
  47001. tcp_keepalive(pcb);
  47002. 80303c6: 4620 mov r0, r4
  47003. 80303c8: f001 fe76 bl 80320b8 <tcp_keepalive>
  47004. pcb->keep_cnt_sent++;
  47005. 80303cc: f894 3092 ldrb.w r3, [r4, #146] ; 0x92
  47006. 80303d0: 3301 adds r3, #1
  47007. 80303d2: f884 3092 strb.w r3, [r4, #146] ; 0x92
  47008. continue;
  47009. }
  47010. pcb->last_timer = tcp_timer_ctr;
  47011. pcb_remove = 0;
  47012. pcb_reset = 0;
  47013. 80303d6: 2700 movs r7, #0
  47014. LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_slowtmr: dropping OOSEQ queued data\n"));
  47015. }
  47016. #endif /* TCP_QUEUE_OOSEQ */
  47017. /* Check if this PCB has stayed too long in SYN-RCVD */
  47018. if (pcb->state == SYN_RCVD) {
  47019. 80303d8: 7e23 ldrb r3, [r4, #24]
  47020. 80303da: 2b03 cmp r3, #3
  47021. 80303dc: d108 bne.n 80303f0 <tcp_slowtmr+0x184>
  47022. if ((u32_t)(tcp_ticks - pcb->tmr) >
  47023. 80303de: 4b40 ldr r3, [pc, #256] ; (80304e0 <tcp_slowtmr+0x274>)
  47024. 80303e0: 681a ldr r2, [r3, #0]
  47025. 80303e2: 6a63 ldr r3, [r4, #36] ; 0x24
  47026. 80303e4: 1ad3 subs r3, r2, r3
  47027. 80303e6: 2b28 cmp r3, #40 ; 0x28
  47028. 80303e8: d90a bls.n 8030400 <tcp_slowtmr+0x194>
  47029. TCP_SYN_RCVD_TIMEOUT / TCP_SLOW_INTERVAL) {
  47030. ++pcb_remove;
  47031. 80303ea: 3501 adds r5, #1
  47032. 80303ec: b2ed uxtb r5, r5
  47033. 80303ee: e007 b.n 8030400 <tcp_slowtmr+0x194>
  47034. LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: removing pcb stuck in SYN-RCVD\n"));
  47035. }
  47036. }
  47037. /* Check if this PCB has stayed too long in LAST-ACK */
  47038. if (pcb->state == LAST_ACK) {
  47039. 80303f0: 2b09 cmp r3, #9
  47040. 80303f2: d105 bne.n 8030400 <tcp_slowtmr+0x194>
  47041. if ((u32_t)(tcp_ticks - pcb->tmr) > 2 * TCP_MSL / TCP_SLOW_INTERVAL) {
  47042. 80303f4: 4b3a ldr r3, [pc, #232] ; (80304e0 <tcp_slowtmr+0x274>)
  47043. 80303f6: 681a ldr r2, [r3, #0]
  47044. 80303f8: 6a63 ldr r3, [r4, #36] ; 0x24
  47045. 80303fa: 1ad3 subs r3, r2, r3
  47046. 80303fc: 2bf0 cmp r3, #240 ; 0xf0
  47047. 80303fe: d800 bhi.n 8030402 <tcp_slowtmr+0x196>
  47048. LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: removing pcb stuck in LAST-ACK\n"));
  47049. }
  47050. }
  47051. /* If the PCB should be removed, do it. */
  47052. if (pcb_remove) {
  47053. 8030400: b345 cbz r5, 8030454 <tcp_slowtmr+0x1e8>
  47054. struct tcp_pcb *pcb2;
  47055. tcp_err_fn err_fn;
  47056. void *err_arg;
  47057. tcp_pcb_purge(pcb);
  47058. 8030402: 4620 mov r0, r4
  47059. 8030404: f7ff ff14 bl 8030230 <tcp_pcb_purge>
  47060. 8030408: 68e3 ldr r3, [r4, #12]
  47061. /* Remove PCB from tcp_active_pcbs list. */
  47062. if (prev != NULL) {
  47063. 803040a: b10e cbz r6, 8030410 <tcp_slowtmr+0x1a4>
  47064. LWIP_ASSERT("tcp_slowtmr: middle tcp != tcp_active_pcbs", pcb != tcp_active_pcbs);
  47065. prev->next = pcb->next;
  47066. 803040c: 60f3 str r3, [r6, #12]
  47067. 803040e: e001 b.n 8030414 <tcp_slowtmr+0x1a8>
  47068. } else {
  47069. /* This PCB was the first. */
  47070. LWIP_ASSERT("tcp_slowtmr: first pcb == tcp_active_pcbs", tcp_active_pcbs == pcb);
  47071. tcp_active_pcbs = pcb->next;
  47072. 8030410: 4a35 ldr r2, [pc, #212] ; (80304e8 <tcp_slowtmr+0x27c>)
  47073. 8030412: 6013 str r3, [r2, #0]
  47074. }
  47075. if (pcb_reset) {
  47076. 8030414: b14f cbz r7, 803042a <tcp_slowtmr+0x1be>
  47077. tcp_rst(pcb->snd_nxt, pcb->rcv_nxt, &pcb->local_ip, &pcb->remote_ip,
  47078. 8030416: 8b63 ldrh r3, [r4, #26]
  47079. 8030418: 9300 str r3, [sp, #0]
  47080. 803041a: 8ba3 ldrh r3, [r4, #28]
  47081. 803041c: 9301 str r3, [sp, #4]
  47082. 803041e: 6d20 ldr r0, [r4, #80] ; 0x50
  47083. 8030420: 6aa1 ldr r1, [r4, #40] ; 0x28
  47084. 8030422: 4622 mov r2, r4
  47085. 8030424: 1d23 adds r3, r4, #4
  47086. 8030426: f001 fd8f bl 8031f48 <tcp_rst>
  47087. pcb->local_port, pcb->remote_port);
  47088. }
  47089. err_fn = pcb->errf;
  47090. 803042a: f8d4 5088 ldr.w r5, [r4, #136] ; 0x88
  47091. err_arg = pcb->callback_arg;
  47092. 803042e: f8d4 b010 ldr.w fp, [r4, #16]
  47093. pcb2 = pcb;
  47094. pcb = pcb->next;
  47095. 8030432: 68e7 ldr r7, [r4, #12]
  47096. memp_free(MEMP_TCP_PCB, pcb2);
  47097. 8030434: 2002 movs r0, #2
  47098. 8030436: 4621 mov r1, r4
  47099. 8030438: f7ff fb1c bl 802fa74 <memp_free>
  47100. tcp_active_pcbs_changed = 0;
  47101. 803043c: 2300 movs r3, #0
  47102. 803043e: f888 3000 strb.w r3, [r8]
  47103. TCP_EVENT_ERR(err_fn, err_arg, ERR_ABRT);
  47104. 8030442: b11d cbz r5, 803044c <tcp_slowtmr+0x1e0>
  47105. 8030444: 4658 mov r0, fp
  47106. 8030446: f06f 0109 mvn.w r1, #9
  47107. 803044a: 47a8 blx r5
  47108. if (tcp_active_pcbs_changed) {
  47109. 803044c: f899 3000 ldrb.w r3, [r9]
  47110. 8030450: b1f3 cbz r3, 8030490 <tcp_slowtmr+0x224>
  47111. 8030452: e718 b.n 8030286 <tcp_slowtmr+0x1a>
  47112. /* get the 'next' element now and work with 'prev' below (in case of abort) */
  47113. prev = pcb;
  47114. pcb = pcb->next;
  47115. /* We check if we should poll the connection. */
  47116. ++prev->polltmr;
  47117. 8030454: 7fe3 ldrb r3, [r4, #31]
  47118. if (prev->polltmr >= prev->pollinterval) {
  47119. 8030456: f894 2020 ldrb.w r2, [r4, #32]
  47120. goto tcp_slowtmr_start;
  47121. }
  47122. } else {
  47123. /* get the 'next' element now and work with 'prev' below (in case of abort) */
  47124. prev = pcb;
  47125. pcb = pcb->next;
  47126. 803045a: 68e7 ldr r7, [r4, #12]
  47127. /* We check if we should poll the connection. */
  47128. ++prev->polltmr;
  47129. 803045c: 3301 adds r3, #1
  47130. 803045e: b2db uxtb r3, r3
  47131. if (prev->polltmr >= prev->pollinterval) {
  47132. 8030460: 429a cmp r2, r3
  47133. /* get the 'next' element now and work with 'prev' below (in case of abort) */
  47134. prev = pcb;
  47135. pcb = pcb->next;
  47136. /* We check if we should poll the connection. */
  47137. ++prev->polltmr;
  47138. 8030462: 77e3 strb r3, [r4, #31]
  47139. if (prev->polltmr >= prev->pollinterval) {
  47140. 8030464: d813 bhi.n 803048e <tcp_slowtmr+0x222>
  47141. prev->polltmr = 0;
  47142. LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: polling application\n"));
  47143. tcp_active_pcbs_changed = 0;
  47144. TCP_EVENT_POLL(prev, err);
  47145. 8030466: f8d4 3084 ldr.w r3, [r4, #132] ; 0x84
  47146. pcb = pcb->next;
  47147. /* We check if we should poll the connection. */
  47148. ++prev->polltmr;
  47149. if (prev->polltmr >= prev->pollinterval) {
  47150. prev->polltmr = 0;
  47151. 803046a: 77e5 strb r5, [r4, #31]
  47152. LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: polling application\n"));
  47153. tcp_active_pcbs_changed = 0;
  47154. 803046c: f888 5000 strb.w r5, [r8]
  47155. TCP_EVENT_POLL(prev, err);
  47156. 8030470: b11b cbz r3, 803047a <tcp_slowtmr+0x20e>
  47157. 8030472: 6920 ldr r0, [r4, #16]
  47158. 8030474: 4621 mov r1, r4
  47159. 8030476: 4798 blx r3
  47160. 8030478: e000 b.n 803047c <tcp_slowtmr+0x210>
  47161. 803047a: 4628 mov r0, r5
  47162. if (tcp_active_pcbs_changed) {
  47163. 803047c: f899 3000 ldrb.w r3, [r9]
  47164. 8030480: 2b00 cmp r3, #0
  47165. 8030482: f47f af00 bne.w 8030286 <tcp_slowtmr+0x1a>
  47166. goto tcp_slowtmr_start;
  47167. }
  47168. /* if err == ERR_ABRT, 'prev' is already deallocated */
  47169. if (err == ERR_OK) {
  47170. 8030486: b910 cbnz r0, 803048e <tcp_slowtmr+0x222>
  47171. tcp_output(prev);
  47172. 8030488: 4620 mov r0, r4
  47173. 803048a: f001 fc39 bl 8031d00 <tcp_output>
  47174. TCP_EVENT_POLL(prev, err);
  47175. if (tcp_active_pcbs_changed) {
  47176. goto tcp_slowtmr_start;
  47177. }
  47178. /* if err == ERR_ABRT, 'prev' is already deallocated */
  47179. if (err == ERR_OK) {
  47180. 803048e: 4626 mov r6, r4
  47181. prev = pcb;
  47182. pcb = pcb->next;
  47183. /* We check if we should poll the connection. */
  47184. ++prev->polltmr;
  47185. if (prev->polltmr >= prev->pollinterval) {
  47186. 8030490: 463c mov r4, r7
  47187. prev = NULL;
  47188. pcb = tcp_active_pcbs;
  47189. if (pcb == NULL) {
  47190. LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: no active pcbs\n"));
  47191. }
  47192. while (pcb != NULL) {
  47193. 8030492: 2c00 cmp r4, #0
  47194. 8030494: f47f aefd bne.w 8030292 <tcp_slowtmr+0x26>
  47195. }
  47196. /* Steps through all of the TIME-WAIT PCBs. */
  47197. prev = NULL;
  47198. pcb = tcp_tw_pcbs;
  47199. 8030498: 4b17 ldr r3, [pc, #92] ; (80304f8 <tcp_slowtmr+0x28c>)
  47200. while (pcb != NULL) {
  47201. LWIP_ASSERT("tcp_slowtmr: TIME-WAIT pcb->state == TIME-WAIT", pcb->state == TIME_WAIT);
  47202. pcb_remove = 0;
  47203. /* Check if this PCB has stayed long enough in TIME-WAIT */
  47204. if ((u32_t)(tcp_ticks - pcb->tmr) > 2 * TCP_MSL / TCP_SLOW_INTERVAL) {
  47205. 803049a: 4e11 ldr r6, [pc, #68] ; (80304e0 <tcp_slowtmr+0x274>)
  47206. }
  47207. /* Steps through all of the TIME-WAIT PCBs. */
  47208. prev = NULL;
  47209. pcb = tcp_tw_pcbs;
  47210. 803049c: 681d ldr r5, [r3, #0]
  47211. LWIP_ASSERT("tcp_slowtmr: middle tcp != tcp_tw_pcbs", pcb != tcp_tw_pcbs);
  47212. prev->next = pcb->next;
  47213. } else {
  47214. /* This PCB was the first. */
  47215. LWIP_ASSERT("tcp_slowtmr: first pcb == tcp_tw_pcbs", tcp_tw_pcbs == pcb);
  47216. tcp_tw_pcbs = pcb->next;
  47217. 803049e: 461f mov r7, r3
  47218. /* Steps through all of the TIME-WAIT PCBs. */
  47219. prev = NULL;
  47220. pcb = tcp_tw_pcbs;
  47221. while (pcb != NULL) {
  47222. 80304a0: e00f b.n 80304c2 <tcp_slowtmr+0x256>
  47223. LWIP_ASSERT("tcp_slowtmr: TIME-WAIT pcb->state == TIME-WAIT", pcb->state == TIME_WAIT);
  47224. pcb_remove = 0;
  47225. /* Check if this PCB has stayed long enough in TIME-WAIT */
  47226. if ((u32_t)(tcp_ticks - pcb->tmr) > 2 * TCP_MSL / TCP_SLOW_INTERVAL) {
  47227. 80304a2: 6832 ldr r2, [r6, #0]
  47228. 80304a4: 6a6b ldr r3, [r5, #36] ; 0x24
  47229. 80304a6: 1ad3 subs r3, r2, r3
  47230. 80304a8: 2bf0 cmp r3, #240 ; 0xf0
  47231. 80304aa: d810 bhi.n 80304ce <tcp_slowtmr+0x262>
  47232. 80304ac: e00c b.n 80304c8 <tcp_slowtmr+0x25c>
  47233. struct tcp_pcb *pcb2;
  47234. tcp_pcb_purge(pcb);
  47235. /* Remove PCB from tcp_tw_pcbs list. */
  47236. if (prev != NULL) {
  47237. LWIP_ASSERT("tcp_slowtmr: middle tcp != tcp_tw_pcbs", pcb != tcp_tw_pcbs);
  47238. prev->next = pcb->next;
  47239. 80304ae: 60e2 str r2, [r4, #12]
  47240. 80304b0: e000 b.n 80304b4 <tcp_slowtmr+0x248>
  47241. } else {
  47242. /* This PCB was the first. */
  47243. LWIP_ASSERT("tcp_slowtmr: first pcb == tcp_tw_pcbs", tcp_tw_pcbs == pcb);
  47244. tcp_tw_pcbs = pcb->next;
  47245. 80304b2: 603a str r2, [r7, #0]
  47246. }
  47247. pcb2 = pcb;
  47248. pcb = pcb->next;
  47249. memp_free(MEMP_TCP_PCB, pcb2);
  47250. 80304b4: 4629 mov r1, r5
  47251. 80304b6: 2002 movs r0, #2
  47252. /* This PCB was the first. */
  47253. LWIP_ASSERT("tcp_slowtmr: first pcb == tcp_tw_pcbs", tcp_tw_pcbs == pcb);
  47254. tcp_tw_pcbs = pcb->next;
  47255. }
  47256. pcb2 = pcb;
  47257. pcb = pcb->next;
  47258. 80304b8: f8d5 800c ldr.w r8, [r5, #12]
  47259. memp_free(MEMP_TCP_PCB, pcb2);
  47260. 80304bc: f7ff fada bl 802fa74 <memp_free>
  47261. /* This PCB was the first. */
  47262. LWIP_ASSERT("tcp_slowtmr: first pcb == tcp_tw_pcbs", tcp_tw_pcbs == pcb);
  47263. tcp_tw_pcbs = pcb->next;
  47264. }
  47265. pcb2 = pcb;
  47266. pcb = pcb->next;
  47267. 80304c0: 4645 mov r5, r8
  47268. /* Steps through all of the TIME-WAIT PCBs. */
  47269. prev = NULL;
  47270. pcb = tcp_tw_pcbs;
  47271. while (pcb != NULL) {
  47272. 80304c2: 2d00 cmp r5, #0
  47273. 80304c4: d1ed bne.n 80304a2 <tcp_slowtmr+0x236>
  47274. 80304c6: e009 b.n 80304dc <tcp_slowtmr+0x270>
  47275. pcb2 = pcb;
  47276. pcb = pcb->next;
  47277. memp_free(MEMP_TCP_PCB, pcb2);
  47278. } else {
  47279. prev = pcb;
  47280. pcb = pcb->next;
  47281. 80304c8: 462c mov r4, r5
  47282. 80304ca: 68ed ldr r5, [r5, #12]
  47283. 80304cc: e7f9 b.n 80304c2 <tcp_slowtmr+0x256>
  47284. /* If the PCB should be removed, do it. */
  47285. if (pcb_remove) {
  47286. struct tcp_pcb *pcb2;
  47287. tcp_pcb_purge(pcb);
  47288. 80304ce: 4628 mov r0, r5
  47289. 80304d0: f7ff feae bl 8030230 <tcp_pcb_purge>
  47290. 80304d4: 68ea ldr r2, [r5, #12]
  47291. /* Remove PCB from tcp_tw_pcbs list. */
  47292. if (prev != NULL) {
  47293. 80304d6: 2c00 cmp r4, #0
  47294. 80304d8: d1e9 bne.n 80304ae <tcp_slowtmr+0x242>
  47295. 80304da: e7ea b.n 80304b2 <tcp_slowtmr+0x246>
  47296. } else {
  47297. prev = pcb;
  47298. pcb = pcb->next;
  47299. }
  47300. }
  47301. }
  47302. 80304dc: e8bd 8ffe ldmia.w sp!, {r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, pc}
  47303. 80304e0: 2000ff24 .word 0x2000ff24
  47304. 80304e4: 2000c431 .word 0x2000c431
  47305. 80304e8: 2000ff20 .word 0x2000ff20
  47306. 80304ec: 08044739 .word 0x08044739
  47307. 80304f0: 0804472c .word 0x0804472c
  47308. 80304f4: 000124f8 .word 0x000124f8
  47309. 80304f8: 2000ff34 .word 0x2000ff34
  47310. 80304fc: 2000ff1c .word 0x2000ff1c
  47311. 08030500 <tcp_pcb_remove>:
  47312. * @param pcb tcp_pcb to purge. The pcb itself is NOT deallocated!
  47313. */
  47314. void
  47315. tcp_pcb_remove(struct tcp_pcb **pcblist, struct tcp_pcb *pcb)
  47316. {
  47317. TCP_RMV(pcblist, pcb);
  47318. 8030500: 6803 ldr r3, [r0, #0]
  47319. 8030502: 428b cmp r3, r1
  47320. * @param pcblist PCB list to purge.
  47321. * @param pcb tcp_pcb to purge. The pcb itself is NOT deallocated!
  47322. */
  47323. void
  47324. tcp_pcb_remove(struct tcp_pcb **pcblist, struct tcp_pcb *pcb)
  47325. {
  47326. 8030504: b510 push {r4, lr}
  47327. 8030506: 460c mov r4, r1
  47328. TCP_RMV(pcblist, pcb);
  47329. 8030508: d102 bne.n 8030510 <tcp_pcb_remove+0x10>
  47330. 803050a: 68cb ldr r3, [r1, #12]
  47331. 803050c: 6003 str r3, [r0, #0]
  47332. 803050e: e00d b.n 803052c <tcp_pcb_remove+0x2c>
  47333. 8030510: 4a11 ldr r2, [pc, #68] ; (8030558 <tcp_pcb_remove+0x58>)
  47334. 8030512: 6013 str r3, [r2, #0]
  47335. 8030514: e007 b.n 8030526 <tcp_pcb_remove+0x26>
  47336. 8030516: 68d9 ldr r1, [r3, #12]
  47337. 8030518: 42a1 cmp r1, r4
  47338. 803051a: d103 bne.n 8030524 <tcp_pcb_remove+0x24>
  47339. 803051c: 6013 str r3, [r2, #0]
  47340. 803051e: 68e2 ldr r2, [r4, #12]
  47341. 8030520: 60da str r2, [r3, #12]
  47342. 8030522: e003 b.n 803052c <tcp_pcb_remove+0x2c>
  47343. 8030524: 460b mov r3, r1
  47344. 8030526: 2b00 cmp r3, #0
  47345. 8030528: d1f5 bne.n 8030516 <tcp_pcb_remove+0x16>
  47346. 803052a: 6013 str r3, [r2, #0]
  47347. 803052c: 2300 movs r3, #0
  47348. 803052e: 60e3 str r3, [r4, #12]
  47349. tcp_pcb_purge(pcb);
  47350. 8030530: 4620 mov r0, r4
  47351. 8030532: f7ff fe7d bl 8030230 <tcp_pcb_purge>
  47352. /* if there is an outstanding delayed ACKs, send it */
  47353. if (pcb->state != TIME_WAIT &&
  47354. 8030536: 7e23 ldrb r3, [r4, #24]
  47355. 8030538: 2b0a cmp r3, #10
  47356. 803053a: d00a beq.n 8030552 <tcp_pcb_remove+0x52>
  47357. 803053c: 2b01 cmp r3, #1
  47358. 803053e: d008 beq.n 8030552 <tcp_pcb_remove+0x52>
  47359. pcb->state != LISTEN &&
  47360. pcb->flags & TF_ACK_DELAY) {
  47361. 8030540: 7fa3 ldrb r3, [r4, #30]
  47362. tcp_pcb_purge(pcb);
  47363. /* if there is an outstanding delayed ACKs, send it */
  47364. if (pcb->state != TIME_WAIT &&
  47365. pcb->state != LISTEN &&
  47366. 8030542: 07da lsls r2, r3, #31
  47367. 8030544: d505 bpl.n 8030552 <tcp_pcb_remove+0x52>
  47368. pcb->flags & TF_ACK_DELAY) {
  47369. pcb->flags |= TF_ACK_NOW;
  47370. 8030546: f043 0302 orr.w r3, r3, #2
  47371. 803054a: 77a3 strb r3, [r4, #30]
  47372. tcp_output(pcb);
  47373. 803054c: 4620 mov r0, r4
  47374. 803054e: f001 fbd7 bl 8031d00 <tcp_output>
  47375. #if TCP_QUEUE_OOSEQ
  47376. LWIP_ASSERT("ooseq segments leaking", pcb->ooseq == NULL);
  47377. #endif /* TCP_QUEUE_OOSEQ */
  47378. }
  47379. pcb->state = CLOSED;
  47380. 8030552: 2300 movs r3, #0
  47381. 8030554: 7623 strb r3, [r4, #24]
  47382. 8030556: bd10 pop {r4, pc}
  47383. 8030558: 2000ff2c .word 0x2000ff2c
  47384. 0803055c <tcp_abandon>:
  47385. LWIP_ASSERT("don't call tcp_abort/tcp_abandon for listen-pcbs",
  47386. pcb->state != LISTEN);
  47387. /* Figure out on which TCP PCB list we are, and remove us. If we
  47388. are in an active state, call the receive function associated with
  47389. the PCB with a NULL argument, and send an RST to the remote end. */
  47390. if (pcb->state == TIME_WAIT) {
  47391. 803055c: 7e03 ldrb r3, [r0, #24]
  47392. 803055e: 2b0a cmp r3, #10
  47393. * @param pcb the tcp_pcb to abort
  47394. * @param reset boolean to indicate whether a reset should be sent
  47395. */
  47396. void
  47397. tcp_abandon(struct tcp_pcb *pcb, int reset)
  47398. {
  47399. 8030560: e92d 43f7 stmdb sp!, {r0, r1, r2, r4, r5, r6, r7, r8, r9, lr}
  47400. 8030564: 4604 mov r4, r0
  47401. 8030566: 4689 mov r9, r1
  47402. LWIP_ASSERT("don't call tcp_abort/tcp_abandon for listen-pcbs",
  47403. pcb->state != LISTEN);
  47404. /* Figure out on which TCP PCB list we are, and remove us. If we
  47405. are in an active state, call the receive function associated with
  47406. the PCB with a NULL argument, and send an RST to the remote end. */
  47407. if (pcb->state == TIME_WAIT) {
  47408. 8030568: d10a bne.n 8030580 <tcp_abandon+0x24>
  47409. tcp_pcb_remove(&tcp_tw_pcbs, pcb);
  47410. 803056a: 4621 mov r1, r4
  47411. 803056c: 481b ldr r0, [pc, #108] ; (80305dc <tcp_abandon+0x80>)
  47412. 803056e: f7ff ffc7 bl 8030500 <tcp_pcb_remove>
  47413. memp_free(MEMP_TCP_PCB, pcb);
  47414. 8030572: 2002 movs r0, #2
  47415. 8030574: 4621 mov r1, r4
  47416. tcp_rst(seqno, ackno, &pcb->local_ip, &pcb->remote_ip, pcb->local_port, pcb->remote_port);
  47417. }
  47418. memp_free(MEMP_TCP_PCB, pcb);
  47419. TCP_EVENT_ERR(errf, errf_arg, ERR_ABRT);
  47420. }
  47421. }
  47422. 8030576: b003 add sp, #12
  47423. 8030578: e8bd 43f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, lr}
  47424. /* Figure out on which TCP PCB list we are, and remove us. If we
  47425. are in an active state, call the receive function associated with
  47426. the PCB with a NULL argument, and send an RST to the remote end. */
  47427. if (pcb->state == TIME_WAIT) {
  47428. tcp_pcb_remove(&tcp_tw_pcbs, pcb);
  47429. memp_free(MEMP_TCP_PCB, pcb);
  47430. 803057c: f7ff ba7a b.w 802fa74 <memp_free>
  47431. } else {
  47432. seqno = pcb->snd_nxt;
  47433. 8030580: f8d0 8050 ldr.w r8, [r0, #80] ; 0x50
  47434. ackno = pcb->rcv_nxt;
  47435. 8030584: 6a87 ldr r7, [r0, #40] ; 0x28
  47436. #if LWIP_CALLBACK_API
  47437. errf = pcb->errf;
  47438. 8030586: f8d0 5088 ldr.w r5, [r0, #136] ; 0x88
  47439. #endif /* LWIP_CALLBACK_API */
  47440. errf_arg = pcb->callback_arg;
  47441. 803058a: 6906 ldr r6, [r0, #16]
  47442. TCP_PCB_REMOVE_ACTIVE(pcb);
  47443. 803058c: 4814 ldr r0, [pc, #80] ; (80305e0 <tcp_abandon+0x84>)
  47444. 803058e: 4621 mov r1, r4
  47445. 8030590: f7ff ffb6 bl 8030500 <tcp_pcb_remove>
  47446. 8030594: 4b13 ldr r3, [pc, #76] ; (80305e4 <tcp_abandon+0x88>)
  47447. if (pcb->unacked != NULL) {
  47448. 8030596: 6f20 ldr r0, [r4, #112] ; 0x70
  47449. ackno = pcb->rcv_nxt;
  47450. #if LWIP_CALLBACK_API
  47451. errf = pcb->errf;
  47452. #endif /* LWIP_CALLBACK_API */
  47453. errf_arg = pcb->callback_arg;
  47454. TCP_PCB_REMOVE_ACTIVE(pcb);
  47455. 8030598: 2201 movs r2, #1
  47456. 803059a: 701a strb r2, [r3, #0]
  47457. if (pcb->unacked != NULL) {
  47458. 803059c: b108 cbz r0, 80305a2 <tcp_abandon+0x46>
  47459. tcp_segs_free(pcb->unacked);
  47460. 803059e: f7ff fe2e bl 80301fe <tcp_segs_free>
  47461. }
  47462. if (pcb->unsent != NULL) {
  47463. 80305a2: 6ee0 ldr r0, [r4, #108] ; 0x6c
  47464. 80305a4: b108 cbz r0, 80305aa <tcp_abandon+0x4e>
  47465. tcp_segs_free(pcb->unsent);
  47466. 80305a6: f7ff fe2a bl 80301fe <tcp_segs_free>
  47467. #if TCP_QUEUE_OOSEQ
  47468. if (pcb->ooseq != NULL) {
  47469. tcp_segs_free(pcb->ooseq);
  47470. }
  47471. #endif /* TCP_QUEUE_OOSEQ */
  47472. if (reset) {
  47473. 80305aa: f1b9 0f00 cmp.w r9, #0
  47474. 80305ae: d009 beq.n 80305c4 <tcp_abandon+0x68>
  47475. LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_abandon: sending RST\n"));
  47476. tcp_rst(seqno, ackno, &pcb->local_ip, &pcb->remote_ip, pcb->local_port, pcb->remote_port);
  47477. 80305b0: 8b63 ldrh r3, [r4, #26]
  47478. 80305b2: 9300 str r3, [sp, #0]
  47479. 80305b4: 8ba3 ldrh r3, [r4, #28]
  47480. 80305b6: 4640 mov r0, r8
  47481. 80305b8: 9301 str r3, [sp, #4]
  47482. 80305ba: 4639 mov r1, r7
  47483. 80305bc: 4622 mov r2, r4
  47484. 80305be: 1d23 adds r3, r4, #4
  47485. 80305c0: f001 fcc2 bl 8031f48 <tcp_rst>
  47486. }
  47487. memp_free(MEMP_TCP_PCB, pcb);
  47488. 80305c4: 2002 movs r0, #2
  47489. 80305c6: 4621 mov r1, r4
  47490. 80305c8: f7ff fa54 bl 802fa74 <memp_free>
  47491. TCP_EVENT_ERR(errf, errf_arg, ERR_ABRT);
  47492. 80305cc: b11d cbz r5, 80305d6 <tcp_abandon+0x7a>
  47493. 80305ce: 4630 mov r0, r6
  47494. 80305d0: f06f 0109 mvn.w r1, #9
  47495. 80305d4: 47a8 blx r5
  47496. }
  47497. }
  47498. 80305d6: b003 add sp, #12
  47499. 80305d8: e8bd 83f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, pc}
  47500. 80305dc: 2000ff34 .word 0x2000ff34
  47501. 80305e0: 2000ff20 .word 0x2000ff20
  47502. 80305e4: 2000ff1c .word 0x2000ff1c
  47503. 080305e8 <tcp_abort>:
  47504. * @param pcb the tcp pcb to abort
  47505. */
  47506. void
  47507. tcp_abort(struct tcp_pcb *pcb)
  47508. {
  47509. tcp_abandon(pcb, 1);
  47510. 80305e8: 2101 movs r1, #1
  47511. 80305ea: f7ff bfb7 b.w 803055c <tcp_abandon>
  47512. 80305ee: 0000 movs r0, r0
  47513. 080305f0 <tcp_close_shutdown>:
  47514. * @return ERR_OK if connection has been closed
  47515. * another err_t if closing failed and pcb is not freed
  47516. */
  47517. static err_t
  47518. tcp_close_shutdown(struct tcp_pcb *pcb, u8_t rst_on_unacked_data)
  47519. {
  47520. 80305f0: b537 push {r0, r1, r2, r4, r5, lr}
  47521. 80305f2: 4604 mov r4, r0
  47522. err_t err;
  47523. if (rst_on_unacked_data && ((pcb->state == ESTABLISHED) || (pcb->state == CLOSE_WAIT))) {
  47524. 80305f4: 2900 cmp r1, #0
  47525. 80305f6: d043 beq.n 8030680 <tcp_close_shutdown+0x90>
  47526. 80305f8: 7e03 ldrb r3, [r0, #24]
  47527. 80305fa: 2b04 cmp r3, #4
  47528. 80305fc: d001 beq.n 8030602 <tcp_close_shutdown+0x12>
  47529. 80305fe: 2b07 cmp r3, #7
  47530. 8030600: d13e bne.n 8030680 <tcp_close_shutdown+0x90>
  47531. if ((pcb->refused_data != NULL) || (pcb->rcv_wnd != TCP_WND)) {
  47532. 8030602: 6f63 ldr r3, [r4, #116] ; 0x74
  47533. 8030604: b923 cbnz r3, 8030610 <tcp_close_shutdown+0x20>
  47534. 8030606: 8da2 ldrh r2, [r4, #44] ; 0x2c
  47535. 8030608: f241 63d0 movw r3, #5840 ; 0x16d0
  47536. 803060c: 429a cmp r2, r3
  47537. 803060e: d037 beq.n 8030680 <tcp_close_shutdown+0x90>
  47538. side about this. */
  47539. LWIP_ASSERT("pcb->flags & TF_RXCLOSED", pcb->flags & TF_RXCLOSED);
  47540. /* don't call tcp_abort here: we must not deallocate the pcb since
  47541. that might not be expected when calling tcp_close */
  47542. tcp_rst(pcb->snd_nxt, pcb->rcv_nxt, &pcb->local_ip, &pcb->remote_ip,
  47543. 8030610: 8b63 ldrh r3, [r4, #26]
  47544. 8030612: 6d20 ldr r0, [r4, #80] ; 0x50
  47545. 8030614: 9300 str r3, [sp, #0]
  47546. 8030616: 8ba3 ldrh r3, [r4, #28]
  47547. 8030618: 6aa1 ldr r1, [r4, #40] ; 0x28
  47548. 803061a: 9301 str r3, [sp, #4]
  47549. 803061c: 4622 mov r2, r4
  47550. 803061e: 1d23 adds r3, r4, #4
  47551. 8030620: f001 fc92 bl 8031f48 <tcp_rst>
  47552. pcb->local_port, pcb->remote_port);
  47553. tcp_pcb_purge(pcb);
  47554. 8030624: 4620 mov r0, r4
  47555. 8030626: f7ff fe03 bl 8030230 <tcp_pcb_purge>
  47556. TCP_RMV_ACTIVE(pcb);
  47557. 803062a: 4a42 ldr r2, [pc, #264] ; (8030734 <tcp_close_shutdown+0x144>)
  47558. 803062c: 6813 ldr r3, [r2, #0]
  47559. 803062e: 42a3 cmp r3, r4
  47560. 8030630: d101 bne.n 8030636 <tcp_close_shutdown+0x46>
  47561. 8030632: 68e3 ldr r3, [r4, #12]
  47562. 8030634: e00c b.n 8030650 <tcp_close_shutdown+0x60>
  47563. 8030636: 4a40 ldr r2, [pc, #256] ; (8030738 <tcp_close_shutdown+0x148>)
  47564. 8030638: 6013 str r3, [r2, #0]
  47565. 803063a: e007 b.n 803064c <tcp_close_shutdown+0x5c>
  47566. 803063c: 68d9 ldr r1, [r3, #12]
  47567. 803063e: 42a1 cmp r1, r4
  47568. 8030640: d103 bne.n 803064a <tcp_close_shutdown+0x5a>
  47569. 8030642: 6013 str r3, [r2, #0]
  47570. 8030644: 68e2 ldr r2, [r4, #12]
  47571. 8030646: 60da str r2, [r3, #12]
  47572. 8030648: e003 b.n 8030652 <tcp_close_shutdown+0x62>
  47573. 803064a: 460b mov r3, r1
  47574. 803064c: 2b00 cmp r3, #0
  47575. 803064e: d1f5 bne.n 803063c <tcp_close_shutdown+0x4c>
  47576. 8030650: 6013 str r3, [r2, #0]
  47577. 8030652: 4b3a ldr r3, [pc, #232] ; (803073c <tcp_close_shutdown+0x14c>)
  47578. 8030654: 2201 movs r2, #1
  47579. 8030656: 701a strb r2, [r3, #0]
  47580. if (pcb->state == ESTABLISHED) {
  47581. 8030658: 7e23 ldrb r3, [r4, #24]
  47582. that might not be expected when calling tcp_close */
  47583. tcp_rst(pcb->snd_nxt, pcb->rcv_nxt, &pcb->local_ip, &pcb->remote_ip,
  47584. pcb->local_port, pcb->remote_port);
  47585. tcp_pcb_purge(pcb);
  47586. TCP_RMV_ACTIVE(pcb);
  47587. 803065a: 2500 movs r5, #0
  47588. if (pcb->state == ESTABLISHED) {
  47589. 803065c: 2b04 cmp r3, #4
  47590. that might not be expected when calling tcp_close */
  47591. tcp_rst(pcb->snd_nxt, pcb->rcv_nxt, &pcb->local_ip, &pcb->remote_ip,
  47592. pcb->local_port, pcb->remote_port);
  47593. tcp_pcb_purge(pcb);
  47594. TCP_RMV_ACTIVE(pcb);
  47595. 803065e: 60e5 str r5, [r4, #12]
  47596. if (pcb->state == ESTABLISHED) {
  47597. 8030660: d108 bne.n 8030674 <tcp_close_shutdown+0x84>
  47598. /* move to TIME_WAIT since we close actively */
  47599. pcb->state = TIME_WAIT;
  47600. 8030662: 230a movs r3, #10
  47601. 8030664: 7623 strb r3, [r4, #24]
  47602. TCP_REG(&tcp_tw_pcbs, pcb);
  47603. 8030666: 4b36 ldr r3, [pc, #216] ; (8030740 <tcp_close_shutdown+0x150>)
  47604. 8030668: 681a ldr r2, [r3, #0]
  47605. 803066a: 601c str r4, [r3, #0]
  47606. 803066c: 60e2 str r2, [r4, #12]
  47607. 803066e: f001 fe05 bl 803227c <tcp_timer_needed>
  47608. 8030672: e003 b.n 803067c <tcp_close_shutdown+0x8c>
  47609. } else {
  47610. /* CLOSE_WAIT: deallocate the pcb since we already sent a RST for it */
  47611. memp_free(MEMP_TCP_PCB, pcb);
  47612. 8030674: 2002 movs r0, #2
  47613. 8030676: 4621 mov r1, r4
  47614. 8030678: f7ff f9fc bl 802fa74 <memp_free>
  47615. }
  47616. return ERR_OK;
  47617. 803067c: 4628 mov r0, r5
  47618. 803067e: e051 b.n 8030724 <tcp_close_shutdown+0x134>
  47619. }
  47620. }
  47621. switch (pcb->state) {
  47622. 8030680: 7e23 ldrb r3, [r4, #24]
  47623. 8030682: 2b07 cmp r3, #7
  47624. 8030684: d853 bhi.n 803072e <tcp_close_shutdown+0x13e>
  47625. 8030686: e8df f003 tbb [pc, r3]
  47626. 803068a: 1e04 .short 0x1e04
  47627. 803068c: 523c3527 .word 0x523c3527
  47628. 8030690: 4452 .short 0x4452
  47629. * Calling tcp_close() with a pcb that has already been closed, (i.e. twice)
  47630. * or for a pcb that has been used and then entered the CLOSED state
  47631. * is erroneous, but this should never happen as the pcb has in those cases
  47632. * been freed, and so any remaining handles are bogus. */
  47633. err = ERR_OK;
  47634. if (pcb->local_port != 0) {
  47635. 8030692: 8b63 ldrh r3, [r4, #26]
  47636. 8030694: b1ab cbz r3, 80306c2 <tcp_close_shutdown+0xd2>
  47637. TCP_RMV(&tcp_bound_pcbs, pcb);
  47638. 8030696: 4a2b ldr r2, [pc, #172] ; (8030744 <tcp_close_shutdown+0x154>)
  47639. 8030698: 6813 ldr r3, [r2, #0]
  47640. 803069a: 42a3 cmp r3, r4
  47641. 803069c: d101 bne.n 80306a2 <tcp_close_shutdown+0xb2>
  47642. 803069e: 68e3 ldr r3, [r4, #12]
  47643. 80306a0: e00c b.n 80306bc <tcp_close_shutdown+0xcc>
  47644. 80306a2: 4a25 ldr r2, [pc, #148] ; (8030738 <tcp_close_shutdown+0x148>)
  47645. 80306a4: 6013 str r3, [r2, #0]
  47646. 80306a6: e007 b.n 80306b8 <tcp_close_shutdown+0xc8>
  47647. 80306a8: 68d9 ldr r1, [r3, #12]
  47648. 80306aa: 42a1 cmp r1, r4
  47649. 80306ac: d103 bne.n 80306b6 <tcp_close_shutdown+0xc6>
  47650. 80306ae: 6013 str r3, [r2, #0]
  47651. 80306b0: 68e2 ldr r2, [r4, #12]
  47652. 80306b2: 60da str r2, [r3, #12]
  47653. 80306b4: e003 b.n 80306be <tcp_close_shutdown+0xce>
  47654. 80306b6: 460b mov r3, r1
  47655. 80306b8: 2b00 cmp r3, #0
  47656. 80306ba: d1f5 bne.n 80306a8 <tcp_close_shutdown+0xb8>
  47657. 80306bc: 6013 str r3, [r2, #0]
  47658. 80306be: 2300 movs r3, #0
  47659. 80306c0: 60e3 str r3, [r4, #12]
  47660. }
  47661. memp_free(MEMP_TCP_PCB, pcb);
  47662. 80306c2: 2002 movs r0, #2
  47663. 80306c4: e004 b.n 80306d0 <tcp_close_shutdown+0xe0>
  47664. pcb = NULL;
  47665. break;
  47666. case LISTEN:
  47667. err = ERR_OK;
  47668. tcp_pcb_remove(&tcp_listen_pcbs.pcbs, pcb);
  47669. 80306c6: 4820 ldr r0, [pc, #128] ; (8030748 <tcp_close_shutdown+0x158>)
  47670. 80306c8: 4621 mov r1, r4
  47671. 80306ca: f7ff ff19 bl 8030500 <tcp_pcb_remove>
  47672. memp_free(MEMP_TCP_PCB_LISTEN, pcb);
  47673. 80306ce: 2003 movs r0, #3
  47674. 80306d0: 4621 mov r1, r4
  47675. 80306d2: f7ff f9cf bl 802fa74 <memp_free>
  47676. pcb = NULL;
  47677. break;
  47678. 80306d6: e02a b.n 803072e <tcp_close_shutdown+0x13e>
  47679. case SYN_SENT:
  47680. err = ERR_OK;
  47681. TCP_PCB_REMOVE_ACTIVE(pcb);
  47682. 80306d8: 4621 mov r1, r4
  47683. 80306da: 4816 ldr r0, [pc, #88] ; (8030734 <tcp_close_shutdown+0x144>)
  47684. 80306dc: f7ff ff10 bl 8030500 <tcp_pcb_remove>
  47685. 80306e0: 4b16 ldr r3, [pc, #88] ; (803073c <tcp_close_shutdown+0x14c>)
  47686. 80306e2: 2201 movs r2, #1
  47687. memp_free(MEMP_TCP_PCB, pcb);
  47688. 80306e4: 2002 movs r0, #2
  47689. 80306e6: 4621 mov r1, r4
  47690. memp_free(MEMP_TCP_PCB_LISTEN, pcb);
  47691. pcb = NULL;
  47692. break;
  47693. case SYN_SENT:
  47694. err = ERR_OK;
  47695. TCP_PCB_REMOVE_ACTIVE(pcb);
  47696. 80306e8: 701a strb r2, [r3, #0]
  47697. memp_free(MEMP_TCP_PCB, pcb);
  47698. 80306ea: f7ff f9c3 bl 802fa74 <memp_free>
  47699. pcb = NULL;
  47700. snmp_inc_tcpattemptfails();
  47701. 80306ee: f004 f8af bl 8034850 <snmp_inc_tcpattemptfails>
  47702. break;
  47703. 80306f2: e01c b.n 803072e <tcp_close_shutdown+0x13e>
  47704. case SYN_RCVD:
  47705. err = tcp_send_fin(pcb);
  47706. 80306f4: 4620 mov r0, r4
  47707. 80306f6: f001 fabe bl 8031c76 <tcp_send_fin>
  47708. if (err == ERR_OK) {
  47709. 80306fa: b998 cbnz r0, 8030724 <tcp_close_shutdown+0x134>
  47710. snmp_inc_tcpattemptfails();
  47711. 80306fc: f004 f8a8 bl 8034850 <snmp_inc_tcpattemptfails>
  47712. 8030700: e005 b.n 803070e <tcp_close_shutdown+0x11e>
  47713. pcb->state = FIN_WAIT_1;
  47714. }
  47715. break;
  47716. case ESTABLISHED:
  47717. err = tcp_send_fin(pcb);
  47718. 8030702: 4620 mov r0, r4
  47719. 8030704: f001 fab7 bl 8031c76 <tcp_send_fin>
  47720. if (err == ERR_OK) {
  47721. 8030708: b960 cbnz r0, 8030724 <tcp_close_shutdown+0x134>
  47722. snmp_inc_tcpestabresets();
  47723. 803070a: f004 f8a9 bl 8034860 <snmp_inc_tcpestabresets>
  47724. pcb->state = FIN_WAIT_1;
  47725. 803070e: 2305 movs r3, #5
  47726. 8030710: e006 b.n 8030720 <tcp_close_shutdown+0x130>
  47727. }
  47728. break;
  47729. case CLOSE_WAIT:
  47730. err = tcp_send_fin(pcb);
  47731. 8030712: 4620 mov r0, r4
  47732. 8030714: f001 faaf bl 8031c76 <tcp_send_fin>
  47733. if (err == ERR_OK) {
  47734. 8030718: b920 cbnz r0, 8030724 <tcp_close_shutdown+0x134>
  47735. snmp_inc_tcpestabresets();
  47736. 803071a: f004 f8a1 bl 8034860 <snmp_inc_tcpestabresets>
  47737. pcb->state = LAST_ACK;
  47738. 803071e: 2309 movs r3, #9
  47739. 8030720: 7623 strb r3, [r4, #24]
  47740. 8030722: e001 b.n 8030728 <tcp_close_shutdown+0x138>
  47741. 8030724: b240 sxtb r0, r0
  47742. 8030726: e004 b.n 8030732 <tcp_close_shutdown+0x142>
  47743. returns (unsent data is sent from tcp timer functions, also), we don't care
  47744. for the return value of tcp_output for now. */
  47745. /* @todo: When implementing SO_LINGER, this must be changed somehow:
  47746. If SOF_LINGER is set, the data should be sent and acked before close returns.
  47747. This can only be valid for sequential APIs, not for the raw API. */
  47748. tcp_output(pcb);
  47749. 8030728: 4620 mov r0, r4
  47750. 803072a: f001 fae9 bl 8031d00 <tcp_output>
  47751. 803072e: 2000 movs r0, #0
  47752. 8030730: e7f8 b.n 8030724 <tcp_close_shutdown+0x134>
  47753. }
  47754. return err;
  47755. }
  47756. 8030732: bd3e pop {r1, r2, r3, r4, r5, pc}
  47757. 8030734: 2000ff20 .word 0x2000ff20
  47758. 8030738: 2000ff2c .word 0x2000ff2c
  47759. 803073c: 2000ff1c .word 0x2000ff1c
  47760. 8030740: 2000ff34 .word 0x2000ff34
  47761. 8030744: 2000ff30 .word 0x2000ff30
  47762. 8030748: 2000ff28 .word 0x2000ff28
  47763. 0803074c <tcp_close>:
  47764. #if TCP_DEBUG
  47765. LWIP_DEBUGF(TCP_DEBUG, ("tcp_close: closing in "));
  47766. tcp_debug_print_state(pcb->state);
  47767. #endif /* TCP_DEBUG */
  47768. if (pcb->state != LISTEN) {
  47769. 803074c: 7e03 ldrb r3, [r0, #24]
  47770. 803074e: 2b01 cmp r3, #1
  47771. 8030750: d003 beq.n 803075a <tcp_close+0xe>
  47772. /* Set a flag not to receive any more data... */
  47773. pcb->flags |= TF_RXCLOSED;
  47774. 8030752: 7f83 ldrb r3, [r0, #30]
  47775. 8030754: f043 0310 orr.w r3, r3, #16
  47776. 8030758: 7783 strb r3, [r0, #30]
  47777. }
  47778. /* ... and close */
  47779. return tcp_close_shutdown(pcb, 1);
  47780. 803075a: 2101 movs r1, #1
  47781. 803075c: f7ff bf48 b.w 80305f0 <tcp_close_shutdown>
  47782. 08030760 <tcp_recv_null>:
  47783. * Default receive callback that is called if the user didn't register
  47784. * a recv callback for the pcb.
  47785. */
  47786. err_t
  47787. tcp_recv_null(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err)
  47788. {
  47789. 8030760: b510 push {r4, lr}
  47790. 8030762: 4608 mov r0, r1
  47791. LWIP_UNUSED_ARG(arg);
  47792. if (p != NULL) {
  47793. 8030764: 4614 mov r4, r2
  47794. 8030766: b132 cbz r2, 8030776 <tcp_recv_null+0x16>
  47795. tcp_recved(pcb, p->tot_len);
  47796. 8030768: 8911 ldrh r1, [r2, #8]
  47797. 803076a: f7ff fd1f bl 80301ac <tcp_recved>
  47798. pbuf_free(p);
  47799. 803076e: 4620 mov r0, r4
  47800. 8030770: f7ff fa8a bl 802fc88 <pbuf_free>
  47801. 8030774: e004 b.n 8030780 <tcp_recv_null+0x20>
  47802. } else if (err == ERR_OK) {
  47803. 8030776: b91b cbnz r3, 8030780 <tcp_recv_null+0x20>
  47804. return tcp_close(pcb);
  47805. }
  47806. return ERR_OK;
  47807. }
  47808. 8030778: e8bd 4010 ldmia.w sp!, {r4, lr}
  47809. LWIP_UNUSED_ARG(arg);
  47810. if (p != NULL) {
  47811. tcp_recved(pcb, p->tot_len);
  47812. pbuf_free(p);
  47813. } else if (err == ERR_OK) {
  47814. return tcp_close(pcb);
  47815. 803077c: f7ff bfe6 b.w 803074c <tcp_close>
  47816. }
  47817. return ERR_OK;
  47818. }
  47819. 8030780: 2000 movs r0, #0
  47820. 8030782: bd10 pop {r4, pc}
  47821. 08030784 <tcp_process_refused_data>:
  47822. }
  47823. /** Pass pcb->refused_data to the recv callback */
  47824. err_t
  47825. tcp_process_refused_data(struct tcp_pcb *pcb)
  47826. {
  47827. 8030784: b5f8 push {r3, r4, r5, r6, r7, lr}
  47828. err_t err;
  47829. u8_t refused_flags = pcb->refused_data->flags;
  47830. 8030786: 6f45 ldr r5, [r0, #116] ; 0x74
  47831. closes the pcb */
  47832. struct pbuf *refused_data = pcb->refused_data;
  47833. pcb->refused_data = NULL;
  47834. /* Notify again application with data previously received. */
  47835. LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: notify kept packet\n"));
  47836. TCP_EVENT_RECV(pcb, refused_data, ERR_OK, err);
  47837. 8030788: 6fc6 ldr r6, [r0, #124] ; 0x7c
  47838. /** Pass pcb->refused_data to the recv callback */
  47839. err_t
  47840. tcp_process_refused_data(struct tcp_pcb *pcb)
  47841. {
  47842. err_t err;
  47843. u8_t refused_flags = pcb->refused_data->flags;
  47844. 803078a: 7b6f ldrb r7, [r5, #13]
  47845. /* set pcb->refused_data to NULL in case the callback frees it and then
  47846. closes the pcb */
  47847. struct pbuf *refused_data = pcb->refused_data;
  47848. pcb->refused_data = NULL;
  47849. 803078c: 2300 movs r3, #0
  47850. }
  47851. /** Pass pcb->refused_data to the recv callback */
  47852. err_t
  47853. tcp_process_refused_data(struct tcp_pcb *pcb)
  47854. {
  47855. 803078e: 4604 mov r4, r0
  47856. err_t err;
  47857. u8_t refused_flags = pcb->refused_data->flags;
  47858. /* set pcb->refused_data to NULL in case the callback frees it and then
  47859. closes the pcb */
  47860. struct pbuf *refused_data = pcb->refused_data;
  47861. pcb->refused_data = NULL;
  47862. 8030790: 6743 str r3, [r0, #116] ; 0x74
  47863. /* Notify again application with data previously received. */
  47864. LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: notify kept packet\n"));
  47865. TCP_EVENT_RECV(pcb, refused_data, ERR_OK, err);
  47866. 8030792: b126 cbz r6, 803079e <tcp_process_refused_data+0x1a>
  47867. 8030794: 4621 mov r1, r4
  47868. 8030796: 462a mov r2, r5
  47869. 8030798: 6900 ldr r0, [r0, #16]
  47870. 803079a: 47b0 blx r6
  47871. 803079c: e005 b.n 80307aa <tcp_process_refused_data+0x26>
  47872. 803079e: 4630 mov r0, r6
  47873. 80307a0: 4621 mov r1, r4
  47874. 80307a2: 462a mov r2, r5
  47875. 80307a4: 4633 mov r3, r6
  47876. 80307a6: f7ff ffdb bl 8030760 <tcp_recv_null>
  47877. if (err == ERR_OK) {
  47878. 80307aa: b9b0 cbnz r0, 80307da <tcp_process_refused_data+0x56>
  47879. /* did refused_data include a FIN? */
  47880. if (refused_flags & PBUF_FLAG_TCP_FIN) {
  47881. 80307ac: f007 0720 and.w r7, r7, #32
  47882. 80307b0: b2ff uxtb r7, r7
  47883. 80307b2: b1bf cbz r7, 80307e4 <tcp_process_refused_data+0x60>
  47884. /* correct rcv_wnd as the application won't call tcp_recved()
  47885. for the FIN's seqno */
  47886. if (pcb->rcv_wnd != TCP_WND) {
  47887. 80307b4: 8da3 ldrh r3, [r4, #44] ; 0x2c
  47888. 80307b6: f241 62d0 movw r2, #5840 ; 0x16d0
  47889. 80307ba: 4293 cmp r3, r2
  47890. 80307bc: d001 beq.n 80307c2 <tcp_process_refused_data+0x3e>
  47891. pcb->rcv_wnd++;
  47892. 80307be: 3301 adds r3, #1
  47893. 80307c0: 85a3 strh r3, [r4, #44] ; 0x2c
  47894. }
  47895. TCP_EVENT_CLOSED(pcb, err);
  47896. 80307c2: 6fe5 ldr r5, [r4, #124] ; 0x7c
  47897. 80307c4: b905 cbnz r5, 80307c8 <tcp_process_refused_data+0x44>
  47898. 80307c6: e00c b.n 80307e2 <tcp_process_refused_data+0x5e>
  47899. 80307c8: 2200 movs r2, #0
  47900. 80307ca: 6920 ldr r0, [r4, #16]
  47901. 80307cc: 4621 mov r1, r4
  47902. 80307ce: 4613 mov r3, r2
  47903. 80307d0: 47a8 blx r5
  47904. if (err == ERR_ABRT) {
  47905. 80307d2: 300a adds r0, #10
  47906. 80307d4: d105 bne.n 80307e2 <tcp_process_refused_data+0x5e>
  47907. return ERR_ABRT;
  47908. 80307d6: 20f6 movs r0, #246 ; 0xf6
  47909. 80307d8: e004 b.n 80307e4 <tcp_process_refused_data+0x60>
  47910. }
  47911. }
  47912. } else if (err == ERR_ABRT) {
  47913. 80307da: b240 sxtb r0, r0
  47914. 80307dc: 300a adds r0, #10
  47915. 80307de: d0fa beq.n 80307d6 <tcp_process_refused_data+0x52>
  47916. segment contains data). */
  47917. LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: drop incoming packets, because pcb is \"full\"\n"));
  47918. return ERR_ABRT;
  47919. } else {
  47920. /* data is still refused, pbuf is still valid (go on for ACK-only packets) */
  47921. pcb->refused_data = refused_data;
  47922. 80307e0: 6765 str r5, [r4, #116] ; 0x74
  47923. }
  47924. return ERR_OK;
  47925. 80307e2: 2000 movs r0, #0
  47926. }
  47927. 80307e4: b240 sxtb r0, r0
  47928. 80307e6: bdf8 pop {r3, r4, r5, r6, r7, pc}
  47929. 080307e8 <tcp_fasttmr>:
  47930. *
  47931. * Automatically called from tcp_tmr().
  47932. */
  47933. void
  47934. tcp_fasttmr(void)
  47935. {
  47936. 80307e8: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr}
  47937. struct tcp_pcb *pcb;
  47938. ++tcp_timer_ctr;
  47939. 80307ec: 4b18 ldr r3, [pc, #96] ; (8030850 <tcp_fasttmr+0x68>)
  47940. tcp_fasttmr_start:
  47941. pcb = tcp_active_pcbs;
  47942. 80307ee: 4f19 ldr r7, [pc, #100] ; (8030854 <tcp_fasttmr+0x6c>)
  47943. void
  47944. tcp_fasttmr(void)
  47945. {
  47946. struct tcp_pcb *pcb;
  47947. ++tcp_timer_ctr;
  47948. 80307f0: 781a ldrb r2, [r3, #0]
  47949. 80307f2: 3201 adds r2, #1
  47950. 80307f4: 701a strb r2, [r3, #0]
  47951. tcp_fasttmr_start:
  47952. pcb = tcp_active_pcbs;
  47953. while(pcb != NULL) {
  47954. if (pcb->last_timer != tcp_timer_ctr) {
  47955. 80307f6: 4698 mov r8, r3
  47956. struct tcp_pcb *pcb;
  47957. ++tcp_timer_ctr;
  47958. tcp_fasttmr_start:
  47959. pcb = tcp_active_pcbs;
  47960. 80307f8: 683c ldr r4, [r7, #0]
  47961. next = pcb->next;
  47962. /* If there is data which was previously "refused" by upper layer */
  47963. if (pcb->refused_data != NULL) {
  47964. tcp_active_pcbs_changed = 0;
  47965. 80307fa: 4d17 ldr r5, [pc, #92] ; (8030858 <tcp_fasttmr+0x70>)
  47966. 80307fc: 2600 movs r6, #0
  47967. ++tcp_timer_ctr;
  47968. tcp_fasttmr_start:
  47969. pcb = tcp_active_pcbs;
  47970. while(pcb != NULL) {
  47971. 80307fe: e022 b.n 8030846 <tcp_fasttmr+0x5e>
  47972. if (pcb->last_timer != tcp_timer_ctr) {
  47973. 8030800: f898 2000 ldrb.w r2, [r8]
  47974. 8030804: f894 3021 ldrb.w r3, [r4, #33] ; 0x21
  47975. 8030808: 4293 cmp r3, r2
  47976. 803080a: d020 beq.n 803084e <tcp_fasttmr+0x66>
  47977. struct tcp_pcb *next;
  47978. pcb->last_timer = tcp_timer_ctr;
  47979. 803080c: f884 2021 strb.w r2, [r4, #33] ; 0x21
  47980. /* send delayed ACKs */
  47981. if (pcb->flags & TF_ACK_DELAY) {
  47982. 8030810: 7fa2 ldrb r2, [r4, #30]
  47983. 8030812: 07d1 lsls r1, r2, #31
  47984. 8030814: d509 bpl.n 803082a <tcp_fasttmr+0x42>
  47985. LWIP_DEBUGF(TCP_DEBUG, ("tcp_fasttmr: delayed ACK\n"));
  47986. tcp_ack_now(pcb);
  47987. 8030816: f042 0202 orr.w r2, r2, #2
  47988. 803081a: 77a2 strb r2, [r4, #30]
  47989. tcp_output(pcb);
  47990. 803081c: 4620 mov r0, r4
  47991. 803081e: f001 fa6f bl 8031d00 <tcp_output>
  47992. pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW);
  47993. 8030822: 7fa3 ldrb r3, [r4, #30]
  47994. 8030824: f023 0303 bic.w r3, r3, #3
  47995. 8030828: 77a3 strb r3, [r4, #30]
  47996. }
  47997. next = pcb->next;
  47998. /* If there is data which was previously "refused" by upper layer */
  47999. if (pcb->refused_data != NULL) {
  48000. 803082a: 6f63 ldr r3, [r4, #116] ; 0x74
  48001. tcp_ack_now(pcb);
  48002. tcp_output(pcb);
  48003. pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW);
  48004. }
  48005. next = pcb->next;
  48006. 803082c: f8d4 900c ldr.w r9, [r4, #12]
  48007. /* If there is data which was previously "refused" by upper layer */
  48008. if (pcb->refused_data != NULL) {
  48009. 8030830: b90b cbnz r3, 8030836 <tcp_fasttmr+0x4e>
  48010. 8030832: 464c mov r4, r9
  48011. 8030834: e007 b.n 8030846 <tcp_fasttmr+0x5e>
  48012. tcp_active_pcbs_changed = 0;
  48013. tcp_process_refused_data(pcb);
  48014. 8030836: 4620 mov r0, r4
  48015. next = pcb->next;
  48016. /* If there is data which was previously "refused" by upper layer */
  48017. if (pcb->refused_data != NULL) {
  48018. tcp_active_pcbs_changed = 0;
  48019. 8030838: 702e strb r6, [r5, #0]
  48020. tcp_process_refused_data(pcb);
  48021. 803083a: f7ff ffa3 bl 8030784 <tcp_process_refused_data>
  48022. if (tcp_active_pcbs_changed) {
  48023. 803083e: 782b ldrb r3, [r5, #0]
  48024. 8030840: 2b00 cmp r3, #0
  48025. 8030842: d1d9 bne.n 80307f8 <tcp_fasttmr+0x10>
  48026. 8030844: e7f5 b.n 8030832 <tcp_fasttmr+0x4a>
  48027. ++tcp_timer_ctr;
  48028. tcp_fasttmr_start:
  48029. pcb = tcp_active_pcbs;
  48030. while(pcb != NULL) {
  48031. 8030846: 2c00 cmp r4, #0
  48032. 8030848: d1da bne.n 8030800 <tcp_fasttmr+0x18>
  48033. 803084a: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc}
  48034. 803084e: e7fe b.n 803084e <tcp_fasttmr+0x66>
  48035. 8030850: 2000c431 .word 0x2000c431
  48036. 8030854: 2000ff20 .word 0x2000ff20
  48037. 8030858: 2000ff1c .word 0x2000ff1c
  48038. 0803085c <tcp_tmr>:
  48039. /**
  48040. * Called periodically to dispatch TCP timers.
  48041. */
  48042. void
  48043. tcp_tmr(void)
  48044. {
  48045. 803085c: b508 push {r3, lr}
  48046. /* Call tcp_fasttmr() every 250 ms */
  48047. tcp_fasttmr();
  48048. 803085e: f7ff ffc3 bl 80307e8 <tcp_fasttmr>
  48049. if (++tcp_timer & 1) {
  48050. 8030862: 4a06 ldr r2, [pc, #24] ; (803087c <tcp_tmr+0x20>)
  48051. 8030864: 7813 ldrb r3, [r2, #0]
  48052. 8030866: 3301 adds r3, #1
  48053. 8030868: b2db uxtb r3, r3
  48054. 803086a: 07d8 lsls r0, r3, #31
  48055. 803086c: 7013 strb r3, [r2, #0]
  48056. 803086e: d503 bpl.n 8030878 <tcp_tmr+0x1c>
  48057. /* Call tcp_tmr() every 500 ms, i.e., every other timer
  48058. tcp_tmr() is called. */
  48059. tcp_slowtmr();
  48060. }
  48061. }
  48062. 8030870: e8bd 4008 ldmia.w sp!, {r3, lr}
  48063. tcp_fasttmr();
  48064. if (++tcp_timer & 1) {
  48065. /* Call tcp_tmr() every 500 ms, i.e., every other timer
  48066. tcp_tmr() is called. */
  48067. tcp_slowtmr();
  48068. 8030874: f7ff bcfa b.w 803026c <tcp_slowtmr>
  48069. 8030878: bd08 pop {r3, pc}
  48070. 803087a: bf00 nop
  48071. 803087c: 2000c430 .word 0x2000c430
  48072. 08030880 <tcp_next_iss>:
  48073. u32_t
  48074. tcp_next_iss(void)
  48075. {
  48076. static u32_t iss = 6510;
  48077. iss += tcp_ticks; /* XXX */
  48078. 8030880: 4b03 ldr r3, [pc, #12] ; (8030890 <tcp_next_iss+0x10>)
  48079. 8030882: 4a04 ldr r2, [pc, #16] ; (8030894 <tcp_next_iss+0x14>)
  48080. 8030884: 6810 ldr r0, [r2, #0]
  48081. 8030886: 681a ldr r2, [r3, #0]
  48082. 8030888: 1880 adds r0, r0, r2
  48083. 803088a: 6018 str r0, [r3, #0]
  48084. return iss;
  48085. }
  48086. 803088c: 4770 bx lr
  48087. 803088e: bf00 nop
  48088. 8030890: 20000728 .word 0x20000728
  48089. 8030894: 2000ff24 .word 0x2000ff24
  48090. 08030898 <tcp_alloc>:
  48091. * @param prio priority for the new pcb
  48092. * @return a new tcp_pcb that initially is in state CLOSED
  48093. */
  48094. struct tcp_pcb *
  48095. tcp_alloc(u8_t prio)
  48096. {
  48097. 8030898: b5f8 push {r3, r4, r5, r6, r7, lr}
  48098. 803089a: 4605 mov r5, r0
  48099. struct tcp_pcb *pcb;
  48100. u32_t iss;
  48101. pcb = (struct tcp_pcb *)memp_malloc(MEMP_TCP_PCB);
  48102. 803089c: 2002 movs r0, #2
  48103. 803089e: f7ff f8d3 bl 802fa48 <memp_malloc>
  48104. if (pcb == NULL) {
  48105. 80308a2: 4604 mov r4, r0
  48106. 80308a4: 2800 cmp r0, #0
  48107. 80308a6: d136 bne.n 8030916 <tcp_alloc+0x7e>
  48108. u32_t inactivity;
  48109. inactivity = 0;
  48110. inactive = NULL;
  48111. /* Go through the list of TIME_WAIT pcbs and get the oldest pcb. */
  48112. for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {
  48113. 80308a8: 4b39 ldr r3, [pc, #228] ; (8030990 <tcp_alloc+0xf8>)
  48114. if ((u32_t)(tcp_ticks - pcb->tmr) >= inactivity) {
  48115. 80308aa: 4a3a ldr r2, [pc, #232] ; (8030994 <tcp_alloc+0xfc>)
  48116. u32_t inactivity;
  48117. inactivity = 0;
  48118. inactive = NULL;
  48119. /* Go through the list of TIME_WAIT pcbs and get the oldest pcb. */
  48120. for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {
  48121. 80308ac: 681b ldr r3, [r3, #0]
  48122. if ((u32_t)(tcp_ticks - pcb->tmr) >= inactivity) {
  48123. 80308ae: 6811 ldr r1, [r2, #0]
  48124. 80308b0: e007 b.n 80308c2 <tcp_alloc+0x2a>
  48125. 80308b2: 6a5a ldr r2, [r3, #36] ; 0x24
  48126. 80308b4: 1a8a subs r2, r1, r2
  48127. 80308b6: 42a2 cmp r2, r4
  48128. 80308b8: bf34 ite cc
  48129. 80308ba: 4622 movcc r2, r4
  48130. 80308bc: 4618 movcs r0, r3
  48131. u32_t inactivity;
  48132. inactivity = 0;
  48133. inactive = NULL;
  48134. /* Go through the list of TIME_WAIT pcbs and get the oldest pcb. */
  48135. for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {
  48136. 80308be: 68db ldr r3, [r3, #12]
  48137. 80308c0: 4614 mov r4, r2
  48138. 80308c2: 2b00 cmp r3, #0
  48139. 80308c4: d1f5 bne.n 80308b2 <tcp_alloc+0x1a>
  48140. if ((u32_t)(tcp_ticks - pcb->tmr) >= inactivity) {
  48141. inactivity = tcp_ticks - pcb->tmr;
  48142. inactive = pcb;
  48143. }
  48144. }
  48145. if (inactive != NULL) {
  48146. 80308c6: b108 cbz r0, 80308cc <tcp_alloc+0x34>
  48147. LWIP_DEBUGF(TCP_DEBUG, ("tcp_kill_timewait: killing oldest TIME-WAIT PCB %p (%"S32_F")\n",
  48148. (void *)inactive, inactivity));
  48149. tcp_abort(inactive);
  48150. 80308c8: f7ff fe8e bl 80305e8 <tcp_abort>
  48151. if (pcb == NULL) {
  48152. /* Try killing oldest connection in TIME-WAIT. */
  48153. LWIP_DEBUGF(TCP_DEBUG, ("tcp_alloc: killing off oldest TIME-WAIT connection\n"));
  48154. tcp_kill_timewait();
  48155. /* Try to allocate a tcp_pcb again. */
  48156. pcb = (struct tcp_pcb *)memp_malloc(MEMP_TCP_PCB);
  48157. 80308cc: 2002 movs r0, #2
  48158. 80308ce: f7ff f8bb bl 802fa48 <memp_malloc>
  48159. if (pcb == NULL) {
  48160. 80308d2: 4604 mov r4, r0
  48161. 80308d4: b9f8 cbnz r0, 8030916 <tcp_alloc+0x7e>
  48162. inactivity = 0;
  48163. inactive = NULL;
  48164. for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
  48165. if (pcb->prio <= prio &&
  48166. pcb->prio <= mprio &&
  48167. (u32_t)(tcp_ticks - pcb->tmr) >= inactivity) {
  48168. 80308d6: 4a2f ldr r2, [pc, #188] ; (8030994 <tcp_alloc+0xfc>)
  48169. mprio = TCP_PRIO_MAX;
  48170. /* We kill the oldest active connection that has lower priority than prio. */
  48171. inactivity = 0;
  48172. inactive = NULL;
  48173. for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
  48174. 80308d8: 4b2f ldr r3, [pc, #188] ; (8030998 <tcp_alloc+0x100>)
  48175. if (pcb->prio <= prio &&
  48176. pcb->prio <= mprio &&
  48177. (u32_t)(tcp_ticks - pcb->tmr) >= inactivity) {
  48178. 80308da: 6817 ldr r7, [r2, #0]
  48179. mprio = TCP_PRIO_MAX;
  48180. /* We kill the oldest active connection that has lower priority than prio. */
  48181. inactivity = 0;
  48182. inactive = NULL;
  48183. for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
  48184. 80308dc: 681b ldr r3, [r3, #0]
  48185. struct tcp_pcb *pcb, *inactive;
  48186. u32_t inactivity;
  48187. u8_t mprio;
  48188. mprio = TCP_PRIO_MAX;
  48189. 80308de: 207f movs r0, #127 ; 0x7f
  48190. /* We kill the oldest active connection that has lower priority than prio. */
  48191. inactivity = 0;
  48192. inactive = NULL;
  48193. 80308e0: 4622 mov r2, r4
  48194. 80308e2: e00c b.n 80308fe <tcp_alloc+0x66>
  48195. for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
  48196. if (pcb->prio <= prio &&
  48197. 80308e4: 7e59 ldrb r1, [r3, #25]
  48198. 80308e6: 42a9 cmp r1, r5
  48199. 80308e8: d808 bhi.n 80308fc <tcp_alloc+0x64>
  48200. 80308ea: 4281 cmp r1, r0
  48201. 80308ec: d806 bhi.n 80308fc <tcp_alloc+0x64>
  48202. pcb->prio <= mprio &&
  48203. (u32_t)(tcp_ticks - pcb->tmr) >= inactivity) {
  48204. 80308ee: 6a5e ldr r6, [r3, #36] ; 0x24
  48205. 80308f0: 1bbe subs r6, r7, r6
  48206. /* We kill the oldest active connection that has lower priority than prio. */
  48207. inactivity = 0;
  48208. inactive = NULL;
  48209. for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
  48210. if (pcb->prio <= prio &&
  48211. pcb->prio <= mprio &&
  48212. 80308f2: 42a6 cmp r6, r4
  48213. 80308f4: d302 bcc.n 80308fc <tcp_alloc+0x64>
  48214. 80308f6: 4608 mov r0, r1
  48215. 80308f8: 4634 mov r4, r6
  48216. 80308fa: 461a mov r2, r3
  48217. mprio = TCP_PRIO_MAX;
  48218. /* We kill the oldest active connection that has lower priority than prio. */
  48219. inactivity = 0;
  48220. inactive = NULL;
  48221. for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
  48222. 80308fc: 68db ldr r3, [r3, #12]
  48223. 80308fe: 2b00 cmp r3, #0
  48224. 8030900: d1f0 bne.n 80308e4 <tcp_alloc+0x4c>
  48225. inactivity = tcp_ticks - pcb->tmr;
  48226. inactive = pcb;
  48227. mprio = pcb->prio;
  48228. }
  48229. }
  48230. if (inactive != NULL) {
  48231. 8030902: b112 cbz r2, 803090a <tcp_alloc+0x72>
  48232. LWIP_DEBUGF(TCP_DEBUG, ("tcp_kill_prio: killing oldest PCB %p (%"S32_F")\n",
  48233. (void *)inactive, inactivity));
  48234. tcp_abort(inactive);
  48235. 8030904: 4610 mov r0, r2
  48236. 8030906: f7ff fe6f bl 80305e8 <tcp_abort>
  48237. if (pcb == NULL) {
  48238. /* Try killing active connections with lower priority than the new one. */
  48239. LWIP_DEBUGF(TCP_DEBUG, ("tcp_alloc: killing connection with prio lower than %d\n", prio));
  48240. tcp_kill_prio(prio);
  48241. /* Try to allocate a tcp_pcb again. */
  48242. pcb = (struct tcp_pcb *)memp_malloc(MEMP_TCP_PCB);
  48243. 803090a: 2002 movs r0, #2
  48244. 803090c: f7ff f89c bl 802fa48 <memp_malloc>
  48245. if (pcb != NULL) {
  48246. /* adjust err stats: timewait PCB was freed above */
  48247. MEMP_STATS_DEC(err, MEMP_TCP_PCB);
  48248. }
  48249. }
  48250. if (pcb != NULL) {
  48251. 8030910: 4604 mov r4, r0
  48252. 8030912: 2800 cmp r0, #0
  48253. 8030914: d039 beq.n 803098a <tcp_alloc+0xf2>
  48254. memset(pcb, 0, sizeof(struct tcp_pcb));
  48255. 8030916: 2100 movs r1, #0
  48256. 8030918: 2294 movs r2, #148 ; 0x94
  48257. 803091a: 4620 mov r0, r4
  48258. 803091c: f7f1 fa7c bl 8021e18 <memset>
  48259. pcb->prio = prio;
  48260. pcb->snd_buf = TCP_SND_BUF;
  48261. pcb->snd_queuelen = 0;
  48262. pcb->rcv_wnd = TCP_WND;
  48263. 8030920: f241 62d0 movw r2, #5840 ; 0x16d0
  48264. }
  48265. }
  48266. if (pcb != NULL) {
  48267. memset(pcb, 0, sizeof(struct tcp_pcb));
  48268. pcb->prio = prio;
  48269. pcb->snd_buf = TCP_SND_BUF;
  48270. 8030924: f246 63a8 movw r3, #26280 ; 0x66a8
  48271. 8030928: f8a4 3066 strh.w r3, [r4, #102] ; 0x66
  48272. pcb->snd_queuelen = 0;
  48273. pcb->rcv_wnd = TCP_WND;
  48274. 803092c: 85a2 strh r2, [r4, #44] ; 0x2c
  48275. }
  48276. if (pcb != NULL) {
  48277. memset(pcb, 0, sizeof(struct tcp_pcb));
  48278. pcb->prio = prio;
  48279. pcb->snd_buf = TCP_SND_BUF;
  48280. pcb->snd_queuelen = 0;
  48281. 803092e: 2300 movs r3, #0
  48282. pcb->rcv_wnd = TCP_WND;
  48283. pcb->rcv_ann_wnd = TCP_WND;
  48284. 8030930: 85e2 strh r2, [r4, #46] ; 0x2e
  48285. pcb->tos = 0;
  48286. pcb->ttl = TCP_TTL;
  48287. 8030932: 22ff movs r2, #255 ; 0xff
  48288. MEMP_STATS_DEC(err, MEMP_TCP_PCB);
  48289. }
  48290. }
  48291. if (pcb != NULL) {
  48292. memset(pcb, 0, sizeof(struct tcp_pcb));
  48293. pcb->prio = prio;
  48294. 8030934: 7665 strb r5, [r4, #25]
  48295. pcb->snd_buf = TCP_SND_BUF;
  48296. pcb->snd_queuelen = 0;
  48297. 8030936: f8a4 3068 strh.w r3, [r4, #104] ; 0x68
  48298. 803093a: 461d mov r5, r3
  48299. pcb->rcv_wnd = TCP_WND;
  48300. pcb->rcv_ann_wnd = TCP_WND;
  48301. pcb->tos = 0;
  48302. 803093c: 7263 strb r3, [r4, #9]
  48303. pcb->ttl = TCP_TTL;
  48304. 803093e: 72a2 strb r2, [r4, #10]
  48305. /* As initial send MSS, we use TCP_MSS but limit it to 536.
  48306. The send MSS is updated when an MSS option is received. */
  48307. pcb->mss = (TCP_MSS > 536) ? 536 : TCP_MSS;
  48308. pcb->rto = 3000 / TCP_SLOW_INTERVAL;
  48309. pcb->sa = 0;
  48310. 8030940: f8a4 3040 strh.w r3, [r4, #64] ; 0x40
  48311. pcb->rcv_ann_wnd = TCP_WND;
  48312. pcb->tos = 0;
  48313. pcb->ttl = TCP_TTL;
  48314. /* As initial send MSS, we use TCP_MSS but limit it to 536.
  48315. The send MSS is updated when an MSS option is received. */
  48316. pcb->mss = (TCP_MSS > 536) ? 536 : TCP_MSS;
  48317. 8030944: f44f 7206 mov.w r2, #536 ; 0x218
  48318. pcb->rto = 3000 / TCP_SLOW_INTERVAL;
  48319. pcb->sa = 0;
  48320. pcb->sv = 3000 / TCP_SLOW_INTERVAL;
  48321. pcb->rtime = -1;
  48322. 8030948: f64f 73ff movw r3, #65535 ; 0xffff
  48323. pcb->rcv_ann_wnd = TCP_WND;
  48324. pcb->tos = 0;
  48325. pcb->ttl = TCP_TTL;
  48326. /* As initial send MSS, we use TCP_MSS but limit it to 536.
  48327. The send MSS is updated when an MSS option is received. */
  48328. pcb->mss = (TCP_MSS > 536) ? 536 : TCP_MSS;
  48329. 803094c: 86e2 strh r2, [r4, #54] ; 0x36
  48330. pcb->rto = 3000 / TCP_SLOW_INTERVAL;
  48331. pcb->sa = 0;
  48332. pcb->sv = 3000 / TCP_SLOW_INTERVAL;
  48333. pcb->rtime = -1;
  48334. 803094e: 86a3 strh r3, [r4, #52] ; 0x34
  48335. pcb->tos = 0;
  48336. pcb->ttl = TCP_TTL;
  48337. /* As initial send MSS, we use TCP_MSS but limit it to 536.
  48338. The send MSS is updated when an MSS option is received. */
  48339. pcb->mss = (TCP_MSS > 536) ? 536 : TCP_MSS;
  48340. pcb->rto = 3000 / TCP_SLOW_INTERVAL;
  48341. 8030950: 2206 movs r2, #6
  48342. pcb->sa = 0;
  48343. pcb->sv = 3000 / TCP_SLOW_INTERVAL;
  48344. pcb->rtime = -1;
  48345. pcb->cwnd = 1;
  48346. 8030952: 2301 movs r3, #1
  48347. 8030954: f8a4 304c strh.w r3, [r4, #76] ; 0x4c
  48348. pcb->tos = 0;
  48349. pcb->ttl = TCP_TTL;
  48350. /* As initial send MSS, we use TCP_MSS but limit it to 536.
  48351. The send MSS is updated when an MSS option is received. */
  48352. pcb->mss = (TCP_MSS > 536) ? 536 : TCP_MSS;
  48353. pcb->rto = 3000 / TCP_SLOW_INTERVAL;
  48354. 8030958: f8a4 2044 strh.w r2, [r4, #68] ; 0x44
  48355. pcb->sa = 0;
  48356. pcb->sv = 3000 / TCP_SLOW_INTERVAL;
  48357. 803095c: f8a4 2042 strh.w r2, [r4, #66] ; 0x42
  48358. pcb->rtime = -1;
  48359. pcb->cwnd = 1;
  48360. iss = tcp_next_iss();
  48361. 8030960: f7ff ff8e bl 8030880 <tcp_next_iss>
  48362. pcb->snd_wl2 = iss;
  48363. pcb->snd_nxt = iss;
  48364. pcb->lastack = iss;
  48365. pcb->snd_lbb = iss;
  48366. pcb->tmr = tcp_ticks;
  48367. 8030964: 4b0b ldr r3, [pc, #44] ; (8030994 <tcp_alloc+0xfc>)
  48368. pcb->sa = 0;
  48369. pcb->sv = 3000 / TCP_SLOW_INTERVAL;
  48370. pcb->rtime = -1;
  48371. pcb->cwnd = 1;
  48372. iss = tcp_next_iss();
  48373. pcb->snd_wl2 = iss;
  48374. 8030966: 65a0 str r0, [r4, #88] ; 0x58
  48375. pcb->snd_nxt = iss;
  48376. pcb->lastack = iss;
  48377. pcb->snd_lbb = iss;
  48378. pcb->tmr = tcp_ticks;
  48379. 8030968: 681b ldr r3, [r3, #0]
  48380. pcb->sv = 3000 / TCP_SLOW_INTERVAL;
  48381. pcb->rtime = -1;
  48382. pcb->cwnd = 1;
  48383. iss = tcp_next_iss();
  48384. pcb->snd_wl2 = iss;
  48385. pcb->snd_nxt = iss;
  48386. 803096a: 6520 str r0, [r4, #80] ; 0x50
  48387. pcb->lastack = iss;
  48388. pcb->snd_lbb = iss;
  48389. pcb->tmr = tcp_ticks;
  48390. 803096c: 6263 str r3, [r4, #36] ; 0x24
  48391. pcb->last_timer = tcp_timer_ctr;
  48392. 803096e: 4b0b ldr r3, [pc, #44] ; (803099c <tcp_alloc+0x104>)
  48393. pcb->rtime = -1;
  48394. pcb->cwnd = 1;
  48395. iss = tcp_next_iss();
  48396. pcb->snd_wl2 = iss;
  48397. pcb->snd_nxt = iss;
  48398. pcb->lastack = iss;
  48399. 8030970: 64a0 str r0, [r4, #72] ; 0x48
  48400. pcb->snd_lbb = iss;
  48401. pcb->tmr = tcp_ticks;
  48402. pcb->last_timer = tcp_timer_ctr;
  48403. 8030972: 781b ldrb r3, [r3, #0]
  48404. pcb->cwnd = 1;
  48405. iss = tcp_next_iss();
  48406. pcb->snd_wl2 = iss;
  48407. pcb->snd_nxt = iss;
  48408. pcb->lastack = iss;
  48409. pcb->snd_lbb = iss;
  48410. 8030974: 65e0 str r0, [r4, #92] ; 0x5c
  48411. pcb->tmr = tcp_ticks;
  48412. pcb->last_timer = tcp_timer_ctr;
  48413. 8030976: f884 3021 strb.w r3, [r4, #33] ; 0x21
  48414. pcb->polltmr = 0;
  48415. #if LWIP_CALLBACK_API
  48416. pcb->recv = tcp_recv_null;
  48417. 803097a: 4b09 ldr r3, [pc, #36] ; (80309a0 <tcp_alloc+0x108>)
  48418. pcb->lastack = iss;
  48419. pcb->snd_lbb = iss;
  48420. pcb->tmr = tcp_ticks;
  48421. pcb->last_timer = tcp_timer_ctr;
  48422. pcb->polltmr = 0;
  48423. 803097c: 77e5 strb r5, [r4, #31]
  48424. #if LWIP_CALLBACK_API
  48425. pcb->recv = tcp_recv_null;
  48426. 803097e: 67e3 str r3, [r4, #124] ; 0x7c
  48427. #endif /* LWIP_CALLBACK_API */
  48428. /* Init KEEPALIVE timer */
  48429. pcb->keep_idle = TCP_KEEPIDLE_DEFAULT;
  48430. 8030980: 4b08 ldr r3, [pc, #32] ; (80309a4 <tcp_alloc+0x10c>)
  48431. #if LWIP_TCP_KEEPALIVE
  48432. pcb->keep_intvl = TCP_KEEPINTVL_DEFAULT;
  48433. pcb->keep_cnt = TCP_KEEPCNT_DEFAULT;
  48434. #endif /* LWIP_TCP_KEEPALIVE */
  48435. pcb->keep_cnt_sent = 0;
  48436. 8030982: f884 5092 strb.w r5, [r4, #146] ; 0x92
  48437. #if LWIP_CALLBACK_API
  48438. pcb->recv = tcp_recv_null;
  48439. #endif /* LWIP_CALLBACK_API */
  48440. /* Init KEEPALIVE timer */
  48441. pcb->keep_idle = TCP_KEEPIDLE_DEFAULT;
  48442. 8030986: f8c4 308c str.w r3, [r4, #140] ; 0x8c
  48443. #endif /* LWIP_TCP_KEEPALIVE */
  48444. pcb->keep_cnt_sent = 0;
  48445. }
  48446. return pcb;
  48447. }
  48448. 803098a: 4620 mov r0, r4
  48449. 803098c: bdf8 pop {r3, r4, r5, r6, r7, pc}
  48450. 803098e: bf00 nop
  48451. 8030990: 2000ff34 .word 0x2000ff34
  48452. 8030994: 2000ff24 .word 0x2000ff24
  48453. 8030998: 2000ff20 .word 0x2000ff20
  48454. 803099c: 2000c431 .word 0x2000c431
  48455. 80309a0: 08030761 .word 0x08030761
  48456. 80309a4: 006ddd00 .word 0x006ddd00
  48457. 080309a8 <tcp_new>:
  48458. * @return a new tcp_pcb that initially is in state CLOSED
  48459. */
  48460. struct tcp_pcb *
  48461. tcp_new(void)
  48462. {
  48463. return tcp_alloc(TCP_PRIO_NORMAL);
  48464. 80309a8: 2040 movs r0, #64 ; 0x40
  48465. 80309aa: f7ff bf75 b.w 8030898 <tcp_alloc>
  48466. 080309ae <tcp_eff_send_mss>:
  48467. * by using ip_route to determin the netif used to send to the address and
  48468. * calculating the minimum of TCP_MSS and that netif's mtu (if set).
  48469. */
  48470. u16_t
  48471. tcp_eff_send_mss(u16_t sendmss, ip_addr_t *addr)
  48472. {
  48473. 80309ae: b510 push {r4, lr}
  48474. 80309b0: 4604 mov r4, r0
  48475. u16_t mss_s;
  48476. struct netif *outif;
  48477. outif = ip_route(addr);
  48478. 80309b2: 4608 mov r0, r1
  48479. 80309b4: f002 f8f2 bl 8032b9c <ip_route>
  48480. if ((outif != NULL) && (outif->mtu != 0)) {
  48481. 80309b8: b130 cbz r0, 80309c8 <tcp_eff_send_mss+0x1a>
  48482. 80309ba: 8c83 ldrh r3, [r0, #36] ; 0x24
  48483. 80309bc: b123 cbz r3, 80309c8 <tcp_eff_send_mss+0x1a>
  48484. mss_s = outif->mtu - IP_HLEN - TCP_HLEN;
  48485. 80309be: 3b28 subs r3, #40 ; 0x28
  48486. /* RFC 1122, chap 4.2.2.6:
  48487. * Eff.snd.MSS = min(SendMSS+20, MMS_S) - TCPhdrsize - IPoptionsize
  48488. * We correct for TCP options in tcp_write(), and don't support IP options.
  48489. */
  48490. sendmss = LWIP_MIN(sendmss, mss_s);
  48491. 80309c0: b29b uxth r3, r3
  48492. 80309c2: 429c cmp r4, r3
  48493. 80309c4: bf28 it cs
  48494. 80309c6: 461c movcs r4, r3
  48495. }
  48496. return sendmss;
  48497. }
  48498. 80309c8: 4620 mov r0, r4
  48499. 80309ca: bd10 pop {r4, pc}
  48500. 080309cc <tcp_parseopt>:
  48501. *
  48502. * @param pcb the tcp_pcb for which a segment arrived
  48503. */
  48504. static void
  48505. tcp_parseopt(struct tcp_pcb *pcb)
  48506. {
  48507. 80309cc: b5f8 push {r3, r4, r5, r6, r7, lr}
  48508. u8_t *opts, opt;
  48509. #if LWIP_TCP_TIMESTAMPS
  48510. u32_t tsval;
  48511. #endif
  48512. opts = (u8_t *)tcphdr + TCP_HLEN;
  48513. 80309ce: 4d1e ldr r5, [pc, #120] ; (8030a48 <tcp_parseopt+0x7c>)
  48514. 80309d0: 682c ldr r4, [r5, #0]
  48515. *
  48516. * @param pcb the tcp_pcb for which a segment arrived
  48517. */
  48518. static void
  48519. tcp_parseopt(struct tcp_pcb *pcb)
  48520. {
  48521. 80309d2: 4606 mov r6, r0
  48522. #endif
  48523. opts = (u8_t *)tcphdr + TCP_HLEN;
  48524. /* Parse the TCP MSS option, if present. */
  48525. if(TCPH_HDRLEN(tcphdr) > 0x5) {
  48526. 80309d4: 89a0 ldrh r0, [r4, #12]
  48527. 80309d6: f7fe f81e bl 802ea16 <lwip_ntohs>
  48528. 80309da: f3c0 300f ubfx r0, r0, #12, #16
  48529. 80309de: 2805 cmp r0, #5
  48530. 80309e0: d931 bls.n 8030a46 <tcp_parseopt+0x7a>
  48531. max_c = (TCPH_HDRLEN(tcphdr) - 5) << 2;
  48532. 80309e2: 682b ldr r3, [r5, #0]
  48533. 80309e4: 8998 ldrh r0, [r3, #12]
  48534. 80309e6: f7fe f816 bl 802ea16 <lwip_ntohs>
  48535. 80309ea: 0b00 lsrs r0, r0, #12
  48536. 80309ec: 1f41 subs r1, r0, #5
  48537. 80309ee: 0089 lsls r1, r1, #2
  48538. u8_t *opts, opt;
  48539. #if LWIP_TCP_TIMESTAMPS
  48540. u32_t tsval;
  48541. #endif
  48542. opts = (u8_t *)tcphdr + TCP_HLEN;
  48543. 80309f0: 3414 adds r4, #20
  48544. /* Parse the TCP MSS option, if present. */
  48545. if(TCPH_HDRLEN(tcphdr) > 0x5) {
  48546. max_c = (TCPH_HDRLEN(tcphdr) - 5) << 2;
  48547. 80309f2: b289 uxth r1, r1
  48548. for (c = 0; c < max_c; ) {
  48549. 80309f4: 2300 movs r3, #0
  48550. return;
  48551. }
  48552. /* An MSS option with the right option length. */
  48553. mss = (opts[c + 2] << 8) | opts[c + 3];
  48554. /* Limit the mss to the configured TCP_MSS and prevent division by zero */
  48555. pcb->mss = ((mss > TCP_MSS) || (mss == 0)) ? TCP_MSS : mss;
  48556. 80309f6: f240 50b3 movw r0, #1459 ; 0x5b3
  48557. 80309fa: f240 55b4 movw r5, #1460 ; 0x5b4
  48558. opts = (u8_t *)tcphdr + TCP_HLEN;
  48559. /* Parse the TCP MSS option, if present. */
  48560. if(TCPH_HDRLEN(tcphdr) > 0x5) {
  48561. max_c = (TCPH_HDRLEN(tcphdr) - 5) << 2;
  48562. for (c = 0; c < max_c; ) {
  48563. 80309fe: e020 b.n 8030a42 <tcp_parseopt+0x76>
  48564. opt = opts[c];
  48565. switch (opt) {
  48566. 8030a00: 5ce2 ldrb r2, [r4, r3]
  48567. 8030a02: 2a01 cmp r2, #1
  48568. 8030a04: d005 beq.n 8030a12 <tcp_parseopt+0x46>
  48569. 8030a06: d31e bcc.n 8030a46 <tcp_parseopt+0x7a>
  48570. 8030a08: 2a02 cmp r2, #2
  48571. 8030a0a: eb04 0203 add.w r2, r4, r3
  48572. 8030a0e: d114 bne.n 8030a3a <tcp_parseopt+0x6e>
  48573. 8030a10: e001 b.n 8030a16 <tcp_parseopt+0x4a>
  48574. /* End of options. */
  48575. LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: EOL\n"));
  48576. return;
  48577. case 0x01:
  48578. /* NOP option. */
  48579. ++c;
  48580. 8030a12: 3301 adds r3, #1
  48581. 8030a14: e014 b.n 8030a40 <tcp_parseopt+0x74>
  48582. LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: NOP\n"));
  48583. break;
  48584. case 0x02:
  48585. LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: MSS\n"));
  48586. if (opts[c + 1] != 0x04 || c + 0x04 > max_c) {
  48587. 8030a16: 7857 ldrb r7, [r2, #1]
  48588. 8030a18: 2f04 cmp r7, #4
  48589. 8030a1a: d114 bne.n 8030a46 <tcp_parseopt+0x7a>
  48590. 8030a1c: 1cdf adds r7, r3, #3
  48591. 8030a1e: 428f cmp r7, r1
  48592. 8030a20: da11 bge.n 8030a46 <tcp_parseopt+0x7a>
  48593. /* Bad length */
  48594. LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: bad length\n"));
  48595. return;
  48596. }
  48597. /* An MSS option with the right option length. */
  48598. mss = (opts[c + 2] << 8) | opts[c + 3];
  48599. 8030a22: 7897 ldrb r7, [r2, #2]
  48600. 8030a24: 78d2 ldrb r2, [r2, #3]
  48601. 8030a26: ea42 2207 orr.w r2, r2, r7, lsl #8
  48602. /* Limit the mss to the configured TCP_MSS and prevent division by zero */
  48603. pcb->mss = ((mss > TCP_MSS) || (mss == 0)) ? TCP_MSS : mss;
  48604. 8030a2a: 1e57 subs r7, r2, #1
  48605. 8030a2c: b2bf uxth r7, r7
  48606. 8030a2e: 4287 cmp r7, r0
  48607. 8030a30: bf88 it hi
  48608. 8030a32: 462a movhi r2, r5
  48609. 8030a34: 86f2 strh r2, [r6, #54] ; 0x36
  48610. /* Advance to next option */
  48611. c += 0x04;
  48612. 8030a36: 3304 adds r3, #4
  48613. 8030a38: e002 b.n 8030a40 <tcp_parseopt+0x74>
  48614. c += 0x0A;
  48615. break;
  48616. #endif
  48617. default:
  48618. LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: other\n"));
  48619. if (opts[c + 1] == 0) {
  48620. 8030a3a: 7852 ldrb r2, [r2, #1]
  48621. 8030a3c: b11a cbz r2, 8030a46 <tcp_parseopt+0x7a>
  48622. and we don't process them further. */
  48623. return;
  48624. }
  48625. /* All other options have a length field, so that we easily
  48626. can skip past them. */
  48627. c += opts[c + 1];
  48628. 8030a3e: 18d3 adds r3, r2, r3
  48629. 8030a40: b29b uxth r3, r3
  48630. opts = (u8_t *)tcphdr + TCP_HLEN;
  48631. /* Parse the TCP MSS option, if present. */
  48632. if(TCPH_HDRLEN(tcphdr) > 0x5) {
  48633. max_c = (TCPH_HDRLEN(tcphdr) - 5) << 2;
  48634. for (c = 0; c < max_c; ) {
  48635. 8030a42: 428b cmp r3, r1
  48636. 8030a44: d3dc bcc.n 8030a00 <tcp_parseopt+0x34>
  48637. 8030a46: bdf8 pop {r3, r4, r5, r6, r7, pc}
  48638. 8030a48: 2000c434 .word 0x2000c434
  48639. 08030a4c <tcp_receive>:
  48640. *
  48641. * Called from tcp_process().
  48642. */
  48643. static void
  48644. tcp_receive(struct tcp_pcb *pcb)
  48645. {
  48646. 8030a4c: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  48647. u16_t ooseq_qlen;
  48648. #endif /* TCP_OOSEQ_MAX_BYTES || TCP_OOSEQ_MAX_PBUFS */
  48649. LWIP_ASSERT("tcp_receive: wrong state", pcb->state >= ESTABLISHED);
  48650. if (flags & TCP_ACK) {
  48651. 8030a50: 4ba0 ldr r3, [pc, #640] ; (8030cd4 <tcp_receive+0x288>)
  48652. 8030a52: 781b ldrb r3, [r3, #0]
  48653. 8030a54: f003 0310 and.w r3, r3, #16
  48654. 8030a58: b2db uxtb r3, r3
  48655. *
  48656. * Called from tcp_process().
  48657. */
  48658. static void
  48659. tcp_receive(struct tcp_pcb *pcb)
  48660. {
  48661. 8030a5a: 4604 mov r4, r0
  48662. u16_t ooseq_qlen;
  48663. #endif /* TCP_OOSEQ_MAX_BYTES || TCP_OOSEQ_MAX_PBUFS */
  48664. LWIP_ASSERT("tcp_receive: wrong state", pcb->state >= ESTABLISHED);
  48665. if (flags & TCP_ACK) {
  48666. 8030a5c: 2b00 cmp r3, #0
  48667. 8030a5e: f000 816b beq.w 8030d38 <tcp_receive+0x2ec>
  48668. right_wnd_edge = pcb->snd_wnd + pcb->snd_wl2;
  48669. /* Update window. */
  48670. if (TCP_SEQ_LT(pcb->snd_wl1, seqno) ||
  48671. 8030a62: 4a9d ldr r2, [pc, #628] ; (8030cd8 <tcp_receive+0x28c>)
  48672. 8030a64: 6d43 ldr r3, [r0, #84] ; 0x54
  48673. 8030a66: 6812 ldr r2, [r2, #0]
  48674. #endif /* TCP_OOSEQ_MAX_BYTES || TCP_OOSEQ_MAX_PBUFS */
  48675. LWIP_ASSERT("tcp_receive: wrong state", pcb->state >= ESTABLISHED);
  48676. if (flags & TCP_ACK) {
  48677. right_wnd_edge = pcb->snd_wnd + pcb->snd_wl2;
  48678. 8030a68: f8b0 5060 ldrh.w r5, [r0, #96] ; 0x60
  48679. 8030a6c: 6d81 ldr r1, [r0, #88] ; 0x58
  48680. /* Update window. */
  48681. if (TCP_SEQ_LT(pcb->snd_wl1, seqno) ||
  48682. 8030a6e: 1a98 subs r0, r3, r2
  48683. 8030a70: 2800 cmp r0, #0
  48684. 8030a72: db0e blt.n 8030a92 <tcp_receive+0x46>
  48685. 8030a74: 4293 cmp r3, r2
  48686. 8030a76: 4b99 ldr r3, [pc, #612] ; (8030cdc <tcp_receive+0x290>)
  48687. 8030a78: d103 bne.n 8030a82 <tcp_receive+0x36>
  48688. (pcb->snd_wl1 == seqno && TCP_SEQ_LT(pcb->snd_wl2, ackno)) ||
  48689. 8030a7a: 6818 ldr r0, [r3, #0]
  48690. 8030a7c: 1a08 subs r0, r1, r0
  48691. 8030a7e: 2800 cmp r0, #0
  48692. 8030a80: db07 blt.n 8030a92 <tcp_receive+0x46>
  48693. 8030a82: 681b ldr r3, [r3, #0]
  48694. 8030a84: 4299 cmp r1, r3
  48695. 8030a86: d11f bne.n 8030ac8 <tcp_receive+0x7c>
  48696. (pcb->snd_wl2 == ackno && tcphdr->wnd > pcb->snd_wnd)) {
  48697. 8030a88: 4b95 ldr r3, [pc, #596] ; (8030ce0 <tcp_receive+0x294>)
  48698. 8030a8a: 681b ldr r3, [r3, #0]
  48699. 8030a8c: 89db ldrh r3, [r3, #14]
  48700. 8030a8e: 42ab cmp r3, r5
  48701. 8030a90: d91a bls.n 8030ac8 <tcp_receive+0x7c>
  48702. pcb->snd_wnd = tcphdr->wnd;
  48703. 8030a92: 4b93 ldr r3, [pc, #588] ; (8030ce0 <tcp_receive+0x294>)
  48704. /* keep track of the biggest window announced by the remote host to calculate
  48705. the maximum segment size */
  48706. if (pcb->snd_wnd_max < tcphdr->wnd) {
  48707. 8030a94: f8b4 6062 ldrh.w r6, [r4, #98] ; 0x62
  48708. /* Update window. */
  48709. if (TCP_SEQ_LT(pcb->snd_wl1, seqno) ||
  48710. (pcb->snd_wl1 == seqno && TCP_SEQ_LT(pcb->snd_wl2, ackno)) ||
  48711. (pcb->snd_wl2 == ackno && tcphdr->wnd > pcb->snd_wnd)) {
  48712. pcb->snd_wnd = tcphdr->wnd;
  48713. 8030a98: 681b ldr r3, [r3, #0]
  48714. 8030a9a: 89d8 ldrh r0, [r3, #14]
  48715. /* keep track of the biggest window announced by the remote host to calculate
  48716. the maximum segment size */
  48717. if (pcb->snd_wnd_max < tcphdr->wnd) {
  48718. pcb->snd_wnd_max = tcphdr->wnd;
  48719. }
  48720. pcb->snd_wl1 = seqno;
  48721. 8030a9c: 6562 str r2, [r4, #84] ; 0x54
  48722. pcb->snd_wl2 = ackno;
  48723. 8030a9e: 4a8f ldr r2, [pc, #572] ; (8030cdc <tcp_receive+0x290>)
  48724. /* Update window. */
  48725. if (TCP_SEQ_LT(pcb->snd_wl1, seqno) ||
  48726. (pcb->snd_wl1 == seqno && TCP_SEQ_LT(pcb->snd_wl2, ackno)) ||
  48727. (pcb->snd_wl2 == ackno && tcphdr->wnd > pcb->snd_wnd)) {
  48728. pcb->snd_wnd = tcphdr->wnd;
  48729. 8030aa0: f8a4 0060 strh.w r0, [r4, #96] ; 0x60
  48730. the maximum segment size */
  48731. if (pcb->snd_wnd_max < tcphdr->wnd) {
  48732. pcb->snd_wnd_max = tcphdr->wnd;
  48733. }
  48734. pcb->snd_wl1 = seqno;
  48735. pcb->snd_wl2 = ackno;
  48736. 8030aa4: 6812 ldr r2, [r2, #0]
  48737. (pcb->snd_wl1 == seqno && TCP_SEQ_LT(pcb->snd_wl2, ackno)) ||
  48738. (pcb->snd_wl2 == ackno && tcphdr->wnd > pcb->snd_wnd)) {
  48739. pcb->snd_wnd = tcphdr->wnd;
  48740. /* keep track of the biggest window announced by the remote host to calculate
  48741. the maximum segment size */
  48742. if (pcb->snd_wnd_max < tcphdr->wnd) {
  48743. 8030aa6: 4286 cmp r6, r0
  48744. pcb->snd_wnd_max = tcphdr->wnd;
  48745. }
  48746. pcb->snd_wl1 = seqno;
  48747. pcb->snd_wl2 = ackno;
  48748. 8030aa8: 65a2 str r2, [r4, #88] ; 0x58
  48749. (pcb->snd_wl2 == ackno && tcphdr->wnd > pcb->snd_wnd)) {
  48750. pcb->snd_wnd = tcphdr->wnd;
  48751. /* keep track of the biggest window announced by the remote host to calculate
  48752. the maximum segment size */
  48753. if (pcb->snd_wnd_max < tcphdr->wnd) {
  48754. pcb->snd_wnd_max = tcphdr->wnd;
  48755. 8030aaa: bf38 it cc
  48756. 8030aac: f8a4 0062 strhcc.w r0, [r4, #98] ; 0x62
  48757. 8030ab0: f894 2091 ldrb.w r2, [r4, #145] ; 0x91
  48758. }
  48759. pcb->snd_wl1 = seqno;
  48760. pcb->snd_wl2 = ackno;
  48761. if (pcb->snd_wnd == 0) {
  48762. 8030ab4: b920 cbnz r0, 8030ac0 <tcp_receive+0x74>
  48763. if (pcb->persist_backoff == 0) {
  48764. 8030ab6: b93a cbnz r2, 8030ac8 <tcp_receive+0x7c>
  48765. /* start persist timer */
  48766. pcb->persist_cnt = 0;
  48767. 8030ab8: f884 0090 strb.w r0, [r4, #144] ; 0x90
  48768. pcb->persist_backoff = 1;
  48769. 8030abc: 2301 movs r3, #1
  48770. 8030abe: e001 b.n 8030ac4 <tcp_receive+0x78>
  48771. }
  48772. } else if (pcb->persist_backoff > 0) {
  48773. 8030ac0: b112 cbz r2, 8030ac8 <tcp_receive+0x7c>
  48774. /* stop persist timer */
  48775. pcb->persist_backoff = 0;
  48776. 8030ac2: 2300 movs r3, #0
  48777. 8030ac4: f884 3091 strb.w r3, [r4, #145] ; 0x91
  48778. * If it only passes 1, should reset dupack counter
  48779. *
  48780. */
  48781. /* Clause 1 */
  48782. if (TCP_SEQ_LEQ(ackno, pcb->lastack)) {
  48783. 8030ac8: 4b84 ldr r3, [pc, #528] ; (8030cdc <tcp_receive+0x290>)
  48784. 8030aca: 6ca2 ldr r2, [r4, #72] ; 0x48
  48785. 8030acc: 681b ldr r3, [r3, #0]
  48786. 8030ace: 1a98 subs r0, r3, r2
  48787. 8030ad0: 2800 cmp r0, #0
  48788. 8030ad2: dc34 bgt.n 8030b3e <tcp_receive+0xf2>
  48789. pcb->acked = 0;
  48790. 8030ad4: 2000 movs r0, #0
  48791. 8030ad6: f8a4 0064 strh.w r0, [r4, #100] ; 0x64
  48792. /* Clause 2 */
  48793. if (tcplen == 0) {
  48794. 8030ada: 4882 ldr r0, [pc, #520] ; (8030ce4 <tcp_receive+0x298>)
  48795. 8030adc: 8800 ldrh r0, [r0, #0]
  48796. 8030ade: 2800 cmp r0, #0
  48797. 8030ae0: f040 81f4 bne.w 8030ecc <tcp_receive+0x480>
  48798. /* Clause 3 */
  48799. if (pcb->snd_wl2 + pcb->snd_wnd == right_wnd_edge){
  48800. 8030ae4: f8b4 6060 ldrh.w r6, [r4, #96] ; 0x60
  48801. 8030ae8: 6da0 ldr r0, [r4, #88] ; 0x58
  48802. #endif /* TCP_OOSEQ_MAX_BYTES || TCP_OOSEQ_MAX_PBUFS */
  48803. LWIP_ASSERT("tcp_receive: wrong state", pcb->state >= ESTABLISHED);
  48804. if (flags & TCP_ACK) {
  48805. right_wnd_edge = pcb->snd_wnd + pcb->snd_wl2;
  48806. 8030aea: 1869 adds r1, r5, r1
  48807. if (TCP_SEQ_LEQ(ackno, pcb->lastack)) {
  48808. pcb->acked = 0;
  48809. /* Clause 2 */
  48810. if (tcplen == 0) {
  48811. /* Clause 3 */
  48812. if (pcb->snd_wl2 + pcb->snd_wnd == right_wnd_edge){
  48813. 8030aec: 1830 adds r0, r6, r0
  48814. 8030aee: 4288 cmp r0, r1
  48815. 8030af0: f040 81ec bne.w 8030ecc <tcp_receive+0x480>
  48816. /* Clause 4 */
  48817. if (pcb->rtime >= 0) {
  48818. 8030af4: f9b4 1034 ldrsh.w r1, [r4, #52] ; 0x34
  48819. 8030af8: 2900 cmp r1, #0
  48820. 8030afa: f2c0 81e7 blt.w 8030ecc <tcp_receive+0x480>
  48821. /* Clause 5 */
  48822. if (pcb->lastack == ackno) {
  48823. 8030afe: 429a cmp r2, r3
  48824. 8030b00: f040 81e4 bne.w 8030ecc <tcp_receive+0x480>
  48825. found_dupack = 1;
  48826. if ((u8_t)(pcb->dupacks + 1) > pcb->dupacks) {
  48827. 8030b04: f894 2047 ldrb.w r2, [r4, #71] ; 0x47
  48828. 8030b08: 1c53 adds r3, r2, #1
  48829. 8030b0a: b2db uxtb r3, r3
  48830. 8030b0c: 4293 cmp r3, r2
  48831. ++pcb->dupacks;
  48832. 8030b0e: bf88 it hi
  48833. 8030b10: f884 3047 strbhi.w r3, [r4, #71] ; 0x47
  48834. }
  48835. if (pcb->dupacks > 3) {
  48836. 8030b14: f894 3047 ldrb.w r3, [r4, #71] ; 0x47
  48837. 8030b18: 2b03 cmp r3, #3
  48838. 8030b1a: d90a bls.n 8030b32 <tcp_receive+0xe6>
  48839. /* Inflate the congestion window, but not if it means that
  48840. the value overflows. */
  48841. if ((u16_t)(pcb->cwnd + pcb->mss) > pcb->cwnd) {
  48842. 8030b1c: f8b4 204c ldrh.w r2, [r4, #76] ; 0x4c
  48843. 8030b20: 8ee3 ldrh r3, [r4, #54] ; 0x36
  48844. 8030b22: 18d3 adds r3, r2, r3
  48845. 8030b24: b29b uxth r3, r3
  48846. 8030b26: 4293 cmp r3, r2
  48847. 8030b28: f240 80b2 bls.w 8030c90 <tcp_receive+0x244>
  48848. pcb->cwnd += pcb->mss;
  48849. 8030b2c: f8a4 304c strh.w r3, [r4, #76] ; 0x4c
  48850. 8030b30: e0ae b.n 8030c90 <tcp_receive+0x244>
  48851. }
  48852. } else if (pcb->dupacks == 3) {
  48853. 8030b32: f040 80ad bne.w 8030c90 <tcp_receive+0x244>
  48854. /* Do fast retransmit */
  48855. tcp_rexmit_fast(pcb);
  48856. 8030b36: 4620 mov r0, r4
  48857. 8030b38: f001 fa92 bl 8032060 <tcp_rexmit_fast>
  48858. 8030b3c: e0a8 b.n 8030c90 <tcp_receive+0x244>
  48859. /* If Clause (1) or more is true, but not a duplicate ack, reset
  48860. * count of consecutive duplicate acks */
  48861. if (!found_dupack) {
  48862. pcb->dupacks = 0;
  48863. }
  48864. } else if (TCP_SEQ_BETWEEN(ackno, pcb->lastack+1, pcb->snd_nxt)){
  48865. 8030b3e: 43d1 mvns r1, r2
  48866. 8030b40: 42d9 cmn r1, r3
  48867. 8030b42: d47e bmi.n 8030c42 <tcp_receive+0x1f6>
  48868. 8030b44: 6d21 ldr r1, [r4, #80] ; 0x50
  48869. 8030b46: 1a59 subs r1, r3, r1
  48870. 8030b48: 2900 cmp r1, #0
  48871. 8030b4a: dc7a bgt.n 8030c42 <tcp_receive+0x1f6>
  48872. /* We come here when the ACK acknowledges new data. */
  48873. /* Reset the "IN Fast Retransmit" flag, since we are no longer
  48874. in fast retransmit. Also reset the congestion window to the
  48875. slow start threshold. */
  48876. if (pcb->flags & TF_INFR) {
  48877. 8030b4c: 7fa1 ldrb r1, [r4, #30]
  48878. 8030b4e: f001 0004 and.w r0, r1, #4
  48879. 8030b52: b2c0 uxtb r0, r0
  48880. 8030b54: b130 cbz r0, 8030b64 <tcp_receive+0x118>
  48881. pcb->flags &= ~TF_INFR;
  48882. 8030b56: f021 0104 bic.w r1, r1, #4
  48883. 8030b5a: 77a1 strb r1, [r4, #30]
  48884. pcb->cwnd = pcb->ssthresh;
  48885. 8030b5c: f8b4 104e ldrh.w r1, [r4, #78] ; 0x4e
  48886. 8030b60: f8a4 104c strh.w r1, [r4, #76] ; 0x4c
  48887. /* Reset the number of retransmissions. */
  48888. pcb->nrtx = 0;
  48889. /* Reset the retransmission time-out. */
  48890. pcb->rto = (pcb->sa >> 3) + pcb->sv;
  48891. 8030b64: f9b4 5040 ldrsh.w r5, [r4, #64] ; 0x40
  48892. 8030b68: f8b4 0042 ldrh.w r0, [r4, #66] ; 0x42
  48893. pcb->snd_buf += pcb->acked;
  48894. /* Reset the fast retransmit variables. */
  48895. pcb->dupacks = 0;
  48896. pcb->lastack = ackno;
  48897. 8030b6c: 64a3 str r3, [r4, #72] ; 0x48
  48898. /* Reset the number of retransmissions. */
  48899. pcb->nrtx = 0;
  48900. /* Reset the retransmission time-out. */
  48901. pcb->rto = (pcb->sa >> 3) + pcb->sv;
  48902. 8030b6e: eb00 00e5 add.w r0, r0, r5, asr #3
  48903. /* Update the send buffer space. Diff between the two can never exceed 64K? */
  48904. pcb->acked = (u16_t)(ackno - pcb->lastack);
  48905. 8030b72: 1a9a subs r2, r3, r2
  48906. /* Reset the number of retransmissions. */
  48907. pcb->nrtx = 0;
  48908. /* Reset the retransmission time-out. */
  48909. pcb->rto = (pcb->sa >> 3) + pcb->sv;
  48910. 8030b74: f8a4 0044 strh.w r0, [r4, #68] ; 0x44
  48911. pcb->dupacks = 0;
  48912. pcb->lastack = ackno;
  48913. /* Update the congestion control variables (cwnd and
  48914. ssthresh). */
  48915. if (pcb->state >= ESTABLISHED) {
  48916. 8030b78: 7e23 ldrb r3, [r4, #24]
  48917. pcb->rto = (pcb->sa >> 3) + pcb->sv;
  48918. /* Update the send buffer space. Diff between the two can never exceed 64K? */
  48919. pcb->acked = (u16_t)(ackno - pcb->lastack);
  48920. pcb->snd_buf += pcb->acked;
  48921. 8030b7a: f8b4 0066 ldrh.w r0, [r4, #102] ; 0x66
  48922. /* Reset the retransmission time-out. */
  48923. pcb->rto = (pcb->sa >> 3) + pcb->sv;
  48924. /* Update the send buffer space. Diff between the two can never exceed 64K? */
  48925. pcb->acked = (u16_t)(ackno - pcb->lastack);
  48926. 8030b7e: f8a4 2064 strh.w r2, [r4, #100] ; 0x64
  48927. pcb->flags &= ~TF_INFR;
  48928. pcb->cwnd = pcb->ssthresh;
  48929. }
  48930. /* Reset the number of retransmissions. */
  48931. pcb->nrtx = 0;
  48932. 8030b82: 2100 movs r1, #0
  48933. pcb->rto = (pcb->sa >> 3) + pcb->sv;
  48934. /* Update the send buffer space. Diff between the two can never exceed 64K? */
  48935. pcb->acked = (u16_t)(ackno - pcb->lastack);
  48936. pcb->snd_buf += pcb->acked;
  48937. 8030b84: 1812 adds r2, r2, r0
  48938. pcb->dupacks = 0;
  48939. pcb->lastack = ackno;
  48940. /* Update the congestion control variables (cwnd and
  48941. ssthresh). */
  48942. if (pcb->state >= ESTABLISHED) {
  48943. 8030b86: 2b03 cmp r3, #3
  48944. pcb->flags &= ~TF_INFR;
  48945. pcb->cwnd = pcb->ssthresh;
  48946. }
  48947. /* Reset the number of retransmissions. */
  48948. pcb->nrtx = 0;
  48949. 8030b88: f884 1046 strb.w r1, [r4, #70] ; 0x46
  48950. pcb->rto = (pcb->sa >> 3) + pcb->sv;
  48951. /* Update the send buffer space. Diff between the two can never exceed 64K? */
  48952. pcb->acked = (u16_t)(ackno - pcb->lastack);
  48953. pcb->snd_buf += pcb->acked;
  48954. 8030b8c: f8a4 2066 strh.w r2, [r4, #102] ; 0x66
  48955. /* Reset the fast retransmit variables. */
  48956. pcb->dupacks = 0;
  48957. 8030b90: f884 1047 strb.w r1, [r4, #71] ; 0x47
  48958. pcb->lastack = ackno;
  48959. /* Update the congestion control variables (cwnd and
  48960. ssthresh). */
  48961. if (pcb->state >= ESTABLISHED) {
  48962. 8030b94: d931 bls.n 8030bfa <tcp_receive+0x1ae>
  48963. if (pcb->cwnd < pcb->ssthresh) {
  48964. 8030b96: f8b4 204e ldrh.w r2, [r4, #78] ; 0x4e
  48965. 8030b9a: f8b4 304c ldrh.w r3, [r4, #76] ; 0x4c
  48966. 8030b9e: 429a cmp r2, r3
  48967. if ((u16_t)(pcb->cwnd + pcb->mss) > pcb->cwnd) {
  48968. 8030ba0: 8ee2 ldrh r2, [r4, #54] ; 0x36
  48969. pcb->lastack = ackno;
  48970. /* Update the congestion control variables (cwnd and
  48971. ssthresh). */
  48972. if (pcb->state >= ESTABLISHED) {
  48973. if (pcb->cwnd < pcb->ssthresh) {
  48974. 8030ba2: d900 bls.n 8030ba6 <tcp_receive+0x15a>
  48975. 8030ba4: e002 b.n 8030bac <tcp_receive+0x160>
  48976. if ((u16_t)(pcb->cwnd + pcb->mss) > pcb->cwnd) {
  48977. pcb->cwnd += pcb->mss;
  48978. }
  48979. LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_receive: slow start cwnd %"U16_F"\n", pcb->cwnd));
  48980. } else {
  48981. u16_t new_cwnd = (pcb->cwnd + pcb->mss * pcb->mss / pcb->cwnd);
  48982. 8030ba6: 4352 muls r2, r2
  48983. 8030ba8: fb92 f2f3 sdiv r2, r2, r3
  48984. 8030bac: 189a adds r2, r3, r2
  48985. 8030bae: b292 uxth r2, r2
  48986. if (new_cwnd > pcb->cwnd) {
  48987. 8030bb0: 429a cmp r2, r3
  48988. 8030bb2: d922 bls.n 8030bfa <tcp_receive+0x1ae>
  48989. pcb->cwnd = new_cwnd;
  48990. 8030bb4: f8a4 204c strh.w r2, [r4, #76] ; 0x4c
  48991. 8030bb8: e01f b.n 8030bfa <tcp_receive+0x1ae>
  48992. LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: removing %"U32_F":%"U32_F" from pcb->unacked\n",
  48993. ntohl(pcb->unacked->tcphdr->seqno),
  48994. ntohl(pcb->unacked->tcphdr->seqno) +
  48995. TCP_TCPLEN(pcb->unacked)));
  48996. next = pcb->unacked;
  48997. 8030bba: 6f25 ldr r5, [r4, #112] ; 0x70
  48998. pcb->unacked = pcb->unacked->next;
  48999. 8030bbc: 682b ldr r3, [r5, #0]
  49000. LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_receive: queuelen %"U16_F" ... ", (u16_t)pcb->snd_queuelen));
  49001. LWIP_ASSERT("pcb->snd_queuelen >= pbuf_clen(next->p)", (pcb->snd_queuelen >= pbuf_clen(next->p)));
  49002. 8030bbe: 6868 ldr r0, [r5, #4]
  49003. ntohl(pcb->unacked->tcphdr->seqno),
  49004. ntohl(pcb->unacked->tcphdr->seqno) +
  49005. TCP_TCPLEN(pcb->unacked)));
  49006. next = pcb->unacked;
  49007. pcb->unacked = pcb->unacked->next;
  49008. 8030bc0: 6723 str r3, [r4, #112] ; 0x70
  49009. LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_receive: queuelen %"U16_F" ... ", (u16_t)pcb->snd_queuelen));
  49010. LWIP_ASSERT("pcb->snd_queuelen >= pbuf_clen(next->p)", (pcb->snd_queuelen >= pbuf_clen(next->p)));
  49011. 8030bc2: f7ff f935 bl 802fe30 <pbuf_clen>
  49012. /* Prevent ACK for FIN to generate a sent event */
  49013. if ((pcb->acked != 0) && ((TCPH_FLAGS(next->tcphdr) & TCP_FIN) != 0)) {
  49014. 8030bc6: f8b4 3064 ldrh.w r3, [r4, #100] ; 0x64
  49015. 8030bca: b153 cbz r3, 8030be2 <tcp_receive+0x196>
  49016. 8030bcc: 68eb ldr r3, [r5, #12]
  49017. 8030bce: 8998 ldrh r0, [r3, #12]
  49018. 8030bd0: f7fd ff21 bl 802ea16 <lwip_ntohs>
  49019. 8030bd4: 07c3 lsls r3, r0, #31
  49020. 8030bd6: d504 bpl.n 8030be2 <tcp_receive+0x196>
  49021. pcb->acked--;
  49022. 8030bd8: f8b4 3064 ldrh.w r3, [r4, #100] ; 0x64
  49023. 8030bdc: 3b01 subs r3, #1
  49024. 8030bde: f8a4 3064 strh.w r3, [r4, #100] ; 0x64
  49025. }
  49026. pcb->snd_queuelen -= pbuf_clen(next->p);
  49027. 8030be2: 6868 ldr r0, [r5, #4]
  49028. 8030be4: f8b4 7068 ldrh.w r7, [r4, #104] ; 0x68
  49029. 8030be8: f7ff f922 bl 802fe30 <pbuf_clen>
  49030. 8030bec: 1a38 subs r0, r7, r0
  49031. 8030bee: f8a4 0068 strh.w r0, [r4, #104] ; 0x68
  49032. tcp_seg_free(next);
  49033. 8030bf2: 4628 mov r0, r5
  49034. 8030bf4: f7ff faf5 bl 80301e2 <tcp_seg_free>
  49035. 8030bf8: e000 b.n 8030bfc <tcp_receive+0x1b0>
  49036. ntohl(pcb->unacked->tcphdr->seqno) + TCP_TCPLEN(pcb->unacked): 0));
  49037. /* Remove segment from the unacknowledged list if the incoming
  49038. ACK acknowlegdes them. */
  49039. while (pcb->unacked != NULL &&
  49040. TCP_SEQ_LEQ(ntohl(pcb->unacked->tcphdr->seqno) +
  49041. 8030bfa: 4e38 ldr r6, [pc, #224] ; (8030cdc <tcp_receive+0x290>)
  49042. pcb->unacked != NULL?
  49043. ntohl(pcb->unacked->tcphdr->seqno) + TCP_TCPLEN(pcb->unacked): 0));
  49044. /* Remove segment from the unacknowledged list if the incoming
  49045. ACK acknowlegdes them. */
  49046. while (pcb->unacked != NULL &&
  49047. 8030bfc: 6f23 ldr r3, [r4, #112] ; 0x70
  49048. 8030bfe: b91b cbnz r3, 8030c08 <tcp_receive+0x1bc>
  49049. }
  49050. }
  49051. /* If there's nothing left to acknowledge, stop the retransmit
  49052. timer, otherwise reset it to start again */
  49053. if(pcb->unacked == NULL)
  49054. 8030c00: 6f22 ldr r2, [r4, #112] ; 0x70
  49055. 8030c02: 2300 movs r3, #0
  49056. 8030c04: b9d2 cbnz r2, 8030c3c <tcp_receive+0x1f0>
  49057. 8030c06: e015 b.n 8030c34 <tcp_receive+0x1e8>
  49058. ntohl(pcb->unacked->tcphdr->seqno) + TCP_TCPLEN(pcb->unacked): 0));
  49059. /* Remove segment from the unacknowledged list if the incoming
  49060. ACK acknowlegdes them. */
  49061. while (pcb->unacked != NULL &&
  49062. TCP_SEQ_LEQ(ntohl(pcb->unacked->tcphdr->seqno) +
  49063. 8030c08: 68db ldr r3, [r3, #12]
  49064. 8030c0a: 6858 ldr r0, [r3, #4]
  49065. 8030c0c: f7fd ff0a bl 802ea24 <lwip_ntohl>
  49066. 8030c10: 6f23 ldr r3, [r4, #112] ; 0x70
  49067. 8030c12: 891d ldrh r5, [r3, #8]
  49068. 8030c14: 68db ldr r3, [r3, #12]
  49069. 8030c16: 4607 mov r7, r0
  49070. 8030c18: 8998 ldrh r0, [r3, #12]
  49071. 8030c1a: f7fd fefc bl 802ea16 <lwip_ntohs>
  49072. 8030c1e: 6833 ldr r3, [r6, #0]
  49073. 8030c20: f010 0003 ands.w r0, r0, #3
  49074. 8030c24: bf18 it ne
  49075. 8030c26: 2001 movne r0, #1
  49076. 8030c28: 1afb subs r3, r7, r3
  49077. 8030c2a: 1828 adds r0, r5, r0
  49078. 8030c2c: 181b adds r3, r3, r0
  49079. pcb->unacked != NULL?
  49080. ntohl(pcb->unacked->tcphdr->seqno) + TCP_TCPLEN(pcb->unacked): 0));
  49081. /* Remove segment from the unacknowledged list if the incoming
  49082. ACK acknowlegdes them. */
  49083. while (pcb->unacked != NULL &&
  49084. 8030c2e: 2b00 cmp r3, #0
  49085. 8030c30: ddc3 ble.n 8030bba <tcp_receive+0x16e>
  49086. 8030c32: e7e5 b.n 8030c00 <tcp_receive+0x1b4>
  49087. }
  49088. /* If there's nothing left to acknowledge, stop the retransmit
  49089. timer, otherwise reset it to start again */
  49090. if(pcb->unacked == NULL)
  49091. pcb->rtime = -1;
  49092. 8030c34: f64f 72ff movw r2, #65535 ; 0xffff
  49093. 8030c38: 86a2 strh r2, [r4, #52] ; 0x34
  49094. 8030c3a: e000 b.n 8030c3e <tcp_receive+0x1f2>
  49095. else
  49096. pcb->rtime = 0;
  49097. 8030c3c: 86a3 strh r3, [r4, #52] ; 0x34
  49098. pcb->polltmr = 0;
  49099. 8030c3e: 77e3 strb r3, [r4, #31]
  49100. 8030c40: e026 b.n 8030c90 <tcp_receive+0x244>
  49101. } else {
  49102. /* Fix bug bug #21582: out of sequence ACK, didn't really ack anything */
  49103. pcb->acked = 0;
  49104. 8030c42: 2300 movs r3, #0
  49105. 8030c44: f8a4 3064 strh.w r3, [r4, #100] ; 0x64
  49106. 8030c48: e022 b.n 8030c90 <tcp_receive+0x244>
  49107. TCP_TCPLEN(pcb->unsent), pcb->snd_nxt)) {
  49108. LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: removing %"U32_F":%"U32_F" from pcb->unsent\n",
  49109. ntohl(pcb->unsent->tcphdr->seqno), ntohl(pcb->unsent->tcphdr->seqno) +
  49110. TCP_TCPLEN(pcb->unsent)));
  49111. next = pcb->unsent;
  49112. 8030c4a: 6ee5 ldr r5, [r4, #108] ; 0x6c
  49113. pcb->unsent = pcb->unsent->next;
  49114. 8030c4c: 682b ldr r3, [r5, #0]
  49115. 8030c4e: 66e3 str r3, [r4, #108] ; 0x6c
  49116. #if TCP_OVERSIZE
  49117. if (pcb->unsent == NULL) {
  49118. 8030c50: b90b cbnz r3, 8030c56 <tcp_receive+0x20a>
  49119. pcb->unsent_oversize = 0;
  49120. 8030c52: f8a4 306a strh.w r3, [r4, #106] ; 0x6a
  49121. }
  49122. #endif /* TCP_OVERSIZE */
  49123. LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_receive: queuelen %"U16_F" ... ", (u16_t)pcb->snd_queuelen));
  49124. LWIP_ASSERT("pcb->snd_queuelen >= pbuf_clen(next->p)", (pcb->snd_queuelen >= pbuf_clen(next->p)));
  49125. 8030c56: 6868 ldr r0, [r5, #4]
  49126. 8030c58: f7ff f8ea bl 802fe30 <pbuf_clen>
  49127. /* Prevent ACK for FIN to generate a sent event */
  49128. if ((pcb->acked != 0) && ((TCPH_FLAGS(next->tcphdr) & TCP_FIN) != 0)) {
  49129. 8030c5c: f8b4 3064 ldrh.w r3, [r4, #100] ; 0x64
  49130. 8030c60: b153 cbz r3, 8030c78 <tcp_receive+0x22c>
  49131. 8030c62: 68eb ldr r3, [r5, #12]
  49132. 8030c64: 8998 ldrh r0, [r3, #12]
  49133. 8030c66: f7fd fed6 bl 802ea16 <lwip_ntohs>
  49134. 8030c6a: 07c7 lsls r7, r0, #31
  49135. 8030c6c: d504 bpl.n 8030c78 <tcp_receive+0x22c>
  49136. pcb->acked--;
  49137. 8030c6e: f8b4 3064 ldrh.w r3, [r4, #100] ; 0x64
  49138. 8030c72: 3b01 subs r3, #1
  49139. 8030c74: f8a4 3064 strh.w r3, [r4, #100] ; 0x64
  49140. }
  49141. pcb->snd_queuelen -= pbuf_clen(next->p);
  49142. 8030c78: 6868 ldr r0, [r5, #4]
  49143. 8030c7a: f8b4 7068 ldrh.w r7, [r4, #104] ; 0x68
  49144. 8030c7e: f7ff f8d7 bl 802fe30 <pbuf_clen>
  49145. 8030c82: 1a38 subs r0, r7, r0
  49146. 8030c84: f8a4 0068 strh.w r0, [r4, #104] ; 0x68
  49147. tcp_seg_free(next);
  49148. 8030c88: 4628 mov r0, r5
  49149. 8030c8a: f7ff faaa bl 80301e2 <tcp_seg_free>
  49150. 8030c8e: e000 b.n 8030c92 <tcp_receive+0x246>
  49151. strange since an "unsent" segment shouldn't be acked. The
  49152. rationale is that lwIP puts all outstanding segments on the
  49153. ->unsent list after a retransmission, so these segments may
  49154. in fact have been sent once. */
  49155. while (pcb->unsent != NULL &&
  49156. TCP_SEQ_BETWEEN(ackno, ntohl(pcb->unsent->tcphdr->seqno) +
  49157. 8030c90: 4e12 ldr r6, [pc, #72] ; (8030cdc <tcp_receive+0x290>)
  49158. on the list are acknowledged by the ACK. This may seem
  49159. strange since an "unsent" segment shouldn't be acked. The
  49160. rationale is that lwIP puts all outstanding segments on the
  49161. ->unsent list after a retransmission, so these segments may
  49162. in fact have been sent once. */
  49163. while (pcb->unsent != NULL &&
  49164. 8030c92: 6ee3 ldr r3, [r4, #108] ; 0x6c
  49165. 8030c94: b913 cbnz r3, 8030c9c <tcp_receive+0x250>
  49166. pcb->rttest, pcb->rtseq, ackno));
  49167. /* RTT estimation calculations. This is done by checking if the
  49168. incoming segment acknowledges the segment we use to take a
  49169. round-trip time measurement. */
  49170. if (pcb->rttest && TCP_SEQ_LT(pcb->rtseq, ackno)) {
  49171. 8030c96: 6ba3 ldr r3, [r4, #56] ; 0x38
  49172. 8030c98: bb33 cbnz r3, 8030ce8 <tcp_receive+0x29c>
  49173. 8030c9a: e04d b.n 8030d38 <tcp_receive+0x2ec>
  49174. strange since an "unsent" segment shouldn't be acked. The
  49175. rationale is that lwIP puts all outstanding segments on the
  49176. ->unsent list after a retransmission, so these segments may
  49177. in fact have been sent once. */
  49178. while (pcb->unsent != NULL &&
  49179. TCP_SEQ_BETWEEN(ackno, ntohl(pcb->unsent->tcphdr->seqno) +
  49180. 8030c9c: 68db ldr r3, [r3, #12]
  49181. 8030c9e: 6835 ldr r5, [r6, #0]
  49182. 8030ca0: 6858 ldr r0, [r3, #4]
  49183. 8030ca2: f7fd febf bl 802ea24 <lwip_ntohl>
  49184. 8030ca6: 6ee3 ldr r3, [r4, #108] ; 0x6c
  49185. 8030ca8: 891f ldrh r7, [r3, #8]
  49186. 8030caa: 68db ldr r3, [r3, #12]
  49187. 8030cac: 4680 mov r8, r0
  49188. 8030cae: 8998 ldrh r0, [r3, #12]
  49189. 8030cb0: f7fd feb1 bl 802ea16 <lwip_ntohs>
  49190. 8030cb4: f010 0003 ands.w r0, r0, #3
  49191. 8030cb8: bf18 it ne
  49192. 8030cba: 2001 movne r0, #1
  49193. 8030cbc: ebc8 0505 rsb r5, r8, r5
  49194. 8030cc0: 1838 adds r0, r7, r0
  49195. 8030cc2: 1a2d subs r5, r5, r0
  49196. on the list are acknowledged by the ACK. This may seem
  49197. strange since an "unsent" segment shouldn't be acked. The
  49198. rationale is that lwIP puts all outstanding segments on the
  49199. ->unsent list after a retransmission, so these segments may
  49200. in fact have been sent once. */
  49201. while (pcb->unsent != NULL &&
  49202. 8030cc4: 2d00 cmp r5, #0
  49203. 8030cc6: dbe6 blt.n 8030c96 <tcp_receive+0x24a>
  49204. TCP_SEQ_BETWEEN(ackno, ntohl(pcb->unsent->tcphdr->seqno) +
  49205. 8030cc8: 6832 ldr r2, [r6, #0]
  49206. 8030cca: 6d23 ldr r3, [r4, #80] ; 0x50
  49207. 8030ccc: 1ad3 subs r3, r2, r3
  49208. 8030cce: 2b00 cmp r3, #0
  49209. 8030cd0: ddbb ble.n 8030c4a <tcp_receive+0x1fe>
  49210. 8030cd2: e7e0 b.n 8030c96 <tcp_receive+0x24a>
  49211. 8030cd4: 2000c444 .word 0x2000c444
  49212. 8030cd8: 2000c438 .word 0x2000c438
  49213. 8030cdc: 2000c440 .word 0x2000c440
  49214. 8030ce0: 2000c434 .word 0x2000c434
  49215. 8030ce4: 2000c43c .word 0x2000c43c
  49216. pcb->rttest, pcb->rtseq, ackno));
  49217. /* RTT estimation calculations. This is done by checking if the
  49218. incoming segment acknowledges the segment we use to take a
  49219. round-trip time measurement. */
  49220. if (pcb->rttest && TCP_SEQ_LT(pcb->rtseq, ackno)) {
  49221. 8030ce8: 497b ldr r1, [pc, #492] ; (8030ed8 <tcp_receive+0x48c>)
  49222. 8030cea: 6be2 ldr r2, [r4, #60] ; 0x3c
  49223. 8030cec: 6809 ldr r1, [r1, #0]
  49224. 8030cee: 1a52 subs r2, r2, r1
  49225. 8030cf0: 2a00 cmp r2, #0
  49226. 8030cf2: da21 bge.n 8030d38 <tcp_receive+0x2ec>
  49227. /* diff between this shouldn't exceed 32K since this are tcp timer ticks
  49228. and a round-trip shouldn't be that long... */
  49229. m = (s16_t)(tcp_ticks - pcb->rttest);
  49230. 8030cf4: 4a79 ldr r2, [pc, #484] ; (8030edc <tcp_receive+0x490>)
  49231. LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_receive: experienced rtt %"U16_F" ticks (%"U16_F" msec).\n",
  49232. m, m * TCP_SLOW_INTERVAL));
  49233. /* This is taken directly from VJs original code in his paper */
  49234. m = m - (pcb->sa >> 3);
  49235. 8030cf6: f8b4 1040 ldrh.w r1, [r4, #64] ; 0x40
  49236. incoming segment acknowledges the segment we use to take a
  49237. round-trip time measurement. */
  49238. if (pcb->rttest && TCP_SEQ_LT(pcb->rtseq, ackno)) {
  49239. /* diff between this shouldn't exceed 32K since this are tcp timer ticks
  49240. and a round-trip shouldn't be that long... */
  49241. m = (s16_t)(tcp_ticks - pcb->rttest);
  49242. 8030cfa: 6812 ldr r2, [r2, #0]
  49243. LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_receive: experienced rtt %"U16_F" ticks (%"U16_F" msec).\n",
  49244. m, m * TCP_SLOW_INTERVAL));
  49245. /* This is taken directly from VJs original code in his paper */
  49246. m = m - (pcb->sa >> 3);
  49247. 8030cfc: f341 00cc sbfx r0, r1, #3, #13
  49248. incoming segment acknowledges the segment we use to take a
  49249. round-trip time measurement. */
  49250. if (pcb->rttest && TCP_SEQ_LT(pcb->rtseq, ackno)) {
  49251. /* diff between this shouldn't exceed 32K since this are tcp timer ticks
  49252. and a round-trip shouldn't be that long... */
  49253. m = (s16_t)(tcp_ticks - pcb->rttest);
  49254. 8030d00: 1ad2 subs r2, r2, r3
  49255. LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_receive: experienced rtt %"U16_F" ticks (%"U16_F" msec).\n",
  49256. m, m * TCP_SLOW_INTERVAL));
  49257. /* This is taken directly from VJs original code in his paper */
  49258. m = m - (pcb->sa >> 3);
  49259. 8030d02: 1a12 subs r2, r2, r0
  49260. 8030d04: b292 uxth r2, r2
  49261. 8030d06: b293 uxth r3, r2
  49262. pcb->sa += m;
  49263. 8030d08: 1851 adds r1, r2, r1
  49264. 8030d0a: b289 uxth r1, r1
  49265. if (m < 0) {
  49266. 8030d0c: 0418 lsls r0, r3, #16
  49267. LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_receive: experienced rtt %"U16_F" ticks (%"U16_F" msec).\n",
  49268. m, m * TCP_SLOW_INTERVAL));
  49269. /* This is taken directly from VJs original code in his paper */
  49270. m = m - (pcb->sa >> 3);
  49271. pcb->sa += m;
  49272. 8030d0e: f8a4 1040 strh.w r1, [r4, #64] ; 0x40
  49273. if (m < 0) {
  49274. 8030d12: d501 bpl.n 8030d18 <tcp_receive+0x2cc>
  49275. m = -m;
  49276. 8030d14: 4253 negs r3, r2
  49277. 8030d16: b29b uxth r3, r3
  49278. }
  49279. m = m - (pcb->sv >> 2);
  49280. 8030d18: f8b4 2042 ldrh.w r2, [r4, #66] ; 0x42
  49281. 8030d1c: f342 008d sbfx r0, r2, #2, #14
  49282. 8030d20: 1a12 subs r2, r2, r0
  49283. pcb->sv += m;
  49284. 8030d22: 18d3 adds r3, r2, r3
  49285. 8030d24: b29b uxth r3, r3
  49286. pcb->rto = (pcb->sa >> 3) + pcb->sv;
  49287. 8030d26: f341 01cc sbfx r1, r1, #3, #13
  49288. pcb->sa += m;
  49289. if (m < 0) {
  49290. m = -m;
  49291. }
  49292. m = m - (pcb->sv >> 2);
  49293. pcb->sv += m;
  49294. 8030d2a: f8a4 3042 strh.w r3, [r4, #66] ; 0x42
  49295. pcb->rto = (pcb->sa >> 3) + pcb->sv;
  49296. 8030d2e: 185b adds r3, r3, r1
  49297. 8030d30: f8a4 3044 strh.w r3, [r4, #68] ; 0x44
  49298. LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_receive: RTO %"U16_F" (%"U16_F" milliseconds)\n",
  49299. pcb->rto, pcb->rto * TCP_SLOW_INTERVAL));
  49300. pcb->rttest = 0;
  49301. 8030d34: 2300 movs r3, #0
  49302. 8030d36: 63a3 str r3, [r4, #56] ; 0x38
  49303. /* If the incoming segment contains data, we must process it
  49304. further unless the pcb already received a FIN.
  49305. (RFC 793, chapeter 3.9, "SEGMENT ARRIVES" in states CLOSE-WAIT, CLOSING,
  49306. LAST-ACK and TIME-WAIT: "Ignore the segment text.") */
  49307. if ((tcplen > 0) && (pcb->state < CLOSE_WAIT)) {
  49308. 8030d38: 4b69 ldr r3, [pc, #420] ; (8030ee0 <tcp_receive+0x494>)
  49309. 8030d3a: 4a6a ldr r2, [pc, #424] ; (8030ee4 <tcp_receive+0x498>)
  49310. 8030d3c: 8818 ldrh r0, [r3, #0]
  49311. 8030d3e: 2800 cmp r0, #0
  49312. 8030d40: f000 80b3 beq.w 8030eaa <tcp_receive+0x45e>
  49313. 8030d44: 7e23 ldrb r3, [r4, #24]
  49314. 8030d46: 2b06 cmp r3, #6
  49315. 8030d48: f200 80af bhi.w 8030eaa <tcp_receive+0x45e>
  49316. this if the sequence number of the incoming segment is less
  49317. than rcv_nxt, and the sequence number plus the length of the
  49318. segment is larger than rcv_nxt. */
  49319. /* if (TCP_SEQ_LT(seqno, pcb->rcv_nxt)){
  49320. if (TCP_SEQ_LT(pcb->rcv_nxt, seqno + tcplen)) {*/
  49321. if (TCP_SEQ_BETWEEN(pcb->rcv_nxt, seqno + 1, seqno + tcplen - 1)){
  49322. 8030d4c: 6811 ldr r1, [r2, #0]
  49323. 8030d4e: 6aa3 ldr r3, [r4, #40] ; 0x28
  49324. 8030d50: 43ca mvns r2, r1
  49325. 8030d52: 42da cmn r2, r3
  49326. 8030d54: d425 bmi.n 8030da2 <tcp_receive+0x356>
  49327. 8030d56: 1c5a adds r2, r3, #1
  49328. 8030d58: 1a52 subs r2, r2, r1
  49329. 8030d5a: 1a10 subs r0, r2, r0
  49330. 8030d5c: 2800 cmp r0, #0
  49331. 8030d5e: dc20 bgt.n 8030da2 <tcp_receive+0x356>
  49332. After we are done with adjusting the pbuf pointers we must
  49333. adjust the ->data pointer in the seg and the segment
  49334. length.*/
  49335. off = pcb->rcv_nxt - seqno;
  49336. 8030d60: 1a59 subs r1, r3, r1
  49337. p = inseg.p;
  49338. 8030d62: 4b61 ldr r3, [pc, #388] ; (8030ee8 <tcp_receive+0x49c>)
  49339. 8030d64: 6858 ldr r0, [r3, #4]
  49340. LWIP_ASSERT("inseg.p != NULL", inseg.p);
  49341. LWIP_ASSERT("insane offset!", (off < 0x7fff));
  49342. if (inseg.p->len < off) {
  49343. 8030d66: 8943 ldrh r3, [r0, #10]
  49344. 8030d68: 428b cmp r3, r1
  49345. 8030d6a: da0a bge.n 8030d82 <tcp_receive+0x336>
  49346. LWIP_ASSERT("pbuf too short!", (((s32_t)inseg.p->tot_len) >= off));
  49347. new_tot_len = (u16_t)(inseg.p->tot_len - off);
  49348. 8030d6c: 8902 ldrh r2, [r0, #8]
  49349. off -= p->len;
  49350. /* KJM following line changed (with addition of new_tot_len var)
  49351. to fix bug #9076
  49352. inseg.p->tot_len -= p->len; */
  49353. p->tot_len = new_tot_len;
  49354. p->len = 0;
  49355. 8030d6e: 2500 movs r5, #0
  49356. p = inseg.p;
  49357. LWIP_ASSERT("inseg.p != NULL", inseg.p);
  49358. LWIP_ASSERT("insane offset!", (off < 0x7fff));
  49359. if (inseg.p->len < off) {
  49360. LWIP_ASSERT("pbuf too short!", (((s32_t)inseg.p->tot_len) >= off));
  49361. new_tot_len = (u16_t)(inseg.p->tot_len - off);
  49362. 8030d70: 1a52 subs r2, r2, r1
  49363. while (p->len < off) {
  49364. 8030d72: e003 b.n 8030d7c <tcp_receive+0x330>
  49365. off -= p->len;
  49366. /* KJM following line changed (with addition of new_tot_len var)
  49367. to fix bug #9076
  49368. inseg.p->tot_len -= p->len; */
  49369. p->tot_len = new_tot_len;
  49370. 8030d74: 8102 strh r2, [r0, #8]
  49371. p->len = 0;
  49372. 8030d76: 8145 strh r5, [r0, #10]
  49373. p = p->next;
  49374. 8030d78: 6800 ldr r0, [r0, #0]
  49375. LWIP_ASSERT("insane offset!", (off < 0x7fff));
  49376. if (inseg.p->len < off) {
  49377. LWIP_ASSERT("pbuf too short!", (((s32_t)inseg.p->tot_len) >= off));
  49378. new_tot_len = (u16_t)(inseg.p->tot_len - off);
  49379. while (p->len < off) {
  49380. off -= p->len;
  49381. 8030d7a: 1ac9 subs r1, r1, r3
  49382. LWIP_ASSERT("inseg.p != NULL", inseg.p);
  49383. LWIP_ASSERT("insane offset!", (off < 0x7fff));
  49384. if (inseg.p->len < off) {
  49385. LWIP_ASSERT("pbuf too short!", (((s32_t)inseg.p->tot_len) >= off));
  49386. new_tot_len = (u16_t)(inseg.p->tot_len - off);
  49387. while (p->len < off) {
  49388. 8030d7c: 8943 ldrh r3, [r0, #10]
  49389. 8030d7e: 428b cmp r3, r1
  49390. 8030d80: dbf8 blt.n 8030d74 <tcp_receive+0x328>
  49391. if(pbuf_header(p, (s16_t)-off)) {
  49392. /* Do we need to cope with this failing? Assert for now */
  49393. LWIP_ASSERT("pbuf_header failed", 0);
  49394. }
  49395. } else {
  49396. if(pbuf_header(inseg.p, (s16_t)-off)) {
  49397. 8030d82: 4249 negs r1, r1
  49398. 8030d84: b209 sxth r1, r1
  49399. 8030d86: f7fe ff54 bl 802fc32 <pbuf_header>
  49400. /* Do we need to cope with this failing? Assert for now */
  49401. LWIP_ASSERT("pbuf_header failed", 0);
  49402. }
  49403. }
  49404. inseg.len -= (u16_t)(pcb->rcv_nxt - seqno);
  49405. 8030d8a: 4a57 ldr r2, [pc, #348] ; (8030ee8 <tcp_receive+0x49c>)
  49406. 8030d8c: 4955 ldr r1, [pc, #340] ; (8030ee4 <tcp_receive+0x498>)
  49407. 8030d8e: 8915 ldrh r5, [r2, #8]
  49408. 8030d90: 6808 ldr r0, [r1, #0]
  49409. 8030d92: 6aa3 ldr r3, [r4, #40] ; 0x28
  49410. 8030d94: 1940 adds r0, r0, r5
  49411. 8030d96: 1ac0 subs r0, r0, r3
  49412. 8030d98: 8110 strh r0, [r2, #8]
  49413. inseg.tcphdr->seqno = seqno = pcb->rcv_nxt;
  49414. 8030d9a: 68d2 ldr r2, [r2, #12]
  49415. 8030d9c: 600b str r3, [r1, #0]
  49416. 8030d9e: 6053 str r3, [r2, #4]
  49417. 8030da0: e006 b.n 8030db0 <tcp_receive+0x364>
  49418. }
  49419. else {
  49420. if (TCP_SEQ_LT(seqno, pcb->rcv_nxt)){
  49421. 8030da2: 1ac9 subs r1, r1, r3
  49422. 8030da4: 2900 cmp r1, #0
  49423. 8030da6: da03 bge.n 8030db0 <tcp_receive+0x364>
  49424. /* the whole segment is < rcv_nxt */
  49425. /* must be a duplicate of a packet that has already been correctly handled */
  49426. LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: duplicate seqno %"U32_F"\n", seqno));
  49427. tcp_ack_now(pcb);
  49428. 8030da8: 7fa3 ldrb r3, [r4, #30]
  49429. 8030daa: f043 0302 orr.w r3, r3, #2
  49430. 8030dae: 77a3 strb r3, [r4, #30]
  49431. }
  49432. /* The sequence number must be within the window (above rcv_nxt
  49433. and below rcv_nxt + rcv_wnd) in order to be further
  49434. processed. */
  49435. if (TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt,
  49436. 8030db0: 4b4c ldr r3, [pc, #304] ; (8030ee4 <tcp_receive+0x498>)
  49437. 8030db2: 6aa2 ldr r2, [r4, #40] ; 0x28
  49438. 8030db4: 681b ldr r3, [r3, #0]
  49439. 8030db6: 1a99 subs r1, r3, r2
  49440. 8030db8: 2900 cmp r1, #0
  49441. 8030dba: db71 blt.n 8030ea0 <tcp_receive+0x454>
  49442. 8030dbc: 1c59 adds r1, r3, #1
  49443. 8030dbe: 8da0 ldrh r0, [r4, #44] ; 0x2c
  49444. 8030dc0: 1a89 subs r1, r1, r2
  49445. 8030dc2: 1a09 subs r1, r1, r0
  49446. 8030dc4: 2900 cmp r1, #0
  49447. 8030dc6: dc6b bgt.n 8030ea0 <tcp_receive+0x454>
  49448. pcb->rcv_nxt + pcb->rcv_wnd - 1)){
  49449. if (pcb->rcv_nxt == seqno) {
  49450. 8030dc8: 429a cmp r2, r3
  49451. 8030dca: d169 bne.n 8030ea0 <tcp_receive+0x454>
  49452. /* The incoming segment is the next in sequence. We check if
  49453. we have to trim the end of the segment and update rcv_nxt
  49454. and pass the data to the application. */
  49455. tcplen = TCP_TCPLEN(&inseg);
  49456. 8030dcc: 4d46 ldr r5, [pc, #280] ; (8030ee8 <tcp_receive+0x49c>)
  49457. 8030dce: 68eb ldr r3, [r5, #12]
  49458. 8030dd0: 892e ldrh r6, [r5, #8]
  49459. 8030dd2: 8998 ldrh r0, [r3, #12]
  49460. 8030dd4: f7fd fe1f bl 802ea16 <lwip_ntohs>
  49461. 8030dd8: f010 0003 ands.w r0, r0, #3
  49462. 8030ddc: bf18 it ne
  49463. 8030dde: 2001 movne r0, #1
  49464. 8030de0: 4b3f ldr r3, [pc, #252] ; (8030ee0 <tcp_receive+0x494>)
  49465. 8030de2: 1830 adds r0, r6, r0
  49466. 8030de4: b280 uxth r0, r0
  49467. 8030de6: 8018 strh r0, [r3, #0]
  49468. if (tcplen > pcb->rcv_wnd) {
  49469. 8030de8: 8da3 ldrh r3, [r4, #44] ; 0x2c
  49470. 8030dea: 4283 cmp r3, r0
  49471. 8030dec: d230 bcs.n 8030e50 <tcp_receive+0x404>
  49472. LWIP_DEBUGF(TCP_INPUT_DEBUG,
  49473. ("tcp_receive: other end overran receive window"
  49474. "seqno %"U32_F" len %"U16_F" right edge %"U32_F"\n",
  49475. seqno, tcplen, pcb->rcv_nxt + pcb->rcv_wnd));
  49476. if (TCPH_FLAGS(inseg.tcphdr) & TCP_FIN) {
  49477. 8030dee: 68eb ldr r3, [r5, #12]
  49478. 8030df0: 8998 ldrh r0, [r3, #12]
  49479. 8030df2: f7fd fe10 bl 802ea16 <lwip_ntohs>
  49480. 8030df6: 07c0 lsls r0, r0, #31
  49481. 8030df8: d50c bpl.n 8030e14 <tcp_receive+0x3c8>
  49482. /* Must remove the FIN from the header as we're trimming
  49483. * that byte of sequence-space from the packet */
  49484. TCPH_FLAGS_SET(inseg.tcphdr, TCPH_FLAGS(inseg.tcphdr) &~ TCP_FIN);
  49485. 8030dfa: 68ed ldr r5, [r5, #12]
  49486. 8030dfc: 89ae ldrh r6, [r5, #12]
  49487. 8030dfe: 4630 mov r0, r6
  49488. 8030e00: f7fd fe09 bl 802ea16 <lwip_ntohs>
  49489. 8030e04: f000 003e and.w r0, r0, #62 ; 0x3e
  49490. 8030e08: f7fd fe00 bl 802ea0c <lwip_htons>
  49491. 8030e0c: f426 567c bic.w r6, r6, #16128 ; 0x3f00
  49492. 8030e10: 4330 orrs r0, r6
  49493. 8030e12: 81a8 strh r0, [r5, #12]
  49494. }
  49495. /* Adjust length of segment to fit in the window. */
  49496. inseg.len = pcb->rcv_wnd;
  49497. 8030e14: 8da3 ldrh r3, [r4, #44] ; 0x2c
  49498. 8030e16: 4d34 ldr r5, [pc, #208] ; (8030ee8 <tcp_receive+0x49c>)
  49499. 8030e18: 812b strh r3, [r5, #8]
  49500. if (TCPH_FLAGS(inseg.tcphdr) & TCP_SYN) {
  49501. 8030e1a: 68eb ldr r3, [r5, #12]
  49502. 8030e1c: 8998 ldrh r0, [r3, #12]
  49503. 8030e1e: f7fd fdfa bl 802ea16 <lwip_ntohs>
  49504. 8030e22: f000 0002 and.w r0, r0, #2
  49505. 8030e26: b280 uxth r0, r0
  49506. 8030e28: b110 cbz r0, 8030e30 <tcp_receive+0x3e4>
  49507. inseg.len -= 1;
  49508. 8030e2a: 892b ldrh r3, [r5, #8]
  49509. 8030e2c: 3b01 subs r3, #1
  49510. 8030e2e: 812b strh r3, [r5, #8]
  49511. }
  49512. pbuf_realloc(inseg.p, inseg.len);
  49513. 8030e30: 6868 ldr r0, [r5, #4]
  49514. 8030e32: 8929 ldrh r1, [r5, #8]
  49515. 8030e34: f7fe ff4f bl 802fcd6 <pbuf_realloc>
  49516. tcplen = TCP_TCPLEN(&inseg);
  49517. 8030e38: 68eb ldr r3, [r5, #12]
  49518. 8030e3a: 892e ldrh r6, [r5, #8]
  49519. 8030e3c: 8998 ldrh r0, [r3, #12]
  49520. 8030e3e: f7fd fdea bl 802ea16 <lwip_ntohs>
  49521. 8030e42: f010 0003 ands.w r0, r0, #3
  49522. 8030e46: bf18 it ne
  49523. 8030e48: 2001 movne r0, #1
  49524. 8030e4a: 4b25 ldr r3, [pc, #148] ; (8030ee0 <tcp_receive+0x494>)
  49525. 8030e4c: 1830 adds r0, r6, r0
  49526. 8030e4e: 8018 strh r0, [r3, #0]
  49527. pcb->ooseq = next;
  49528. }
  49529. }
  49530. #endif /* TCP_QUEUE_OOSEQ */
  49531. pcb->rcv_nxt = seqno + tcplen;
  49532. 8030e50: 4b23 ldr r3, [pc, #140] ; (8030ee0 <tcp_receive+0x494>)
  49533. 8030e52: 4a24 ldr r2, [pc, #144] ; (8030ee4 <tcp_receive+0x498>)
  49534. 8030e54: 881b ldrh r3, [r3, #0]
  49535. 8030e56: 6812 ldr r2, [r2, #0]
  49536. 8030e58: 189a adds r2, r3, r2
  49537. 8030e5a: 62a2 str r2, [r4, #40] ; 0x28
  49538. /* Update the receiver's (our) window. */
  49539. LWIP_ASSERT("tcp_receive: tcplen > rcv_wnd\n", pcb->rcv_wnd >= tcplen);
  49540. pcb->rcv_wnd -= tcplen;
  49541. 8030e5c: 8da2 ldrh r2, [r4, #44] ; 0x2c
  49542. 8030e5e: 1ad3 subs r3, r2, r3
  49543. 8030e60: 85a3 strh r3, [r4, #44] ; 0x2c
  49544. tcp_update_rcv_ann_wnd(pcb);
  49545. 8030e62: 4620 mov r0, r4
  49546. 8030e64: f7ff f986 bl 8030174 <tcp_update_rcv_ann_wnd>
  49547. chains its data on this pbuf as well.
  49548. If the segment was a FIN, we set the TF_GOT_FIN flag that will
  49549. be used to indicate to the application that the remote side has
  49550. closed its end of the connection. */
  49551. if (inseg.p->tot_len > 0) {
  49552. 8030e68: 4b1f ldr r3, [pc, #124] ; (8030ee8 <tcp_receive+0x49c>)
  49553. 8030e6a: 685a ldr r2, [r3, #4]
  49554. 8030e6c: 8911 ldrh r1, [r2, #8]
  49555. 8030e6e: b119 cbz r1, 8030e78 <tcp_receive+0x42c>
  49556. recv_data = inseg.p;
  49557. 8030e70: 491e ldr r1, [pc, #120] ; (8030eec <tcp_receive+0x4a0>)
  49558. 8030e72: 600a str r2, [r1, #0]
  49559. /* Since this pbuf now is the responsibility of the
  49560. application, we delete our reference to it so that we won't
  49561. (mistakingly) deallocate it. */
  49562. inseg.p = NULL;
  49563. 8030e74: 2200 movs r2, #0
  49564. 8030e76: 605a str r2, [r3, #4]
  49565. }
  49566. if (TCPH_FLAGS(inseg.tcphdr) & TCP_FIN) {
  49567. 8030e78: 68db ldr r3, [r3, #12]
  49568. 8030e7a: 8998 ldrh r0, [r3, #12]
  49569. 8030e7c: f7fd fdcb bl 802ea16 <lwip_ntohs>
  49570. 8030e80: 07c1 lsls r1, r0, #31
  49571. 8030e82: d504 bpl.n 8030e8e <tcp_receive+0x442>
  49572. LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: received FIN.\n"));
  49573. recv_flags |= TF_GOT_FIN;
  49574. 8030e84: 4b1a ldr r3, [pc, #104] ; (8030ef0 <tcp_receive+0x4a4>)
  49575. 8030e86: 781a ldrb r2, [r3, #0]
  49576. 8030e88: f042 0220 orr.w r2, r2, #32
  49577. 8030e8c: 701a strb r2, [r3, #0]
  49578. }
  49579. #endif /* TCP_QUEUE_OOSEQ */
  49580. /* Acknowledge the segment(s). */
  49581. tcp_ack(pcb);
  49582. 8030e8e: 7fa3 ldrb r3, [r4, #30]
  49583. 8030e90: 07da lsls r2, r3, #31
  49584. 8030e92: d502 bpl.n 8030e9a <tcp_receive+0x44e>
  49585. 8030e94: f023 0301 bic.w r3, r3, #1
  49586. 8030e98: e013 b.n 8030ec2 <tcp_receive+0x476>
  49587. 8030e9a: f043 0301 orr.w r3, r3, #1
  49588. 8030e9e: e012 b.n 8030ec6 <tcp_receive+0x47a>
  49589. } else {
  49590. /* We get here if the incoming segment is out-of-sequence. */
  49591. tcp_send_empty_ack(pcb);
  49592. 8030ea0: 4620 mov r0, r4
  49593. TCP_SEQ_GEQ(seqno, pcb->rcv_nxt + pcb->rcv_wnd)) {*/
  49594. if(!TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt, pcb->rcv_nxt + pcb->rcv_wnd-1)){
  49595. tcp_ack_now(pcb);
  49596. }
  49597. }
  49598. }
  49599. 8030ea2: e8bd 41f0 ldmia.w sp!, {r4, r5, r6, r7, r8, lr}
  49600. /* Acknowledge the segment(s). */
  49601. tcp_ack(pcb);
  49602. } else {
  49603. /* We get here if the incoming segment is out-of-sequence. */
  49604. tcp_send_empty_ack(pcb);
  49605. 8030ea6: f000 bf09 b.w 8031cbc <tcp_send_empty_ack>
  49606. } else {
  49607. /* Segments with length 0 is taken care of here. Segments that
  49608. fall out of the window are ACKed. */
  49609. /*if (TCP_SEQ_GT(pcb->rcv_nxt, seqno) ||
  49610. TCP_SEQ_GEQ(seqno, pcb->rcv_nxt + pcb->rcv_wnd)) {*/
  49611. if(!TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt, pcb->rcv_nxt + pcb->rcv_wnd-1)){
  49612. 8030eaa: 6812 ldr r2, [r2, #0]
  49613. 8030eac: 6aa3 ldr r3, [r4, #40] ; 0x28
  49614. 8030eae: 1ad1 subs r1, r2, r3
  49615. 8030eb0: 2900 cmp r1, #0
  49616. 8030eb2: db05 blt.n 8030ec0 <tcp_receive+0x474>
  49617. 8030eb4: 3201 adds r2, #1
  49618. 8030eb6: 8da1 ldrh r1, [r4, #44] ; 0x2c
  49619. 8030eb8: 1ad3 subs r3, r2, r3
  49620. 8030eba: 1a5b subs r3, r3, r1
  49621. 8030ebc: 2b00 cmp r3, #0
  49622. 8030ebe: dd09 ble.n 8030ed4 <tcp_receive+0x488>
  49623. tcp_ack_now(pcb);
  49624. 8030ec0: 7fa3 ldrb r3, [r4, #30]
  49625. 8030ec2: f043 0302 orr.w r3, r3, #2
  49626. 8030ec6: 77a3 strb r3, [r4, #30]
  49627. 8030ec8: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  49628. }
  49629. }
  49630. /* If Clause (1) or more is true, but not a duplicate ack, reset
  49631. * count of consecutive duplicate acks */
  49632. if (!found_dupack) {
  49633. pcb->dupacks = 0;
  49634. 8030ecc: 2300 movs r3, #0
  49635. 8030ece: f884 3047 strb.w r3, [r4, #71] ; 0x47
  49636. 8030ed2: e6dd b.n 8030c90 <tcp_receive+0x244>
  49637. 8030ed4: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  49638. 8030ed8: 2000c440 .word 0x2000c440
  49639. 8030edc: 2000ff24 .word 0x2000ff24
  49640. 8030ee0: 2000c43c .word 0x2000c43c
  49641. 8030ee4: 2000c438 .word 0x2000c438
  49642. 8030ee8: 2000c450 .word 0x2000c450
  49643. 8030eec: 2000c448 .word 0x2000c448
  49644. 8030ef0: 2000c445 .word 0x2000c445
  49645. 08030ef4 <tcp_input>:
  49646. * @param p received TCP segment to process (p->payload pointing to the IP header)
  49647. * @param inp network interface on which this segment was received
  49648. */
  49649. void
  49650. tcp_input(struct pbuf *p, struct netif *inp)
  49651. {
  49652. 8030ef4: e92d 4ff7 stmdb sp!, {r0, r1, r2, r4, r5, r6, r7, r8, r9, sl, fp, lr}
  49653. 8030ef8: 4606 mov r6, r0
  49654. 8030efa: 460f mov r7, r1
  49655. err_t err;
  49656. PERF_START;
  49657. TCP_STATS_INC(tcp.recv);
  49658. snmp_inc_tcpinsegs();
  49659. 8030efc: f003 fcb8 bl 8034870 <snmp_inc_tcpinsegs>
  49660. iphdr = (struct ip_hdr *)p->payload;
  49661. 8030f00: 6873 ldr r3, [r6, #4]
  49662. 8030f02: 4aa7 ldr r2, [pc, #668] ; (80311a0 <tcp_input+0x2ac>)
  49663. tcphdr = (struct tcp_hdr *)((u8_t *)p->payload + IPH_HL(iphdr) * 4);
  49664. 8030f04: 4ca7 ldr r4, [pc, #668] ; (80311a4 <tcp_input+0x2b0>)
  49665. PERF_START;
  49666. TCP_STATS_INC(tcp.recv);
  49667. snmp_inc_tcpinsegs();
  49668. iphdr = (struct ip_hdr *)p->payload;
  49669. 8030f06: 6013 str r3, [r2, #0]
  49670. tcphdr = (struct tcp_hdr *)((u8_t *)p->payload + IPH_HL(iphdr) * 4);
  49671. 8030f08: 781a ldrb r2, [r3, #0]
  49672. 8030f0a: f002 020f and.w r2, r2, #15
  49673. #if TCP_INPUT_DEBUG
  49674. tcp_debug_print(tcphdr);
  49675. #endif
  49676. /* remove header from payload */
  49677. if (pbuf_header(p, -((s16_t)(IPH_HL(iphdr) * 4))) || (p->tot_len < sizeof(struct tcp_hdr))) {
  49678. 8030f0e: 0091 lsls r1, r2, #2
  49679. TCP_STATS_INC(tcp.recv);
  49680. snmp_inc_tcpinsegs();
  49681. iphdr = (struct ip_hdr *)p->payload;
  49682. tcphdr = (struct tcp_hdr *)((u8_t *)p->payload + IPH_HL(iphdr) * 4);
  49683. 8030f10: eb03 0382 add.w r3, r3, r2, lsl #2
  49684. #if TCP_INPUT_DEBUG
  49685. tcp_debug_print(tcphdr);
  49686. #endif
  49687. /* remove header from payload */
  49688. if (pbuf_header(p, -((s16_t)(IPH_HL(iphdr) * 4))) || (p->tot_len < sizeof(struct tcp_hdr))) {
  49689. 8030f14: 4630 mov r0, r6
  49690. 8030f16: 4249 negs r1, r1
  49691. TCP_STATS_INC(tcp.recv);
  49692. snmp_inc_tcpinsegs();
  49693. iphdr = (struct ip_hdr *)p->payload;
  49694. tcphdr = (struct tcp_hdr *)((u8_t *)p->payload + IPH_HL(iphdr) * 4);
  49695. 8030f18: 6023 str r3, [r4, #0]
  49696. #if TCP_INPUT_DEBUG
  49697. tcp_debug_print(tcphdr);
  49698. #endif
  49699. /* remove header from payload */
  49700. if (pbuf_header(p, -((s16_t)(IPH_HL(iphdr) * 4))) || (p->tot_len < sizeof(struct tcp_hdr))) {
  49701. 8030f1a: f7fe fe8a bl 802fc32 <pbuf_header>
  49702. 8030f1e: 2800 cmp r0, #0
  49703. 8030f20: f040 83ce bne.w 80316c0 <tcp_input+0x7cc>
  49704. 8030f24: 8933 ldrh r3, [r6, #8]
  49705. 8030f26: 2b13 cmp r3, #19
  49706. 8030f28: f240 83ca bls.w 80316c0 <tcp_input+0x7cc>
  49707. TCP_STATS_INC(tcp.lenerr);
  49708. goto dropped;
  49709. }
  49710. /* Don't even process incoming broadcasts/multicasts. */
  49711. if (ip_addr_isbroadcast(&current_iphdr_dest, inp) ||
  49712. 8030f2c: 4d9e ldr r5, [pc, #632] ; (80311a8 <tcp_input+0x2b4>)
  49713. 8030f2e: 4639 mov r1, r7
  49714. 8030f30: 6828 ldr r0, [r5, #0]
  49715. 8030f32: f001 fd43 bl 80329bc <ip4_addr_isbroadcast>
  49716. 8030f36: 2800 cmp r0, #0
  49717. 8030f38: f040 83c2 bne.w 80316c0 <tcp_input+0x7cc>
  49718. ip_addr_ismulticast(&current_iphdr_dest)) {
  49719. 8030f3c: 682b ldr r3, [r5, #0]
  49720. 8030f3e: f003 03f0 and.w r3, r3, #240 ; 0xf0
  49721. TCP_STATS_INC(tcp.lenerr);
  49722. goto dropped;
  49723. }
  49724. /* Don't even process incoming broadcasts/multicasts. */
  49725. if (ip_addr_isbroadcast(&current_iphdr_dest, inp) ||
  49726. 8030f42: 2be0 cmp r3, #224 ; 0xe0
  49727. 8030f44: f000 83bc beq.w 80316c0 <tcp_input+0x7cc>
  49728. }
  49729. #endif
  49730. /* Move the payload pointer in the pbuf so that it points to the
  49731. TCP data instead of the TCP header. */
  49732. hdrlen = TCPH_HDRLEN(tcphdr);
  49733. 8030f48: 6823 ldr r3, [r4, #0]
  49734. 8030f4a: 8998 ldrh r0, [r3, #12]
  49735. 8030f4c: f7fd fd63 bl 802ea16 <lwip_ntohs>
  49736. if(pbuf_header(p, -(hdrlen * 4))){
  49737. 8030f50: f06f 0103 mvn.w r1, #3
  49738. 8030f54: f3c0 3307 ubfx r3, r0, #12, #8
  49739. 8030f58: 4359 muls r1, r3
  49740. 8030f5a: 4630 mov r0, r6
  49741. 8030f5c: f7fe fe69 bl 802fc32 <pbuf_header>
  49742. 8030f60: 4683 mov fp, r0
  49743. 8030f62: 2800 cmp r0, #0
  49744. 8030f64: f040 83ac bne.w 80316c0 <tcp_input+0x7cc>
  49745. TCP_STATS_INC(tcp.lenerr);
  49746. goto dropped;
  49747. }
  49748. /* Convert fields in TCP header to host byte order. */
  49749. tcphdr->src = ntohs(tcphdr->src);
  49750. 8030f68: 6827 ldr r7, [r4, #0]
  49751. 8030f6a: 8838 ldrh r0, [r7, #0]
  49752. 8030f6c: f7fd fd53 bl 802ea16 <lwip_ntohs>
  49753. 8030f70: 8038 strh r0, [r7, #0]
  49754. tcphdr->dest = ntohs(tcphdr->dest);
  49755. 8030f72: 6827 ldr r7, [r4, #0]
  49756. 8030f74: 8878 ldrh r0, [r7, #2]
  49757. 8030f76: f7fd fd4e bl 802ea16 <lwip_ntohs>
  49758. 8030f7a: 8078 strh r0, [r7, #2]
  49759. seqno = tcphdr->seqno = ntohl(tcphdr->seqno);
  49760. 8030f7c: 6827 ldr r7, [r4, #0]
  49761. 8030f7e: 6878 ldr r0, [r7, #4]
  49762. 8030f80: f7fd fd50 bl 802ea24 <lwip_ntohl>
  49763. 8030f84: 4b89 ldr r3, [pc, #548] ; (80311ac <tcp_input+0x2b8>)
  49764. 8030f86: 6078 str r0, [r7, #4]
  49765. ackno = tcphdr->ackno = ntohl(tcphdr->ackno);
  49766. 8030f88: 6827 ldr r7, [r4, #0]
  49767. }
  49768. /* Convert fields in TCP header to host byte order. */
  49769. tcphdr->src = ntohs(tcphdr->src);
  49770. tcphdr->dest = ntohs(tcphdr->dest);
  49771. seqno = tcphdr->seqno = ntohl(tcphdr->seqno);
  49772. 8030f8a: 6018 str r0, [r3, #0]
  49773. ackno = tcphdr->ackno = ntohl(tcphdr->ackno);
  49774. 8030f8c: 68b8 ldr r0, [r7, #8]
  49775. 8030f8e: f7fd fd49 bl 802ea24 <lwip_ntohl>
  49776. 8030f92: 4b87 ldr r3, [pc, #540] ; (80311b0 <tcp_input+0x2bc>)
  49777. 8030f94: 60b8 str r0, [r7, #8]
  49778. tcphdr->wnd = ntohs(tcphdr->wnd);
  49779. 8030f96: 6827 ldr r7, [r4, #0]
  49780. /* Convert fields in TCP header to host byte order. */
  49781. tcphdr->src = ntohs(tcphdr->src);
  49782. tcphdr->dest = ntohs(tcphdr->dest);
  49783. seqno = tcphdr->seqno = ntohl(tcphdr->seqno);
  49784. ackno = tcphdr->ackno = ntohl(tcphdr->ackno);
  49785. 8030f98: 6018 str r0, [r3, #0]
  49786. tcphdr->wnd = ntohs(tcphdr->wnd);
  49787. 8030f9a: 89f8 ldrh r0, [r7, #14]
  49788. 8030f9c: f7fd fd3b bl 802ea16 <lwip_ntohs>
  49789. 8030fa0: 81f8 strh r0, [r7, #14]
  49790. flags = TCPH_FLAGS(tcphdr);
  49791. 8030fa2: 6823 ldr r3, [r4, #0]
  49792. 8030fa4: 8998 ldrh r0, [r3, #12]
  49793. 8030fa6: f7fd fd36 bl 802ea16 <lwip_ntohs>
  49794. 8030faa: 4b82 ldr r3, [pc, #520] ; (80311b4 <tcp_input+0x2c0>)
  49795. tcplen = p->tot_len + ((flags & (TCP_FIN | TCP_SYN)) ? 1 : 0);
  49796. 8030fac: f8b6 8008 ldrh.w r8, [r6, #8]
  49797. for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
  49798. LWIP_ASSERT("tcp_input: active pcb->state != CLOSED", pcb->state != CLOSED);
  49799. LWIP_ASSERT("tcp_input: active pcb->state != TIME-WAIT", pcb->state != TIME_WAIT);
  49800. LWIP_ASSERT("tcp_input: active pcb->state != LISTEN", pcb->state != LISTEN);
  49801. if (pcb->remote_port == tcphdr->src &&
  49802. 8030fb0: 6827 ldr r7, [r4, #0]
  49803. seqno = tcphdr->seqno = ntohl(tcphdr->seqno);
  49804. ackno = tcphdr->ackno = ntohl(tcphdr->ackno);
  49805. tcphdr->wnd = ntohs(tcphdr->wnd);
  49806. flags = TCPH_FLAGS(tcphdr);
  49807. tcplen = p->tot_len + ((flags & (TCP_FIN | TCP_SYN)) ? 1 : 0);
  49808. 8030fb2: f010 0c03 ands.w ip, r0, #3
  49809. tcphdr->dest = ntohs(tcphdr->dest);
  49810. seqno = tcphdr->seqno = ntohl(tcphdr->seqno);
  49811. ackno = tcphdr->ackno = ntohl(tcphdr->ackno);
  49812. tcphdr->wnd = ntohs(tcphdr->wnd);
  49813. flags = TCPH_FLAGS(tcphdr);
  49814. 8030fb6: f000 013f and.w r1, r0, #63 ; 0x3f
  49815. tcplen = p->tot_len + ((flags & (TCP_FIN | TCP_SYN)) ? 1 : 0);
  49816. 8030fba: bf18 it ne
  49817. 8030fbc: f04f 0c01 movne.w ip, #1
  49818. tcphdr->dest = ntohs(tcphdr->dest);
  49819. seqno = tcphdr->seqno = ntohl(tcphdr->seqno);
  49820. ackno = tcphdr->ackno = ntohl(tcphdr->ackno);
  49821. tcphdr->wnd = ntohs(tcphdr->wnd);
  49822. flags = TCPH_FLAGS(tcphdr);
  49823. 8030fc0: 7019 strb r1, [r3, #0]
  49824. tcplen = p->tot_len + ((flags & (TCP_FIN | TCP_SYN)) ? 1 : 0);
  49825. 8030fc2: 44c4 add ip, r8
  49826. 8030fc4: 4b7c ldr r3, [pc, #496] ; (80311b8 <tcp_input+0x2c4>)
  49827. LWIP_ASSERT("tcp_input: active pcb->state != TIME-WAIT", pcb->state != TIME_WAIT);
  49828. LWIP_ASSERT("tcp_input: active pcb->state != LISTEN", pcb->state != LISTEN);
  49829. if (pcb->remote_port == tcphdr->src &&
  49830. pcb->local_port == tcphdr->dest &&
  49831. ip_addr_cmp(&(pcb->remote_ip), &current_iphdr_src) &&
  49832. ip_addr_cmp(&(pcb->local_ip), &current_iphdr_dest)) {
  49833. 8030fc6: 6829 ldr r1, [r5, #0]
  49834. seqno = tcphdr->seqno = ntohl(tcphdr->seqno);
  49835. ackno = tcphdr->ackno = ntohl(tcphdr->ackno);
  49836. tcphdr->wnd = ntohs(tcphdr->wnd);
  49837. flags = TCPH_FLAGS(tcphdr);
  49838. tcplen = p->tot_len + ((flags & (TCP_FIN | TCP_SYN)) ? 1 : 0);
  49839. 8030fc8: fa1f fc8c uxth.w ip, ip
  49840. 8030fcc: f8a3 c000 strh.w ip, [r3]
  49841. /* Demultiplex an incoming segment. First, we check if it is destined
  49842. for an active connection. */
  49843. prev = NULL;
  49844. for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
  49845. 8030fd0: 4b7a ldr r3, [pc, #488] ; (80311bc <tcp_input+0x2c8>)
  49846. 8030fd2: f8d3 a000 ldr.w sl, [r3]
  49847. LWIP_ASSERT("tcp_input: active pcb->state != CLOSED", pcb->state != CLOSED);
  49848. LWIP_ASSERT("tcp_input: active pcb->state != TIME-WAIT", pcb->state != TIME_WAIT);
  49849. LWIP_ASSERT("tcp_input: active pcb->state != LISTEN", pcb->state != LISTEN);
  49850. if (pcb->remote_port == tcphdr->src &&
  49851. pcb->local_port == tcphdr->dest &&
  49852. ip_addr_cmp(&(pcb->remote_ip), &current_iphdr_src) &&
  49853. 8030fd6: 4b7a ldr r3, [pc, #488] ; (80311c0 <tcp_input+0x2cc>)
  49854. tcphdr->dest = ntohs(tcphdr->dest);
  49855. seqno = tcphdr->seqno = ntohl(tcphdr->seqno);
  49856. ackno = tcphdr->ackno = ntohl(tcphdr->ackno);
  49857. tcphdr->wnd = ntohs(tcphdr->wnd);
  49858. flags = TCPH_FLAGS(tcphdr);
  49859. 8030fd8: 4602 mov r2, r0
  49860. LWIP_ASSERT("tcp_input: active pcb->state != CLOSED", pcb->state != CLOSED);
  49861. LWIP_ASSERT("tcp_input: active pcb->state != TIME-WAIT", pcb->state != TIME_WAIT);
  49862. LWIP_ASSERT("tcp_input: active pcb->state != LISTEN", pcb->state != LISTEN);
  49863. if (pcb->remote_port == tcphdr->src &&
  49864. pcb->local_port == tcphdr->dest &&
  49865. ip_addr_cmp(&(pcb->remote_ip), &current_iphdr_src) &&
  49866. 8030fda: f8d3 9000 ldr.w r9, [r3]
  49867. /* Demultiplex an incoming segment. First, we check if it is destined
  49868. for an active connection. */
  49869. prev = NULL;
  49870. for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
  49871. 8030fde: 4654 mov r4, sl
  49872. flags = TCPH_FLAGS(tcphdr);
  49873. tcplen = p->tot_len + ((flags & (TCP_FIN | TCP_SYN)) ? 1 : 0);
  49874. /* Demultiplex an incoming segment. First, we check if it is destined
  49875. for an active connection. */
  49876. prev = NULL;
  49877. 8030fe0: 4658 mov r0, fp
  49878. for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
  49879. 8030fe2: e019 b.n 8031018 <tcp_input+0x124>
  49880. LWIP_ASSERT("tcp_input: active pcb->state != CLOSED", pcb->state != CLOSED);
  49881. LWIP_ASSERT("tcp_input: active pcb->state != TIME-WAIT", pcb->state != TIME_WAIT);
  49882. LWIP_ASSERT("tcp_input: active pcb->state != LISTEN", pcb->state != LISTEN);
  49883. if (pcb->remote_port == tcphdr->src &&
  49884. 8030fe4: 8ba5 ldrh r5, [r4, #28]
  49885. 8030fe6: 883b ldrh r3, [r7, #0]
  49886. 8030fe8: 429d cmp r5, r3
  49887. 8030fea: d113 bne.n 8031014 <tcp_input+0x120>
  49888. 8030fec: 8b65 ldrh r5, [r4, #26]
  49889. 8030fee: 887b ldrh r3, [r7, #2]
  49890. 8030ff0: 429d cmp r5, r3
  49891. 8030ff2: d10f bne.n 8031014 <tcp_input+0x120>
  49892. pcb->local_port == tcphdr->dest &&
  49893. 8030ff4: 6863 ldr r3, [r4, #4]
  49894. 8030ff6: 454b cmp r3, r9
  49895. 8030ff8: d10c bne.n 8031014 <tcp_input+0x120>
  49896. ip_addr_cmp(&(pcb->remote_ip), &current_iphdr_src) &&
  49897. 8030ffa: 6823 ldr r3, [r4, #0]
  49898. 8030ffc: 428b cmp r3, r1
  49899. 8030ffe: d109 bne.n 8031014 <tcp_input+0x120>
  49900. /* Move this PCB to the front of the list so that subsequent
  49901. lookups will be faster (we exploit locality in TCP segment
  49902. arrivals). */
  49903. LWIP_ASSERT("tcp_input: pcb->next != pcb (before cache)", pcb->next != pcb);
  49904. if (prev != NULL) {
  49905. 8031000: 2800 cmp r0, #0
  49906. 8031002: f000 8382 beq.w 803170a <tcp_input+0x816>
  49907. prev->next = pcb->next;
  49908. 8031006: 68e3 ldr r3, [r4, #12]
  49909. 8031008: 60c3 str r3, [r0, #12]
  49910. pcb->next = tcp_active_pcbs;
  49911. tcp_active_pcbs = pcb;
  49912. 803100a: 4b6c ldr r3, [pc, #432] ; (80311bc <tcp_input+0x2c8>)
  49913. lookups will be faster (we exploit locality in TCP segment
  49914. arrivals). */
  49915. LWIP_ASSERT("tcp_input: pcb->next != pcb (before cache)", pcb->next != pcb);
  49916. if (prev != NULL) {
  49917. prev->next = pcb->next;
  49918. pcb->next = tcp_active_pcbs;
  49919. 803100c: f8c4 a00c str.w sl, [r4, #12]
  49920. tcp_active_pcbs = pcb;
  49921. 8031010: 601c str r4, [r3, #0]
  49922. 8031012: e37a b.n 803170a <tcp_input+0x816>
  49923. 8031014: 4620 mov r0, r4
  49924. /* Demultiplex an incoming segment. First, we check if it is destined
  49925. for an active connection. */
  49926. prev = NULL;
  49927. for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
  49928. 8031016: 68e4 ldr r4, [r4, #12]
  49929. 8031018: 2c00 cmp r4, #0
  49930. 803101a: d1e3 bne.n 8030fe4 <tcp_input+0xf0>
  49931. 803101c: e372 b.n 8031704 <tcp_input+0x810>
  49932. if (pcb == NULL) {
  49933. /* If it did not go to an active connection, we check the connections
  49934. in the TIME-WAIT state. */
  49935. for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {
  49936. LWIP_ASSERT("tcp_input: TIME-WAIT pcb->state == TIME-WAIT", pcb->state == TIME_WAIT);
  49937. if (pcb->remote_port == tcphdr->src &&
  49938. 803101e: 8b98 ldrh r0, [r3, #28]
  49939. 8031020: 883c ldrh r4, [r7, #0]
  49940. 8031022: 4284 cmp r4, r0
  49941. 8031024: d130 bne.n 8031088 <tcp_input+0x194>
  49942. pcb->local_port == tcphdr->dest &&
  49943. 8031026: 8b58 ldrh r0, [r3, #26]
  49944. if (pcb == NULL) {
  49945. /* If it did not go to an active connection, we check the connections
  49946. in the TIME-WAIT state. */
  49947. for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {
  49948. LWIP_ASSERT("tcp_input: TIME-WAIT pcb->state == TIME-WAIT", pcb->state == TIME_WAIT);
  49949. if (pcb->remote_port == tcphdr->src &&
  49950. 8031028: 887d ldrh r5, [r7, #2]
  49951. 803102a: 4285 cmp r5, r0
  49952. 803102c: d12c bne.n 8031088 <tcp_input+0x194>
  49953. pcb->local_port == tcphdr->dest &&
  49954. 803102e: 6858 ldr r0, [r3, #4]
  49955. 8031030: 4548 cmp r0, r9
  49956. 8031032: d129 bne.n 8031088 <tcp_input+0x194>
  49957. ip_addr_cmp(&(pcb->remote_ip), &current_iphdr_src) &&
  49958. 8031034: 6818 ldr r0, [r3, #0]
  49959. 8031036: 4288 cmp r0, r1
  49960. 8031038: d126 bne.n 8031088 <tcp_input+0x194>
  49961. /* RFC 1337: in TIME_WAIT, ignore RST and ACK FINs + any 'acceptable' segments */
  49962. /* RFC 793 3.9 Event Processing - Segment Arrives:
  49963. * - first check sequence number - we skip that one in TIME_WAIT (always
  49964. * acceptable since we only send ACKs)
  49965. * - second check the RST bit (... return) */
  49966. if (flags & TCP_RST) {
  49967. 803103a: f002 0104 and.w r1, r2, #4
  49968. 803103e: b2c9 uxtb r1, r1
  49969. 8031040: 2900 cmp r1, #0
  49970. 8031042: f040 833f bne.w 80316c4 <tcp_input+0x7d0>
  49971. return ERR_OK;
  49972. }
  49973. /* - fourth, check the SYN bit, */
  49974. if (flags & TCP_SYN) {
  49975. 8031046: f002 0102 and.w r1, r2, #2
  49976. 803104a: b2c9 uxtb r1, r1
  49977. 803104c: b159 cbz r1, 8031066 <tcp_input+0x172>
  49978. /* If an incoming segment is not acceptable, an acknowledgment
  49979. should be sent in reply */
  49980. if (TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt, pcb->rcv_nxt+pcb->rcv_wnd)) {
  49981. 803104e: 4a57 ldr r2, [pc, #348] ; (80311ac <tcp_input+0x2b8>)
  49982. 8031050: 6811 ldr r1, [r2, #0]
  49983. 8031052: 6a9a ldr r2, [r3, #40] ; 0x28
  49984. 8031054: 1a8a subs r2, r1, r2
  49985. 8031056: d40b bmi.n 8031070 <tcp_input+0x17c>
  49986. 8031058: 8d98 ldrh r0, [r3, #44] ; 0x2c
  49987. 803105a: 1a12 subs r2, r2, r0
  49988. 803105c: 2a00 cmp r2, #0
  49989. 803105e: dc07 bgt.n 8031070 <tcp_input+0x17c>
  49990. /* If the SYN is in the window it is an error, send a reset */
  49991. tcp_rst(ackno, seqno + tcplen, ip_current_dest_addr(), ip_current_src_addr(),
  49992. 8031060: 9500 str r5, [sp, #0]
  49993. 8031062: 9401 str r4, [sp, #4]
  49994. 8031064: e041 b.n 80310ea <tcp_input+0x1f6>
  49995. tcphdr->dest, tcphdr->src);
  49996. return ERR_OK;
  49997. }
  49998. } else if (flags & TCP_FIN) {
  49999. 8031066: 07d2 lsls r2, r2, #31
  50000. 8031068: d502 bpl.n 8031070 <tcp_input+0x17c>
  50001. /* - eighth, check the FIN bit: Remain in the TIME-WAIT state.
  50002. Restart the 2 MSL time-wait timeout.*/
  50003. pcb->tmr = tcp_ticks;
  50004. 803106a: 4a56 ldr r2, [pc, #344] ; (80311c4 <tcp_input+0x2d0>)
  50005. 803106c: 6812 ldr r2, [r2, #0]
  50006. 803106e: 625a str r2, [r3, #36] ; 0x24
  50007. }
  50008. if ((tcplen > 0)) {
  50009. 8031070: f1bc 0f00 cmp.w ip, #0
  50010. 8031074: f000 8326 beq.w 80316c4 <tcp_input+0x7d0>
  50011. /* Acknowledge data, FIN or out-of-window SYN */
  50012. pcb->flags |= TF_ACK_NOW;
  50013. 8031078: 7f9a ldrb r2, [r3, #30]
  50014. 803107a: f042 0202 orr.w r2, r2, #2
  50015. 803107e: 779a strb r2, [r3, #30]
  50016. return tcp_output(pcb);
  50017. 8031080: 4618 mov r0, r3
  50018. 8031082: f000 fe3d bl 8031d00 <tcp_output>
  50019. 8031086: e31d b.n 80316c4 <tcp_input+0x7d0>
  50020. }
  50021. if (pcb == NULL) {
  50022. /* If it did not go to an active connection, we check the connections
  50023. in the TIME-WAIT state. */
  50024. for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {
  50025. 8031088: 68db ldr r3, [r3, #12]
  50026. 803108a: 2b00 cmp r3, #0
  50027. 803108c: d1c7 bne.n 803101e <tcp_input+0x12a>
  50028. }
  50029. /* Finally, if we still did not get a match, we check all PCBs that
  50030. are LISTENing for incoming connections. */
  50031. prev = NULL;
  50032. for(lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = lpcb->next) {
  50033. 803108e: 484e ldr r0, [pc, #312] ; (80311c8 <tcp_input+0x2d4>)
  50034. 8031090: 6804 ldr r4, [r0, #0]
  50035. 8031092: 4625 mov r5, r4
  50036. 8031094: e00f b.n 80310b6 <tcp_input+0x1c2>
  50037. if (lpcb->local_port == tcphdr->dest) {
  50038. 8031096: 8b68 ldrh r0, [r5, #26]
  50039. 8031098: f8b7 8002 ldrh.w r8, [r7, #2]
  50040. 803109c: 4580 cmp r8, r0
  50041. 803109e: d108 bne.n 80310b2 <tcp_input+0x1be>
  50042. /* found an ANY-match */
  50043. lpcb_any = lpcb;
  50044. lpcb_prev = prev;
  50045. }
  50046. #else /* SO_REUSE */
  50047. if (ip_addr_cmp(&(lpcb->local_ip), &current_iphdr_dest) ||
  50048. 80310a0: f8d5 8000 ldr.w r8, [r5]
  50049. 80310a4: 4588 cmp r8, r1
  50050. 80310a6: f000 8342 beq.w 803172e <tcp_input+0x83a>
  50051. ip_addr_isany(&(lpcb->local_ip))) {
  50052. 80310aa: f1b8 0f00 cmp.w r8, #0
  50053. 80310ae: f000 833e beq.w 803172e <tcp_input+0x83a>
  50054. 80310b2: 462b mov r3, r5
  50055. }
  50056. /* Finally, if we still did not get a match, we check all PCBs that
  50057. are LISTENing for incoming connections. */
  50058. prev = NULL;
  50059. for(lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = lpcb->next) {
  50060. 80310b4: 68ed ldr r5, [r5, #12]
  50061. 80310b6: 2d00 cmp r5, #0
  50062. 80310b8: d1ed bne.n 8031096 <tcp_input+0x1a2>
  50063. 80310ba: e33c b.n 8031736 <tcp_input+0x842>
  50064. if (lpcb != NULL) {
  50065. /* Move this PCB to the front of the list so that subsequent
  50066. lookups will be faster (we exploit locality in TCP segment
  50067. arrivals). */
  50068. if (prev != NULL) {
  50069. ((struct tcp_pcb_listen *)prev)->next = lpcb->next;
  50070. 80310bc: 68e9 ldr r1, [r5, #12]
  50071. 80310be: 60d9 str r1, [r3, #12]
  50072. /* our successor is the remainder of the listening list */
  50073. lpcb->next = tcp_listen_pcbs.listen_pcbs;
  50074. /* put this listening pcb at the head of the listening list */
  50075. tcp_listen_pcbs.listen_pcbs = lpcb;
  50076. 80310c0: 4b41 ldr r3, [pc, #260] ; (80311c8 <tcp_input+0x2d4>)
  50077. lookups will be faster (we exploit locality in TCP segment
  50078. arrivals). */
  50079. if (prev != NULL) {
  50080. ((struct tcp_pcb_listen *)prev)->next = lpcb->next;
  50081. /* our successor is the remainder of the listening list */
  50082. lpcb->next = tcp_listen_pcbs.listen_pcbs;
  50083. 80310c2: 60ec str r4, [r5, #12]
  50084. /* put this listening pcb at the head of the listening list */
  50085. tcp_listen_pcbs.listen_pcbs = lpcb;
  50086. 80310c4: 601d str r5, [r3, #0]
  50087. tcp_listen_input(struct tcp_pcb_listen *pcb)
  50088. {
  50089. struct tcp_pcb *npcb;
  50090. err_t rc;
  50091. if (flags & TCP_RST) {
  50092. 80310c6: f002 0304 and.w r3, r2, #4
  50093. 80310ca: b2db uxtb r3, r3
  50094. 80310cc: 2b00 cmp r3, #0
  50095. 80310ce: f040 82f9 bne.w 80316c4 <tcp_input+0x7d0>
  50096. return ERR_OK;
  50097. }
  50098. /* In the LISTEN state, we check for incoming SYN segments,
  50099. creates a new PCB, and responds with a SYN|ACK. */
  50100. if (flags & TCP_ACK) {
  50101. 80310d2: f002 0810 and.w r8, r2, #16
  50102. 80310d6: fa5f f888 uxtb.w r8, r8
  50103. 80310da: f1b8 0f00 cmp.w r8, #0
  50104. 80310de: d00c beq.n 80310fa <tcp_input+0x206>
  50105. /* For incoming segments with the ACK flag set, respond with a
  50106. RST. */
  50107. LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_listen_input: ACK in LISTEN, sending reset\n"));
  50108. tcp_rst(ackno, seqno + tcplen, ip_current_dest_addr(),
  50109. 80310e0: 4b32 ldr r3, [pc, #200] ; (80311ac <tcp_input+0x2b8>)
  50110. 80310e2: 6819 ldr r1, [r3, #0]
  50111. 80310e4: 9000 str r0, [sp, #0]
  50112. 80310e6: 883b ldrh r3, [r7, #0]
  50113. 80310e8: 9301 str r3, [sp, #4]
  50114. 80310ea: 4b31 ldr r3, [pc, #196] ; (80311b0 <tcp_input+0x2bc>)
  50115. 80310ec: 6818 ldr r0, [r3, #0]
  50116. 80310ee: 4461 add r1, ip
  50117. 80310f0: 4a2d ldr r2, [pc, #180] ; (80311a8 <tcp_input+0x2b4>)
  50118. 80310f2: 4b33 ldr r3, [pc, #204] ; (80311c0 <tcp_input+0x2cc>)
  50119. 80310f4: f000 ff28 bl 8031f48 <tcp_rst>
  50120. 80310f8: e2e4 b.n 80316c4 <tcp_input+0x7d0>
  50121. ip_current_src_addr(), tcphdr->dest, tcphdr->src);
  50122. } else if (flags & TCP_SYN) {
  50123. 80310fa: f002 0202 and.w r2, r2, #2
  50124. 80310fe: b2d2 uxtb r2, r2
  50125. 8031100: 2a00 cmp r2, #0
  50126. 8031102: f000 82df beq.w 80316c4 <tcp_input+0x7d0>
  50127. if (pcb->accepts_pending >= pcb->backlog) {
  50128. LWIP_DEBUGF(TCP_DEBUG, ("tcp_listen_input: listen backlog exceeded for port %"U16_F"\n", tcphdr->dest));
  50129. return ERR_ABRT;
  50130. }
  50131. #endif /* TCP_LISTEN_BACKLOG */
  50132. npcb = tcp_alloc(pcb->prio);
  50133. 8031106: 7e68 ldrb r0, [r5, #25]
  50134. 8031108: f7ff fbc6 bl 8030898 <tcp_alloc>
  50135. /* If a new PCB could not be created (probably due to lack of memory),
  50136. we don't do anything, but rely on the sender will retransmit the
  50137. SYN at a time when we have more memory available. */
  50138. if (npcb == NULL) {
  50139. 803110c: 4604 mov r4, r0
  50140. 803110e: 2800 cmp r0, #0
  50141. 8031110: f000 82d8 beq.w 80316c4 <tcp_input+0x7d0>
  50142. }
  50143. #if TCP_LISTEN_BACKLOG
  50144. pcb->accepts_pending++;
  50145. #endif /* TCP_LISTEN_BACKLOG */
  50146. /* Set up the new PCB. */
  50147. ip_addr_copy(npcb->local_ip, current_iphdr_dest);
  50148. 8031114: 4b24 ldr r3, [pc, #144] ; (80311a8 <tcp_input+0x2b4>)
  50149. 8031116: 681b ldr r3, [r3, #0]
  50150. 8031118: 6003 str r3, [r0, #0]
  50151. npcb->local_port = pcb->local_port;
  50152. 803111a: 8b6b ldrh r3, [r5, #26]
  50153. 803111c: 8343 strh r3, [r0, #26]
  50154. ip_addr_copy(npcb->remote_ip, current_iphdr_src);
  50155. 803111e: 4b28 ldr r3, [pc, #160] ; (80311c0 <tcp_input+0x2cc>)
  50156. 8031120: 681b ldr r3, [r3, #0]
  50157. 8031122: 6043 str r3, [r0, #4]
  50158. npcb->remote_port = tcphdr->src;
  50159. 8031124: 4b1f ldr r3, [pc, #124] ; (80311a4 <tcp_input+0x2b0>)
  50160. 8031126: 681b ldr r3, [r3, #0]
  50161. 8031128: 7859 ldrb r1, [r3, #1]
  50162. 803112a: 781a ldrb r2, [r3, #0]
  50163. 803112c: ea42 2201 orr.w r2, r2, r1, lsl #8
  50164. 8031130: 8382 strh r2, [r0, #28]
  50165. npcb->state = SYN_RCVD;
  50166. 8031132: 2203 movs r2, #3
  50167. 8031134: 7602 strb r2, [r0, #24]
  50168. npcb->rcv_nxt = seqno + 1;
  50169. 8031136: 4a1d ldr r2, [pc, #116] ; (80311ac <tcp_input+0x2b8>)
  50170. 8031138: 6812 ldr r2, [r2, #0]
  50171. 803113a: 1c51 adds r1, r2, #1
  50172. 803113c: 6281 str r1, [r0, #40] ; 0x28
  50173. npcb->rcv_ann_right_edge = npcb->rcv_nxt;
  50174. 803113e: 6301 str r1, [r0, #48] ; 0x30
  50175. npcb->snd_wnd = tcphdr->wnd;
  50176. 8031140: 89db ldrh r3, [r3, #14]
  50177. 8031142: f8a0 3060 strh.w r3, [r0, #96] ; 0x60
  50178. npcb->snd_wnd_max = tcphdr->wnd;
  50179. 8031146: f8a0 3062 strh.w r3, [r0, #98] ; 0x62
  50180. npcb->ssthresh = npcb->snd_wnd;
  50181. 803114a: f8a0 304e strh.w r3, [r0, #78] ; 0x4e
  50182. npcb->snd_wl1 = seqno - 1;/* initialise to seqno-1 to force window update */
  50183. npcb->callback_arg = pcb->callback_arg;
  50184. 803114e: 692b ldr r3, [r5, #16]
  50185. 8031150: 6103 str r3, [r0, #16]
  50186. #if LWIP_CALLBACK_API
  50187. npcb->accept = pcb->accept;
  50188. 8031152: 696b ldr r3, [r5, #20]
  50189. npcb->rcv_nxt = seqno + 1;
  50190. npcb->rcv_ann_right_edge = npcb->rcv_nxt;
  50191. npcb->snd_wnd = tcphdr->wnd;
  50192. npcb->snd_wnd_max = tcphdr->wnd;
  50193. npcb->ssthresh = npcb->snd_wnd;
  50194. npcb->snd_wl1 = seqno - 1;/* initialise to seqno-1 to force window update */
  50195. 8031154: 3a01 subs r2, #1
  50196. 8031156: 6542 str r2, [r0, #84] ; 0x54
  50197. npcb->callback_arg = pcb->callback_arg;
  50198. #if LWIP_CALLBACK_API
  50199. npcb->accept = pcb->accept;
  50200. 8031158: 6143 str r3, [r0, #20]
  50201. #endif /* LWIP_CALLBACK_API */
  50202. /* inherit socket options */
  50203. npcb->so_options = pcb->so_options & SOF_INHERITED;
  50204. 803115a: 7a2b ldrb r3, [r5, #8]
  50205. 803115c: f023 0373 bic.w r3, r3, #115 ; 0x73
  50206. 8031160: 7203 strb r3, [r0, #8]
  50207. /* Register the new PCB so that we can begin receiving segments
  50208. for it. */
  50209. TCP_REG_ACTIVE(npcb);
  50210. 8031162: 4b16 ldr r3, [pc, #88] ; (80311bc <tcp_input+0x2c8>)
  50211. 8031164: 681a ldr r2, [r3, #0]
  50212. 8031166: 6018 str r0, [r3, #0]
  50213. 8031168: 60c2 str r2, [r0, #12]
  50214. 803116a: f001 f887 bl 803227c <tcp_timer_needed>
  50215. 803116e: 4b17 ldr r3, [pc, #92] ; (80311cc <tcp_input+0x2d8>)
  50216. 8031170: 2201 movs r2, #1
  50217. /* Parse any options in the SYN. */
  50218. tcp_parseopt(npcb);
  50219. 8031172: 4620 mov r0, r4
  50220. #endif /* LWIP_CALLBACK_API */
  50221. /* inherit socket options */
  50222. npcb->so_options = pcb->so_options & SOF_INHERITED;
  50223. /* Register the new PCB so that we can begin receiving segments
  50224. for it. */
  50225. TCP_REG_ACTIVE(npcb);
  50226. 8031174: 701a strb r2, [r3, #0]
  50227. /* Parse any options in the SYN. */
  50228. tcp_parseopt(npcb);
  50229. 8031176: f7ff fc29 bl 80309cc <tcp_parseopt>
  50230. #if TCP_CALCULATE_EFF_SEND_MSS
  50231. npcb->mss = tcp_eff_send_mss(npcb->mss, &(npcb->remote_ip));
  50232. 803117a: 1d21 adds r1, r4, #4
  50233. 803117c: 8ee0 ldrh r0, [r4, #54] ; 0x36
  50234. 803117e: f7ff fc16 bl 80309ae <tcp_eff_send_mss>
  50235. 8031182: 86e0 strh r0, [r4, #54] ; 0x36
  50236. #endif /* TCP_CALCULATE_EFF_SEND_MSS */
  50237. snmp_inc_tcppassiveopens();
  50238. 8031184: f003 fb5c bl 8034840 <snmp_inc_tcppassiveopens>
  50239. /* Send a SYN|ACK together with the MSS option. */
  50240. rc = tcp_enqueue_flags(npcb, TCP_SYN | TCP_ACK);
  50241. 8031188: 4620 mov r0, r4
  50242. 803118a: 2112 movs r1, #18
  50243. 803118c: f000 fd28 bl 8031be0 <tcp_enqueue_flags>
  50244. if (rc != ERR_OK) {
  50245. 8031190: b120 cbz r0, 803119c <tcp_input+0x2a8>
  50246. tcp_abandon(npcb, 0);
  50247. 8031192: 4620 mov r0, r4
  50248. 8031194: 4641 mov r1, r8
  50249. 8031196: f7ff f9e1 bl 803055c <tcp_abandon>
  50250. 803119a: e293 b.n 80316c4 <tcp_input+0x7d0>
  50251. return rc;
  50252. }
  50253. return tcp_output(npcb);
  50254. 803119c: 4620 mov r0, r4
  50255. 803119e: e770 b.n 8031082 <tcp_input+0x18e>
  50256. 80311a0: 2000c44c .word 0x2000c44c
  50257. 80311a4: 2000c434 .word 0x2000c434
  50258. 80311a8: 2000ff48 .word 0x2000ff48
  50259. 80311ac: 2000c438 .word 0x2000c438
  50260. 80311b0: 2000c440 .word 0x2000c440
  50261. 80311b4: 2000c444 .word 0x2000c444
  50262. 80311b8: 2000c43c .word 0x2000c43c
  50263. 80311bc: 2000ff20 .word 0x2000ff20
  50264. 80311c0: 2000ff40 .word 0x2000ff40
  50265. 80311c4: 2000ff24 .word 0x2000ff24
  50266. 80311c8: 2000ff28 .word 0x2000ff28
  50267. 80311cc: 2000ff1c .word 0x2000ff1c
  50268. recv_data = NULL;
  50269. recv_flags = 0;
  50270. if (flags & TCP_PSH) {
  50271. p->flags |= PBUF_FLAG_PUSH;
  50272. 80311d0: 7b73 ldrb r3, [r6, #13]
  50273. 80311d2: f043 0301 orr.w r3, r3, #1
  50274. 80311d6: 7373 strb r3, [r6, #13]
  50275. }
  50276. /* If there is data which was previously "refused" by upper layer */
  50277. if (pcb->refused_data != NULL) {
  50278. 80311d8: 6f63 ldr r3, [r4, #116] ; 0x74
  50279. 80311da: b163 cbz r3, 80311f6 <tcp_input+0x302>
  50280. if ((tcp_process_refused_data(pcb) == ERR_ABRT) ||
  50281. 80311dc: 4620 mov r0, r4
  50282. 80311de: f7ff fad1 bl 8030784 <tcp_process_refused_data>
  50283. 80311e2: 300a adds r0, #10
  50284. 80311e4: d004 beq.n 80311f0 <tcp_input+0x2fc>
  50285. 80311e6: 6f63 ldr r3, [r4, #116] ; 0x74
  50286. 80311e8: b12b cbz r3, 80311f6 <tcp_input+0x302>
  50287. ((pcb->refused_data != NULL) && (tcplen > 0))) {
  50288. 80311ea: 4b9f ldr r3, [pc, #636] ; (8031468 <tcp_input+0x574>)
  50289. 80311ec: 881b ldrh r3, [r3, #0]
  50290. 80311ee: b113 cbz r3, 80311f6 <tcp_input+0x302>
  50291. /* pcb has been aborted or refused data is still refused and the new
  50292. segment contains data */
  50293. TCP_STATS_INC(tcp.drop);
  50294. snmp_inc_tcpinerrs();
  50295. 80311f0: f003 fb56 bl 80348a0 <snmp_inc_tcpinerrs>
  50296. goto aborted;
  50297. 80311f4: e249 b.n 803168a <tcp_input+0x796>
  50298. }
  50299. }
  50300. tcp_input_pcb = pcb;
  50301. 80311f6: 4b9d ldr r3, [pc, #628] ; (803146c <tcp_input+0x578>)
  50302. 80311f8: 601c str r4, [r3, #0]
  50303. err_t err;
  50304. err = ERR_OK;
  50305. /* Process incoming RST segments. */
  50306. if (flags & TCP_RST) {
  50307. 80311fa: 4b9d ldr r3, [pc, #628] ; (8031470 <tcp_input+0x57c>)
  50308. 80311fc: 781b ldrb r3, [r3, #0]
  50309. 80311fe: f003 0204 and.w r2, r3, #4
  50310. 8031202: b2d2 uxtb r2, r2
  50311. 8031204: b1aa cbz r2, 8031232 <tcp_input+0x33e>
  50312. /* First, determine if the reset is acceptable. */
  50313. if (pcb->state == SYN_SENT) {
  50314. 8031206: 7e23 ldrb r3, [r4, #24]
  50315. 8031208: 2b02 cmp r3, #2
  50316. 803120a: d106 bne.n 803121a <tcp_input+0x326>
  50317. if (ackno == pcb->snd_nxt) {
  50318. 803120c: 4b99 ldr r3, [pc, #612] ; (8031474 <tcp_input+0x580>)
  50319. 803120e: 681a ldr r2, [r3, #0]
  50320. 8031210: 6d23 ldr r3, [r4, #80] ; 0x50
  50321. 8031212: 429a cmp r2, r3
  50322. 8031214: f040 82a1 bne.w 803175a <tcp_input+0x866>
  50323. 8031218: e296 b.n 8031748 <tcp_input+0x854>
  50324. acceptable = 1;
  50325. }
  50326. } else {
  50327. if (TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt,
  50328. 803121a: 4b97 ldr r3, [pc, #604] ; (8031478 <tcp_input+0x584>)
  50329. 803121c: 681a ldr r2, [r3, #0]
  50330. 803121e: 6aa3 ldr r3, [r4, #40] ; 0x28
  50331. 8031220: 1ad3 subs r3, r2, r3
  50332. 8031222: f100 829a bmi.w 803175a <tcp_input+0x866>
  50333. 8031226: 8da1 ldrh r1, [r4, #44] ; 0x2c
  50334. 8031228: 1a5b subs r3, r3, r1
  50335. 803122a: 2b00 cmp r3, #0
  50336. 803122c: f300 8295 bgt.w 803175a <tcp_input+0x866>
  50337. 8031230: e28a b.n 8031748 <tcp_input+0x854>
  50338. seqno, pcb->rcv_nxt));
  50339. return ERR_OK;
  50340. }
  50341. }
  50342. if ((flags & TCP_SYN) && (pcb->state != SYN_SENT && pcb->state != SYN_RCVD)) {
  50343. 8031232: f003 0302 and.w r3, r3, #2
  50344. 8031236: b2db uxtb r3, r3
  50345. 8031238: b123 cbz r3, 8031244 <tcp_input+0x350>
  50346. 803123a: 7e23 ldrb r3, [r4, #24]
  50347. 803123c: 3b02 subs r3, #2
  50348. 803123e: 2b01 cmp r3, #1
  50349. 8031240: d900 bls.n 8031244 <tcp_input+0x350>
  50350. 8031242: e06b b.n 803131c <tcp_input+0x428>
  50351. /* Cope with new connection attempt after remote end crashed */
  50352. tcp_ack_now(pcb);
  50353. return ERR_OK;
  50354. }
  50355. if ((pcb->flags & TF_RXCLOSED) == 0) {
  50356. 8031244: 7fa3 ldrb r3, [r4, #30]
  50357. 8031246: f003 0310 and.w r3, r3, #16
  50358. 803124a: b2db uxtb r3, r3
  50359. 803124c: b913 cbnz r3, 8031254 <tcp_input+0x360>
  50360. /* Update the PCB (in)activity timer unless rx is closed (see tcp_shutdown) */
  50361. pcb->tmr = tcp_ticks;
  50362. 803124e: 4b8b ldr r3, [pc, #556] ; (803147c <tcp_input+0x588>)
  50363. 8031250: 681b ldr r3, [r3, #0]
  50364. 8031252: 6263 str r3, [r4, #36] ; 0x24
  50365. }
  50366. pcb->keep_cnt_sent = 0;
  50367. 8031254: 2300 movs r3, #0
  50368. 8031256: f884 3092 strb.w r3, [r4, #146] ; 0x92
  50369. tcp_parseopt(pcb);
  50370. 803125a: 4620 mov r0, r4
  50371. 803125c: f7ff fbb6 bl 80309cc <tcp_parseopt>
  50372. /* Do different things depending on the TCP state. */
  50373. switch (pcb->state) {
  50374. 8031260: 7e23 ldrb r3, [r4, #24]
  50375. 8031262: 3b02 subs r3, #2
  50376. 8031264: 2b07 cmp r3, #7
  50377. 8031266: f200 8278 bhi.w 803175a <tcp_input+0x866>
  50378. 803126a: e8df f013 tbh [pc, r3, lsl #1]
  50379. 803126e: 0008 .short 0x0008
  50380. 8031270: 00c90077 .word 0x00c90077
  50381. 8031274: 013000da .word 0x013000da
  50382. 8031278: 015200c9 .word 0x015200c9
  50383. 803127c: 0186 .short 0x0186
  50384. case SYN_SENT:
  50385. LWIP_DEBUGF(TCP_INPUT_DEBUG, ("SYN-SENT: ackno %"U32_F" pcb->snd_nxt %"U32_F" unacked %"U32_F"\n", ackno,
  50386. pcb->snd_nxt, ntohl(pcb->unacked->tcphdr->seqno)));
  50387. /* received SYN ACK with expected sequence number? */
  50388. if ((flags & TCP_ACK) && (flags & TCP_SYN)
  50389. 803127e: 4b7c ldr r3, [pc, #496] ; (8031470 <tcp_input+0x57c>)
  50390. 8031280: 781b ldrb r3, [r3, #0]
  50391. 8031282: f003 0312 and.w r3, r3, #18
  50392. 8031286: 2b12 cmp r3, #18
  50393. 8031288: d153 bne.n 8031332 <tcp_input+0x43e>
  50394. && ackno == ntohl(pcb->unacked->tcphdr->seqno) + 1) {
  50395. 803128a: 6f23 ldr r3, [r4, #112] ; 0x70
  50396. 803128c: 4d79 ldr r5, [pc, #484] ; (8031474 <tcp_input+0x580>)
  50397. 803128e: 68db ldr r3, [r3, #12]
  50398. 8031290: 682e ldr r6, [r5, #0]
  50399. 8031292: 6858 ldr r0, [r3, #4]
  50400. 8031294: f7fd fbc6 bl 802ea24 <lwip_ntohl>
  50401. 8031298: 3001 adds r0, #1
  50402. 803129a: 4286 cmp r6, r0
  50403. 803129c: d149 bne.n 8031332 <tcp_input+0x43e>
  50404. pcb->snd_buf++;
  50405. 803129e: f8b4 3066 ldrh.w r3, [r4, #102] ; 0x66
  50406. pcb->snd_wnd_max = tcphdr->wnd;
  50407. pcb->snd_wl1 = seqno - 1; /* initialise to seqno - 1 to force window update */
  50408. pcb->state = ESTABLISHED;
  50409. #if TCP_CALCULATE_EFF_SEND_MSS
  50410. pcb->mss = tcp_eff_send_mss(pcb->mss, &(pcb->remote_ip));
  50411. 80312a2: 8ee0 ldrh r0, [r4, #54] ; 0x36
  50412. LWIP_DEBUGF(TCP_INPUT_DEBUG, ("SYN-SENT: ackno %"U32_F" pcb->snd_nxt %"U32_F" unacked %"U32_F"\n", ackno,
  50413. pcb->snd_nxt, ntohl(pcb->unacked->tcphdr->seqno)));
  50414. /* received SYN ACK with expected sequence number? */
  50415. if ((flags & TCP_ACK) && (flags & TCP_SYN)
  50416. && ackno == ntohl(pcb->unacked->tcphdr->seqno) + 1) {
  50417. pcb->snd_buf++;
  50418. 80312a4: 3301 adds r3, #1
  50419. 80312a6: f8a4 3066 strh.w r3, [r4, #102] ; 0x66
  50420. pcb->rcv_nxt = seqno + 1;
  50421. 80312aa: 4b73 ldr r3, [pc, #460] ; (8031478 <tcp_input+0x584>)
  50422. 80312ac: 681b ldr r3, [r3, #0]
  50423. 80312ae: 1c5a adds r2, r3, #1
  50424. 80312b0: 62a2 str r2, [r4, #40] ; 0x28
  50425. pcb->rcv_ann_right_edge = pcb->rcv_nxt;
  50426. 80312b2: 6322 str r2, [r4, #48] ; 0x30
  50427. pcb->lastack = ackno;
  50428. 80312b4: 682a ldr r2, [r5, #0]
  50429. 80312b6: 64a2 str r2, [r4, #72] ; 0x48
  50430. pcb->snd_wnd = tcphdr->wnd;
  50431. 80312b8: 4a71 ldr r2, [pc, #452] ; (8031480 <tcp_input+0x58c>)
  50432. 80312ba: 6812 ldr r2, [r2, #0]
  50433. pcb->snd_wnd_max = tcphdr->wnd;
  50434. pcb->snd_wl1 = seqno - 1; /* initialise to seqno - 1 to force window update */
  50435. 80312bc: 3b01 subs r3, #1
  50436. && ackno == ntohl(pcb->unacked->tcphdr->seqno) + 1) {
  50437. pcb->snd_buf++;
  50438. pcb->rcv_nxt = seqno + 1;
  50439. pcb->rcv_ann_right_edge = pcb->rcv_nxt;
  50440. pcb->lastack = ackno;
  50441. pcb->snd_wnd = tcphdr->wnd;
  50442. 80312be: 89d2 ldrh r2, [r2, #14]
  50443. pcb->snd_wnd_max = tcphdr->wnd;
  50444. pcb->snd_wl1 = seqno - 1; /* initialise to seqno - 1 to force window update */
  50445. 80312c0: 6563 str r3, [r4, #84] ; 0x54
  50446. pcb->state = ESTABLISHED;
  50447. 80312c2: 2304 movs r3, #4
  50448. 80312c4: 7623 strb r3, [r4, #24]
  50449. #if TCP_CALCULATE_EFF_SEND_MSS
  50450. pcb->mss = tcp_eff_send_mss(pcb->mss, &(pcb->remote_ip));
  50451. 80312c6: 18e1 adds r1, r4, r3
  50452. && ackno == ntohl(pcb->unacked->tcphdr->seqno) + 1) {
  50453. pcb->snd_buf++;
  50454. pcb->rcv_nxt = seqno + 1;
  50455. pcb->rcv_ann_right_edge = pcb->rcv_nxt;
  50456. pcb->lastack = ackno;
  50457. pcb->snd_wnd = tcphdr->wnd;
  50458. 80312c8: f8a4 2060 strh.w r2, [r4, #96] ; 0x60
  50459. pcb->snd_wnd_max = tcphdr->wnd;
  50460. 80312cc: f8a4 2062 strh.w r2, [r4, #98] ; 0x62
  50461. pcb->snd_wl1 = seqno - 1; /* initialise to seqno - 1 to force window update */
  50462. pcb->state = ESTABLISHED;
  50463. #if TCP_CALCULATE_EFF_SEND_MSS
  50464. pcb->mss = tcp_eff_send_mss(pcb->mss, &(pcb->remote_ip));
  50465. 80312d0: f7ff fb6d bl 80309ae <tcp_eff_send_mss>
  50466. #endif /* TCP_CALCULATE_EFF_SEND_MSS */
  50467. /* Set ssthresh again after changing pcb->mss (already set in tcp_connect
  50468. * but for the default value of pcb->mss) */
  50469. pcb->ssthresh = pcb->mss * 10;
  50470. 80312d4: 230a movs r3, #10
  50471. 80312d6: 4343 muls r3, r0
  50472. 80312d8: f8a4 304e strh.w r3, [r4, #78] ; 0x4e
  50473. pcb->cwnd = ((pcb->cwnd == 1) ? (pcb->mss * 2) : pcb->mss);
  50474. 80312dc: f8b4 304c ldrh.w r3, [r4, #76] ; 0x4c
  50475. pcb->snd_wnd_max = tcphdr->wnd;
  50476. pcb->snd_wl1 = seqno - 1; /* initialise to seqno - 1 to force window update */
  50477. pcb->state = ESTABLISHED;
  50478. #if TCP_CALCULATE_EFF_SEND_MSS
  50479. pcb->mss = tcp_eff_send_mss(pcb->mss, &(pcb->remote_ip));
  50480. 80312e0: 86e0 strh r0, [r4, #54] ; 0x36
  50481. /* Set ssthresh again after changing pcb->mss (already set in tcp_connect
  50482. * but for the default value of pcb->mss) */
  50483. pcb->ssthresh = pcb->mss * 10;
  50484. pcb->cwnd = ((pcb->cwnd == 1) ? (pcb->mss * 2) : pcb->mss);
  50485. 80312e2: 2b01 cmp r3, #1
  50486. 80312e4: d101 bne.n 80312ea <tcp_input+0x3f6>
  50487. 80312e6: 0040 lsls r0, r0, #1
  50488. 80312e8: b280 uxth r0, r0
  50489. LWIP_ASSERT("pcb->snd_queuelen > 0", (pcb->snd_queuelen > 0));
  50490. --pcb->snd_queuelen;
  50491. 80312ea: f8b4 3068 ldrh.w r3, [r4, #104] ; 0x68
  50492. /* Set ssthresh again after changing pcb->mss (already set in tcp_connect
  50493. * but for the default value of pcb->mss) */
  50494. pcb->ssthresh = pcb->mss * 10;
  50495. pcb->cwnd = ((pcb->cwnd == 1) ? (pcb->mss * 2) : pcb->mss);
  50496. 80312ee: f8a4 004c strh.w r0, [r4, #76] ; 0x4c
  50497. LWIP_ASSERT("pcb->snd_queuelen > 0", (pcb->snd_queuelen > 0));
  50498. --pcb->snd_queuelen;
  50499. LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_process: SYN-SENT --queuelen %"U16_F"\n", (u16_t)pcb->snd_queuelen));
  50500. rseg = pcb->unacked;
  50501. 80312f2: 6f20 ldr r0, [r4, #112] ; 0x70
  50502. * but for the default value of pcb->mss) */
  50503. pcb->ssthresh = pcb->mss * 10;
  50504. pcb->cwnd = ((pcb->cwnd == 1) ? (pcb->mss * 2) : pcb->mss);
  50505. LWIP_ASSERT("pcb->snd_queuelen > 0", (pcb->snd_queuelen > 0));
  50506. --pcb->snd_queuelen;
  50507. 80312f4: 3b01 subs r3, #1
  50508. 80312f6: f8a4 3068 strh.w r3, [r4, #104] ; 0x68
  50509. LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_process: SYN-SENT --queuelen %"U16_F"\n", (u16_t)pcb->snd_queuelen));
  50510. rseg = pcb->unacked;
  50511. pcb->unacked = rseg->next;
  50512. 80312fa: 6803 ldr r3, [r0, #0]
  50513. 80312fc: 6723 str r3, [r4, #112] ; 0x70
  50514. tcp_seg_free(rseg);
  50515. 80312fe: f7fe ff70 bl 80301e2 <tcp_seg_free>
  50516. /* If there's nothing left to acknowledge, stop the retransmit
  50517. timer, otherwise reset it to start again */
  50518. if(pcb->unacked == NULL)
  50519. 8031302: 6f23 ldr r3, [r4, #112] ; 0x70
  50520. 8031304: b91b cbnz r3, 803130e <tcp_input+0x41a>
  50521. pcb->rtime = -1;
  50522. 8031306: f64f 73ff movw r3, #65535 ; 0xffff
  50523. 803130a: 86a3 strh r3, [r4, #52] ; 0x34
  50524. 803130c: e003 b.n 8031316 <tcp_input+0x422>
  50525. else {
  50526. pcb->rtime = 0;
  50527. 803130e: 2300 movs r3, #0
  50528. 8031310: 86a3 strh r3, [r4, #52] ; 0x34
  50529. pcb->nrtx = 0;
  50530. 8031312: f884 3046 strb.w r3, [r4, #70] ; 0x46
  50531. }
  50532. /* Call the user specified function to call when sucessfully
  50533. * connected. */
  50534. TCP_EVENT_CONNECTED(pcb, ERR_OK, err);
  50535. 8031316: f8d4 3080 ldr.w r3, [r4, #128] ; 0x80
  50536. 803131a: b91b cbnz r3, 8031324 <tcp_input+0x430>
  50537. if (err == ERR_ABRT) {
  50538. return ERR_ABRT;
  50539. }
  50540. tcp_ack_now(pcb);
  50541. 803131c: 7fa3 ldrb r3, [r4, #30]
  50542. 803131e: f043 0302 orr.w r3, r3, #2
  50543. 8031322: e219 b.n 8031758 <tcp_input+0x864>
  50544. pcb->nrtx = 0;
  50545. }
  50546. /* Call the user specified function to call when sucessfully
  50547. * connected. */
  50548. TCP_EVENT_CONNECTED(pcb, ERR_OK, err);
  50549. 8031324: 2200 movs r2, #0
  50550. 8031326: 6920 ldr r0, [r4, #16]
  50551. 8031328: 4621 mov r1, r4
  50552. 803132a: 4798 blx r3
  50553. if (err == ERR_ABRT) {
  50554. 803132c: 300a adds r0, #10
  50555. 803132e: d1f5 bne.n 803131c <tcp_input+0x428>
  50556. 8031330: e1ab b.n 803168a <tcp_input+0x796>
  50557. return ERR_ABRT;
  50558. }
  50559. tcp_ack_now(pcb);
  50560. }
  50561. /* received ACK? possibly a half-open connection */
  50562. else if (flags & TCP_ACK) {
  50563. 8031332: 4b4f ldr r3, [pc, #316] ; (8031470 <tcp_input+0x57c>)
  50564. 8031334: 781b ldrb r3, [r3, #0]
  50565. 8031336: f003 0310 and.w r3, r3, #16
  50566. 803133a: b2db uxtb r3, r3
  50567. 803133c: 2b00 cmp r3, #0
  50568. 803133e: f000 820c beq.w 803175a <tcp_input+0x866>
  50569. /* send a RST to bring the other side in a non-synchronized state. */
  50570. tcp_rst(ackno, seqno + tcplen, ip_current_dest_addr(), ip_current_src_addr(),
  50571. tcphdr->dest, tcphdr->src);
  50572. 8031342: 4b4f ldr r3, [pc, #316] ; (8031480 <tcp_input+0x58c>)
  50573. tcp_ack_now(pcb);
  50574. }
  50575. /* received ACK? possibly a half-open connection */
  50576. else if (flags & TCP_ACK) {
  50577. /* send a RST to bring the other side in a non-synchronized state. */
  50578. tcp_rst(ackno, seqno + tcplen, ip_current_dest_addr(), ip_current_src_addr(),
  50579. 8031344: 4a48 ldr r2, [pc, #288] ; (8031468 <tcp_input+0x574>)
  50580. tcphdr->dest, tcphdr->src);
  50581. 8031346: 681b ldr r3, [r3, #0]
  50582. tcp_ack_now(pcb);
  50583. }
  50584. /* received ACK? possibly a half-open connection */
  50585. else if (flags & TCP_ACK) {
  50586. /* send a RST to bring the other side in a non-synchronized state. */
  50587. tcp_rst(ackno, seqno + tcplen, ip_current_dest_addr(), ip_current_src_addr(),
  50588. 8031348: 8811 ldrh r1, [r2, #0]
  50589. 803134a: 8858 ldrh r0, [r3, #2]
  50590. 803134c: 4a4a ldr r2, [pc, #296] ; (8031478 <tcp_input+0x584>)
  50591. 803134e: 6812 ldr r2, [r2, #0]
  50592. 8031350: 9000 str r0, [sp, #0]
  50593. 8031352: 881b ldrh r3, [r3, #0]
  50594. 8031354: 9301 str r3, [sp, #4]
  50595. 8031356: 4b47 ldr r3, [pc, #284] ; (8031474 <tcp_input+0x580>)
  50596. 8031358: 6818 ldr r0, [r3, #0]
  50597. 803135a: e03a b.n 80313d2 <tcp_input+0x4de>
  50598. tcphdr->dest, tcphdr->src);
  50599. }
  50600. break;
  50601. case SYN_RCVD:
  50602. if (flags & TCP_ACK) {
  50603. 803135c: 4b44 ldr r3, [pc, #272] ; (8031470 <tcp_input+0x57c>)
  50604. 803135e: 781b ldrb r3, [r3, #0]
  50605. 8031360: f003 0210 and.w r2, r3, #16
  50606. 8031364: b2d2 uxtb r2, r2
  50607. 8031366: 2a00 cmp r2, #0
  50608. 8031368: d039 beq.n 80313de <tcp_input+0x4ea>
  50609. /* expected ACK number? */
  50610. if (TCP_SEQ_BETWEEN(ackno, pcb->lastack+1, pcb->snd_nxt)) {
  50611. 803136a: 4b42 ldr r3, [pc, #264] ; (8031474 <tcp_input+0x580>)
  50612. 803136c: 6818 ldr r0, [r3, #0]
  50613. 803136e: 6ca3 ldr r3, [r4, #72] ; 0x48
  50614. 8031370: 43db mvns r3, r3
  50615. 8031372: 42c3 cmn r3, r0
  50616. 8031374: d423 bmi.n 80313be <tcp_input+0x4ca>
  50617. 8031376: 6d23 ldr r3, [r4, #80] ; 0x50
  50618. 8031378: 1ac3 subs r3, r0, r3
  50619. 803137a: 2b00 cmp r3, #0
  50620. 803137c: dc1f bgt.n 80313be <tcp_input+0x4ca>
  50621. u16_t old_cwnd;
  50622. pcb->state = ESTABLISHED;
  50623. 803137e: 2304 movs r3, #4
  50624. 8031380: 7623 strb r3, [r4, #24]
  50625. LWIP_DEBUGF(TCP_DEBUG, ("TCP connection established %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest));
  50626. #if LWIP_CALLBACK_API
  50627. LWIP_ASSERT("pcb->accept != NULL", pcb->accept != NULL);
  50628. #endif
  50629. /* Call the accept function. */
  50630. TCP_EVENT_ACCEPT(pcb, ERR_OK, err);
  50631. 8031382: 6963 ldr r3, [r4, #20]
  50632. 8031384: b903 cbnz r3, 8031388 <tcp_input+0x494>
  50633. 8031386: e147 b.n 8031618 <tcp_input+0x724>
  50634. 8031388: 6920 ldr r0, [r4, #16]
  50635. 803138a: 4621 mov r1, r4
  50636. 803138c: 2200 movs r2, #0
  50637. 803138e: 4798 blx r3
  50638. if (err != ERR_OK) {
  50639. 8031390: b118 cbz r0, 803139a <tcp_input+0x4a6>
  50640. /* If the accept function returns with an error, we abort
  50641. * the connection. */
  50642. /* Already aborted? */
  50643. if (err != ERR_ABRT) {
  50644. 8031392: 300a adds r0, #10
  50645. 8031394: f040 8140 bne.w 8031618 <tcp_input+0x724>
  50646. 8031398: e177 b.n 803168a <tcp_input+0x796>
  50647. return ERR_ABRT;
  50648. }
  50649. old_cwnd = pcb->cwnd;
  50650. /* If there was any data contained within this ACK,
  50651. * we'd better pass it on to the application as well. */
  50652. tcp_receive(pcb);
  50653. 803139a: 4620 mov r0, r4
  50654. if (err != ERR_ABRT) {
  50655. tcp_abort(pcb);
  50656. }
  50657. return ERR_ABRT;
  50658. }
  50659. old_cwnd = pcb->cwnd;
  50660. 803139c: f8b4 504c ldrh.w r5, [r4, #76] ; 0x4c
  50661. /* If there was any data contained within this ACK,
  50662. * we'd better pass it on to the application as well. */
  50663. tcp_receive(pcb);
  50664. 80313a0: f7ff fb54 bl 8030a4c <tcp_receive>
  50665. /* Prevent ACK for SYN to generate a sent event */
  50666. if (pcb->acked != 0) {
  50667. 80313a4: f8b4 3064 ldrh.w r3, [r4, #100] ; 0x64
  50668. 80313a8: b113 cbz r3, 80313b0 <tcp_input+0x4bc>
  50669. pcb->acked--;
  50670. 80313aa: 3b01 subs r3, #1
  50671. 80313ac: f8a4 3064 strh.w r3, [r4, #100] ; 0x64
  50672. }
  50673. pcb->cwnd = ((old_cwnd == 1) ? (pcb->mss * 2) : pcb->mss);
  50674. 80313b0: 8ee3 ldrh r3, [r4, #54] ; 0x36
  50675. 80313b2: 2d01 cmp r5, #1
  50676. 80313b4: bf08 it eq
  50677. 80313b6: 005b lsleq r3, r3, #1
  50678. 80313b8: f8a4 304c strh.w r3, [r4, #76] ; 0x4c
  50679. 80313bc: e023 b.n 8031406 <tcp_input+0x512>
  50680. pcb->state = CLOSE_WAIT;
  50681. }
  50682. } else {
  50683. /* incorrect ACK number, send RST */
  50684. tcp_rst(ackno, seqno + tcplen, ip_current_dest_addr(), ip_current_src_addr(),
  50685. tcphdr->dest, tcphdr->src);
  50686. 80313be: 4b30 ldr r3, [pc, #192] ; (8031480 <tcp_input+0x58c>)
  50687. tcp_ack_now(pcb);
  50688. pcb->state = CLOSE_WAIT;
  50689. }
  50690. } else {
  50691. /* incorrect ACK number, send RST */
  50692. tcp_rst(ackno, seqno + tcplen, ip_current_dest_addr(), ip_current_src_addr(),
  50693. 80313c0: 4a29 ldr r2, [pc, #164] ; (8031468 <tcp_input+0x574>)
  50694. tcphdr->dest, tcphdr->src);
  50695. 80313c2: 681b ldr r3, [r3, #0]
  50696. tcp_ack_now(pcb);
  50697. pcb->state = CLOSE_WAIT;
  50698. }
  50699. } else {
  50700. /* incorrect ACK number, send RST */
  50701. tcp_rst(ackno, seqno + tcplen, ip_current_dest_addr(), ip_current_src_addr(),
  50702. 80313c4: 8811 ldrh r1, [r2, #0]
  50703. 80313c6: 885d ldrh r5, [r3, #2]
  50704. 80313c8: 4a2b ldr r2, [pc, #172] ; (8031478 <tcp_input+0x584>)
  50705. 80313ca: 6812 ldr r2, [r2, #0]
  50706. 80313cc: 9500 str r5, [sp, #0]
  50707. 80313ce: 881b ldrh r3, [r3, #0]
  50708. 80313d0: 9301 str r3, [sp, #4]
  50709. 80313d2: 1889 adds r1, r1, r2
  50710. 80313d4: 4b2b ldr r3, [pc, #172] ; (8031484 <tcp_input+0x590>)
  50711. 80313d6: 4a2c ldr r2, [pc, #176] ; (8031488 <tcp_input+0x594>)
  50712. 80313d8: f000 fdb6 bl 8031f48 <tcp_rst>
  50713. 80313dc: e1bd b.n 803175a <tcp_input+0x866>
  50714. tcphdr->dest, tcphdr->src);
  50715. }
  50716. } else if ((flags & TCP_SYN) && (seqno == pcb->rcv_nxt - 1)) {
  50717. 80313de: f003 0302 and.w r3, r3, #2
  50718. 80313e2: b2db uxtb r3, r3
  50719. 80313e4: 2b00 cmp r3, #0
  50720. 80313e6: f000 81b8 beq.w 803175a <tcp_input+0x866>
  50721. 80313ea: 4a23 ldr r2, [pc, #140] ; (8031478 <tcp_input+0x584>)
  50722. 80313ec: 6aa3 ldr r3, [r4, #40] ; 0x28
  50723. 80313ee: 6812 ldr r2, [r2, #0]
  50724. 80313f0: 3b01 subs r3, #1
  50725. 80313f2: 429a cmp r2, r3
  50726. 80313f4: f040 81b1 bne.w 803175a <tcp_input+0x866>
  50727. /* Looks like another copy of the SYN - retransmit our SYN-ACK */
  50728. tcp_rexmit(pcb);
  50729. 80313f8: 4620 mov r0, r4
  50730. 80313fa: f000 fe03 bl 8032004 <tcp_rexmit>
  50731. 80313fe: e1ac b.n 803175a <tcp_input+0x866>
  50732. }
  50733. break;
  50734. case CLOSE_WAIT:
  50735. /* FALLTHROUGH */
  50736. case ESTABLISHED:
  50737. tcp_receive(pcb);
  50738. 8031400: 4620 mov r0, r4
  50739. 8031402: f7ff fb23 bl 8030a4c <tcp_receive>
  50740. if (recv_flags & TF_GOT_FIN) { /* passive close */
  50741. 8031406: 4b21 ldr r3, [pc, #132] ; (803148c <tcp_input+0x598>)
  50742. 8031408: 781b ldrb r3, [r3, #0]
  50743. 803140a: f003 0320 and.w r3, r3, #32
  50744. 803140e: b2db uxtb r3, r3
  50745. 8031410: 2b00 cmp r3, #0
  50746. 8031412: f000 81a2 beq.w 803175a <tcp_input+0x866>
  50747. tcp_ack_now(pcb);
  50748. 8031416: 7fa3 ldrb r3, [r4, #30]
  50749. 8031418: f043 0302 orr.w r3, r3, #2
  50750. 803141c: 77a3 strb r3, [r4, #30]
  50751. pcb->state = CLOSE_WAIT;
  50752. 803141e: 2307 movs r3, #7
  50753. 8031420: e053 b.n 80314ca <tcp_input+0x5d6>
  50754. }
  50755. break;
  50756. case FIN_WAIT_1:
  50757. tcp_receive(pcb);
  50758. 8031422: 4620 mov r0, r4
  50759. 8031424: f7ff fb12 bl 8030a4c <tcp_receive>
  50760. if (recv_flags & TF_GOT_FIN) {
  50761. 8031428: 4b18 ldr r3, [pc, #96] ; (803148c <tcp_input+0x598>)
  50762. 803142a: 781a ldrb r2, [r3, #0]
  50763. 803142c: 4b10 ldr r3, [pc, #64] ; (8031470 <tcp_input+0x57c>)
  50764. if ((flags & TCP_ACK) && (ackno == pcb->snd_nxt)) {
  50765. 803142e: 781b ldrb r3, [r3, #0]
  50766. pcb->state = CLOSE_WAIT;
  50767. }
  50768. break;
  50769. case FIN_WAIT_1:
  50770. tcp_receive(pcb);
  50771. if (recv_flags & TF_GOT_FIN) {
  50772. 8031430: f002 0220 and.w r2, r2, #32
  50773. if ((flags & TCP_ACK) && (ackno == pcb->snd_nxt)) {
  50774. 8031434: f003 0310 and.w r3, r3, #16
  50775. pcb->state = CLOSE_WAIT;
  50776. }
  50777. break;
  50778. case FIN_WAIT_1:
  50779. tcp_receive(pcb);
  50780. if (recv_flags & TF_GOT_FIN) {
  50781. 8031438: b2d2 uxtb r2, r2
  50782. if ((flags & TCP_ACK) && (ackno == pcb->snd_nxt)) {
  50783. 803143a: b2db uxtb r3, r3
  50784. pcb->state = CLOSE_WAIT;
  50785. }
  50786. break;
  50787. case FIN_WAIT_1:
  50788. tcp_receive(pcb);
  50789. if (recv_flags & TF_GOT_FIN) {
  50790. 803143c: 2a00 cmp r2, #0
  50791. 803143e: d03a beq.n 80314b6 <tcp_input+0x5c2>
  50792. if ((flags & TCP_ACK) && (ackno == pcb->snd_nxt)) {
  50793. 8031440: 2b00 cmp r3, #0
  50794. 8031442: d032 beq.n 80314aa <tcp_input+0x5b6>
  50795. 8031444: 4b0b ldr r3, [pc, #44] ; (8031474 <tcp_input+0x580>)
  50796. 8031446: 681a ldr r2, [r3, #0]
  50797. 8031448: 6d23 ldr r3, [r4, #80] ; 0x50
  50798. 803144a: 429a cmp r2, r3
  50799. 803144c: d12d bne.n 80314aa <tcp_input+0x5b6>
  50800. LWIP_DEBUGF(TCP_DEBUG,
  50801. ("TCP connection closed: FIN_WAIT_1 %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest));
  50802. tcp_ack_now(pcb);
  50803. 803144e: 7fa3 ldrb r3, [r4, #30]
  50804. 8031450: f043 0302 orr.w r3, r3, #2
  50805. 8031454: 77a3 strb r3, [r4, #30]
  50806. tcp_pcb_purge(pcb);
  50807. 8031456: 4620 mov r0, r4
  50808. 8031458: f7fe feea bl 8030230 <tcp_pcb_purge>
  50809. TCP_RMV_ACTIVE(pcb);
  50810. 803145c: 4a0c ldr r2, [pc, #48] ; (8031490 <tcp_input+0x59c>)
  50811. 803145e: 6813 ldr r3, [r2, #0]
  50812. 8031460: 42a3 cmp r3, r4
  50813. 8031462: d117 bne.n 8031494 <tcp_input+0x5a0>
  50814. 8031464: e06d b.n 8031542 <tcp_input+0x64e>
  50815. 8031466: bf00 nop
  50816. 8031468: 2000c43c .word 0x2000c43c
  50817. 803146c: 2000ff38 .word 0x2000ff38
  50818. 8031470: 2000c444 .word 0x2000c444
  50819. 8031474: 2000c440 .word 0x2000c440
  50820. 8031478: 2000c438 .word 0x2000c438
  50821. 803147c: 2000ff24 .word 0x2000ff24
  50822. 8031480: 2000c434 .word 0x2000c434
  50823. 8031484: 2000ff40 .word 0x2000ff40
  50824. 8031488: 2000ff48 .word 0x2000ff48
  50825. 803148c: 2000c445 .word 0x2000c445
  50826. 8031490: 2000ff20 .word 0x2000ff20
  50827. 8031494: 4a8e ldr r2, [pc, #568] ; (80316d0 <tcp_input+0x7dc>)
  50828. 8031496: 6013 str r3, [r2, #0]
  50829. 8031498: e004 b.n 80314a4 <tcp_input+0x5b0>
  50830. 803149a: 68d9 ldr r1, [r3, #12]
  50831. 803149c: 42a1 cmp r1, r4
  50832. 803149e: d100 bne.n 80314a2 <tcp_input+0x5ae>
  50833. 80314a0: e057 b.n 8031552 <tcp_input+0x65e>
  50834. 80314a2: 460b mov r3, r1
  50835. 80314a4: 2b00 cmp r3, #0
  50836. 80314a6: d1f8 bne.n 803149a <tcp_input+0x5a6>
  50837. 80314a8: e05a b.n 8031560 <tcp_input+0x66c>
  50838. pcb->state = TIME_WAIT;
  50839. TCP_REG(&tcp_tw_pcbs, pcb);
  50840. } else {
  50841. tcp_ack_now(pcb);
  50842. 80314aa: 7fa3 ldrb r3, [r4, #30]
  50843. 80314ac: f043 0302 orr.w r3, r3, #2
  50844. 80314b0: 77a3 strb r3, [r4, #30]
  50845. pcb->state = CLOSING;
  50846. 80314b2: 2308 movs r3, #8
  50847. 80314b4: e009 b.n 80314ca <tcp_input+0x5d6>
  50848. }
  50849. } else if ((flags & TCP_ACK) && (ackno == pcb->snd_nxt)) {
  50850. 80314b6: 2b00 cmp r3, #0
  50851. 80314b8: f000 814f beq.w 803175a <tcp_input+0x866>
  50852. 80314bc: 4b85 ldr r3, [pc, #532] ; (80316d4 <tcp_input+0x7e0>)
  50853. 80314be: 681a ldr r2, [r3, #0]
  50854. 80314c0: 6d23 ldr r3, [r4, #80] ; 0x50
  50855. 80314c2: 429a cmp r2, r3
  50856. 80314c4: f040 8149 bne.w 803175a <tcp_input+0x866>
  50857. pcb->state = FIN_WAIT_2;
  50858. 80314c8: 2306 movs r3, #6
  50859. 80314ca: 7623 strb r3, [r4, #24]
  50860. 80314cc: e145 b.n 803175a <tcp_input+0x866>
  50861. }
  50862. break;
  50863. case FIN_WAIT_2:
  50864. tcp_receive(pcb);
  50865. 80314ce: 4620 mov r0, r4
  50866. 80314d0: f7ff fabc bl 8030a4c <tcp_receive>
  50867. if (recv_flags & TF_GOT_FIN) {
  50868. 80314d4: 4b80 ldr r3, [pc, #512] ; (80316d8 <tcp_input+0x7e4>)
  50869. 80314d6: 781b ldrb r3, [r3, #0]
  50870. 80314d8: f003 0320 and.w r3, r3, #32
  50871. 80314dc: b2db uxtb r3, r3
  50872. 80314de: 2b00 cmp r3, #0
  50873. 80314e0: f000 813b beq.w 803175a <tcp_input+0x866>
  50874. LWIP_DEBUGF(TCP_DEBUG, ("TCP connection closed: FIN_WAIT_2 %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest));
  50875. tcp_ack_now(pcb);
  50876. 80314e4: 7fa3 ldrb r3, [r4, #30]
  50877. 80314e6: f043 0302 orr.w r3, r3, #2
  50878. 80314ea: 77a3 strb r3, [r4, #30]
  50879. tcp_pcb_purge(pcb);
  50880. 80314ec: 4620 mov r0, r4
  50881. 80314ee: f7fe fe9f bl 8030230 <tcp_pcb_purge>
  50882. TCP_RMV_ACTIVE(pcb);
  50883. 80314f2: 4a7a ldr r2, [pc, #488] ; (80316dc <tcp_input+0x7e8>)
  50884. 80314f4: 6813 ldr r3, [r2, #0]
  50885. 80314f6: 42a3 cmp r3, r4
  50886. 80314f8: d100 bne.n 80314fc <tcp_input+0x608>
  50887. 80314fa: e022 b.n 8031542 <tcp_input+0x64e>
  50888. 80314fc: 4a74 ldr r2, [pc, #464] ; (80316d0 <tcp_input+0x7dc>)
  50889. 80314fe: 6013 str r3, [r2, #0]
  50890. 8031500: e004 b.n 803150c <tcp_input+0x618>
  50891. 8031502: 68d9 ldr r1, [r3, #12]
  50892. 8031504: 42a1 cmp r1, r4
  50893. 8031506: d100 bne.n 803150a <tcp_input+0x616>
  50894. 8031508: e023 b.n 8031552 <tcp_input+0x65e>
  50895. 803150a: 460b mov r3, r1
  50896. 803150c: 2b00 cmp r3, #0
  50897. 803150e: d1f8 bne.n 8031502 <tcp_input+0x60e>
  50898. 8031510: e026 b.n 8031560 <tcp_input+0x66c>
  50899. pcb->state = TIME_WAIT;
  50900. TCP_REG(&tcp_tw_pcbs, pcb);
  50901. }
  50902. break;
  50903. case CLOSING:
  50904. tcp_receive(pcb);
  50905. 8031512: 4620 mov r0, r4
  50906. 8031514: f7ff fa9a bl 8030a4c <tcp_receive>
  50907. if (flags & TCP_ACK && ackno == pcb->snd_nxt) {
  50908. 8031518: 4b71 ldr r3, [pc, #452] ; (80316e0 <tcp_input+0x7ec>)
  50909. 803151a: 781b ldrb r3, [r3, #0]
  50910. 803151c: f003 0310 and.w r3, r3, #16
  50911. 8031520: b2db uxtb r3, r3
  50912. 8031522: 2b00 cmp r3, #0
  50913. 8031524: f000 8119 beq.w 803175a <tcp_input+0x866>
  50914. 8031528: 4b6a ldr r3, [pc, #424] ; (80316d4 <tcp_input+0x7e0>)
  50915. 803152a: 681a ldr r2, [r3, #0]
  50916. 803152c: 6d23 ldr r3, [r4, #80] ; 0x50
  50917. 803152e: 429a cmp r2, r3
  50918. 8031530: f040 8113 bne.w 803175a <tcp_input+0x866>
  50919. LWIP_DEBUGF(TCP_DEBUG, ("TCP connection closed: CLOSING %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest));
  50920. tcp_pcb_purge(pcb);
  50921. 8031534: 4620 mov r0, r4
  50922. 8031536: f7fe fe7b bl 8030230 <tcp_pcb_purge>
  50923. TCP_RMV_ACTIVE(pcb);
  50924. 803153a: 4a68 ldr r2, [pc, #416] ; (80316dc <tcp_input+0x7e8>)
  50925. 803153c: 6813 ldr r3, [r2, #0]
  50926. 803153e: 42a3 cmp r3, r4
  50927. 8031540: d101 bne.n 8031546 <tcp_input+0x652>
  50928. 8031542: 68e3 ldr r3, [r4, #12]
  50929. 8031544: e00c b.n 8031560 <tcp_input+0x66c>
  50930. 8031546: 4a62 ldr r2, [pc, #392] ; (80316d0 <tcp_input+0x7dc>)
  50931. 8031548: 6013 str r3, [r2, #0]
  50932. 803154a: e007 b.n 803155c <tcp_input+0x668>
  50933. 803154c: 68d9 ldr r1, [r3, #12]
  50934. 803154e: 42a1 cmp r1, r4
  50935. 8031550: d103 bne.n 803155a <tcp_input+0x666>
  50936. 8031552: 6013 str r3, [r2, #0]
  50937. 8031554: 68e2 ldr r2, [r4, #12]
  50938. 8031556: 60da str r2, [r3, #12]
  50939. 8031558: e003 b.n 8031562 <tcp_input+0x66e>
  50940. 803155a: 460b mov r3, r1
  50941. 803155c: 2b00 cmp r3, #0
  50942. 803155e: d1f5 bne.n 803154c <tcp_input+0x658>
  50943. 8031560: 6013 str r3, [r2, #0]
  50944. 8031562: 4b60 ldr r3, [pc, #384] ; (80316e4 <tcp_input+0x7f0>)
  50945. 8031564: 2201 movs r2, #1
  50946. 8031566: 701a strb r2, [r3, #0]
  50947. pcb->state = TIME_WAIT;
  50948. 8031568: 230a movs r3, #10
  50949. 803156a: 7623 strb r3, [r4, #24]
  50950. TCP_REG(&tcp_tw_pcbs, pcb);
  50951. 803156c: 4b5e ldr r3, [pc, #376] ; (80316e8 <tcp_input+0x7f4>)
  50952. 803156e: 681a ldr r2, [r3, #0]
  50953. 8031570: 601c str r4, [r3, #0]
  50954. 8031572: 60e2 str r2, [r4, #12]
  50955. 8031574: f000 fe82 bl 803227c <tcp_timer_needed>
  50956. 8031578: e0ef b.n 803175a <tcp_input+0x866>
  50957. }
  50958. break;
  50959. case LAST_ACK:
  50960. tcp_receive(pcb);
  50961. 803157a: 4620 mov r0, r4
  50962. 803157c: f7ff fa66 bl 8030a4c <tcp_receive>
  50963. if (flags & TCP_ACK && ackno == pcb->snd_nxt) {
  50964. 8031580: 4b57 ldr r3, [pc, #348] ; (80316e0 <tcp_input+0x7ec>)
  50965. 8031582: 781b ldrb r3, [r3, #0]
  50966. 8031584: f003 0310 and.w r3, r3, #16
  50967. 8031588: b2db uxtb r3, r3
  50968. 803158a: 2b00 cmp r3, #0
  50969. 803158c: f000 80e5 beq.w 803175a <tcp_input+0x866>
  50970. 8031590: 4b50 ldr r3, [pc, #320] ; (80316d4 <tcp_input+0x7e0>)
  50971. 8031592: 681a ldr r2, [r3, #0]
  50972. 8031594: 6d23 ldr r3, [r4, #80] ; 0x50
  50973. 8031596: 429a cmp r2, r3
  50974. 8031598: f040 80df bne.w 803175a <tcp_input+0x866>
  50975. LWIP_DEBUGF(TCP_DEBUG, ("TCP connection closed: LAST_ACK %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest));
  50976. /* bugfix #21699: don't set pcb->state to CLOSED here or we risk leaking segments */
  50977. recv_flags |= TF_CLOSED;
  50978. 803159c: 4b4e ldr r3, [pc, #312] ; (80316d8 <tcp_input+0x7e4>)
  50979. 803159e: 781a ldrb r2, [r3, #0]
  50980. 80315a0: f042 0210 orr.w r2, r2, #16
  50981. 80315a4: 701a strb r2, [r3, #0]
  50982. 80315a6: e0d8 b.n 803175a <tcp_input+0x866>
  50983. if (recv_flags & TF_RESET) {
  50984. /* TF_RESET means that the connection was reset by the other
  50985. end. We then call the error callback to inform the
  50986. application that the connection is dead before we
  50987. deallocate the PCB. */
  50988. TCP_EVENT_ERR(pcb->errf, pcb->callback_arg, ERR_RST);
  50989. 80315a8: f8d4 3088 ldr.w r3, [r4, #136] ; 0x88
  50990. 80315ac: b19b cbz r3, 80315d6 <tcp_input+0x6e2>
  50991. 80315ae: 6920 ldr r0, [r4, #16]
  50992. 80315b0: f06f 010a mvn.w r1, #10
  50993. 80315b4: e00e b.n 80315d4 <tcp_input+0x6e0>
  50994. tcp_pcb_remove(&tcp_active_pcbs, pcb);
  50995. memp_free(MEMP_TCP_PCB, pcb);
  50996. } else if (recv_flags & TF_CLOSED) {
  50997. 80315b6: f003 0310 and.w r3, r3, #16
  50998. 80315ba: b2db uxtb r3, r3
  50999. 80315bc: b1a3 cbz r3, 80315e8 <tcp_input+0x6f4>
  51000. /* The connection has been closed and we will deallocate the
  51001. PCB. */
  51002. if (!(pcb->flags & TF_RXCLOSED)) {
  51003. 80315be: 7fa3 ldrb r3, [r4, #30]
  51004. 80315c0: f003 0310 and.w r3, r3, #16
  51005. 80315c4: b2db uxtb r3, r3
  51006. 80315c6: b933 cbnz r3, 80315d6 <tcp_input+0x6e2>
  51007. /* Connection closed although the application has only shut down the
  51008. tx side: call the PCB's err callback and indicate the closure to
  51009. ensure the application doesn't continue using the PCB. */
  51010. TCP_EVENT_ERR(pcb->errf, pcb->callback_arg, ERR_CLSD);
  51011. 80315c8: f8d4 3088 ldr.w r3, [r4, #136] ; 0x88
  51012. 80315cc: b11b cbz r3, 80315d6 <tcp_input+0x6e2>
  51013. 80315ce: 6920 ldr r0, [r4, #16]
  51014. 80315d0: f06f 010b mvn.w r1, #11
  51015. 80315d4: 4798 blx r3
  51016. }
  51017. tcp_pcb_remove(&tcp_active_pcbs, pcb);
  51018. 80315d6: 4621 mov r1, r4
  51019. 80315d8: 4840 ldr r0, [pc, #256] ; (80316dc <tcp_input+0x7e8>)
  51020. 80315da: f7fe ff91 bl 8030500 <tcp_pcb_remove>
  51021. memp_free(MEMP_TCP_PCB, pcb);
  51022. 80315de: 2002 movs r0, #2
  51023. 80315e0: 4621 mov r1, r4
  51024. 80315e2: f7fe fa47 bl 802fa74 <memp_free>
  51025. 80315e6: e050 b.n 803168a <tcp_input+0x796>
  51026. } else {
  51027. err = ERR_OK;
  51028. /* If the application has registered a "sent" function to be
  51029. called when new send buffer space is available, we call it
  51030. now. */
  51031. if (pcb->acked > 0) {
  51032. 80315e8: f8b4 2064 ldrh.w r2, [r4, #100] ; 0x64
  51033. 80315ec: b91a cbnz r2, 80315f6 <tcp_input+0x702>
  51034. if (err == ERR_ABRT) {
  51035. goto aborted;
  51036. }
  51037. }
  51038. if (recv_data != NULL) {
  51039. 80315ee: 4b3f ldr r3, [pc, #252] ; (80316ec <tcp_input+0x7f8>)
  51040. 80315f0: 681a ldr r2, [r3, #0]
  51041. 80315f2: b94a cbnz r2, 8031608 <tcp_input+0x714>
  51042. 80315f4: e026 b.n 8031644 <tcp_input+0x750>
  51043. err = ERR_OK;
  51044. /* If the application has registered a "sent" function to be
  51045. called when new send buffer space is available, we call it
  51046. now. */
  51047. if (pcb->acked > 0) {
  51048. TCP_EVENT_SENT(pcb, pcb->acked, err);
  51049. 80315f6: 6fa3 ldr r3, [r4, #120] ; 0x78
  51050. 80315f8: 2b00 cmp r3, #0
  51051. 80315fa: d0f8 beq.n 80315ee <tcp_input+0x6fa>
  51052. 80315fc: 6920 ldr r0, [r4, #16]
  51053. 80315fe: 4621 mov r1, r4
  51054. 8031600: 4798 blx r3
  51055. if (err == ERR_ABRT) {
  51056. 8031602: 300a adds r0, #10
  51057. 8031604: d1f3 bne.n 80315ee <tcp_input+0x6fa>
  51058. 8031606: e040 b.n 803168a <tcp_input+0x796>
  51059. }
  51060. }
  51061. if (recv_data != NULL) {
  51062. LWIP_ASSERT("pcb->refused_data == NULL", pcb->refused_data == NULL);
  51063. if (pcb->flags & TF_RXCLOSED) {
  51064. 8031608: 7fa3 ldrb r3, [r4, #30]
  51065. 803160a: f003 0310 and.w r3, r3, #16
  51066. 803160e: b2db uxtb r3, r3
  51067. 8031610: b133 cbz r3, 8031620 <tcp_input+0x72c>
  51068. /* received data although already closed -> abort (send RST) to
  51069. notify the remote host that not all data has been processed */
  51070. pbuf_free(recv_data);
  51071. 8031612: 4610 mov r0, r2
  51072. 8031614: f7fe fb38 bl 802fc88 <pbuf_free>
  51073. tcp_abort(pcb);
  51074. 8031618: 4620 mov r0, r4
  51075. 803161a: f7fe ffe5 bl 80305e8 <tcp_abort>
  51076. goto aborted;
  51077. 803161e: e034 b.n 803168a <tcp_input+0x796>
  51078. }
  51079. /* Notify application that data has been received. */
  51080. TCP_EVENT_RECV(pcb, recv_data, ERR_OK, err);
  51081. 8031620: 6fe5 ldr r5, [r4, #124] ; 0x7c
  51082. 8031622: b11d cbz r5, 803162c <tcp_input+0x738>
  51083. 8031624: 6920 ldr r0, [r4, #16]
  51084. 8031626: 4621 mov r1, r4
  51085. 8031628: 47a8 blx r5
  51086. 803162a: e004 b.n 8031636 <tcp_input+0x742>
  51087. 803162c: 4628 mov r0, r5
  51088. 803162e: 4621 mov r1, r4
  51089. 8031630: 462b mov r3, r5
  51090. 8031632: f7ff f895 bl 8030760 <tcp_recv_null>
  51091. if (err == ERR_ABRT) {
  51092. 8031636: b243 sxtb r3, r0
  51093. 8031638: 330a adds r3, #10
  51094. 803163a: d026 beq.n 803168a <tcp_input+0x796>
  51095. goto aborted;
  51096. }
  51097. /* If the upper layer can't receive this data, store it */
  51098. if (err != ERR_OK) {
  51099. 803163c: b110 cbz r0, 8031644 <tcp_input+0x750>
  51100. pcb->refused_data = recv_data;
  51101. 803163e: 4b2b ldr r3, [pc, #172] ; (80316ec <tcp_input+0x7f8>)
  51102. 8031640: 681b ldr r3, [r3, #0]
  51103. 8031642: 6763 str r3, [r4, #116] ; 0x74
  51104. }
  51105. }
  51106. /* If a FIN segment was received, we call the callback
  51107. function with a NULL buffer to indicate EOF. */
  51108. if (recv_flags & TF_GOT_FIN) {
  51109. 8031644: 4b24 ldr r3, [pc, #144] ; (80316d8 <tcp_input+0x7e4>)
  51110. 8031646: 781b ldrb r3, [r3, #0]
  51111. 8031648: f003 0320 and.w r3, r3, #32
  51112. 803164c: b2db uxtb r3, r3
  51113. 803164e: b1b3 cbz r3, 803167e <tcp_input+0x78a>
  51114. if (pcb->refused_data != NULL) {
  51115. 8031650: 6f63 ldr r3, [r4, #116] ; 0x74
  51116. 8031652: b123 cbz r3, 803165e <tcp_input+0x76a>
  51117. /* Delay this if we have refused data. */
  51118. pcb->refused_data->flags |= PBUF_FLAG_TCP_FIN;
  51119. 8031654: 7b5a ldrb r2, [r3, #13]
  51120. 8031656: f042 0220 orr.w r2, r2, #32
  51121. 803165a: 735a strb r2, [r3, #13]
  51122. 803165c: e00f b.n 803167e <tcp_input+0x78a>
  51123. } else {
  51124. /* correct rcv_wnd as the application won't call tcp_recved()
  51125. for the FIN's seqno */
  51126. if (pcb->rcv_wnd != TCP_WND) {
  51127. 803165e: 8da3 ldrh r3, [r4, #44] ; 0x2c
  51128. 8031660: f241 62d0 movw r2, #5840 ; 0x16d0
  51129. 8031664: 4293 cmp r3, r2
  51130. 8031666: d001 beq.n 803166c <tcp_input+0x778>
  51131. pcb->rcv_wnd++;
  51132. 8031668: 3301 adds r3, #1
  51133. 803166a: 85a3 strh r3, [r4, #44] ; 0x2c
  51134. }
  51135. TCP_EVENT_CLOSED(pcb, err);
  51136. 803166c: 6fe5 ldr r5, [r4, #124] ; 0x7c
  51137. 803166e: b135 cbz r5, 803167e <tcp_input+0x78a>
  51138. 8031670: 2200 movs r2, #0
  51139. 8031672: 6920 ldr r0, [r4, #16]
  51140. 8031674: 4621 mov r1, r4
  51141. 8031676: 4613 mov r3, r2
  51142. 8031678: 47a8 blx r5
  51143. if (err == ERR_ABRT) {
  51144. 803167a: 300a adds r0, #10
  51145. 803167c: d005 beq.n 803168a <tcp_input+0x796>
  51146. goto aborted;
  51147. }
  51148. }
  51149. }
  51150. tcp_input_pcb = NULL;
  51151. 803167e: 4b1c ldr r3, [pc, #112] ; (80316f0 <tcp_input+0x7fc>)
  51152. 8031680: 2200 movs r2, #0
  51153. /* Try to send something out. */
  51154. tcp_output(pcb);
  51155. 8031682: 4620 mov r0, r4
  51156. goto aborted;
  51157. }
  51158. }
  51159. }
  51160. tcp_input_pcb = NULL;
  51161. 8031684: 601a str r2, [r3, #0]
  51162. /* Try to send something out. */
  51163. tcp_output(pcb);
  51164. 8031686: f000 fb3b bl 8031d00 <tcp_output>
  51165. }
  51166. }
  51167. /* Jump target if pcb has been aborted in a callback (by calling tcp_abort()).
  51168. Below this line, 'pcb' may not be dereferenced! */
  51169. aborted:
  51170. tcp_input_pcb = NULL;
  51171. 803168a: 4b19 ldr r3, [pc, #100] ; (80316f0 <tcp_input+0x7fc>)
  51172. recv_data = NULL;
  51173. /* give up our reference to inseg.p */
  51174. if (inseg.p != NULL)
  51175. 803168c: 4d19 ldr r5, [pc, #100] ; (80316f4 <tcp_input+0x800>)
  51176. }
  51177. }
  51178. /* Jump target if pcb has been aborted in a callback (by calling tcp_abort()).
  51179. Below this line, 'pcb' may not be dereferenced! */
  51180. aborted:
  51181. tcp_input_pcb = NULL;
  51182. 803168e: 2400 movs r4, #0
  51183. 8031690: 601c str r4, [r3, #0]
  51184. recv_data = NULL;
  51185. /* give up our reference to inseg.p */
  51186. if (inseg.p != NULL)
  51187. 8031692: 6868 ldr r0, [r5, #4]
  51188. }
  51189. /* Jump target if pcb has been aborted in a callback (by calling tcp_abort()).
  51190. Below this line, 'pcb' may not be dereferenced! */
  51191. aborted:
  51192. tcp_input_pcb = NULL;
  51193. recv_data = NULL;
  51194. 8031694: 4b15 ldr r3, [pc, #84] ; (80316ec <tcp_input+0x7f8>)
  51195. 8031696: 601c str r4, [r3, #0]
  51196. /* give up our reference to inseg.p */
  51197. if (inseg.p != NULL)
  51198. 8031698: 2800 cmp r0, #0
  51199. 803169a: d067 beq.n 803176c <tcp_input+0x878>
  51200. {
  51201. pbuf_free(inseg.p);
  51202. 803169c: f7fe faf4 bl 802fc88 <pbuf_free>
  51203. inseg.p = NULL;
  51204. 80316a0: 606c str r4, [r5, #4]
  51205. 80316a2: e063 b.n 803176c <tcp_input+0x878>
  51206. if (!(TCPH_FLAGS(tcphdr) & TCP_RST)) {
  51207. TCP_STATS_INC(tcp.proterr);
  51208. TCP_STATS_INC(tcp.drop);
  51209. tcp_rst(ackno, seqno + tcplen,
  51210. ip_current_dest_addr(), ip_current_src_addr(),
  51211. tcphdr->dest, tcphdr->src);
  51212. 80316a4: 4b14 ldr r3, [pc, #80] ; (80316f8 <tcp_input+0x804>)
  51213. sender. */
  51214. LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_input: no PCB match found, resetting.\n"));
  51215. if (!(TCPH_FLAGS(tcphdr) & TCP_RST)) {
  51216. TCP_STATS_INC(tcp.proterr);
  51217. TCP_STATS_INC(tcp.drop);
  51218. tcp_rst(ackno, seqno + tcplen,
  51219. 80316a6: 4a15 ldr r2, [pc, #84] ; (80316fc <tcp_input+0x808>)
  51220. ip_current_dest_addr(), ip_current_src_addr(),
  51221. tcphdr->dest, tcphdr->src);
  51222. 80316a8: 681b ldr r3, [r3, #0]
  51223. sender. */
  51224. LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_input: no PCB match found, resetting.\n"));
  51225. if (!(TCPH_FLAGS(tcphdr) & TCP_RST)) {
  51226. TCP_STATS_INC(tcp.proterr);
  51227. TCP_STATS_INC(tcp.drop);
  51228. tcp_rst(ackno, seqno + tcplen,
  51229. 80316aa: 8811 ldrh r1, [r2, #0]
  51230. 80316ac: 8858 ldrh r0, [r3, #2]
  51231. 80316ae: 4a14 ldr r2, [pc, #80] ; (8031700 <tcp_input+0x80c>)
  51232. 80316b0: 6812 ldr r2, [r2, #0]
  51233. 80316b2: 9000 str r0, [sp, #0]
  51234. 80316b4: 881b ldrh r3, [r3, #0]
  51235. 80316b6: 9301 str r3, [sp, #4]
  51236. 80316b8: 4b06 ldr r3, [pc, #24] ; (80316d4 <tcp_input+0x7e0>)
  51237. 80316ba: 1889 adds r1, r1, r2
  51238. 80316bc: 6818 ldr r0, [r3, #0]
  51239. 80316be: e517 b.n 80310f0 <tcp_input+0x1fc>
  51240. LWIP_ASSERT("tcp_input: tcp_pcbs_sane()", tcp_pcbs_sane());
  51241. PERF_STOP("tcp_input");
  51242. return;
  51243. dropped:
  51244. TCP_STATS_INC(tcp.drop);
  51245. snmp_inc_tcpinerrs();
  51246. 80316c0: f003 f8ee bl 80348a0 <snmp_inc_tcpinerrs>
  51247. pbuf_free(p);
  51248. 80316c4: 4630 mov r0, r6
  51249. }
  51250. 80316c6: b003 add sp, #12
  51251. 80316c8: e8bd 4ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  51252. PERF_STOP("tcp_input");
  51253. return;
  51254. dropped:
  51255. TCP_STATS_INC(tcp.drop);
  51256. snmp_inc_tcpinerrs();
  51257. pbuf_free(p);
  51258. 80316cc: f7fe badc b.w 802fc88 <pbuf_free>
  51259. 80316d0: 2000ff2c .word 0x2000ff2c
  51260. 80316d4: 2000c440 .word 0x2000c440
  51261. 80316d8: 2000c445 .word 0x2000c445
  51262. 80316dc: 2000ff20 .word 0x2000ff20
  51263. 80316e0: 2000c444 .word 0x2000c444
  51264. 80316e4: 2000ff1c .word 0x2000ff1c
  51265. 80316e8: 2000ff34 .word 0x2000ff34
  51266. 80316ec: 2000c448 .word 0x2000c448
  51267. 80316f0: 2000ff38 .word 0x2000ff38
  51268. 80316f4: 2000c450 .word 0x2000c450
  51269. 80316f8: 2000c434 .word 0x2000c434
  51270. 80316fc: 2000c43c .word 0x2000c43c
  51271. 8031700: 2000c438 .word 0x2000c438
  51272. }
  51273. if (pcb == NULL) {
  51274. /* If it did not go to an active connection, we check the connections
  51275. in the TIME-WAIT state. */
  51276. for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {
  51277. 8031704: 4b1b ldr r3, [pc, #108] ; (8031774 <tcp_input+0x880>)
  51278. 8031706: 681b ldr r3, [r3, #0]
  51279. 8031708: e4bf b.n 803108a <tcp_input+0x196>
  51280. tcp_debug_print_state(pcb->state);
  51281. #endif /* TCP_DEBUG */
  51282. #endif /* TCP_INPUT_DEBUG */
  51283. /* Set up a tcp_seg structure. */
  51284. inseg.next = NULL;
  51285. 803170a: 4b1b ldr r3, [pc, #108] ; (8031778 <tcp_input+0x884>)
  51286. 803170c: 2100 movs r1, #0
  51287. 803170e: 6019 str r1, [r3, #0]
  51288. inseg.len = p->tot_len;
  51289. 8031710: f8a3 8008 strh.w r8, [r3, #8]
  51290. inseg.p = p;
  51291. 8031714: 605e str r6, [r3, #4]
  51292. inseg.tcphdr = tcphdr;
  51293. 8031716: 60df str r7, [r3, #12]
  51294. recv_data = NULL;
  51295. 8031718: 4b18 ldr r3, [pc, #96] ; (803177c <tcp_input+0x888>)
  51296. recv_flags = 0;
  51297. if (flags & TCP_PSH) {
  51298. 803171a: f002 0208 and.w r2, r2, #8
  51299. inseg.next = NULL;
  51300. inseg.len = p->tot_len;
  51301. inseg.p = p;
  51302. inseg.tcphdr = tcphdr;
  51303. recv_data = NULL;
  51304. 803171e: 6019 str r1, [r3, #0]
  51305. recv_flags = 0;
  51306. 8031720: 4b17 ldr r3, [pc, #92] ; (8031780 <tcp_input+0x88c>)
  51307. if (flags & TCP_PSH) {
  51308. 8031722: b2d2 uxtb r2, r2
  51309. inseg.len = p->tot_len;
  51310. inseg.p = p;
  51311. inseg.tcphdr = tcphdr;
  51312. recv_data = NULL;
  51313. recv_flags = 0;
  51314. 8031724: 7019 strb r1, [r3, #0]
  51315. if (flags & TCP_PSH) {
  51316. 8031726: 2a00 cmp r2, #0
  51317. 8031728: f47f ad52 bne.w 80311d0 <tcp_input+0x2dc>
  51318. 803172c: e554 b.n 80311d8 <tcp_input+0x2e4>
  51319. #endif /* SO_REUSE */
  51320. if (lpcb != NULL) {
  51321. /* Move this PCB to the front of the list so that subsequent
  51322. lookups will be faster (we exploit locality in TCP segment
  51323. arrivals). */
  51324. if (prev != NULL) {
  51325. 803172e: 2b00 cmp r3, #0
  51326. 8031730: f47f acc4 bne.w 80310bc <tcp_input+0x1c8>
  51327. 8031734: e4c7 b.n 80310c6 <tcp_input+0x1d2>
  51328. } else {
  51329. /* If no matching PCB was found, send a TCP RST (reset) to the
  51330. sender. */
  51331. LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_input: no PCB match found, resetting.\n"));
  51332. if (!(TCPH_FLAGS(tcphdr) & TCP_RST)) {
  51333. 8031736: 89b8 ldrh r0, [r7, #12]
  51334. 8031738: f7fd f96d bl 802ea16 <lwip_ntohs>
  51335. 803173c: f000 0004 and.w r0, r0, #4
  51336. 8031740: b280 uxth r0, r0
  51337. 8031742: 2800 cmp r0, #0
  51338. 8031744: d1be bne.n 80316c4 <tcp_input+0x7d0>
  51339. 8031746: e7ad b.n 80316a4 <tcp_input+0x7b0>
  51340. }
  51341. if (acceptable) {
  51342. LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_process: Connection RESET\n"));
  51343. LWIP_ASSERT("tcp_input: pcb->state != CLOSED", pcb->state != CLOSED);
  51344. recv_flags |= TF_RESET;
  51345. 8031748: 4b0d ldr r3, [pc, #52] ; (8031780 <tcp_input+0x88c>)
  51346. 803174a: 781a ldrb r2, [r3, #0]
  51347. 803174c: f042 0208 orr.w r2, r2, #8
  51348. 8031750: 701a strb r2, [r3, #0]
  51349. pcb->flags &= ~TF_ACK_DELAY;
  51350. 8031752: 7fa3 ldrb r3, [r4, #30]
  51351. 8031754: f023 0301 bic.w r3, r3, #1
  51352. 8031758: 77a3 strb r3, [r4, #30]
  51353. tcp_input_pcb = pcb;
  51354. err = tcp_process(pcb);
  51355. /* A return value of ERR_ABRT means that tcp_abort() was called
  51356. and that the pcb has been freed. If so, we don't do anything. */
  51357. if (err != ERR_ABRT) {
  51358. if (recv_flags & TF_RESET) {
  51359. 803175a: 4b09 ldr r3, [pc, #36] ; (8031780 <tcp_input+0x88c>)
  51360. 803175c: 781b ldrb r3, [r3, #0]
  51361. 803175e: f003 0208 and.w r2, r3, #8
  51362. 8031762: b2d2 uxtb r2, r2
  51363. 8031764: 2a00 cmp r2, #0
  51364. 8031766: f47f af1f bne.w 80315a8 <tcp_input+0x6b4>
  51365. 803176a: e724 b.n 80315b6 <tcp_input+0x6c2>
  51366. return;
  51367. dropped:
  51368. TCP_STATS_INC(tcp.drop);
  51369. snmp_inc_tcpinerrs();
  51370. pbuf_free(p);
  51371. }
  51372. 803176c: b003 add sp, #12
  51373. 803176e: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  51374. 8031772: bf00 nop
  51375. 8031774: 2000ff34 .word 0x2000ff34
  51376. 8031778: 2000c450 .word 0x2000c450
  51377. 803177c: 2000c448 .word 0x2000c448
  51378. 8031780: 2000c445 .word 0x2000c445
  51379. 08031784 <tcp_pbuf_prealloc>:
  51380. #if TCP_OVERSIZE
  51381. static struct pbuf *
  51382. tcp_pbuf_prealloc(pbuf_layer layer, u16_t length, u16_t max_length,
  51383. u16_t *oversize, struct tcp_pcb *pcb, u8_t apiflags,
  51384. u8_t first_seg)
  51385. {
  51386. 8031784: b570 push {r4, r5, r6, lr}
  51387. LWIP_UNUSED_ARG(apiflags);
  51388. LWIP_UNUSED_ARG(first_seg);
  51389. /* always create MSS-sized pbufs */
  51390. alloc = max_length;
  51391. #else /* LWIP_NETIF_TX_SINGLE_PBUF */
  51392. if (length < max_length) {
  51393. 8031786: 4291 cmp r1, r2
  51394. #if TCP_OVERSIZE
  51395. static struct pbuf *
  51396. tcp_pbuf_prealloc(pbuf_layer layer, u16_t length, u16_t max_length,
  51397. u16_t *oversize, struct tcp_pcb *pcb, u8_t apiflags,
  51398. u8_t first_seg)
  51399. {
  51400. 8031788: 460c mov r4, r1
  51401. 803178a: 461e mov r6, r3
  51402. 803178c: 9d04 ldr r5, [sp, #16]
  51403. LWIP_UNUSED_ARG(apiflags);
  51404. LWIP_UNUSED_ARG(first_seg);
  51405. /* always create MSS-sized pbufs */
  51406. alloc = max_length;
  51407. #else /* LWIP_NETIF_TX_SINGLE_PBUF */
  51408. if (length < max_length) {
  51409. 803178e: d21a bcs.n 80317c6 <tcp_pbuf_prealloc+0x42>
  51410. *
  51411. * Did the user set TCP_WRITE_FLAG_MORE?
  51412. *
  51413. * Will the Nagle algorithm defer transmission of this segment?
  51414. */
  51415. if ((apiflags & TCP_WRITE_FLAG_MORE) ||
  51416. 8031790: f89d 3014 ldrb.w r3, [sp, #20]
  51417. 8031794: f003 0302 and.w r3, r3, #2
  51418. 8031798: b2db uxtb r3, r3
  51419. 803179a: b95b cbnz r3, 80317b4 <tcp_pbuf_prealloc+0x30>
  51420. (!(pcb->flags & TF_NODELAY) &&
  51421. 803179c: 7fab ldrb r3, [r5, #30]
  51422. *
  51423. * Did the user set TCP_WRITE_FLAG_MORE?
  51424. *
  51425. * Will the Nagle algorithm defer transmission of this segment?
  51426. */
  51427. if ((apiflags & TCP_WRITE_FLAG_MORE) ||
  51428. 803179e: f003 0340 and.w r3, r3, #64 ; 0x40
  51429. 80317a2: b2db uxtb r3, r3
  51430. 80317a4: b97b cbnz r3, 80317c6 <tcp_pbuf_prealloc+0x42>
  51431. (!(pcb->flags & TF_NODELAY) &&
  51432. 80317a6: f89d 3018 ldrb.w r3, [sp, #24]
  51433. 80317aa: b11b cbz r3, 80317b4 <tcp_pbuf_prealloc+0x30>
  51434. (!first_seg ||
  51435. 80317ac: 6ee9 ldr r1, [r5, #108] ; 0x6c
  51436. 80317ae: b909 cbnz r1, 80317b4 <tcp_pbuf_prealloc+0x30>
  51437. pcb->unsent != NULL ||
  51438. 80317b0: 6f2b ldr r3, [r5, #112] ; 0x70
  51439. 80317b2: b143 cbz r3, 80317c6 <tcp_pbuf_prealloc+0x42>
  51440. pcb->unacked != NULL))) {
  51441. alloc = LWIP_MIN(max_length, LWIP_MEM_ALIGN_SIZE(length + TCP_OVERSIZE));
  51442. 80317b4: f204 51b7 addw r1, r4, #1463 ; 0x5b7
  51443. 80317b8: f021 0103 bic.w r1, r1, #3
  51444. 80317bc: 4291 cmp r1, r2
  51445. 80317be: bfa8 it ge
  51446. 80317c0: 4611 movge r1, r2
  51447. 80317c2: b289 uxth r1, r1
  51448. 80317c4: e000 b.n 80317c8 <tcp_pbuf_prealloc+0x44>
  51449. * Will the Nagle algorithm defer transmission of this segment?
  51450. */
  51451. if ((apiflags & TCP_WRITE_FLAG_MORE) ||
  51452. (!(pcb->flags & TF_NODELAY) &&
  51453. (!first_seg ||
  51454. pcb->unsent != NULL ||
  51455. 80317c6: 4621 mov r1, r4
  51456. pcb->unacked != NULL))) {
  51457. alloc = LWIP_MIN(max_length, LWIP_MEM_ALIGN_SIZE(length + TCP_OVERSIZE));
  51458. }
  51459. }
  51460. #endif /* LWIP_NETIF_TX_SINGLE_PBUF */
  51461. p = pbuf_alloc(layer, alloc, PBUF_RAM);
  51462. 80317c8: 2200 movs r2, #0
  51463. 80317ca: f7fe faaa bl 802fd22 <pbuf_alloc>
  51464. if (p == NULL) {
  51465. 80317ce: b120 cbz r0, 80317da <tcp_pbuf_prealloc+0x56>
  51466. return NULL;
  51467. }
  51468. LWIP_ASSERT("need unchained pbuf", p->next == NULL);
  51469. *oversize = p->len - length;
  51470. 80317d0: 8943 ldrh r3, [r0, #10]
  51471. 80317d2: 1b1b subs r3, r3, r4
  51472. 80317d4: 8033 strh r3, [r6, #0]
  51473. /* trim p->len to the currently used size */
  51474. p->len = p->tot_len = length;
  51475. 80317d6: 8104 strh r4, [r0, #8]
  51476. 80317d8: 8144 strh r4, [r0, #10]
  51477. return p;
  51478. }
  51479. 80317da: bd70 pop {r4, r5, r6, pc}
  51480. 080317dc <tcp_create_segment>:
  51481. * The TCP header is filled in except ackno and wnd.
  51482. * p is freed on failure.
  51483. */
  51484. static struct tcp_seg *
  51485. tcp_create_segment(struct tcp_pcb *pcb, struct pbuf *p, u8_t flags, u32_t seqno, u8_t optflags)
  51486. {
  51487. 80317dc: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
  51488. 80317e0: f89d 6020 ldrb.w r6, [sp, #32]
  51489. struct tcp_seg *seg;
  51490. u8_t optlen = LWIP_TCP_OPT_LENGTH(optflags);
  51491. 80317e4: f006 0702 and.w r7, r6, #2
  51492. 80317e8: f016 0f01 tst.w r6, #1
  51493. 80317ec: b2ff uxtb r7, r7
  51494. * The TCP header is filled in except ackno and wnd.
  51495. * p is freed on failure.
  51496. */
  51497. static struct tcp_seg *
  51498. tcp_create_segment(struct tcp_pcb *pcb, struct pbuf *p, u8_t flags, u32_t seqno, u8_t optflags)
  51499. {
  51500. 80317ee: 4680 mov r8, r0
  51501. 80317f0: 469a mov sl, r3
  51502. struct tcp_seg *seg;
  51503. u8_t optlen = LWIP_TCP_OPT_LENGTH(optflags);
  51504. 80317f2: bf0c ite eq
  51505. 80317f4: 2300 moveq r3, #0
  51506. 80317f6: 2304 movne r3, #4
  51507. 80317f8: 2f00 cmp r7, #0
  51508. 80317fa: bf14 ite ne
  51509. 80317fc: 270c movne r7, #12
  51510. 80317fe: 2700 moveq r7, #0
  51511. if ((seg = (struct tcp_seg *)memp_malloc(MEMP_TCP_SEG)) == NULL) {
  51512. 8031800: 2004 movs r0, #4
  51513. * The TCP header is filled in except ackno and wnd.
  51514. * p is freed on failure.
  51515. */
  51516. static struct tcp_seg *
  51517. tcp_create_segment(struct tcp_pcb *pcb, struct pbuf *p, u8_t flags, u32_t seqno, u8_t optflags)
  51518. {
  51519. 8031802: 460d mov r5, r1
  51520. 8031804: 4691 mov r9, r2
  51521. struct tcp_seg *seg;
  51522. u8_t optlen = LWIP_TCP_OPT_LENGTH(optflags);
  51523. 8031806: 18ff adds r7, r7, r3
  51524. if ((seg = (struct tcp_seg *)memp_malloc(MEMP_TCP_SEG)) == NULL) {
  51525. 8031808: f7fe f91e bl 802fa48 <memp_malloc>
  51526. 803180c: 4604 mov r4, r0
  51527. 803180e: b918 cbnz r0, 8031818 <tcp_create_segment+0x3c>
  51528. LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 2, ("tcp_create_segment: no memory.\n"));
  51529. pbuf_free(p);
  51530. 8031810: 4628 mov r0, r5
  51531. 8031812: f7fe fa39 bl 802fc88 <pbuf_free>
  51532. return NULL;
  51533. 8031816: e030 b.n 803187a <tcp_create_segment+0x9e>
  51534. }
  51535. seg->flags = optflags;
  51536. 8031818: 7286 strb r6, [r0, #10]
  51537. seg->next = NULL;
  51538. seg->p = p;
  51539. seg->len = p->tot_len - optlen;
  51540. 803181a: 892b ldrh r3, [r5, #8]
  51541. pbuf_free(p);
  51542. return NULL;
  51543. }
  51544. seg->flags = optflags;
  51545. seg->next = NULL;
  51546. seg->p = p;
  51547. 803181c: 6045 str r5, [r0, #4]
  51548. seg->len = p->tot_len - optlen;
  51549. 803181e: 1bdb subs r3, r3, r7
  51550. LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 2, ("tcp_create_segment: no memory.\n"));
  51551. pbuf_free(p);
  51552. return NULL;
  51553. }
  51554. seg->flags = optflags;
  51555. seg->next = NULL;
  51556. 8031820: 2600 movs r6, #0
  51557. 8031822: 6006 str r6, [r0, #0]
  51558. seg->p = p;
  51559. seg->len = p->tot_len - optlen;
  51560. 8031824: 8103 strh r3, [r0, #8]
  51561. LWIP_ASSERT("invalid optflags passed: TF_SEG_DATA_CHECKSUMMED",
  51562. (optflags & TF_SEG_DATA_CHECKSUMMED) == 0);
  51563. #endif /* TCP_CHECKSUM_ON_COPY */
  51564. /* build TCP header */
  51565. if (pbuf_header(p, TCP_HLEN)) {
  51566. 8031826: 2114 movs r1, #20
  51567. 8031828: 4628 mov r0, r5
  51568. 803182a: f7fe fa02 bl 802fc32 <pbuf_header>
  51569. 803182e: 4605 mov r5, r0
  51570. 8031830: b120 cbz r0, 803183c <tcp_create_segment+0x60>
  51571. LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 2, ("tcp_create_segment: no room for TCP header in pbuf.\n"));
  51572. TCP_STATS_INC(tcp.err);
  51573. tcp_seg_free(seg);
  51574. 8031832: 4620 mov r0, r4
  51575. 8031834: f7fe fcd5 bl 80301e2 <tcp_seg_free>
  51576. return NULL;
  51577. 8031838: 4634 mov r4, r6
  51578. 803183a: e01e b.n 803187a <tcp_create_segment+0x9e>
  51579. }
  51580. seg->tcphdr = (struct tcp_hdr *)seg->p->payload;
  51581. 803183c: 6863 ldr r3, [r4, #4]
  51582. seg->tcphdr->src = htons(pcb->local_port);
  51583. 803183e: f8b8 001a ldrh.w r0, [r8, #26]
  51584. LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 2, ("tcp_create_segment: no room for TCP header in pbuf.\n"));
  51585. TCP_STATS_INC(tcp.err);
  51586. tcp_seg_free(seg);
  51587. return NULL;
  51588. }
  51589. seg->tcphdr = (struct tcp_hdr *)seg->p->payload;
  51590. 8031842: 685e ldr r6, [r3, #4]
  51591. 8031844: 60e6 str r6, [r4, #12]
  51592. seg->tcphdr->src = htons(pcb->local_port);
  51593. 8031846: f7fd f8e1 bl 802ea0c <lwip_htons>
  51594. 803184a: 8030 strh r0, [r6, #0]
  51595. seg->tcphdr->dest = htons(pcb->remote_port);
  51596. 803184c: f8b8 001c ldrh.w r0, [r8, #28]
  51597. 8031850: 68e6 ldr r6, [r4, #12]
  51598. 8031852: f7fd f8db bl 802ea0c <lwip_htons>
  51599. 8031856: 8070 strh r0, [r6, #2]
  51600. seg->tcphdr->seqno = htonl(seqno);
  51601. 8031858: 4650 mov r0, sl
  51602. 803185a: 68e6 ldr r6, [r4, #12]
  51603. 803185c: f7fd f8e0 bl 802ea20 <lwip_htonl>
  51604. /* ackno is set in tcp_output */
  51605. TCPH_HDRLEN_FLAGS_SET(seg->tcphdr, (5 + optlen / 4), flags);
  51606. 8031860: 02bf lsls r7, r7, #10
  51607. return NULL;
  51608. }
  51609. seg->tcphdr = (struct tcp_hdr *)seg->p->payload;
  51610. seg->tcphdr->src = htons(pcb->local_port);
  51611. seg->tcphdr->dest = htons(pcb->remote_port);
  51612. seg->tcphdr->seqno = htonl(seqno);
  51613. 8031862: 6070 str r0, [r6, #4]
  51614. /* ackno is set in tcp_output */
  51615. TCPH_HDRLEN_FLAGS_SET(seg->tcphdr, (5 + optlen / 4), flags);
  51616. 8031864: f507 40a0 add.w r0, r7, #20480 ; 0x5000
  51617. 8031868: ea40 0009 orr.w r0, r0, r9
  51618. 803186c: 68e6 ldr r6, [r4, #12]
  51619. 803186e: f7fd f8cd bl 802ea0c <lwip_htons>
  51620. 8031872: 81b0 strh r0, [r6, #12]
  51621. /* wnd and chksum are set in tcp_output */
  51622. seg->tcphdr->urgp = 0;
  51623. 8031874: 68e3 ldr r3, [r4, #12]
  51624. 8031876: 749d strb r5, [r3, #18]
  51625. 8031878: 74dd strb r5, [r3, #19]
  51626. return seg;
  51627. }
  51628. 803187a: 4620 mov r0, r4
  51629. 803187c: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc}
  51630. 08031880 <tcp_output_alloc_header.constprop.0>:
  51631. static struct pbuf *
  51632. tcp_output_alloc_header(struct tcp_pcb *pcb, u16_t optlen, u16_t datalen,
  51633. u32_t seqno_be /* already in network byte order */)
  51634. {
  51635. struct tcp_hdr *tcphdr;
  51636. struct pbuf *p = pbuf_alloc(PBUF_IP, TCP_HLEN + optlen + datalen, PBUF_RAM);
  51637. 8031880: 3114 adds r1, #20
  51638. * @param datalen length of tcp data to reserve in pbuf
  51639. * @param seqno_be seqno in network byte order (big-endian)
  51640. * @return pbuf with p->payload being the tcp_hdr
  51641. */
  51642. static struct pbuf *
  51643. tcp_output_alloc_header(struct tcp_pcb *pcb, u16_t optlen, u16_t datalen,
  51644. 8031882: b5f8 push {r3, r4, r5, r6, r7, lr}
  51645. u32_t seqno_be /* already in network byte order */)
  51646. {
  51647. struct tcp_hdr *tcphdr;
  51648. struct pbuf *p = pbuf_alloc(PBUF_IP, TCP_HLEN + optlen + datalen, PBUF_RAM);
  51649. 8031884: b289 uxth r1, r1
  51650. * @param datalen length of tcp data to reserve in pbuf
  51651. * @param seqno_be seqno in network byte order (big-endian)
  51652. * @return pbuf with p->payload being the tcp_hdr
  51653. */
  51654. static struct pbuf *
  51655. tcp_output_alloc_header(struct tcp_pcb *pcb, u16_t optlen, u16_t datalen,
  51656. 8031886: 4605 mov r5, r0
  51657. 8031888: 4617 mov r7, r2
  51658. u32_t seqno_be /* already in network byte order */)
  51659. {
  51660. struct tcp_hdr *tcphdr;
  51661. struct pbuf *p = pbuf_alloc(PBUF_IP, TCP_HLEN + optlen + datalen, PBUF_RAM);
  51662. 803188a: 2001 movs r0, #1
  51663. 803188c: 2200 movs r2, #0
  51664. 803188e: f7fe fa48 bl 802fd22 <pbuf_alloc>
  51665. if (p != NULL) {
  51666. 8031892: 4606 mov r6, r0
  51667. 8031894: b1f8 cbz r0, 80318d6 <tcp_output_alloc_header.constprop.0+0x56>
  51668. LWIP_ASSERT("check that first pbuf can hold struct tcp_hdr",
  51669. (p->len >= TCP_HLEN + optlen));
  51670. tcphdr = (struct tcp_hdr *)p->payload;
  51671. 8031896: 6844 ldr r4, [r0, #4]
  51672. tcphdr->src = htons(pcb->local_port);
  51673. 8031898: 8b68 ldrh r0, [r5, #26]
  51674. 803189a: f7fd f8b7 bl 802ea0c <lwip_htons>
  51675. 803189e: 8020 strh r0, [r4, #0]
  51676. tcphdr->dest = htons(pcb->remote_port);
  51677. 80318a0: 8ba8 ldrh r0, [r5, #28]
  51678. 80318a2: f7fd f8b3 bl 802ea0c <lwip_htons>
  51679. tcphdr->seqno = seqno_be;
  51680. 80318a6: 6067 str r7, [r4, #4]
  51681. if (p != NULL) {
  51682. LWIP_ASSERT("check that first pbuf can hold struct tcp_hdr",
  51683. (p->len >= TCP_HLEN + optlen));
  51684. tcphdr = (struct tcp_hdr *)p->payload;
  51685. tcphdr->src = htons(pcb->local_port);
  51686. tcphdr->dest = htons(pcb->remote_port);
  51687. 80318a8: 8060 strh r0, [r4, #2]
  51688. tcphdr->seqno = seqno_be;
  51689. tcphdr->ackno = htonl(pcb->rcv_nxt);
  51690. 80318aa: 6aa8 ldr r0, [r5, #40] ; 0x28
  51691. 80318ac: f7fd f8b8 bl 802ea20 <lwip_htonl>
  51692. 80318b0: 60a0 str r0, [r4, #8]
  51693. TCPH_HDRLEN_FLAGS_SET(tcphdr, (5 + optlen / 4), TCP_ACK);
  51694. 80318b2: f245 0010 movw r0, #20496 ; 0x5010
  51695. 80318b6: f7fd f8a9 bl 802ea0c <lwip_htons>
  51696. 80318ba: 81a0 strh r0, [r4, #12]
  51697. tcphdr->wnd = htons(pcb->rcv_ann_wnd);
  51698. 80318bc: 8de8 ldrh r0, [r5, #46] ; 0x2e
  51699. 80318be: f7fd f8a5 bl 802ea0c <lwip_htons>
  51700. tcphdr->chksum = 0;
  51701. 80318c2: 2300 movs r3, #0
  51702. tcphdr->src = htons(pcb->local_port);
  51703. tcphdr->dest = htons(pcb->remote_port);
  51704. tcphdr->seqno = seqno_be;
  51705. tcphdr->ackno = htonl(pcb->rcv_nxt);
  51706. TCPH_HDRLEN_FLAGS_SET(tcphdr, (5 + optlen / 4), TCP_ACK);
  51707. tcphdr->wnd = htons(pcb->rcv_ann_wnd);
  51708. 80318c4: 81e0 strh r0, [r4, #14]
  51709. tcphdr->chksum = 0;
  51710. 80318c6: 7423 strb r3, [r4, #16]
  51711. 80318c8: 7463 strb r3, [r4, #17]
  51712. tcphdr->urgp = 0;
  51713. 80318ca: 74a3 strb r3, [r4, #18]
  51714. 80318cc: 74e3 strb r3, [r4, #19]
  51715. /* If we're sending a packet, update the announced right window edge */
  51716. pcb->rcv_ann_right_edge = pcb->rcv_nxt + pcb->rcv_ann_wnd;
  51717. 80318ce: 8dea ldrh r2, [r5, #46] ; 0x2e
  51718. 80318d0: 6aab ldr r3, [r5, #40] ; 0x28
  51719. 80318d2: 18d3 adds r3, r2, r3
  51720. 80318d4: 632b str r3, [r5, #48] ; 0x30
  51721. }
  51722. return p;
  51723. }
  51724. 80318d6: 4630 mov r0, r6
  51725. 80318d8: bdf8 pop {r3, r4, r5, r6, r7, pc}
  51726. 080318da <tcp_write>:
  51727. * - TCP_WRITE_FLAG_MORE (0x02) for TCP connection, PSH flag will be set on last segment sent,
  51728. * @return ERR_OK if enqueued, another err_t on error
  51729. */
  51730. err_t
  51731. tcp_write(struct tcp_pcb *pcb, const void *arg, u16_t len, u8_t apiflags)
  51732. {
  51733. 80318da: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  51734. 80318de: b08f sub sp, #60 ; 0x3c
  51735. 80318e0: 4691 mov r9, r2
  51736. 80318e2: 9307 str r3, [sp, #28]
  51737. u16_t pos = 0; /* position in 'arg' data */
  51738. u16_t queuelen;
  51739. u8_t optlen = 0;
  51740. u8_t optflags = 0;
  51741. #if TCP_OVERSIZE
  51742. u16_t oversize = 0;
  51743. 80318e4: 2300 movs r3, #0
  51744. 80318e6: f8ad 3036 strh.w r3, [sp, #54] ; 0x36
  51745. * - TCP_WRITE_FLAG_MORE (0x02) for TCP connection, PSH flag will be set on last segment sent,
  51746. * @return ERR_OK if enqueued, another err_t on error
  51747. */
  51748. err_t
  51749. tcp_write(struct tcp_pcb *pcb, const void *arg, u16_t len, u8_t apiflags)
  51750. {
  51751. 80318ea: 4604 mov r4, r0
  51752. u8_t concat_chksum_swapped = 0;
  51753. u16_t concat_chksummed = 0;
  51754. #endif /* TCP_CHECKSUM_ON_COPY */
  51755. err_t err;
  51756. /* don't allocate segments bigger than half the maximum window we ever received */
  51757. u16_t mss_local = LWIP_MIN(pcb->mss, pcb->snd_wnd_max/2);
  51758. 80318ec: f8b0 2062 ldrh.w r2, [r0, #98] ; 0x62
  51759. 80318f0: 8ec3 ldrh r3, [r0, #54] ; 0x36
  51760. apiflags |= TCP_WRITE_FLAG_COPY;
  51761. #endif /* LWIP_NETIF_TX_SINGLE_PBUF */
  51762. LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_write(pcb=%p, data=%p, len=%"U16_F", apiflags=%"U16_F")\n",
  51763. (void *)pcb, arg, len, (u16_t)apiflags));
  51764. LWIP_ERROR("tcp_write: arg == NULL (programmer violates API)",
  51765. 80318f2: 9106 str r1, [sp, #24]
  51766. 80318f4: 2900 cmp r1, #0
  51767. 80318f6: f000 8168 beq.w 8031bca <tcp_write+0x2f0>
  51768. 80318fa: 7e01 ldrb r1, [r0, #24]
  51769. 80318fc: 2907 cmp r1, #7
  51770. 80318fe: f200 8166 bhi.w 8031bce <tcp_write+0x2f4>
  51771. 8031902: f990 1018 ldrsb.w r1, [r0, #24]
  51772. 8031906: f04f 5064 mov.w r0, #956301312 ; 0x39000000
  51773. 803190a: 4088 lsls r0, r1
  51774. 803190c: f140 815f bpl.w 8031bce <tcp_write+0x2f4>
  51775. (pcb->state != CLOSE_WAIT) &&
  51776. (pcb->state != SYN_SENT) &&
  51777. (pcb->state != SYN_RCVD)) {
  51778. LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_STATE | LWIP_DBG_LEVEL_SEVERE, ("tcp_write() called in invalid state\n"));
  51779. return ERR_CONN;
  51780. } else if (len == 0) {
  51781. 8031910: f1b9 0f00 cmp.w r9, #0
  51782. 8031914: d00d beq.n 8031932 <tcp_write+0x58>
  51783. return ERR_OK;
  51784. }
  51785. /* fail on too much data */
  51786. if (len > pcb->snd_buf) {
  51787. 8031916: f8b4 1066 ldrh.w r1, [r4, #102] ; 0x66
  51788. 803191a: 4549 cmp r1, r9
  51789. 803191c: d200 bcs.n 8031920 <tcp_write+0x46>
  51790. 803191e: e003 b.n 8031928 <tcp_write+0x4e>
  51791. LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_write: queuelen: %"U16_F"\n", (u16_t)pcb->snd_queuelen));
  51792. /* If total number of pbufs on the unsent/unacked queues exceeds the
  51793. * configured maximum, return an error */
  51794. /* check for configured max queuelen and possible overflow */
  51795. if ((pcb->snd_queuelen >= TCP_SND_QUEUELEN) || (pcb->snd_queuelen > TCP_SNDQUEUELEN_OVERFLOW)) {
  51796. 8031920: f8b4 1068 ldrh.w r1, [r4, #104] ; 0x68
  51797. 8031924: 2947 cmp r1, #71 ; 0x47
  51798. 8031926: d904 bls.n 8031932 <tcp_write+0x58>
  51799. LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 3, ("tcp_write: too long queue %"U16_F" (max %"U16_F")\n",
  51800. pcb->snd_queuelen, TCP_SND_QUEUELEN));
  51801. TCP_STATS_INC(tcp.memerr);
  51802. pcb->flags |= TF_NAGLEMEMERR;
  51803. 8031928: 7fa3 ldrb r3, [r4, #30]
  51804. 803192a: f063 037f orn r3, r3, #127 ; 0x7f
  51805. 803192e: 77a3 strb r3, [r4, #30]
  51806. 8031930: e151 b.n 8031bd6 <tcp_write+0x2fc>
  51807. u8_t concat_chksum_swapped = 0;
  51808. u16_t concat_chksummed = 0;
  51809. #endif /* TCP_CHECKSUM_ON_COPY */
  51810. err_t err;
  51811. /* don't allocate segments bigger than half the maximum window we ever received */
  51812. u16_t mss_local = LWIP_MIN(pcb->mss, pcb->snd_wnd_max/2);
  51813. 8031932: 0852 lsrs r2, r2, #1
  51814. *
  51815. * pos records progress as data is segmented.
  51816. */
  51817. /* Find the tail of the unsent queue. */
  51818. if (pcb->unsent != NULL) {
  51819. 8031934: 6ee6 ldr r6, [r4, #108] ; 0x6c
  51820. err = tcp_write_checks(pcb, len);
  51821. if (err != ERR_OK) {
  51822. return err;
  51823. }
  51824. queuelen = pcb->snd_queuelen;
  51825. 8031936: f8b4 b068 ldrh.w fp, [r4, #104] ; 0x68
  51826. u8_t concat_chksum_swapped = 0;
  51827. u16_t concat_chksummed = 0;
  51828. #endif /* TCP_CHECKSUM_ON_COPY */
  51829. err_t err;
  51830. /* don't allocate segments bigger than half the maximum window we ever received */
  51831. u16_t mss_local = LWIP_MIN(pcb->mss, pcb->snd_wnd_max/2);
  51832. 803193a: 429a cmp r2, r3
  51833. 803193c: bf28 it cs
  51834. 803193e: 461a movcs r2, r3
  51835. 8031940: 920a str r2, [sp, #40] ; 0x28
  51836. *
  51837. * pos records progress as data is segmented.
  51838. */
  51839. /* Find the tail of the unsent queue. */
  51840. if (pcb->unsent != NULL) {
  51841. 8031942: b90e cbnz r6, 8031948 <tcp_write+0x6e>
  51842. 8031944: e066 b.n 8031a14 <tcp_write+0x13a>
  51843. u16_t space;
  51844. u16_t unsent_optlen;
  51845. /* @todo: this could be sped up by keeping last_unsent in the pcb */
  51846. for (last_unsent = pcb->unsent; last_unsent->next != NULL;
  51847. last_unsent = last_unsent->next);
  51848. 8031946: 461e mov r6, r3
  51849. if (pcb->unsent != NULL) {
  51850. u16_t space;
  51851. u16_t unsent_optlen;
  51852. /* @todo: this could be sped up by keeping last_unsent in the pcb */
  51853. for (last_unsent = pcb->unsent; last_unsent->next != NULL;
  51854. 8031948: 6833 ldr r3, [r6, #0]
  51855. 803194a: 2b00 cmp r3, #0
  51856. 803194c: d1fb bne.n 8031946 <tcp_write+0x6c>
  51857. last_unsent = last_unsent->next);
  51858. /* Usable space at the end of the last unsent segment */
  51859. unsent_optlen = LWIP_TCP_OPT_LENGTH(last_unsent->flags);
  51860. 803194e: 7ab3 ldrb r3, [r6, #10]
  51861. space = mss_local - (last_unsent->len + unsent_optlen);
  51862. 8031950: 8937 ldrh r7, [r6, #8]
  51863. /* @todo: this could be sped up by keeping last_unsent in the pcb */
  51864. for (last_unsent = pcb->unsent; last_unsent->next != NULL;
  51865. last_unsent = last_unsent->next);
  51866. /* Usable space at the end of the last unsent segment */
  51867. unsent_optlen = LWIP_TCP_OPT_LENGTH(last_unsent->flags);
  51868. 8031952: 980a ldr r0, [sp, #40] ; 0x28
  51869. #if TCP_OVERSIZE_DBGCHECK
  51870. /* check that pcb->unsent_oversize matches last_unsent->unsent_oversize */
  51871. LWIP_ASSERT("unsent_oversize mismatch (pcb vs. last_unsent)",
  51872. pcb->unsent_oversize == last_unsent->oversize_left);
  51873. #endif /* TCP_OVERSIZE_DBGCHECK */
  51874. oversize = pcb->unsent_oversize;
  51875. 8031954: f8b4 506a ldrh.w r5, [r4, #106] ; 0x6a
  51876. /* @todo: this could be sped up by keeping last_unsent in the pcb */
  51877. for (last_unsent = pcb->unsent; last_unsent->next != NULL;
  51878. last_unsent = last_unsent->next);
  51879. /* Usable space at the end of the last unsent segment */
  51880. unsent_optlen = LWIP_TCP_OPT_LENGTH(last_unsent->flags);
  51881. 8031958: f013 0f01 tst.w r3, #1
  51882. 803195c: f003 0302 and.w r3, r3, #2
  51883. 8031960: bf0c ite eq
  51884. 8031962: 2100 moveq r1, #0
  51885. 8031964: 2104 movne r1, #4
  51886. 8031966: b2db uxtb r3, r3
  51887. 8031968: 1bc2 subs r2, r0, r7
  51888. 803196a: 2b00 cmp r3, #0
  51889. 803196c: bf14 ite ne
  51890. 803196e: 230c movne r3, #12
  51891. 8031970: 2300 moveq r3, #0
  51892. space = mss_local - (last_unsent->len + unsent_optlen);
  51893. 8031972: 1a52 subs r2, r2, r1
  51894. 8031974: 1ad2 subs r2, r2, r3
  51895. 8031976: b292 uxth r2, r2
  51896. /* check that pcb->unsent_oversize matches last_unsent->unsent_oversize */
  51897. LWIP_ASSERT("unsent_oversize mismatch (pcb vs. last_unsent)",
  51898. pcb->unsent_oversize == last_unsent->oversize_left);
  51899. #endif /* TCP_OVERSIZE_DBGCHECK */
  51900. oversize = pcb->unsent_oversize;
  51901. if (oversize > 0) {
  51902. 8031978: b91d cbnz r5, 8031982 <tcp_write+0xa8>
  51903. #if TCP_OVERSIZE_DBGCHECK
  51904. /* check that pcb->unsent_oversize matches last_unsent->unsent_oversize */
  51905. LWIP_ASSERT("unsent_oversize mismatch (pcb vs. last_unsent)",
  51906. pcb->unsent_oversize == last_unsent->oversize_left);
  51907. #endif /* TCP_OVERSIZE_DBGCHECK */
  51908. oversize = pcb->unsent_oversize;
  51909. 803197a: f8ad 5036 strh.w r5, [sp, #54] ; 0x36
  51910. */
  51911. err_t
  51912. tcp_write(struct tcp_pcb *pcb, const void *arg, u16_t len, u8_t apiflags)
  51913. {
  51914. struct pbuf *concat_p = NULL;
  51915. struct tcp_seg *last_unsent = NULL, *seg = NULL, *prev_seg = NULL, *queue = NULL;
  51916. 803197e: 462b mov r3, r5
  51917. 8031980: e00a b.n 8031998 <tcp_write+0xbe>
  51918. #endif /* TCP_OVERSIZE_DBGCHECK */
  51919. oversize = pcb->unsent_oversize;
  51920. if (oversize > 0) {
  51921. LWIP_ASSERT("inconsistent oversize vs. space", oversize_used <= space);
  51922. seg = last_unsent;
  51923. oversize_used = oversize < len ? oversize : len;
  51924. 8031982: 45a9 cmp r9, r5
  51925. 8031984: bf34 ite cc
  51926. 8031986: 464b movcc r3, r9
  51927. 8031988: 462b movcs r3, r5
  51928. pos += oversize_used;
  51929. oversize -= oversize_used;
  51930. 803198a: 1aed subs r5, r5, r3
  51931. space -= oversize_used;
  51932. 803198c: 1ad2 subs r2, r2, r3
  51933. if (oversize > 0) {
  51934. LWIP_ASSERT("inconsistent oversize vs. space", oversize_used <= space);
  51935. seg = last_unsent;
  51936. oversize_used = oversize < len ? oversize : len;
  51937. pos += oversize_used;
  51938. oversize -= oversize_used;
  51939. 803198e: f8ad 5036 strh.w r5, [sp, #54] ; 0x36
  51940. space -= oversize_used;
  51941. 8031992: b292 uxth r2, r2
  51942. oversize = pcb->unsent_oversize;
  51943. if (oversize > 0) {
  51944. LWIP_ASSERT("inconsistent oversize vs. space", oversize_used <= space);
  51945. seg = last_unsent;
  51946. oversize_used = oversize < len ? oversize : len;
  51947. pos += oversize_used;
  51948. 8031994: 461d mov r5, r3
  51949. oversize -= oversize_used;
  51950. space -= oversize_used;
  51951. 8031996: 4633 mov r3, r6
  51952. *
  51953. * We don't extend segments containing SYN/FIN flags or options
  51954. * (len==0). The new pbuf is kept in concat_p and pbuf_cat'ed at
  51955. * the end.
  51956. */
  51957. if ((pos < len) && (space > 0) && (last_unsent->len > 0)) {
  51958. 8031998: 454d cmp r5, r9
  51959. 803199a: d23f bcs.n 8031a1c <tcp_write+0x142>
  51960. 803199c: 2a00 cmp r2, #0
  51961. 803199e: d03d beq.n 8031a1c <tcp_write+0x142>
  51962. 80319a0: 2f00 cmp r7, #0
  51963. 80319a2: d03e beq.n 8031a22 <tcp_write+0x148>
  51964. seg = last_unsent;
  51965. /* Create a pbuf with a copy or reference to seglen bytes. We
  51966. * can use PBUF_RAW here since the data appears in the middle of
  51967. * a segment. A header will never be prepended. */
  51968. if (apiflags & TCP_WRITE_FLAG_COPY) {
  51969. 80319a4: 9907 ldr r1, [sp, #28]
  51970. * We don't extend segments containing SYN/FIN flags or options
  51971. * (len==0). The new pbuf is kept in concat_p and pbuf_cat'ed at
  51972. * the end.
  51973. */
  51974. if ((pos < len) && (space > 0) && (last_unsent->len > 0)) {
  51975. u16_t seglen = space < len - pos ? space : len - pos;
  51976. 80319a6: ebc5 0a09 rsb sl, r5, r9
  51977. 80319aa: 4592 cmp sl, r2
  51978. 80319ac: bfa8 it ge
  51979. 80319ae: 4692 movge sl, r2
  51980. seg = last_unsent;
  51981. /* Create a pbuf with a copy or reference to seglen bytes. We
  51982. * can use PBUF_RAW here since the data appears in the middle of
  51983. * a segment. A header will never be prepended. */
  51984. if (apiflags & TCP_WRITE_FLAG_COPY) {
  51985. 80319b0: 07cb lsls r3, r1, #31
  51986. * We don't extend segments containing SYN/FIN flags or options
  51987. * (len==0). The new pbuf is kept in concat_p and pbuf_cat'ed at
  51988. * the end.
  51989. */
  51990. if ((pos < len) && (space > 0) && (last_unsent->len > 0)) {
  51991. u16_t seglen = space < len - pos ? space : len - pos;
  51992. 80319b2: fa1f f88a uxth.w r8, sl
  51993. seg = last_unsent;
  51994. /* Create a pbuf with a copy or reference to seglen bytes. We
  51995. * can use PBUF_RAW here since the data appears in the middle of
  51996. * a segment. A header will never be prepended. */
  51997. if (apiflags & TCP_WRITE_FLAG_COPY) {
  51998. 80319b6: d514 bpl.n 80319e2 <tcp_write+0x108>
  51999. /* Data is copied */
  52000. if ((concat_p = tcp_pbuf_prealloc(PBUF_RAW, seglen, space, &oversize, pcb, apiflags, 1)) == NULL) {
  52001. 80319b8: 2301 movs r3, #1
  52002. 80319ba: 9101 str r1, [sp, #4]
  52003. 80319bc: 9302 str r3, [sp, #8]
  52004. 80319be: 9400 str r4, [sp, #0]
  52005. 80319c0: 2003 movs r0, #3
  52006. 80319c2: 4641 mov r1, r8
  52007. 80319c4: f10d 0336 add.w r3, sp, #54 ; 0x36
  52008. 80319c8: f7ff fedc bl 8031784 <tcp_pbuf_prealloc>
  52009. 80319cc: 4607 mov r7, r0
  52010. 80319ce: 2800 cmp r0, #0
  52011. 80319d0: f000 80e9 beq.w 8031ba6 <tcp_write+0x2cc>
  52012. goto memerr;
  52013. }
  52014. #if TCP_OVERSIZE_DBGCHECK
  52015. last_unsent->oversize_left += oversize;
  52016. #endif /* TCP_OVERSIZE_DBGCHECK */
  52017. TCP_DATA_COPY2(concat_p->payload, (u8_t*)arg + pos, seglen, &concat_chksum, &concat_chksum_swapped);
  52018. 80319d4: 9a06 ldr r2, [sp, #24]
  52019. 80319d6: 6840 ldr r0, [r0, #4]
  52020. 80319d8: 1951 adds r1, r2, r5
  52021. 80319da: 4642 mov r2, r8
  52022. 80319dc: f7f0 f962 bl 8021ca4 <memcpy>
  52023. 80319e0: e00b b.n 80319fa <tcp_write+0x120>
  52024. #if TCP_CHECKSUM_ON_COPY
  52025. concat_chksummed += seglen;
  52026. #endif /* TCP_CHECKSUM_ON_COPY */
  52027. } else {
  52028. /* Data is not copied */
  52029. if ((concat_p = pbuf_alloc(PBUF_RAW, seglen, PBUF_ROM)) == NULL) {
  52030. 80319e2: 2003 movs r0, #3
  52031. 80319e4: 4641 mov r1, r8
  52032. 80319e6: 2201 movs r2, #1
  52033. 80319e8: f7fe f99b bl 802fd22 <pbuf_alloc>
  52034. 80319ec: 4607 mov r7, r0
  52035. 80319ee: 2800 cmp r0, #0
  52036. 80319f0: f000 80d9 beq.w 8031ba6 <tcp_write+0x2cc>
  52037. tcp_seg_add_chksum(~inet_chksum((u8_t*)arg + pos, seglen), seglen,
  52038. &concat_chksum, &concat_chksum_swapped);
  52039. concat_chksummed += seglen;
  52040. #endif /* TCP_CHECKSUM_ON_COPY */
  52041. /* reference the non-volatile payload data */
  52042. concat_p->payload = (u8_t*)arg + pos;
  52043. 80319f4: 9806 ldr r0, [sp, #24]
  52044. 80319f6: 1943 adds r3, r0, r5
  52045. 80319f8: 607b str r3, [r7, #4]
  52046. }
  52047. pos += seglen;
  52048. queuelen += pbuf_clen(concat_p);
  52049. 80319fa: 4638 mov r0, r7
  52050. 80319fc: f7fe fa18 bl 802fe30 <pbuf_clen>
  52051. #endif /* TCP_CHECKSUM_ON_COPY */
  52052. /* reference the non-volatile payload data */
  52053. concat_p->payload = (u8_t*)arg + pos;
  52054. }
  52055. pos += seglen;
  52056. 8031a00: 44a8 add r8, r5
  52057. 8031a02: fa1f f888 uxth.w r8, r8
  52058. queuelen += pbuf_clen(concat_p);
  52059. 8031a06: 4458 add r0, fp
  52060. 8031a08: 46aa mov sl, r5
  52061. 8031a0a: fa1f fb80 uxth.w fp, r0
  52062. #endif /* TCP_CHECKSUM_ON_COPY */
  52063. /* reference the non-volatile payload data */
  52064. concat_p->payload = (u8_t*)arg + pos;
  52065. }
  52066. pos += seglen;
  52067. 8031a0e: 4645 mov r5, r8
  52068. queuelen += pbuf_clen(concat_p);
  52069. 8031a10: 4633 mov r3, r6
  52070. 8031a12: e007 b.n 8031a24 <tcp_write+0x14a>
  52071. u16_t queuelen;
  52072. u8_t optlen = 0;
  52073. u8_t optflags = 0;
  52074. #if TCP_OVERSIZE
  52075. u16_t oversize = 0;
  52076. u16_t oversize_used = 0;
  52077. 8031a14: 46b2 mov sl, r6
  52078. err_t
  52079. tcp_write(struct tcp_pcb *pcb, const void *arg, u16_t len, u8_t apiflags)
  52080. {
  52081. struct pbuf *concat_p = NULL;
  52082. struct tcp_seg *last_unsent = NULL, *seg = NULL, *prev_seg = NULL, *queue = NULL;
  52083. u16_t pos = 0; /* position in 'arg' data */
  52084. 8031a16: 4635 mov r5, r6
  52085. */
  52086. err_t
  52087. tcp_write(struct tcp_pcb *pcb, const void *arg, u16_t len, u8_t apiflags)
  52088. {
  52089. struct pbuf *concat_p = NULL;
  52090. struct tcp_seg *last_unsent = NULL, *seg = NULL, *prev_seg = NULL, *queue = NULL;
  52091. 8031a18: 4633 mov r3, r6
  52092. 8031a1a: e000 b.n 8031a1e <tcp_write+0x144>
  52093. *
  52094. * We don't extend segments containing SYN/FIN flags or options
  52095. * (len==0). The new pbuf is kept in concat_p and pbuf_cat'ed at
  52096. * the end.
  52097. */
  52098. if ((pos < len) && (space > 0) && (last_unsent->len > 0)) {
  52099. 8031a1c: 46aa mov sl, r5
  52100. * @return ERR_OK if enqueued, another err_t on error
  52101. */
  52102. err_t
  52103. tcp_write(struct tcp_pcb *pcb, const void *arg, u16_t len, u8_t apiflags)
  52104. {
  52105. struct pbuf *concat_p = NULL;
  52106. 8031a1e: 2700 movs r7, #0
  52107. 8031a20: e000 b.n 8031a24 <tcp_write+0x14a>
  52108. *
  52109. * We don't extend segments containing SYN/FIN flags or options
  52110. * (len==0). The new pbuf is kept in concat_p and pbuf_cat'ed at
  52111. * the end.
  52112. */
  52113. if ((pos < len) && (space > 0) && (last_unsent->len > 0)) {
  52114. 8031a22: 46aa mov sl, r5
  52115. #if TCP_CHECKSUM_ON_COPY
  52116. u16_t chksum = 0;
  52117. u8_t chksum_swapped = 0;
  52118. #endif /* TCP_CHECKSUM_ON_COPY */
  52119. if (apiflags & TCP_WRITE_FLAG_COPY) {
  52120. 8031a24: 9907 ldr r1, [sp, #28]
  52121. seg->chksum_swapped = chksum_swapped;
  52122. seg->flags |= TF_SEG_DATA_CHECKSUMMED;
  52123. #endif /* TCP_CHECKSUM_ON_COPY */
  52124. /* first segment of to-be-queued data? */
  52125. if (queue == NULL) {
  52126. 8031a26: f04f 0800 mov.w r8, #0
  52127. #if TCP_CHECKSUM_ON_COPY
  52128. u16_t chksum = 0;
  52129. u8_t chksum_swapped = 0;
  52130. #endif /* TCP_CHECKSUM_ON_COPY */
  52131. if (apiflags & TCP_WRITE_FLAG_COPY) {
  52132. 8031a2a: f001 0101 and.w r1, r1, #1
  52133. seg->chksum_swapped = chksum_swapped;
  52134. seg->flags |= TF_SEG_DATA_CHECKSUMMED;
  52135. #endif /* TCP_CHECKSUM_ON_COPY */
  52136. /* first segment of to-be-queued data? */
  52137. if (queue == NULL) {
  52138. 8031a2e: f8cd 802c str.w r8, [sp, #44] ; 0x2c
  52139. #if TCP_CHECKSUM_ON_COPY
  52140. u16_t chksum = 0;
  52141. u8_t chksum_swapped = 0;
  52142. #endif /* TCP_CHECKSUM_ON_COPY */
  52143. if (apiflags & TCP_WRITE_FLAG_COPY) {
  52144. 8031a32: 9108 str r1, [sp, #32]
  52145. 8031a34: e068 b.n 8031b08 <tcp_write+0x22e>
  52146. * The new segments are chained together in the local 'queue'
  52147. * variable, ready to be appended to pcb->unsent.
  52148. */
  52149. while (pos < len) {
  52150. struct pbuf *p;
  52151. u16_t left = len - pos;
  52152. 8031a36: ebc5 0309 rsb r3, r5, r9
  52153. u16_t max_len = mss_local - optlen;
  52154. u16_t seglen = left > max_len ? max_len : left;
  52155. 8031a3a: 9a0a ldr r2, [sp, #40] ; 0x28
  52156. 8031a3c: b29b uxth r3, r3
  52157. 8031a3e: 4293 cmp r3, r2
  52158. 8031a40: bf38 it cc
  52159. 8031a42: 461a movcc r2, r3
  52160. #if TCP_CHECKSUM_ON_COPY
  52161. u16_t chksum = 0;
  52162. u8_t chksum_swapped = 0;
  52163. #endif /* TCP_CHECKSUM_ON_COPY */
  52164. if (apiflags & TCP_WRITE_FLAG_COPY) {
  52165. 8031a44: 9b08 ldr r3, [sp, #32]
  52166. */
  52167. while (pos < len) {
  52168. struct pbuf *p;
  52169. u16_t left = len - pos;
  52170. u16_t max_len = mss_local - optlen;
  52171. u16_t seglen = left > max_len ? max_len : left;
  52172. 8031a46: 9209 str r2, [sp, #36] ; 0x24
  52173. #if TCP_CHECKSUM_ON_COPY
  52174. u16_t chksum = 0;
  52175. u8_t chksum_swapped = 0;
  52176. #endif /* TCP_CHECKSUM_ON_COPY */
  52177. if (apiflags & TCP_WRITE_FLAG_COPY) {
  52178. 8031a48: b1db cbz r3, 8031a82 <tcp_write+0x1a8>
  52179. /* If copy is set, memory should be allocated and data copied
  52180. * into pbuf */
  52181. if ((p = tcp_pbuf_prealloc(PBUF_TRANSPORT, seglen + optlen, mss_local, &oversize, pcb, apiflags, queue == NULL)) == NULL) {
  52182. 8031a4a: f1d8 0301 rsbs r3, r8, #1
  52183. 8031a4e: 9807 ldr r0, [sp, #28]
  52184. 8031a50: 9400 str r4, [sp, #0]
  52185. 8031a52: bf38 it cc
  52186. 8031a54: 2300 movcc r3, #0
  52187. 8031a56: 9001 str r0, [sp, #4]
  52188. 8031a58: 9302 str r3, [sp, #8]
  52189. 8031a5a: 4611 mov r1, r2
  52190. 8031a5c: 2000 movs r0, #0
  52191. 8031a5e: 9a0a ldr r2, [sp, #40] ; 0x28
  52192. 8031a60: f10d 0336 add.w r3, sp, #54 ; 0x36
  52193. 8031a64: f7ff fe8e bl 8031784 <tcp_pbuf_prealloc>
  52194. 8031a68: 4684 mov ip, r0
  52195. 8031a6a: 2800 cmp r0, #0
  52196. 8031a6c: f000 809e beq.w 8031bac <tcp_write+0x2d2>
  52197. LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 2, ("tcp_write : could not allocate memory for pbuf copy size %"U16_F"\n", seglen));
  52198. goto memerr;
  52199. }
  52200. LWIP_ASSERT("tcp_write: check that first pbuf can hold the complete seglen",
  52201. (p->len >= seglen));
  52202. TCP_DATA_COPY2((char *)p->payload + optlen, (u8_t*)arg + pos, seglen, &chksum, &chksum_swapped);
  52203. 8031a70: 9a06 ldr r2, [sp, #24]
  52204. 8031a72: 6840 ldr r0, [r0, #4]
  52205. 8031a74: f8cd c014 str.w ip, [sp, #20]
  52206. 8031a78: 1951 adds r1, r2, r5
  52207. 8031a7a: 9a09 ldr r2, [sp, #36] ; 0x24
  52208. 8031a7c: f7f0 f912 bl 8021ca4 <memcpy>
  52209. 8031a80: e019 b.n 8031ab6 <tcp_write+0x1dc>
  52210. */
  52211. struct pbuf *p2;
  52212. #if TCP_OVERSIZE
  52213. LWIP_ASSERT("oversize == 0", oversize == 0);
  52214. #endif /* TCP_OVERSIZE */
  52215. if ((p2 = pbuf_alloc(PBUF_TRANSPORT, seglen, PBUF_ROM)) == NULL) {
  52216. 8031a82: 9808 ldr r0, [sp, #32]
  52217. 8031a84: 9909 ldr r1, [sp, #36] ; 0x24
  52218. 8031a86: 2201 movs r2, #1
  52219. 8031a88: f7fe f94b bl 802fd22 <pbuf_alloc>
  52220. 8031a8c: 4603 mov r3, r0
  52221. 8031a8e: 2800 cmp r0, #0
  52222. 8031a90: f000 808c beq.w 8031bac <tcp_write+0x2d2>
  52223. #if TCP_CHECKSUM_ON_COPY
  52224. /* calculate the checksum of nocopy-data */
  52225. chksum = ~inet_chksum((u8_t*)arg + pos, seglen);
  52226. #endif /* TCP_CHECKSUM_ON_COPY */
  52227. /* reference the non-volatile payload data */
  52228. p2->payload = (u8_t*)arg + pos;
  52229. 8031a94: 9806 ldr r0, [sp, #24]
  52230. 8031a96: 1942 adds r2, r0, r5
  52231. /* Second, allocate a pbuf for the headers. */
  52232. if ((p = pbuf_alloc(PBUF_TRANSPORT, optlen, PBUF_RAM)) == NULL) {
  52233. 8031a98: 9808 ldr r0, [sp, #32]
  52234. #if TCP_CHECKSUM_ON_COPY
  52235. /* calculate the checksum of nocopy-data */
  52236. chksum = ~inet_chksum((u8_t*)arg + pos, seglen);
  52237. #endif /* TCP_CHECKSUM_ON_COPY */
  52238. /* reference the non-volatile payload data */
  52239. p2->payload = (u8_t*)arg + pos;
  52240. 8031a9a: 605a str r2, [r3, #4]
  52241. /* Second, allocate a pbuf for the headers. */
  52242. if ((p = pbuf_alloc(PBUF_TRANSPORT, optlen, PBUF_RAM)) == NULL) {
  52243. 8031a9c: 4601 mov r1, r0
  52244. 8031a9e: 4602 mov r2, r0
  52245. 8031aa0: 9305 str r3, [sp, #20]
  52246. 8031aa2: f7fe f93e bl 802fd22 <pbuf_alloc>
  52247. 8031aa6: 9b05 ldr r3, [sp, #20]
  52248. 8031aa8: b908 cbnz r0, 8031aae <tcp_write+0x1d4>
  52249. /* If allocation fails, we have to deallocate the data pbuf as
  52250. * well. */
  52251. pbuf_free(p2);
  52252. 8031aaa: 4618 mov r0, r3
  52253. 8031aac: e013 b.n 8031ad6 <tcp_write+0x1fc>
  52254. LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 2, ("tcp_write: could not allocate memory for header pbuf\n"));
  52255. goto memerr;
  52256. }
  52257. /* Concatenate the headers and data pbufs together. */
  52258. pbuf_cat(p/*header*/, p2/*data*/);
  52259. 8031aae: 4619 mov r1, r3
  52260. 8031ab0: 9005 str r0, [sp, #20]
  52261. 8031ab2: f7fe f9d3 bl 802fe5c <pbuf_cat>
  52262. 8031ab6: f8dd c014 ldr.w ip, [sp, #20]
  52263. }
  52264. queuelen += pbuf_clen(p);
  52265. 8031aba: 4660 mov r0, ip
  52266. 8031abc: f8cd c014 str.w ip, [sp, #20]
  52267. 8031ac0: f7fe f9b6 bl 802fe30 <pbuf_clen>
  52268. 8031ac4: 4458 add r0, fp
  52269. 8031ac6: fa1f fb80 uxth.w fp, r0
  52270. /* Now that there are more segments queued, we check again if the
  52271. * length of the queue exceeds the configured maximum or
  52272. * overflows. */
  52273. if ((queuelen > TCP_SND_QUEUELEN) || (queuelen > TCP_SNDQUEUELEN_OVERFLOW)) {
  52274. 8031aca: f1bb 0f48 cmp.w fp, #72 ; 0x48
  52275. 8031ace: f8dd c014 ldr.w ip, [sp, #20]
  52276. 8031ad2: d903 bls.n 8031adc <tcp_write+0x202>
  52277. LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 2, ("tcp_write: queue too long %"U16_F" (%"U16_F")\n", queuelen, TCP_SND_QUEUELEN));
  52278. pbuf_free(p);
  52279. 8031ad4: 4660 mov r0, ip
  52280. 8031ad6: f7fe f8d7 bl 802fc88 <pbuf_free>
  52281. goto memerr;
  52282. 8031ada: e067 b.n 8031bac <tcp_write+0x2d2>
  52283. }
  52284. if ((seg = tcp_create_segment(pcb, p, 0, pcb->snd_lbb + pos, optflags)) == NULL) {
  52285. 8031adc: 6de3 ldr r3, [r4, #92] ; 0x5c
  52286. 8031ade: 2200 movs r2, #0
  52287. 8031ae0: 18eb adds r3, r5, r3
  52288. 8031ae2: 9200 str r2, [sp, #0]
  52289. 8031ae4: 4620 mov r0, r4
  52290. 8031ae6: 4661 mov r1, ip
  52291. 8031ae8: f7ff fe78 bl 80317dc <tcp_create_segment>
  52292. 8031aec: 4603 mov r3, r0
  52293. 8031aee: 2800 cmp r0, #0
  52294. 8031af0: d05c beq.n 8031bac <tcp_write+0x2d2>
  52295. seg->chksum_swapped = chksum_swapped;
  52296. seg->flags |= TF_SEG_DATA_CHECKSUMMED;
  52297. #endif /* TCP_CHECKSUM_ON_COPY */
  52298. /* first segment of to-be-queued data? */
  52299. if (queue == NULL) {
  52300. 8031af2: f1b8 0f00 cmp.w r8, #0
  52301. 8031af6: d002 beq.n 8031afe <tcp_write+0x224>
  52302. queue = seg;
  52303. } else {
  52304. /* Attach the segment to the end of the queued segments */
  52305. LWIP_ASSERT("prev_seg != NULL", prev_seg != NULL);
  52306. prev_seg->next = seg;
  52307. 8031af8: 990b ldr r1, [sp, #44] ; 0x2c
  52308. 8031afa: 6008 str r0, [r1, #0]
  52309. 8031afc: e000 b.n 8031b00 <tcp_write+0x226>
  52310. seg->chksum_swapped = chksum_swapped;
  52311. seg->flags |= TF_SEG_DATA_CHECKSUMMED;
  52312. #endif /* TCP_CHECKSUM_ON_COPY */
  52313. /* first segment of to-be-queued data? */
  52314. if (queue == NULL) {
  52315. 8031afe: 4680 mov r8, r0
  52316. LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_TRACE, ("tcp_write: queueing %"U32_F":%"U32_F"\n",
  52317. ntohl(seg->tcphdr->seqno),
  52318. ntohl(seg->tcphdr->seqno) + TCP_TCPLEN(seg)));
  52319. pos += seglen;
  52320. 8031b00: 9a09 ldr r2, [sp, #36] ; 0x24
  52321. 8031b02: 930b str r3, [sp, #44] ; 0x2c
  52322. 8031b04: 1955 adds r5, r2, r5
  52323. 8031b06: b2ad uxth r5, r5
  52324. * Phase 3: Create new segments.
  52325. *
  52326. * The new segments are chained together in the local 'queue'
  52327. * variable, ready to be appended to pcb->unsent.
  52328. */
  52329. while (pos < len) {
  52330. 8031b08: 454d cmp r5, r9
  52331. 8031b0a: d394 bcc.n 8031a36 <tcp_write+0x15c>
  52332. /*
  52333. * Phase 1: If data has been added to the preallocated tail of
  52334. * last_unsent, we update the length fields of the pbuf chain.
  52335. */
  52336. #if TCP_OVERSIZE
  52337. if (oversize_used > 0) {
  52338. 8031b0c: f1ba 0f00 cmp.w sl, #0
  52339. 8031b10: d019 beq.n 8031b46 <tcp_write+0x26c>
  52340. struct pbuf *p;
  52341. /* Bump tot_len of whole chain, len of tail */
  52342. for (p = last_unsent->p; p; p = p->next) {
  52343. 8031b12: 6875 ldr r5, [r6, #4]
  52344. 8031b14: e011 b.n 8031b3a <tcp_write+0x260>
  52345. p->tot_len += oversize_used;
  52346. 8031b16: 892a ldrh r2, [r5, #8]
  52347. 8031b18: 4452 add r2, sl
  52348. 8031b1a: 812a strh r2, [r5, #8]
  52349. if (p->next == NULL) {
  52350. 8031b1c: 682a ldr r2, [r5, #0]
  52351. 8031b1e: b95a cbnz r2, 8031b38 <tcp_write+0x25e>
  52352. TCP_DATA_COPY((char *)p->payload + p->len, arg, oversize_used, last_unsent);
  52353. 8031b20: 686a ldr r2, [r5, #4]
  52354. 8031b22: 8968 ldrh r0, [r5, #10]
  52355. 8031b24: 9906 ldr r1, [sp, #24]
  52356. 8031b26: 9305 str r3, [sp, #20]
  52357. 8031b28: 1810 adds r0, r2, r0
  52358. 8031b2a: 4652 mov r2, sl
  52359. 8031b2c: f7f0 f8ba bl 8021ca4 <memcpy>
  52360. p->len += oversize_used;
  52361. 8031b30: 896a ldrh r2, [r5, #10]
  52362. 8031b32: 9b05 ldr r3, [sp, #20]
  52363. 8031b34: 4452 add r2, sl
  52364. 8031b36: 816a strh r2, [r5, #10]
  52365. */
  52366. #if TCP_OVERSIZE
  52367. if (oversize_used > 0) {
  52368. struct pbuf *p;
  52369. /* Bump tot_len of whole chain, len of tail */
  52370. for (p = last_unsent->p; p; p = p->next) {
  52371. 8031b38: 682d ldr r5, [r5, #0]
  52372. 8031b3a: 2d00 cmp r5, #0
  52373. 8031b3c: d1eb bne.n 8031b16 <tcp_write+0x23c>
  52374. if (p->next == NULL) {
  52375. TCP_DATA_COPY((char *)p->payload + p->len, arg, oversize_used, last_unsent);
  52376. p->len += oversize_used;
  52377. }
  52378. }
  52379. last_unsent->len += oversize_used;
  52380. 8031b3e: 8932 ldrh r2, [r6, #8]
  52381. 8031b40: 4492 add sl, r2
  52382. 8031b42: f8a6 a008 strh.w sl, [r6, #8]
  52383. LWIP_ASSERT("last_unsent->oversize_left >= oversize_used",
  52384. last_unsent->oversize_left >= oversize_used);
  52385. last_unsent->oversize_left -= oversize_used;
  52386. #endif /* TCP_OVERSIZE_DBGCHECK */
  52387. }
  52388. pcb->unsent_oversize = oversize;
  52389. 8031b46: f8bd 2036 ldrh.w r2, [sp, #54] ; 0x36
  52390. 8031b4a: f8a4 206a strh.w r2, [r4, #106] ; 0x6a
  52391. #endif /* TCP_OVERSIZE */
  52392. /*
  52393. * Phase 2: concat_p can be concatenated onto last_unsent->p
  52394. */
  52395. if (concat_p != NULL) {
  52396. 8031b4e: b157 cbz r7, 8031b66 <tcp_write+0x28c>
  52397. LWIP_ASSERT("tcp_write: cannot concatenate when pcb->unsent is empty",
  52398. (last_unsent != NULL));
  52399. pbuf_cat(last_unsent->p, concat_p);
  52400. 8031b50: 6870 ldr r0, [r6, #4]
  52401. 8031b52: 9305 str r3, [sp, #20]
  52402. 8031b54: 4639 mov r1, r7
  52403. 8031b56: f7fe f981 bl 802fe5c <pbuf_cat>
  52404. last_unsent->len += concat_p->tot_len;
  52405. 8031b5a: 8939 ldrh r1, [r7, #8]
  52406. 8031b5c: 8932 ldrh r2, [r6, #8]
  52407. 8031b5e: 9b05 ldr r3, [sp, #20]
  52408. 8031b60: 188a adds r2, r1, r2
  52409. 8031b62: 8132 strh r2, [r6, #8]
  52410. 8031b64: e003 b.n 8031b6e <tcp_write+0x294>
  52411. /*
  52412. * Phase 3: Append queue to pcb->unsent. Queue may be NULL, but that
  52413. * is harmless
  52414. */
  52415. if (last_unsent == NULL) {
  52416. 8031b66: b916 cbnz r6, 8031b6e <tcp_write+0x294>
  52417. pcb->unsent = queue;
  52418. 8031b68: f8c4 806c str.w r8, [r4, #108] ; 0x6c
  52419. 8031b6c: e001 b.n 8031b72 <tcp_write+0x298>
  52420. } else {
  52421. last_unsent->next = queue;
  52422. 8031b6e: f8c6 8000 str.w r8, [r6]
  52423. }
  52424. /*
  52425. * Finally update the pcb state.
  52426. */
  52427. pcb->snd_lbb += len;
  52428. 8031b72: 6de2 ldr r2, [r4, #92] ; 0x5c
  52429. pcb->snd_buf -= len;
  52430. pcb->snd_queuelen = queuelen;
  52431. 8031b74: f8a4 b068 strh.w fp, [r4, #104] ; 0x68
  52432. }
  52433. /*
  52434. * Finally update the pcb state.
  52435. */
  52436. pcb->snd_lbb += len;
  52437. 8031b78: 444a add r2, r9
  52438. 8031b7a: 65e2 str r2, [r4, #92] ; 0x5c
  52439. pcb->snd_buf -= len;
  52440. 8031b7c: f8b4 2066 ldrh.w r2, [r4, #102] ; 0x66
  52441. 8031b80: ebc9 0902 rsb r9, r9, r2
  52442. 8031b84: f8a4 9066 strh.w r9, [r4, #102] ; 0x66
  52443. LWIP_ASSERT("tcp_write: valid queue length",
  52444. pcb->unacked != NULL || pcb->unsent != NULL);
  52445. }
  52446. /* Set the PSH flag in the last segment that we enqueued. */
  52447. if (seg != NULL && seg->tcphdr != NULL && ((apiflags & TCP_WRITE_FLAG_MORE)==0)) {
  52448. 8031b88: b333 cbz r3, 8031bd8 <tcp_write+0x2fe>
  52449. 8031b8a: 68dc ldr r4, [r3, #12]
  52450. 8031b8c: b30c cbz r4, 8031bd2 <tcp_write+0x2f8>
  52451. 8031b8e: 9b07 ldr r3, [sp, #28]
  52452. 8031b90: f003 0502 and.w r5, r3, #2
  52453. 8031b94: b2ed uxtb r5, r5
  52454. 8031b96: b9e5 cbnz r5, 8031bd2 <tcp_write+0x2f8>
  52455. TCPH_SET_FLAG(seg->tcphdr, TCP_PSH);
  52456. 8031b98: 2008 movs r0, #8
  52457. 8031b9a: 89a6 ldrh r6, [r4, #12]
  52458. 8031b9c: f7fc ff36 bl 802ea0c <lwip_htons>
  52459. 8031ba0: 4330 orrs r0, r6
  52460. 8031ba2: 81a0 strh r0, [r4, #12]
  52461. 8031ba4: e015 b.n 8031bd2 <tcp_write+0x2f8>
  52462. */
  52463. err_t
  52464. tcp_write(struct tcp_pcb *pcb, const void *arg, u16_t len, u8_t apiflags)
  52465. {
  52466. struct pbuf *concat_p = NULL;
  52467. struct tcp_seg *last_unsent = NULL, *seg = NULL, *prev_seg = NULL, *queue = NULL;
  52468. 8031ba6: f04f 0800 mov.w r8, #0
  52469. 8031baa: 4647 mov r7, r8
  52470. TCPH_SET_FLAG(seg->tcphdr, TCP_PSH);
  52471. }
  52472. return ERR_OK;
  52473. memerr:
  52474. pcb->flags |= TF_NAGLEMEMERR;
  52475. 8031bac: 7fa3 ldrb r3, [r4, #30]
  52476. 8031bae: f063 037f orn r3, r3, #127 ; 0x7f
  52477. 8031bb2: 77a3 strb r3, [r4, #30]
  52478. TCP_STATS_INC(tcp.memerr);
  52479. if (concat_p != NULL) {
  52480. 8031bb4: b117 cbz r7, 8031bbc <tcp_write+0x2e2>
  52481. pbuf_free(concat_p);
  52482. 8031bb6: 4638 mov r0, r7
  52483. 8031bb8: f7fe f866 bl 802fc88 <pbuf_free>
  52484. }
  52485. if (queue != NULL) {
  52486. 8031bbc: f1b8 0f00 cmp.w r8, #0
  52487. 8031bc0: d009 beq.n 8031bd6 <tcp_write+0x2fc>
  52488. tcp_segs_free(queue);
  52489. 8031bc2: 4640 mov r0, r8
  52490. 8031bc4: f7fe fb1b bl 80301fe <tcp_segs_free>
  52491. 8031bc8: e005 b.n 8031bd6 <tcp_write+0x2fc>
  52492. apiflags |= TCP_WRITE_FLAG_COPY;
  52493. #endif /* LWIP_NETIF_TX_SINGLE_PBUF */
  52494. LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_write(pcb=%p, data=%p, len=%"U16_F", apiflags=%"U16_F")\n",
  52495. (void *)pcb, arg, len, (u16_t)apiflags));
  52496. LWIP_ERROR("tcp_write: arg == NULL (programmer violates API)",
  52497. 8031bca: 23f2 movs r3, #242 ; 0xf2
  52498. 8031bcc: e004 b.n 8031bd8 <tcp_write+0x2fe>
  52499. if ((pcb->state != ESTABLISHED) &&
  52500. (pcb->state != CLOSE_WAIT) &&
  52501. (pcb->state != SYN_SENT) &&
  52502. (pcb->state != SYN_RCVD)) {
  52503. LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_STATE | LWIP_DBG_LEVEL_SEVERE, ("tcp_write() called in invalid state\n"));
  52504. return ERR_CONN;
  52505. 8031bce: 23f3 movs r3, #243 ; 0xf3
  52506. 8031bd0: e002 b.n 8031bd8 <tcp_write+0x2fe>
  52507. /* Set the PSH flag in the last segment that we enqueued. */
  52508. if (seg != NULL && seg->tcphdr != NULL && ((apiflags & TCP_WRITE_FLAG_MORE)==0)) {
  52509. TCPH_SET_FLAG(seg->tcphdr, TCP_PSH);
  52510. }
  52511. return ERR_OK;
  52512. 8031bd2: 2300 movs r3, #0
  52513. 8031bd4: e000 b.n 8031bd8 <tcp_write+0x2fe>
  52514. if (pcb->snd_queuelen != 0) {
  52515. LWIP_ASSERT("tcp_write: valid queue length", pcb->unacked != NULL ||
  52516. pcb->unsent != NULL);
  52517. }
  52518. LWIP_DEBUGF(TCP_QLEN_DEBUG | LWIP_DBG_STATE, ("tcp_write: %"S16_F" (with mem err)\n", pcb->snd_queuelen));
  52519. return ERR_MEM;
  52520. 8031bd6: 23ff movs r3, #255 ; 0xff
  52521. 8031bd8: b258 sxtb r0, r3
  52522. }
  52523. 8031bda: b00f add sp, #60 ; 0x3c
  52524. 8031bdc: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  52525. 08031be0 <tcp_enqueue_flags>:
  52526. LWIP_ASSERT("tcp_enqueue_flags: need either TCP_SYN or TCP_FIN in flags (programmer violates API)",
  52527. (flags & (TCP_SYN | TCP_FIN)) != 0);
  52528. /* check for configured max queuelen and possible overflow */
  52529. if ((pcb->snd_queuelen >= TCP_SND_QUEUELEN) || (pcb->snd_queuelen > TCP_SNDQUEUELEN_OVERFLOW)) {
  52530. 8031be0: f8b0 3068 ldrh.w r3, [r0, #104] ; 0x68
  52531. 8031be4: 2b47 cmp r3, #71 ; 0x47
  52532. * @param optdata pointer to TCP options, or NULL.
  52533. * @param optlen length of TCP options in bytes.
  52534. */
  52535. err_t
  52536. tcp_enqueue_flags(struct tcp_pcb *pcb, u8_t flags)
  52537. {
  52538. 8031be6: b573 push {r0, r1, r4, r5, r6, lr}
  52539. 8031be8: 4604 mov r4, r0
  52540. 8031bea: 460d mov r5, r1
  52541. LWIP_ASSERT("tcp_enqueue_flags: need either TCP_SYN or TCP_FIN in flags (programmer violates API)",
  52542. (flags & (TCP_SYN | TCP_FIN)) != 0);
  52543. /* check for configured max queuelen and possible overflow */
  52544. if ((pcb->snd_queuelen >= TCP_SND_QUEUELEN) || (pcb->snd_queuelen > TCP_SNDQUEUELEN_OVERFLOW)) {
  52545. 8031bec: d900 bls.n 8031bf0 <tcp_enqueue_flags+0x10>
  52546. 8031bee: e014 b.n 8031c1a <tcp_enqueue_flags+0x3a>
  52547. /* tcp_enqueue_flags is always called with either SYN or FIN in flags.
  52548. * We need one available snd_buf byte to do that.
  52549. * This means we can't send FIN while snd_buf==0. A better fix would be to
  52550. * not include SYN and FIN sequence numbers in the snd_buf count. */
  52551. if (pcb->snd_buf == 0) {
  52552. 8031bf0: f8b0 3066 ldrh.w r3, [r0, #102] ; 0x66
  52553. err_t
  52554. tcp_enqueue_flags(struct tcp_pcb *pcb, u8_t flags)
  52555. {
  52556. struct pbuf *p;
  52557. struct tcp_seg *seg;
  52558. u8_t optflags = 0;
  52559. 8031bf4: f3c1 0640 ubfx r6, r1, #1, #1
  52560. #if LWIP_TCP_TIMESTAMPS
  52561. if ((pcb->flags & TF_TIMESTAMP)) {
  52562. optflags |= TF_SEG_OPTS_TS;
  52563. }
  52564. #endif /* LWIP_TCP_TIMESTAMPS */
  52565. optlen = LWIP_TCP_OPT_LENGTH(optflags);
  52566. 8031bf8: 00b1 lsls r1, r6, #2
  52567. /* tcp_enqueue_flags is always called with either SYN or FIN in flags.
  52568. * We need one available snd_buf byte to do that.
  52569. * This means we can't send FIN while snd_buf==0. A better fix would be to
  52570. * not include SYN and FIN sequence numbers in the snd_buf count. */
  52571. if (pcb->snd_buf == 0) {
  52572. 8031bfa: 2b00 cmp r3, #0
  52573. 8031bfc: d038 beq.n 8031c70 <tcp_enqueue_flags+0x90>
  52574. TCP_STATS_INC(tcp.memerr);
  52575. return ERR_MEM;
  52576. }
  52577. /* Allocate pbuf with room for TCP header + options */
  52578. if ((p = pbuf_alloc(PBUF_TRANSPORT, optlen, PBUF_RAM)) == NULL) {
  52579. 8031bfe: 2000 movs r0, #0
  52580. 8031c00: 4602 mov r2, r0
  52581. 8031c02: f7fe f88e bl 802fd22 <pbuf_alloc>
  52582. 8031c06: 4601 mov r1, r0
  52583. 8031c08: b900 cbnz r0, 8031c0c <tcp_enqueue_flags+0x2c>
  52584. 8031c0a: e006 b.n 8031c1a <tcp_enqueue_flags+0x3a>
  52585. }
  52586. LWIP_ASSERT("tcp_enqueue_flags: check that first pbuf can hold optlen",
  52587. (p->len >= optlen));
  52588. /* Allocate memory for tcp_seg, and fill in fields. */
  52589. if ((seg = tcp_create_segment(pcb, p, flags, pcb->snd_lbb, optflags)) == NULL) {
  52590. 8031c0c: 9600 str r6, [sp, #0]
  52591. 8031c0e: 4620 mov r0, r4
  52592. 8031c10: 462a mov r2, r5
  52593. 8031c12: 6de3 ldr r3, [r4, #92] ; 0x5c
  52594. 8031c14: f7ff fde2 bl 80317dc <tcp_create_segment>
  52595. 8031c18: b920 cbnz r0, 8031c24 <tcp_enqueue_flags+0x44>
  52596. pcb->flags |= TF_NAGLEMEMERR;
  52597. 8031c1a: 7fa3 ldrb r3, [r4, #30]
  52598. 8031c1c: f063 037f orn r3, r3, #127 ; 0x7f
  52599. 8031c20: 77a3 strb r3, [r4, #30]
  52600. 8031c22: e025 b.n 8031c70 <tcp_enqueue_flags+0x90>
  52601. ntohl(seg->tcphdr->seqno),
  52602. ntohl(seg->tcphdr->seqno) + TCP_TCPLEN(seg),
  52603. (u16_t)flags));
  52604. /* Now append seg to pcb->unsent queue */
  52605. if (pcb->unsent == NULL) {
  52606. 8031c24: 6ee3 ldr r3, [r4, #108] ; 0x6c
  52607. 8031c26: b913 cbnz r3, 8031c2e <tcp_enqueue_flags+0x4e>
  52608. pcb->unsent = seg;
  52609. 8031c28: 66e0 str r0, [r4, #108] ; 0x6c
  52610. 8031c2a: e004 b.n 8031c36 <tcp_enqueue_flags+0x56>
  52611. } else {
  52612. struct tcp_seg *useg;
  52613. for (useg = pcb->unsent; useg->next != NULL; useg = useg->next);
  52614. 8031c2c: 4613 mov r3, r2
  52615. 8031c2e: 681a ldr r2, [r3, #0]
  52616. 8031c30: 2a00 cmp r2, #0
  52617. 8031c32: d1fb bne.n 8031c2c <tcp_enqueue_flags+0x4c>
  52618. useg->next = seg;
  52619. 8031c34: 6018 str r0, [r3, #0]
  52620. }
  52621. #if TCP_OVERSIZE
  52622. /* The new unsent tail has no space */
  52623. pcb->unsent_oversize = 0;
  52624. 8031c36: 2300 movs r3, #0
  52625. #endif /* TCP_OVERSIZE */
  52626. /* SYN and FIN bump the sequence number */
  52627. if ((flags & TCP_SYN) || (flags & TCP_FIN)) {
  52628. 8031c38: 07a9 lsls r1, r5, #30
  52629. for (useg = pcb->unsent; useg->next != NULL; useg = useg->next);
  52630. useg->next = seg;
  52631. }
  52632. #if TCP_OVERSIZE
  52633. /* The new unsent tail has no space */
  52634. pcb->unsent_oversize = 0;
  52635. 8031c3a: f8a4 306a strh.w r3, [r4, #106] ; 0x6a
  52636. #endif /* TCP_OVERSIZE */
  52637. /* SYN and FIN bump the sequence number */
  52638. if ((flags & TCP_SYN) || (flags & TCP_FIN)) {
  52639. 8031c3e: d007 beq.n 8031c50 <tcp_enqueue_flags+0x70>
  52640. pcb->snd_lbb++;
  52641. 8031c40: 6de3 ldr r3, [r4, #92] ; 0x5c
  52642. 8031c42: 3301 adds r3, #1
  52643. 8031c44: 65e3 str r3, [r4, #92] ; 0x5c
  52644. /* optlen does not influence snd_buf */
  52645. pcb->snd_buf--;
  52646. 8031c46: f8b4 3066 ldrh.w r3, [r4, #102] ; 0x66
  52647. 8031c4a: 3b01 subs r3, #1
  52648. 8031c4c: f8a4 3066 strh.w r3, [r4, #102] ; 0x66
  52649. }
  52650. if (flags & TCP_FIN) {
  52651. 8031c50: 07ea lsls r2, r5, #31
  52652. 8031c52: d503 bpl.n 8031c5c <tcp_enqueue_flags+0x7c>
  52653. pcb->flags |= TF_FIN;
  52654. 8031c54: 7fa3 ldrb r3, [r4, #30]
  52655. 8031c56: f043 0320 orr.w r3, r3, #32
  52656. 8031c5a: 77a3 strb r3, [r4, #30]
  52657. }
  52658. /* update number of segments on the queues */
  52659. pcb->snd_queuelen += pbuf_clen(seg->p);
  52660. 8031c5c: 6840 ldr r0, [r0, #4]
  52661. 8031c5e: f8b4 5068 ldrh.w r5, [r4, #104] ; 0x68
  52662. 8031c62: f7fe f8e5 bl 802fe30 <pbuf_clen>
  52663. 8031c66: 1940 adds r0, r0, r5
  52664. 8031c68: f8a4 0068 strh.w r0, [r4, #104] ; 0x68
  52665. if (pcb->snd_queuelen != 0) {
  52666. LWIP_ASSERT("tcp_enqueue_flags: invalid queue length",
  52667. pcb->unacked != NULL || pcb->unsent != NULL);
  52668. }
  52669. return ERR_OK;
  52670. 8031c6c: 2000 movs r0, #0
  52671. 8031c6e: e000 b.n 8031c72 <tcp_enqueue_flags+0x92>
  52672. * This means we can't send FIN while snd_buf==0. A better fix would be to
  52673. * not include SYN and FIN sequence numbers in the snd_buf count. */
  52674. if (pcb->snd_buf == 0) {
  52675. LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 3, ("tcp_enqueue_flags: no send buffer available\n"));
  52676. TCP_STATS_INC(tcp.memerr);
  52677. return ERR_MEM;
  52678. 8031c70: 20ff movs r0, #255 ; 0xff
  52679. LWIP_ASSERT("tcp_enqueue_flags: invalid queue length",
  52680. pcb->unacked != NULL || pcb->unsent != NULL);
  52681. }
  52682. return ERR_OK;
  52683. }
  52684. 8031c72: b240 sxtb r0, r0
  52685. 8031c74: bd7c pop {r2, r3, r4, r5, r6, pc}
  52686. 08031c76 <tcp_send_fin>:
  52687. * @param pcb the tcp_pcb over which to send a segment
  52688. * @return ERR_OK if sent, another err_t otherwise
  52689. */
  52690. err_t
  52691. tcp_send_fin(struct tcp_pcb *pcb)
  52692. {
  52693. 8031c76: b5f8 push {r3, r4, r5, r6, r7, lr}
  52694. /* first, try to add the fin to the last unsent segment */
  52695. if (pcb->unsent != NULL) {
  52696. 8031c78: 6ec4 ldr r4, [r0, #108] ; 0x6c
  52697. * @param pcb the tcp_pcb over which to send a segment
  52698. * @return ERR_OK if sent, another err_t otherwise
  52699. */
  52700. err_t
  52701. tcp_send_fin(struct tcp_pcb *pcb)
  52702. {
  52703. 8031c7a: 4605 mov r5, r0
  52704. /* first, try to add the fin to the last unsent segment */
  52705. if (pcb->unsent != NULL) {
  52706. 8031c7c: b90c cbnz r4, 8031c82 <tcp_send_fin+0xc>
  52707. 8031c7e: e00a b.n 8031c96 <tcp_send_fin+0x20>
  52708. struct tcp_seg *last_unsent;
  52709. for (last_unsent = pcb->unsent; last_unsent->next != NULL;
  52710. last_unsent = last_unsent->next);
  52711. 8031c80: 461c mov r4, r3
  52712. tcp_send_fin(struct tcp_pcb *pcb)
  52713. {
  52714. /* first, try to add the fin to the last unsent segment */
  52715. if (pcb->unsent != NULL) {
  52716. struct tcp_seg *last_unsent;
  52717. for (last_unsent = pcb->unsent; last_unsent->next != NULL;
  52718. 8031c82: 6823 ldr r3, [r4, #0]
  52719. 8031c84: 2b00 cmp r3, #0
  52720. 8031c86: d1fb bne.n 8031c80 <tcp_send_fin+0xa>
  52721. last_unsent = last_unsent->next);
  52722. if ((TCPH_FLAGS(last_unsent->tcphdr) & (TCP_SYN | TCP_FIN | TCP_RST)) == 0) {
  52723. 8031c88: 68e3 ldr r3, [r4, #12]
  52724. 8031c8a: 8998 ldrh r0, [r3, #12]
  52725. 8031c8c: f7fc fec3 bl 802ea16 <lwip_ntohs>
  52726. 8031c90: f010 0607 ands.w r6, r0, #7
  52727. 8031c94: d005 beq.n 8031ca2 <tcp_send_fin+0x2c>
  52728. pcb->flags |= TF_FIN;
  52729. return ERR_OK;
  52730. }
  52731. }
  52732. /* no data, no length, flags, copy=1, no optdata */
  52733. return tcp_enqueue_flags(pcb, TCP_FIN);
  52734. 8031c96: 4628 mov r0, r5
  52735. 8031c98: 2101 movs r1, #1
  52736. }
  52737. 8031c9a: e8bd 40f8 ldmia.w sp!, {r3, r4, r5, r6, r7, lr}
  52738. pcb->flags |= TF_FIN;
  52739. return ERR_OK;
  52740. }
  52741. }
  52742. /* no data, no length, flags, copy=1, no optdata */
  52743. return tcp_enqueue_flags(pcb, TCP_FIN);
  52744. 8031c9e: f7ff bf9f b.w 8031be0 <tcp_enqueue_flags>
  52745. for (last_unsent = pcb->unsent; last_unsent->next != NULL;
  52746. last_unsent = last_unsent->next);
  52747. if ((TCPH_FLAGS(last_unsent->tcphdr) & (TCP_SYN | TCP_FIN | TCP_RST)) == 0) {
  52748. /* no SYN/FIN/RST flag in the header, we can add the FIN flag */
  52749. TCPH_SET_FLAG(last_unsent->tcphdr, TCP_FIN);
  52750. 8031ca2: 68e4 ldr r4, [r4, #12]
  52751. 8031ca4: 2001 movs r0, #1
  52752. 8031ca6: 89a7 ldrh r7, [r4, #12]
  52753. 8031ca8: f7fc feb0 bl 802ea0c <lwip_htons>
  52754. 8031cac: 4338 orrs r0, r7
  52755. 8031cae: 81a0 strh r0, [r4, #12]
  52756. pcb->flags |= TF_FIN;
  52757. 8031cb0: 7fab ldrb r3, [r5, #30]
  52758. 8031cb2: f043 0320 orr.w r3, r3, #32
  52759. 8031cb6: 77ab strb r3, [r5, #30]
  52760. return ERR_OK;
  52761. }
  52762. }
  52763. /* no data, no length, flags, copy=1, no optdata */
  52764. return tcp_enqueue_flags(pcb, TCP_FIN);
  52765. }
  52766. 8031cb8: 4630 mov r0, r6
  52767. 8031cba: bdf8 pop {r3, r4, r5, r6, r7, pc}
  52768. 08031cbc <tcp_send_empty_ack>:
  52769. *
  52770. * @param pcb Protocol control block for the TCP connection to send the ACK
  52771. */
  52772. err_t
  52773. tcp_send_empty_ack(struct tcp_pcb *pcb)
  52774. {
  52775. 8031cbc: b537 push {r0, r1, r2, r4, r5, lr}
  52776. 8031cbe: 4604 mov r4, r0
  52777. if (pcb->flags & TF_TIMESTAMP) {
  52778. optlen = LWIP_TCP_OPT_LENGTH(TF_SEG_OPTS_TS);
  52779. }
  52780. #endif
  52781. p = tcp_output_alloc_header(pcb, optlen, 0, htonl(pcb->snd_nxt));
  52782. 8031cc0: 6d00 ldr r0, [r0, #80] ; 0x50
  52783. 8031cc2: f7fc fead bl 802ea20 <lwip_htonl>
  52784. 8031cc6: 2100 movs r1, #0
  52785. 8031cc8: 4602 mov r2, r0
  52786. 8031cca: 4620 mov r0, r4
  52787. 8031ccc: f7ff fdd8 bl 8031880 <tcp_output_alloc_header.constprop.0>
  52788. if (p == NULL) {
  52789. 8031cd0: 4605 mov r5, r0
  52790. 8031cd2: b188 cbz r0, 8031cf8 <tcp_send_empty_ack+0x3c>
  52791. }
  52792. tcphdr = (struct tcp_hdr *)p->payload;
  52793. LWIP_DEBUGF(TCP_OUTPUT_DEBUG,
  52794. ("tcp_output: sending ACK for %"U32_F"\n", pcb->rcv_nxt));
  52795. /* remove ACK flags from the PCB, as we send an empty ACK now */
  52796. pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW);
  52797. 8031cd4: 7fa3 ldrb r3, [r4, #30]
  52798. #endif
  52799. #if LWIP_NETIF_HWADDRHINT
  52800. ip_output_hinted(p, &(pcb->local_ip), &(pcb->remote_ip), pcb->ttl, pcb->tos,
  52801. IP_PROTO_TCP, &(pcb->addr_hint));
  52802. #else /* LWIP_NETIF_HWADDRHINT*/
  52803. ip_output(p, &(pcb->local_ip), &(pcb->remote_ip), pcb->ttl, pcb->tos,
  52804. 8031cd6: 7a62 ldrb r2, [r4, #9]
  52805. }
  52806. tcphdr = (struct tcp_hdr *)p->payload;
  52807. LWIP_DEBUGF(TCP_OUTPUT_DEBUG,
  52808. ("tcp_output: sending ACK for %"U32_F"\n", pcb->rcv_nxt));
  52809. /* remove ACK flags from the PCB, as we send an empty ACK now */
  52810. pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW);
  52811. 8031cd8: f023 0303 bic.w r3, r3, #3
  52812. #endif
  52813. #if LWIP_NETIF_HWADDRHINT
  52814. ip_output_hinted(p, &(pcb->local_ip), &(pcb->remote_ip), pcb->ttl, pcb->tos,
  52815. IP_PROTO_TCP, &(pcb->addr_hint));
  52816. #else /* LWIP_NETIF_HWADDRHINT*/
  52817. ip_output(p, &(pcb->local_ip), &(pcb->remote_ip), pcb->ttl, pcb->tos,
  52818. 8031cdc: 9200 str r2, [sp, #0]
  52819. 8031cde: 2206 movs r2, #6
  52820. }
  52821. tcphdr = (struct tcp_hdr *)p->payload;
  52822. LWIP_DEBUGF(TCP_OUTPUT_DEBUG,
  52823. ("tcp_output: sending ACK for %"U32_F"\n", pcb->rcv_nxt));
  52824. /* remove ACK flags from the PCB, as we send an empty ACK now */
  52825. pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW);
  52826. 8031ce0: 77a3 strb r3, [r4, #30]
  52827. #endif
  52828. #if LWIP_NETIF_HWADDRHINT
  52829. ip_output_hinted(p, &(pcb->local_ip), &(pcb->remote_ip), pcb->ttl, pcb->tos,
  52830. IP_PROTO_TCP, &(pcb->addr_hint));
  52831. #else /* LWIP_NETIF_HWADDRHINT*/
  52832. ip_output(p, &(pcb->local_ip), &(pcb->remote_ip), pcb->ttl, pcb->tos,
  52833. 8031ce2: 9201 str r2, [sp, #4]
  52834. 8031ce4: 7aa3 ldrb r3, [r4, #10]
  52835. 8031ce6: 4621 mov r1, r4
  52836. 8031ce8: 1d22 adds r2, r4, #4
  52837. 8031cea: f001 f8ab bl 8032e44 <ip_output>
  52838. IP_PROTO_TCP);
  52839. #endif /* LWIP_NETIF_HWADDRHINT*/
  52840. pbuf_free(p);
  52841. 8031cee: 4628 mov r0, r5
  52842. 8031cf0: f7fd ffca bl 802fc88 <pbuf_free>
  52843. return ERR_OK;
  52844. 8031cf4: 2000 movs r0, #0
  52845. 8031cf6: e000 b.n 8031cfa <tcp_send_empty_ack+0x3e>
  52846. #endif
  52847. p = tcp_output_alloc_header(pcb, optlen, 0, htonl(pcb->snd_nxt));
  52848. if (p == NULL) {
  52849. LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_output: (ACK) could not allocate pbuf\n"));
  52850. return ERR_BUF;
  52851. 8031cf8: 20fe movs r0, #254 ; 0xfe
  52852. IP_PROTO_TCP);
  52853. #endif /* LWIP_NETIF_HWADDRHINT*/
  52854. pbuf_free(p);
  52855. return ERR_OK;
  52856. }
  52857. 8031cfa: b240 sxtb r0, r0
  52858. 8031cfc: bd3e pop {r1, r2, r3, r4, r5, pc}
  52859. 8031cfe: 0000 movs r0, r0
  52860. 08031d00 <tcp_output>:
  52861. /* First, check if we are invoked by the TCP input processing
  52862. code. If so, we do not output anything. Instead, we rely on the
  52863. input processing code to call us when input processing is done
  52864. with. */
  52865. if (tcp_input_pcb == pcb) {
  52866. 8031d00: 4b8f ldr r3, [pc, #572] ; (8031f40 <tcp_output+0x240>)
  52867. 8031d02: 681b ldr r3, [r3, #0]
  52868. 8031d04: 4283 cmp r3, r0
  52869. * @return ERR_OK if data has been sent or nothing to send
  52870. * another err_t on error
  52871. */
  52872. err_t
  52873. tcp_output(struct tcp_pcb *pcb)
  52874. {
  52875. 8031d06: e92d 4ff7 stmdb sp!, {r0, r1, r2, r4, r5, r6, r7, r8, r9, sl, fp, lr}
  52876. 8031d0a: 4604 mov r4, r0
  52877. /* First, check if we are invoked by the TCP input processing
  52878. code. If so, we do not output anything. Instead, we rely on the
  52879. input processing code to call us when input processing is done
  52880. with. */
  52881. if (tcp_input_pcb == pcb) {
  52882. 8031d0c: f000 8113 beq.w 8031f36 <tcp_output+0x236>
  52883. return ERR_OK;
  52884. }
  52885. wnd = LWIP_MIN(pcb->snd_wnd, pcb->cwnd);
  52886. 8031d10: f8b0 304c ldrh.w r3, [r0, #76] ; 0x4c
  52887. 8031d14: f8b0 9060 ldrh.w r9, [r0, #96] ; 0x60
  52888. seg = pcb->unsent;
  52889. 8031d18: 6ec5 ldr r5, [r0, #108] ; 0x6c
  52890. with. */
  52891. if (tcp_input_pcb == pcb) {
  52892. return ERR_OK;
  52893. }
  52894. wnd = LWIP_MIN(pcb->snd_wnd, pcb->cwnd);
  52895. 8031d1a: 4599 cmp r9, r3
  52896. 8031d1c: bf28 it cs
  52897. 8031d1e: 4699 movcs r9, r3
  52898. * because the ->unsent queue is empty or because the window does
  52899. * not allow it), construct an empty ACK segment and send it.
  52900. *
  52901. * If data is to be sent, we will just piggyback the ACK (see below).
  52902. */
  52903. if (pcb->flags & TF_ACK_NOW &&
  52904. 8031d20: 7f83 ldrb r3, [r0, #30]
  52905. 8031d22: f003 0302 and.w r3, r3, #2
  52906. 8031d26: b2db uxtb r3, r3
  52907. 8031d28: b183 cbz r3, 8031d4c <tcp_output+0x4c>
  52908. 8031d2a: b92d cbnz r5, 8031d38 <tcp_output+0x38>
  52909. (seg == NULL ||
  52910. ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len > wnd)) {
  52911. return tcp_send_empty_ack(pcb);
  52912. 8031d2c: 4620 mov r0, r4
  52913. }
  52914. #endif /* TCP_OVERSIZE */
  52915. pcb->flags &= ~TF_NAGLEMEMERR;
  52916. return ERR_OK;
  52917. }
  52918. 8031d2e: b003 add sp, #12
  52919. 8031d30: e8bd 4ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  52920. * If data is to be sent, we will just piggyback the ACK (see below).
  52921. */
  52922. if (pcb->flags & TF_ACK_NOW &&
  52923. (seg == NULL ||
  52924. ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len > wnd)) {
  52925. return tcp_send_empty_ack(pcb);
  52926. 8031d34: f7ff bfc2 b.w 8031cbc <tcp_send_empty_ack>
  52927. *
  52928. * If data is to be sent, we will just piggyback the ACK (see below).
  52929. */
  52930. if (pcb->flags & TF_ACK_NOW &&
  52931. (seg == NULL ||
  52932. ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len > wnd)) {
  52933. 8031d38: 68eb ldr r3, [r5, #12]
  52934. 8031d3a: 6858 ldr r0, [r3, #4]
  52935. 8031d3c: f7fc fe72 bl 802ea24 <lwip_ntohl>
  52936. 8031d40: 892a ldrh r2, [r5, #8]
  52937. 8031d42: 6ca3 ldr r3, [r4, #72] ; 0x48
  52938. 8031d44: 1ad3 subs r3, r2, r3
  52939. 8031d46: 1818 adds r0, r3, r0
  52940. * not allow it), construct an empty ACK segment and send it.
  52941. *
  52942. * If data is to be sent, we will just piggyback the ACK (see below).
  52943. */
  52944. if (pcb->flags & TF_ACK_NOW &&
  52945. (seg == NULL ||
  52946. 8031d48: 4548 cmp r0, r9
  52947. 8031d4a: d8ef bhi.n 8031d2c <tcp_output+0x2c>
  52948. ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len > wnd)) {
  52949. return tcp_send_empty_ack(pcb);
  52950. }
  52951. /* useg should point to last segment on unacked queue */
  52952. useg = pcb->unacked;
  52953. 8031d4c: 6f26 ldr r6, [r4, #112] ; 0x70
  52954. if (useg != NULL) {
  52955. 8031d4e: b90e cbnz r6, 8031d54 <tcp_output+0x54>
  52956. 8031d50: e0d1 b.n 8031ef6 <tcp_output+0x1f6>
  52957. for (; useg->next != NULL; useg = useg->next);
  52958. 8031d52: 461e mov r6, r3
  52959. 8031d54: 6833 ldr r3, [r6, #0]
  52960. 8031d56: 2b00 cmp r3, #0
  52961. 8031d58: d1fb bne.n 8031d52 <tcp_output+0x52>
  52962. 8031d5a: e0cc b.n 8031ef6 <tcp_output+0x1f6>
  52963. }
  52964. #endif /* TCP_CWND_DEBUG */
  52965. /* data available and window allows it to be sent? */
  52966. while (seg != NULL &&
  52967. ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len <= wnd) {
  52968. LWIP_ASSERT("RST not expected here!",
  52969. 8031d5c: 68eb ldr r3, [r5, #12]
  52970. 8031d5e: 8998 ldrh r0, [r3, #12]
  52971. 8031d60: f7fc fe59 bl 802ea16 <lwip_ntohs>
  52972. * - if tcp_write had a memory error before (prevent delayed ACK timeout) or
  52973. * - if FIN was already enqueued for this PCB (SYN is always alone in a segment -
  52974. * either seg->next != NULL or pcb->unacked == NULL;
  52975. * RST is no sent using tcp_write/tcp_output.
  52976. */
  52977. if((tcp_do_output_nagle(pcb) == 0) &&
  52978. 8031d64: 6f23 ldr r3, [r4, #112] ; 0x70
  52979. 8031d66: b19b cbz r3, 8031d90 <tcp_output+0x90>
  52980. 8031d68: 7fa2 ldrb r2, [r4, #30]
  52981. 8031d6a: f012 0f44 tst.w r2, #68 ; 0x44
  52982. 8031d6e: d10f bne.n 8031d90 <tcp_output+0x90>
  52983. 8031d70: 6ee3 ldr r3, [r4, #108] ; 0x6c
  52984. 8031d72: b12b cbz r3, 8031d80 <tcp_output+0x80>
  52985. 8031d74: 6819 ldr r1, [r3, #0]
  52986. 8031d76: b959 cbnz r1, 8031d90 <tcp_output+0x90>
  52987. 8031d78: 8919 ldrh r1, [r3, #8]
  52988. 8031d7a: 8ee3 ldrh r3, [r4, #54] ; 0x36
  52989. 8031d7c: 4299 cmp r1, r3
  52990. 8031d7e: d207 bcs.n 8031d90 <tcp_output+0x90>
  52991. 8031d80: f8b4 3066 ldrh.w r3, [r4, #102] ; 0x66
  52992. 8031d84: b123 cbz r3, 8031d90 <tcp_output+0x90>
  52993. 8031d86: f8b4 3068 ldrh.w r3, [r4, #104] ; 0x68
  52994. 8031d8a: 2b47 cmp r3, #71 ; 0x47
  52995. 8031d8c: f240 80ce bls.w 8031f2c <tcp_output+0x22c>
  52996. pcb->lastack,
  52997. ntohl(seg->tcphdr->seqno), pcb->lastack, i));
  52998. ++i;
  52999. #endif /* TCP_CWND_DEBUG */
  53000. pcb->unsent = seg->next;
  53001. 8031d90: 682b ldr r3, [r5, #0]
  53002. 8031d92: 66e3 str r3, [r4, #108] ; 0x6c
  53003. if (pcb->state != SYN_SENT) {
  53004. 8031d94: 7e23 ldrb r3, [r4, #24]
  53005. 8031d96: 2b02 cmp r3, #2
  53006. 8031d98: d00c beq.n 8031db4 <tcp_output+0xb4>
  53007. TCPH_SET_FLAG(seg->tcphdr, TCP_ACK);
  53008. 8031d9a: 68ef ldr r7, [r5, #12]
  53009. 8031d9c: 2010 movs r0, #16
  53010. 8031d9e: f8b7 b00c ldrh.w fp, [r7, #12]
  53011. 8031da2: f7fc fe33 bl 802ea0c <lwip_htons>
  53012. 8031da6: ea40 000b orr.w r0, r0, fp
  53013. 8031daa: 81b8 strh r0, [r7, #12]
  53014. pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW);
  53015. 8031dac: 7fa3 ldrb r3, [r4, #30]
  53016. 8031dae: f023 0303 bic.w r3, r3, #3
  53017. 8031db2: 77a3 strb r3, [r4, #30]
  53018. u16_t len;
  53019. struct netif *netif;
  53020. u32_t *opts;
  53021. /** @bug Exclude retransmitted segments from this count. */
  53022. snmp_inc_tcpoutsegs();
  53023. 8031db4: f002 fd64 bl 8034880 <snmp_inc_tcpoutsegs>
  53024. /* The TCP header has already been constructed, but the ackno and
  53025. wnd fields remain. */
  53026. seg->tcphdr->ackno = htonl(pcb->rcv_nxt);
  53027. 8031db8: 6aa0 ldr r0, [r4, #40] ; 0x28
  53028. 8031dba: 68ef ldr r7, [r5, #12]
  53029. 8031dbc: f7fc fe30 bl 802ea20 <lwip_htonl>
  53030. 8031dc0: 60b8 str r0, [r7, #8]
  53031. /* advertise our receive window size in this TCP segment */
  53032. seg->tcphdr->wnd = htons(pcb->rcv_ann_wnd);
  53033. 8031dc2: 8de0 ldrh r0, [r4, #46] ; 0x2e
  53034. 8031dc4: 68ef ldr r7, [r5, #12]
  53035. 8031dc6: f7fc fe21 bl 802ea0c <lwip_htons>
  53036. 8031dca: 81f8 strh r0, [r7, #14]
  53037. pcb->rcv_ann_right_edge = pcb->rcv_nxt + pcb->rcv_ann_wnd;
  53038. 8031dcc: 8de2 ldrh r2, [r4, #46] ; 0x2e
  53039. 8031dce: 6aa3 ldr r3, [r4, #40] ; 0x28
  53040. /* Add any requested options. NB MSS option is only set on SYN
  53041. packets, so ignore it here */
  53042. opts = (u32_t *)(void *)(seg->tcphdr + 1);
  53043. 8031dd0: 68ef ldr r7, [r5, #12]
  53044. seg->tcphdr->ackno = htonl(pcb->rcv_nxt);
  53045. /* advertise our receive window size in this TCP segment */
  53046. seg->tcphdr->wnd = htons(pcb->rcv_ann_wnd);
  53047. pcb->rcv_ann_right_edge = pcb->rcv_nxt + pcb->rcv_ann_wnd;
  53048. 8031dd2: 18d3 adds r3, r2, r3
  53049. 8031dd4: 6323 str r3, [r4, #48] ; 0x30
  53050. /* Add any requested options. NB MSS option is only set on SYN
  53051. packets, so ignore it here */
  53052. opts = (u32_t *)(void *)(seg->tcphdr + 1);
  53053. if (seg->flags & TF_SEG_OPTS_MSS) {
  53054. 8031dd6: 7aab ldrb r3, [r5, #10]
  53055. 8031dd8: 07d8 lsls r0, r3, #31
  53056. 8031dda: d509 bpl.n 8031df0 <tcp_output+0xf0>
  53057. u16_t mss;
  53058. #if TCP_CALCULATE_EFF_SEND_MSS
  53059. mss = tcp_eff_send_mss(TCP_MSS, &pcb->remote_ip);
  53060. 8031ddc: 4641 mov r1, r8
  53061. 8031dde: f240 50b4 movw r0, #1460 ; 0x5b4
  53062. 8031de2: f7fe fde4 bl 80309ae <tcp_eff_send_mss>
  53063. #else /* TCP_CALCULATE_EFF_SEND_MSS */
  53064. mss = TCP_MSS;
  53065. #endif /* TCP_CALCULATE_EFF_SEND_MSS */
  53066. *opts = TCP_BUILD_MSS_OPTION(mss);
  53067. 8031de6: f040 7001 orr.w r0, r0, #33816576 ; 0x2040000
  53068. 8031dea: f7fc fe19 bl 802ea20 <lwip_htonl>
  53069. 8031dee: 6178 str r0, [r7, #20]
  53070. }
  53071. #endif
  53072. /* Set retransmission timer running if it is not currently enabled
  53073. This must be set before checking the route. */
  53074. if (pcb->rtime == -1) {
  53075. 8031df0: f9b4 3034 ldrsh.w r3, [r4, #52] ; 0x34
  53076. 8031df4: 3301 adds r3, #1
  53077. 8031df6: d101 bne.n 8031dfc <tcp_output+0xfc>
  53078. pcb->rtime = 0;
  53079. 8031df8: 2300 movs r3, #0
  53080. 8031dfa: 86a3 strh r3, [r4, #52] ; 0x34
  53081. }
  53082. /* If we don't have a local IP address, we get one by
  53083. calling ip_route(). */
  53084. if (ip_addr_isany(&(pcb->local_ip))) {
  53085. 8031dfc: 6823 ldr r3, [r4, #0]
  53086. 8031dfe: b92b cbnz r3, 8031e0c <tcp_output+0x10c>
  53087. netif = ip_route(&(pcb->remote_ip));
  53088. 8031e00: 4640 mov r0, r8
  53089. 8031e02: f000 fecb bl 8032b9c <ip_route>
  53090. if (netif == NULL) {
  53091. 8031e06: b310 cbz r0, 8031e4e <tcp_output+0x14e>
  53092. return;
  53093. }
  53094. ip_addr_copy(pcb->local_ip, netif->ip_addr);
  53095. 8031e08: 6843 ldr r3, [r0, #4]
  53096. 8031e0a: 6023 str r3, [r4, #0]
  53097. }
  53098. if (pcb->rttest == 0) {
  53099. 8031e0c: 6ba3 ldr r3, [r4, #56] ; 0x38
  53100. 8031e0e: b93b cbnz r3, 8031e20 <tcp_output+0x120>
  53101. pcb->rttest = tcp_ticks;
  53102. 8031e10: f8da 3000 ldr.w r3, [sl]
  53103. 8031e14: 63a3 str r3, [r4, #56] ; 0x38
  53104. pcb->rtseq = ntohl(seg->tcphdr->seqno);
  53105. 8031e16: 68eb ldr r3, [r5, #12]
  53106. 8031e18: 6858 ldr r0, [r3, #4]
  53107. 8031e1a: f7fc fe03 bl 802ea24 <lwip_ntohl>
  53108. 8031e1e: 63e0 str r0, [r4, #60] ; 0x3c
  53109. }
  53110. LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_output_segment: %"U32_F":%"U32_F"\n",
  53111. htonl(seg->tcphdr->seqno), htonl(seg->tcphdr->seqno) +
  53112. seg->len));
  53113. len = (u16_t)((u8_t *)seg->tcphdr - (u8_t *)seg->p->payload);
  53114. 8031e20: 6868 ldr r0, [r5, #4]
  53115. 8031e22: 68eb ldr r3, [r5, #12]
  53116. 8031e24: 6842 ldr r2, [r0, #4]
  53117. seg->p->len -= len;
  53118. 8031e26: 8941 ldrh r1, [r0, #10]
  53119. seg->p->tot_len -= len;
  53120. seg->p->payload = seg->tcphdr;
  53121. 8031e28: 6043 str r3, [r0, #4]
  53122. }
  53123. LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_output_segment: %"U32_F":%"U32_F"\n",
  53124. htonl(seg->tcphdr->seqno), htonl(seg->tcphdr->seqno) +
  53125. seg->len));
  53126. len = (u16_t)((u8_t *)seg->tcphdr - (u8_t *)seg->p->payload);
  53127. 8031e2a: 1a9a subs r2, r3, r2
  53128. seg->p->len -= len;
  53129. 8031e2c: 1a89 subs r1, r1, r2
  53130. 8031e2e: 8141 strh r1, [r0, #10]
  53131. seg->p->tot_len -= len;
  53132. 8031e30: 8901 ldrh r1, [r0, #8]
  53133. 8031e32: 1a8a subs r2, r1, r2
  53134. 8031e34: 8102 strh r2, [r0, #8]
  53135. seg->p->payload = seg->tcphdr;
  53136. seg->tcphdr->chksum = 0;
  53137. 8031e36: 2200 movs r2, #0
  53138. 8031e38: 741a strb r2, [r3, #16]
  53139. 8031e3a: 745a strb r2, [r3, #17]
  53140. #if LWIP_NETIF_HWADDRHINT
  53141. ip_output_hinted(seg->p, &(pcb->local_ip), &(pcb->remote_ip), pcb->ttl, pcb->tos,
  53142. IP_PROTO_TCP, &(pcb->addr_hint));
  53143. #else /* LWIP_NETIF_HWADDRHINT*/
  53144. ip_output(seg->p, &(pcb->local_ip), &(pcb->remote_ip), pcb->ttl, pcb->tos,
  53145. 8031e3c: 7a62 ldrb r2, [r4, #9]
  53146. 8031e3e: 7aa3 ldrb r3, [r4, #10]
  53147. 8031e40: 9200 str r2, [sp, #0]
  53148. 8031e42: 2206 movs r2, #6
  53149. 8031e44: 9201 str r2, [sp, #4]
  53150. 8031e46: 4621 mov r1, r4
  53151. 8031e48: 4642 mov r2, r8
  53152. 8031e4a: f000 fffb bl 8032e44 <ip_output>
  53153. TCPH_SET_FLAG(seg->tcphdr, TCP_ACK);
  53154. pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW);
  53155. }
  53156. tcp_output_segment(seg, pcb);
  53157. snd_nxt = ntohl(seg->tcphdr->seqno) + TCP_TCPLEN(seg);
  53158. 8031e4e: 68eb ldr r3, [r5, #12]
  53159. 8031e50: 6858 ldr r0, [r3, #4]
  53160. 8031e52: f7fc fde7 bl 802ea24 <lwip_ntohl>
  53161. 8031e56: 68ea ldr r2, [r5, #12]
  53162. 8031e58: f8b5 b008 ldrh.w fp, [r5, #8]
  53163. 8031e5c: 4607 mov r7, r0
  53164. 8031e5e: 8990 ldrh r0, [r2, #12]
  53165. 8031e60: f7fc fdd9 bl 802ea16 <lwip_ntohs>
  53166. 8031e64: f010 0003 ands.w r0, r0, #3
  53167. 8031e68: bf18 it ne
  53168. 8031e6a: 2001 movne r0, #1
  53169. if (TCP_SEQ_LT(pcb->snd_nxt, snd_nxt)) {
  53170. 8031e6c: 6d22 ldr r2, [r4, #80] ; 0x50
  53171. TCPH_SET_FLAG(seg->tcphdr, TCP_ACK);
  53172. pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW);
  53173. }
  53174. tcp_output_segment(seg, pcb);
  53175. snd_nxt = ntohl(seg->tcphdr->seqno) + TCP_TCPLEN(seg);
  53176. 8031e6e: eb0b 0300 add.w r3, fp, r0
  53177. 8031e72: 19db adds r3, r3, r7
  53178. if (TCP_SEQ_LT(pcb->snd_nxt, snd_nxt)) {
  53179. 8031e74: 1ad2 subs r2, r2, r3
  53180. 8031e76: 2a00 cmp r2, #0
  53181. pcb->snd_nxt = snd_nxt;
  53182. 8031e78: bfb8 it lt
  53183. 8031e7a: 6523 strlt r3, [r4, #80] ; 0x50
  53184. }
  53185. /* put segment on unacknowledged list if length > 0 */
  53186. if (TCP_TCPLEN(seg) > 0) {
  53187. 8031e7c: 68eb ldr r3, [r5, #12]
  53188. 8031e7e: 892f ldrh r7, [r5, #8]
  53189. 8031e80: 8998 ldrh r0, [r3, #12]
  53190. 8031e82: f7fc fdc8 bl 802ea16 <lwip_ntohs>
  53191. 8031e86: f010 0003 ands.w r0, r0, #3
  53192. 8031e8a: bf18 it ne
  53193. 8031e8c: 2001 movne r0, #1
  53194. 8031e8e: 1838 adds r0, r7, r0
  53195. 8031e90: b360 cbz r0, 8031eec <tcp_output+0x1ec>
  53196. seg->next = NULL;
  53197. 8031e92: 2300 movs r3, #0
  53198. 8031e94: 602b str r3, [r5, #0]
  53199. /* unacked list is empty? */
  53200. if (pcb->unacked == NULL) {
  53201. 8031e96: 6f23 ldr r3, [r4, #112] ; 0x70
  53202. 8031e98: b90b cbnz r3, 8031e9e <tcp_output+0x19e>
  53203. pcb->unacked = seg;
  53204. 8031e9a: 6725 str r5, [r4, #112] ; 0x70
  53205. 8031e9c: e024 b.n 8031ee8 <tcp_output+0x1e8>
  53206. /* unacked list is not empty? */
  53207. } else {
  53208. /* In the case of fast retransmit, the packet should not go to the tail
  53209. * of the unacked queue, but rather somewhere before it. We need to check for
  53210. * this case. -STJ Jul 27, 2004 */
  53211. if (TCP_SEQ_LT(ntohl(seg->tcphdr->seqno), ntohl(useg->tcphdr->seqno))) {
  53212. 8031e9e: 68eb ldr r3, [r5, #12]
  53213. 8031ea0: 6858 ldr r0, [r3, #4]
  53214. 8031ea2: f7fc fdbf bl 802ea24 <lwip_ntohl>
  53215. 8031ea6: 68f3 ldr r3, [r6, #12]
  53216. 8031ea8: 4607 mov r7, r0
  53217. 8031eaa: 6858 ldr r0, [r3, #4]
  53218. 8031eac: f7fc fdba bl 802ea24 <lwip_ntohl>
  53219. 8031eb0: 1a38 subs r0, r7, r0
  53220. 8031eb2: 2800 cmp r0, #0
  53221. 8031eb4: da17 bge.n 8031ee6 <tcp_output+0x1e6>
  53222. /* add segment to before tail of unacked list, keeping the list sorted */
  53223. struct tcp_seg **cur_seg = &(pcb->unacked);
  53224. 8031eb6: f104 0770 add.w r7, r4, #112 ; 0x70
  53225. while (*cur_seg &&
  53226. 8031eba: e000 b.n 8031ebe <tcp_output+0x1be>
  53227. TCP_SEQ_LT(ntohl((*cur_seg)->tcphdr->seqno), ntohl(seg->tcphdr->seqno))) {
  53228. cur_seg = &((*cur_seg)->next );
  53229. 8031ebc: 683f ldr r7, [r7, #0]
  53230. * of the unacked queue, but rather somewhere before it. We need to check for
  53231. * this case. -STJ Jul 27, 2004 */
  53232. if (TCP_SEQ_LT(ntohl(seg->tcphdr->seqno), ntohl(useg->tcphdr->seqno))) {
  53233. /* add segment to before tail of unacked list, keeping the list sorted */
  53234. struct tcp_seg **cur_seg = &(pcb->unacked);
  53235. while (*cur_seg &&
  53236. 8031ebe: 683b ldr r3, [r7, #0]
  53237. 8031ec0: b91b cbnz r3, 8031eca <tcp_output+0x1ca>
  53238. TCP_SEQ_LT(ntohl((*cur_seg)->tcphdr->seqno), ntohl(seg->tcphdr->seqno))) {
  53239. cur_seg = &((*cur_seg)->next );
  53240. }
  53241. seg->next = (*cur_seg);
  53242. 8031ec2: 683b ldr r3, [r7, #0]
  53243. 8031ec4: 602b str r3, [r5, #0]
  53244. (*cur_seg) = seg;
  53245. 8031ec6: 603d str r5, [r7, #0]
  53246. 8031ec8: e013 b.n 8031ef2 <tcp_output+0x1f2>
  53247. * this case. -STJ Jul 27, 2004 */
  53248. if (TCP_SEQ_LT(ntohl(seg->tcphdr->seqno), ntohl(useg->tcphdr->seqno))) {
  53249. /* add segment to before tail of unacked list, keeping the list sorted */
  53250. struct tcp_seg **cur_seg = &(pcb->unacked);
  53251. while (*cur_seg &&
  53252. TCP_SEQ_LT(ntohl((*cur_seg)->tcphdr->seqno), ntohl(seg->tcphdr->seqno))) {
  53253. 8031eca: 68db ldr r3, [r3, #12]
  53254. 8031ecc: 6858 ldr r0, [r3, #4]
  53255. 8031ece: f7fc fda9 bl 802ea24 <lwip_ntohl>
  53256. 8031ed2: 68eb ldr r3, [r5, #12]
  53257. 8031ed4: 4683 mov fp, r0
  53258. 8031ed6: 6858 ldr r0, [r3, #4]
  53259. 8031ed8: f7fc fda4 bl 802ea24 <lwip_ntohl>
  53260. 8031edc: ebc0 000b rsb r0, r0, fp
  53261. * of the unacked queue, but rather somewhere before it. We need to check for
  53262. * this case. -STJ Jul 27, 2004 */
  53263. if (TCP_SEQ_LT(ntohl(seg->tcphdr->seqno), ntohl(useg->tcphdr->seqno))) {
  53264. /* add segment to before tail of unacked list, keeping the list sorted */
  53265. struct tcp_seg **cur_seg = &(pcb->unacked);
  53266. while (*cur_seg &&
  53267. 8031ee0: 2800 cmp r0, #0
  53268. 8031ee2: dbeb blt.n 8031ebc <tcp_output+0x1bc>
  53269. 8031ee4: e7ed b.n 8031ec2 <tcp_output+0x1c2>
  53270. }
  53271. seg->next = (*cur_seg);
  53272. (*cur_seg) = seg;
  53273. } else {
  53274. /* add segment to tail of unacked list */
  53275. useg->next = seg;
  53276. 8031ee6: 6035 str r5, [r6, #0]
  53277. 8031ee8: 462e mov r6, r5
  53278. 8031eea: e002 b.n 8031ef2 <tcp_output+0x1f2>
  53279. useg = useg->next;
  53280. }
  53281. }
  53282. /* do not queue empty segments on the unacked list */
  53283. } else {
  53284. tcp_seg_free(seg);
  53285. 8031eec: 4628 mov r0, r5
  53286. 8031eee: f7fe f978 bl 80301e2 <tcp_seg_free>
  53287. }
  53288. seg = pcb->unsent;
  53289. 8031ef2: 6ee5 ldr r5, [r4, #108] ; 0x6c
  53290. 8031ef4: e003 b.n 8031efe <tcp_output+0x1fe>
  53291. }
  53292. ip_addr_copy(pcb->local_ip, netif->ip_addr);
  53293. }
  53294. if (pcb->rttest == 0) {
  53295. pcb->rttest = tcp_ticks;
  53296. 8031ef6: f8df a04c ldr.w sl, [pc, #76] ; 8031f44 <tcp_output+0x244>
  53297. packets, so ignore it here */
  53298. opts = (u32_t *)(void *)(seg->tcphdr + 1);
  53299. if (seg->flags & TF_SEG_OPTS_MSS) {
  53300. u16_t mss;
  53301. #if TCP_CALCULATE_EFF_SEND_MSS
  53302. mss = tcp_eff_send_mss(TCP_MSS, &pcb->remote_ip);
  53303. 8031efa: f104 0804 add.w r8, r4, #4
  53304. ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len,
  53305. ntohl(seg->tcphdr->seqno), pcb->lastack));
  53306. }
  53307. #endif /* TCP_CWND_DEBUG */
  53308. /* data available and window allows it to be sent? */
  53309. while (seg != NULL &&
  53310. 8031efe: b915 cbnz r5, 8031f06 <tcp_output+0x206>
  53311. tcp_seg_free(seg);
  53312. }
  53313. seg = pcb->unsent;
  53314. }
  53315. #if TCP_OVERSIZE
  53316. if (pcb->unsent == NULL) {
  53317. 8031f00: 6ee3 ldr r3, [r4, #108] ; 0x6c
  53318. 8031f02: b973 cbnz r3, 8031f22 <tcp_output+0x222>
  53319. 8031f04: e00b b.n 8031f1e <tcp_output+0x21e>
  53320. ntohl(seg->tcphdr->seqno), pcb->lastack));
  53321. }
  53322. #endif /* TCP_CWND_DEBUG */
  53323. /* data available and window allows it to be sent? */
  53324. while (seg != NULL &&
  53325. ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len <= wnd) {
  53326. 8031f06: 68eb ldr r3, [r5, #12]
  53327. 8031f08: 6858 ldr r0, [r3, #4]
  53328. 8031f0a: f7fc fd8b bl 802ea24 <lwip_ntohl>
  53329. 8031f0e: 892a ldrh r2, [r5, #8]
  53330. 8031f10: 6ca3 ldr r3, [r4, #72] ; 0x48
  53331. 8031f12: 1ad3 subs r3, r2, r3
  53332. 8031f14: 1818 adds r0, r3, r0
  53333. ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len,
  53334. ntohl(seg->tcphdr->seqno), pcb->lastack));
  53335. }
  53336. #endif /* TCP_CWND_DEBUG */
  53337. /* data available and window allows it to be sent? */
  53338. while (seg != NULL &&
  53339. 8031f16: 4548 cmp r0, r9
  53340. 8031f18: f67f af20 bls.w 8031d5c <tcp_output+0x5c>
  53341. 8031f1c: e7f0 b.n 8031f00 <tcp_output+0x200>
  53342. seg = pcb->unsent;
  53343. }
  53344. #if TCP_OVERSIZE
  53345. if (pcb->unsent == NULL) {
  53346. /* last unsent has been removed, reset unsent_oversize */
  53347. pcb->unsent_oversize = 0;
  53348. 8031f1e: f8a4 306a strh.w r3, [r4, #106] ; 0x6a
  53349. }
  53350. #endif /* TCP_OVERSIZE */
  53351. pcb->flags &= ~TF_NAGLEMEMERR;
  53352. 8031f22: 7fa3 ldrb r3, [r4, #30]
  53353. 8031f24: f003 037f and.w r3, r3, #127 ; 0x7f
  53354. 8031f28: 77a3 strb r3, [r4, #30]
  53355. return ERR_OK;
  53356. 8031f2a: e004 b.n 8031f36 <tcp_output+0x236>
  53357. * - if tcp_write had a memory error before (prevent delayed ACK timeout) or
  53358. * - if FIN was already enqueued for this PCB (SYN is always alone in a segment -
  53359. * either seg->next != NULL or pcb->unacked == NULL;
  53360. * RST is no sent using tcp_write/tcp_output.
  53361. */
  53362. if((tcp_do_output_nagle(pcb) == 0) &&
  53363. 8031f2c: f012 0fa0 tst.w r2, #160 ; 0xa0
  53364. 8031f30: f47f af2e bne.w 8031d90 <tcp_output+0x90>
  53365. 8031f34: e7e4 b.n 8031f00 <tcp_output+0x200>
  53366. }
  53367. #endif /* TCP_OVERSIZE */
  53368. pcb->flags &= ~TF_NAGLEMEMERR;
  53369. return ERR_OK;
  53370. }
  53371. 8031f36: 2000 movs r0, #0
  53372. 8031f38: b003 add sp, #12
  53373. 8031f3a: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  53374. 8031f3e: bf00 nop
  53375. 8031f40: 2000ff38 .word 0x2000ff38
  53376. 8031f44: 2000ff24 .word 0x2000ff24
  53377. 08031f48 <tcp_rst>:
  53378. */
  53379. void
  53380. tcp_rst(u32_t seqno, u32_t ackno,
  53381. ip_addr_t *local_ip, ip_addr_t *remote_ip,
  53382. u16_t local_port, u16_t remote_port)
  53383. {
  53384. 8031f48: e92d 4ff7 stmdb sp!, {r0, r1, r2, r4, r5, r6, r7, r8, r9, sl, fp, lr}
  53385. 8031f4c: 4681 mov r9, r0
  53386. 8031f4e: 460d mov r5, r1
  53387. 8031f50: 4690 mov r8, r2
  53388. struct pbuf *p;
  53389. struct tcp_hdr *tcphdr;
  53390. p = pbuf_alloc(PBUF_IP, TCP_HLEN, PBUF_RAM);
  53391. 8031f52: 2001 movs r0, #1
  53392. 8031f54: 2114 movs r1, #20
  53393. 8031f56: 2200 movs r2, #0
  53394. */
  53395. void
  53396. tcp_rst(u32_t seqno, u32_t ackno,
  53397. ip_addr_t *local_ip, ip_addr_t *remote_ip,
  53398. u16_t local_port, u16_t remote_port)
  53399. {
  53400. 8031f58: 461f mov r7, r3
  53401. 8031f5a: f8bd b030 ldrh.w fp, [sp, #48] ; 0x30
  53402. 8031f5e: f8bd a034 ldrh.w sl, [sp, #52] ; 0x34
  53403. struct pbuf *p;
  53404. struct tcp_hdr *tcphdr;
  53405. p = pbuf_alloc(PBUF_IP, TCP_HLEN, PBUF_RAM);
  53406. 8031f62: f7fd fede bl 802fd22 <pbuf_alloc>
  53407. if (p == NULL) {
  53408. 8031f66: 4606 mov r6, r0
  53409. 8031f68: 2800 cmp r0, #0
  53410. 8031f6a: d030 beq.n 8031fce <tcp_rst+0x86>
  53411. return;
  53412. }
  53413. LWIP_ASSERT("check that first pbuf can hold struct tcp_hdr",
  53414. (p->len >= sizeof(struct tcp_hdr)));
  53415. tcphdr = (struct tcp_hdr *)p->payload;
  53416. 8031f6c: 6844 ldr r4, [r0, #4]
  53417. tcphdr->src = htons(local_port);
  53418. 8031f6e: 4658 mov r0, fp
  53419. 8031f70: f7fc fd4c bl 802ea0c <lwip_htons>
  53420. 8031f74: 8020 strh r0, [r4, #0]
  53421. tcphdr->dest = htons(remote_port);
  53422. 8031f76: 4650 mov r0, sl
  53423. 8031f78: f7fc fd48 bl 802ea0c <lwip_htons>
  53424. 8031f7c: 8060 strh r0, [r4, #2]
  53425. tcphdr->seqno = htonl(seqno);
  53426. 8031f7e: 4648 mov r0, r9
  53427. 8031f80: f7fc fd4e bl 802ea20 <lwip_htonl>
  53428. 8031f84: 6060 str r0, [r4, #4]
  53429. tcphdr->ackno = htonl(ackno);
  53430. 8031f86: 4628 mov r0, r5
  53431. 8031f88: f7fc fd4a bl 802ea20 <lwip_htonl>
  53432. 8031f8c: 60a0 str r0, [r4, #8]
  53433. TCPH_HDRLEN_FLAGS_SET(tcphdr, TCP_HLEN/4, TCP_RST | TCP_ACK);
  53434. 8031f8e: f245 0014 movw r0, #20500 ; 0x5014
  53435. 8031f92: f7fc fd3b bl 802ea0c <lwip_htons>
  53436. tcphdr->wnd = PP_HTONS(TCP_WND);
  53437. 8031f96: 2316 movs r3, #22
  53438. 8031f98: 2500 movs r5, #0
  53439. 8031f9a: 73a3 strb r3, [r4, #14]
  53440. 8031f9c: f06f 032f mvn.w r3, #47 ; 0x2f
  53441. tcphdr = (struct tcp_hdr *)p->payload;
  53442. tcphdr->src = htons(local_port);
  53443. tcphdr->dest = htons(remote_port);
  53444. tcphdr->seqno = htonl(seqno);
  53445. tcphdr->ackno = htonl(ackno);
  53446. TCPH_HDRLEN_FLAGS_SET(tcphdr, TCP_HLEN/4, TCP_RST | TCP_ACK);
  53447. 8031fa0: 81a0 strh r0, [r4, #12]
  53448. tcphdr->wnd = PP_HTONS(TCP_WND);
  53449. 8031fa2: 73e3 strb r3, [r4, #15]
  53450. tcphdr->chksum = 0;
  53451. 8031fa4: 7425 strb r5, [r4, #16]
  53452. 8031fa6: 7465 strb r5, [r4, #17]
  53453. tcphdr->urgp = 0;
  53454. 8031fa8: 74a5 strb r5, [r4, #18]
  53455. 8031faa: 74e5 strb r5, [r4, #19]
  53456. #if CHECKSUM_GEN_TCP
  53457. tcphdr->chksum = inet_chksum_pseudo(p, local_ip, remote_ip,
  53458. IP_PROTO_TCP, p->tot_len);
  53459. #endif
  53460. TCP_STATS_INC(tcp.xmit);
  53461. snmp_inc_tcpoutrsts();
  53462. 8031fac: f002 fc80 bl 80348b0 <snmp_inc_tcpoutrsts>
  53463. /* Send output with hardcoded TTL since we have no access to the pcb */
  53464. ip_output(p, local_ip, remote_ip, TCP_TTL, 0, IP_PROTO_TCP);
  53465. 8031fb0: 2306 movs r3, #6
  53466. 8031fb2: 9301 str r3, [sp, #4]
  53467. 8031fb4: 9500 str r5, [sp, #0]
  53468. 8031fb6: 4630 mov r0, r6
  53469. 8031fb8: 4641 mov r1, r8
  53470. 8031fba: 463a mov r2, r7
  53471. 8031fbc: 23ff movs r3, #255 ; 0xff
  53472. 8031fbe: f000 ff41 bl 8032e44 <ip_output>
  53473. pbuf_free(p);
  53474. 8031fc2: 4630 mov r0, r6
  53475. LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_rst: seqno %"U32_F" ackno %"U32_F".\n", seqno, ackno));
  53476. }
  53477. 8031fc4: b003 add sp, #12
  53478. 8031fc6: e8bd 4ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  53479. #endif
  53480. TCP_STATS_INC(tcp.xmit);
  53481. snmp_inc_tcpoutrsts();
  53482. /* Send output with hardcoded TTL since we have no access to the pcb */
  53483. ip_output(p, local_ip, remote_ip, TCP_TTL, 0, IP_PROTO_TCP);
  53484. pbuf_free(p);
  53485. 8031fca: f7fd be5d b.w 802fc88 <pbuf_free>
  53486. LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_rst: seqno %"U32_F" ackno %"U32_F".\n", seqno, ackno));
  53487. }
  53488. 8031fce: b003 add sp, #12
  53489. 8031fd0: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  53490. 08031fd4 <tcp_rexmit_rto>:
  53491. void
  53492. tcp_rexmit_rto(struct tcp_pcb *pcb)
  53493. {
  53494. struct tcp_seg *seg;
  53495. if (pcb->unacked == NULL) {
  53496. 8031fd4: 6f02 ldr r2, [r0, #112] ; 0x70
  53497. *
  53498. * @param pcb the tcp_pcb for which to re-enqueue all unacked segments
  53499. */
  53500. void
  53501. tcp_rexmit_rto(struct tcp_pcb *pcb)
  53502. {
  53503. 8031fd6: b510 push {r4, lr}
  53504. struct tcp_seg *seg;
  53505. if (pcb->unacked == NULL) {
  53506. 8031fd8: b19a cbz r2, 8032002 <tcp_rexmit_rto+0x2e>
  53507. 8031fda: 4611 mov r1, r2
  53508. 8031fdc: e000 b.n 8031fe0 <tcp_rexmit_rto+0xc>
  53509. return;
  53510. }
  53511. /* Move all unacked segments to the head of the unsent queue */
  53512. for (seg = pcb->unacked; seg->next != NULL; seg = seg->next);
  53513. 8031fde: 4619 mov r1, r3
  53514. 8031fe0: 680b ldr r3, [r1, #0]
  53515. 8031fe2: 2b00 cmp r3, #0
  53516. 8031fe4: d1fb bne.n 8031fde <tcp_rexmit_rto+0xa>
  53517. /* concatenate unsent queue after unacked queue */
  53518. seg->next = pcb->unsent;
  53519. 8031fe6: 6ec4 ldr r4, [r0, #108] ; 0x6c
  53520. 8031fe8: 600c str r4, [r1, #0]
  53521. /* unsent queue is the concatenated queue (of unacked, unsent) */
  53522. pcb->unsent = pcb->unacked;
  53523. 8031fea: 66c2 str r2, [r0, #108] ; 0x6c
  53524. /* unacked queue is now empty */
  53525. pcb->unacked = NULL;
  53526. /* last unsent hasn't changed, no need to reset unsent_oversize */
  53527. /* increment number of retransmissions */
  53528. ++pcb->nrtx;
  53529. 8031fec: f890 2046 ldrb.w r2, [r0, #70] ; 0x46
  53530. /* concatenate unsent queue after unacked queue */
  53531. seg->next = pcb->unsent;
  53532. /* unsent queue is the concatenated queue (of unacked, unsent) */
  53533. pcb->unsent = pcb->unacked;
  53534. /* unacked queue is now empty */
  53535. pcb->unacked = NULL;
  53536. 8031ff0: 6703 str r3, [r0, #112] ; 0x70
  53537. /* last unsent hasn't changed, no need to reset unsent_oversize */
  53538. /* increment number of retransmissions */
  53539. ++pcb->nrtx;
  53540. 8031ff2: 3201 adds r2, #1
  53541. 8031ff4: f880 2046 strb.w r2, [r0, #70] ; 0x46
  53542. /* Don't take any RTT measurements after retransmitting. */
  53543. pcb->rttest = 0;
  53544. 8031ff8: 6383 str r3, [r0, #56] ; 0x38
  53545. /* Do the actual retransmission */
  53546. tcp_output(pcb);
  53547. }
  53548. 8031ffa: e8bd 4010 ldmia.w sp!, {r4, lr}
  53549. /* Don't take any RTT measurements after retransmitting. */
  53550. pcb->rttest = 0;
  53551. /* Do the actual retransmission */
  53552. tcp_output(pcb);
  53553. 8031ffe: f7ff be7f b.w 8031d00 <tcp_output>
  53554. 8032002: bd10 pop {r4, pc}
  53555. 08032004 <tcp_rexmit>:
  53556. *
  53557. * @param pcb the tcp_pcb for which to retransmit the first unacked segment
  53558. */
  53559. void
  53560. tcp_rexmit(struct tcp_pcb *pcb)
  53561. {
  53562. 8032004: b5f8 push {r3, r4, r5, r6, r7, lr}
  53563. struct tcp_seg *seg;
  53564. struct tcp_seg **cur_seg;
  53565. if (pcb->unacked == NULL) {
  53566. 8032006: 6f05 ldr r5, [r0, #112] ; 0x70
  53567. *
  53568. * @param pcb the tcp_pcb for which to retransmit the first unacked segment
  53569. */
  53570. void
  53571. tcp_rexmit(struct tcp_pcb *pcb)
  53572. {
  53573. 8032008: 4604 mov r4, r0
  53574. struct tcp_seg *seg;
  53575. struct tcp_seg **cur_seg;
  53576. if (pcb->unacked == NULL) {
  53577. 803200a: 2d00 cmp r5, #0
  53578. 803200c: d027 beq.n 803205e <tcp_rexmit+0x5a>
  53579. }
  53580. /* Move the first unacked segment to the unsent queue */
  53581. /* Keep the unsent queue sorted. */
  53582. seg = pcb->unacked;
  53583. pcb->unacked = seg->next;
  53584. 803200e: 682b ldr r3, [r5, #0]
  53585. cur_seg = &(pcb->unsent);
  53586. 8032010: f100 066c add.w r6, r0, #108 ; 0x6c
  53587. }
  53588. /* Move the first unacked segment to the unsent queue */
  53589. /* Keep the unsent queue sorted. */
  53590. seg = pcb->unacked;
  53591. pcb->unacked = seg->next;
  53592. 8032014: 6703 str r3, [r0, #112] ; 0x70
  53593. cur_seg = &(pcb->unsent);
  53594. while (*cur_seg &&
  53595. 8032016: e000 b.n 803201a <tcp_rexmit+0x16>
  53596. TCP_SEQ_LT(ntohl((*cur_seg)->tcphdr->seqno), ntohl(seg->tcphdr->seqno))) {
  53597. cur_seg = &((*cur_seg)->next );
  53598. 8032018: 6836 ldr r6, [r6, #0]
  53599. /* Keep the unsent queue sorted. */
  53600. seg = pcb->unacked;
  53601. pcb->unacked = seg->next;
  53602. cur_seg = &(pcb->unsent);
  53603. while (*cur_seg &&
  53604. 803201a: 6833 ldr r3, [r6, #0]
  53605. 803201c: b92b cbnz r3, 803202a <tcp_rexmit+0x26>
  53606. TCP_SEQ_LT(ntohl((*cur_seg)->tcphdr->seqno), ntohl(seg->tcphdr->seqno))) {
  53607. cur_seg = &((*cur_seg)->next );
  53608. }
  53609. seg->next = *cur_seg;
  53610. 803201e: 6833 ldr r3, [r6, #0]
  53611. 8032020: 602b str r3, [r5, #0]
  53612. *cur_seg = seg;
  53613. 8032022: 6035 str r5, [r6, #0]
  53614. #if TCP_OVERSIZE
  53615. if (seg->next == NULL) {
  53616. 8032024: 682b ldr r3, [r5, #0]
  53617. 8032026: b97b cbnz r3, 8032048 <tcp_rexmit+0x44>
  53618. 8032028: e00c b.n 8032044 <tcp_rexmit+0x40>
  53619. seg = pcb->unacked;
  53620. pcb->unacked = seg->next;
  53621. cur_seg = &(pcb->unsent);
  53622. while (*cur_seg &&
  53623. TCP_SEQ_LT(ntohl((*cur_seg)->tcphdr->seqno), ntohl(seg->tcphdr->seqno))) {
  53624. 803202a: 68db ldr r3, [r3, #12]
  53625. 803202c: 6858 ldr r0, [r3, #4]
  53626. 803202e: f7fc fcf9 bl 802ea24 <lwip_ntohl>
  53627. 8032032: 68eb ldr r3, [r5, #12]
  53628. 8032034: 4607 mov r7, r0
  53629. 8032036: 6858 ldr r0, [r3, #4]
  53630. 8032038: f7fc fcf4 bl 802ea24 <lwip_ntohl>
  53631. 803203c: 1a38 subs r0, r7, r0
  53632. /* Keep the unsent queue sorted. */
  53633. seg = pcb->unacked;
  53634. pcb->unacked = seg->next;
  53635. cur_seg = &(pcb->unsent);
  53636. while (*cur_seg &&
  53637. 803203e: 2800 cmp r0, #0
  53638. 8032040: dbea blt.n 8032018 <tcp_rexmit+0x14>
  53639. 8032042: e7ec b.n 803201e <tcp_rexmit+0x1a>
  53640. seg->next = *cur_seg;
  53641. *cur_seg = seg;
  53642. #if TCP_OVERSIZE
  53643. if (seg->next == NULL) {
  53644. /* the retransmitted segment is last in unsent, so reset unsent_oversize */
  53645. pcb->unsent_oversize = 0;
  53646. 8032044: f8a4 306a strh.w r3, [r4, #106] ; 0x6a
  53647. }
  53648. #endif /* TCP_OVERSIZE */
  53649. ++pcb->nrtx;
  53650. 8032048: f894 3046 ldrb.w r3, [r4, #70] ; 0x46
  53651. 803204c: 3301 adds r3, #1
  53652. 803204e: f884 3046 strb.w r3, [r4, #70] ; 0x46
  53653. /* Don't take any rtt measurements after retransmitting. */
  53654. pcb->rttest = 0;
  53655. 8032052: 2300 movs r3, #0
  53656. 8032054: 63a3 str r3, [r4, #56] ; 0x38
  53657. /* Do the actual retransmission. */
  53658. snmp_inc_tcpretranssegs();
  53659. /* No need to call tcp_output: we are always called from tcp_input()
  53660. and thus tcp_output directly returns. */
  53661. }
  53662. 8032056: e8bd 40f8 ldmia.w sp!, {r3, r4, r5, r6, r7, lr}
  53663. /* Don't take any rtt measurements after retransmitting. */
  53664. pcb->rttest = 0;
  53665. /* Do the actual retransmission. */
  53666. snmp_inc_tcpretranssegs();
  53667. 803205a: f002 bc19 b.w 8034890 <snmp_inc_tcpretranssegs>
  53668. 803205e: bdf8 pop {r3, r4, r5, r6, r7, pc}
  53669. 08032060 <tcp_rexmit_fast>:
  53670. * @param pcb the tcp_pcb for which to retransmit the first unacked segment
  53671. */
  53672. void
  53673. tcp_rexmit_fast(struct tcp_pcb *pcb)
  53674. {
  53675. if (pcb->unacked != NULL && !(pcb->flags & TF_INFR)) {
  53676. 8032060: 6f03 ldr r3, [r0, #112] ; 0x70
  53677. *
  53678. * @param pcb the tcp_pcb for which to retransmit the first unacked segment
  53679. */
  53680. void
  53681. tcp_rexmit_fast(struct tcp_pcb *pcb)
  53682. {
  53683. 8032062: b510 push {r4, lr}
  53684. 8032064: 4604 mov r4, r0
  53685. if (pcb->unacked != NULL && !(pcb->flags & TF_INFR)) {
  53686. 8032066: b333 cbz r3, 80320b6 <tcp_rexmit_fast+0x56>
  53687. 8032068: 7f83 ldrb r3, [r0, #30]
  53688. 803206a: f003 0304 and.w r3, r3, #4
  53689. 803206e: b2db uxtb r3, r3
  53690. 8032070: bb0b cbnz r3, 80320b6 <tcp_rexmit_fast+0x56>
  53691. LWIP_DEBUGF(TCP_FR_DEBUG,
  53692. ("tcp_receive: dupacks %"U16_F" (%"U32_F
  53693. "), fast retransmit %"U32_F"\n",
  53694. (u16_t)pcb->dupacks, pcb->lastack,
  53695. ntohl(pcb->unacked->tcphdr->seqno)));
  53696. tcp_rexmit(pcb);
  53697. 8032072: f7ff ffc7 bl 8032004 <tcp_rexmit>
  53698. /* Set ssthresh to half of the minimum of the current
  53699. * cwnd and the advertised window */
  53700. if (pcb->cwnd > pcb->snd_wnd) {
  53701. 8032076: f8b4 304c ldrh.w r3, [r4, #76] ; 0x4c
  53702. 803207a: f8b4 2060 ldrh.w r2, [r4, #96] ; 0x60
  53703. 803207e: 4293 cmp r3, r2
  53704. 8032080: d903 bls.n 803208a <tcp_rexmit_fast+0x2a>
  53705. pcb->ssthresh = pcb->snd_wnd / 2;
  53706. 8032082: 0852 lsrs r2, r2, #1
  53707. 8032084: f8a4 204e strh.w r2, [r4, #78] ; 0x4e
  53708. 8032088: e002 b.n 8032090 <tcp_rexmit_fast+0x30>
  53709. } else {
  53710. pcb->ssthresh = pcb->cwnd / 2;
  53711. 803208a: 085b lsrs r3, r3, #1
  53712. 803208c: f8a4 304e strh.w r3, [r4, #78] ; 0x4e
  53713. }
  53714. /* The minimum value for ssthresh should be 2 MSS */
  53715. if (pcb->ssthresh < 2*pcb->mss) {
  53716. 8032090: 8ee3 ldrh r3, [r4, #54] ; 0x36
  53717. 8032092: f8b4 104e ldrh.w r1, [r4, #78] ; 0x4e
  53718. 8032096: 005a lsls r2, r3, #1
  53719. 8032098: 4291 cmp r1, r2
  53720. LWIP_DEBUGF(TCP_FR_DEBUG,
  53721. ("tcp_receive: The minimum value for ssthresh %"U16_F
  53722. " should be min 2 mss %"U16_F"...\n",
  53723. pcb->ssthresh, 2*pcb->mss));
  53724. pcb->ssthresh = 2*pcb->mss;
  53725. 803209a: bfb8 it lt
  53726. 803209c: f8a4 204e strhlt.w r2, [r4, #78] ; 0x4e
  53727. }
  53728. pcb->cwnd = pcb->ssthresh + 3 * pcb->mss;
  53729. 80320a0: f8b4 204e ldrh.w r2, [r4, #78] ; 0x4e
  53730. 80320a4: 2103 movs r1, #3
  53731. 80320a6: fb01 2303 mla r3, r1, r3, r2
  53732. 80320aa: f8a4 304c strh.w r3, [r4, #76] ; 0x4c
  53733. pcb->flags |= TF_INFR;
  53734. 80320ae: 7fa3 ldrb r3, [r4, #30]
  53735. 80320b0: f043 0304 orr.w r3, r3, #4
  53736. 80320b4: 77a3 strb r3, [r4, #30]
  53737. 80320b6: bd10 pop {r4, pc}
  53738. 080320b8 <tcp_keepalive>:
  53739. *
  53740. * @param pcb the tcp_pcb for which to send a keepalive packet
  53741. */
  53742. void
  53743. tcp_keepalive(struct tcp_pcb *pcb)
  53744. {
  53745. 80320b8: b537 push {r0, r1, r2, r4, r5, lr}
  53746. 80320ba: 4604 mov r4, r0
  53747. ip4_addr3_16(&pcb->remote_ip), ip4_addr4_16(&pcb->remote_ip)));
  53748. LWIP_DEBUGF(TCP_DEBUG, ("tcp_keepalive: tcp_ticks %"U32_F" pcb->tmr %"U32_F" pcb->keep_cnt_sent %"U16_F"\n",
  53749. tcp_ticks, pcb->tmr, pcb->keep_cnt_sent));
  53750. p = tcp_output_alloc_header(pcb, 0, 0, htonl(pcb->snd_nxt - 1));
  53751. 80320bc: 6d00 ldr r0, [r0, #80] ; 0x50
  53752. 80320be: 3801 subs r0, #1
  53753. 80320c0: f7fc fcae bl 802ea20 <lwip_htonl>
  53754. 80320c4: 2100 movs r1, #0
  53755. 80320c6: 4602 mov r2, r0
  53756. 80320c8: 4620 mov r0, r4
  53757. 80320ca: f7ff fbd9 bl 8031880 <tcp_output_alloc_header.constprop.0>
  53758. if(p == NULL) {
  53759. 80320ce: 4605 mov r5, r0
  53760. 80320d0: b178 cbz r0, 80320f2 <tcp_keepalive+0x3a>
  53761. /* Send output to IP */
  53762. #if LWIP_NETIF_HWADDRHINT
  53763. ip_output_hinted(p, &pcb->local_ip, &pcb->remote_ip, pcb->ttl, 0, IP_PROTO_TCP,
  53764. &(pcb->addr_hint));
  53765. #else /* LWIP_NETIF_HWADDRHINT*/
  53766. ip_output(p, &pcb->local_ip, &pcb->remote_ip, pcb->ttl, 0, IP_PROTO_TCP);
  53767. 80320d2: 2200 movs r2, #0
  53768. 80320d4: f04f 0e06 mov.w lr, #6
  53769. 80320d8: e88d 4004 stmia.w sp, {r2, lr}
  53770. 80320dc: 7aa3 ldrb r3, [r4, #10]
  53771. 80320de: 4621 mov r1, r4
  53772. 80320e0: 1d22 adds r2, r4, #4
  53773. 80320e2: f000 feaf bl 8032e44 <ip_output>
  53774. #endif /* LWIP_NETIF_HWADDRHINT*/
  53775. pbuf_free(p);
  53776. 80320e6: 4628 mov r0, r5
  53777. LWIP_DEBUGF(TCP_DEBUG, ("tcp_keepalive: seqno %"U32_F" ackno %"U32_F".\n",
  53778. pcb->snd_nxt - 1, pcb->rcv_nxt));
  53779. }
  53780. 80320e8: b003 add sp, #12
  53781. 80320ea: e8bd 4030 ldmia.w sp!, {r4, r5, lr}
  53782. &(pcb->addr_hint));
  53783. #else /* LWIP_NETIF_HWADDRHINT*/
  53784. ip_output(p, &pcb->local_ip, &pcb->remote_ip, pcb->ttl, 0, IP_PROTO_TCP);
  53785. #endif /* LWIP_NETIF_HWADDRHINT*/
  53786. pbuf_free(p);
  53787. 80320ee: f7fd bdcb b.w 802fc88 <pbuf_free>
  53788. LWIP_DEBUGF(TCP_DEBUG, ("tcp_keepalive: seqno %"U32_F" ackno %"U32_F".\n",
  53789. pcb->snd_nxt - 1, pcb->rcv_nxt));
  53790. }
  53791. 80320f2: b003 add sp, #12
  53792. 80320f4: bd30 pop {r4, r5, pc}
  53793. 080320f6 <tcp_zero_window_probe>:
  53794. *
  53795. * @param pcb the tcp_pcb for which to send a zero-window probe packet
  53796. */
  53797. void
  53798. tcp_zero_window_probe(struct tcp_pcb *pcb)
  53799. {
  53800. 80320f6: e92d 41f3 stmdb sp!, {r0, r1, r4, r5, r6, r7, r8, lr}
  53801. LWIP_DEBUGF(TCP_DEBUG,
  53802. ("tcp_zero_window_probe: tcp_ticks %"U32_F
  53803. " pcb->tmr %"U32_F" pcb->keep_cnt_sent %"U16_F"\n",
  53804. tcp_ticks, pcb->tmr, pcb->keep_cnt_sent));
  53805. seg = pcb->unacked;
  53806. 80320fa: 6f04 ldr r4, [r0, #112] ; 0x70
  53807. *
  53808. * @param pcb the tcp_pcb for which to send a zero-window probe packet
  53809. */
  53810. void
  53811. tcp_zero_window_probe(struct tcp_pcb *pcb)
  53812. {
  53813. 80320fc: 4605 mov r5, r0
  53814. " pcb->tmr %"U32_F" pcb->keep_cnt_sent %"U16_F"\n",
  53815. tcp_ticks, pcb->tmr, pcb->keep_cnt_sent));
  53816. seg = pcb->unacked;
  53817. if(seg == NULL) {
  53818. 80320fe: b914 cbnz r4, 8032106 <tcp_zero_window_probe+0x10>
  53819. seg = pcb->unsent;
  53820. 8032100: 6ec4 ldr r4, [r0, #108] ; 0x6c
  53821. }
  53822. if(seg == NULL) {
  53823. 8032102: 2c00 cmp r4, #0
  53824. 8032104: d042 beq.n 803218c <tcp_zero_window_probe+0x96>
  53825. return;
  53826. }
  53827. is_fin = ((TCPH_FLAGS(seg->tcphdr) & TCP_FIN) != 0) && (seg->len == 0);
  53828. 8032106: 68e3 ldr r3, [r4, #12]
  53829. 8032108: 8998 ldrh r0, [r3, #12]
  53830. 803210a: f7fc fc84 bl 802ea16 <lwip_ntohs>
  53831. 803210e: f010 0001 ands.w r0, r0, #1
  53832. 8032112: d005 beq.n 8032120 <tcp_zero_window_probe+0x2a>
  53833. 8032114: 8921 ldrh r1, [r4, #8]
  53834. 8032116: f1d1 0101 rsbs r1, r1, #1
  53835. 803211a: bf38 it cc
  53836. 803211c: 2100 movcc r1, #0
  53837. 803211e: e000 b.n 8032122 <tcp_zero_window_probe+0x2c>
  53838. 8032120: 4601 mov r1, r0
  53839. /* we want to send one seqno: either FIN or data (no options) */
  53840. len = is_fin ? 0 : 1;
  53841. p = tcp_output_alloc_header(pcb, 0, len, seg->tcphdr->seqno);
  53842. 8032122: 68e3 ldr r3, [r4, #12]
  53843. }
  53844. if(seg == NULL) {
  53845. return;
  53846. }
  53847. is_fin = ((TCPH_FLAGS(seg->tcphdr) & TCP_FIN) != 0) && (seg->len == 0);
  53848. 8032124: fa5f f881 uxtb.w r8, r1
  53849. /* we want to send one seqno: either FIN or data (no options) */
  53850. len = is_fin ? 0 : 1;
  53851. p = tcp_output_alloc_header(pcb, 0, len, seg->tcphdr->seqno);
  53852. 8032128: 4628 mov r0, r5
  53853. 803212a: f081 0101 eor.w r1, r1, #1
  53854. 803212e: 685a ldr r2, [r3, #4]
  53855. 8032130: f7ff fba6 bl 8031880 <tcp_output_alloc_header.constprop.0>
  53856. if(p == NULL) {
  53857. 8032134: 4606 mov r6, r0
  53858. 8032136: 2800 cmp r0, #0
  53859. 8032138: d028 beq.n 803218c <tcp_zero_window_probe+0x96>
  53860. LWIP_DEBUGF(TCP_DEBUG, ("tcp_zero_window_probe: no memory for pbuf\n"));
  53861. return;
  53862. }
  53863. tcphdr = (struct tcp_hdr *)p->payload;
  53864. 803213a: 6847 ldr r7, [r0, #4]
  53865. if (is_fin) {
  53866. 803213c: f1b8 0f00 cmp.w r8, #0
  53867. 8032140: d009 beq.n 8032156 <tcp_zero_window_probe+0x60>
  53868. /* FIN segment, no data */
  53869. TCPH_FLAGS_SET(tcphdr, TCP_ACK | TCP_FIN);
  53870. 8032142: 89bc ldrh r4, [r7, #12]
  53871. 8032144: 2011 movs r0, #17
  53872. 8032146: f7fc fc61 bl 802ea0c <lwip_htons>
  53873. 803214a: f424 547c bic.w r4, r4, #16128 ; 0x3f00
  53874. 803214e: b2a4 uxth r4, r4
  53875. 8032150: 4320 orrs r0, r4
  53876. 8032152: 81b8 strh r0, [r7, #12]
  53877. 8032154: e009 b.n 803216a <tcp_zero_window_probe+0x74>
  53878. /* Data segment, copy in one byte from the head of the unacked queue */
  53879. char *d = ((char *)p->payload + TCP_HLEN);
  53880. /* Depending on whether the segment has already been sent (unacked) or not
  53881. (unsent), seg->p->payload points to the IP header or TCP header.
  53882. Ensure we copy the first TCP data byte: */
  53883. pbuf_copy_partial(seg->p, d, 1, seg->p->tot_len - seg->len);
  53884. 8032156: 6860 ldr r0, [r4, #4]
  53885. 8032158: 8923 ldrh r3, [r4, #8]
  53886. 803215a: 8902 ldrh r2, [r0, #8]
  53887. 803215c: 1ad3 subs r3, r2, r3
  53888. 803215e: f107 0114 add.w r1, r7, #20
  53889. 8032162: 2201 movs r2, #1
  53890. 8032164: b29b uxth r3, r3
  53891. 8032166: f7fd fedd bl 802ff24 <pbuf_copy_partial>
  53892. /* Send output to IP */
  53893. #if LWIP_NETIF_HWADDRHINT
  53894. ip_output_hinted(p, &pcb->local_ip, &pcb->remote_ip, pcb->ttl, 0, IP_PROTO_TCP,
  53895. &(pcb->addr_hint));
  53896. #else /* LWIP_NETIF_HWADDRHINT*/
  53897. ip_output(p, &pcb->local_ip, &pcb->remote_ip, pcb->ttl, 0, IP_PROTO_TCP);
  53898. 803216a: 2200 movs r2, #0
  53899. 803216c: f04f 0c06 mov.w ip, #6
  53900. 8032170: e88d 1004 stmia.w sp, {r2, ip}
  53901. 8032174: 7aab ldrb r3, [r5, #10]
  53902. 8032176: 4630 mov r0, r6
  53903. 8032178: 4629 mov r1, r5
  53904. 803217a: 1d2a adds r2, r5, #4
  53905. 803217c: f000 fe62 bl 8032e44 <ip_output>
  53906. #endif /* LWIP_NETIF_HWADDRHINT*/
  53907. pbuf_free(p);
  53908. 8032180: 4630 mov r0, r6
  53909. LWIP_DEBUGF(TCP_DEBUG, ("tcp_zero_window_probe: seqno %"U32_F
  53910. " ackno %"U32_F".\n",
  53911. pcb->snd_nxt - 1, pcb->rcv_nxt));
  53912. }
  53913. 8032182: b002 add sp, #8
  53914. 8032184: e8bd 41f0 ldmia.w sp!, {r4, r5, r6, r7, r8, lr}
  53915. &(pcb->addr_hint));
  53916. #else /* LWIP_NETIF_HWADDRHINT*/
  53917. ip_output(p, &pcb->local_ip, &pcb->remote_ip, pcb->ttl, 0, IP_PROTO_TCP);
  53918. #endif /* LWIP_NETIF_HWADDRHINT*/
  53919. pbuf_free(p);
  53920. 8032188: f7fd bd7e b.w 802fc88 <pbuf_free>
  53921. LWIP_DEBUGF(TCP_DEBUG, ("tcp_zero_window_probe: seqno %"U32_F
  53922. " ackno %"U32_F".\n",
  53923. pcb->snd_nxt - 1, pcb->rcv_nxt));
  53924. }
  53925. 803218c: b002 add sp, #8
  53926. 803218e: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  53927. 8032192: 0000 movs r0, r0
  53928. 08032194 <sys_timeout>:
  53929. sys_timeout_debug(u32_t msecs, sys_timeout_handler handler, void *arg, const char* handler_name)
  53930. #else /* LWIP_DEBUG_TIMERNAMES */
  53931. void
  53932. sys_timeout(u32_t msecs, sys_timeout_handler handler, void *arg)
  53933. #endif /* LWIP_DEBUG_TIMERNAMES */
  53934. {
  53935. 8032194: b570 push {r4, r5, r6, lr}
  53936. 8032196: 4604 mov r4, r0
  53937. struct sys_timeo *timeout, *t;
  53938. timeout = (struct sys_timeo *)memp_malloc(MEMP_SYS_TIMEOUT);
  53939. 8032198: 2009 movs r0, #9
  53940. sys_timeout_debug(u32_t msecs, sys_timeout_handler handler, void *arg, const char* handler_name)
  53941. #else /* LWIP_DEBUG_TIMERNAMES */
  53942. void
  53943. sys_timeout(u32_t msecs, sys_timeout_handler handler, void *arg)
  53944. #endif /* LWIP_DEBUG_TIMERNAMES */
  53945. {
  53946. 803219a: 460d mov r5, r1
  53947. 803219c: 4616 mov r6, r2
  53948. struct sys_timeo *timeout, *t;
  53949. timeout = (struct sys_timeo *)memp_malloc(MEMP_SYS_TIMEOUT);
  53950. 803219e: f7fd fc53 bl 802fa48 <memp_malloc>
  53951. if (timeout == NULL) {
  53952. 80321a2: 4603 mov r3, r0
  53953. 80321a4: b308 cbz r0, 80321ea <sys_timeout+0x56>
  53954. timeout->handler_name = handler_name;
  53955. LWIP_DEBUGF(TIMERS_DEBUG, ("sys_timeout: %p msecs=%"U32_F" handler=%s arg=%p\n",
  53956. (void *)timeout, msecs, handler_name, (void *)arg));
  53957. #endif /* LWIP_DEBUG_TIMERNAMES */
  53958. if (next_timeout == NULL) {
  53959. 80321a6: 4911 ldr r1, [pc, #68] ; (80321ec <sys_timeout+0x58>)
  53960. timeout = (struct sys_timeo *)memp_malloc(MEMP_SYS_TIMEOUT);
  53961. if (timeout == NULL) {
  53962. LWIP_ASSERT("sys_timeout: timeout != NULL, pool MEMP_SYS_TIMEOUT is empty", timeout != NULL);
  53963. return;
  53964. }
  53965. timeout->next = NULL;
  53966. 80321a8: 2200 movs r2, #0
  53967. timeout->h = handler;
  53968. timeout->arg = arg;
  53969. timeout->time = msecs;
  53970. 80321aa: e880 0074 stmia.w r0, {r2, r4, r5, r6}
  53971. timeout->handler_name = handler_name;
  53972. LWIP_DEBUGF(TIMERS_DEBUG, ("sys_timeout: %p msecs=%"U32_F" handler=%s arg=%p\n",
  53973. (void *)timeout, msecs, handler_name, (void *)arg));
  53974. #endif /* LWIP_DEBUG_TIMERNAMES */
  53975. if (next_timeout == NULL) {
  53976. 80321ae: 680a ldr r2, [r1, #0]
  53977. 80321b0: b902 cbnz r2, 80321b4 <sys_timeout+0x20>
  53978. 80321b2: e005 b.n 80321c0 <sys_timeout+0x2c>
  53979. next_timeout = timeout;
  53980. return;
  53981. }
  53982. if (next_timeout->time > msecs) {
  53983. 80321b4: 6850 ldr r0, [r2, #4]
  53984. 80321b6: 42a0 cmp r0, r4
  53985. 80321b8: d90c bls.n 80321d4 <sys_timeout+0x40>
  53986. next_timeout->time -= msecs;
  53987. 80321ba: 1b04 subs r4, r0, r4
  53988. 80321bc: 6054 str r4, [r2, #4]
  53989. timeout->next = next_timeout;
  53990. 80321be: 601a str r2, [r3, #0]
  53991. next_timeout = timeout;
  53992. 80321c0: 600b str r3, [r1, #0]
  53993. 80321c2: bd70 pop {r4, r5, r6, pc}
  53994. } else {
  53995. for(t = next_timeout; t != NULL; t = t->next) {
  53996. timeout->time -= t->time;
  53997. if (t->next == NULL || t->next->time > timeout->time) {
  53998. 80321c4: 684c ldr r4, [r1, #4]
  53999. 80321c6: 4284 cmp r4, r0
  54000. 80321c8: d80c bhi.n 80321e4 <sys_timeout+0x50>
  54001. 80321ca: 460a mov r2, r1
  54002. 80321cc: e002 b.n 80321d4 <sys_timeout+0x40>
  54003. if (t->next != NULL) {
  54004. t->next->time -= timeout->time;
  54005. }
  54006. timeout->next = t->next;
  54007. 80321ce: 6019 str r1, [r3, #0]
  54008. t->next = timeout;
  54009. 80321d0: 6013 str r3, [r2, #0]
  54010. break;
  54011. 80321d2: bd70 pop {r4, r5, r6, pc}
  54012. next_timeout->time -= msecs;
  54013. timeout->next = next_timeout;
  54014. next_timeout = timeout;
  54015. } else {
  54016. for(t = next_timeout; t != NULL; t = t->next) {
  54017. timeout->time -= t->time;
  54018. 80321d4: 6851 ldr r1, [r2, #4]
  54019. 80321d6: 6858 ldr r0, [r3, #4]
  54020. 80321d8: 1a40 subs r0, r0, r1
  54021. if (t->next == NULL || t->next->time > timeout->time) {
  54022. 80321da: 6811 ldr r1, [r2, #0]
  54023. next_timeout->time -= msecs;
  54024. timeout->next = next_timeout;
  54025. next_timeout = timeout;
  54026. } else {
  54027. for(t = next_timeout; t != NULL; t = t->next) {
  54028. timeout->time -= t->time;
  54029. 80321dc: 6058 str r0, [r3, #4]
  54030. if (t->next == NULL || t->next->time > timeout->time) {
  54031. 80321de: 2900 cmp r1, #0
  54032. 80321e0: d1f0 bne.n 80321c4 <sys_timeout+0x30>
  54033. 80321e2: e7f4 b.n 80321ce <sys_timeout+0x3a>
  54034. if (t->next != NULL) {
  54035. t->next->time -= timeout->time;
  54036. 80321e4: 1a20 subs r0, r4, r0
  54037. 80321e6: 6048 str r0, [r1, #4]
  54038. 80321e8: e7f1 b.n 80321ce <sys_timeout+0x3a>
  54039. 80321ea: bd70 pop {r4, r5, r6, pc}
  54040. 80321ec: 2000c464 .word 0x2000c464
  54041. 080321f0 <sys_timeouts_init>:
  54042. }
  54043. #endif /* LWIP_DNS */
  54044. /** Initialize this module */
  54045. void sys_timeouts_init(void)
  54046. {
  54047. 80321f0: b508 push {r3, lr}
  54048. #if IP_REASSEMBLY
  54049. sys_timeout(IP_TMR_INTERVAL, ip_reass_timer, NULL);
  54050. #endif /* IP_REASSEMBLY */
  54051. #if LWIP_ARP
  54052. sys_timeout(ARP_TMR_INTERVAL, arp_timer, NULL);
  54053. 80321f2: 2200 movs r2, #0
  54054. 80321f4: f241 3088 movw r0, #5000 ; 0x1388
  54055. 80321f8: 4908 ldr r1, [pc, #32] ; (803221c <sys_timeouts_init+0x2c>)
  54056. 80321fa: f7ff ffcb bl 8032194 <sys_timeout>
  54057. #endif /* LWIP_ARP */
  54058. #if LWIP_DHCP
  54059. sys_timeout(DHCP_COARSE_TIMER_MSECS, dhcp_timer_coarse, NULL);
  54060. 80321fe: 2200 movs r2, #0
  54061. 8032200: f64e 2060 movw r0, #60000 ; 0xea60
  54062. 8032204: 4906 ldr r1, [pc, #24] ; (8032220 <sys_timeouts_init+0x30>)
  54063. 8032206: f7ff ffc5 bl 8032194 <sys_timeout>
  54064. sys_timeout(DHCP_FINE_TIMER_MSECS, dhcp_timer_fine, NULL);
  54065. 803220a: 4906 ldr r1, [pc, #24] ; (8032224 <sys_timeouts_init+0x34>)
  54066. 803220c: f44f 70fa mov.w r0, #500 ; 0x1f4
  54067. 8032210: 2200 movs r2, #0
  54068. #if NO_SYS
  54069. /* Initialise timestamp for sys_check_timeouts */
  54070. timeouts_last_time = sys_now();
  54071. #endif
  54072. }
  54073. 8032212: e8bd 4008 ldmia.w sp!, {r3, lr}
  54074. #if LWIP_ARP
  54075. sys_timeout(ARP_TMR_INTERVAL, arp_timer, NULL);
  54076. #endif /* LWIP_ARP */
  54077. #if LWIP_DHCP
  54078. sys_timeout(DHCP_COARSE_TIMER_MSECS, dhcp_timer_coarse, NULL);
  54079. sys_timeout(DHCP_FINE_TIMER_MSECS, dhcp_timer_fine, NULL);
  54080. 8032216: f7ff bfbd b.w 8032194 <sys_timeout>
  54081. 803221a: bf00 nop
  54082. 803221c: 08032261 .word 0x08032261
  54083. 8032220: 08032245 .word 0x08032245
  54084. 8032224: 08032229 .word 0x08032229
  54085. 08032228 <dhcp_timer_fine>:
  54086. *
  54087. * @param arg unused argument
  54088. */
  54089. static void
  54090. dhcp_timer_fine(void *arg)
  54091. {
  54092. 8032228: b508 push {r3, lr}
  54093. LWIP_UNUSED_ARG(arg);
  54094. LWIP_DEBUGF(TIMERS_DEBUG, ("tcpip: dhcp_fine_tmr()\n"));
  54095. dhcp_fine_tmr();
  54096. 803222a: f7fd f9c9 bl 802f5c0 <dhcp_fine_tmr>
  54097. sys_timeout(DHCP_FINE_TIMER_MSECS, dhcp_timer_fine, NULL);
  54098. 803222e: 4904 ldr r1, [pc, #16] ; (8032240 <dhcp_timer_fine+0x18>)
  54099. 8032230: f44f 70fa mov.w r0, #500 ; 0x1f4
  54100. 8032234: 2200 movs r2, #0
  54101. }
  54102. 8032236: e8bd 4008 ldmia.w sp!, {r3, lr}
  54103. dhcp_timer_fine(void *arg)
  54104. {
  54105. LWIP_UNUSED_ARG(arg);
  54106. LWIP_DEBUGF(TIMERS_DEBUG, ("tcpip: dhcp_fine_tmr()\n"));
  54107. dhcp_fine_tmr();
  54108. sys_timeout(DHCP_FINE_TIMER_MSECS, dhcp_timer_fine, NULL);
  54109. 803223a: f7ff bfab b.w 8032194 <sys_timeout>
  54110. 803223e: bf00 nop
  54111. 8032240: 08032229 .word 0x08032229
  54112. 08032244 <dhcp_timer_coarse>:
  54113. *
  54114. * @param arg unused argument
  54115. */
  54116. static void
  54117. dhcp_timer_coarse(void *arg)
  54118. {
  54119. 8032244: b508 push {r3, lr}
  54120. LWIP_UNUSED_ARG(arg);
  54121. LWIP_DEBUGF(TIMERS_DEBUG, ("tcpip: dhcp_coarse_tmr()\n"));
  54122. dhcp_coarse_tmr();
  54123. 8032246: f7fd f939 bl 802f4bc <dhcp_coarse_tmr>
  54124. sys_timeout(DHCP_COARSE_TIMER_MSECS, dhcp_timer_coarse, NULL);
  54125. 803224a: 4904 ldr r1, [pc, #16] ; (803225c <dhcp_timer_coarse+0x18>)
  54126. 803224c: f64e 2060 movw r0, #60000 ; 0xea60
  54127. 8032250: 2200 movs r2, #0
  54128. }
  54129. 8032252: e8bd 4008 ldmia.w sp!, {r3, lr}
  54130. dhcp_timer_coarse(void *arg)
  54131. {
  54132. LWIP_UNUSED_ARG(arg);
  54133. LWIP_DEBUGF(TIMERS_DEBUG, ("tcpip: dhcp_coarse_tmr()\n"));
  54134. dhcp_coarse_tmr();
  54135. sys_timeout(DHCP_COARSE_TIMER_MSECS, dhcp_timer_coarse, NULL);
  54136. 8032256: f7ff bf9d b.w 8032194 <sys_timeout>
  54137. 803225a: bf00 nop
  54138. 803225c: 08032245 .word 0x08032245
  54139. 08032260 <arp_timer>:
  54140. *
  54141. * @param arg unused argument
  54142. */
  54143. static void
  54144. arp_timer(void *arg)
  54145. {
  54146. 8032260: b508 push {r3, lr}
  54147. LWIP_UNUSED_ARG(arg);
  54148. LWIP_DEBUGF(TIMERS_DEBUG, ("tcpip: etharp_tmr()\n"));
  54149. etharp_tmr();
  54150. 8032262: f004 fd1b bl 8036c9c <etharp_tmr>
  54151. sys_timeout(ARP_TMR_INTERVAL, arp_timer, NULL);
  54152. 8032266: 4904 ldr r1, [pc, #16] ; (8032278 <arp_timer+0x18>)
  54153. 8032268: f241 3088 movw r0, #5000 ; 0x1388
  54154. 803226c: 2200 movs r2, #0
  54155. }
  54156. 803226e: e8bd 4008 ldmia.w sp!, {r3, lr}
  54157. arp_timer(void *arg)
  54158. {
  54159. LWIP_UNUSED_ARG(arg);
  54160. LWIP_DEBUGF(TIMERS_DEBUG, ("tcpip: etharp_tmr()\n"));
  54161. etharp_tmr();
  54162. sys_timeout(ARP_TMR_INTERVAL, arp_timer, NULL);
  54163. 8032272: f7ff bf8f b.w 8032194 <sys_timeout>
  54164. 8032276: bf00 nop
  54165. 8032278: 08032261 .word 0x08032261
  54166. 0803227c <tcp_timer_needed>:
  54167. */
  54168. void
  54169. tcp_timer_needed(void)
  54170. {
  54171. /* timer is off but needed again? */
  54172. if (!tcpip_tcp_timer_active && (tcp_active_pcbs || tcp_tw_pcbs)) {
  54173. 803227c: 4b08 ldr r3, [pc, #32] ; (80322a0 <tcp_timer_needed+0x24>)
  54174. 803227e: 681b ldr r3, [r3, #0]
  54175. 8032280: b96b cbnz r3, 803229e <tcp_timer_needed+0x22>
  54176. 8032282: 4b08 ldr r3, [pc, #32] ; (80322a4 <tcp_timer_needed+0x28>)
  54177. 8032284: 681b ldr r3, [r3, #0]
  54178. 8032286: b913 cbnz r3, 803228e <tcp_timer_needed+0x12>
  54179. 8032288: 4b07 ldr r3, [pc, #28] ; (80322a8 <tcp_timer_needed+0x2c>)
  54180. 803228a: 681b ldr r3, [r3, #0]
  54181. 803228c: b13b cbz r3, 803229e <tcp_timer_needed+0x22>
  54182. /* enable and start timer */
  54183. tcpip_tcp_timer_active = 1;
  54184. 803228e: 4b04 ldr r3, [pc, #16] ; (80322a0 <tcp_timer_needed+0x24>)
  54185. sys_timeout(TCP_TMR_INTERVAL, tcpip_tcp_timer, NULL);
  54186. 8032290: 4906 ldr r1, [pc, #24] ; (80322ac <tcp_timer_needed+0x30>)
  54187. tcp_timer_needed(void)
  54188. {
  54189. /* timer is off but needed again? */
  54190. if (!tcpip_tcp_timer_active && (tcp_active_pcbs || tcp_tw_pcbs)) {
  54191. /* enable and start timer */
  54192. tcpip_tcp_timer_active = 1;
  54193. 8032292: 2201 movs r2, #1
  54194. 8032294: 601a str r2, [r3, #0]
  54195. sys_timeout(TCP_TMR_INTERVAL, tcpip_tcp_timer, NULL);
  54196. 8032296: 20fa movs r0, #250 ; 0xfa
  54197. 8032298: 2200 movs r2, #0
  54198. 803229a: f7ff bf7b b.w 8032194 <sys_timeout>
  54199. 803229e: 4770 bx lr
  54200. 80322a0: 2000c460 .word 0x2000c460
  54201. 80322a4: 2000ff20 .word 0x2000ff20
  54202. 80322a8: 2000ff34 .word 0x2000ff34
  54203. 80322ac: 080322b1 .word 0x080322b1
  54204. 080322b0 <tcpip_tcp_timer>:
  54205. *
  54206. * @param arg unused argument
  54207. */
  54208. static void
  54209. tcpip_tcp_timer(void *arg)
  54210. {
  54211. 80322b0: b508 push {r3, lr}
  54212. LWIP_UNUSED_ARG(arg);
  54213. /* call TCP timer handler */
  54214. tcp_tmr();
  54215. 80322b2: f7fe fad3 bl 803085c <tcp_tmr>
  54216. /* timer still needed? */
  54217. if (tcp_active_pcbs || tcp_tw_pcbs) {
  54218. 80322b6: 4b08 ldr r3, [pc, #32] ; (80322d8 <tcpip_tcp_timer+0x28>)
  54219. 80322b8: 681b ldr r3, [r3, #0]
  54220. 80322ba: b913 cbnz r3, 80322c2 <tcpip_tcp_timer+0x12>
  54221. 80322bc: 4b07 ldr r3, [pc, #28] ; (80322dc <tcpip_tcp_timer+0x2c>)
  54222. 80322be: 681b ldr r3, [r3, #0]
  54223. 80322c0: b133 cbz r3, 80322d0 <tcpip_tcp_timer+0x20>
  54224. /* restart timer */
  54225. sys_timeout(TCP_TMR_INTERVAL, tcpip_tcp_timer, NULL);
  54226. 80322c2: 4907 ldr r1, [pc, #28] ; (80322e0 <tcpip_tcp_timer+0x30>)
  54227. 80322c4: 20fa movs r0, #250 ; 0xfa
  54228. 80322c6: 2200 movs r2, #0
  54229. } else {
  54230. /* disable timer */
  54231. tcpip_tcp_timer_active = 0;
  54232. }
  54233. }
  54234. 80322c8: e8bd 4008 ldmia.w sp!, {r3, lr}
  54235. /* call TCP timer handler */
  54236. tcp_tmr();
  54237. /* timer still needed? */
  54238. if (tcp_active_pcbs || tcp_tw_pcbs) {
  54239. /* restart timer */
  54240. sys_timeout(TCP_TMR_INTERVAL, tcpip_tcp_timer, NULL);
  54241. 80322cc: f7ff bf62 b.w 8032194 <sys_timeout>
  54242. } else {
  54243. /* disable timer */
  54244. tcpip_tcp_timer_active = 0;
  54245. 80322d0: 4a04 ldr r2, [pc, #16] ; (80322e4 <tcpip_tcp_timer+0x34>)
  54246. 80322d2: 6013 str r3, [r2, #0]
  54247. 80322d4: bd08 pop {r3, pc}
  54248. 80322d6: bf00 nop
  54249. 80322d8: 2000ff20 .word 0x2000ff20
  54250. 80322dc: 2000ff34 .word 0x2000ff34
  54251. 80322e0: 080322b1 .word 0x080322b1
  54252. 80322e4: 2000c460 .word 0x2000c460
  54253. 080322e8 <sys_untimeout>:
  54254. void
  54255. sys_untimeout(sys_timeout_handler handler, void *arg)
  54256. {
  54257. struct sys_timeo *prev_t, *t;
  54258. if (next_timeout == NULL) {
  54259. 80322e8: 4b10 ldr r3, [pc, #64] ; (803232c <sys_untimeout+0x44>)
  54260. 80322ea: 681b ldr r3, [r3, #0]
  54261. * @param handler callback function that would be called by the timeout
  54262. * @param arg callback argument that would be passed to handler
  54263. */
  54264. void
  54265. sys_untimeout(sys_timeout_handler handler, void *arg)
  54266. {
  54267. 80322ec: b510 push {r4, lr}
  54268. struct sys_timeo *prev_t, *t;
  54269. if (next_timeout == NULL) {
  54270. 80322ee: b1e3 cbz r3, 803232a <sys_untimeout+0x42>
  54271. 80322f0: 2200 movs r2, #0
  54272. 80322f2: e000 b.n 80322f6 <sys_untimeout+0xe>
  54273. return;
  54274. }
  54275. for (t = next_timeout, prev_t = NULL; t != NULL; prev_t = t, t = t->next) {
  54276. 80322f4: 4623 mov r3, r4
  54277. if ((t->h == handler) && (t->arg == arg)) {
  54278. 80322f6: 689c ldr r4, [r3, #8]
  54279. 80322f8: 4284 cmp r4, r0
  54280. 80322fa: d112 bne.n 8032322 <sys_untimeout+0x3a>
  54281. 80322fc: 68dc ldr r4, [r3, #12]
  54282. 80322fe: 428c cmp r4, r1
  54283. 8032300: d10f bne.n 8032322 <sys_untimeout+0x3a>
  54284. 8032302: 6819 ldr r1, [r3, #0]
  54285. /* We have a match */
  54286. /* Unlink from previous in list */
  54287. if (prev_t == NULL) {
  54288. 8032304: b902 cbnz r2, 8032308 <sys_untimeout+0x20>
  54289. next_timeout = t->next;
  54290. 8032306: 4a09 ldr r2, [pc, #36] ; (803232c <sys_untimeout+0x44>)
  54291. } else {
  54292. prev_t->next = t->next;
  54293. 8032308: 6011 str r1, [r2, #0]
  54294. }
  54295. /* If not the last one, add time of this one back to next */
  54296. if (t->next != NULL) {
  54297. 803230a: 681a ldr r2, [r3, #0]
  54298. 803230c: b11a cbz r2, 8032316 <sys_untimeout+0x2e>
  54299. t->next->time += t->time;
  54300. 803230e: 6850 ldr r0, [r2, #4]
  54301. 8032310: 6859 ldr r1, [r3, #4]
  54302. 8032312: 1841 adds r1, r0, r1
  54303. 8032314: 6051 str r1, [r2, #4]
  54304. }
  54305. memp_free(MEMP_SYS_TIMEOUT, t);
  54306. 8032316: 2009 movs r0, #9
  54307. 8032318: 4619 mov r1, r3
  54308. return;
  54309. }
  54310. }
  54311. return;
  54312. }
  54313. 803231a: e8bd 4010 ldmia.w sp!, {r4, lr}
  54314. }
  54315. /* If not the last one, add time of this one back to next */
  54316. if (t->next != NULL) {
  54317. t->next->time += t->time;
  54318. }
  54319. memp_free(MEMP_SYS_TIMEOUT, t);
  54320. 803231e: f7fd bba9 b.w 802fa74 <memp_free>
  54321. if (next_timeout == NULL) {
  54322. return;
  54323. }
  54324. for (t = next_timeout, prev_t = NULL; t != NULL; prev_t = t, t = t->next) {
  54325. 8032322: 681c ldr r4, [r3, #0]
  54326. 8032324: 461a mov r2, r3
  54327. 8032326: 2c00 cmp r4, #0
  54328. 8032328: d1e4 bne.n 80322f4 <sys_untimeout+0xc>
  54329. 803232a: bd10 pop {r4, pc}
  54330. 803232c: 2000c464 .word 0x2000c464
  54331. 08032330 <sys_timeouts_mbox_fetch>:
  54332. * @param mbox the mbox to fetch the message from
  54333. * @param msg the place to store the message
  54334. */
  54335. void
  54336. sys_timeouts_mbox_fetch(sys_mbox_t *mbox, void **msg)
  54337. {
  54338. 8032330: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr}
  54339. struct sys_timeo *tmptimeout;
  54340. sys_timeout_handler handler;
  54341. void *arg;
  54342. again:
  54343. if (!next_timeout) {
  54344. 8032334: 4e18 ldr r6, [pc, #96] ; (8032398 <sys_timeouts_mbox_fetch+0x68>)
  54345. * @param mbox the mbox to fetch the message from
  54346. * @param msg the place to store the message
  54347. */
  54348. void
  54349. sys_timeouts_mbox_fetch(sys_mbox_t *mbox, void **msg)
  54350. {
  54351. 8032336: 4604 mov r4, r0
  54352. 8032338: 460d mov r5, r1
  54353. 803233a: 4637 mov r7, r6
  54354. struct sys_timeo *tmptimeout;
  54355. sys_timeout_handler handler;
  54356. void *arg;
  54357. again:
  54358. if (!next_timeout) {
  54359. 803233c: 6832 ldr r2, [r6, #0]
  54360. 803233e: b92a cbnz r2, 803234c <sys_timeouts_mbox_fetch+0x1c>
  54361. time_needed = sys_arch_mbox_fetch(mbox, msg, 0);
  54362. 8032340: 4620 mov r0, r4
  54363. 8032342: 4629 mov r1, r5
  54364. } else {
  54365. next_timeout->time = 0;
  54366. }
  54367. }
  54368. }
  54369. }
  54370. 8032344: e8bd 43f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, lr}
  54371. sys_timeout_handler handler;
  54372. void *arg;
  54373. again:
  54374. if (!next_timeout) {
  54375. time_needed = sys_arch_mbox_fetch(mbox, msg, 0);
  54376. 8032348: f005 b8d4 b.w 80374f4 <sys_arch_mbox_fetch>
  54377. } else {
  54378. if (next_timeout->time > 0) {
  54379. 803234c: 6852 ldr r2, [r2, #4]
  54380. 803234e: b96a cbnz r2, 803236c <sys_timeouts_mbox_fetch+0x3c>
  54381. if (time_needed == SYS_ARCH_TIMEOUT) {
  54382. /* If time == SYS_ARCH_TIMEOUT, a timeout occured before a message
  54383. could be fetched. We should now call the timeout handler and
  54384. deallocate the memory allocated for the timeout. */
  54385. tmptimeout = next_timeout;
  54386. 8032350: 6839 ldr r1, [r7, #0]
  54387. next_timeout = tmptimeout->next;
  54388. 8032352: 680a ldr r2, [r1, #0]
  54389. handler = tmptimeout->h;
  54390. 8032354: f8d1 8008 ldr.w r8, [r1, #8]
  54391. if (time_needed == SYS_ARCH_TIMEOUT) {
  54392. /* If time == SYS_ARCH_TIMEOUT, a timeout occured before a message
  54393. could be fetched. We should now call the timeout handler and
  54394. deallocate the memory allocated for the timeout. */
  54395. tmptimeout = next_timeout;
  54396. next_timeout = tmptimeout->next;
  54397. 8032358: 603a str r2, [r7, #0]
  54398. if (handler != NULL) {
  54399. LWIP_DEBUGF(TIMERS_DEBUG, ("stmf calling h=%s arg=%p\n",
  54400. tmptimeout->handler_name, arg));
  54401. }
  54402. #endif /* LWIP_DEBUG_TIMERNAMES */
  54403. memp_free(MEMP_SYS_TIMEOUT, tmptimeout);
  54404. 803235a: 2009 movs r0, #9
  54405. could be fetched. We should now call the timeout handler and
  54406. deallocate the memory allocated for the timeout. */
  54407. tmptimeout = next_timeout;
  54408. next_timeout = tmptimeout->next;
  54409. handler = tmptimeout->h;
  54410. arg = tmptimeout->arg;
  54411. 803235c: f8d1 900c ldr.w r9, [r1, #12]
  54412. if (handler != NULL) {
  54413. LWIP_DEBUGF(TIMERS_DEBUG, ("stmf calling h=%s arg=%p\n",
  54414. tmptimeout->handler_name, arg));
  54415. }
  54416. #endif /* LWIP_DEBUG_TIMERNAMES */
  54417. memp_free(MEMP_SYS_TIMEOUT, tmptimeout);
  54418. 8032360: f7fd fb88 bl 802fa74 <memp_free>
  54419. if (handler != NULL) {
  54420. 8032364: f1b8 0f00 cmp.w r8, #0
  54421. 8032368: d0e8 beq.n 803233c <sys_timeouts_mbox_fetch+0xc>
  54422. 803236a: e006 b.n 803237a <sys_timeouts_mbox_fetch+0x4a>
  54423. again:
  54424. if (!next_timeout) {
  54425. time_needed = sys_arch_mbox_fetch(mbox, msg, 0);
  54426. } else {
  54427. if (next_timeout->time > 0) {
  54428. time_needed = sys_arch_mbox_fetch(mbox, msg, next_timeout->time);
  54429. 803236c: 4620 mov r0, r4
  54430. 803236e: 4629 mov r1, r5
  54431. 8032370: f005 f8c0 bl 80374f4 <sys_arch_mbox_fetch>
  54432. } else {
  54433. time_needed = SYS_ARCH_TIMEOUT;
  54434. }
  54435. if (time_needed == SYS_ARCH_TIMEOUT) {
  54436. 8032374: 1c43 adds r3, r0, #1
  54437. 8032376: d0eb beq.n 8032350 <sys_timeouts_mbox_fetch+0x20>
  54438. 8032378: e002 b.n 8032380 <sys_timeouts_mbox_fetch+0x50>
  54439. memp_free(MEMP_SYS_TIMEOUT, tmptimeout);
  54440. if (handler != NULL) {
  54441. /* For LWIP_TCPIP_CORE_LOCKING, lock the core before calling the
  54442. timeout handler function. */
  54443. LOCK_TCPIP_CORE();
  54444. handler(arg);
  54445. 803237a: 4648 mov r0, r9
  54446. 803237c: 47c0 blx r8
  54447. 803237e: e7dd b.n 803233c <sys_timeouts_mbox_fetch+0xc>
  54448. goto again;
  54449. } else {
  54450. /* If time != SYS_ARCH_TIMEOUT, a message was received before the timeout
  54451. occured. The time variable is set to the number of
  54452. milliseconds we waited for the message. */
  54453. if (time_needed < next_timeout->time) {
  54454. 8032380: 4b05 ldr r3, [pc, #20] ; (8032398 <sys_timeouts_mbox_fetch+0x68>)
  54455. 8032382: 681b ldr r3, [r3, #0]
  54456. 8032384: 6859 ldr r1, [r3, #4]
  54457. 8032386: 4288 cmp r0, r1
  54458. next_timeout->time -= time_needed;
  54459. 8032388: bf34 ite cc
  54460. 803238a: ebc0 0201 rsbcc r2, r0, r1
  54461. } else {
  54462. next_timeout->time = 0;
  54463. 803238e: 2200 movcs r2, #0
  54464. 8032390: 605a str r2, [r3, #4]
  54465. 8032392: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc}
  54466. 8032396: bf00 nop
  54467. 8032398: 2000c464 .word 0x2000c464
  54468. 0803239c <udp_init>:
  54469. /**
  54470. * Initialize this module.
  54471. */
  54472. void
  54473. udp_init(void)
  54474. {
  54475. 803239c: 4770 bx lr
  54476. 803239e: 0000 movs r0, r0
  54477. 080323a0 <udp_input>:
  54478. * @param inp network interface on which the datagram was received.
  54479. *
  54480. */
  54481. void
  54482. udp_input(struct pbuf *p, struct netif *inp)
  54483. {
  54484. 80323a0: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  54485. PERF_START;
  54486. UDP_STATS_INC(udp.recv);
  54487. iphdr = (struct ip_hdr *)p->payload;
  54488. 80323a4: f8d0 9004 ldr.w r9, [r0, #4]
  54489. /* Check minimum length (IP header + UDP header)
  54490. * and move payload pointer to UDP header */
  54491. if (p->tot_len < (IPH_HL(iphdr) * 4 + UDP_HLEN) || pbuf_header(p, -(s16_t)(IPH_HL(iphdr) * 4))) {
  54492. 80323a8: 8903 ldrh r3, [r0, #8]
  54493. * @param inp network interface on which the datagram was received.
  54494. *
  54495. */
  54496. void
  54497. udp_input(struct pbuf *p, struct netif *inp)
  54498. {
  54499. 80323aa: 460e mov r6, r1
  54500. iphdr = (struct ip_hdr *)p->payload;
  54501. /* Check minimum length (IP header + UDP header)
  54502. * and move payload pointer to UDP header */
  54503. if (p->tot_len < (IPH_HL(iphdr) * 4 + UDP_HLEN) || pbuf_header(p, -(s16_t)(IPH_HL(iphdr) * 4))) {
  54504. 80323ac: f899 1000 ldrb.w r1, [r9]
  54505. 80323b0: f001 010f and.w r1, r1, #15
  54506. 80323b4: 1c8a adds r2, r1, #2
  54507. 80323b6: ebb3 0f82 cmp.w r3, r2, lsl #2
  54508. * @param inp network interface on which the datagram was received.
  54509. *
  54510. */
  54511. void
  54512. udp_input(struct pbuf *p, struct netif *inp)
  54513. {
  54514. 80323ba: b085 sub sp, #20
  54515. 80323bc: 4605 mov r5, r0
  54516. iphdr = (struct ip_hdr *)p->payload;
  54517. /* Check minimum length (IP header + UDP header)
  54518. * and move payload pointer to UDP header */
  54519. if (p->tot_len < (IPH_HL(iphdr) * 4 + UDP_HLEN) || pbuf_header(p, -(s16_t)(IPH_HL(iphdr) * 4))) {
  54520. 80323be: db05 blt.n 80323cc <udp_input+0x2c>
  54521. 80323c0: 0089 lsls r1, r1, #2
  54522. 80323c2: 4249 negs r1, r1
  54523. 80323c4: f7fd fc35 bl 802fc32 <pbuf_header>
  54524. 80323c8: 4683 mov fp, r0
  54525. 80323ca: b110 cbz r0, 80323d2 <udp_input+0x32>
  54526. /* drop short packets */
  54527. LWIP_DEBUGF(UDP_DEBUG,
  54528. ("udp_input: short UDP datagram (%"U16_F" bytes) discarded\n", p->tot_len));
  54529. UDP_STATS_INC(udp.lenerr);
  54530. UDP_STATS_INC(udp.drop);
  54531. snmp_inc_udpinerrors();
  54532. 80323cc: f002 fa88 bl 80348e0 <snmp_inc_udpinerrors>
  54533. 80323d0: e096 b.n 8032500 <udp_input+0x160>
  54534. }
  54535. udphdr = (struct udp_hdr *)p->payload;
  54536. /* is broadcast packet ? */
  54537. broadcast = ip_addr_isbroadcast(&current_iphdr_dest, inp);
  54538. 80323d2: f8df a150 ldr.w sl, [pc, #336] ; 8032524 <udp_input+0x184>
  54539. snmp_inc_udpinerrors();
  54540. pbuf_free(p);
  54541. goto end;
  54542. }
  54543. udphdr = (struct udp_hdr *)p->payload;
  54544. 80323d6: 686c ldr r4, [r5, #4]
  54545. /* is broadcast packet ? */
  54546. broadcast = ip_addr_isbroadcast(&current_iphdr_dest, inp);
  54547. 80323d8: f8da 0000 ldr.w r0, [sl]
  54548. 80323dc: 4631 mov r1, r6
  54549. 80323de: f000 faed bl 80329bc <ip4_addr_isbroadcast>
  54550. 80323e2: 4680 mov r8, r0
  54551. LWIP_DEBUGF(UDP_DEBUG, ("udp_input: received datagram of length %"U16_F"\n", p->tot_len));
  54552. /* convert src and dest ports to host byte order */
  54553. src = ntohs(udphdr->src);
  54554. 80323e4: 8820 ldrh r0, [r4, #0]
  54555. 80323e6: f7fc fb16 bl 802ea16 <lwip_ntohs>
  54556. 80323ea: 4607 mov r7, r0
  54557. dest = ntohs(udphdr->dest);
  54558. 80323ec: 8860 ldrh r0, [r4, #2]
  54559. 80323ee: f7fc fb12 bl 802ea16 <lwip_ntohs>
  54560. #if LWIP_DHCP
  54561. pcb = NULL;
  54562. /* when LWIP_DHCP is active, packets to DHCP_CLIENT_PORT may only be processed by
  54563. the dhcp module, no other UDP pcb may use the local UDP port DHCP_CLIENT_PORT */
  54564. if (dest == DHCP_CLIENT_PORT) {
  54565. 80323f2: 2844 cmp r0, #68 ; 0x44
  54566. 80323f4: d10f bne.n 8032416 <udp_input+0x76>
  54567. /* all packets for DHCP_CLIENT_PORT not coming from DHCP_SERVER_PORT are dropped! */
  54568. if (src == DHCP_SERVER_PORT) {
  54569. 80323f6: 2f43 cmp r7, #67 ; 0x43
  54570. 80323f8: d14f bne.n 803249a <udp_input+0xfa>
  54571. if ((inp->dhcp != NULL) && (inp->dhcp->pcb != NULL)) {
  54572. 80323fa: 6a33 ldr r3, [r6, #32]
  54573. 80323fc: 2b00 cmp r3, #0
  54574. 80323fe: d04c beq.n 803249a <udp_input+0xfa>
  54575. 8032400: 685c ldr r4, [r3, #4]
  54576. 8032402: 2c00 cmp r4, #0
  54577. 8032404: d049 beq.n 803249a <udp_input+0xfa>
  54578. /* accept the packe if
  54579. (- broadcast or directed to us) -> DHCP is link-layer-addressed, local ip is always ANY!
  54580. - inp->dhcp->pcb->remote == ANY or iphdr->src */
  54581. if ((ip_addr_isany(&inp->dhcp->pcb->remote_ip) ||
  54582. 8032406: 6863 ldr r3, [r4, #4]
  54583. 8032408: 2b00 cmp r3, #0
  54584. 803240a: d04e beq.n 80324aa <udp_input+0x10a>
  54585. ip_addr_cmp(&(inp->dhcp->pcb->remote_ip), &current_iphdr_src))) {
  54586. 803240c: 4a43 ldr r2, [pc, #268] ; (803251c <udp_input+0x17c>)
  54587. if (src == DHCP_SERVER_PORT) {
  54588. if ((inp->dhcp != NULL) && (inp->dhcp->pcb != NULL)) {
  54589. /* accept the packe if
  54590. (- broadcast or directed to us) -> DHCP is link-layer-addressed, local ip is always ANY!
  54591. - inp->dhcp->pcb->remote == ANY or iphdr->src */
  54592. if ((ip_addr_isany(&inp->dhcp->pcb->remote_ip) ||
  54593. 803240e: 6812 ldr r2, [r2, #0]
  54594. 8032410: 4293 cmp r3, r2
  54595. 8032412: d142 bne.n 803249a <udp_input+0xfa>
  54596. 8032414: e049 b.n 80324aa <udp_input+0x10a>
  54597. uncon_pcb = NULL;
  54598. /* Iterate through the UDP pcb list for a matching pcb.
  54599. * 'Perfect match' pcbs (connected to the remote port & ip address) are
  54600. * preferred. If no perfect match is found, the first unconnected pcb that
  54601. * matches the local port and ip address gets the datagram. */
  54602. for (pcb = udp_pcbs; pcb != NULL; pcb = pcb->next) {
  54603. 8032416: 4b42 ldr r3, [pc, #264] ; (8032520 <udp_input+0x180>)
  54604. /* compare PCB local addr+port to UDP destination addr+port */
  54605. if (pcb->local_port == dest) {
  54606. if (
  54607. (!broadcast && ip_addr_isany(&pcb->local_ip)) ||
  54608. ip_addr_cmp(&(pcb->local_ip), &current_iphdr_dest) ||
  54609. 8032418: f8da a000 ldr.w sl, [sl]
  54610. uncon_pcb = NULL;
  54611. /* Iterate through the UDP pcb list for a matching pcb.
  54612. * 'Perfect match' pcbs (connected to the remote port & ip address) are
  54613. * preferred. If no perfect match is found, the first unconnected pcb that
  54614. * matches the local port and ip address gets the datagram. */
  54615. for (pcb = udp_pcbs; pcb != NULL; pcb = pcb->next) {
  54616. 803241c: f8d3 c000 ldr.w ip, [r3]
  54617. }
  54618. /* compare PCB remote addr+port to UDP source addr+port */
  54619. if ((local_match != 0) &&
  54620. (pcb->remote_port == src) &&
  54621. (ip_addr_isany(&pcb->remote_ip) ||
  54622. ip_addr_cmp(&(pcb->remote_ip), &current_iphdr_src))) {
  54623. 8032420: 4b3e ldr r3, [pc, #248] ; (803251c <udp_input+0x17c>)
  54624. 8032422: 681b ldr r3, [r3, #0]
  54625. uncon_pcb = NULL;
  54626. /* Iterate through the UDP pcb list for a matching pcb.
  54627. * 'Perfect match' pcbs (connected to the remote port & ip address) are
  54628. * preferred. If no perfect match is found, the first unconnected pcb that
  54629. * matches the local port and ip address gets the datagram. */
  54630. for (pcb = udp_pcbs; pcb != NULL; pcb = pcb->next) {
  54631. 8032424: 4664 mov r4, ip
  54632. }
  54633. /* compare PCB remote addr+port to UDP source addr+port */
  54634. if ((local_match != 0) &&
  54635. (pcb->remote_port == src) &&
  54636. (ip_addr_isany(&pcb->remote_ip) ||
  54637. ip_addr_cmp(&(pcb->remote_ip), &current_iphdr_src))) {
  54638. 8032426: 9303 str r3, [sp, #12]
  54639. }
  54640. }
  54641. } else
  54642. #endif /* LWIP_DHCP */
  54643. {
  54644. prev = NULL;
  54645. 8032428: 4659 mov r1, fp
  54646. local_match = 0;
  54647. uncon_pcb = NULL;
  54648. 803242a: 465b mov r3, fp
  54649. /* Iterate through the UDP pcb list for a matching pcb.
  54650. * 'Perfect match' pcbs (connected to the remote port & ip address) are
  54651. * preferred. If no perfect match is found, the first unconnected pcb that
  54652. * matches the local port and ip address gets the datagram. */
  54653. for (pcb = udp_pcbs; pcb != NULL; pcb = pcb->next) {
  54654. 803242c: e032 b.n 8032494 <udp_input+0xf4>
  54655. ip4_addr3_16(&pcb->local_ip), ip4_addr4_16(&pcb->local_ip), pcb->local_port,
  54656. ip4_addr1_16(&pcb->remote_ip), ip4_addr2_16(&pcb->remote_ip),
  54657. ip4_addr3_16(&pcb->remote_ip), ip4_addr4_16(&pcb->remote_ip), pcb->remote_port));
  54658. /* compare PCB local addr+port to UDP destination addr+port */
  54659. if (pcb->local_port == dest) {
  54660. 803242e: 8a62 ldrh r2, [r4, #18]
  54661. 8032430: 4282 cmp r2, r0
  54662. 8032432: d12d bne.n 8032490 <udp_input+0xf0>
  54663. 8032434: 6822 ldr r2, [r4, #0]
  54664. if (
  54665. 8032436: f1b8 0f00 cmp.w r8, #0
  54666. 803243a: d100 bne.n 803243e <udp_input+0x9e>
  54667. (!broadcast && ip_addr_isany(&pcb->local_ip)) ||
  54668. 803243c: b15a cbz r2, 8032456 <udp_input+0xb6>
  54669. 803243e: 4552 cmp r2, sl
  54670. 8032440: d009 beq.n 8032456 <udp_input+0xb6>
  54671. ip_addr_cmp(&(pcb->local_ip), &current_iphdr_dest) ||
  54672. 8032442: f1b8 0f00 cmp.w r8, #0
  54673. 8032446: d023 beq.n 8032490 <udp_input+0xf0>
  54674. (broadcast && ip_get_option(pcb, SOF_BROADCAST) &&
  54675. (ip_addr_isany(&pcb->local_ip) ||
  54676. ip_addr_netcmp(&pcb->local_ip, ip_current_dest_addr(), &inp->netmask)))) {
  54677. #else /* IP_SOF_BROADCAST_RECV */
  54678. (broadcast &&
  54679. (ip_addr_isany(&pcb->local_ip) ||
  54680. 8032448: b12a cbz r2, 8032456 <udp_input+0xb6>
  54681. ip_addr_netcmp(&pcb->local_ip, ip_current_dest_addr(), &inp->netmask)))) {
  54682. 803244a: ea8a 0b02 eor.w fp, sl, r2
  54683. 803244e: 68b2 ldr r2, [r6, #8]
  54684. (broadcast && ip_get_option(pcb, SOF_BROADCAST) &&
  54685. (ip_addr_isany(&pcb->local_ip) ||
  54686. ip_addr_netcmp(&pcb->local_ip, ip_current_dest_addr(), &inp->netmask)))) {
  54687. #else /* IP_SOF_BROADCAST_RECV */
  54688. (broadcast &&
  54689. (ip_addr_isany(&pcb->local_ip) ||
  54690. 8032450: ea1b 0f02 tst.w fp, r2
  54691. 8032454: d11c bne.n 8032490 <udp_input+0xf0>
  54692. ip_addr_netcmp(&pcb->local_ip, ip_current_dest_addr(), &inp->netmask)))) {
  54693. #endif /* IP_SOF_BROADCAST_RECV */
  54694. local_match = 1;
  54695. if ((uncon_pcb == NULL) &&
  54696. 8032456: 2b00 cmp r3, #0
  54697. 8032458: d158 bne.n 803250c <udp_input+0x16c>
  54698. ((pcb->flags & UDP_FLAGS_CONNECTED) == 0)) {
  54699. 803245a: 7c23 ldrb r3, [r4, #16]
  54700. (broadcast &&
  54701. (ip_addr_isany(&pcb->local_ip) ||
  54702. ip_addr_netcmp(&pcb->local_ip, ip_current_dest_addr(), &inp->netmask)))) {
  54703. #endif /* IP_SOF_BROADCAST_RECV */
  54704. local_match = 1;
  54705. if ((uncon_pcb == NULL) &&
  54706. 803245c: f003 0304 and.w r3, r3, #4
  54707. 8032460: b2db uxtb r3, r3
  54708. 8032462: 2b00 cmp r3, #0
  54709. 8032464: bf0c ite eq
  54710. 8032466: 4623 moveq r3, r4
  54711. 8032468: 2300 movne r3, #0
  54712. 803246a: e04f b.n 803250c <udp_input+0x16c>
  54713. }
  54714. }
  54715. /* compare PCB remote addr+port to UDP source addr+port */
  54716. if ((local_match != 0) &&
  54717. (pcb->remote_port == src) &&
  54718. (ip_addr_isany(&pcb->remote_ip) ||
  54719. 803246c: f8d4 b004 ldr.w fp, [r4, #4]
  54720. 8032470: f1bb 0f00 cmp.w fp, #0
  54721. 8032474: d101 bne.n 803247a <udp_input+0xda>
  54722. ip_addr_cmp(&(pcb->remote_ip), &current_iphdr_src))) {
  54723. /* the first fully matching PCB */
  54724. if (prev != NULL) {
  54725. 8032476: b921 cbnz r1, 8032482 <udp_input+0xe2>
  54726. 8032478: e017 b.n 80324aa <udp_input+0x10a>
  54727. }
  54728. }
  54729. /* compare PCB remote addr+port to UDP source addr+port */
  54730. if ((local_match != 0) &&
  54731. (pcb->remote_port == src) &&
  54732. (ip_addr_isany(&pcb->remote_ip) ||
  54733. 803247a: 9a03 ldr r2, [sp, #12]
  54734. 803247c: 4593 cmp fp, r2
  54735. 803247e: d107 bne.n 8032490 <udp_input+0xf0>
  54736. 8032480: e7f9 b.n 8032476 <udp_input+0xd6>
  54737. ip_addr_cmp(&(pcb->remote_ip), &current_iphdr_src))) {
  54738. /* the first fully matching PCB */
  54739. if (prev != NULL) {
  54740. /* move the pcb to the front of udp_pcbs so that is
  54741. found faster next time */
  54742. prev->next = pcb->next;
  54743. 8032482: 68e3 ldr r3, [r4, #12]
  54744. 8032484: 60cb str r3, [r1, #12]
  54745. pcb->next = udp_pcbs;
  54746. udp_pcbs = pcb;
  54747. 8032486: 4b26 ldr r3, [pc, #152] ; (8032520 <udp_input+0x180>)
  54748. /* the first fully matching PCB */
  54749. if (prev != NULL) {
  54750. /* move the pcb to the front of udp_pcbs so that is
  54751. found faster next time */
  54752. prev->next = pcb->next;
  54753. pcb->next = udp_pcbs;
  54754. 8032488: f8c4 c00c str.w ip, [r4, #12]
  54755. udp_pcbs = pcb;
  54756. 803248c: 601c str r4, [r3, #0]
  54757. 803248e: e00c b.n 80324aa <udp_input+0x10a>
  54758. 8032490: 4621 mov r1, r4
  54759. uncon_pcb = NULL;
  54760. /* Iterate through the UDP pcb list for a matching pcb.
  54761. * 'Perfect match' pcbs (connected to the remote port & ip address) are
  54762. * preferred. If no perfect match is found, the first unconnected pcb that
  54763. * matches the local port and ip address gets the datagram. */
  54764. for (pcb = udp_pcbs; pcb != NULL; pcb = pcb->next) {
  54765. 8032492: 68e4 ldr r4, [r4, #12]
  54766. 8032494: 2c00 cmp r4, #0
  54767. 8032496: d1ca bne.n 803242e <udp_input+0x8e>
  54768. pcb = uncon_pcb;
  54769. }
  54770. }
  54771. /* Check checksum if this is a match or if it was directed at us. */
  54772. if (pcb != NULL || ip_addr_cmp(&inp->ip_addr, &current_iphdr_dest)) {
  54773. 8032498: b933 cbnz r3, 80324a8 <udp_input+0x108>
  54774. 803249a: 4b22 ldr r3, [pc, #136] ; (8032524 <udp_input+0x184>)
  54775. 803249c: 6872 ldr r2, [r6, #4]
  54776. 803249e: 681b ldr r3, [r3, #0]
  54777. 80324a0: 429a cmp r2, r3
  54778. 80324a2: d12d bne.n 8032500 <udp_input+0x160>
  54779. 80324a4: 2400 movs r4, #0
  54780. 80324a6: e000 b.n 80324aa <udp_input+0x10a>
  54781. 80324a8: 461c mov r4, r3
  54782. goto end;
  54783. }
  54784. }
  54785. #endif /* CHECKSUM_CHECK_UDP */
  54786. }
  54787. if(pbuf_header(p, -UDP_HLEN)) {
  54788. 80324aa: 4628 mov r0, r5
  54789. 80324ac: f06f 0107 mvn.w r1, #7
  54790. 80324b0: f7fd fbbf bl 802fc32 <pbuf_header>
  54791. 80324b4: 2800 cmp r0, #0
  54792. 80324b6: d189 bne.n 80323cc <udp_input+0x2c>
  54793. UDP_STATS_INC(udp.drop);
  54794. snmp_inc_udpinerrors();
  54795. pbuf_free(p);
  54796. goto end;
  54797. }
  54798. if (pcb != NULL) {
  54799. 80324b8: b154 cbz r4, 80324d0 <udp_input+0x130>
  54800. snmp_inc_udpindatagrams();
  54801. 80324ba: f002 fa01 bl 80348c0 <snmp_inc_udpindatagrams>
  54802. pbuf_header(p, -(s16_t)((IPH_HL(iphdr) * 4) + UDP_HLEN));
  54803. }
  54804. }
  54805. #endif /* SO_REUSE && SO_REUSE_RXTOALL */
  54806. /* callback */
  54807. if (pcb->recv != NULL) {
  54808. 80324be: 69a6 ldr r6, [r4, #24]
  54809. 80324c0: b1f6 cbz r6, 8032500 <udp_input+0x160>
  54810. /* now the recv function is responsible for freeing p */
  54811. pcb->recv(pcb->recv_arg, pcb, p, ip_current_src_addr(), src);
  54812. 80324c2: 9700 str r7, [sp, #0]
  54813. 80324c4: 69e0 ldr r0, [r4, #28]
  54814. 80324c6: 4b15 ldr r3, [pc, #84] ; (803251c <udp_input+0x17c>)
  54815. 80324c8: 4621 mov r1, r4
  54816. 80324ca: 462a mov r2, r5
  54817. 80324cc: 47b0 blx r6
  54818. 80324ce: e021 b.n 8032514 <udp_input+0x174>
  54819. LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, ("udp_input: not for us.\n"));
  54820. #if LWIP_ICMP
  54821. /* No match was found, send ICMP destination port unreachable unless
  54822. destination address was broadcast/multicast. */
  54823. if (!broadcast &&
  54824. 80324d0: f1b8 0f00 cmp.w r8, #0
  54825. 80324d4: d112 bne.n 80324fc <udp_input+0x15c>
  54826. !ip_addr_ismulticast(&current_iphdr_dest)) {
  54827. 80324d6: 4b13 ldr r3, [pc, #76] ; (8032524 <udp_input+0x184>)
  54828. 80324d8: 681b ldr r3, [r3, #0]
  54829. 80324da: f003 03f0 and.w r3, r3, #240 ; 0xf0
  54830. LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, ("udp_input: not for us.\n"));
  54831. #if LWIP_ICMP
  54832. /* No match was found, send ICMP destination port unreachable unless
  54833. destination address was broadcast/multicast. */
  54834. if (!broadcast &&
  54835. 80324de: 2be0 cmp r3, #224 ; 0xe0
  54836. 80324e0: d00c beq.n 80324fc <udp_input+0x15c>
  54837. !ip_addr_ismulticast(&current_iphdr_dest)) {
  54838. /* move payload pointer back to ip header */
  54839. pbuf_header(p, (IPH_HL(iphdr) * 4) + UDP_HLEN);
  54840. 80324e2: f899 1000 ldrb.w r1, [r9]
  54841. 80324e6: f001 010f and.w r1, r1, #15
  54842. 80324ea: 3102 adds r1, #2
  54843. 80324ec: 0089 lsls r1, r1, #2
  54844. 80324ee: 4628 mov r0, r5
  54845. 80324f0: f7fd fb9f bl 802fc32 <pbuf_header>
  54846. LWIP_ASSERT("p->payload == iphdr", (p->payload == iphdr));
  54847. icmp_dest_unreach(p, ICMP_DUR_PORT);
  54848. 80324f4: 4628 mov r0, r5
  54849. 80324f6: 2103 movs r1, #3
  54850. 80324f8: f000 f9d2 bl 80328a0 <icmp_dest_unreach>
  54851. }
  54852. #endif /* LWIP_ICMP */
  54853. UDP_STATS_INC(udp.proterr);
  54854. UDP_STATS_INC(udp.drop);
  54855. snmp_inc_udpnoports();
  54856. 80324fc: f002 f9e8 bl 80348d0 <snmp_inc_udpnoports>
  54857. pbuf_free(p);
  54858. 8032500: 4628 mov r0, r5
  54859. } else {
  54860. pbuf_free(p);
  54861. }
  54862. end:
  54863. PERF_STOP("udp_input");
  54864. }
  54865. 8032502: b005 add sp, #20
  54866. 8032504: e8bd 4ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  54867. }
  54868. #endif /* LWIP_ICMP */
  54869. UDP_STATS_INC(udp.proterr);
  54870. UDP_STATS_INC(udp.drop);
  54871. snmp_inc_udpnoports();
  54872. pbuf_free(p);
  54873. 8032508: f7fd bbbe b.w 802fc88 <pbuf_free>
  54874. uncon_pcb = pcb;
  54875. }
  54876. }
  54877. }
  54878. /* compare PCB remote addr+port to UDP source addr+port */
  54879. if ((local_match != 0) &&
  54880. 803250c: 8aa2 ldrh r2, [r4, #20]
  54881. 803250e: 42ba cmp r2, r7
  54882. 8032510: d1be bne.n 8032490 <udp_input+0xf0>
  54883. 8032512: e7ab b.n 803246c <udp_input+0xcc>
  54884. } else {
  54885. pbuf_free(p);
  54886. }
  54887. end:
  54888. PERF_STOP("udp_input");
  54889. }
  54890. 8032514: b005 add sp, #20
  54891. 8032516: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  54892. 803251a: bf00 nop
  54893. 803251c: 2000ff40 .word 0x2000ff40
  54894. 8032520: 2000ff3c .word 0x2000ff3c
  54895. 8032524: 2000ff48 .word 0x2000ff48
  54896. 08032528 <udp_bind>:
  54897. *
  54898. * @see udp_disconnect()
  54899. */
  54900. err_t
  54901. udp_bind(struct udp_pcb *pcb, ip_addr_t *ipaddr, u16_t port)
  54902. {
  54903. 8032528: b5f8 push {r3, r4, r5, r6, r7, lr}
  54904. ip_addr_debug_print(UDP_DEBUG, ipaddr);
  54905. LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, (", port = %"U16_F")\n", port));
  54906. rebind = 0;
  54907. /* Check for double bind and rebind of the same pcb */
  54908. for (ipcb = udp_pcbs; ipcb != NULL; ipcb = ipcb->next) {
  54909. 803252a: 4b25 ldr r3, [pc, #148] ; (80325c0 <udp_bind+0x98>)
  54910. *
  54911. * @see udp_disconnect()
  54912. */
  54913. err_t
  54914. udp_bind(struct udp_pcb *pcb, ip_addr_t *ipaddr, u16_t port)
  54915. {
  54916. 803252c: 4604 mov r4, r0
  54917. ip_addr_debug_print(UDP_DEBUG, ipaddr);
  54918. LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, (", port = %"U16_F")\n", port));
  54919. rebind = 0;
  54920. /* Check for double bind and rebind of the same pcb */
  54921. for (ipcb = udp_pcbs; ipcb != NULL; ipcb = ipcb->next) {
  54922. 803252e: 6818 ldr r0, [r3, #0]
  54923. LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, ("udp_bind(ipaddr = "));
  54924. ip_addr_debug_print(UDP_DEBUG, ipaddr);
  54925. LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, (", port = %"U16_F")\n", port));
  54926. rebind = 0;
  54927. 8032530: 2500 movs r5, #0
  54928. /* Check for double bind and rebind of the same pcb */
  54929. for (ipcb = udp_pcbs; ipcb != NULL; ipcb = ipcb->next) {
  54930. 8032532: 4603 mov r3, r0
  54931. 8032534: e012 b.n 803255c <udp_bind+0x34>
  54932. /* is this UDP PCB already on active list? */
  54933. if (pcb == ipcb) {
  54934. 8032536: 429c cmp r4, r3
  54935. 8032538: d00e beq.n 8032558 <udp_bind+0x30>
  54936. !ip_get_option(ipcb, SOF_REUSEADDR)) {
  54937. #else /* SO_REUSE */
  54938. /* port matches that of PCB in list and REUSEADDR not set -> reject */
  54939. else {
  54940. #endif /* SO_REUSE */
  54941. if ((ipcb->local_port == port) &&
  54942. 803253a: 8a5e ldrh r6, [r3, #18]
  54943. 803253c: 4296 cmp r6, r2
  54944. 803253e: d10c bne.n 803255a <udp_bind+0x32>
  54945. /* IP address matches, or one is IP_ADDR_ANY? */
  54946. (ip_addr_isany(&(ipcb->local_ip)) ||
  54947. 8032540: 681f ldr r7, [r3, #0]
  54948. 8032542: b90f cbnz r7, 8032548 <udp_bind+0x20>
  54949. ip_addr_isany(ipaddr) ||
  54950. ip_addr_cmp(&(ipcb->local_ip), ipaddr))) {
  54951. /* other PCB already binds to this local IP and port */
  54952. LWIP_DEBUGF(UDP_DEBUG,
  54953. ("udp_bind: local port %"U16_F" already bound by another pcb\n", port));
  54954. return ERR_USE;
  54955. 8032544: 20f8 movs r0, #248 ; 0xf8
  54956. 8032546: e039 b.n 80325bc <udp_bind+0x94>
  54957. /* port matches that of PCB in list and REUSEADDR not set -> reject */
  54958. else {
  54959. #endif /* SO_REUSE */
  54960. if ((ipcb->local_port == port) &&
  54961. /* IP address matches, or one is IP_ADDR_ANY? */
  54962. (ip_addr_isany(&(ipcb->local_ip)) ||
  54963. 8032548: 2900 cmp r1, #0
  54964. 803254a: d0fb beq.n 8032544 <udp_bind+0x1c>
  54965. ip_addr_isany(ipaddr) ||
  54966. 803254c: 680e ldr r6, [r1, #0]
  54967. 803254e: 2e00 cmp r6, #0
  54968. 8032550: d0f8 beq.n 8032544 <udp_bind+0x1c>
  54969. 8032552: 42b7 cmp r7, r6
  54970. 8032554: d101 bne.n 803255a <udp_bind+0x32>
  54971. 8032556: e7f5 b.n 8032544 <udp_bind+0x1c>
  54972. /* is this UDP PCB already on active list? */
  54973. if (pcb == ipcb) {
  54974. /* pcb may occur at most once in active list */
  54975. LWIP_ASSERT("rebind == 0", rebind == 0);
  54976. /* pcb already in list, just rebind */
  54977. rebind = 1;
  54978. 8032558: 2501 movs r5, #1
  54979. ip_addr_debug_print(UDP_DEBUG, ipaddr);
  54980. LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, (", port = %"U16_F")\n", port));
  54981. rebind = 0;
  54982. /* Check for double bind and rebind of the same pcb */
  54983. for (ipcb = udp_pcbs; ipcb != NULL; ipcb = ipcb->next) {
  54984. 803255a: 68db ldr r3, [r3, #12]
  54985. 803255c: 2b00 cmp r3, #0
  54986. 803255e: d1ea bne.n 8032536 <udp_bind+0xe>
  54987. return ERR_USE;
  54988. }
  54989. }
  54990. }
  54991. ip_addr_set(&pcb->local_ip, ipaddr);
  54992. 8032560: b101 cbz r1, 8032564 <udp_bind+0x3c>
  54993. 8032562: 6809 ldr r1, [r1, #0]
  54994. 8032564: 6021 str r1, [r4, #0]
  54995. /* no port specified? */
  54996. if (port == 0) {
  54997. 8032566: b9fa cbnz r2, 80325a8 <udp_bind+0x80>
  54998. 8032568: 4b16 ldr r3, [pc, #88] ; (80325c4 <udp_bind+0x9c>)
  54999. 803256a: 881a ldrh r2, [r3, #0]
  55000. 803256c: f44f 4180 mov.w r1, #16384 ; 0x4000
  55001. {
  55002. u16_t n = 0;
  55003. struct udp_pcb *pcb;
  55004. again:
  55005. if (udp_port++ == UDP_LOCAL_PORT_RANGE_END) {
  55006. 8032570: f64f 76ff movw r6, #65535 ; 0xffff
  55007. 8032574: 42b2 cmp r2, r6
  55008. 8032576: d002 beq.n 803257e <udp_bind+0x56>
  55009. 8032578: 3201 adds r2, #1
  55010. 803257a: b292 uxth r2, r2
  55011. 803257c: e001 b.n 8032582 <udp_bind+0x5a>
  55012. udp_port = UDP_LOCAL_PORT_RANGE_START;
  55013. 803257e: f44f 4240 mov.w r2, #49152 ; 0xc000
  55014. }
  55015. /* Check all PCBs. */
  55016. for(pcb = udp_pcbs; pcb != NULL; pcb = pcb->next) {
  55017. 8032582: 4603 mov r3, r0
  55018. 8032584: e00a b.n 803259c <udp_bind+0x74>
  55019. if (pcb->local_port == udp_port) {
  55020. 8032586: 8a5f ldrh r7, [r3, #18]
  55021. 8032588: 4297 cmp r7, r2
  55022. 803258a: d106 bne.n 803259a <udp_bind+0x72>
  55023. 803258c: 3901 subs r1, #1
  55024. 803258e: b289 uxth r1, r1
  55025. if (++n > (UDP_LOCAL_PORT_RANGE_END - UDP_LOCAL_PORT_RANGE_START)) {
  55026. 8032590: 2900 cmp r1, #0
  55027. 8032592: d1ef bne.n 8032574 <udp_bind+0x4c>
  55028. 8032594: 4b0b ldr r3, [pc, #44] ; (80325c4 <udp_bind+0x9c>)
  55029. 8032596: 801a strh r2, [r3, #0]
  55030. 8032598: e7d4 b.n 8032544 <udp_bind+0x1c>
  55031. again:
  55032. if (udp_port++ == UDP_LOCAL_PORT_RANGE_END) {
  55033. udp_port = UDP_LOCAL_PORT_RANGE_START;
  55034. }
  55035. /* Check all PCBs. */
  55036. for(pcb = udp_pcbs; pcb != NULL; pcb = pcb->next) {
  55037. 803259a: 68db ldr r3, [r3, #12]
  55038. 803259c: 2b00 cmp r3, #0
  55039. 803259e: d1f2 bne.n 8032586 <udp_bind+0x5e>
  55040. 80325a0: 4b08 ldr r3, [pc, #32] ; (80325c4 <udp_bind+0x9c>)
  55041. 80325a2: 801a strh r2, [r3, #0]
  55042. ip_addr_set(&pcb->local_ip, ipaddr);
  55043. /* no port specified? */
  55044. if (port == 0) {
  55045. port = udp_new_port();
  55046. if (port == 0) {
  55047. 80325a4: 2a00 cmp r2, #0
  55048. 80325a6: d0cd beq.n 8032544 <udp_bind+0x1c>
  55049. /* no more ports available in local range */
  55050. LWIP_DEBUGF(UDP_DEBUG, ("udp_bind: out of free UDP ports\n"));
  55051. return ERR_USE;
  55052. }
  55053. }
  55054. pcb->local_port = port;
  55055. 80325a8: 8262 strh r2, [r4, #18]
  55056. snmp_insert_udpidx_tree(pcb);
  55057. 80325aa: 4620 mov r0, r4
  55058. 80325ac: f002 f9a8 bl 8034900 <snmp_insert_udpidx_tree>
  55059. /* pcb not active yet? */
  55060. if (rebind == 0) {
  55061. 80325b0: b91d cbnz r5, 80325ba <udp_bind+0x92>
  55062. /* place the PCB on the active list if not already there */
  55063. pcb->next = udp_pcbs;
  55064. 80325b2: 4b03 ldr r3, [pc, #12] ; (80325c0 <udp_bind+0x98>)
  55065. 80325b4: 681a ldr r2, [r3, #0]
  55066. udp_pcbs = pcb;
  55067. 80325b6: 601c str r4, [r3, #0]
  55068. pcb->local_port = port;
  55069. snmp_insert_udpidx_tree(pcb);
  55070. /* pcb not active yet? */
  55071. if (rebind == 0) {
  55072. /* place the PCB on the active list if not already there */
  55073. pcb->next = udp_pcbs;
  55074. 80325b8: 60e2 str r2, [r4, #12]
  55075. LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE,
  55076. ("udp_bind: bound to %"U16_F".%"U16_F".%"U16_F".%"U16_F", port %"U16_F"\n",
  55077. ip4_addr1_16(&pcb->local_ip), ip4_addr2_16(&pcb->local_ip),
  55078. ip4_addr3_16(&pcb->local_ip), ip4_addr4_16(&pcb->local_ip),
  55079. pcb->local_port));
  55080. return ERR_OK;
  55081. 80325ba: 2000 movs r0, #0
  55082. }
  55083. 80325bc: b240 sxtb r0, r0
  55084. 80325be: bdf8 pop {r3, r4, r5, r6, r7, pc}
  55085. 80325c0: 2000ff3c .word 0x2000ff3c
  55086. 80325c4: 2000072e .word 0x2000072e
  55087. 080325c8 <udp_sendto_if>:
  55088. * @see udp_disconnect() udp_send()
  55089. */
  55090. err_t
  55091. udp_sendto_if(struct udp_pcb *pcb, struct pbuf *p,
  55092. ip_addr_t *dst_ip, u16_t dst_port, struct netif *netif)
  55093. {
  55094. 80325c8: e92d 47ff stmdb sp!, {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, lr}
  55095. 80325cc: 4692 mov sl, r2
  55096. return ERR_VAL;
  55097. }
  55098. #endif /* IP_SOF_BROADCAST */
  55099. /* if the PCB is not yet bound to a port, bind it here */
  55100. if (pcb->local_port == 0) {
  55101. 80325ce: 8a42 ldrh r2, [r0, #18]
  55102. * @see udp_disconnect() udp_send()
  55103. */
  55104. err_t
  55105. udp_sendto_if(struct udp_pcb *pcb, struct pbuf *p,
  55106. ip_addr_t *dst_ip, u16_t dst_port, struct netif *netif)
  55107. {
  55108. 80325d0: f8dd 8030 ldr.w r8, [sp, #48] ; 0x30
  55109. 80325d4: 4605 mov r5, r0
  55110. 80325d6: 460e mov r6, r1
  55111. 80325d8: 4699 mov r9, r3
  55112. return ERR_VAL;
  55113. }
  55114. #endif /* IP_SOF_BROADCAST */
  55115. /* if the PCB is not yet bound to a port, bind it here */
  55116. if (pcb->local_port == 0) {
  55117. 80325da: b132 cbz r2, 80325ea <udp_sendto_if+0x22>
  55118. return err;
  55119. }
  55120. }
  55121. /* not enough space to add an UDP header to first pbuf in given p chain? */
  55122. if (pbuf_header(p, UDP_HLEN)) {
  55123. 80325dc: 4630 mov r0, r6
  55124. 80325de: 2108 movs r1, #8
  55125. 80325e0: f7fd fb27 bl 802fc32 <pbuf_header>
  55126. 80325e4: b940 cbnz r0, 80325f8 <udp_sendto_if+0x30>
  55127. 80325e6: 4634 mov r4, r6
  55128. 80325e8: e013 b.n 8032612 <udp_sendto_if+0x4a>
  55129. #endif /* IP_SOF_BROADCAST */
  55130. /* if the PCB is not yet bound to a port, bind it here */
  55131. if (pcb->local_port == 0) {
  55132. LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, ("udp_send: not yet bound to a port, binding now\n"));
  55133. err = udp_bind(pcb, &pcb->local_ip, pcb->local_port);
  55134. 80325ea: 4601 mov r1, r0
  55135. 80325ec: f7ff ff9c bl 8032528 <udp_bind>
  55136. if (err != ERR_OK) {
  55137. 80325f0: 4607 mov r7, r0
  55138. 80325f2: 2800 cmp r0, #0
  55139. 80325f4: d0f2 beq.n 80325dc <udp_sendto_if+0x14>
  55140. 80325f6: e044 b.n 8032682 <udp_sendto_if+0xba>
  55141. }
  55142. /* not enough space to add an UDP header to first pbuf in given p chain? */
  55143. if (pbuf_header(p, UDP_HLEN)) {
  55144. /* allocate header in a separate new pbuf */
  55145. q = pbuf_alloc(PBUF_IP, UDP_HLEN, PBUF_RAM);
  55146. 80325f8: 2001 movs r0, #1
  55147. 80325fa: 2108 movs r1, #8
  55148. 80325fc: 2200 movs r2, #0
  55149. 80325fe: f7fd fb90 bl 802fd22 <pbuf_alloc>
  55150. /* new header pbuf could not be allocated? */
  55151. if (q == NULL) {
  55152. 8032602: 4604 mov r4, r0
  55153. 8032604: 2800 cmp r0, #0
  55154. 8032606: d039 beq.n 803267c <udp_sendto_if+0xb4>
  55155. LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("udp_send: could not allocate header\n"));
  55156. return ERR_MEM;
  55157. }
  55158. if (p->tot_len != 0) {
  55159. 8032608: 8933 ldrh r3, [r6, #8]
  55160. 803260a: b113 cbz r3, 8032612 <udp_sendto_if+0x4a>
  55161. /* chain header q in front of given pbuf p (only if p contains data) */
  55162. pbuf_chain(q, p);
  55163. 803260c: 4631 mov r1, r6
  55164. 803260e: f7fd fc36 bl 802fe7e <pbuf_chain>
  55165. }
  55166. LWIP_ASSERT("check that first pbuf can hold struct udp_hdr",
  55167. (q->len >= sizeof(struct udp_hdr)));
  55168. /* q now represents the packet to be sent */
  55169. udphdr = (struct udp_hdr *)q->payload;
  55170. udphdr->src = htons(pcb->local_port);
  55171. 8032612: 8a68 ldrh r0, [r5, #18]
  55172. LWIP_DEBUGF(UDP_DEBUG, ("udp_send: added header in given pbuf %p\n", (void *)p));
  55173. }
  55174. LWIP_ASSERT("check that first pbuf can hold struct udp_hdr",
  55175. (q->len >= sizeof(struct udp_hdr)));
  55176. /* q now represents the packet to be sent */
  55177. udphdr = (struct udp_hdr *)q->payload;
  55178. 8032614: 6867 ldr r7, [r4, #4]
  55179. udphdr->src = htons(pcb->local_port);
  55180. 8032616: f7fc f9f9 bl 802ea0c <lwip_htons>
  55181. 803261a: 8038 strh r0, [r7, #0]
  55182. udphdr->dest = htons(dst_port);
  55183. 803261c: 4648 mov r0, r9
  55184. 803261e: f7fc f9f5 bl 802ea0c <lwip_htons>
  55185. /* in UDP, 0 checksum means 'no checksum' */
  55186. udphdr->chksum = 0x0000;
  55187. 8032622: 2300 movs r3, #0
  55188. LWIP_ASSERT("check that first pbuf can hold struct udp_hdr",
  55189. (q->len >= sizeof(struct udp_hdr)));
  55190. /* q now represents the packet to be sent */
  55191. udphdr = (struct udp_hdr *)q->payload;
  55192. udphdr->src = htons(pcb->local_port);
  55193. udphdr->dest = htons(dst_port);
  55194. 8032624: 8078 strh r0, [r7, #2]
  55195. /* in UDP, 0 checksum means 'no checksum' */
  55196. udphdr->chksum = 0x0000;
  55197. 8032626: 71bb strb r3, [r7, #6]
  55198. 8032628: 71fb strb r3, [r7, #7]
  55199. }
  55200. #endif /* LWIP_IGMP */
  55201. /* PCB local address is IP_ANY_ADDR? */
  55202. if (ip_addr_isany(&pcb->local_ip)) {
  55203. 803262a: 682b ldr r3, [r5, #0]
  55204. 803262c: b913 cbnz r3, 8032634 <udp_sendto_if+0x6c>
  55205. /* use outgoing network interface IP address as source address */
  55206. src_ip = &(netif->ip_addr);
  55207. 803262e: f108 0904 add.w r9, r8, #4
  55208. 8032632: e00a b.n 803264a <udp_sendto_if+0x82>
  55209. } else {
  55210. /* check if UDP PCB local IP address is correct
  55211. * this could be an old address if netif->ip_addr has changed */
  55212. if (!ip_addr_cmp(&(pcb->local_ip), &(netif->ip_addr))) {
  55213. 8032634: f8d8 2004 ldr.w r2, [r8, #4]
  55214. 8032638: 4293 cmp r3, r2
  55215. 803263a: d005 beq.n 8032648 <udp_sendto_if+0x80>
  55216. /* local_ip doesn't match, drop the packet */
  55217. if (q != p) {
  55218. 803263c: 42b4 cmp r4, r6
  55219. 803263e: d01f beq.n 8032680 <udp_sendto_if+0xb8>
  55220. /* free the header pbuf */
  55221. pbuf_free(q);
  55222. 8032640: 4620 mov r0, r4
  55223. 8032642: f7fd fb21 bl 802fc88 <pbuf_free>
  55224. 8032646: e01b b.n 8032680 <udp_sendto_if+0xb8>
  55225. }
  55226. #endif /* LWIP_IGMP */
  55227. /* PCB local address is IP_ANY_ADDR? */
  55228. if (ip_addr_isany(&pcb->local_ip)) {
  55229. 8032648: 46a9 mov r9, r5
  55230. NETIF_SET_HWADDRHINT(netif, NULL);
  55231. } else
  55232. #endif /* LWIP_UDPLITE */
  55233. { /* UDP */
  55234. LWIP_DEBUGF(UDP_DEBUG, ("udp_send: UDP packet length %"U16_F"\n", q->tot_len));
  55235. udphdr->len = htons(q->tot_len);
  55236. 803264a: 8920 ldrh r0, [r4, #8]
  55237. 803264c: f7fc f9de bl 802ea0c <lwip_htons>
  55238. 8032650: 80b8 strh r0, [r7, #4]
  55239. #endif /* CHECKSUM_GEN_UDP */
  55240. LWIP_DEBUGF(UDP_DEBUG, ("udp_send: UDP checksum 0x%04"X16_F"\n", udphdr->chksum));
  55241. LWIP_DEBUGF(UDP_DEBUG, ("udp_send: ip_output_if (,,,,IP_PROTO_UDP,)\n"));
  55242. /* output to IP */
  55243. NETIF_SET_HWADDRHINT(netif, &pcb->addr_hint);
  55244. err = ip_output_if(q, src_ip, dst_ip, pcb->ttl, pcb->tos, IP_PROTO_UDP, netif);
  55245. 8032652: 7a6a ldrb r2, [r5, #9]
  55246. 8032654: 7aab ldrb r3, [r5, #10]
  55247. 8032656: 9200 str r2, [sp, #0]
  55248. 8032658: 2211 movs r2, #17
  55249. 803265a: 9201 str r2, [sp, #4]
  55250. 803265c: 4649 mov r1, r9
  55251. 803265e: 4652 mov r2, sl
  55252. 8032660: f8cd 8008 str.w r8, [sp, #8]
  55253. 8032664: 4620 mov r0, r4
  55254. 8032666: f000 fb9d bl 8032da4 <ip_output_if>
  55255. 803266a: 4607 mov r7, r0
  55256. NETIF_SET_HWADDRHINT(netif, NULL);
  55257. }
  55258. /* TODO: must this be increased even if error occured? */
  55259. snmp_inc_udpoutdatagrams();
  55260. 803266c: f002 f940 bl 80348f0 <snmp_inc_udpoutdatagrams>
  55261. /* did we chain a separate header pbuf earlier? */
  55262. if (q != p) {
  55263. 8032670: 42b4 cmp r4, r6
  55264. 8032672: d006 beq.n 8032682 <udp_sendto_if+0xba>
  55265. /* free the header pbuf */
  55266. pbuf_free(q);
  55267. 8032674: 4620 mov r0, r4
  55268. 8032676: f7fd fb07 bl 802fc88 <pbuf_free>
  55269. 803267a: e002 b.n 8032682 <udp_sendto_if+0xba>
  55270. /* allocate header in a separate new pbuf */
  55271. q = pbuf_alloc(PBUF_IP, UDP_HLEN, PBUF_RAM);
  55272. /* new header pbuf could not be allocated? */
  55273. if (q == NULL) {
  55274. LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("udp_send: could not allocate header\n"));
  55275. return ERR_MEM;
  55276. 803267c: 27ff movs r7, #255 ; 0xff
  55277. 803267e: e000 b.n 8032682 <udp_sendto_if+0xba>
  55278. /* free the header pbuf */
  55279. pbuf_free(q);
  55280. q = NULL;
  55281. /* p is still referenced by the caller, and will live on */
  55282. }
  55283. return ERR_VAL;
  55284. 8032680: 27fa movs r7, #250 ; 0xfa
  55285. /* p is still referenced by the caller, and will live on */
  55286. }
  55287. UDP_STATS_INC(udp.xmit);
  55288. return err;
  55289. }
  55290. 8032682: b278 sxtb r0, r7
  55291. 8032684: b004 add sp, #16
  55292. 8032686: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc}
  55293. 0803268a <udp_sendto>:
  55294. * @see udp_disconnect() udp_send()
  55295. */
  55296. err_t
  55297. udp_sendto(struct udp_pcb *pcb, struct pbuf *p,
  55298. ip_addr_t *dst_ip, u16_t dst_port)
  55299. {
  55300. 803268a: b5f7 push {r0, r1, r2, r4, r5, r6, r7, lr}
  55301. 803268c: 4605 mov r5, r0
  55302. /* find the outgoing network interface for this packet */
  55303. #if LWIP_IGMP
  55304. netif = ip_route((ip_addr_ismulticast(dst_ip))?(&(pcb->multicast_ip)):(dst_ip));
  55305. #else
  55306. netif = ip_route(dst_ip);
  55307. 803268e: 4610 mov r0, r2
  55308. * @see udp_disconnect() udp_send()
  55309. */
  55310. err_t
  55311. udp_sendto(struct udp_pcb *pcb, struct pbuf *p,
  55312. ip_addr_t *dst_ip, u16_t dst_port)
  55313. {
  55314. 8032690: 460f mov r7, r1
  55315. 8032692: 4614 mov r4, r2
  55316. 8032694: 461e mov r6, r3
  55317. /* find the outgoing network interface for this packet */
  55318. #if LWIP_IGMP
  55319. netif = ip_route((ip_addr_ismulticast(dst_ip))?(&(pcb->multicast_ip)):(dst_ip));
  55320. #else
  55321. netif = ip_route(dst_ip);
  55322. 8032696: f000 fa81 bl 8032b9c <ip_route>
  55323. #endif /* LWIP_IGMP */
  55324. /* no outgoing network interface could be found? */
  55325. if (netif == NULL) {
  55326. 803269a: b138 cbz r0, 80326ac <udp_sendto+0x22>
  55327. return ERR_RTE;
  55328. }
  55329. #if LWIP_CHECKSUM_ON_COPY
  55330. return udp_sendto_if_chksum(pcb, p, dst_ip, dst_port, netif, have_chksum, chksum);
  55331. #else /* LWIP_CHECKSUM_ON_COPY */
  55332. return udp_sendto_if(pcb, p, dst_ip, dst_port, netif);
  55333. 803269c: 9000 str r0, [sp, #0]
  55334. 803269e: 4639 mov r1, r7
  55335. 80326a0: 4628 mov r0, r5
  55336. 80326a2: 4622 mov r2, r4
  55337. 80326a4: 4633 mov r3, r6
  55338. 80326a6: f7ff ff8f bl 80325c8 <udp_sendto_if>
  55339. 80326aa: e000 b.n 80326ae <udp_sendto+0x24>
  55340. /* no outgoing network interface could be found? */
  55341. if (netif == NULL) {
  55342. LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("udp_send: No route to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n",
  55343. ip4_addr1_16(dst_ip), ip4_addr2_16(dst_ip), ip4_addr3_16(dst_ip), ip4_addr4_16(dst_ip)));
  55344. UDP_STATS_INC(udp.rterr);
  55345. return ERR_RTE;
  55346. 80326ac: 20fc movs r0, #252 ; 0xfc
  55347. #if LWIP_CHECKSUM_ON_COPY
  55348. return udp_sendto_if_chksum(pcb, p, dst_ip, dst_port, netif, have_chksum, chksum);
  55349. #else /* LWIP_CHECKSUM_ON_COPY */
  55350. return udp_sendto_if(pcb, p, dst_ip, dst_port, netif);
  55351. #endif /* LWIP_CHECKSUM_ON_COPY */
  55352. }
  55353. 80326ae: b240 sxtb r0, r0
  55354. 80326b0: bdfe pop {r1, r2, r3, r4, r5, r6, r7, pc}
  55355. 080326b2 <udp_send>:
  55356. */
  55357. err_t
  55358. udp_send(struct udp_pcb *pcb, struct pbuf *p)
  55359. {
  55360. /* send to the packet using remote ip and port stored in the pcb */
  55361. return udp_sendto(pcb, p, &pcb->remote_ip, pcb->remote_port);
  55362. 80326b2: 8a83 ldrh r3, [r0, #20]
  55363. 80326b4: 1d02 adds r2, r0, #4
  55364. 80326b6: f7ff bfe8 b.w 803268a <udp_sendto>
  55365. 80326ba: 0000 movs r0, r0
  55366. 080326bc <udp_connect>:
  55367. *
  55368. * @see udp_disconnect()
  55369. */
  55370. err_t
  55371. udp_connect(struct udp_pcb *pcb, ip_addr_t *ipaddr, u16_t port)
  55372. {
  55373. 80326bc: b570 push {r4, r5, r6, lr}
  55374. 80326be: 4616 mov r6, r2
  55375. struct udp_pcb *ipcb;
  55376. if (pcb->local_port == 0) {
  55377. 80326c0: 8a42 ldrh r2, [r0, #18]
  55378. *
  55379. * @see udp_disconnect()
  55380. */
  55381. err_t
  55382. udp_connect(struct udp_pcb *pcb, ip_addr_t *ipaddr, u16_t port)
  55383. {
  55384. 80326c2: 4604 mov r4, r0
  55385. 80326c4: 460d mov r5, r1
  55386. struct udp_pcb *ipcb;
  55387. if (pcb->local_port == 0) {
  55388. 80326c6: b10a cbz r2, 80326cc <udp_connect+0x10>
  55389. if (err != ERR_OK) {
  55390. return err;
  55391. }
  55392. }
  55393. ip_addr_set(&pcb->remote_ip, ipaddr);
  55394. 80326c8: b935 cbnz r5, 80326d8 <udp_connect+0x1c>
  55395. 80326ca: e006 b.n 80326da <udp_connect+0x1e>
  55396. udp_connect(struct udp_pcb *pcb, ip_addr_t *ipaddr, u16_t port)
  55397. {
  55398. struct udp_pcb *ipcb;
  55399. if (pcb->local_port == 0) {
  55400. err_t err = udp_bind(pcb, &pcb->local_ip, pcb->local_port);
  55401. 80326cc: 4601 mov r1, r0
  55402. 80326ce: f7ff ff2b bl 8032528 <udp_bind>
  55403. if (err != ERR_OK) {
  55404. 80326d2: 2800 cmp r0, #0
  55405. 80326d4: d0f8 beq.n 80326c8 <udp_connect+0xc>
  55406. 80326d6: e013 b.n 8032700 <udp_connect+0x44>
  55407. return err;
  55408. }
  55409. }
  55410. ip_addr_set(&pcb->remote_ip, ipaddr);
  55411. 80326d8: 682d ldr r5, [r5, #0]
  55412. pcb->remote_port = port;
  55413. pcb->flags |= UDP_FLAGS_CONNECTED;
  55414. 80326da: 7c23 ldrb r3, [r4, #16]
  55415. ip4_addr1_16(&pcb->local_ip), ip4_addr2_16(&pcb->local_ip),
  55416. ip4_addr3_16(&pcb->local_ip), ip4_addr4_16(&pcb->local_ip),
  55417. pcb->local_port));
  55418. /* Insert UDP PCB into the list of active UDP PCBs. */
  55419. for (ipcb = udp_pcbs; ipcb != NULL; ipcb = ipcb->next) {
  55420. 80326dc: 4a09 ldr r2, [pc, #36] ; (8032704 <udp_connect+0x48>)
  55421. if (err != ERR_OK) {
  55422. return err;
  55423. }
  55424. }
  55425. ip_addr_set(&pcb->remote_ip, ipaddr);
  55426. 80326de: 6065 str r5, [r4, #4]
  55427. pcb->remote_port = port;
  55428. pcb->flags |= UDP_FLAGS_CONNECTED;
  55429. 80326e0: f043 0304 orr.w r3, r3, #4
  55430. 80326e4: 7423 strb r3, [r4, #16]
  55431. ip4_addr1_16(&pcb->local_ip), ip4_addr2_16(&pcb->local_ip),
  55432. ip4_addr3_16(&pcb->local_ip), ip4_addr4_16(&pcb->local_ip),
  55433. pcb->local_port));
  55434. /* Insert UDP PCB into the list of active UDP PCBs. */
  55435. for (ipcb = udp_pcbs; ipcb != NULL; ipcb = ipcb->next) {
  55436. 80326e6: 6813 ldr r3, [r2, #0]
  55437. return err;
  55438. }
  55439. }
  55440. ip_addr_set(&pcb->remote_ip, ipaddr);
  55441. pcb->remote_port = port;
  55442. 80326e8: 82a6 strh r6, [r4, #20]
  55443. ip4_addr1_16(&pcb->local_ip), ip4_addr2_16(&pcb->local_ip),
  55444. ip4_addr3_16(&pcb->local_ip), ip4_addr4_16(&pcb->local_ip),
  55445. pcb->local_port));
  55446. /* Insert UDP PCB into the list of active UDP PCBs. */
  55447. for (ipcb = udp_pcbs; ipcb != NULL; ipcb = ipcb->next) {
  55448. 80326ea: 4618 mov r0, r3
  55449. 80326ec: e002 b.n 80326f4 <udp_connect+0x38>
  55450. if (pcb == ipcb) {
  55451. 80326ee: 4284 cmp r4, r0
  55452. 80326f0: d005 beq.n 80326fe <udp_connect+0x42>
  55453. ip4_addr1_16(&pcb->local_ip), ip4_addr2_16(&pcb->local_ip),
  55454. ip4_addr3_16(&pcb->local_ip), ip4_addr4_16(&pcb->local_ip),
  55455. pcb->local_port));
  55456. /* Insert UDP PCB into the list of active UDP PCBs. */
  55457. for (ipcb = udp_pcbs; ipcb != NULL; ipcb = ipcb->next) {
  55458. 80326f2: 68c0 ldr r0, [r0, #12]
  55459. 80326f4: 2800 cmp r0, #0
  55460. 80326f6: d1fa bne.n 80326ee <udp_connect+0x32>
  55461. /* already on the list, just return */
  55462. return ERR_OK;
  55463. }
  55464. }
  55465. /* PCB not yet on the list, add PCB now */
  55466. pcb->next = udp_pcbs;
  55467. 80326f8: 60e3 str r3, [r4, #12]
  55468. udp_pcbs = pcb;
  55469. 80326fa: 6014 str r4, [r2, #0]
  55470. return ERR_OK;
  55471. 80326fc: e000 b.n 8032700 <udp_connect+0x44>
  55472. /* Insert UDP PCB into the list of active UDP PCBs. */
  55473. for (ipcb = udp_pcbs; ipcb != NULL; ipcb = ipcb->next) {
  55474. if (pcb == ipcb) {
  55475. /* already on the list, just return */
  55476. return ERR_OK;
  55477. 80326fe: 2000 movs r0, #0
  55478. }
  55479. /* PCB not yet on the list, add PCB now */
  55480. pcb->next = udp_pcbs;
  55481. udp_pcbs = pcb;
  55482. return ERR_OK;
  55483. }
  55484. 8032700: b240 sxtb r0, r0
  55485. 8032702: bd70 pop {r4, r5, r6, pc}
  55486. 8032704: 2000ff3c .word 0x2000ff3c
  55487. 08032708 <udp_disconnect>:
  55488. */
  55489. void
  55490. udp_disconnect(struct udp_pcb *pcb)
  55491. {
  55492. /* reset remote address association */
  55493. ip_addr_set_any(&pcb->remote_ip);
  55494. 8032708: 2300 movs r3, #0
  55495. 803270a: 6043 str r3, [r0, #4]
  55496. pcb->remote_port = 0;
  55497. 803270c: 8283 strh r3, [r0, #20]
  55498. /* mark PCB as unconnected */
  55499. pcb->flags &= ~UDP_FLAGS_CONNECTED;
  55500. 803270e: 7c03 ldrb r3, [r0, #16]
  55501. 8032710: f023 0304 bic.w r3, r3, #4
  55502. 8032714: 7403 strb r3, [r0, #16]
  55503. 8032716: 4770 bx lr
  55504. 08032718 <udp_recv>:
  55505. */
  55506. void
  55507. udp_recv(struct udp_pcb *pcb, udp_recv_fn recv, void *recv_arg)
  55508. {
  55509. /* remember recv() callback and user data */
  55510. pcb->recv = recv;
  55511. 8032718: 6181 str r1, [r0, #24]
  55512. pcb->recv_arg = recv_arg;
  55513. 803271a: 61c2 str r2, [r0, #28]
  55514. 803271c: 4770 bx lr
  55515. 803271e: 0000 movs r0, r0
  55516. 08032720 <udp_remove>:
  55517. *
  55518. * @see udp_new()
  55519. */
  55520. void
  55521. udp_remove(struct udp_pcb *pcb)
  55522. {
  55523. 8032720: b510 push {r4, lr}
  55524. 8032722: 4604 mov r4, r0
  55525. struct udp_pcb *pcb2;
  55526. snmp_delete_udpidx_tree(pcb);
  55527. 8032724: f002 f930 bl 8034988 <snmp_delete_udpidx_tree>
  55528. /* pcb to be removed is first in list? */
  55529. if (udp_pcbs == pcb) {
  55530. 8032728: 4a0a ldr r2, [pc, #40] ; (8032754 <udp_remove+0x34>)
  55531. 803272a: 6813 ldr r3, [r2, #0]
  55532. 803272c: 42a3 cmp r3, r4
  55533. 803272e: d109 bne.n 8032744 <udp_remove+0x24>
  55534. /* make list start at 2nd pcb */
  55535. udp_pcbs = udp_pcbs->next;
  55536. 8032730: 68e3 ldr r3, [r4, #12]
  55537. 8032732: 6013 str r3, [r2, #0]
  55538. 8032734: e008 b.n 8032748 <udp_remove+0x28>
  55539. /* pcb not 1st in list */
  55540. } else {
  55541. for (pcb2 = udp_pcbs; pcb2 != NULL; pcb2 = pcb2->next) {
  55542. /* find pcb in udp_pcbs list */
  55543. if (pcb2->next != NULL && pcb2->next == pcb) {
  55544. 8032736: 68da ldr r2, [r3, #12]
  55545. 8032738: b11a cbz r2, 8032742 <udp_remove+0x22>
  55546. 803273a: 42a2 cmp r2, r4
  55547. /* remove pcb from list */
  55548. pcb2->next = pcb->next;
  55549. 803273c: bf04 itt eq
  55550. 803273e: 68e2 ldreq r2, [r4, #12]
  55551. 8032740: 60da streq r2, [r3, #12]
  55552. if (udp_pcbs == pcb) {
  55553. /* make list start at 2nd pcb */
  55554. udp_pcbs = udp_pcbs->next;
  55555. /* pcb not 1st in list */
  55556. } else {
  55557. for (pcb2 = udp_pcbs; pcb2 != NULL; pcb2 = pcb2->next) {
  55558. 8032742: 68db ldr r3, [r3, #12]
  55559. 8032744: 2b00 cmp r3, #0
  55560. 8032746: d1f6 bne.n 8032736 <udp_remove+0x16>
  55561. /* remove pcb from list */
  55562. pcb2->next = pcb->next;
  55563. }
  55564. }
  55565. }
  55566. memp_free(MEMP_UDP_PCB, pcb);
  55567. 8032748: 2001 movs r0, #1
  55568. 803274a: 4621 mov r1, r4
  55569. }
  55570. 803274c: e8bd 4010 ldmia.w sp!, {r4, lr}
  55571. /* remove pcb from list */
  55572. pcb2->next = pcb->next;
  55573. }
  55574. }
  55575. }
  55576. memp_free(MEMP_UDP_PCB, pcb);
  55577. 8032750: f7fd b990 b.w 802fa74 <memp_free>
  55578. 8032754: 2000ff3c .word 0x2000ff3c
  55579. 08032758 <udp_new>:
  55580. *
  55581. * @see udp_remove()
  55582. */
  55583. struct udp_pcb *
  55584. udp_new(void)
  55585. {
  55586. 8032758: b510 push {r4, lr}
  55587. struct udp_pcb *pcb;
  55588. pcb = (struct udp_pcb *)memp_malloc(MEMP_UDP_PCB);
  55589. 803275a: 2001 movs r0, #1
  55590. 803275c: f7fd f974 bl 802fa48 <memp_malloc>
  55591. /* could allocate UDP PCB? */
  55592. if (pcb != NULL) {
  55593. 8032760: 4604 mov r4, r0
  55594. 8032762: b128 cbz r0, 8032770 <udp_new+0x18>
  55595. /* UDP Lite: by initializing to all zeroes, chksum_len is set to 0
  55596. * which means checksum is generated over the whole datagram per default
  55597. * (recommended as default by RFC 3828). */
  55598. /* initialize PCB to all zeroes */
  55599. memset(pcb, 0, sizeof(struct udp_pcb));
  55600. 8032764: 2100 movs r1, #0
  55601. 8032766: 2220 movs r2, #32
  55602. 8032768: f7ef fb56 bl 8021e18 <memset>
  55603. pcb->ttl = UDP_TTL;
  55604. 803276c: 23ff movs r3, #255 ; 0xff
  55605. 803276e: 72a3 strb r3, [r4, #10]
  55606. }
  55607. return pcb;
  55608. }
  55609. 8032770: 4620 mov r0, r4
  55610. 8032772: bd10 pop {r4, pc}
  55611. 08032774 <icmp_input>:
  55612. * @param p the icmp echo request packet, p->payload pointing to the ip header
  55613. * @param inp the netif on which this packet was received
  55614. */
  55615. void
  55616. icmp_input(struct pbuf *p, struct netif *inp)
  55617. {
  55618. 8032774: e92d 43f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, lr}
  55619. 8032778: 4604 mov r4, r0
  55620. 803277a: b085 sub sp, #20
  55621. 803277c: 460f mov r7, r1
  55622. struct icmp_echo_hdr *iecho;
  55623. struct ip_hdr *iphdr;
  55624. s16_t hlen;
  55625. ICMP_STATS_INC(icmp.recv);
  55626. snmp_inc_icmpinmsgs();
  55627. 803277e: f002 f837 bl 80347f0 <snmp_inc_icmpinmsgs>
  55628. iphdr = (struct ip_hdr *)p->payload;
  55629. 8032782: 6865 ldr r5, [r4, #4]
  55630. hlen = IPH_HL(iphdr) * 4;
  55631. 8032784: f895 8000 ldrb.w r8, [r5]
  55632. 8032788: f008 080f and.w r8, r8, #15
  55633. 803278c: ea4f 0888 mov.w r8, r8, lsl #2
  55634. if (pbuf_header(p, -hlen) || (p->tot_len < sizeof(u16_t)*2)) {
  55635. 8032790: f1c8 0900 rsb r9, r8, #0
  55636. 8032794: 4620 mov r0, r4
  55637. 8032796: fa0f f189 sxth.w r1, r9
  55638. 803279a: f7fd fa4a bl 802fc32 <pbuf_header>
  55639. 803279e: 2800 cmp r0, #0
  55640. 80327a0: d172 bne.n 8032888 <icmp_input+0x114>
  55641. 80327a2: 8923 ldrh r3, [r4, #8]
  55642. 80327a4: 2b03 cmp r3, #3
  55643. 80327a6: d96f bls.n 8032888 <icmp_input+0x114>
  55644. LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: short ICMP (%"U16_F" bytes) received\n", p->tot_len));
  55645. goto lenerr;
  55646. }
  55647. type = *((u8_t *)p->payload);
  55648. 80327a8: 6863 ldr r3, [r4, #4]
  55649. #ifdef LWIP_DEBUG
  55650. code = *(((u8_t *)p->payload)+1);
  55651. #endif /* LWIP_DEBUG */
  55652. switch (type) {
  55653. 80327aa: 781b ldrb r3, [r3, #0]
  55654. 80327ac: 2b08 cmp r3, #8
  55655. 80327ae: d165 bne.n 803287c <icmp_input+0x108>
  55656. #if !LWIP_MULTICAST_PING || !LWIP_BROADCAST_PING
  55657. {
  55658. int accepted = 1;
  55659. #if !LWIP_MULTICAST_PING
  55660. /* multicast destination address? */
  55661. if (ip_addr_ismulticast(&current_iphdr_dest)) {
  55662. 80327b0: 4b39 ldr r3, [pc, #228] ; (8032898 <icmp_input+0x124>)
  55663. 80327b2: 681e ldr r6, [r3, #0]
  55664. accepted = 0;
  55665. }
  55666. #endif /* LWIP_MULTICAST_PING */
  55667. #if !LWIP_BROADCAST_PING
  55668. /* broadcast destination address? */
  55669. if (ip_addr_isbroadcast(&current_iphdr_dest, inp)) {
  55670. 80327b4: 4639 mov r1, r7
  55671. 80327b6: 4630 mov r0, r6
  55672. 80327b8: f000 f900 bl 80329bc <ip4_addr_isbroadcast>
  55673. 80327bc: 2800 cmp r0, #0
  55674. 80327be: d15d bne.n 803287c <icmp_input+0x108>
  55675. #if !LWIP_MULTICAST_PING || !LWIP_BROADCAST_PING
  55676. {
  55677. int accepted = 1;
  55678. #if !LWIP_MULTICAST_PING
  55679. /* multicast destination address? */
  55680. if (ip_addr_ismulticast(&current_iphdr_dest)) {
  55681. 80327c0: f006 06f0 and.w r6, r6, #240 ; 0xf0
  55682. if (ip_addr_isbroadcast(&current_iphdr_dest, inp)) {
  55683. accepted = 0;
  55684. }
  55685. #endif /* LWIP_BROADCAST_PING */
  55686. /* broadcast or multicast destination address not acceptd? */
  55687. if (!accepted) {
  55688. 80327c4: 2ee0 cmp r6, #224 ; 0xe0
  55689. 80327c6: d100 bne.n 80327ca <icmp_input+0x56>
  55690. 80327c8: e058 b.n 803287c <icmp_input+0x108>
  55691. return;
  55692. }
  55693. }
  55694. #endif /* !LWIP_MULTICAST_PING || !LWIP_BROADCAST_PING */
  55695. LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: ping\n"));
  55696. if (p->tot_len < sizeof(struct icmp_echo_hdr)) {
  55697. 80327ca: 8923 ldrh r3, [r4, #8]
  55698. 80327cc: 2b07 cmp r3, #7
  55699. 80327ce: d95b bls.n 8032888 <icmp_input+0x114>
  55700. LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: bad ICMP echo received\n"));
  55701. goto lenerr;
  55702. }
  55703. if (inet_chksum_pbuf(p) != 0) {
  55704. 80327d0: 4620 mov r0, r4
  55705. 80327d2: f000 f8cf bl 8032974 <inet_chksum_pbuf>
  55706. 80327d6: b100 cbz r0, 80327da <icmp_input+0x66>
  55707. 80327d8: e056 b.n 8032888 <icmp_input+0x114>
  55708. ICMP_STATS_INC(icmp.chkerr);
  55709. snmp_inc_icmpinerrors();
  55710. return;
  55711. }
  55712. #if LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN
  55713. if (pbuf_header(p, (PBUF_IP_HLEN + PBUF_LINK_HLEN))) {
  55714. 80327da: 4620 mov r0, r4
  55715. 80327dc: 2122 movs r1, #34 ; 0x22
  55716. ICMP_STATS_INC(icmp.recv);
  55717. snmp_inc_icmpinmsgs();
  55718. iphdr = (struct ip_hdr *)p->payload;
  55719. hlen = IPH_HL(iphdr) * 4;
  55720. 80327de: fa1f f888 uxth.w r8, r8
  55721. ICMP_STATS_INC(icmp.chkerr);
  55722. snmp_inc_icmpinerrors();
  55723. return;
  55724. }
  55725. #if LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN
  55726. if (pbuf_header(p, (PBUF_IP_HLEN + PBUF_LINK_HLEN))) {
  55727. 80327e2: f7fd fa26 bl 802fc32 <pbuf_header>
  55728. 80327e6: b1f8 cbz r0, 8032828 <icmp_input+0xb4>
  55729. /* p is not big enough to contain link headers
  55730. * allocate a new one and copy p into it
  55731. */
  55732. struct pbuf *r;
  55733. /* switch p->payload to ip header */
  55734. if (pbuf_header(p, hlen)) {
  55735. 80327e8: 4620 mov r0, r4
  55736. 80327ea: 4641 mov r1, r8
  55737. 80327ec: f7fd fa21 bl 802fc32 <pbuf_header>
  55738. 80327f0: 4602 mov r2, r0
  55739. 80327f2: 2800 cmp r0, #0
  55740. 80327f4: d148 bne.n 8032888 <icmp_input+0x114>
  55741. LWIP_ASSERT("icmp_input: moving p->payload to ip header failed\n", 0);
  55742. goto memerr;
  55743. }
  55744. /* allocate new packet buffer with space for link headers */
  55745. r = pbuf_alloc(PBUF_LINK, p->tot_len, PBUF_RAM);
  55746. 80327f6: 2002 movs r0, #2
  55747. 80327f8: 8921 ldrh r1, [r4, #8]
  55748. 80327fa: f7fd fa92 bl 802fd22 <pbuf_alloc>
  55749. if (r == NULL) {
  55750. 80327fe: 4606 mov r6, r0
  55751. 8032800: 2800 cmp r0, #0
  55752. 8032802: d041 beq.n 8032888 <icmp_input+0x114>
  55753. goto memerr;
  55754. }
  55755. LWIP_ASSERT("check that first pbuf can hold struct the ICMP header",
  55756. (r->len >= hlen + sizeof(struct icmp_echo_hdr)));
  55757. /* copy the whole packet including ip header */
  55758. if (pbuf_copy(r, p) != ERR_OK) {
  55759. 8032804: 4621 mov r1, r4
  55760. 8032806: f7fd fb43 bl 802fe90 <pbuf_copy>
  55761. 803280a: 2800 cmp r0, #0
  55762. 803280c: d13c bne.n 8032888 <icmp_input+0x114>
  55763. LWIP_ASSERT("icmp_input: copying to new pbuf failed\n", 0);
  55764. goto memerr;
  55765. }
  55766. iphdr = (struct ip_hdr *)r->payload;
  55767. /* switch r->payload back to icmp header */
  55768. if (pbuf_header(r, -hlen)) {
  55769. 803280e: 4630 mov r0, r6
  55770. 8032810: fa0f f189 sxth.w r1, r9
  55771. /* copy the whole packet including ip header */
  55772. if (pbuf_copy(r, p) != ERR_OK) {
  55773. LWIP_ASSERT("icmp_input: copying to new pbuf failed\n", 0);
  55774. goto memerr;
  55775. }
  55776. iphdr = (struct ip_hdr *)r->payload;
  55777. 8032814: 6875 ldr r5, [r6, #4]
  55778. /* switch r->payload back to icmp header */
  55779. if (pbuf_header(r, -hlen)) {
  55780. 8032816: f7fd fa0c bl 802fc32 <pbuf_header>
  55781. 803281a: 2800 cmp r0, #0
  55782. 803281c: d134 bne.n 8032888 <icmp_input+0x114>
  55783. LWIP_ASSERT("icmp_input: restoring original p->payload failed\n", 0);
  55784. goto memerr;
  55785. }
  55786. /* free the original p */
  55787. pbuf_free(p);
  55788. 803281e: 4620 mov r0, r4
  55789. 8032820: f7fd fa32 bl 802fc88 <pbuf_free>
  55790. 8032824: 4634 mov r4, r6
  55791. 8032826: e006 b.n 8032836 <icmp_input+0xc2>
  55792. /* we now have an identical copy of p that has room for link headers */
  55793. p = r;
  55794. } else {
  55795. /* restore p->payload to point to icmp header */
  55796. if (pbuf_header(p, -(s16_t)(PBUF_IP_HLEN + PBUF_LINK_HLEN))) {
  55797. 8032828: 4620 mov r0, r4
  55798. 803282a: f06f 0121 mvn.w r1, #33 ; 0x21
  55799. 803282e: f7fd fa00 bl 802fc32 <pbuf_header>
  55800. 8032832: 2800 cmp r0, #0
  55801. 8032834: d128 bne.n 8032888 <icmp_input+0x114>
  55802. #endif /* LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN */
  55803. /* At this point, all checks are OK. */
  55804. /* We generate an answer by switching the dest and src ip addresses,
  55805. * setting the icmp type to ECHO_RESPONSE and updating the checksum. */
  55806. iecho = (struct icmp_echo_hdr *)p->payload;
  55807. ip_addr_copy(iphdr->src, *ip_current_dest_addr());
  55808. 8032836: f8df 9060 ldr.w r9, [pc, #96] ; 8032898 <icmp_input+0x124>
  55809. }
  55810. #endif /* LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN */
  55811. /* At this point, all checks are OK. */
  55812. /* We generate an answer by switching the dest and src ip addresses,
  55813. * setting the icmp type to ECHO_RESPONSE and updating the checksum. */
  55814. iecho = (struct icmp_echo_hdr *)p->payload;
  55815. 803283a: 6863 ldr r3, [r4, #4]
  55816. ip_addr_copy(iphdr->src, *ip_current_dest_addr());
  55817. 803283c: f8d9 2000 ldr.w r2, [r9]
  55818. 8032840: 60ea str r2, [r5, #12]
  55819. ip_addr_copy(iphdr->dest, *ip_current_src_addr());
  55820. 8032842: 4a16 ldr r2, [pc, #88] ; (803289c <icmp_input+0x128>)
  55821. 8032844: 6812 ldr r2, [r2, #0]
  55822. #else // CHECKSUM_GEN_ICMP
  55823. iecho->chksum = 0;
  55824. #endif // CHECKSUM_GEN_ICMP
  55825. */
  55826. /* Set the correct TTL and recalculate the header checksum. */
  55827. IPH_TTL_SET(iphdr, ICMP_TTL);
  55828. 8032846: 26ff movs r6, #255 ; 0xff
  55829. /* At this point, all checks are OK. */
  55830. /* We generate an answer by switching the dest and src ip addresses,
  55831. * setting the icmp type to ECHO_RESPONSE and updating the checksum. */
  55832. iecho = (struct icmp_echo_hdr *)p->payload;
  55833. ip_addr_copy(iphdr->src, *ip_current_dest_addr());
  55834. ip_addr_copy(iphdr->dest, *ip_current_src_addr());
  55835. 8032848: 612a str r2, [r5, #16]
  55836. ICMPH_TYPE_SET(iecho, ICMP_ER);
  55837. 803284a: 2200 movs r2, #0
  55838. 803284c: 701a strb r2, [r3, #0]
  55839. //-----------------------------------------------------------
  55840. // Добавил фикс 15.08.15.
  55841. // Фикс исправляет баг с пингом.
  55842. #ifdef CHECKSUM_BY_HARDWARE
  55843. iecho->chksum = 0;
  55844. 803284e: 709a strb r2, [r3, #2]
  55845. 8032850: 70da strb r2, [r3, #3]
  55846. iecho->chksum = 0;
  55847. #endif // CHECKSUM_GEN_ICMP
  55848. */
  55849. /* Set the correct TTL and recalculate the header checksum. */
  55850. IPH_TTL_SET(iphdr, ICMP_TTL);
  55851. IPH_CHKSUM_SET(iphdr, 0);
  55852. 8032852: 72aa strb r2, [r5, #10]
  55853. 8032854: 72ea strb r2, [r5, #11]
  55854. #else // CHECKSUM_GEN_ICMP
  55855. iecho->chksum = 0;
  55856. #endif // CHECKSUM_GEN_ICMP
  55857. */
  55858. /* Set the correct TTL and recalculate the header checksum. */
  55859. IPH_TTL_SET(iphdr, ICMP_TTL);
  55860. 8032856: 722e strb r6, [r5, #8]
  55861. IPH_CHKSUM_SET(iphdr, inet_chksum(iphdr, IP_HLEN));
  55862. #endif /* CHECKSUM_GEN_IP */
  55863. ICMP_STATS_INC(icmp.xmit);
  55864. /* increase number of messages attempted to send */
  55865. snmp_inc_icmpoutmsgs();
  55866. 8032858: f001 ffda bl 8034810 <snmp_inc_icmpoutmsgs>
  55867. /* increase number of echo replies attempted to send */
  55868. snmp_inc_icmpoutechoreps();
  55869. 803285c: f001 ffe8 bl 8034830 <snmp_inc_icmpoutechoreps>
  55870. if(pbuf_header(p, hlen)) {
  55871. 8032860: 4620 mov r0, r4
  55872. 8032862: 4641 mov r1, r8
  55873. 8032864: f7fd f9e5 bl 802fc32 <pbuf_header>
  55874. 8032868: 4602 mov r2, r0
  55875. 803286a: b938 cbnz r0, 803287c <icmp_input+0x108>
  55876. LWIP_ASSERT("Can't move over header in packet", 0);
  55877. } else {
  55878. err_t ret;
  55879. /* send an ICMP packet, src addr is the dest addr of the curren packet */
  55880. ret = ip_output_if(p, ip_current_dest_addr(), IP_HDRINCL,
  55881. 803286c: 2301 movs r3, #1
  55882. 803286e: e88d 0089 stmia.w sp, {r0, r3, r7}
  55883. 8032872: 4620 mov r0, r4
  55884. 8032874: 4649 mov r1, r9
  55885. 8032876: 4633 mov r3, r6
  55886. 8032878: f000 fa94 bl 8032da4 <ip_output_if>
  55887. LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: ICMP type %"S16_F" code %"S16_F" not supported.\n",
  55888. (s16_t)type, (s16_t)code));
  55889. ICMP_STATS_INC(icmp.proterr);
  55890. ICMP_STATS_INC(icmp.drop);
  55891. }
  55892. pbuf_free(p);
  55893. 803287c: 4620 mov r0, r4
  55894. pbuf_free(p);
  55895. ICMP_STATS_INC(icmp.err);
  55896. snmp_inc_icmpinerrors();
  55897. return;
  55898. #endif /* LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN */
  55899. }
  55900. 803287e: b005 add sp, #20
  55901. 8032880: e8bd 43f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, lr}
  55902. LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: ICMP type %"S16_F" code %"S16_F" not supported.\n",
  55903. (s16_t)type, (s16_t)code));
  55904. ICMP_STATS_INC(icmp.proterr);
  55905. ICMP_STATS_INC(icmp.drop);
  55906. }
  55907. pbuf_free(p);
  55908. 8032884: f7fd ba00 b.w 802fc88 <pbuf_free>
  55909. ICMP_STATS_INC(icmp.lenerr);
  55910. snmp_inc_icmpinerrors();
  55911. return;
  55912. #if LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN
  55913. memerr:
  55914. pbuf_free(p);
  55915. 8032888: 4620 mov r0, r4
  55916. 803288a: f7fd f9fd bl 802fc88 <pbuf_free>
  55917. ICMP_STATS_INC(icmp.err);
  55918. snmp_inc_icmpinerrors();
  55919. return;
  55920. #endif /* LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN */
  55921. }
  55922. 803288e: b005 add sp, #20
  55923. 8032890: e8bd 43f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, lr}
  55924. return;
  55925. #if LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN
  55926. memerr:
  55927. pbuf_free(p);
  55928. ICMP_STATS_INC(icmp.err);
  55929. snmp_inc_icmpinerrors();
  55930. 8032894: f001 bfb4 b.w 8034800 <snmp_inc_icmpinerrors>
  55931. 8032898: 2000ff48 .word 0x2000ff48
  55932. 803289c: 2000ff40 .word 0x2000ff40
  55933. 080328a0 <icmp_dest_unreach>:
  55934. * p->payload pointing to the IP header
  55935. * @param t type of the 'unreachable' packet
  55936. */
  55937. void
  55938. icmp_dest_unreach(struct pbuf *p, enum icmp_dur_type t)
  55939. {
  55940. 80328a0: e92d 41ff stmdb sp!, {r0, r1, r2, r3, r4, r5, r6, r7, r8, lr}
  55941. 80328a4: 4607 mov r7, r0
  55942. 80328a6: 460d mov r5, r1
  55943. /* we can use the echo header here */
  55944. struct icmp_echo_hdr *icmphdr;
  55945. ip_addr_t iphdr_src;
  55946. /* ICMP header + IP header + 8 bytes of data */
  55947. q = pbuf_alloc(PBUF_IP, sizeof(struct icmp_echo_hdr) + IP_HLEN + ICMP_DEST_UNREACH_DATASIZE,
  55948. 80328a8: 2001 movs r0, #1
  55949. 80328aa: 2124 movs r1, #36 ; 0x24
  55950. 80328ac: 2200 movs r2, #0
  55951. 80328ae: f7fd fa38 bl 802fd22 <pbuf_alloc>
  55952. PBUF_RAM);
  55953. if (q == NULL) {
  55954. 80328b2: 4606 mov r6, r0
  55955. 80328b4: b358 cbz r0, 803290e <icmp_dest_unreach+0x6e>
  55956. ip_addr_debug_print(ICMP_DEBUG, &(iphdr->src));
  55957. LWIP_DEBUGF(ICMP_DEBUG, (" to "));
  55958. ip_addr_debug_print(ICMP_DEBUG, &(iphdr->dest));
  55959. LWIP_DEBUGF(ICMP_DEBUG, ("\n"));
  55960. icmphdr = (struct icmp_echo_hdr *)q->payload;
  55961. 80328b6: 6844 ldr r4, [r0, #4]
  55962. return;
  55963. }
  55964. LWIP_ASSERT("check that first pbuf can hold icmp message",
  55965. (q->len >= (sizeof(struct icmp_echo_hdr) + IP_HLEN + ICMP_DEST_UNREACH_DATASIZE)));
  55966. iphdr = (struct ip_hdr *)p->payload;
  55967. 80328b8: f8d7 8004 ldr.w r8, [r7, #4]
  55968. ip_addr_debug_print(ICMP_DEBUG, &(iphdr->dest));
  55969. LWIP_DEBUGF(ICMP_DEBUG, ("\n"));
  55970. icmphdr = (struct icmp_echo_hdr *)q->payload;
  55971. icmphdr->type = type;
  55972. icmphdr->code = code;
  55973. 80328bc: 7065 strb r5, [r4, #1]
  55974. LWIP_DEBUGF(ICMP_DEBUG, (" to "));
  55975. ip_addr_debug_print(ICMP_DEBUG, &(iphdr->dest));
  55976. LWIP_DEBUGF(ICMP_DEBUG, ("\n"));
  55977. icmphdr = (struct icmp_echo_hdr *)q->payload;
  55978. icmphdr->type = type;
  55979. 80328be: 2303 movs r3, #3
  55980. icmphdr->code = code;
  55981. icmphdr->id = 0;
  55982. 80328c0: 2500 movs r5, #0
  55983. LWIP_DEBUGF(ICMP_DEBUG, (" to "));
  55984. ip_addr_debug_print(ICMP_DEBUG, &(iphdr->dest));
  55985. LWIP_DEBUGF(ICMP_DEBUG, ("\n"));
  55986. icmphdr = (struct icmp_echo_hdr *)q->payload;
  55987. icmphdr->type = type;
  55988. 80328c2: 7023 strb r3, [r4, #0]
  55989. icmphdr->code = code;
  55990. icmphdr->id = 0;
  55991. 80328c4: 7125 strb r5, [r4, #4]
  55992. 80328c6: 7165 strb r5, [r4, #5]
  55993. icmphdr->seqno = 0;
  55994. 80328c8: 71a5 strb r5, [r4, #6]
  55995. 80328ca: 71e5 strb r5, [r4, #7]
  55996. /* copy fields from original packet */
  55997. SMEMCPY((u8_t *)q->payload + sizeof(struct icmp_echo_hdr), (u8_t *)p->payload,
  55998. 80328cc: 6840 ldr r0, [r0, #4]
  55999. 80328ce: 6879 ldr r1, [r7, #4]
  56000. 80328d0: 221c movs r2, #28
  56001. 80328d2: 3008 adds r0, #8
  56002. 80328d4: f7ef f9e6 bl 8021ca4 <memcpy>
  56003. IP_HLEN + ICMP_DEST_UNREACH_DATASIZE);
  56004. /* calculate checksum */
  56005. icmphdr->chksum = 0;
  56006. 80328d8: 70a5 strb r5, [r4, #2]
  56007. 80328da: 70e5 strb r5, [r4, #3]
  56008. icmphdr->chksum = inet_chksum(icmphdr, q->len);
  56009. 80328dc: 8971 ldrh r1, [r6, #10]
  56010. 80328de: 4620 mov r0, r4
  56011. 80328e0: f000 f842 bl 8032968 <inet_chksum>
  56012. 80328e4: 8060 strh r0, [r4, #2]
  56013. ICMP_STATS_INC(icmp.xmit);
  56014. /* increase number of messages attempted to send */
  56015. snmp_inc_icmpoutmsgs();
  56016. 80328e6: f001 ff93 bl 8034810 <snmp_inc_icmpoutmsgs>
  56017. /* increase number of destination unreachable messages attempted to send */
  56018. snmp_inc_icmpouttimeexcds();
  56019. 80328ea: f001 ff99 bl 8034820 <snmp_inc_icmpouttimeexcds>
  56020. ip_addr_copy(iphdr_src, iphdr->src);
  56021. 80328ee: f8d8 300c ldr.w r3, [r8, #12]
  56022. 80328f2: aa04 add r2, sp, #16
  56023. ip_output(q, NULL, &iphdr_src, ICMP_TTL, 0, IP_PROTO_ICMP);
  56024. 80328f4: 4630 mov r0, r6
  56025. ICMP_STATS_INC(icmp.xmit);
  56026. /* increase number of messages attempted to send */
  56027. snmp_inc_icmpoutmsgs();
  56028. /* increase number of destination unreachable messages attempted to send */
  56029. snmp_inc_icmpouttimeexcds();
  56030. ip_addr_copy(iphdr_src, iphdr->src);
  56031. 80328f6: f842 3d04 str.w r3, [r2, #-4]!
  56032. ip_output(q, NULL, &iphdr_src, ICMP_TTL, 0, IP_PROTO_ICMP);
  56033. 80328fa: 2301 movs r3, #1
  56034. 80328fc: 9301 str r3, [sp, #4]
  56035. 80328fe: 9500 str r5, [sp, #0]
  56036. 8032900: 4629 mov r1, r5
  56037. 8032902: 23ff movs r3, #255 ; 0xff
  56038. 8032904: f000 fa9e bl 8032e44 <ip_output>
  56039. pbuf_free(q);
  56040. 8032908: 4630 mov r0, r6
  56041. 803290a: f7fd f9bd bl 802fc88 <pbuf_free>
  56042. */
  56043. void
  56044. icmp_dest_unreach(struct pbuf *p, enum icmp_dur_type t)
  56045. {
  56046. icmp_send_response(p, ICMP_DUR, t);
  56047. }
  56048. 803290e: e8bd 81ff ldmia.w sp!, {r0, r1, r2, r3, r4, r5, r6, r7, r8, pc}
  56049. 08032912 <lwip_standard_chksum>:
  56050. * @return host order (!) lwip checksum (non-inverted Internet sum)
  56051. */
  56052. static u16_t
  56053. lwip_standard_chksum(void *dataptr, int len)
  56054. {
  56055. 8032912: b513 push {r0, r1, r4, lr}
  56056. u8_t *pb = (u8_t *)dataptr;
  56057. u16_t *ps, t = 0;
  56058. 8032914: 2300 movs r3, #0
  56059. u32_t sum = 0;
  56060. int odd = ((mem_ptr_t)pb & 1);
  56061. /* Get aligned to u16_t */
  56062. if (odd && len > 0) {
  56063. 8032916: f010 0201 ands.w r2, r0, #1
  56064. static u16_t
  56065. lwip_standard_chksum(void *dataptr, int len)
  56066. {
  56067. u8_t *pb = (u8_t *)dataptr;
  56068. u16_t *ps, t = 0;
  56069. 803291a: f8ad 3006 strh.w r3, [sp, #6]
  56070. u32_t sum = 0;
  56071. int odd = ((mem_ptr_t)pb & 1);
  56072. /* Get aligned to u16_t */
  56073. if (odd && len > 0) {
  56074. 803291e: d006 beq.n 803292e <lwip_standard_chksum+0x1c>
  56075. 8032920: 4299 cmp r1, r3
  56076. 8032922: dd04 ble.n 803292e <lwip_standard_chksum+0x1c>
  56077. ((u8_t *)&t)[1] = *pb++;
  56078. 8032924: f810 3b01 ldrb.w r3, [r0], #1
  56079. len--;
  56080. 8032928: 3901 subs r1, #1
  56081. u32_t sum = 0;
  56082. int odd = ((mem_ptr_t)pb & 1);
  56083. /* Get aligned to u16_t */
  56084. if (odd && len > 0) {
  56085. ((u8_t *)&t)[1] = *pb++;
  56086. 803292a: f88d 3007 strb.w r3, [sp, #7]
  56087. static u16_t
  56088. lwip_standard_chksum(void *dataptr, int len)
  56089. {
  56090. u8_t *pb = (u8_t *)dataptr;
  56091. u16_t *ps, t = 0;
  56092. u32_t sum = 0;
  56093. 803292e: 2300 movs r3, #0
  56094. len--;
  56095. }
  56096. /* Add the bulk of the data */
  56097. ps = (u16_t *)(void *)pb;
  56098. while (len > 1) {
  56099. 8032930: e003 b.n 803293a <lwip_standard_chksum+0x28>
  56100. sum += *ps++;
  56101. 8032932: f830 4b02 ldrh.w r4, [r0], #2
  56102. len -= 2;
  56103. 8032936: 3902 subs r1, #2
  56104. }
  56105. /* Add the bulk of the data */
  56106. ps = (u16_t *)(void *)pb;
  56107. while (len > 1) {
  56108. sum += *ps++;
  56109. 8032938: 191b adds r3, r3, r4
  56110. len--;
  56111. }
  56112. /* Add the bulk of the data */
  56113. ps = (u16_t *)(void *)pb;
  56114. while (len > 1) {
  56115. 803293a: 2901 cmp r1, #1
  56116. 803293c: dcf9 bgt.n 8032932 <lwip_standard_chksum+0x20>
  56117. len -= 2;
  56118. }
  56119. /* Consume left-over byte, if any */
  56120. if (len > 0) {
  56121. ((u8_t *)&t)[0] = *(u8_t *)ps;
  56122. 803293e: bf04 itt eq
  56123. 8032940: 7801 ldrbeq r1, [r0, #0]
  56124. 8032942: f88d 1006 strbeq.w r1, [sp, #6]
  56125. }
  56126. /* Add end bytes */
  56127. sum += t;
  56128. 8032946: f8bd 0006 ldrh.w r0, [sp, #6]
  56129. 803294a: 181b adds r3, r3, r0
  56130. /* Fold 32-bit sum to 16 bits
  56131. calling this twice is propably faster than if statements... */
  56132. sum = FOLD_U32T(sum);
  56133. 803294c: b298 uxth r0, r3
  56134. 803294e: eb00 4313 add.w r3, r0, r3, lsr #16
  56135. sum = FOLD_U32T(sum);
  56136. 8032952: b298 uxth r0, r3
  56137. 8032954: eb00 4013 add.w r0, r0, r3, lsr #16
  56138. /* Swap if alignment was odd */
  56139. if (odd) {
  56140. 8032958: b122 cbz r2, 8032964 <lwip_standard_chksum+0x52>
  56141. sum = SWAP_BYTES_IN_WORD(sum);
  56142. 803295a: 0603 lsls r3, r0, #24
  56143. 803295c: f3c0 2007 ubfx r0, r0, #8, #8
  56144. 8032960: ea40 4013 orr.w r0, r0, r3, lsr #16
  56145. }
  56146. return (u16_t)sum;
  56147. }
  56148. 8032964: b280 uxth r0, r0
  56149. 8032966: bd1c pop {r2, r3, r4, pc}
  56150. 08032968 <inet_chksum>:
  56151. * @return checksum (as u16_t) to be saved directly in the protocol header
  56152. */
  56153. u16_t
  56154. inet_chksum(void *dataptr, u16_t len)
  56155. {
  56156. 8032968: b508 push {r3, lr}
  56157. return ~LWIP_CHKSUM(dataptr, len);
  56158. 803296a: f7ff ffd2 bl 8032912 <lwip_standard_chksum>
  56159. 803296e: 43c0 mvns r0, r0
  56160. }
  56161. 8032970: b280 uxth r0, r0
  56162. 8032972: bd08 pop {r3, pc}
  56163. 08032974 <inet_chksum_pbuf>:
  56164. * @param p pbuf chain over that the checksum should be calculated
  56165. * @return checksum (as u16_t) to be saved directly in the protocol header
  56166. */
  56167. u16_t
  56168. inet_chksum_pbuf(struct pbuf *p)
  56169. {
  56170. 8032974: b570 push {r4, r5, r6, lr}
  56171. u32_t acc;
  56172. struct pbuf *q;
  56173. u8_t swapped;
  56174. acc = 0;
  56175. swapped = 0;
  56176. 8032976: 2600 movs r6, #0
  56177. * @param p pbuf chain over that the checksum should be calculated
  56178. * @return checksum (as u16_t) to be saved directly in the protocol header
  56179. */
  56180. u16_t
  56181. inet_chksum_pbuf(struct pbuf *p)
  56182. {
  56183. 8032978: 4605 mov r5, r0
  56184. u32_t acc;
  56185. struct pbuf *q;
  56186. u8_t swapped;
  56187. acc = 0;
  56188. 803297a: 4634 mov r4, r6
  56189. swapped = 0;
  56190. for(q = p; q != NULL; q = q->next) {
  56191. 803297c: e013 b.n 80329a6 <inet_chksum_pbuf+0x32>
  56192. acc += LWIP_CHKSUM(q->payload, q->len);
  56193. 803297e: 8969 ldrh r1, [r5, #10]
  56194. 8032980: 6868 ldr r0, [r5, #4]
  56195. 8032982: f7ff ffc6 bl 8032912 <lwip_standard_chksum>
  56196. acc = FOLD_U32T(acc);
  56197. if (q->len % 2 != 0) {
  56198. 8032986: 896b ldrh r3, [r5, #10]
  56199. u8_t swapped;
  56200. acc = 0;
  56201. swapped = 0;
  56202. for(q = p; q != NULL; q = q->next) {
  56203. acc += LWIP_CHKSUM(q->payload, q->len);
  56204. 8032988: 1900 adds r0, r0, r4
  56205. acc = FOLD_U32T(acc);
  56206. 803298a: b284 uxth r4, r0
  56207. if (q->len % 2 != 0) {
  56208. 803298c: 07d9 lsls r1, r3, #31
  56209. acc = 0;
  56210. swapped = 0;
  56211. for(q = p; q != NULL; q = q->next) {
  56212. acc += LWIP_CHKSUM(q->payload, q->len);
  56213. acc = FOLD_U32T(acc);
  56214. 803298e: eb04 4410 add.w r4, r4, r0, lsr #16
  56215. if (q->len % 2 != 0) {
  56216. 8032992: d507 bpl.n 80329a4 <inet_chksum_pbuf+0x30>
  56217. swapped = 1 - swapped;
  56218. acc = SWAP_BYTES_IN_WORD(acc);
  56219. 8032994: 0623 lsls r3, r4, #24
  56220. swapped = 0;
  56221. for(q = p; q != NULL; q = q->next) {
  56222. acc += LWIP_CHKSUM(q->payload, q->len);
  56223. acc = FOLD_U32T(acc);
  56224. if (q->len % 2 != 0) {
  56225. swapped = 1 - swapped;
  56226. 8032996: f1c6 0601 rsb r6, r6, #1
  56227. acc = SWAP_BYTES_IN_WORD(acc);
  56228. 803299a: f3c4 2407 ubfx r4, r4, #8, #8
  56229. swapped = 0;
  56230. for(q = p; q != NULL; q = q->next) {
  56231. acc += LWIP_CHKSUM(q->payload, q->len);
  56232. acc = FOLD_U32T(acc);
  56233. if (q->len % 2 != 0) {
  56234. swapped = 1 - swapped;
  56235. 803299e: b2f6 uxtb r6, r6
  56236. acc = SWAP_BYTES_IN_WORD(acc);
  56237. 80329a0: ea44 4413 orr.w r4, r4, r3, lsr #16
  56238. struct pbuf *q;
  56239. u8_t swapped;
  56240. acc = 0;
  56241. swapped = 0;
  56242. for(q = p; q != NULL; q = q->next) {
  56243. 80329a4: 682d ldr r5, [r5, #0]
  56244. 80329a6: 2d00 cmp r5, #0
  56245. 80329a8: d1e9 bne.n 803297e <inet_chksum_pbuf+0xa>
  56246. swapped = 1 - swapped;
  56247. acc = SWAP_BYTES_IN_WORD(acc);
  56248. }
  56249. }
  56250. if (swapped) {
  56251. 80329aa: b126 cbz r6, 80329b6 <inet_chksum_pbuf+0x42>
  56252. acc = SWAP_BYTES_IN_WORD(acc);
  56253. 80329ac: 0623 lsls r3, r4, #24
  56254. 80329ae: f3c4 2407 ubfx r4, r4, #8, #8
  56255. 80329b2: ea44 4413 orr.w r4, r4, r3, lsr #16
  56256. }
  56257. return (u16_t)~(acc & 0xffffUL);
  56258. 80329b6: 43e0 mvns r0, r4
  56259. }
  56260. 80329b8: b280 uxth r0, r0
  56261. 80329ba: bd70 pop {r4, r5, r6, pc}
  56262. 080329bc <ip4_addr_isbroadcast>:
  56263. {
  56264. ip_addr_t ipaddr;
  56265. ip4_addr_set_u32(&ipaddr, addr);
  56266. /* all ones (broadcast) or all zeroes (old skool broadcast) */
  56267. if ((~addr == IPADDR_ANY) ||
  56268. 80329bc: 1e43 subs r3, r0, #1
  56269. 80329be: 3303 adds r3, #3
  56270. 80329c0: d811 bhi.n 80329e6 <ip4_addr_isbroadcast+0x2a>
  56271. (addr == IPADDR_ANY)) {
  56272. return 1;
  56273. /* no broadcast support on this network interface? */
  56274. } else if ((netif->flags & NETIF_FLAG_BROADCAST) == 0) {
  56275. 80329c2: f891 302d ldrb.w r3, [r1, #45] ; 0x2d
  56276. 80329c6: f003 0302 and.w r3, r3, #2
  56277. 80329ca: b2db uxtb r3, r3
  56278. 80329cc: b16b cbz r3, 80329ea <ip4_addr_isbroadcast+0x2e>
  56279. /* the given address cannot be a broadcast address
  56280. * nor can we check against any broadcast addresses */
  56281. return 0;
  56282. /* address matches network interface address exactly? => no broadcast */
  56283. } else if (addr == ip4_addr_get_u32(&netif->ip_addr)) {
  56284. 80329ce: 684a ldr r2, [r1, #4]
  56285. 80329d0: 4290 cmp r0, r2
  56286. 80329d2: d00a beq.n 80329ea <ip4_addr_isbroadcast+0x2e>
  56287. return 0;
  56288. /* on the same (sub) network... */
  56289. } else if (ip_addr_netcmp(&ipaddr, &(netif->ip_addr), &(netif->netmask))
  56290. 80329d4: 688b ldr r3, [r1, #8]
  56291. 80329d6: 4042 eors r2, r0
  56292. 80329d8: 421a tst r2, r3
  56293. 80329da: d000 beq.n 80329de <ip4_addr_isbroadcast+0x22>
  56294. 80329dc: e005 b.n 80329ea <ip4_addr_isbroadcast+0x2e>
  56295. /* ...and host identifier bits are all ones? =>... */
  56296. && ((addr & ~ip4_addr_get_u32(&netif->netmask)) ==
  56297. 80329de: 43db mvns r3, r3
  56298. 80329e0: 4018 ands r0, r3
  56299. 80329e2: 4298 cmp r0, r3
  56300. 80329e4: d101 bne.n 80329ea <ip4_addr_isbroadcast+0x2e>
  56301. ip4_addr_set_u32(&ipaddr, addr);
  56302. /* all ones (broadcast) or all zeroes (old skool broadcast) */
  56303. if ((~addr == IPADDR_ANY) ||
  56304. (addr == IPADDR_ANY)) {
  56305. return 1;
  56306. 80329e6: 2001 movs r0, #1
  56307. 80329e8: 4770 bx lr
  56308. /* no broadcast support on this network interface? */
  56309. } else if ((netif->flags & NETIF_FLAG_BROADCAST) == 0) {
  56310. /* the given address cannot be a broadcast address
  56311. * nor can we check against any broadcast addresses */
  56312. return 0;
  56313. 80329ea: 2000 movs r0, #0
  56314. /* => network broadcast address */
  56315. return 1;
  56316. } else {
  56317. return 0;
  56318. }
  56319. }
  56320. 80329ec: 4770 bx lr
  56321. 080329ee <ipaddr_aton>:
  56322. * @param addr pointer to which to save the ip address in network order
  56323. * @return 1 if cp could be converted to addr, 0 on failure
  56324. */
  56325. int
  56326. ipaddr_aton(const char *cp, ip_addr_t *addr)
  56327. {
  56328. 80329ee: b5f0 push {r4, r5, r6, r7, lr}
  56329. u8_t base;
  56330. char c;
  56331. u32_t parts[4];
  56332. u32_t *pp = parts;
  56333. c = *cp;
  56334. 80329f0: 7803 ldrb r3, [r0, #0]
  56335. * @param addr pointer to which to save the ip address in network order
  56336. * @return 1 if cp could be converted to addr, 0 on failure
  56337. */
  56338. int
  56339. ipaddr_aton(const char *cp, ip_addr_t *addr)
  56340. {
  56341. 80329f2: b085 sub sp, #20
  56342. 80329f4: 460e mov r6, r1
  56343. u8_t base;
  56344. char c;
  56345. u32_t parts[4];
  56346. u32_t *pp = parts;
  56347. c = *cp;
  56348. 80329f6: 2400 movs r4, #0
  56349. * @param cp IP address in ascii represenation (e.g. "127.0.0.1")
  56350. * @param addr pointer to which to save the ip address in network order
  56351. * @return 1 if cp could be converted to addr, 0 on failure
  56352. */
  56353. int
  56354. ipaddr_aton(const char *cp, ip_addr_t *addr)
  56355. 80329f8: aa00 add r2, sp, #0
  56356. 80329fa: 18a7 adds r7, r4, r2
  56357. /*
  56358. * Collect number up to ``.''.
  56359. * Values are specified as for C:
  56360. * 0x=hex, 0=octal, 1-9=decimal.
  56361. */
  56362. if (!isdigit(c))
  56363. 80329fc: f1a3 0230 sub.w r2, r3, #48 ; 0x30
  56364. 8032a00: 2a09 cmp r2, #9
  56365. 8032a02: d86d bhi.n 8032ae0 <ipaddr_aton+0xf2>
  56366. return (0);
  56367. val = 0;
  56368. base = 10;
  56369. if (c == '0') {
  56370. 8032a04: 2b30 cmp r3, #48 ; 0x30
  56371. 8032a06: d10b bne.n 8032a20 <ipaddr_aton+0x32>
  56372. c = *++cp;
  56373. 8032a08: 7843 ldrb r3, [r0, #1]
  56374. if (c == 'x' || c == 'X') {
  56375. 8032a0a: 2b78 cmp r3, #120 ; 0x78
  56376. 8032a0c: d004 beq.n 8032a18 <ipaddr_aton+0x2a>
  56377. 8032a0e: 2b58 cmp r3, #88 ; 0x58
  56378. 8032a10: d002 beq.n 8032a18 <ipaddr_aton+0x2a>
  56379. if (!isdigit(c))
  56380. return (0);
  56381. val = 0;
  56382. base = 10;
  56383. if (c == '0') {
  56384. c = *++cp;
  56385. 8032a12: 3001 adds r0, #1
  56386. if (c == 'x' || c == 'X') {
  56387. base = 16;
  56388. c = *++cp;
  56389. } else
  56390. base = 8;
  56391. 8032a14: 2508 movs r5, #8
  56392. 8032a16: e004 b.n 8032a22 <ipaddr_aton+0x34>
  56393. base = 10;
  56394. if (c == '0') {
  56395. c = *++cp;
  56396. if (c == 'x' || c == 'X') {
  56397. base = 16;
  56398. c = *++cp;
  56399. 8032a18: 7883 ldrb r3, [r0, #2]
  56400. val = 0;
  56401. base = 10;
  56402. if (c == '0') {
  56403. c = *++cp;
  56404. if (c == 'x' || c == 'X') {
  56405. base = 16;
  56406. 8032a1a: 2510 movs r5, #16
  56407. c = *++cp;
  56408. 8032a1c: 3002 adds r0, #2
  56409. 8032a1e: e000 b.n 8032a22 <ipaddr_aton+0x34>
  56410. * 0x=hex, 0=octal, 1-9=decimal.
  56411. */
  56412. if (!isdigit(c))
  56413. return (0);
  56414. val = 0;
  56415. base = 10;
  56416. 8032a20: 250a movs r5, #10
  56417. 8032a22: 4602 mov r2, r0
  56418. if (c == '0') {
  56419. c = *++cp;
  56420. if (c == 'x' || c == 'X') {
  56421. base = 16;
  56422. 8032a24: 2000 movs r0, #0
  56423. 8032a26: e000 b.n 8032a2a <ipaddr_aton+0x3c>
  56424. 8032a28: 3201 adds r2, #1
  56425. c = *++cp;
  56426. } else
  56427. base = 8;
  56428. }
  56429. for (;;) {
  56430. if (isdigit(c)) {
  56431. 8032a2a: f1a3 0130 sub.w r1, r3, #48 ; 0x30
  56432. 8032a2e: 2909 cmp r1, #9
  56433. 8032a30: d803 bhi.n 8032a3a <ipaddr_aton+0x4c>
  56434. val = (val * base) + (int)(c - '0');
  56435. 8032a32: fb05 3000 mla r0, r5, r0, r3
  56436. 8032a36: 3830 subs r0, #48 ; 0x30
  56437. 8032a38: e013 b.n 8032a62 <ipaddr_aton+0x74>
  56438. c = *++cp;
  56439. } else if (base == 16 && isxdigit(c)) {
  56440. 8032a3a: 2d10 cmp r5, #16
  56441. 8032a3c: d113 bne.n 8032a66 <ipaddr_aton+0x78>
  56442. 8032a3e: f1a3 0161 sub.w r1, r3, #97 ; 0x61
  56443. 8032a42: b2c9 uxtb r1, r1
  56444. 8032a44: 2905 cmp r1, #5
  56445. 8032a46: d904 bls.n 8032a52 <ipaddr_aton+0x64>
  56446. 8032a48: f1a3 0c41 sub.w ip, r3, #65 ; 0x41
  56447. 8032a4c: f1bc 0f05 cmp.w ip, #5
  56448. 8032a50: d809 bhi.n 8032a66 <ipaddr_aton+0x78>
  56449. val = (val << 4) | (int)(c + 10 - (islower(c) ? 'a' : 'A'));
  56450. 8032a52: 330a adds r3, #10
  56451. 8032a54: 2919 cmp r1, #25
  56452. 8032a56: bf8c ite hi
  56453. 8032a58: 2141 movhi r1, #65 ; 0x41
  56454. 8032a5a: 2161 movls r1, #97 ; 0x61
  56455. 8032a5c: 1a5b subs r3, r3, r1
  56456. 8032a5e: ea43 1000 orr.w r0, r3, r0, lsl #4
  56457. c = *++cp;
  56458. 8032a62: 7853 ldrb r3, [r2, #1]
  56459. 8032a64: e7e0 b.n 8032a28 <ipaddr_aton+0x3a>
  56460. } else
  56461. break;
  56462. }
  56463. if (c == '.') {
  56464. 8032a66: 2b2e cmp r3, #46 ; 0x2e
  56465. 8032a68: d107 bne.n 8032a7a <ipaddr_aton+0x8c>
  56466. * Internet format:
  56467. * a.b.c.d
  56468. * a.b.c (with c treated as 16 bits)
  56469. * a.b (with b treated as 24 bits)
  56470. */
  56471. if (pp >= parts + 3) {
  56472. 8032a6a: 2c0c cmp r4, #12
  56473. 8032a6c: d038 beq.n 8032ae0 <ipaddr_aton+0xf2>
  56474. return (0);
  56475. }
  56476. *pp++ = val;
  56477. 8032a6e: f84d 0004 str.w r0, [sp, r4]
  56478. c = *++cp;
  56479. 8032a72: 7853 ldrb r3, [r2, #1]
  56480. 8032a74: 1c50 adds r0, r2, #1
  56481. 8032a76: 3404 adds r4, #4
  56482. } else
  56483. break;
  56484. }
  56485. 8032a78: e7be b.n 80329f8 <ipaddr_aton+0xa>
  56486. 8032a7a: 2b0d cmp r3, #13
  56487. 8032a7c: d803 bhi.n 8032a86 <ipaddr_aton+0x98>
  56488. 8032a7e: 2b09 cmp r3, #9
  56489. 8032a80: d203 bcs.n 8032a8a <ipaddr_aton+0x9c>
  56490. 8032a82: b113 cbz r3, 8032a8a <ipaddr_aton+0x9c>
  56491. 8032a84: e02c b.n 8032ae0 <ipaddr_aton+0xf2>
  56492. 8032a86: 2b20 cmp r3, #32
  56493. 8032a88: d12a bne.n 8032ae0 <ipaddr_aton+0xf2>
  56494. }
  56495. /*
  56496. * Concoct the address according to
  56497. * the number of parts specified.
  56498. */
  56499. switch (pp - parts + 1) {
  56500. 8032a8a: 466b mov r3, sp
  56501. 8032a8c: 1afb subs r3, r7, r3
  56502. 8032a8e: 109b asrs r3, r3, #2
  56503. 8032a90: 3301 adds r3, #1
  56504. 8032a92: 2b04 cmp r3, #4
  56505. 8032a94: d81f bhi.n 8032ad6 <ipaddr_aton+0xe8>
  56506. 8032a96: e8df f003 tbb [pc, r3]
  56507. 8032a9a: 1e23 .short 0x1e23
  56508. 8032a9c: 0a03 .short 0x0a03
  56509. 8032a9e: 13 .byte 0x13
  56510. 8032a9f: 00 .byte 0x00
  56511. case 1: /* a -- 32 bits */
  56512. break;
  56513. case 2: /* a.b -- 8.24 bits */
  56514. if (val > 0xffffffUL) {
  56515. 8032aa0: f1b0 7f80 cmp.w r0, #16777216 ; 0x1000000
  56516. 8032aa4: d21c bcs.n 8032ae0 <ipaddr_aton+0xf2>
  56517. return (0);
  56518. }
  56519. val |= parts[0] << 24;
  56520. 8032aa6: 9b00 ldr r3, [sp, #0]
  56521. 8032aa8: ea40 6003 orr.w r0, r0, r3, lsl #24
  56522. break;
  56523. 8032aac: e013 b.n 8032ad6 <ipaddr_aton+0xe8>
  56524. case 3: /* a.b.c -- 8.8.16 bits */
  56525. if (val > 0xffff) {
  56526. 8032aae: f5b0 3f80 cmp.w r0, #65536 ; 0x10000
  56527. 8032ab2: d215 bcs.n 8032ae0 <ipaddr_aton+0xf2>
  56528. return (0);
  56529. }
  56530. val |= (parts[0] << 24) | (parts[1] << 16);
  56531. 8032ab4: 9b00 ldr r3, [sp, #0]
  56532. 8032ab6: 061a lsls r2, r3, #24
  56533. 8032ab8: 9b01 ldr r3, [sp, #4]
  56534. 8032aba: ea42 4303 orr.w r3, r2, r3, lsl #16
  56535. 8032abe: e009 b.n 8032ad4 <ipaddr_aton+0xe6>
  56536. break;
  56537. case 4: /* a.b.c.d -- 8.8.8.8 bits */
  56538. if (val > 0xff) {
  56539. 8032ac0: 28ff cmp r0, #255 ; 0xff
  56540. 8032ac2: d80d bhi.n 8032ae0 <ipaddr_aton+0xf2>
  56541. return (0);
  56542. }
  56543. val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8);
  56544. 8032ac4: 9b00 ldr r3, [sp, #0]
  56545. 8032ac6: 061a lsls r2, r3, #24
  56546. 8032ac8: 9b01 ldr r3, [sp, #4]
  56547. 8032aca: ea42 4203 orr.w r2, r2, r3, lsl #16
  56548. 8032ace: 9b02 ldr r3, [sp, #8]
  56549. 8032ad0: ea42 2303 orr.w r3, r2, r3, lsl #8
  56550. 8032ad4: 4318 orrs r0, r3
  56551. break;
  56552. default:
  56553. LWIP_ASSERT("unhandled", 0);
  56554. break;
  56555. }
  56556. if (addr) {
  56557. 8032ad6: b12e cbz r6, 8032ae4 <ipaddr_aton+0xf6>
  56558. ip4_addr_set_u32(addr, htonl(val));
  56559. 8032ad8: f7fb ffa2 bl 802ea20 <lwip_htonl>
  56560. 8032adc: 6030 str r0, [r6, #0]
  56561. 8032ade: e001 b.n 8032ae4 <ipaddr_aton+0xf6>
  56562. * Collect number up to ``.''.
  56563. * Values are specified as for C:
  56564. * 0x=hex, 0=octal, 1-9=decimal.
  56565. */
  56566. if (!isdigit(c))
  56567. return (0);
  56568. 8032ae0: 2000 movs r0, #0
  56569. 8032ae2: e000 b.n 8032ae6 <ipaddr_aton+0xf8>
  56570. break;
  56571. }
  56572. if (addr) {
  56573. ip4_addr_set_u32(addr, htonl(val));
  56574. }
  56575. return (1);
  56576. 8032ae4: 2001 movs r0, #1
  56577. }
  56578. 8032ae6: b005 add sp, #20
  56579. 8032ae8: bdf0 pop {r4, r5, r6, r7, pc}
  56580. 08032aea <ipaddr_addr>:
  56581. * @param cp IP address in ascii represenation (e.g. "127.0.0.1")
  56582. * @return ip address in network order
  56583. */
  56584. u32_t
  56585. ipaddr_addr(const char *cp)
  56586. {
  56587. 8032aea: b507 push {r0, r1, r2, lr}
  56588. ip_addr_t val;
  56589. if (ipaddr_aton(cp, &val)) {
  56590. 8032aec: a901 add r1, sp, #4
  56591. 8032aee: f7ff ff7e bl 80329ee <ipaddr_aton>
  56592. 8032af2: b108 cbz r0, 8032af8 <ipaddr_addr+0xe>
  56593. return ip4_addr_get_u32(&val);
  56594. 8032af4: 9801 ldr r0, [sp, #4]
  56595. 8032af6: e001 b.n 8032afc <ipaddr_addr+0x12>
  56596. }
  56597. return (IPADDR_NONE);
  56598. 8032af8: f04f 30ff mov.w r0, #4294967295
  56599. }
  56600. 8032afc: bd0e pop {r1, r2, r3, pc}
  56601. 08032afe <ipaddr_ntoa_r>:
  56602. * @param buflen length of buf
  56603. * @return either pointer to buf which now holds the ASCII
  56604. * representation of addr or NULL if buf was too small
  56605. */
  56606. char *ipaddr_ntoa_r(const ip_addr_t *addr, char *buf, int buflen)
  56607. {
  56608. 8032afe: e92d 4ff7 stmdb sp!, {r0, r1, r2, r4, r5, r6, r7, r8, r9, sl, fp, lr}
  56609. u8_t rem;
  56610. u8_t n;
  56611. u8_t i;
  56612. int len = 0;
  56613. s_addr = ip4_addr_get_u32(addr);
  56614. 8032b02: 6803 ldr r3, [r0, #0]
  56615. 8032b04: a802 add r0, sp, #8
  56616. * @param buf target buffer where the string is stored
  56617. * @param buflen length of buf
  56618. * @return either pointer to buf which now holds the ASCII
  56619. * representation of addr or NULL if buf was too small
  56620. */
  56621. char *ipaddr_ntoa_r(const ip_addr_t *addr, char *buf, int buflen)
  56622. 8032b06: f10d 0807 add.w r8, sp, #7
  56623. u8_t rem;
  56624. u8_t n;
  56625. u8_t i;
  56626. int len = 0;
  56627. s_addr = ip4_addr_get_u32(addr);
  56628. 8032b0a: f840 3d04 str.w r3, [r0, #-4]!
  56629. rp = buf;
  56630. 8032b0e: 460c mov r4, r1
  56631. * @param buf target buffer where the string is stored
  56632. * @param buflen length of buf
  56633. * @return either pointer to buf which now holds the ASCII
  56634. * representation of addr or NULL if buf was too small
  56635. */
  56636. char *ipaddr_ntoa_r(const ip_addr_t *addr, char *buf, int buflen)
  56637. 8032b10: 3801 subs r0, #1
  56638. char *rp;
  56639. u8_t *ap;
  56640. u8_t rem;
  56641. u8_t n;
  56642. u8_t i;
  56643. int len = 0;
  56644. 8032b12: 2700 movs r7, #0
  56645. rp = buf;
  56646. ap = (u8_t *)&s_addr;
  56647. for(n = 0; n < 4; n++) {
  56648. i = 0;
  56649. do {
  56650. rem = *ap % (u8_t)10;
  56651. 8032b14: f04f 0c0a mov.w ip, #10
  56652. *rp++ = inv[i];
  56653. }
  56654. if (len++ >= buflen) {
  56655. return NULL;
  56656. }
  56657. *rp++ = '.';
  56658. 8032b18: f04f 092e mov.w r9, #46 ; 0x2e
  56659. 8032b1c: 7843 ldrb r3, [r0, #1]
  56660. * @param buf target buffer where the string is stored
  56661. * @param buflen length of buf
  56662. * @return either pointer to buf which now holds the ASCII
  56663. * representation of addr or NULL if buf was too small
  56664. */
  56665. char *ipaddr_ntoa_r(const ip_addr_t *addr, char *buf, int buflen)
  56666. 8032b1e: 2500 movs r5, #0
  56667. rp = buf;
  56668. ap = (u8_t *)&s_addr;
  56669. for(n = 0; n < 4; n++) {
  56670. i = 0;
  56671. do {
  56672. rem = *ap % (u8_t)10;
  56673. 8032b20: fbb3 f6fc udiv r6, r3, ip
  56674. *ap /= (u8_t)10;
  56675. inv[i++] = '0' + rem;
  56676. 8032b24: f10d 0b08 add.w fp, sp, #8
  56677. rp = buf;
  56678. ap = (u8_t *)&s_addr;
  56679. for(n = 0; n < 4; n++) {
  56680. i = 0;
  56681. do {
  56682. rem = *ap % (u8_t)10;
  56683. 8032b28: fb0c 3a16 mls sl, ip, r6, r3
  56684. *ap /= (u8_t)10;
  56685. inv[i++] = '0' + rem;
  56686. 8032b2c: eb0b 0305 add.w r3, fp, r5
  56687. 8032b30: f10a 0a30 add.w sl, sl, #48 ; 0x30
  56688. 8032b34: 3501 adds r5, #1
  56689. 8032b36: f803 ac08 strb.w sl, [r3, #-8]
  56690. } while(*ap);
  56691. 8032b3a: f016 03ff ands.w r3, r6, #255 ; 0xff
  56692. for(n = 0; n < 4; n++) {
  56693. i = 0;
  56694. do {
  56695. rem = *ap % (u8_t)10;
  56696. *ap /= (u8_t)10;
  56697. inv[i++] = '0' + rem;
  56698. 8032b3e: b2ed uxtb r5, r5
  56699. } while(*ap);
  56700. 8032b40: d1ee bne.n 8032b20 <ipaddr_ntoa_r+0x22>
  56701. 8032b42: 3d01 subs r5, #1
  56702. * @param buf target buffer where the string is stored
  56703. * @param buflen length of buf
  56704. * @return either pointer to buf which now holds the ASCII
  56705. * representation of addr or NULL if buf was too small
  56706. */
  56707. char *ipaddr_ntoa_r(const ip_addr_t *addr, char *buf, int buflen)
  56708. 8032b44: 1be6 subs r6, r4, r7
  56709. 8032b46: f800 3f01 strb.w r3, [r0, #1]!
  56710. 8032b4a: b2ed uxtb r5, r5
  56711. 8032b4c: 463b mov r3, r7
  56712. 8032b4e: 4637 mov r7, r6
  56713. 8032b50: e00b b.n 8032b6a <ipaddr_ntoa_r+0x6c>
  56714. 8032b52: 1e6c subs r4, r5, #1
  56715. rem = *ap % (u8_t)10;
  56716. *ap /= (u8_t)10;
  56717. inv[i++] = '0' + rem;
  56718. } while(*ap);
  56719. while(i--) {
  56720. if (len++ >= buflen) {
  56721. 8032b54: 4293 cmp r3, r2
  56722. 8032b56: b2e4 uxtb r4, r4
  56723. 8032b58: da16 bge.n 8032b88 <ipaddr_ntoa_r+0x8a>
  56724. return NULL;
  56725. }
  56726. *rp++ = inv[i];
  56727. 8032b5a: f10d 0a08 add.w sl, sp, #8
  56728. 8032b5e: 4455 add r5, sl
  56729. 8032b60: f815 5c08 ldrb.w r5, [r5, #-8]
  56730. 8032b64: 54fd strb r5, [r7, r3]
  56731. 8032b66: 3301 adds r3, #1
  56732. 8032b68: 4625 mov r5, r4
  56733. do {
  56734. rem = *ap % (u8_t)10;
  56735. *ap /= (u8_t)10;
  56736. inv[i++] = '0' + rem;
  56737. } while(*ap);
  56738. while(i--) {
  56739. 8032b6a: 2dff cmp r5, #255 ; 0xff
  56740. * @param buf target buffer where the string is stored
  56741. * @param buflen length of buf
  56742. * @return either pointer to buf which now holds the ASCII
  56743. * representation of addr or NULL if buf was too small
  56744. */
  56745. char *ipaddr_ntoa_r(const ip_addr_t *addr, char *buf, int buflen)
  56746. 8032b6c: eb06 0403 add.w r4, r6, r3
  56747. do {
  56748. rem = *ap % (u8_t)10;
  56749. *ap /= (u8_t)10;
  56750. inv[i++] = '0' + rem;
  56751. } while(*ap);
  56752. while(i--) {
  56753. 8032b70: d1ef bne.n 8032b52 <ipaddr_ntoa_r+0x54>
  56754. if (len++ >= buflen) {
  56755. return NULL;
  56756. }
  56757. *rp++ = inv[i];
  56758. }
  56759. if (len++ >= buflen) {
  56760. 8032b72: 1c5f adds r7, r3, #1
  56761. 8032b74: 4293 cmp r3, r2
  56762. 8032b76: da07 bge.n 8032b88 <ipaddr_ntoa_r+0x8a>
  56763. s_addr = ip4_addr_get_u32(addr);
  56764. rp = buf;
  56765. ap = (u8_t *)&s_addr;
  56766. for(n = 0; n < 4; n++) {
  56767. 8032b78: 4540 cmp r0, r8
  56768. *rp++ = inv[i];
  56769. }
  56770. if (len++ >= buflen) {
  56771. return NULL;
  56772. }
  56773. *rp++ = '.';
  56774. 8032b7a: f804 9b01 strb.w r9, [r4], #1
  56775. s_addr = ip4_addr_get_u32(addr);
  56776. rp = buf;
  56777. ap = (u8_t *)&s_addr;
  56778. for(n = 0; n < 4; n++) {
  56779. 8032b7e: d1cd bne.n 8032b1c <ipaddr_ntoa_r+0x1e>
  56780. return NULL;
  56781. }
  56782. *rp++ = '.';
  56783. ap++;
  56784. }
  56785. *--rp = 0;
  56786. 8032b80: 2300 movs r3, #0
  56787. 8032b82: f804 3c01 strb.w r3, [r4, #-1]
  56788. 8032b86: e000 b.n 8032b8a <ipaddr_ntoa_r+0x8c>
  56789. *ap /= (u8_t)10;
  56790. inv[i++] = '0' + rem;
  56791. } while(*ap);
  56792. while(i--) {
  56793. if (len++ >= buflen) {
  56794. return NULL;
  56795. 8032b88: 2100 movs r1, #0
  56796. *rp++ = '.';
  56797. ap++;
  56798. }
  56799. *--rp = 0;
  56800. return buf;
  56801. }
  56802. 8032b8a: 4608 mov r0, r1
  56803. 8032b8c: e8bd 8ffe ldmia.w sp!, {r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, pc}
  56804. 08032b90 <ipaddr_ntoa>:
  56805. */
  56806. char *
  56807. ipaddr_ntoa(const ip_addr_t *addr)
  56808. {
  56809. static char str[16];
  56810. return ipaddr_ntoa_r(addr, str, 16);
  56811. 8032b90: 4901 ldr r1, [pc, #4] ; (8032b98 <ipaddr_ntoa+0x8>)
  56812. 8032b92: 2210 movs r2, #16
  56813. 8032b94: f7ff bfb3 b.w 8032afe <ipaddr_ntoa_r>
  56814. 8032b98: 2000c468 .word 0x2000c468
  56815. 08032b9c <ip_route>:
  56816. return netif;
  56817. }
  56818. #endif
  56819. /* iterate through netifs */
  56820. for (netif = netif_list; netif != NULL; netif = netif->next) {
  56821. 8032b9c: 4b0f ldr r3, [pc, #60] ; (8032bdc <ip_route+0x40>)
  56822. * @param dest the destination IP address for which to find the route
  56823. * @return the netif on which to send to reach dest
  56824. */
  56825. struct netif *
  56826. ip_route(ip_addr_t *dest)
  56827. {
  56828. 8032b9e: b510 push {r4, lr}
  56829. return netif;
  56830. }
  56831. #endif
  56832. /* iterate through netifs */
  56833. for (netif = netif_list; netif != NULL; netif = netif->next) {
  56834. 8032ba0: 681c ldr r4, [r3, #0]
  56835. 8032ba2: e00a b.n 8032bba <ip_route+0x1e>
  56836. /* network mask matches? */
  56837. if (netif_is_up(netif)) {
  56838. 8032ba4: f894 302d ldrb.w r3, [r4, #45] ; 0x2d
  56839. 8032ba8: 07d9 lsls r1, r3, #31
  56840. 8032baa: d505 bpl.n 8032bb8 <ip_route+0x1c>
  56841. if (ip_addr_netcmp(dest, &(netif->ip_addr), &(netif->netmask))) {
  56842. 8032bac: 6803 ldr r3, [r0, #0]
  56843. 8032bae: 6862 ldr r2, [r4, #4]
  56844. 8032bb0: 405a eors r2, r3
  56845. 8032bb2: 68a3 ldr r3, [r4, #8]
  56846. 8032bb4: 421a tst r2, r3
  56847. 8032bb6: d00e beq.n 8032bd6 <ip_route+0x3a>
  56848. return netif;
  56849. }
  56850. #endif
  56851. /* iterate through netifs */
  56852. for (netif = netif_list; netif != NULL; netif = netif->next) {
  56853. 8032bb8: 6824 ldr r4, [r4, #0]
  56854. 8032bba: 2c00 cmp r4, #0
  56855. 8032bbc: d1f2 bne.n 8032ba4 <ip_route+0x8>
  56856. /* return netif on which to forward IP packet */
  56857. return netif;
  56858. }
  56859. }
  56860. }
  56861. if ((netif_default == NULL) || (!netif_is_up(netif_default))) {
  56862. 8032bbe: 4b08 ldr r3, [pc, #32] ; (8032be0 <ip_route+0x44>)
  56863. 8032bc0: 681b ldr r3, [r3, #0]
  56864. 8032bc2: b12b cbz r3, 8032bd0 <ip_route+0x34>
  56865. 8032bc4: f893 202d ldrb.w r2, [r3, #45] ; 0x2d
  56866. 8032bc8: 07d2 lsls r2, r2, #31
  56867. 8032bca: bf48 it mi
  56868. 8032bcc: 461c movmi r4, r3
  56869. 8032bce: d402 bmi.n 8032bd6 <ip_route+0x3a>
  56870. LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("ip_route: No route to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n",
  56871. ip4_addr1_16(dest), ip4_addr2_16(dest), ip4_addr3_16(dest), ip4_addr4_16(dest)));
  56872. IP_STATS_INC(ip.rterr);
  56873. snmp_inc_ipoutnoroutes();
  56874. 8032bd0: f001 fcd8 bl 8034584 <snmp_inc_ipoutnoroutes>
  56875. return NULL;
  56876. 8032bd4: e7ff b.n 8032bd6 <ip_route+0x3a>
  56877. }
  56878. /* no matching netif found, use default netif */
  56879. return netif_default;
  56880. }
  56881. 8032bd6: 4620 mov r0, r4
  56882. 8032bd8: bd10 pop {r4, pc}
  56883. 8032bda: bf00 nop
  56884. 8032bdc: 2000ff14 .word 0x2000ff14
  56885. 8032be0: 2000ff18 .word 0x2000ff18
  56886. 08032be4 <ip_input>:
  56887. * @return ERR_OK if the packet was processed (could return ERR_* if it wasn't
  56888. * processed, but currently always returns ERR_OK)
  56889. */
  56890. err_t
  56891. ip_input(struct pbuf *p, struct netif *inp)
  56892. {
  56893. 8032be4: e92d 4ff8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, lr}
  56894. 8032be8: 4604 mov r4, r0
  56895. 8032bea: 460f mov r7, r1
  56896. #if IP_ACCEPT_LINK_LAYER_ADDRESSING
  56897. int check_ip_src=1;
  56898. #endif /* IP_ACCEPT_LINK_LAYER_ADDRESSING */
  56899. IP_STATS_INC(ip.recv);
  56900. snmp_inc_ipinreceives();
  56901. 8032bec: f001 fc8a bl 8034504 <snmp_inc_ipinreceives>
  56902. /* identify the IP header */
  56903. iphdr = (struct ip_hdr *)p->payload;
  56904. 8032bf0: 6866 ldr r6, [r4, #4]
  56905. if (IPH_V(iphdr) != 4) {
  56906. 8032bf2: f896 8000 ldrb.w r8, [r6]
  56907. 8032bf6: ea4f 1318 mov.w r3, r8, lsr #4
  56908. 8032bfa: 2b04 cmp r3, #4
  56909. 8032bfc: d005 beq.n 8032c0a <ip_input+0x26>
  56910. LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_WARNING, ("IP packet dropped due to bad version number %"U16_F"\n", IPH_V(iphdr)));
  56911. ip_debug_print(p);
  56912. pbuf_free(p);
  56913. 8032bfe: 4620 mov r0, r4
  56914. 8032c00: f7fd f842 bl 802fc88 <pbuf_free>
  56915. IP_STATS_INC(ip.err);
  56916. IP_STATS_INC(ip.drop);
  56917. snmp_inc_ipinhdrerrors();
  56918. 8032c04: f001 fc86 bl 8034514 <snmp_inc_ipinhdrerrors>
  56919. return ERR_OK;
  56920. 8032c08: e0be b.n 8032d88 <ip_input+0x1a4>
  56921. /* obtain IP header length in number of 32-bit words */
  56922. iphdr_hlen = IPH_HL(iphdr);
  56923. /* calculate IP header length in bytes */
  56924. iphdr_hlen *= 4;
  56925. /* obtain ip length in bytes */
  56926. iphdr_len = ntohs(IPH_LEN(iphdr));
  56927. 8032c0a: 8870 ldrh r0, [r6, #2]
  56928. 8032c0c: f7fb ff03 bl 802ea16 <lwip_ntohs>
  56929. return ERR_OK;
  56930. }
  56931. #endif
  56932. /* obtain IP header length in number of 32-bit words */
  56933. iphdr_hlen = IPH_HL(iphdr);
  56934. 8032c10: f008 080f and.w r8, r8, #15
  56935. iphdr_hlen *= 4;
  56936. /* obtain ip length in bytes */
  56937. iphdr_len = ntohs(IPH_LEN(iphdr));
  56938. /* header length exceeds first pbuf length, or ip length exceeds total pbuf length? */
  56939. if ((iphdr_hlen > p->len) || (iphdr_len > p->tot_len)) {
  56940. 8032c14: 8963 ldrh r3, [r4, #10]
  56941. #endif
  56942. /* obtain IP header length in number of 32-bit words */
  56943. iphdr_hlen = IPH_HL(iphdr);
  56944. /* calculate IP header length in bytes */
  56945. iphdr_hlen *= 4;
  56946. 8032c16: ea4f 0888 mov.w r8, r8, lsl #2
  56947. /* obtain ip length in bytes */
  56948. iphdr_len = ntohs(IPH_LEN(iphdr));
  56949. /* header length exceeds first pbuf length, or ip length exceeds total pbuf length? */
  56950. if ((iphdr_hlen > p->len) || (iphdr_len > p->tot_len)) {
  56951. 8032c1a: 4543 cmp r3, r8
  56952. /* obtain IP header length in number of 32-bit words */
  56953. iphdr_hlen = IPH_HL(iphdr);
  56954. /* calculate IP header length in bytes */
  56955. iphdr_hlen *= 4;
  56956. /* obtain ip length in bytes */
  56957. iphdr_len = ntohs(IPH_LEN(iphdr));
  56958. 8032c1c: 4601 mov r1, r0
  56959. LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS,
  56960. ("IP (len %"U16_F") is longer than pbuf (len %"U16_F"), IP packet dropped.\n",
  56961. iphdr_len, p->tot_len));
  56962. }
  56963. /* free (drop) packet pbufs */
  56964. pbuf_free(p);
  56965. 8032c1e: 4620 mov r0, r4
  56966. iphdr_hlen *= 4;
  56967. /* obtain ip length in bytes */
  56968. iphdr_len = ntohs(IPH_LEN(iphdr));
  56969. /* header length exceeds first pbuf length, or ip length exceeds total pbuf length? */
  56970. if ((iphdr_hlen > p->len) || (iphdr_len > p->tot_len)) {
  56971. 8032c20: d302 bcc.n 8032c28 <ip_input+0x44>
  56972. 8032c22: 8923 ldrh r3, [r4, #8]
  56973. 8032c24: 428b cmp r3, r1
  56974. 8032c26: d202 bcs.n 8032c2e <ip_input+0x4a>
  56975. LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS,
  56976. ("IP (len %"U16_F") is longer than pbuf (len %"U16_F"), IP packet dropped.\n",
  56977. iphdr_len, p->tot_len));
  56978. }
  56979. /* free (drop) packet pbufs */
  56980. pbuf_free(p);
  56981. 8032c28: f7fd f82e bl 802fc88 <pbuf_free>
  56982. 8032c2c: e045 b.n 8032cba <ip_input+0xd6>
  56983. }
  56984. #endif
  56985. /* Trim pbuf. This should have been done at the netif layer,
  56986. * but we'll do it anyway just to be sure that its done. */
  56987. pbuf_realloc(p, iphdr_len);
  56988. 8032c2e: f7fd f852 bl 802fcd6 <pbuf_realloc>
  56989. /* copy IP addresses to aligned ip_addr_t */
  56990. ip_addr_copy(current_iphdr_dest, iphdr->dest);
  56991. 8032c32: 6932 ldr r2, [r6, #16]
  56992. 8032c34: 4b56 ldr r3, [pc, #344] ; (8032d90 <ip_input+0x1ac>)
  56993. }
  56994. #endif /* LWIP_AUTOIP */
  56995. }
  56996. if (first) {
  56997. first = 0;
  56998. netif = netif_list;
  56999. 8032c36: f8df b168 ldr.w fp, [pc, #360] ; 8032da0 <ip_input+0x1bc>
  57000. /* Trim pbuf. This should have been done at the netif layer,
  57001. * but we'll do it anyway just to be sure that its done. */
  57002. pbuf_realloc(p, iphdr_len);
  57003. /* copy IP addresses to aligned ip_addr_t */
  57004. ip_addr_copy(current_iphdr_dest, iphdr->dest);
  57005. 8032c3a: 601a str r2, [r3, #0]
  57006. ip_addr_copy(current_iphdr_src, iphdr->src);
  57007. 8032c3c: 68f1 ldr r1, [r6, #12]
  57008. 8032c3e: 4a55 ldr r2, [pc, #340] ; (8032d94 <ip_input+0x1b0>)
  57009. 8032c40: 463d mov r5, r7
  57010. 8032c42: 6011 str r1, [r2, #0]
  57011. #endif /* LWIP_IGMP */
  57012. {
  57013. /* start trying with inp. if that's not acceptable, start walking the
  57014. list of configured netifs.
  57015. 'first' is used as a boolean to mark whether we started walking the list */
  57016. int first = 1;
  57017. 8032c44: f04f 0901 mov.w r9, #1
  57018. ip4_addr_get_u32(&iphdr->dest) & ~ip4_addr_get_u32(&netif->netmask)));
  57019. /* interface is up and configured? */
  57020. if ((netif_is_up(netif)) && (!ip_addr_isany(&(netif->ip_addr)))) {
  57021. /* unicast to this interface address? */
  57022. if (ip_addr_cmp(&current_iphdr_dest, &(netif->ip_addr)) ||
  57023. 8032c48: 469a mov sl, r3
  57024. ip4_addr_get_u32(&iphdr->dest) & ip4_addr_get_u32(&netif->netmask),
  57025. ip4_addr_get_u32(&netif->ip_addr) & ip4_addr_get_u32(&netif->netmask),
  57026. ip4_addr_get_u32(&iphdr->dest) & ~ip4_addr_get_u32(&netif->netmask)));
  57027. /* interface is up and configured? */
  57028. if ((netif_is_up(netif)) && (!ip_addr_isany(&(netif->ip_addr)))) {
  57029. 8032c4a: f895 302d ldrb.w r3, [r5, #45] ; 0x2d
  57030. 8032c4e: 07d8 lsls r0, r3, #31
  57031. 8032c50: d403 bmi.n 8032c5a <ip_input+0x76>
  57032. /* break out of for loop */
  57033. break;
  57034. }
  57035. #endif /* LWIP_AUTOIP */
  57036. }
  57037. if (first) {
  57038. 8032c52: f1b9 0f00 cmp.w r9, #0
  57039. 8032c56: d10e bne.n 8032c76 <ip_input+0x92>
  57040. 8032c58: e010 b.n 8032c7c <ip_input+0x98>
  57041. ip4_addr_get_u32(&iphdr->dest) & ip4_addr_get_u32(&netif->netmask),
  57042. ip4_addr_get_u32(&netif->ip_addr) & ip4_addr_get_u32(&netif->netmask),
  57043. ip4_addr_get_u32(&iphdr->dest) & ~ip4_addr_get_u32(&netif->netmask)));
  57044. /* interface is up and configured? */
  57045. if ((netif_is_up(netif)) && (!ip_addr_isany(&(netif->ip_addr)))) {
  57046. 8032c5a: 686b ldr r3, [r5, #4]
  57047. 8032c5c: 2b00 cmp r3, #0
  57048. 8032c5e: d0f8 beq.n 8032c52 <ip_input+0x6e>
  57049. /* unicast to this interface address? */
  57050. if (ip_addr_cmp(&current_iphdr_dest, &(netif->ip_addr)) ||
  57051. 8032c60: f8da 0000 ldr.w r0, [sl]
  57052. 8032c64: 4298 cmp r0, r3
  57053. 8032c66: f000 8088 beq.w 8032d7a <ip_input+0x196>
  57054. /* or broadcast on this interface network address? */
  57055. ip_addr_isbroadcast(&current_iphdr_dest, netif)) {
  57056. 8032c6a: 4629 mov r1, r5
  57057. 8032c6c: f7ff fea6 bl 80329bc <ip4_addr_isbroadcast>
  57058. ip4_addr_get_u32(&iphdr->dest) & ~ip4_addr_get_u32(&netif->netmask)));
  57059. /* interface is up and configured? */
  57060. if ((netif_is_up(netif)) && (!ip_addr_isany(&(netif->ip_addr)))) {
  57061. /* unicast to this interface address? */
  57062. if (ip_addr_cmp(&current_iphdr_dest, &(netif->ip_addr)) ||
  57063. 8032c70: 2800 cmp r0, #0
  57064. 8032c72: d0ee beq.n 8032c52 <ip_input+0x6e>
  57065. 8032c74: e081 b.n 8032d7a <ip_input+0x196>
  57066. }
  57067. #endif /* LWIP_AUTOIP */
  57068. }
  57069. if (first) {
  57070. first = 0;
  57071. netif = netif_list;
  57072. 8032c76: f8db 5000 ldr.w r5, [fp]
  57073. 8032c7a: e000 b.n 8032c7e <ip_input+0x9a>
  57074. } else {
  57075. netif = netif->next;
  57076. 8032c7c: 682d ldr r5, [r5, #0]
  57077. }
  57078. if (netif == inp) {
  57079. 8032c7e: 42bd cmp r5, r7
  57080. netif = netif->next;
  57081. 8032c80: bf08 it eq
  57082. 8032c82: 682d ldreq r5, [r5, #0]
  57083. 8032c84: f04f 0900 mov.w r9, #0
  57084. }
  57085. } while(netif != NULL);
  57086. 8032c88: 2d00 cmp r5, #0
  57087. 8032c8a: d1de bne.n 8032c4a <ip_input+0x66>
  57088. 8032c8c: e072 b.n 8032d74 <ip_input+0x190>
  57089. /* remote port is DHCP server? */
  57090. if (IPH_PROTO(iphdr) == IP_PROTO_UDP) {
  57091. struct udp_hdr *udphdr = (struct udp_hdr *)((u8_t *)iphdr + iphdr_hlen);
  57092. LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_TRACE, ("ip_input: UDP packet to DHCP client port %"U16_F"\n",
  57093. ntohs(udphdr->dest)));
  57094. if (IP_ACCEPT_LINK_LAYER_ADDRESSED_PORT(udphdr->dest)) {
  57095. 8032c8e: eb06 0308 add.w r3, r6, r8
  57096. 8032c92: 885b ldrh r3, [r3, #2]
  57097. 8032c94: f5b3 4f88 cmp.w r3, #17408 ; 0x4400
  57098. 8032c98: d16f bne.n 8032d7a <ip_input+0x196>
  57099. 8032c9a: e011 b.n 8032cc0 <ip_input+0xdc>
  57100. /* broadcast or multicast packet source address? Compliant with RFC 1122: 3.2.1.3 */
  57101. #if IP_ACCEPT_LINK_LAYER_ADDRESSING
  57102. /* DHCP servers need 0.0.0.0 to be allowed as source address (RFC 1.1.2.2: 3.2.1.3/a) */
  57103. if (check_ip_src && !ip_addr_isany(&current_iphdr_src))
  57104. #endif /* IP_ACCEPT_LINK_LAYER_ADDRESSING */
  57105. { if ((ip_addr_isbroadcast(&current_iphdr_src, inp)) ||
  57106. 8032c9c: 4639 mov r1, r7
  57107. 8032c9e: f7ff fe8d bl 80329bc <ip4_addr_isbroadcast>
  57108. 8032ca2: b928 cbnz r0, 8032cb0 <ip_input+0xcc>
  57109. (ip_addr_ismulticast(&current_iphdr_src))) {
  57110. 8032ca4: f8d8 3000 ldr.w r3, [r8]
  57111. 8032ca8: f003 03f0 and.w r3, r3, #240 ; 0xf0
  57112. /* broadcast or multicast packet source address? Compliant with RFC 1122: 3.2.1.3 */
  57113. #if IP_ACCEPT_LINK_LAYER_ADDRESSING
  57114. /* DHCP servers need 0.0.0.0 to be allowed as source address (RFC 1.1.2.2: 3.2.1.3/a) */
  57115. if (check_ip_src && !ip_addr_isany(&current_iphdr_src))
  57116. #endif /* IP_ACCEPT_LINK_LAYER_ADDRESSING */
  57117. { if ((ip_addr_isbroadcast(&current_iphdr_src, inp)) ||
  57118. 8032cac: 2be0 cmp r3, #224 ; 0xe0
  57119. 8032cae: d108 bne.n 8032cc2 <ip_input+0xde>
  57120. (ip_addr_ismulticast(&current_iphdr_src))) {
  57121. /* packet source is not valid */
  57122. LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("ip_input: packet source is not valid.\n"));
  57123. /* free (drop) packet pbufs */
  57124. pbuf_free(p);
  57125. 8032cb0: 4620 mov r0, r4
  57126. 8032cb2: f7fc ffe9 bl 802fc88 <pbuf_free>
  57127. IP_STATS_INC(ip.drop);
  57128. snmp_inc_ipinaddrerrors();
  57129. 8032cb6: f001 fc35 bl 8034524 <snmp_inc_ipinaddrerrors>
  57130. snmp_inc_ipindiscards();
  57131. 8032cba: f001 fc43 bl 8034544 <snmp_inc_ipindiscards>
  57132. return ERR_OK;
  57133. 8032cbe: e063 b.n 8032d88 <ip_input+0x1a4>
  57134. /* remote port is DHCP server? */
  57135. if (IPH_PROTO(iphdr) == IP_PROTO_UDP) {
  57136. struct udp_hdr *udphdr = (struct udp_hdr *)((u8_t *)iphdr + iphdr_hlen);
  57137. LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_TRACE, ("ip_input: UDP packet to DHCP client port %"U16_F"\n",
  57138. ntohs(udphdr->dest)));
  57139. if (IP_ACCEPT_LINK_LAYER_ADDRESSED_PORT(udphdr->dest)) {
  57140. 8032cc0: 463d mov r5, r7
  57141. return ERR_OK;
  57142. }
  57143. }
  57144. /* packet not for us? */
  57145. if (netif == NULL) {
  57146. 8032cc2: b93d cbnz r5, 8032cd4 <ip_input+0xf0>
  57147. /* try to forward IP packet on (other) interfaces */
  57148. ip_forward(p, iphdr, inp);
  57149. } else
  57150. #endif /* IP_FORWARD */
  57151. {
  57152. snmp_inc_ipinaddrerrors();
  57153. 8032cc4: f001 fc2e bl 8034524 <snmp_inc_ipinaddrerrors>
  57154. snmp_inc_ipindiscards();
  57155. 8032cc8: f001 fc3c bl 8034544 <snmp_inc_ipindiscards>
  57156. }
  57157. pbuf_free(p);
  57158. 8032ccc: 4620 mov r0, r4
  57159. 8032cce: f7fc ffdb bl 802fc88 <pbuf_free>
  57160. return ERR_OK;
  57161. 8032cd2: e059 b.n 8032d88 <ip_input+0x1a4>
  57162. }
  57163. /* packet consists of multiple fragments? */
  57164. if ((IPH_OFFSET(iphdr) & PP_HTONS(IP_OFFMASK | IP_MF)) != 0) {
  57165. 8032cd4: 88f3 ldrh r3, [r6, #6]
  57166. 8032cd6: f023 03c0 bic.w r3, r3, #192 ; 0xc0
  57167. 8032cda: b29b uxth r3, r3
  57168. 8032cdc: b12b cbz r3, 8032cea <ip_input+0x106>
  57169. if (p == NULL) {
  57170. return ERR_OK;
  57171. }
  57172. iphdr = (struct ip_hdr *)p->payload;
  57173. #else /* IP_REASSEMBLY == 0, no packet fragment reassembly code present */
  57174. pbuf_free(p);
  57175. 8032cde: 4620 mov r0, r4
  57176. 8032ce0: f7fc ffd2 bl 802fc88 <pbuf_free>
  57177. LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("IP packet dropped since it was fragmented (0x%"X16_F") (while IP_REASSEMBLY == 0).\n",
  57178. ntohs(IPH_OFFSET(iphdr))));
  57179. IP_STATS_INC(ip.opterr);
  57180. IP_STATS_INC(ip.drop);
  57181. /* unsupported protocol feature */
  57182. snmp_inc_ipinunknownprotos();
  57183. 8032ce4: f001 fc26 bl 8034534 <snmp_inc_ipinunknownprotos>
  57184. return ERR_OK;
  57185. 8032ce8: e04e b.n 8032d88 <ip_input+0x1a4>
  57186. /* send to upper layers */
  57187. LWIP_DEBUGF(IP_DEBUG, ("ip_input: \n"));
  57188. ip_debug_print(p);
  57189. LWIP_DEBUGF(IP_DEBUG, ("ip_input: p->len %"U16_F" p->tot_len %"U16_F"\n", p->len, p->tot_len));
  57190. current_netif = inp;
  57191. 8032cea: 4b2b ldr r3, [pc, #172] ; (8032d98 <ip_input+0x1b4>)
  57192. 8032cec: 601f str r7, [r3, #0]
  57193. current_header = iphdr;
  57194. 8032cee: 4b2b ldr r3, [pc, #172] ; (8032d9c <ip_input+0x1b8>)
  57195. #if LWIP_RAW
  57196. /* raw input did not eat the packet? */
  57197. if (raw_input(p, inp) == 0)
  57198. 8032cf0: 4620 mov r0, r4
  57199. 8032cf2: 4639 mov r1, r7
  57200. LWIP_DEBUGF(IP_DEBUG, ("ip_input: \n"));
  57201. ip_debug_print(p);
  57202. LWIP_DEBUGF(IP_DEBUG, ("ip_input: p->len %"U16_F" p->tot_len %"U16_F"\n", p->len, p->tot_len));
  57203. current_netif = inp;
  57204. current_header = iphdr;
  57205. 8032cf4: 601e str r6, [r3, #0]
  57206. #if LWIP_RAW
  57207. /* raw input did not eat the packet? */
  57208. if (raw_input(p, inp) == 0)
  57209. 8032cf6: f7fd f947 bl 802ff88 <raw_input>
  57210. 8032cfa: bb88 cbnz r0, 8032d60 <ip_input+0x17c>
  57211. #endif /* LWIP_RAW */
  57212. {
  57213. switch (IPH_PROTO(iphdr)) {
  57214. 8032cfc: 7a73 ldrb r3, [r6, #9]
  57215. 8032cfe: 2b06 cmp r3, #6
  57216. 8032d00: d00b beq.n 8032d1a <ip_input+0x136>
  57217. 8032d02: 2b11 cmp r3, #17
  57218. 8032d04: d002 beq.n 8032d0c <ip_input+0x128>
  57219. 8032d06: 2b01 cmp r3, #1
  57220. 8032d08: d115 bne.n 8032d36 <ip_input+0x152>
  57221. 8032d0a: e00d b.n 8032d28 <ip_input+0x144>
  57222. #if LWIP_UDP
  57223. case IP_PROTO_UDP:
  57224. #if LWIP_UDPLITE
  57225. case IP_PROTO_UDPLITE:
  57226. #endif /* LWIP_UDPLITE */
  57227. snmp_inc_ipindelivers();
  57228. 8032d0c: f001 fc22 bl 8034554 <snmp_inc_ipindelivers>
  57229. udp_input(p, inp);
  57230. 8032d10: 4620 mov r0, r4
  57231. 8032d12: 4639 mov r1, r7
  57232. 8032d14: f7ff fb44 bl 80323a0 <udp_input>
  57233. break;
  57234. 8032d18: e022 b.n 8032d60 <ip_input+0x17c>
  57235. #endif /* LWIP_UDP */
  57236. #if LWIP_TCP
  57237. case IP_PROTO_TCP:
  57238. snmp_inc_ipindelivers();
  57239. 8032d1a: f001 fc1b bl 8034554 <snmp_inc_ipindelivers>
  57240. tcp_input(p, inp);
  57241. 8032d1e: 4620 mov r0, r4
  57242. 8032d20: 4639 mov r1, r7
  57243. 8032d22: f7fe f8e7 bl 8030ef4 <tcp_input>
  57244. break;
  57245. 8032d26: e01b b.n 8032d60 <ip_input+0x17c>
  57246. #endif /* LWIP_TCP */
  57247. #if LWIP_ICMP
  57248. case IP_PROTO_ICMP:
  57249. snmp_inc_ipindelivers();
  57250. 8032d28: f001 fc14 bl 8034554 <snmp_inc_ipindelivers>
  57251. icmp_input(p, inp);
  57252. 8032d2c: 4620 mov r0, r4
  57253. 8032d2e: 4639 mov r1, r7
  57254. 8032d30: f7ff fd20 bl 8032774 <icmp_input>
  57255. break;
  57256. 8032d34: e014 b.n 8032d60 <ip_input+0x17c>
  57257. break;
  57258. #endif /* LWIP_IGMP */
  57259. default:
  57260. #if LWIP_ICMP
  57261. /* send ICMP destination protocol unreachable unless is was a broadcast */
  57262. if (!ip_addr_isbroadcast(&current_iphdr_dest, inp) &&
  57263. 8032d36: 4d16 ldr r5, [pc, #88] ; (8032d90 <ip_input+0x1ac>)
  57264. 8032d38: 4639 mov r1, r7
  57265. 8032d3a: 6828 ldr r0, [r5, #0]
  57266. 8032d3c: f7ff fe3e bl 80329bc <ip4_addr_isbroadcast>
  57267. 8032d40: b948 cbnz r0, 8032d56 <ip_input+0x172>
  57268. !ip_addr_ismulticast(&current_iphdr_dest)) {
  57269. 8032d42: 682b ldr r3, [r5, #0]
  57270. 8032d44: f003 03f0 and.w r3, r3, #240 ; 0xf0
  57271. break;
  57272. #endif /* LWIP_IGMP */
  57273. default:
  57274. #if LWIP_ICMP
  57275. /* send ICMP destination protocol unreachable unless is was a broadcast */
  57276. if (!ip_addr_isbroadcast(&current_iphdr_dest, inp) &&
  57277. 8032d48: 2be0 cmp r3, #224 ; 0xe0
  57278. 8032d4a: d004 beq.n 8032d56 <ip_input+0x172>
  57279. !ip_addr_ismulticast(&current_iphdr_dest)) {
  57280. p->payload = iphdr;
  57281. 8032d4c: 6066 str r6, [r4, #4]
  57282. icmp_dest_unreach(p, ICMP_DUR_PROTO);
  57283. 8032d4e: 4620 mov r0, r4
  57284. 8032d50: 2102 movs r1, #2
  57285. 8032d52: f7ff fda5 bl 80328a0 <icmp_dest_unreach>
  57286. }
  57287. #endif /* LWIP_ICMP */
  57288. pbuf_free(p);
  57289. 8032d56: 4620 mov r0, r4
  57290. 8032d58: f7fc ff96 bl 802fc88 <pbuf_free>
  57291. LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("Unsupported transport protocol %"U16_F"\n", IPH_PROTO(iphdr)));
  57292. IP_STATS_INC(ip.proterr);
  57293. IP_STATS_INC(ip.drop);
  57294. snmp_inc_ipinunknownprotos();
  57295. 8032d5c: f001 fbea bl 8034534 <snmp_inc_ipinunknownprotos>
  57296. }
  57297. }
  57298. current_netif = NULL;
  57299. 8032d60: 4a0d ldr r2, [pc, #52] ; (8032d98 <ip_input+0x1b4>)
  57300. 8032d62: 2300 movs r3, #0
  57301. 8032d64: 6013 str r3, [r2, #0]
  57302. current_header = NULL;
  57303. 8032d66: 4a0d ldr r2, [pc, #52] ; (8032d9c <ip_input+0x1b8>)
  57304. 8032d68: 6013 str r3, [r2, #0]
  57305. ip_addr_set_any(&current_iphdr_src);
  57306. 8032d6a: 4a0a ldr r2, [pc, #40] ; (8032d94 <ip_input+0x1b0>)
  57307. 8032d6c: 6013 str r3, [r2, #0]
  57308. ip_addr_set_any(&current_iphdr_dest);
  57309. 8032d6e: 4a08 ldr r2, [pc, #32] ; (8032d90 <ip_input+0x1ac>)
  57310. 8032d70: 6013 str r3, [r2, #0]
  57311. return ERR_OK;
  57312. 8032d72: e009 b.n 8032d88 <ip_input+0x1a4>
  57313. *
  57314. * #define LWIP_IP_ACCEPT_UDP_PORT(dst_port) ((dst_port) == PP_NTOHS(12345))
  57315. */
  57316. if (netif == NULL) {
  57317. /* remote port is DHCP server? */
  57318. if (IPH_PROTO(iphdr) == IP_PROTO_UDP) {
  57319. 8032d74: 7a73 ldrb r3, [r6, #9]
  57320. 8032d76: 2b11 cmp r3, #17
  57321. 8032d78: d089 beq.n 8032c8e <ip_input+0xaa>
  57322. #endif /* IP_ACCEPT_LINK_LAYER_ADDRESSING */
  57323. /* broadcast or multicast packet source address? Compliant with RFC 1122: 3.2.1.3 */
  57324. #if IP_ACCEPT_LINK_LAYER_ADDRESSING
  57325. /* DHCP servers need 0.0.0.0 to be allowed as source address (RFC 1.1.2.2: 3.2.1.3/a) */
  57326. if (check_ip_src && !ip_addr_isany(&current_iphdr_src))
  57327. 8032d7a: f8df 8018 ldr.w r8, [pc, #24] ; 8032d94 <ip_input+0x1b0>
  57328. 8032d7e: f8d8 0000 ldr.w r0, [r8]
  57329. 8032d82: 2800 cmp r0, #0
  57330. 8032d84: d09d beq.n 8032cc2 <ip_input+0xde>
  57331. 8032d86: e789 b.n 8032c9c <ip_input+0xb8>
  57332. current_header = NULL;
  57333. ip_addr_set_any(&current_iphdr_src);
  57334. ip_addr_set_any(&current_iphdr_dest);
  57335. return ERR_OK;
  57336. }
  57337. 8032d88: 2000 movs r0, #0
  57338. 8032d8a: e8bd 8ff8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc}
  57339. 8032d8e: bf00 nop
  57340. 8032d90: 2000ff48 .word 0x2000ff48
  57341. 8032d94: 2000ff40 .word 0x2000ff40
  57342. 8032d98: 2000ff44 .word 0x2000ff44
  57343. 8032d9c: 2000ff4c .word 0x2000ff4c
  57344. 8032da0: 2000ff14 .word 0x2000ff14
  57345. 08032da4 <ip_output_if>:
  57346. */
  57347. err_t
  57348. ip_output_if(struct pbuf *p, ip_addr_t *src, ip_addr_t *dest,
  57349. u8_t ttl, u8_t tos,
  57350. u8_t proto, struct netif *netif)
  57351. {
  57352. 8032da4: e92d 47f3 stmdb sp!, {r0, r1, r4, r5, r6, r7, r8, r9, sl, lr}
  57353. 8032da8: 4615 mov r5, r2
  57354. 8032daa: 4606 mov r6, r0
  57355. 8032dac: 4689 mov r9, r1
  57356. 8032dae: 469a mov sl, r3
  57357. 8032db0: 9f0c ldr r7, [sp, #48] ; 0x30
  57358. /* pbufs passed to IP must have a ref-count of 1 as their payload pointer
  57359. gets altered as the packet is passed down the stack */
  57360. LWIP_ASSERT("p->ref == 1", p->ref == 1);
  57361. snmp_inc_ipoutrequests();
  57362. 8032db2: f001 fbd7 bl 8034564 <snmp_inc_ipoutrequests>
  57363. /* Should the IP header be generated or is it already included in p? */
  57364. if (dest != IP_HDRINCL) {
  57365. 8032db6: b3b5 cbz r5, 8032e26 <ip_output_if+0x82>
  57366. }
  57367. #endif /* CHECKSUM_GEN_IP_INLINE */
  57368. }
  57369. #endif /* IP_OPTIONS_SEND */
  57370. /* generate IP header */
  57371. if (pbuf_header(p, IP_HLEN)) {
  57372. 8032db8: 4630 mov r0, r6
  57373. 8032dba: 2114 movs r1, #20
  57374. 8032dbc: f7fc ff39 bl 802fc32 <pbuf_header>
  57375. 8032dc0: 4680 mov r8, r0
  57376. 8032dc2: b118 cbz r0, 8032dcc <ip_output_if+0x28>
  57377. LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("ip_output: not enough room for IP header in pbuf\n"));
  57378. IP_STATS_INC(ip.err);
  57379. snmp_inc_ipoutdiscards();
  57380. 8032dc4: f001 fbd6 bl 8034574 <snmp_inc_ipoutdiscards>
  57381. return ERR_BUF;
  57382. 8032dc8: 20fe movs r0, #254 ; 0xfe
  57383. 8032dca: e036 b.n 8032e3a <ip_output_if+0x96>
  57384. }
  57385. iphdr = (struct ip_hdr *)p->payload;
  57386. 8032dcc: 6874 ldr r4, [r6, #4]
  57387. LWIP_ASSERT("check that first pbuf can hold struct ip_hdr",
  57388. (p->len >= sizeof(struct ip_hdr)));
  57389. IPH_TTL_SET(iphdr, ttl);
  57390. IPH_PROTO_SET(iphdr, proto);
  57391. 8032dce: f89d 302c ldrb.w r3, [sp, #44] ; 0x2c
  57392. iphdr = (struct ip_hdr *)p->payload;
  57393. LWIP_ASSERT("check that first pbuf can hold struct ip_hdr",
  57394. (p->len >= sizeof(struct ip_hdr)));
  57395. IPH_TTL_SET(iphdr, ttl);
  57396. 8032dd2: f884 a008 strb.w sl, [r4, #8]
  57397. IPH_PROTO_SET(iphdr, proto);
  57398. 8032dd6: 7263 strb r3, [r4, #9]
  57399. #if CHECKSUM_GEN_IP_INLINE
  57400. chk_sum += LWIP_MAKE_U16(proto, ttl);
  57401. #endif /* CHECKSUM_GEN_IP_INLINE */
  57402. /* dest cannot be NULL here */
  57403. ip_addr_copy(iphdr->dest, *dest);
  57404. 8032dd8: 682b ldr r3, [r5, #0]
  57405. 8032dda: 6123 str r3, [r4, #16]
  57406. #if CHECKSUM_GEN_IP_INLINE
  57407. chk_sum += ip4_addr_get_u32(&iphdr->dest) & 0xFFFF;
  57408. chk_sum += ip4_addr_get_u32(&iphdr->dest) >> 16;
  57409. #endif /* CHECKSUM_GEN_IP_INLINE */
  57410. IPH_VHL_SET(iphdr, 4, ip_hlen / 4);
  57411. 8032ddc: 2345 movs r3, #69 ; 0x45
  57412. 8032dde: 7023 strb r3, [r4, #0]
  57413. IPH_TOS_SET(iphdr, tos);
  57414. 8032de0: f89d 3028 ldrb.w r3, [sp, #40] ; 0x28
  57415. 8032de4: 7063 strb r3, [r4, #1]
  57416. #if CHECKSUM_GEN_IP_INLINE
  57417. chk_sum += LWIP_MAKE_U16(tos, iphdr->_v_hl);
  57418. #endif /* CHECKSUM_GEN_IP_INLINE */
  57419. IPH_LEN_SET(iphdr, htons(p->tot_len));
  57420. 8032de6: 8930 ldrh r0, [r6, #8]
  57421. 8032de8: f7fb fe10 bl 802ea0c <lwip_htons>
  57422. #if CHECKSUM_GEN_IP_INLINE
  57423. chk_sum += iphdr->_len;
  57424. #endif /* CHECKSUM_GEN_IP_INLINE */
  57425. IPH_OFFSET_SET(iphdr, 0);
  57426. 8032dec: f884 8006 strb.w r8, [r4, #6]
  57427. 8032df0: f884 8007 strb.w r8, [r4, #7]
  57428. IPH_ID_SET(iphdr, htons(ip_id));
  57429. 8032df4: f8df 8048 ldr.w r8, [pc, #72] ; 8032e40 <ip_output_if+0x9c>
  57430. IPH_VHL_SET(iphdr, 4, ip_hlen / 4);
  57431. IPH_TOS_SET(iphdr, tos);
  57432. #if CHECKSUM_GEN_IP_INLINE
  57433. chk_sum += LWIP_MAKE_U16(tos, iphdr->_v_hl);
  57434. #endif /* CHECKSUM_GEN_IP_INLINE */
  57435. IPH_LEN_SET(iphdr, htons(p->tot_len));
  57436. 8032df8: 8060 strh r0, [r4, #2]
  57437. #if CHECKSUM_GEN_IP_INLINE
  57438. chk_sum += iphdr->_len;
  57439. #endif /* CHECKSUM_GEN_IP_INLINE */
  57440. IPH_OFFSET_SET(iphdr, 0);
  57441. IPH_ID_SET(iphdr, htons(ip_id));
  57442. 8032dfa: f8b8 0000 ldrh.w r0, [r8]
  57443. 8032dfe: f7fb fe05 bl 802ea0c <lwip_htons>
  57444. 8032e02: 80a0 strh r0, [r4, #4]
  57445. #if CHECKSUM_GEN_IP_INLINE
  57446. chk_sum += iphdr->_id;
  57447. #endif /* CHECKSUM_GEN_IP_INLINE */
  57448. ++ip_id;
  57449. 8032e04: f8b8 3000 ldrh.w r3, [r8]
  57450. 8032e08: 3301 adds r3, #1
  57451. 8032e0a: f8a8 3000 strh.w r3, [r8]
  57452. if (ip_addr_isany(src)) {
  57453. 8032e0e: f1b9 0f00 cmp.w r9, #0
  57454. 8032e12: d002 beq.n 8032e1a <ip_output_if+0x76>
  57455. 8032e14: f8d9 3000 ldr.w r3, [r9]
  57456. 8032e18: b903 cbnz r3, 8032e1c <ip_output_if+0x78>
  57457. ip_addr_copy(iphdr->src, netif->ip_addr);
  57458. 8032e1a: 687b ldr r3, [r7, #4]
  57459. } else {
  57460. /* src cannot be NULL here */
  57461. ip_addr_copy(iphdr->src, *src);
  57462. 8032e1c: 60e3 str r3, [r4, #12]
  57463. chk_sum = (chk_sum >> 16) + (chk_sum & 0xFFFF);
  57464. chk_sum = (chk_sum >> 16) + chk_sum;
  57465. chk_sum = ~chk_sum;
  57466. iphdr->_chksum = chk_sum; /* network order */
  57467. #else /* CHECKSUM_GEN_IP_INLINE */
  57468. IPH_CHKSUM_SET(iphdr, 0);
  57469. 8032e1e: 2300 movs r3, #0
  57470. 8032e20: 72a3 strb r3, [r4, #10]
  57471. 8032e22: 72e3 strb r3, [r4, #11]
  57472. 8032e24: e004 b.n 8032e30 <ip_output_if+0x8c>
  57473. #endif
  57474. #endif /* CHECKSUM_GEN_IP_INLINE */
  57475. } else {
  57476. /* IP header already included in p */
  57477. iphdr = (struct ip_hdr *)p->payload;
  57478. ip_addr_copy(dest_addr, iphdr->dest);
  57479. 8032e26: 6873 ldr r3, [r6, #4]
  57480. 8032e28: ad02 add r5, sp, #8
  57481. 8032e2a: 691b ldr r3, [r3, #16]
  57482. 8032e2c: f845 3d04 str.w r3, [r5, #-4]!
  57483. return ip_frag(p, netif, dest);
  57484. }
  57485. #endif /* IP_FRAG */
  57486. LWIP_DEBUGF(IP_DEBUG, ("netif->output()"));
  57487. return netif->output(netif, p, dest);
  57488. 8032e30: 697b ldr r3, [r7, #20]
  57489. 8032e32: 4638 mov r0, r7
  57490. 8032e34: 4631 mov r1, r6
  57491. 8032e36: 462a mov r2, r5
  57492. 8032e38: 4798 blx r3
  57493. }
  57494. 8032e3a: b240 sxtb r0, r0
  57495. 8032e3c: e8bd 87fc ldmia.w sp!, {r2, r3, r4, r5, r6, r7, r8, r9, sl, pc}
  57496. 8032e40: 2000c478 .word 0x2000c478
  57497. 08032e44 <ip_output>:
  57498. * see ip_output_if() for more return values
  57499. */
  57500. err_t
  57501. ip_output(struct pbuf *p, ip_addr_t *src, ip_addr_t *dest,
  57502. u8_t ttl, u8_t tos, u8_t proto)
  57503. {
  57504. 8032e44: b5f0 push {r4, r5, r6, r7, lr}
  57505. 8032e46: 4605 mov r5, r0
  57506. 8032e48: b085 sub sp, #20
  57507. /* pbufs passed to IP must have a ref-count of 1 as their payload pointer
  57508. gets altered as the packet is passed down the stack */
  57509. LWIP_ASSERT("p->ref == 1", p->ref == 1);
  57510. if ((netif = ip_route(dest)) == NULL) {
  57511. 8032e4a: 4610 mov r0, r2
  57512. * see ip_output_if() for more return values
  57513. */
  57514. err_t
  57515. ip_output(struct pbuf *p, ip_addr_t *src, ip_addr_t *dest,
  57516. u8_t ttl, u8_t tos, u8_t proto)
  57517. {
  57518. 8032e4c: 460f mov r7, r1
  57519. 8032e4e: 4614 mov r4, r2
  57520. 8032e50: 461e mov r6, r3
  57521. /* pbufs passed to IP must have a ref-count of 1 as their payload pointer
  57522. gets altered as the packet is passed down the stack */
  57523. LWIP_ASSERT("p->ref == 1", p->ref == 1);
  57524. if ((netif = ip_route(dest)) == NULL) {
  57525. 8032e52: f7ff fea3 bl 8032b9c <ip_route>
  57526. 8032e56: b168 cbz r0, 8032e74 <ip_output+0x30>
  57527. ip4_addr1_16(dest), ip4_addr2_16(dest), ip4_addr3_16(dest), ip4_addr4_16(dest)));
  57528. IP_STATS_INC(ip.rterr);
  57529. return ERR_RTE;
  57530. }
  57531. return ip_output_if(p, src, dest, ttl, tos, proto, netif);
  57532. 8032e58: f89d 3028 ldrb.w r3, [sp, #40] ; 0x28
  57533. 8032e5c: 9002 str r0, [sp, #8]
  57534. 8032e5e: 9300 str r3, [sp, #0]
  57535. 8032e60: f89d 302c ldrb.w r3, [sp, #44] ; 0x2c
  57536. 8032e64: 4628 mov r0, r5
  57537. 8032e66: 9301 str r3, [sp, #4]
  57538. 8032e68: 4639 mov r1, r7
  57539. 8032e6a: 4622 mov r2, r4
  57540. 8032e6c: 4633 mov r3, r6
  57541. 8032e6e: f7ff ff99 bl 8032da4 <ip_output_if>
  57542. 8032e72: e000 b.n 8032e76 <ip_output+0x32>
  57543. if ((netif = ip_route(dest)) == NULL) {
  57544. LWIP_DEBUGF(IP_DEBUG, ("ip_output: No route to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n",
  57545. ip4_addr1_16(dest), ip4_addr2_16(dest), ip4_addr3_16(dest), ip4_addr4_16(dest)));
  57546. IP_STATS_INC(ip.rterr);
  57547. return ERR_RTE;
  57548. 8032e74: 20fc movs r0, #252 ; 0xfc
  57549. }
  57550. return ip_output_if(p, src, dest, ttl, tos, proto, netif);
  57551. }
  57552. 8032e76: b240 sxtb r0, r0
  57553. 8032e78: b005 add sp, #20
  57554. 8032e7a: bdf0 pop {r4, r5, r6, r7, pc}
  57555. 08032e7c <snmp_asn1_dec_type>:
  57556. * @param type return ASN1 type
  57557. * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) decode
  57558. */
  57559. err_t
  57560. snmp_asn1_dec_type(struct pbuf *p, u16_t ofs, u8_t *type)
  57561. {
  57562. 8032e7c: b510 push {r4, lr}
  57563. u16_t plen, base;
  57564. u8_t *msg_ptr;
  57565. plen = 0;
  57566. 8032e7e: 2300 movs r3, #0
  57567. while (p != NULL)
  57568. 8032e80: e00c b.n 8032e9c <snmp_asn1_dec_type+0x20>
  57569. {
  57570. base = plen;
  57571. plen += p->len;
  57572. 8032e82: 8944 ldrh r4, [r0, #10]
  57573. 8032e84: 191c adds r4, r3, r4
  57574. 8032e86: b2a4 uxth r4, r4
  57575. if (ofs < plen)
  57576. 8032e88: 42a1 cmp r1, r4
  57577. 8032e8a: d205 bcs.n 8032e98 <snmp_asn1_dec_type+0x1c>
  57578. {
  57579. msg_ptr = (u8_t*)p->payload;
  57580. 8032e8c: 6840 ldr r0, [r0, #4]
  57581. msg_ptr += ofs - base;
  57582. 8032e8e: 1acb subs r3, r1, r3
  57583. *type = *msg_ptr;
  57584. 8032e90: 5cc3 ldrb r3, [r0, r3]
  57585. return ERR_OK;
  57586. 8032e92: 2000 movs r0, #0
  57587. plen += p->len;
  57588. if (ofs < plen)
  57589. {
  57590. msg_ptr = (u8_t*)p->payload;
  57591. msg_ptr += ofs - base;
  57592. *type = *msg_ptr;
  57593. 8032e94: 7013 strb r3, [r2, #0]
  57594. return ERR_OK;
  57595. 8032e96: e004 b.n 8032ea2 <snmp_asn1_dec_type+0x26>
  57596. }
  57597. p = p->next;
  57598. 8032e98: 6800 ldr r0, [r0, #0]
  57599. plen = 0;
  57600. while (p != NULL)
  57601. {
  57602. base = plen;
  57603. plen += p->len;
  57604. 8032e9a: 4623 mov r3, r4
  57605. {
  57606. u16_t plen, base;
  57607. u8_t *msg_ptr;
  57608. plen = 0;
  57609. while (p != NULL)
  57610. 8032e9c: 2800 cmp r0, #0
  57611. 8032e9e: d1f0 bne.n 8032e82 <snmp_asn1_dec_type+0x6>
  57612. return ERR_OK;
  57613. }
  57614. p = p->next;
  57615. }
  57616. /* p == NULL, ofs >= plen */
  57617. return ERR_ARG;
  57618. 8032ea0: 20f2 movs r0, #242 ; 0xf2
  57619. }
  57620. 8032ea2: b240 sxtb r0, r0
  57621. 8032ea4: bd10 pop {r4, pc}
  57622. 08032ea6 <snmp_asn1_dec_length>:
  57623. * @param length return host order length, upto 64k
  57624. * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) decode
  57625. */
  57626. err_t
  57627. snmp_asn1_dec_length(struct pbuf *p, u16_t ofs, u8_t *octets_used, u16_t *length)
  57628. {
  57629. 8032ea6: b5f0 push {r4, r5, r6, r7, lr}
  57630. u16_t plen, base;
  57631. u8_t *msg_ptr;
  57632. plen = 0;
  57633. 8032ea8: 2500 movs r5, #0
  57634. while (p != NULL)
  57635. 8032eaa: e079 b.n 8032fa0 <snmp_asn1_dec_length+0xfa>
  57636. {
  57637. base = plen;
  57638. plen += p->len;
  57639. 8032eac: 8944 ldrh r4, [r0, #10]
  57640. 8032eae: 192c adds r4, r5, r4
  57641. 8032eb0: b2a4 uxth r4, r4
  57642. if (ofs < plen)
  57643. 8032eb2: 42a1 cmp r1, r4
  57644. 8032eb4: d272 bcs.n 8032f9c <snmp_asn1_dec_length+0xf6>
  57645. {
  57646. msg_ptr = (u8_t*)p->payload;
  57647. 8032eb6: f8d0 c004 ldr.w ip, [r0, #4]
  57648. msg_ptr += ofs - base;
  57649. 8032eba: 1b4f subs r7, r1, r5
  57650. 8032ebc: eb0c 0507 add.w r5, ip, r7
  57651. if (*msg_ptr < 0x80)
  57652. 8032ec0: f81c 6007 ldrb.w r6, [ip, r7]
  57653. 8032ec4: f016 0f80 tst.w r6, #128 ; 0x80
  57654. 8032ec8: d105 bne.n 8032ed6 <snmp_asn1_dec_length+0x30>
  57655. {
  57656. /* primitive definite length format */
  57657. *octets_used = 1;
  57658. 8032eca: 2101 movs r1, #1
  57659. 8032ecc: 7011 strb r1, [r2, #0]
  57660. *length = *msg_ptr;
  57661. 8032ece: f81c 2007 ldrb.w r2, [ip, r7]
  57662. 8032ed2: 801a strh r2, [r3, #0]
  57663. 8032ed4: e05a b.n 8032f8c <snmp_asn1_dec_length+0xe6>
  57664. return ERR_OK;
  57665. }
  57666. else if (*msg_ptr == 0x80)
  57667. 8032ed6: 2e80 cmp r6, #128 ; 0x80
  57668. 8032ed8: d12a bne.n 8032f30 <snmp_asn1_dec_length+0x8a>
  57669. {
  57670. /* constructed indefinite length format, termination with two zero octets */
  57671. u8_t zeros;
  57672. u8_t i;
  57673. *length = 0;
  57674. 8032eda: 2600 movs r6, #0
  57675. 8032edc: 801e strh r6, [r3, #0]
  57676. 8032ede: e022 b.n 8032f26 <snmp_asn1_dec_length+0x80>
  57677. {
  57678. i = 2;
  57679. while (i > 0)
  57680. {
  57681. i--;
  57682. (*length) += 1;
  57683. 8032ee0: f8b3 c000 ldrh.w ip, [r3]
  57684. ofs += 1;
  57685. 8032ee4: 3101 adds r1, #1
  57686. 8032ee6: b289 uxth r1, r1
  57687. {
  57688. i = 2;
  57689. while (i > 0)
  57690. {
  57691. i--;
  57692. (*length) += 1;
  57693. 8032ee8: f10c 0c01 add.w ip, ip, #1
  57694. ofs += 1;
  57695. if (ofs >= plen)
  57696. 8032eec: 42a1 cmp r1, r4
  57697. {
  57698. i = 2;
  57699. while (i > 0)
  57700. {
  57701. i--;
  57702. (*length) += 1;
  57703. 8032eee: f8a3 c000 strh.w ip, [r3]
  57704. ofs += 1;
  57705. if (ofs >= plen)
  57706. 8032ef2: d308 bcc.n 8032f06 <snmp_asn1_dec_length+0x60>
  57707. {
  57708. /* next octet in next pbuf */
  57709. p = p->next;
  57710. 8032ef4: 6800 ldr r0, [r0, #0]
  57711. if (p == NULL) { return ERR_ARG; }
  57712. 8032ef6: b900 cbnz r0, 8032efa <snmp_asn1_dec_length+0x54>
  57713. 8032ef8: e04e b.n 8032f98 <snmp_asn1_dec_length+0xf2>
  57714. msg_ptr = (u8_t*)p->payload;
  57715. plen += p->len;
  57716. 8032efa: f8b0 c00a ldrh.w ip, [r0, #10]
  57717. if (ofs >= plen)
  57718. {
  57719. /* next octet in next pbuf */
  57720. p = p->next;
  57721. if (p == NULL) { return ERR_ARG; }
  57722. msg_ptr = (u8_t*)p->payload;
  57723. 8032efe: 6845 ldr r5, [r0, #4]
  57724. plen += p->len;
  57725. 8032f00: 4464 add r4, ip
  57726. 8032f02: b2a4 uxth r4, r4
  57727. 8032f04: e000 b.n 8032f08 <snmp_asn1_dec_length+0x62>
  57728. }
  57729. else
  57730. {
  57731. /* next octet in same pbuf */
  57732. msg_ptr++;
  57733. 8032f06: 3501 adds r5, #1
  57734. }
  57735. if (*msg_ptr == 0)
  57736. 8032f08: f895 c000 ldrb.w ip, [r5]
  57737. 8032f0c: f1bc 0f00 cmp.w ip, #0
  57738. 8032f10: d104 bne.n 8032f1c <snmp_asn1_dec_length+0x76>
  57739. {
  57740. zeros++;
  57741. 8032f12: 3601 adds r6, #1
  57742. 8032f14: b2f6 uxtb r6, r6
  57743. if (zeros == 2)
  57744. 8032f16: 2e02 cmp r6, #2
  57745. 8032f18: d101 bne.n 8032f1e <snmp_asn1_dec_length+0x78>
  57746. 8032f1a: e007 b.n 8032f2c <snmp_asn1_dec_length+0x86>
  57747. i = 0;
  57748. }
  57749. }
  57750. else
  57751. {
  57752. zeros = 0;
  57753. 8032f1c: 2600 movs r6, #0
  57754. *length = 0;
  57755. zeros = 0;
  57756. while (zeros != 2)
  57757. {
  57758. i = 2;
  57759. while (i > 0)
  57760. 8032f1e: 42b9 cmp r1, r7
  57761. 8032f20: d1de bne.n 8032ee0 <snmp_asn1_dec_length+0x3a>
  57762. u8_t zeros;
  57763. u8_t i;
  57764. *length = 0;
  57765. zeros = 0;
  57766. while (zeros != 2)
  57767. 8032f22: 2e02 cmp r6, #2
  57768. 8032f24: d002 beq.n 8032f2c <snmp_asn1_dec_length+0x86>
  57769. * @param octets_used returns number of octets used by the length code
  57770. * @param length return host order length, upto 64k
  57771. * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) decode
  57772. */
  57773. err_t
  57774. snmp_asn1_dec_length(struct pbuf *p, u16_t ofs, u8_t *octets_used, u16_t *length)
  57775. 8032f26: 1c8f adds r7, r1, #2
  57776. 8032f28: b2bf uxth r7, r7
  57777. 8032f2a: e7d9 b.n 8032ee0 <snmp_asn1_dec_length+0x3a>
  57778. {
  57779. zeros = 0;
  57780. }
  57781. }
  57782. }
  57783. *octets_used = 1;
  57784. 8032f2c: 2301 movs r3, #1
  57785. 8032f2e: e02c b.n 8032f8a <snmp_asn1_dec_length+0xe4>
  57786. return ERR_OK;
  57787. }
  57788. else if (*msg_ptr == 0x81)
  57789. 8032f30: 2e81 cmp r6, #129 ; 0x81
  57790. 8032f32: d10c bne.n 8032f4e <snmp_asn1_dec_length+0xa8>
  57791. {
  57792. /* constructed definite length format, one octet */
  57793. ofs += 1;
  57794. 8032f34: 3101 adds r1, #1
  57795. if (ofs >= plen)
  57796. 8032f36: b289 uxth r1, r1
  57797. 8032f38: 42a1 cmp r1, r4
  57798. 8032f3a: d303 bcc.n 8032f44 <snmp_asn1_dec_length+0x9e>
  57799. {
  57800. /* next octet in next pbuf */
  57801. p = p->next;
  57802. 8032f3c: 6801 ldr r1, [r0, #0]
  57803. if (p == NULL) { return ERR_ARG; }
  57804. 8032f3e: b359 cbz r1, 8032f98 <snmp_asn1_dec_length+0xf2>
  57805. msg_ptr = (u8_t*)p->payload;
  57806. 8032f40: 684d ldr r5, [r1, #4]
  57807. 8032f42: e000 b.n 8032f46 <snmp_asn1_dec_length+0xa0>
  57808. }
  57809. else
  57810. {
  57811. /* next octet in same pbuf */
  57812. msg_ptr++;
  57813. 8032f44: 3501 adds r5, #1
  57814. }
  57815. *length = *msg_ptr;
  57816. 8032f46: 7829 ldrb r1, [r5, #0]
  57817. 8032f48: 8019 strh r1, [r3, #0]
  57818. *octets_used = 2;
  57819. 8032f4a: 2302 movs r3, #2
  57820. 8032f4c: e01d b.n 8032f8a <snmp_asn1_dec_length+0xe4>
  57821. return ERR_OK;
  57822. }
  57823. else if (*msg_ptr == 0x82)
  57824. 8032f4e: 2e82 cmp r6, #130 ; 0x82
  57825. 8032f50: d11e bne.n 8032f90 <snmp_asn1_dec_length+0xea>
  57826. /* constructed definite length format, two octets */
  57827. i = 2;
  57828. while (i > 0)
  57829. {
  57830. i--;
  57831. ofs += 1;
  57832. 8032f52: 1c4e adds r6, r1, #1
  57833. if (ofs >= plen)
  57834. 8032f54: b2b6 uxth r6, r6
  57835. 8032f56: 42a6 cmp r6, r4
  57836. 8032f58: d201 bcs.n 8032f5e <snmp_asn1_dec_length+0xb8>
  57837. plen += p->len;
  57838. }
  57839. else
  57840. {
  57841. /* next octet in same pbuf */
  57842. msg_ptr++;
  57843. 8032f5a: 3501 adds r5, #1
  57844. 8032f5c: e005 b.n 8032f6a <snmp_asn1_dec_length+0xc4>
  57845. i--;
  57846. ofs += 1;
  57847. if (ofs >= plen)
  57848. {
  57849. /* next octet in next pbuf */
  57850. p = p->next;
  57851. 8032f5e: 6800 ldr r0, [r0, #0]
  57852. if (p == NULL) { return ERR_ARG; }
  57853. 8032f60: b1d0 cbz r0, 8032f98 <snmp_asn1_dec_length+0xf2>
  57854. msg_ptr = (u8_t*)p->payload;
  57855. plen += p->len;
  57856. 8032f62: 8946 ldrh r6, [r0, #10]
  57857. if (ofs >= plen)
  57858. {
  57859. /* next octet in next pbuf */
  57860. p = p->next;
  57861. if (p == NULL) { return ERR_ARG; }
  57862. msg_ptr = (u8_t*)p->payload;
  57863. 8032f64: 6845 ldr r5, [r0, #4]
  57864. plen += p->len;
  57865. 8032f66: 19a4 adds r4, r4, r6
  57866. 8032f68: b2a4 uxth r4, r4
  57867. *length |= *msg_ptr;
  57868. }
  57869. else
  57870. {
  57871. /* most significant length octet */
  57872. *length = (*msg_ptr) << 8;
  57873. 8032f6a: 782e ldrb r6, [r5, #0]
  57874. /* constructed definite length format, two octets */
  57875. i = 2;
  57876. while (i > 0)
  57877. {
  57878. i--;
  57879. ofs += 1;
  57880. 8032f6c: 3102 adds r1, #2
  57881. if (ofs >= plen)
  57882. 8032f6e: b289 uxth r1, r1
  57883. *length |= *msg_ptr;
  57884. }
  57885. else
  57886. {
  57887. /* most significant length octet */
  57888. *length = (*msg_ptr) << 8;
  57889. 8032f70: 0236 lsls r6, r6, #8
  57890. i = 2;
  57891. while (i > 0)
  57892. {
  57893. i--;
  57894. ofs += 1;
  57895. if (ofs >= plen)
  57896. 8032f72: 42a1 cmp r1, r4
  57897. *length |= *msg_ptr;
  57898. }
  57899. else
  57900. {
  57901. /* most significant length octet */
  57902. *length = (*msg_ptr) << 8;
  57903. 8032f74: 801e strh r6, [r3, #0]
  57904. i = 2;
  57905. while (i > 0)
  57906. {
  57907. i--;
  57908. ofs += 1;
  57909. if (ofs >= plen)
  57910. 8032f76: d201 bcs.n 8032f7c <snmp_asn1_dec_length+0xd6>
  57911. plen += p->len;
  57912. }
  57913. else
  57914. {
  57915. /* next octet in same pbuf */
  57916. msg_ptr++;
  57917. 8032f78: 3501 adds r5, #1
  57918. 8032f7a: e002 b.n 8032f82 <snmp_asn1_dec_length+0xdc>
  57919. i--;
  57920. ofs += 1;
  57921. if (ofs >= plen)
  57922. {
  57923. /* next octet in next pbuf */
  57924. p = p->next;
  57925. 8032f7c: 6801 ldr r1, [r0, #0]
  57926. if (p == NULL) { return ERR_ARG; }
  57927. 8032f7e: b159 cbz r1, 8032f98 <snmp_asn1_dec_length+0xf2>
  57928. msg_ptr = (u8_t*)p->payload;
  57929. 8032f80: 684d ldr r5, [r1, #4]
  57930. msg_ptr++;
  57931. }
  57932. if (i == 0)
  57933. {
  57934. /* least significant length octet */
  57935. *length |= *msg_ptr;
  57936. 8032f82: 7829 ldrb r1, [r5, #0]
  57937. 8032f84: 430e orrs r6, r1
  57938. 8032f86: 801e strh r6, [r3, #0]
  57939. {
  57940. /* most significant length octet */
  57941. *length = (*msg_ptr) << 8;
  57942. }
  57943. }
  57944. *octets_used = 3;
  57945. 8032f88: 2303 movs r3, #3
  57946. 8032f8a: 7013 strb r3, [r2, #0]
  57947. return ERR_OK;
  57948. 8032f8c: 2000 movs r0, #0
  57949. 8032f8e: e00a b.n 8032fa6 <snmp_asn1_dec_length+0x100>
  57950. }
  57951. else
  57952. {
  57953. /* constructed definite length format 3..127 octets, this is too big (>64k) */
  57954. /** @todo: do we need to accept inefficient codings with many leading zero's? */
  57955. *octets_used = 1 + ((*msg_ptr) & 0x7f);
  57956. 8032f90: f006 067f and.w r6, r6, #127 ; 0x7f
  57957. 8032f94: 3601 adds r6, #1
  57958. 8032f96: 7016 strb r6, [r2, #0]
  57959. return ERR_ARG;
  57960. 8032f98: 20f2 movs r0, #242 ; 0xf2
  57961. 8032f9a: e004 b.n 8032fa6 <snmp_asn1_dec_length+0x100>
  57962. }
  57963. }
  57964. p = p->next;
  57965. 8032f9c: 6800 ldr r0, [r0, #0]
  57966. plen = 0;
  57967. while (p != NULL)
  57968. {
  57969. base = plen;
  57970. plen += p->len;
  57971. 8032f9e: 4625 mov r5, r4
  57972. {
  57973. u16_t plen, base;
  57974. u8_t *msg_ptr;
  57975. plen = 0;
  57976. while (p != NULL)
  57977. 8032fa0: 2800 cmp r0, #0
  57978. 8032fa2: d183 bne.n 8032eac <snmp_asn1_dec_length+0x6>
  57979. 8032fa4: e7f8 b.n 8032f98 <snmp_asn1_dec_length+0xf2>
  57980. p = p->next;
  57981. }
  57982. /* p == NULL, ofs >= plen */
  57983. return ERR_ARG;
  57984. }
  57985. 8032fa6: b240 sxtb r0, r0
  57986. 8032fa8: bdf0 pop {r4, r5, r6, r7, pc}
  57987. 08032faa <snmp_asn1_dec_u32t>:
  57988. * as 0x00,0xFF,0xFF. Note the leading sign octet. A positive value
  57989. * of 0xFFFFFFFF is preceded with 0x00 and the length is 5 octets!!
  57990. */
  57991. err_t
  57992. snmp_asn1_dec_u32t(struct pbuf *p, u16_t ofs, u16_t len, u32_t *value)
  57993. {
  57994. 8032faa: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  57995. u16_t plen, base;
  57996. u8_t *msg_ptr;
  57997. plen = 0;
  57998. 8032fae: 2500 movs r5, #0
  57999. while (p != NULL)
  58000. 8032fb0: e049 b.n 8033046 <snmp_asn1_dec_u32t+0x9c>
  58001. {
  58002. base = plen;
  58003. plen += p->len;
  58004. 8032fb2: 8944 ldrh r4, [r0, #10]
  58005. 8032fb4: 192c adds r4, r5, r4
  58006. 8032fb6: b2a4 uxth r4, r4
  58007. if (ofs < plen)
  58008. 8032fb8: 42a1 cmp r1, r4
  58009. 8032fba: d242 bcs.n 8033042 <snmp_asn1_dec_u32t+0x98>
  58010. {
  58011. msg_ptr = (u8_t*)p->payload;
  58012. msg_ptr += ofs - base;
  58013. if ((len > 0) && (len < 6))
  58014. 8032fbc: 1e56 subs r6, r2, #1
  58015. {
  58016. base = plen;
  58017. plen += p->len;
  58018. if (ofs < plen)
  58019. {
  58020. msg_ptr = (u8_t*)p->payload;
  58021. 8032fbe: f8d0 c004 ldr.w ip, [r0, #4]
  58022. msg_ptr += ofs - base;
  58023. if ((len > 0) && (len < 6))
  58024. 8032fc2: b2b6 uxth r6, r6
  58025. base = plen;
  58026. plen += p->len;
  58027. if (ofs < plen)
  58028. {
  58029. msg_ptr = (u8_t*)p->payload;
  58030. msg_ptr += ofs - base;
  58031. 8032fc4: 1b4f subs r7, r1, r5
  58032. if ((len > 0) && (len < 6))
  58033. 8032fc6: 2e04 cmp r6, #4
  58034. base = plen;
  58035. plen += p->len;
  58036. if (ofs < plen)
  58037. {
  58038. msg_ptr = (u8_t*)p->payload;
  58039. msg_ptr += ofs - base;
  58040. 8032fc8: eb0c 0507 add.w r5, ip, r7
  58041. if ((len > 0) && (len < 6))
  58042. 8032fcc: d901 bls.n 8032fd2 <snmp_asn1_dec_u32t+0x28>
  58043. *value |= *msg_ptr;
  58044. return ERR_OK;
  58045. }
  58046. else
  58047. {
  58048. return ERR_ARG;
  58049. 8032fce: 20f2 movs r0, #242 ; 0xf2
  58050. 8032fd0: e03c b.n 803304c <snmp_asn1_dec_u32t+0xa2>
  58051. msg_ptr = (u8_t*)p->payload;
  58052. msg_ptr += ofs - base;
  58053. if ((len > 0) && (len < 6))
  58054. {
  58055. /* start from zero */
  58056. *value = 0;
  58057. 8032fd2: f04f 0800 mov.w r8, #0
  58058. 8032fd6: f8c3 8000 str.w r8, [r3]
  58059. if (*msg_ptr & 0x80)
  58060. 8032fda: f81c 7007 ldrb.w r7, [ip, r7]
  58061. 8032fde: f017 0f80 tst.w r7, #128 ; 0x80
  58062. 8032fe2: d1f4 bne.n 8032fce <snmp_asn1_dec_u32t+0x24>
  58063. return ERR_ARG;
  58064. }
  58065. else
  58066. {
  58067. /* positive */
  58068. if ((len > 1) && (*msg_ptr == 0))
  58069. 8032fe4: 2a01 cmp r2, #1
  58070. 8032fe6: d00e beq.n 8033006 <snmp_asn1_dec_u32t+0x5c>
  58071. 8032fe8: b96f cbnz r7, 8033006 <snmp_asn1_dec_u32t+0x5c>
  58072. {
  58073. /* skip leading "sign byte" octet 0x00 */
  58074. len--;
  58075. ofs += 1;
  58076. 8032fea: 3101 adds r1, #1
  58077. 8032fec: b289 uxth r1, r1
  58078. if (ofs >= plen)
  58079. 8032fee: 42a1 cmp r1, r4
  58080. {
  58081. /* positive */
  58082. if ((len > 1) && (*msg_ptr == 0))
  58083. {
  58084. /* skip leading "sign byte" octet 0x00 */
  58085. len--;
  58086. 8032ff0: 4632 mov r2, r6
  58087. ofs += 1;
  58088. if (ofs >= plen)
  58089. 8032ff2: d307 bcc.n 8033004 <snmp_asn1_dec_u32t+0x5a>
  58090. {
  58091. /* next octet in next pbuf */
  58092. p = p->next;
  58093. 8032ff4: 6800 ldr r0, [r0, #0]
  58094. if (p == NULL) { return ERR_ARG; }
  58095. 8032ff6: 2800 cmp r0, #0
  58096. 8032ff8: d0e9 beq.n 8032fce <snmp_asn1_dec_u32t+0x24>
  58097. msg_ptr = (u8_t*)p->payload;
  58098. plen += p->len;
  58099. 8032ffa: 8946 ldrh r6, [r0, #10]
  58100. if (ofs >= plen)
  58101. {
  58102. /* next octet in next pbuf */
  58103. p = p->next;
  58104. if (p == NULL) { return ERR_ARG; }
  58105. msg_ptr = (u8_t*)p->payload;
  58106. 8032ffc: 6845 ldr r5, [r0, #4]
  58107. plen += p->len;
  58108. 8032ffe: 19a4 adds r4, r4, r6
  58109. 8033000: b2a4 uxth r4, r4
  58110. 8033002: e000 b.n 8033006 <snmp_asn1_dec_u32t+0x5c>
  58111. }
  58112. else
  58113. {
  58114. /* next octet in same pbuf */
  58115. msg_ptr++;
  58116. 8033004: 3501 adds r5, #1
  58117. 8033006: 1c4e adds r6, r1, #1
  58118. * @note ASN coded integers are _always_ signed. E.g. +0xFFFF is coded
  58119. * as 0x00,0xFF,0xFF. Note the leading sign octet. A positive value
  58120. * of 0xFFFFFFFF is preceded with 0x00 and the length is 5 octets!!
  58121. */
  58122. err_t
  58123. snmp_asn1_dec_u32t(struct pbuf *p, u16_t ofs, u16_t len, u32_t *value)
  58124. 8033008: 188a adds r2, r1, r2
  58125. 803300a: b2b6 uxth r6, r6
  58126. 803300c: b292 uxth r2, r2
  58127. 803300e: e010 b.n 8033032 <snmp_asn1_dec_u32t+0x88>
  58128. }
  58129. /* OR octets with value */
  58130. while (len > 1)
  58131. {
  58132. len--;
  58133. *value |= *msg_ptr;
  58134. 8033010: 7829 ldrb r1, [r5, #0]
  58135. 8033012: 430f orrs r7, r1
  58136. *value <<= 8;
  58137. 8033014: 023f lsls r7, r7, #8
  58138. ofs += 1;
  58139. if (ofs >= plen)
  58140. 8033016: 42a6 cmp r6, r4
  58141. /* OR octets with value */
  58142. while (len > 1)
  58143. {
  58144. len--;
  58145. *value |= *msg_ptr;
  58146. *value <<= 8;
  58147. 8033018: 601f str r7, [r3, #0]
  58148. ofs += 1;
  58149. if (ofs >= plen)
  58150. 803301a: d307 bcc.n 803302c <snmp_asn1_dec_u32t+0x82>
  58151. {
  58152. /* next octet in next pbuf */
  58153. p = p->next;
  58154. 803301c: 6800 ldr r0, [r0, #0]
  58155. if (p == NULL) { return ERR_ARG; }
  58156. 803301e: 2800 cmp r0, #0
  58157. 8033020: d0d5 beq.n 8032fce <snmp_asn1_dec_u32t+0x24>
  58158. msg_ptr = (u8_t*)p->payload;
  58159. plen += p->len;
  58160. 8033022: 8941 ldrh r1, [r0, #10]
  58161. if (ofs >= plen)
  58162. {
  58163. /* next octet in next pbuf */
  58164. p = p->next;
  58165. if (p == NULL) { return ERR_ARG; }
  58166. msg_ptr = (u8_t*)p->payload;
  58167. 8033024: 6845 ldr r5, [r0, #4]
  58168. plen += p->len;
  58169. 8033026: 1864 adds r4, r4, r1
  58170. 8033028: b2a4 uxth r4, r4
  58171. 803302a: e000 b.n 803302e <snmp_asn1_dec_u32t+0x84>
  58172. }
  58173. else
  58174. {
  58175. /* next octet in same pbuf */
  58176. msg_ptr++;
  58177. 803302c: 3501 adds r5, #1
  58178. 803302e: 3601 adds r6, #1
  58179. 8033030: b2b6 uxth r6, r6
  58180. msg_ptr++;
  58181. }
  58182. }
  58183. }
  58184. /* OR octets with value */
  58185. while (len > 1)
  58186. 8033032: 4296 cmp r6, r2
  58187. 8033034: 681f ldr r7, [r3, #0]
  58188. 8033036: d1eb bne.n 8033010 <snmp_asn1_dec_u32t+0x66>
  58189. {
  58190. /* next octet in same pbuf */
  58191. msg_ptr++;
  58192. }
  58193. }
  58194. *value |= *msg_ptr;
  58195. 8033038: 782a ldrb r2, [r5, #0]
  58196. 803303a: 4317 orrs r7, r2
  58197. 803303c: 601f str r7, [r3, #0]
  58198. return ERR_OK;
  58199. 803303e: 2000 movs r0, #0
  58200. 8033040: e004 b.n 803304c <snmp_asn1_dec_u32t+0xa2>
  58201. else
  58202. {
  58203. return ERR_ARG;
  58204. }
  58205. }
  58206. p = p->next;
  58207. 8033042: 6800 ldr r0, [r0, #0]
  58208. plen = 0;
  58209. while (p != NULL)
  58210. {
  58211. base = plen;
  58212. plen += p->len;
  58213. 8033044: 4625 mov r5, r4
  58214. {
  58215. u16_t plen, base;
  58216. u8_t *msg_ptr;
  58217. plen = 0;
  58218. while (p != NULL)
  58219. 8033046: 2800 cmp r0, #0
  58220. 8033048: d1b3 bne.n 8032fb2 <snmp_asn1_dec_u32t+0x8>
  58221. 803304a: e7c0 b.n 8032fce <snmp_asn1_dec_u32t+0x24>
  58222. }
  58223. p = p->next;
  58224. }
  58225. /* p == NULL, ofs >= plen */
  58226. return ERR_ARG;
  58227. }
  58228. 803304c: b240 sxtb r0, r0
  58229. 803304e: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  58230. 08033052 <snmp_asn1_dec_s32t>:
  58231. *
  58232. * @note ASN coded integers are _always_ signed!
  58233. */
  58234. err_t
  58235. snmp_asn1_dec_s32t(struct pbuf *p, u16_t ofs, u16_t len, s32_t *value)
  58236. {
  58237. 8033052: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  58238. #if BYTE_ORDER == BIG_ENDIAN
  58239. u8_t *lsb_ptr = (u8_t*)value + sizeof(s32_t) - 1;
  58240. #endif
  58241. u8_t sign;
  58242. plen = 0;
  58243. 8033056: 2500 movs r5, #0
  58244. while (p != NULL)
  58245. 8033058: e04e b.n 80330f8 <snmp_asn1_dec_s32t+0xa6>
  58246. {
  58247. base = plen;
  58248. plen += p->len;
  58249. 803305a: 8944 ldrh r4, [r0, #10]
  58250. 803305c: 192c adds r4, r5, r4
  58251. 803305e: b2a4 uxth r4, r4
  58252. if (ofs < plen)
  58253. 8033060: 42a1 cmp r1, r4
  58254. 8033062: d247 bcs.n 80330f4 <snmp_asn1_dec_s32t+0xa2>
  58255. {
  58256. msg_ptr = (u8_t*)p->payload;
  58257. 8033064: 6847 ldr r7, [r0, #4]
  58258. msg_ptr += ofs - base;
  58259. if ((len > 0) && (len < 5))
  58260. 8033066: f102 3cff add.w ip, r2, #4294967295
  58261. base = plen;
  58262. plen += p->len;
  58263. if (ofs < plen)
  58264. {
  58265. msg_ptr = (u8_t*)p->payload;
  58266. msg_ptr += ofs - base;
  58267. 803306a: 1b4e subs r6, r1, r5
  58268. if ((len > 0) && (len < 5))
  58269. 803306c: f1bc 0f03 cmp.w ip, #3
  58270. base = plen;
  58271. plen += p->len;
  58272. if (ofs < plen)
  58273. {
  58274. msg_ptr = (u8_t*)p->payload;
  58275. msg_ptr += ofs - base;
  58276. 8033070: eb07 0506 add.w r5, r7, r6
  58277. if ((len > 0) && (len < 5))
  58278. 8033074: d901 bls.n 803307a <snmp_asn1_dec_s32t+0x28>
  58279. }
  58280. return ERR_OK;
  58281. }
  58282. else
  58283. {
  58284. return ERR_ARG;
  58285. 8033076: 20f2 movs r0, #242 ; 0xf2
  58286. 8033078: e041 b.n 80330fe <snmp_asn1_dec_s32t+0xac>
  58287. {
  58288. msg_ptr = (u8_t*)p->payload;
  58289. msg_ptr += ofs - base;
  58290. if ((len > 0) && (len < 5))
  58291. {
  58292. if (*msg_ptr & 0x80)
  58293. 803307a: 57be ldrsb r6, [r7, r6]
  58294. 803307c: 2e00 cmp r6, #0
  58295. 803307e: da0b bge.n 8033098 <snmp_asn1_dec_s32t+0x46>
  58296. {
  58297. /* negative, start from -1 */
  58298. *value = -1;
  58299. 8033080: f04f 36ff mov.w r6, #4294967295
  58300. 8033084: 601e str r6, [r3, #0]
  58301. sign = 1;
  58302. 8033086: 2601 movs r6, #1
  58303. 8033088: f101 0c01 add.w ip, r1, #1
  58304. * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) decode
  58305. *
  58306. * @note ASN coded integers are _always_ signed!
  58307. */
  58308. err_t
  58309. snmp_asn1_dec_s32t(struct pbuf *p, u16_t ofs, u16_t len, s32_t *value)
  58310. 803308c: 1852 adds r2, r2, r1
  58311. 803308e: fa1f fc8c uxth.w ip, ip
  58312. 8033092: b292 uxth r2, r2
  58313. len--;
  58314. if (sign)
  58315. {
  58316. *lsb_ptr &= *msg_ptr;
  58317. *value <<= 8;
  58318. *lsb_ptr |= 255;
  58319. 8033094: 21ff movs r1, #255 ; 0xff
  58320. 8033096: e022 b.n 80330de <snmp_asn1_dec_s32t+0x8c>
  58321. sign = 1;
  58322. }
  58323. else
  58324. {
  58325. /* positive, start from 0 */
  58326. *value = 0;
  58327. 8033098: 2600 movs r6, #0
  58328. 803309a: 601e str r6, [r3, #0]
  58329. 803309c: e7f4 b.n 8033088 <snmp_asn1_dec_s32t+0x36>
  58330. 803309e: f895 8000 ldrb.w r8, [r5]
  58331. }
  58332. /* OR/AND octets with value */
  58333. while (len > 1)
  58334. {
  58335. len--;
  58336. if (sign)
  58337. 80330a2: b13e cbz r6, 80330b4 <snmp_asn1_dec_s32t+0x62>
  58338. {
  58339. *lsb_ptr &= *msg_ptr;
  58340. 80330a4: ea08 0707 and.w r7, r8, r7
  58341. 80330a8: 701f strb r7, [r3, #0]
  58342. *value <<= 8;
  58343. 80330aa: 681f ldr r7, [r3, #0]
  58344. 80330ac: 023f lsls r7, r7, #8
  58345. 80330ae: 601f str r7, [r3, #0]
  58346. *lsb_ptr |= 255;
  58347. 80330b0: 7019 strb r1, [r3, #0]
  58348. 80330b2: e005 b.n 80330c0 <snmp_asn1_dec_s32t+0x6e>
  58349. }
  58350. else
  58351. {
  58352. *lsb_ptr |= *msg_ptr;
  58353. 80330b4: ea48 0707 orr.w r7, r8, r7
  58354. 80330b8: 701f strb r7, [r3, #0]
  58355. *value <<= 8;
  58356. 80330ba: 681f ldr r7, [r3, #0]
  58357. 80330bc: 023f lsls r7, r7, #8
  58358. 80330be: 601f str r7, [r3, #0]
  58359. }
  58360. ofs += 1;
  58361. if (ofs >= plen)
  58362. 80330c0: 45a4 cmp ip, r4
  58363. 80330c2: d307 bcc.n 80330d4 <snmp_asn1_dec_s32t+0x82>
  58364. {
  58365. /* next octet in next pbuf */
  58366. p = p->next;
  58367. 80330c4: 6800 ldr r0, [r0, #0]
  58368. if (p == NULL) { return ERR_ARG; }
  58369. 80330c6: 2800 cmp r0, #0
  58370. 80330c8: d0d5 beq.n 8033076 <snmp_asn1_dec_s32t+0x24>
  58371. msg_ptr = (u8_t*)p->payload;
  58372. plen += p->len;
  58373. 80330ca: 8947 ldrh r7, [r0, #10]
  58374. if (ofs >= plen)
  58375. {
  58376. /* next octet in next pbuf */
  58377. p = p->next;
  58378. if (p == NULL) { return ERR_ARG; }
  58379. msg_ptr = (u8_t*)p->payload;
  58380. 80330cc: 6845 ldr r5, [r0, #4]
  58381. plen += p->len;
  58382. 80330ce: 19e4 adds r4, r4, r7
  58383. 80330d0: b2a4 uxth r4, r4
  58384. 80330d2: e000 b.n 80330d6 <snmp_asn1_dec_s32t+0x84>
  58385. }
  58386. else
  58387. {
  58388. /* next octet in same pbuf */
  58389. msg_ptr++;
  58390. 80330d4: 3501 adds r5, #1
  58391. 80330d6: f10c 0c01 add.w ip, ip, #1
  58392. 80330da: fa1f fc8c uxth.w ip, ip
  58393. /* positive, start from 0 */
  58394. *value = 0;
  58395. sign = 0;
  58396. }
  58397. /* OR/AND octets with value */
  58398. while (len > 1)
  58399. 80330de: 4594 cmp ip, r2
  58400. 80330e0: 781f ldrb r7, [r3, #0]
  58401. 80330e2: d1dc bne.n 803309e <snmp_asn1_dec_s32t+0x4c>
  58402. 80330e4: 782a ldrb r2, [r5, #0]
  58403. {
  58404. /* next octet in same pbuf */
  58405. msg_ptr++;
  58406. }
  58407. }
  58408. if (sign)
  58409. 80330e6: b11e cbz r6, 80330f0 <snmp_asn1_dec_s32t+0x9e>
  58410. {
  58411. *lsb_ptr &= *msg_ptr;
  58412. 80330e8: 4017 ands r7, r2
  58413. 80330ea: 701f strb r7, [r3, #0]
  58414. }
  58415. else
  58416. {
  58417. *lsb_ptr |= *msg_ptr;
  58418. }
  58419. return ERR_OK;
  58420. 80330ec: 2000 movs r0, #0
  58421. 80330ee: e006 b.n 80330fe <snmp_asn1_dec_s32t+0xac>
  58422. {
  58423. *lsb_ptr &= *msg_ptr;
  58424. }
  58425. else
  58426. {
  58427. *lsb_ptr |= *msg_ptr;
  58428. 80330f0: 4317 orrs r7, r2
  58429. 80330f2: e7fa b.n 80330ea <snmp_asn1_dec_s32t+0x98>
  58430. else
  58431. {
  58432. return ERR_ARG;
  58433. }
  58434. }
  58435. p = p->next;
  58436. 80330f4: 6800 ldr r0, [r0, #0]
  58437. plen = 0;
  58438. while (p != NULL)
  58439. {
  58440. base = plen;
  58441. plen += p->len;
  58442. 80330f6: 4625 mov r5, r4
  58443. u8_t *lsb_ptr = (u8_t*)value + sizeof(s32_t) - 1;
  58444. #endif
  58445. u8_t sign;
  58446. plen = 0;
  58447. while (p != NULL)
  58448. 80330f8: 2800 cmp r0, #0
  58449. 80330fa: d1ae bne.n 803305a <snmp_asn1_dec_s32t+0x8>
  58450. 80330fc: e7bb b.n 8033076 <snmp_asn1_dec_s32t+0x24>
  58451. }
  58452. p = p->next;
  58453. }
  58454. /* p == NULL, ofs >= plen */
  58455. return ERR_ARG;
  58456. }
  58457. 80330fe: b240 sxtb r0, r0
  58458. 8033100: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  58459. 08033104 <snmp_asn1_dec_oid>:
  58460. * @param oid return object identifier struct
  58461. * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) decode
  58462. */
  58463. err_t
  58464. snmp_asn1_dec_oid(struct pbuf *p, u16_t ofs, u16_t len, struct snmp_obj_id *oid)
  58465. {
  58466. 8033104: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  58467. u16_t plen, base;
  58468. u8_t *msg_ptr;
  58469. s32_t *oid_ptr;
  58470. plen = 0;
  58471. 8033108: 2600 movs r6, #0
  58472. while (p != NULL)
  58473. 803310a: e08d b.n 8033228 <snmp_asn1_dec_oid+0x124>
  58474. {
  58475. base = plen;
  58476. plen += p->len;
  58477. 803310c: 8944 ldrh r4, [r0, #10]
  58478. 803310e: 1934 adds r4, r6, r4
  58479. 8033110: b2a4 uxth r4, r4
  58480. if (ofs < plen)
  58481. 8033112: 42a1 cmp r1, r4
  58482. 8033114: f080 8086 bcs.w 8033224 <snmp_asn1_dec_oid+0x120>
  58483. {
  58484. msg_ptr = (u8_t*)p->payload;
  58485. msg_ptr += ofs - base;
  58486. oid->len = 0;
  58487. 8033118: f04f 0800 mov.w r8, #0
  58488. {
  58489. base = plen;
  58490. plen += p->len;
  58491. if (ofs < plen)
  58492. {
  58493. msg_ptr = (u8_t*)p->payload;
  58494. 803311c: 6847 ldr r7, [r0, #4]
  58495. msg_ptr += ofs - base;
  58496. oid->len = 0;
  58497. 803311e: f883 8000 strb.w r8, [r3]
  58498. oid_ptr = &oid->id[0];
  58499. if (len > 0)
  58500. 8033122: b90a cbnz r2, 8033128 <snmp_asn1_dec_oid+0x24>
  58501. }
  58502. else
  58503. {
  58504. /* accepting zero length identifiers e.g. for
  58505. getnext operation. uncommon but valid */
  58506. return ERR_OK;
  58507. 8033124: 2000 movs r0, #0
  58508. 8033126: e083 b.n 8033230 <snmp_asn1_dec_oid+0x12c>
  58509. base = plen;
  58510. plen += p->len;
  58511. if (ofs < plen)
  58512. {
  58513. msg_ptr = (u8_t*)p->payload;
  58514. msg_ptr += ofs - base;
  58515. 8033128: 1b8e subs r6, r1, r6
  58516. 803312a: 19bd adds r5, r7, r6
  58517. oid->len = 0;
  58518. oid_ptr = &oid->id[0];
  58519. if (len > 0)
  58520. {
  58521. /* first compressed octet */
  58522. if (*msg_ptr == 0x2B)
  58523. 803312c: f817 c006 ldrb.w ip, [r7, r6]
  58524. 8033130: f1bc 0f2b cmp.w ip, #43 ; 0x2b
  58525. 8033134: d103 bne.n 803313e <snmp_asn1_dec_oid+0x3a>
  58526. {
  58527. /* (most) common case 1.3 (iso.org) */
  58528. *oid_ptr = 1;
  58529. 8033136: 2601 movs r6, #1
  58530. 8033138: 605e str r6, [r3, #4]
  58531. oid_ptr++;
  58532. *oid_ptr = 3;
  58533. 803313a: 2603 movs r6, #3
  58534. 803313c: e016 b.n 803316c <snmp_asn1_dec_oid+0x68>
  58535. oid_ptr++;
  58536. }
  58537. else if (*msg_ptr < 40)
  58538. 803313e: f1bc 0f27 cmp.w ip, #39 ; 0x27
  58539. 8033142: d803 bhi.n 803314c <snmp_asn1_dec_oid+0x48>
  58540. {
  58541. *oid_ptr = 0;
  58542. 8033144: f8c3 8004 str.w r8, [r3, #4]
  58543. oid_ptr++;
  58544. *oid_ptr = *msg_ptr;
  58545. 8033148: 5dbe ldrb r6, [r7, r6]
  58546. 803314a: e00f b.n 803316c <snmp_asn1_dec_oid+0x68>
  58547. oid_ptr++;
  58548. }
  58549. else if (*msg_ptr < 80)
  58550. 803314c: f1bc 0f4f cmp.w ip, #79 ; 0x4f
  58551. 8033150: d806 bhi.n 8033160 <snmp_asn1_dec_oid+0x5c>
  58552. {
  58553. *oid_ptr = 1;
  58554. 8033152: f04f 0c01 mov.w ip, #1
  58555. 8033156: f8c3 c004 str.w ip, [r3, #4]
  58556. oid_ptr++;
  58557. *oid_ptr = (*msg_ptr) - 40;
  58558. 803315a: 5dbe ldrb r6, [r7, r6]
  58559. 803315c: 3e28 subs r6, #40 ; 0x28
  58560. 803315e: e005 b.n 803316c <snmp_asn1_dec_oid+0x68>
  58561. oid_ptr++;
  58562. }
  58563. else
  58564. {
  58565. *oid_ptr = 2;
  58566. 8033160: f04f 0c02 mov.w ip, #2
  58567. 8033164: f8c3 c004 str.w ip, [r3, #4]
  58568. oid_ptr++;
  58569. *oid_ptr = (*msg_ptr) - 80;
  58570. 8033168: 5dbe ldrb r6, [r7, r6]
  58571. 803316a: 3e50 subs r6, #80 ; 0x50
  58572. {
  58573. /* accepting zero length identifiers e.g. for
  58574. getnext operation. uncommon but valid */
  58575. return ERR_OK;
  58576. }
  58577. len--;
  58578. 803316c: 3a01 subs r2, #1
  58579. *oid_ptr = 2;
  58580. oid_ptr++;
  58581. *oid_ptr = (*msg_ptr) - 80;
  58582. oid_ptr++;
  58583. }
  58584. oid->len = 2;
  58585. 803316e: 2702 movs r7, #2
  58586. {
  58587. /* accepting zero length identifiers e.g. for
  58588. getnext operation. uncommon but valid */
  58589. return ERR_OK;
  58590. }
  58591. len--;
  58592. 8033170: b292 uxth r2, r2
  58593. }
  58594. else
  58595. {
  58596. *oid_ptr = 2;
  58597. oid_ptr++;
  58598. *oid_ptr = (*msg_ptr) - 80;
  58599. 8033172: 609e str r6, [r3, #8]
  58600. oid_ptr++;
  58601. }
  58602. oid->len = 2;
  58603. 8033174: 701f strb r7, [r3, #0]
  58604. else
  58605. {
  58606. *oid_ptr = 2;
  58607. oid_ptr++;
  58608. *oid_ptr = (*msg_ptr) - 80;
  58609. oid_ptr++;
  58610. 8033176: f103 060c add.w r6, r3, #12
  58611. /* accepting zero length identifiers e.g. for
  58612. getnext operation. uncommon but valid */
  58613. return ERR_OK;
  58614. }
  58615. len--;
  58616. if (len > 0)
  58617. 803317a: 2a00 cmp r2, #0
  58618. 803317c: d04b beq.n 8033216 <snmp_asn1_dec_oid+0x112>
  58619. {
  58620. ofs += 1;
  58621. 803317e: 3101 adds r1, #1
  58622. 8033180: b289 uxth r1, r1
  58623. if (ofs >= plen)
  58624. 8033182: 42a1 cmp r1, r4
  58625. 8033184: d308 bcc.n 8033198 <snmp_asn1_dec_oid+0x94>
  58626. {
  58627. /* next octet in next pbuf */
  58628. p = p->next;
  58629. 8033186: 6800 ldr r0, [r0, #0]
  58630. if (p == NULL) { return ERR_ARG; }
  58631. 8033188: b908 cbnz r0, 803318e <snmp_asn1_dec_oid+0x8a>
  58632. 803318a: 20f2 movs r0, #242 ; 0xf2
  58633. 803318c: e050 b.n 8033230 <snmp_asn1_dec_oid+0x12c>
  58634. msg_ptr = (u8_t*)p->payload;
  58635. plen += p->len;
  58636. 803318e: 8947 ldrh r7, [r0, #10]
  58637. if (ofs >= plen)
  58638. {
  58639. /* next octet in next pbuf */
  58640. p = p->next;
  58641. if (p == NULL) { return ERR_ARG; }
  58642. msg_ptr = (u8_t*)p->payload;
  58643. 8033190: 6845 ldr r5, [r0, #4]
  58644. plen += p->len;
  58645. 8033192: 19e4 adds r4, r4, r7
  58646. 8033194: b2a4 uxth r4, r4
  58647. 8033196: e03e b.n 8033216 <snmp_asn1_dec_oid+0x112>
  58648. }
  58649. else
  58650. {
  58651. /* next octet in same pbuf */
  58652. msg_ptr++;
  58653. 8033198: 3501 adds r5, #1
  58654. 803319a: e03c b.n 8033216 <snmp_asn1_dec_oid+0x112>
  58655. }
  58656. }
  58657. while ((len > 0) && (oid->len < LWIP_SNMP_OBJ_ID_LEN))
  58658. {
  58659. /* sub-identifier uses multiple octets */
  58660. if (*msg_ptr & 0x80)
  58661. 803319c: 782f ldrb r7, [r5, #0]
  58662. 803319e: f017 0f80 tst.w r7, #128 ; 0x80
  58663. 80331a2: d023 beq.n 80331ec <snmp_asn1_dec_oid+0xe8>
  58664. 80331a4: e014 b.n 80331d0 <snmp_asn1_dec_oid+0xcc>
  58665. while ((*msg_ptr & 0x80) && (len > 1))
  58666. {
  58667. len--;
  58668. sub_id = (sub_id << 7) + (*msg_ptr & ~0x80);
  58669. ofs += 1;
  58670. 80331a6: 3101 adds r1, #1
  58671. 80331a8: b289 uxth r1, r1
  58672. {
  58673. s32_t sub_id = 0;
  58674. while ((*msg_ptr & 0x80) && (len > 1))
  58675. {
  58676. len--;
  58677. 80331aa: 3a01 subs r2, #1
  58678. sub_id = (sub_id << 7) + (*msg_ptr & ~0x80);
  58679. 80331ac: f02c 0c80 bic.w ip, ip, #128 ; 0x80
  58680. ofs += 1;
  58681. if (ofs >= plen)
  58682. 80331b0: 42a1 cmp r1, r4
  58683. {
  58684. s32_t sub_id = 0;
  58685. while ((*msg_ptr & 0x80) && (len > 1))
  58686. {
  58687. len--;
  58688. 80331b2: b292 uxth r2, r2
  58689. sub_id = (sub_id << 7) + (*msg_ptr & ~0x80);
  58690. 80331b4: eb0c 17c7 add.w r7, ip, r7, lsl #7
  58691. ofs += 1;
  58692. if (ofs >= plen)
  58693. 80331b8: d308 bcc.n 80331cc <snmp_asn1_dec_oid+0xc8>
  58694. {
  58695. /* next octet in next pbuf */
  58696. p = p->next;
  58697. 80331ba: 6800 ldr r0, [r0, #0]
  58698. if (p == NULL) { return ERR_ARG; }
  58699. 80331bc: 2800 cmp r0, #0
  58700. 80331be: d0e4 beq.n 803318a <snmp_asn1_dec_oid+0x86>
  58701. msg_ptr = (u8_t*)p->payload;
  58702. plen += p->len;
  58703. 80331c0: f8b0 c00a ldrh.w ip, [r0, #10]
  58704. if (ofs >= plen)
  58705. {
  58706. /* next octet in next pbuf */
  58707. p = p->next;
  58708. if (p == NULL) { return ERR_ARG; }
  58709. msg_ptr = (u8_t*)p->payload;
  58710. 80331c4: 6845 ldr r5, [r0, #4]
  58711. plen += p->len;
  58712. 80331c6: 4464 add r4, ip
  58713. 80331c8: b2a4 uxth r4, r4
  58714. 80331ca: e002 b.n 80331d2 <snmp_asn1_dec_oid+0xce>
  58715. }
  58716. else
  58717. {
  58718. /* next octet in same pbuf */
  58719. msg_ptr++;
  58720. 80331cc: 3501 adds r5, #1
  58721. 80331ce: e000 b.n 80331d2 <snmp_asn1_dec_oid+0xce>
  58722. }
  58723. }
  58724. while ((len > 0) && (oid->len < LWIP_SNMP_OBJ_ID_LEN))
  58725. {
  58726. /* sub-identifier uses multiple octets */
  58727. if (*msg_ptr & 0x80)
  58728. 80331d0: 2700 movs r7, #0
  58729. {
  58730. s32_t sub_id = 0;
  58731. while ((*msg_ptr & 0x80) && (len > 1))
  58732. 80331d2: f895 c000 ldrb.w ip, [r5]
  58733. 80331d6: f01c 0f80 tst.w ip, #128 ; 0x80
  58734. 80331da: d02c beq.n 8033236 <snmp_asn1_dec_oid+0x132>
  58735. 80331dc: 2a01 cmp r2, #1
  58736. 80331de: d1e2 bne.n 80331a6 <snmp_asn1_dec_oid+0xa2>
  58737. 80331e0: e009 b.n 80331f6 <snmp_asn1_dec_oid+0xf2>
  58738. }
  58739. }
  58740. if (!(*msg_ptr & 0x80) && (len > 0))
  58741. {
  58742. /* last octet sub-identifier */
  58743. len--;
  58744. 80331e2: 3a01 subs r2, #1
  58745. 80331e4: b292 uxth r2, r2
  58746. sub_id = (sub_id << 7) + *msg_ptr;
  58747. 80331e6: eb0c 17c7 add.w r7, ip, r7, lsl #7
  58748. 80331ea: e001 b.n 80331f0 <snmp_asn1_dec_oid+0xec>
  58749. }
  58750. }
  58751. else
  58752. {
  58753. /* !(*msg_ptr & 0x80) sub-identifier uses single octet */
  58754. len--;
  58755. 80331ec: 3a01 subs r2, #1
  58756. 80331ee: b292 uxth r2, r2
  58757. *oid_ptr = *msg_ptr;
  58758. 80331f0: f846 7c04 str.w r7, [r6, #-4]
  58759. }
  58760. if (len > 0)
  58761. 80331f4: b162 cbz r2, 8033210 <snmp_asn1_dec_oid+0x10c>
  58762. {
  58763. /* remaining oid bytes available ... */
  58764. ofs += 1;
  58765. 80331f6: 3101 adds r1, #1
  58766. 80331f8: b289 uxth r1, r1
  58767. if (ofs >= plen)
  58768. 80331fa: 42a1 cmp r1, r4
  58769. 80331fc: d307 bcc.n 803320e <snmp_asn1_dec_oid+0x10a>
  58770. {
  58771. /* next octet in next pbuf */
  58772. p = p->next;
  58773. 80331fe: 6800 ldr r0, [r0, #0]
  58774. if (p == NULL) { return ERR_ARG; }
  58775. 8033200: 2800 cmp r0, #0
  58776. 8033202: d0c2 beq.n 803318a <snmp_asn1_dec_oid+0x86>
  58777. msg_ptr = (u8_t*)p->payload;
  58778. plen += p->len;
  58779. 8033204: 8947 ldrh r7, [r0, #10]
  58780. if (ofs >= plen)
  58781. {
  58782. /* next octet in next pbuf */
  58783. p = p->next;
  58784. if (p == NULL) { return ERR_ARG; }
  58785. msg_ptr = (u8_t*)p->payload;
  58786. 8033206: 6845 ldr r5, [r0, #4]
  58787. plen += p->len;
  58788. 8033208: 19e4 adds r4, r4, r7
  58789. 803320a: b2a4 uxth r4, r4
  58790. 803320c: e000 b.n 8033210 <snmp_asn1_dec_oid+0x10c>
  58791. }
  58792. else
  58793. {
  58794. /* next octet in same pbuf */
  58795. msg_ptr++;
  58796. 803320e: 3501 adds r5, #1
  58797. }
  58798. }
  58799. oid_ptr++;
  58800. oid->len++;
  58801. 8033210: 781f ldrb r7, [r3, #0]
  58802. 8033212: 3701 adds r7, #1
  58803. 8033214: 701f strb r7, [r3, #0]
  58804. 8033216: 3604 adds r6, #4
  58805. {
  58806. /* next octet in same pbuf */
  58807. msg_ptr++;
  58808. }
  58809. }
  58810. while ((len > 0) && (oid->len < LWIP_SNMP_OBJ_ID_LEN))
  58811. 8033218: 2a00 cmp r2, #0
  58812. 803321a: d083 beq.n 8033124 <snmp_asn1_dec_oid+0x20>
  58813. 803321c: 781f ldrb r7, [r3, #0]
  58814. 803321e: 2f1f cmp r7, #31
  58815. 8033220: d9bc bls.n 803319c <snmp_asn1_dec_oid+0x98>
  58816. 8033222: e7b2 b.n 803318a <snmp_asn1_dec_oid+0x86>
  58817. /* len > 0, oid->len == LWIP_SNMP_OBJ_ID_LEN or malformed encoding */
  58818. return ERR_ARG;
  58819. }
  58820. }
  58821. p = p->next;
  58822. 8033224: 6800 ldr r0, [r0, #0]
  58823. plen = 0;
  58824. while (p != NULL)
  58825. {
  58826. base = plen;
  58827. plen += p->len;
  58828. 8033226: 4626 mov r6, r4
  58829. u16_t plen, base;
  58830. u8_t *msg_ptr;
  58831. s32_t *oid_ptr;
  58832. plen = 0;
  58833. while (p != NULL)
  58834. 8033228: 2800 cmp r0, #0
  58835. 803322a: f47f af6f bne.w 803310c <snmp_asn1_dec_oid+0x8>
  58836. 803322e: e7ac b.n 803318a <snmp_asn1_dec_oid+0x86>
  58837. 8033230: b240 sxtb r0, r0
  58838. 8033232: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  58839. {
  58840. /* next octet in same pbuf */
  58841. msg_ptr++;
  58842. }
  58843. }
  58844. if (!(*msg_ptr & 0x80) && (len > 0))
  58845. 8033236: 2a00 cmp r2, #0
  58846. 8033238: d1d3 bne.n 80331e2 <snmp_asn1_dec_oid+0xde>
  58847. 803323a: e7e9 b.n 8033210 <snmp_asn1_dec_oid+0x10c>
  58848. 0803323c <snmp_asn1_dec_raw>:
  58849. * @param raw return raw bytes
  58850. * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) decode
  58851. */
  58852. err_t
  58853. snmp_asn1_dec_raw(struct pbuf *p, u16_t ofs, u16_t len, u16_t raw_len, u8_t *raw)
  58854. {
  58855. 803323c: b5f0 push {r4, r5, r6, r7, lr}
  58856. u16_t plen, base;
  58857. u8_t *msg_ptr;
  58858. if (len > 0)
  58859. 803323e: 2a00 cmp r2, #0
  58860. 8033240: d12d bne.n 803329e <snmp_asn1_dec_raw+0x62>
  58861. 8033242: e027 b.n 8033294 <snmp_asn1_dec_raw+0x58>
  58862. {
  58863. plen = 0;
  58864. while (p != NULL)
  58865. {
  58866. base = plen;
  58867. plen += p->len;
  58868. 8033244: 8944 ldrh r4, [r0, #10]
  58869. 8033246: 1934 adds r4, r6, r4
  58870. 8033248: b2a4 uxth r4, r4
  58871. if (ofs < plen)
  58872. 803324a: 42a1 cmp r1, r4
  58873. 803324c: d224 bcs.n 8033298 <snmp_asn1_dec_raw+0x5c>
  58874. {
  58875. msg_ptr = (u8_t*)p->payload;
  58876. 803324e: 6847 ldr r7, [r0, #4]
  58877. msg_ptr += ofs - base;
  58878. 8033250: 1b8d subs r5, r1, r6
  58879. if (raw_len >= len)
  58880. 8033252: 4293 cmp r3, r2
  58881. base = plen;
  58882. plen += p->len;
  58883. if (ofs < plen)
  58884. {
  58885. msg_ptr = (u8_t*)p->payload;
  58886. msg_ptr += ofs - base;
  58887. 8033254: 443d add r5, r7
  58888. if (raw_len >= len)
  58889. 8033256: d305 bcc.n 8033264 <snmp_asn1_dec_raw+0x28>
  58890. 8033258: 9b05 ldr r3, [sp, #20]
  58891. * @param raw_len length of the raw return value
  58892. * @param raw return raw bytes
  58893. * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) decode
  58894. */
  58895. err_t
  58896. snmp_asn1_dec_raw(struct pbuf *p, u16_t ofs, u16_t len, u16_t raw_len, u8_t *raw)
  58897. 803325a: b29e uxth r6, r3
  58898. 803325c: 18b2 adds r2, r6, r2
  58899. 803325e: b292 uxth r2, r2
  58900. 8033260: 1b89 subs r1, r1, r6
  58901. 8033262: e011 b.n 8033288 <snmp_asn1_dec_raw+0x4c>
  58902. return ERR_OK;
  58903. }
  58904. else
  58905. {
  58906. /* raw_len < len, not enough dst space */
  58907. return ERR_ARG;
  58908. 8033264: 20f2 movs r0, #242 ; 0xf2
  58909. 8033266: e01e b.n 80332a6 <snmp_asn1_dec_raw+0x6a>
  58910. {
  58911. while (len > 1)
  58912. {
  58913. /* copy len - 1 octets */
  58914. len--;
  58915. *raw = *msg_ptr;
  58916. 8033268: 782e ldrb r6, [r5, #0]
  58917. 803326a: f803 6b01 strb.w r6, [r3], #1
  58918. * @param raw_len length of the raw return value
  58919. * @param raw return raw bytes
  58920. * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) decode
  58921. */
  58922. err_t
  58923. snmp_asn1_dec_raw(struct pbuf *p, u16_t ofs, u16_t len, u16_t raw_len, u8_t *raw)
  58924. 803326e: 18ce adds r6, r1, r3
  58925. /* copy len - 1 octets */
  58926. len--;
  58927. *raw = *msg_ptr;
  58928. raw++;
  58929. ofs += 1;
  58930. if (ofs >= plen)
  58931. 8033270: b2b6 uxth r6, r6
  58932. 8033272: 42a6 cmp r6, r4
  58933. 8033274: d307 bcc.n 8033286 <snmp_asn1_dec_raw+0x4a>
  58934. {
  58935. /* next octet in next pbuf */
  58936. p = p->next;
  58937. 8033276: 6800 ldr r0, [r0, #0]
  58938. if (p == NULL) { return ERR_ARG; }
  58939. 8033278: 2800 cmp r0, #0
  58940. 803327a: d0f3 beq.n 8033264 <snmp_asn1_dec_raw+0x28>
  58941. msg_ptr = (u8_t*)p->payload;
  58942. plen += p->len;
  58943. 803327c: 8946 ldrh r6, [r0, #10]
  58944. if (ofs >= plen)
  58945. {
  58946. /* next octet in next pbuf */
  58947. p = p->next;
  58948. if (p == NULL) { return ERR_ARG; }
  58949. msg_ptr = (u8_t*)p->payload;
  58950. 803327e: 6845 ldr r5, [r0, #4]
  58951. plen += p->len;
  58952. 8033280: 19a4 adds r4, r4, r6
  58953. 8033282: b2a4 uxth r4, r4
  58954. 8033284: e000 b.n 8033288 <snmp_asn1_dec_raw+0x4c>
  58955. }
  58956. else
  58957. {
  58958. /* next octet in same pbuf */
  58959. msg_ptr++;
  58960. 8033286: 3501 adds r5, #1
  58961. {
  58962. msg_ptr = (u8_t*)p->payload;
  58963. msg_ptr += ofs - base;
  58964. if (raw_len >= len)
  58965. {
  58966. while (len > 1)
  58967. 8033288: 1ad7 subs r7, r2, r3
  58968. 803328a: b2bf uxth r7, r7
  58969. 803328c: 2f01 cmp r7, #1
  58970. 803328e: d8eb bhi.n 8033268 <snmp_asn1_dec_raw+0x2c>
  58971. /* next octet in same pbuf */
  58972. msg_ptr++;
  58973. }
  58974. }
  58975. /* copy last octet */
  58976. *raw = *msg_ptr;
  58977. 8033290: 782a ldrb r2, [r5, #0]
  58978. 8033292: 701a strb r2, [r3, #0]
  58979. return ERR_OK;
  58980. 8033294: 2000 movs r0, #0
  58981. 8033296: e006 b.n 80332a6 <snmp_asn1_dec_raw+0x6a>
  58982. {
  58983. /* raw_len < len, not enough dst space */
  58984. return ERR_ARG;
  58985. }
  58986. }
  58987. p = p->next;
  58988. 8033298: 6800 ldr r0, [r0, #0]
  58989. {
  58990. plen = 0;
  58991. while (p != NULL)
  58992. {
  58993. base = plen;
  58994. plen += p->len;
  58995. 803329a: 4626 mov r6, r4
  58996. 803329c: e000 b.n 80332a0 <snmp_asn1_dec_raw+0x64>
  58997. snmp_asn1_dec_raw(struct pbuf *p, u16_t ofs, u16_t len, u16_t raw_len, u8_t *raw)
  58998. {
  58999. u16_t plen, base;
  59000. u8_t *msg_ptr;
  59001. if (len > 0)
  59002. 803329e: 2600 movs r6, #0
  59003. {
  59004. plen = 0;
  59005. while (p != NULL)
  59006. 80332a0: 2800 cmp r0, #0
  59007. 80332a2: d1cf bne.n 8033244 <snmp_asn1_dec_raw+0x8>
  59008. 80332a4: e7de b.n 8033264 <snmp_asn1_dec_raw+0x28>
  59009. else
  59010. {
  59011. /* len == 0, empty string */
  59012. return ERR_OK;
  59013. }
  59014. }
  59015. 80332a6: b240 sxtb r0, r0
  59016. 80332a8: bdf0 pop {r4, r5, r6, r7, pc}
  59017. 080332aa <snmp_asn1_enc_length_cnt>:
  59018. * @param octets_needed points to the return value
  59019. */
  59020. void
  59021. snmp_asn1_enc_length_cnt(u16_t length, u8_t *octets_needed)
  59022. {
  59023. if (length < 0x80U)
  59024. 80332aa: 287f cmp r0, #127 ; 0x7f
  59025. 80332ac: d801 bhi.n 80332b2 <snmp_asn1_enc_length_cnt+0x8>
  59026. {
  59027. *octets_needed = 1;
  59028. 80332ae: 2301 movs r3, #1
  59029. 80332b0: e004 b.n 80332bc <snmp_asn1_enc_length_cnt+0x12>
  59030. }
  59031. else if (length < 0x100U)
  59032. 80332b2: 28ff cmp r0, #255 ; 0xff
  59033. 80332b4: d801 bhi.n 80332ba <snmp_asn1_enc_length_cnt+0x10>
  59034. {
  59035. *octets_needed = 2;
  59036. 80332b6: 2302 movs r3, #2
  59037. 80332b8: e000 b.n 80332bc <snmp_asn1_enc_length_cnt+0x12>
  59038. }
  59039. else
  59040. {
  59041. *octets_needed = 3;
  59042. 80332ba: 2303 movs r3, #3
  59043. 80332bc: 700b strb r3, [r1, #0]
  59044. 80332be: 4770 bx lr
  59045. 080332c0 <snmp_asn1_enc_u32t_cnt>:
  59046. * of 0xFFFFFFFF is preceded with 0x00 and the length is 5 octets!!
  59047. */
  59048. void
  59049. snmp_asn1_enc_u32t_cnt(u32_t value, u16_t *octets_needed)
  59050. {
  59051. if (value < 0x80UL)
  59052. 80332c0: 287f cmp r0, #127 ; 0x7f
  59053. 80332c2: d801 bhi.n 80332c8 <snmp_asn1_enc_u32t_cnt+0x8>
  59054. {
  59055. *octets_needed = 1;
  59056. 80332c4: 2301 movs r3, #1
  59057. 80332c6: e00e b.n 80332e6 <snmp_asn1_enc_u32t_cnt+0x26>
  59058. }
  59059. else if (value < 0x8000UL)
  59060. 80332c8: f5b0 4f00 cmp.w r0, #32768 ; 0x8000
  59061. 80332cc: d201 bcs.n 80332d2 <snmp_asn1_enc_u32t_cnt+0x12>
  59062. {
  59063. *octets_needed = 2;
  59064. 80332ce: 2302 movs r3, #2
  59065. 80332d0: e009 b.n 80332e6 <snmp_asn1_enc_u32t_cnt+0x26>
  59066. }
  59067. else if (value < 0x800000UL)
  59068. 80332d2: f5b0 0f00 cmp.w r0, #8388608 ; 0x800000
  59069. 80332d6: d201 bcs.n 80332dc <snmp_asn1_enc_u32t_cnt+0x1c>
  59070. {
  59071. *octets_needed = 3;
  59072. 80332d8: 2303 movs r3, #3
  59073. 80332da: e004 b.n 80332e6 <snmp_asn1_enc_u32t_cnt+0x26>
  59074. }
  59075. else if (value < 0x80000000UL)
  59076. 80332dc: 2800 cmp r0, #0
  59077. 80332de: db01 blt.n 80332e4 <snmp_asn1_enc_u32t_cnt+0x24>
  59078. {
  59079. *octets_needed = 4;
  59080. 80332e0: 2304 movs r3, #4
  59081. 80332e2: e000 b.n 80332e6 <snmp_asn1_enc_u32t_cnt+0x26>
  59082. }
  59083. else
  59084. {
  59085. *octets_needed = 5;
  59086. 80332e4: 2305 movs r3, #5
  59087. 80332e6: 800b strh r3, [r1, #0]
  59088. 80332e8: 4770 bx lr
  59089. 080332ea <snmp_asn1_enc_s32t_cnt>:
  59090. void
  59091. snmp_asn1_enc_s32t_cnt(s32_t value, u16_t *octets_needed)
  59092. {
  59093. if (value < 0)
  59094. {
  59095. value = ~value;
  59096. 80332ea: 43c3 mvns r3, r0
  59097. 80332ec: 4283 cmp r3, r0
  59098. 80332ee: bfa8 it ge
  59099. 80332f0: 4618 movge r0, r3
  59100. }
  59101. if (value < 0x80L)
  59102. 80332f2: 287f cmp r0, #127 ; 0x7f
  59103. 80332f4: dc01 bgt.n 80332fa <snmp_asn1_enc_s32t_cnt+0x10>
  59104. {
  59105. *octets_needed = 1;
  59106. 80332f6: 2301 movs r3, #1
  59107. 80332f8: e00a b.n 8033310 <snmp_asn1_enc_s32t_cnt+0x26>
  59108. }
  59109. else if (value < 0x8000L)
  59110. 80332fa: f5b0 4f00 cmp.w r0, #32768 ; 0x8000
  59111. 80332fe: da01 bge.n 8033304 <snmp_asn1_enc_s32t_cnt+0x1a>
  59112. {
  59113. *octets_needed = 2;
  59114. 8033300: 2302 movs r3, #2
  59115. 8033302: e005 b.n 8033310 <snmp_asn1_enc_s32t_cnt+0x26>
  59116. }
  59117. else if (value < 0x800000L)
  59118. 8033304: f5b0 0f00 cmp.w r0, #8388608 ; 0x800000
  59119. 8033308: da01 bge.n 803330e <snmp_asn1_enc_s32t_cnt+0x24>
  59120. {
  59121. *octets_needed = 3;
  59122. 803330a: 2303 movs r3, #3
  59123. 803330c: e000 b.n 8033310 <snmp_asn1_enc_s32t_cnt+0x26>
  59124. }
  59125. else
  59126. {
  59127. *octets_needed = 4;
  59128. 803330e: 2304 movs r3, #4
  59129. 8033310: 800b strh r3, [r1, #0]
  59130. 8033312: 4770 bx lr
  59131. 08033314 <snmp_asn1_enc_oid_cnt>:
  59132. {
  59133. s32_t sub_id;
  59134. u8_t cnt;
  59135. cnt = 0;
  59136. if (ident_len > 1)
  59137. 8033314: 2801 cmp r0, #1
  59138. * @param ident points to object identifier array
  59139. * @param octets_needed points to the return value
  59140. */
  59141. void
  59142. snmp_asn1_enc_oid_cnt(u8_t ident_len, s32_t *ident, u16_t *octets_needed)
  59143. {
  59144. 8033316: b510 push {r4, lr}
  59145. s32_t sub_id;
  59146. u8_t cnt;
  59147. cnt = 0;
  59148. if (ident_len > 1)
  59149. 8033318: d904 bls.n 8033324 <snmp_asn1_enc_oid_cnt+0x10>
  59150. {
  59151. /* compressed prefix in one octet */
  59152. cnt++;
  59153. ident_len -= 2;
  59154. 803331a: 3802 subs r0, #2
  59155. 803331c: b2c0 uxtb r0, r0
  59156. ident += 2;
  59157. 803331e: 3108 adds r1, #8
  59158. cnt = 0;
  59159. if (ident_len > 1)
  59160. {
  59161. /* compressed prefix in one octet */
  59162. cnt++;
  59163. 8033320: 2301 movs r3, #1
  59164. 8033322: e000 b.n 8033326 <snmp_asn1_enc_oid_cnt+0x12>
  59165. snmp_asn1_enc_oid_cnt(u8_t ident_len, s32_t *ident, u16_t *octets_needed)
  59166. {
  59167. s32_t sub_id;
  59168. u8_t cnt;
  59169. cnt = 0;
  59170. 8033324: 2300 movs r3, #0
  59171. * @param ident_len object identifier array length
  59172. * @param ident points to object identifier array
  59173. * @param octets_needed points to the return value
  59174. */
  59175. void
  59176. snmp_asn1_enc_oid_cnt(u8_t ident_len, s32_t *ident, u16_t *octets_needed)
  59177. 8033326: 3904 subs r1, #4
  59178. 8033328: e008 b.n 803333c <snmp_asn1_enc_oid_cnt+0x28>
  59179. ident_len -= 2;
  59180. ident += 2;
  59181. }
  59182. while(ident_len > 0)
  59183. {
  59184. ident_len--;
  59185. 803332a: 3801 subs r0, #1
  59186. sub_id = *ident;
  59187. 803332c: f851 4f04 ldr.w r4, [r1, #4]!
  59188. ident_len -= 2;
  59189. ident += 2;
  59190. }
  59191. while(ident_len > 0)
  59192. {
  59193. ident_len--;
  59194. 8033330: b2c0 uxtb r0, r0
  59195. sub_id >>= 7;
  59196. cnt++;
  59197. while(sub_id > 0)
  59198. {
  59199. sub_id >>= 7;
  59200. 8033332: 11e4 asrs r4, r4, #7
  59201. cnt++;
  59202. 8033334: 3301 adds r3, #1
  59203. ident_len--;
  59204. sub_id = *ident;
  59205. sub_id >>= 7;
  59206. cnt++;
  59207. while(sub_id > 0)
  59208. 8033336: 2c00 cmp r4, #0
  59209. {
  59210. sub_id >>= 7;
  59211. cnt++;
  59212. 8033338: b2db uxtb r3, r3
  59213. ident_len--;
  59214. sub_id = *ident;
  59215. sub_id >>= 7;
  59216. cnt++;
  59217. while(sub_id > 0)
  59218. 803333a: dcfa bgt.n 8033332 <snmp_asn1_enc_oid_cnt+0x1e>
  59219. /* compressed prefix in one octet */
  59220. cnt++;
  59221. ident_len -= 2;
  59222. ident += 2;
  59223. }
  59224. while(ident_len > 0)
  59225. 803333c: 2800 cmp r0, #0
  59226. 803333e: d1f4 bne.n 803332a <snmp_asn1_enc_oid_cnt+0x16>
  59227. sub_id >>= 7;
  59228. cnt++;
  59229. }
  59230. ident++;
  59231. }
  59232. *octets_needed = cnt;
  59233. 8033340: 8013 strh r3, [r2, #0]
  59234. 8033342: bd10 pop {r4, pc}
  59235. 08033344 <snmp_asn1_enc_type>:
  59236. * @param type input ASN1 type
  59237. * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) encode
  59238. */
  59239. err_t
  59240. snmp_asn1_enc_type(struct pbuf *p, u16_t ofs, u8_t type)
  59241. {
  59242. 8033344: b510 push {r4, lr}
  59243. u16_t plen, base;
  59244. u8_t *msg_ptr;
  59245. plen = 0;
  59246. 8033346: 2300 movs r3, #0
  59247. while (p != NULL)
  59248. 8033348: e00b b.n 8033362 <snmp_asn1_enc_type+0x1e>
  59249. {
  59250. base = plen;
  59251. plen += p->len;
  59252. 803334a: 8944 ldrh r4, [r0, #10]
  59253. 803334c: 191c adds r4, r3, r4
  59254. 803334e: b2a4 uxth r4, r4
  59255. if (ofs < plen)
  59256. 8033350: 42a1 cmp r1, r4
  59257. 8033352: d204 bcs.n 803335e <snmp_asn1_enc_type+0x1a>
  59258. {
  59259. msg_ptr = (u8_t*)p->payload;
  59260. 8033354: 6840 ldr r0, [r0, #4]
  59261. msg_ptr += ofs - base;
  59262. 8033356: 1acb subs r3, r1, r3
  59263. *msg_ptr = type;
  59264. 8033358: 54c2 strb r2, [r0, r3]
  59265. return ERR_OK;
  59266. 803335a: 2000 movs r0, #0
  59267. 803335c: e004 b.n 8033368 <snmp_asn1_enc_type+0x24>
  59268. }
  59269. p = p->next;
  59270. 803335e: 6800 ldr r0, [r0, #0]
  59271. plen = 0;
  59272. while (p != NULL)
  59273. {
  59274. base = plen;
  59275. plen += p->len;
  59276. 8033360: 4623 mov r3, r4
  59277. {
  59278. u16_t plen, base;
  59279. u8_t *msg_ptr;
  59280. plen = 0;
  59281. while (p != NULL)
  59282. 8033362: 2800 cmp r0, #0
  59283. 8033364: d1f1 bne.n 803334a <snmp_asn1_enc_type+0x6>
  59284. return ERR_OK;
  59285. }
  59286. p = p->next;
  59287. }
  59288. /* p == NULL, ofs >= plen */
  59289. return ERR_ARG;
  59290. 8033366: 20f2 movs r0, #242 ; 0xf2
  59291. }
  59292. 8033368: b240 sxtb r0, r0
  59293. 803336a: bd10 pop {r4, pc}
  59294. 0803336c <snmp_asn1_enc_length>:
  59295. * @param length is the host order length to be encoded
  59296. * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) encode
  59297. */
  59298. err_t
  59299. snmp_asn1_enc_length(struct pbuf *p, u16_t ofs, u16_t length)
  59300. {
  59301. 803336c: b5f0 push {r4, r5, r6, r7, lr}
  59302. u16_t plen, base;
  59303. u8_t *msg_ptr;
  59304. plen = 0;
  59305. 803336e: 2400 movs r4, #0
  59306. while (p != NULL)
  59307. 8033370: e03f b.n 80333f2 <snmp_asn1_enc_length+0x86>
  59308. {
  59309. base = plen;
  59310. plen += p->len;
  59311. 8033372: 8943 ldrh r3, [r0, #10]
  59312. 8033374: 18e3 adds r3, r4, r3
  59313. 8033376: b29b uxth r3, r3
  59314. if (ofs < plen)
  59315. 8033378: 4299 cmp r1, r3
  59316. 803337a: d238 bcs.n 80333ee <snmp_asn1_enc_length+0x82>
  59317. {
  59318. msg_ptr = (u8_t*)p->payload;
  59319. 803337c: 6845 ldr r5, [r0, #4]
  59320. msg_ptr += ofs - base;
  59321. 803337e: 1b0c subs r4, r1, r4
  59322. if (length < 0x80)
  59323. 8033380: 2a7f cmp r2, #127 ; 0x7f
  59324. base = plen;
  59325. plen += p->len;
  59326. if (ofs < plen)
  59327. {
  59328. msg_ptr = (u8_t*)p->payload;
  59329. msg_ptr += ofs - base;
  59330. 8033382: eb05 0604 add.w r6, r5, r4
  59331. if (length < 0x80)
  59332. 8033386: d801 bhi.n 803338c <snmp_asn1_enc_length+0x20>
  59333. {
  59334. *msg_ptr = (u8_t)length;
  59335. 8033388: 552a strb r2, [r5, r4]
  59336. 803338a: e02e b.n 80333ea <snmp_asn1_enc_length+0x7e>
  59337. return ERR_OK;
  59338. }
  59339. else if (length < 0x100)
  59340. 803338c: 2aff cmp r2, #255 ; 0xff
  59341. 803338e: f101 0701 add.w r7, r1, #1
  59342. 8033392: d80d bhi.n 80333b0 <snmp_asn1_enc_length+0x44>
  59343. {
  59344. *msg_ptr = 0x81;
  59345. ofs += 1;
  59346. if (ofs >= plen)
  59347. 8033394: b2bf uxth r7, r7
  59348. *msg_ptr = (u8_t)length;
  59349. return ERR_OK;
  59350. }
  59351. else if (length < 0x100)
  59352. {
  59353. *msg_ptr = 0x81;
  59354. 8033396: 2181 movs r1, #129 ; 0x81
  59355. ofs += 1;
  59356. if (ofs >= plen)
  59357. 8033398: 429f cmp r7, r3
  59358. *msg_ptr = (u8_t)length;
  59359. return ERR_OK;
  59360. }
  59361. else if (length < 0x100)
  59362. {
  59363. *msg_ptr = 0x81;
  59364. 803339a: 5529 strb r1, [r5, r4]
  59365. ofs += 1;
  59366. if (ofs >= plen)
  59367. 803339c: d305 bcc.n 80333aa <snmp_asn1_enc_length+0x3e>
  59368. {
  59369. /* next octet in next pbuf */
  59370. p = p->next;
  59371. 803339e: 6803 ldr r3, [r0, #0]
  59372. if (p == NULL) { return ERR_ARG; }
  59373. 80333a0: b90b cbnz r3, 80333a6 <snmp_asn1_enc_length+0x3a>
  59374. 80333a2: 20f2 movs r0, #242 ; 0xf2
  59375. 80333a4: e028 b.n 80333f8 <snmp_asn1_enc_length+0x8c>
  59376. msg_ptr = (u8_t*)p->payload;
  59377. 80333a6: 685e ldr r6, [r3, #4]
  59378. 80333a8: e000 b.n 80333ac <snmp_asn1_enc_length+0x40>
  59379. }
  59380. else
  59381. {
  59382. /* next octet in same pbuf */
  59383. msg_ptr++;
  59384. 80333aa: 3601 adds r6, #1
  59385. }
  59386. *msg_ptr = (u8_t)length;
  59387. 80333ac: 7032 strb r2, [r6, #0]
  59388. 80333ae: e01c b.n 80333ea <snmp_asn1_enc_length+0x7e>
  59389. i = 2;
  59390. while (i > 0)
  59391. {
  59392. i--;
  59393. ofs += 1;
  59394. if (ofs >= plen)
  59395. 80333b0: b2bf uxth r7, r7
  59396. else
  59397. {
  59398. u8_t i;
  59399. /* length >= 0x100 && length <= 0xFFFF */
  59400. *msg_ptr = 0x82;
  59401. 80333b2: f04f 0c82 mov.w ip, #130 ; 0x82
  59402. i = 2;
  59403. while (i > 0)
  59404. {
  59405. i--;
  59406. ofs += 1;
  59407. if (ofs >= plen)
  59408. 80333b6: 429f cmp r7, r3
  59409. else
  59410. {
  59411. u8_t i;
  59412. /* length >= 0x100 && length <= 0xFFFF */
  59413. *msg_ptr = 0x82;
  59414. 80333b8: f805 c004 strb.w ip, [r5, r4]
  59415. i = 2;
  59416. while (i > 0)
  59417. {
  59418. i--;
  59419. ofs += 1;
  59420. if (ofs >= plen)
  59421. 80333bc: d201 bcs.n 80333c2 <snmp_asn1_enc_length+0x56>
  59422. plen += p->len;
  59423. }
  59424. else
  59425. {
  59426. /* next octet in same pbuf */
  59427. msg_ptr++;
  59428. 80333be: 1c74 adds r4, r6, #1
  59429. 80333c0: e006 b.n 80333d0 <snmp_asn1_enc_length+0x64>
  59430. i--;
  59431. ofs += 1;
  59432. if (ofs >= plen)
  59433. {
  59434. /* next octet in next pbuf */
  59435. p = p->next;
  59436. 80333c2: 6800 ldr r0, [r0, #0]
  59437. if (p == NULL) { return ERR_ARG; }
  59438. 80333c4: 2800 cmp r0, #0
  59439. 80333c6: d0ec beq.n 80333a2 <snmp_asn1_enc_length+0x36>
  59440. msg_ptr = (u8_t*)p->payload;
  59441. plen += p->len;
  59442. 80333c8: 8945 ldrh r5, [r0, #10]
  59443. if (ofs >= plen)
  59444. {
  59445. /* next octet in next pbuf */
  59446. p = p->next;
  59447. if (p == NULL) { return ERR_ARG; }
  59448. msg_ptr = (u8_t*)p->payload;
  59449. 80333ca: 6844 ldr r4, [r0, #4]
  59450. plen += p->len;
  59451. 80333cc: 195b adds r3, r3, r5
  59452. 80333ce: b29b uxth r3, r3
  59453. *msg_ptr = 0x82;
  59454. i = 2;
  59455. while (i > 0)
  59456. {
  59457. i--;
  59458. ofs += 1;
  59459. 80333d0: 3102 adds r1, #2
  59460. if (ofs >= plen)
  59461. 80333d2: b289 uxth r1, r1
  59462. *msg_ptr = (u8_t)length;
  59463. }
  59464. else
  59465. {
  59466. /* most significant length octet */
  59467. *msg_ptr = (u8_t)(length >> 8);
  59468. 80333d4: 0a15 lsrs r5, r2, #8
  59469. i = 2;
  59470. while (i > 0)
  59471. {
  59472. i--;
  59473. ofs += 1;
  59474. if (ofs >= plen)
  59475. 80333d6: 4299 cmp r1, r3
  59476. *msg_ptr = (u8_t)length;
  59477. }
  59478. else
  59479. {
  59480. /* most significant length octet */
  59481. *msg_ptr = (u8_t)(length >> 8);
  59482. 80333d8: 7025 strb r5, [r4, #0]
  59483. i = 2;
  59484. while (i > 0)
  59485. {
  59486. i--;
  59487. ofs += 1;
  59488. if (ofs >= plen)
  59489. 80333da: d201 bcs.n 80333e0 <snmp_asn1_enc_length+0x74>
  59490. plen += p->len;
  59491. }
  59492. else
  59493. {
  59494. /* next octet in same pbuf */
  59495. msg_ptr++;
  59496. 80333dc: 3401 adds r4, #1
  59497. 80333de: e003 b.n 80333e8 <snmp_asn1_enc_length+0x7c>
  59498. i--;
  59499. ofs += 1;
  59500. if (ofs >= plen)
  59501. {
  59502. /* next octet in next pbuf */
  59503. p = p->next;
  59504. 80333e0: 6803 ldr r3, [r0, #0]
  59505. if (p == NULL) { return ERR_ARG; }
  59506. 80333e2: 2b00 cmp r3, #0
  59507. 80333e4: d0dd beq.n 80333a2 <snmp_asn1_enc_length+0x36>
  59508. msg_ptr = (u8_t*)p->payload;
  59509. 80333e6: 685c ldr r4, [r3, #4]
  59510. msg_ptr++;
  59511. }
  59512. if (i == 0)
  59513. {
  59514. /* least significant length octet */
  59515. *msg_ptr = (u8_t)length;
  59516. 80333e8: 7022 strb r2, [r4, #0]
  59517. {
  59518. /* most significant length octet */
  59519. *msg_ptr = (u8_t)(length >> 8);
  59520. }
  59521. }
  59522. return ERR_OK;
  59523. 80333ea: 2000 movs r0, #0
  59524. 80333ec: e004 b.n 80333f8 <snmp_asn1_enc_length+0x8c>
  59525. }
  59526. }
  59527. p = p->next;
  59528. 80333ee: 6800 ldr r0, [r0, #0]
  59529. plen = 0;
  59530. while (p != NULL)
  59531. {
  59532. base = plen;
  59533. plen += p->len;
  59534. 80333f0: 461c mov r4, r3
  59535. {
  59536. u16_t plen, base;
  59537. u8_t *msg_ptr;
  59538. plen = 0;
  59539. while (p != NULL)
  59540. 80333f2: 2800 cmp r0, #0
  59541. 80333f4: d1bd bne.n 8033372 <snmp_asn1_enc_length+0x6>
  59542. 80333f6: e7d4 b.n 80333a2 <snmp_asn1_enc_length+0x36>
  59543. }
  59544. p = p->next;
  59545. }
  59546. /* p == NULL, ofs >= plen */
  59547. return ERR_ARG;
  59548. }
  59549. 80333f8: b240 sxtb r0, r0
  59550. 80333fa: bdf0 pop {r4, r5, r6, r7, pc}
  59551. 080333fc <snmp_asn1_enc_u32t>:
  59552. *
  59553. * @see snmp_asn1_enc_u32t_cnt()
  59554. */
  59555. err_t
  59556. snmp_asn1_enc_u32t(struct pbuf *p, u16_t ofs, u16_t octets_needed, u32_t value)
  59557. {
  59558. 80333fc: b5f0 push {r4, r5, r6, r7, lr}
  59559. u16_t plen, base;
  59560. u8_t *msg_ptr;
  59561. plen = 0;
  59562. 80333fe: 2500 movs r5, #0
  59563. while (p != NULL)
  59564. 8033400: e037 b.n 8033472 <snmp_asn1_enc_u32t+0x76>
  59565. {
  59566. base = plen;
  59567. plen += p->len;
  59568. 8033402: 8944 ldrh r4, [r0, #10]
  59569. 8033404: 192c adds r4, r5, r4
  59570. 8033406: b2a4 uxth r4, r4
  59571. if (ofs < plen)
  59572. 8033408: 42a1 cmp r1, r4
  59573. 803340a: d230 bcs.n 803346e <snmp_asn1_enc_u32t+0x72>
  59574. {
  59575. msg_ptr = (u8_t*)p->payload;
  59576. 803340c: 6847 ldr r7, [r0, #4]
  59577. msg_ptr += ofs - base;
  59578. 803340e: 1b4e subs r6, r1, r5
  59579. if (octets_needed == 5)
  59580. 8033410: 2a05 cmp r2, #5
  59581. base = plen;
  59582. plen += p->len;
  59583. if (ofs < plen)
  59584. {
  59585. msg_ptr = (u8_t*)p->payload;
  59586. msg_ptr += ofs - base;
  59587. 8033412: eb07 0506 add.w r5, r7, r6
  59588. if (octets_needed == 5)
  59589. 8033416: d110 bne.n 803343a <snmp_asn1_enc_u32t+0x3e>
  59590. {
  59591. /* not enough bits in 'value' add leading 0x00 */
  59592. octets_needed--;
  59593. *msg_ptr = 0x00;
  59594. ofs += 1;
  59595. 8033418: 3101 adds r1, #1
  59596. 803341a: b289 uxth r1, r1
  59597. if (octets_needed == 5)
  59598. {
  59599. /* not enough bits in 'value' add leading 0x00 */
  59600. octets_needed--;
  59601. *msg_ptr = 0x00;
  59602. 803341c: 2200 movs r2, #0
  59603. ofs += 1;
  59604. if (ofs >= plen)
  59605. 803341e: 42a1 cmp r1, r4
  59606. if (octets_needed == 5)
  59607. {
  59608. /* not enough bits in 'value' add leading 0x00 */
  59609. octets_needed--;
  59610. *msg_ptr = 0x00;
  59611. 8033420: 55ba strb r2, [r7, r6]
  59612. ofs += 1;
  59613. if (ofs >= plen)
  59614. 8033422: d308 bcc.n 8033436 <snmp_asn1_enc_u32t+0x3a>
  59615. {
  59616. /* next octet in next pbuf */
  59617. p = p->next;
  59618. 8033424: 6800 ldr r0, [r0, #0]
  59619. if (p == NULL) { return ERR_ARG; }
  59620. 8033426: b908 cbnz r0, 803342c <snmp_asn1_enc_u32t+0x30>
  59621. 8033428: 20f2 movs r0, #242 ; 0xf2
  59622. 803342a: e025 b.n 8033478 <snmp_asn1_enc_u32t+0x7c>
  59623. msg_ptr = (u8_t*)p->payload;
  59624. plen += p->len;
  59625. 803342c: 8942 ldrh r2, [r0, #10]
  59626. if (ofs >= plen)
  59627. {
  59628. /* next octet in next pbuf */
  59629. p = p->next;
  59630. if (p == NULL) { return ERR_ARG; }
  59631. msg_ptr = (u8_t*)p->payload;
  59632. 803342e: 6845 ldr r5, [r0, #4]
  59633. plen += p->len;
  59634. 8033430: 18a4 adds r4, r4, r2
  59635. 8033432: b2a4 uxth r4, r4
  59636. 8033434: e000 b.n 8033438 <snmp_asn1_enc_u32t+0x3c>
  59637. }
  59638. else
  59639. {
  59640. /* next octet in same pbuf */
  59641. msg_ptr++;
  59642. 8033436: 3501 adds r5, #1
  59643. msg_ptr += ofs - base;
  59644. if (octets_needed == 5)
  59645. {
  59646. /* not enough bits in 'value' add leading 0x00 */
  59647. octets_needed--;
  59648. 8033438: 2204 movs r2, #4
  59649. * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) encode
  59650. *
  59651. * @see snmp_asn1_enc_u32t_cnt()
  59652. */
  59653. err_t
  59654. snmp_asn1_enc_u32t(struct pbuf *p, u16_t ofs, u16_t octets_needed, u32_t value)
  59655. 803343a: 1851 adds r1, r2, r1
  59656. 803343c: e012 b.n 8033464 <snmp_asn1_enc_u32t+0x68>
  59657. msg_ptr++;
  59658. }
  59659. }
  59660. while (octets_needed > 1)
  59661. {
  59662. octets_needed--;
  59663. 803343e: 3a01 subs r2, #1
  59664. 8033440: b292 uxth r2, r2
  59665. *msg_ptr = (u8_t)(value >> (octets_needed << 3));
  59666. 8033442: 00d6 lsls r6, r2, #3
  59667. 8033444: fa23 f606 lsr.w r6, r3, r6
  59668. 8033448: 702e strb r6, [r5, #0]
  59669. * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) encode
  59670. *
  59671. * @see snmp_asn1_enc_u32t_cnt()
  59672. */
  59673. err_t
  59674. snmp_asn1_enc_u32t(struct pbuf *p, u16_t ofs, u16_t octets_needed, u32_t value)
  59675. 803344a: 1a8e subs r6, r1, r2
  59676. while (octets_needed > 1)
  59677. {
  59678. octets_needed--;
  59679. *msg_ptr = (u8_t)(value >> (octets_needed << 3));
  59680. ofs += 1;
  59681. if (ofs >= plen)
  59682. 803344c: b2b6 uxth r6, r6
  59683. 803344e: 42a6 cmp r6, r4
  59684. 8033450: d307 bcc.n 8033462 <snmp_asn1_enc_u32t+0x66>
  59685. {
  59686. /* next octet in next pbuf */
  59687. p = p->next;
  59688. 8033452: 6800 ldr r0, [r0, #0]
  59689. if (p == NULL) { return ERR_ARG; }
  59690. 8033454: 2800 cmp r0, #0
  59691. 8033456: d0e7 beq.n 8033428 <snmp_asn1_enc_u32t+0x2c>
  59692. msg_ptr = (u8_t*)p->payload;
  59693. plen += p->len;
  59694. 8033458: 8946 ldrh r6, [r0, #10]
  59695. if (ofs >= plen)
  59696. {
  59697. /* next octet in next pbuf */
  59698. p = p->next;
  59699. if (p == NULL) { return ERR_ARG; }
  59700. msg_ptr = (u8_t*)p->payload;
  59701. 803345a: 6845 ldr r5, [r0, #4]
  59702. plen += p->len;
  59703. 803345c: 19a4 adds r4, r4, r6
  59704. 803345e: b2a4 uxth r4, r4
  59705. 8033460: e000 b.n 8033464 <snmp_asn1_enc_u32t+0x68>
  59706. }
  59707. else
  59708. {
  59709. /* next octet in same pbuf */
  59710. msg_ptr++;
  59711. 8033462: 3501 adds r5, #1
  59712. {
  59713. /* next octet in same pbuf */
  59714. msg_ptr++;
  59715. }
  59716. }
  59717. while (octets_needed > 1)
  59718. 8033464: 2a01 cmp r2, #1
  59719. 8033466: d8ea bhi.n 803343e <snmp_asn1_enc_u32t+0x42>
  59720. /* next octet in same pbuf */
  59721. msg_ptr++;
  59722. }
  59723. }
  59724. /* (only) one least significant octet */
  59725. *msg_ptr = (u8_t)value;
  59726. 8033468: 702b strb r3, [r5, #0]
  59727. return ERR_OK;
  59728. 803346a: 2000 movs r0, #0
  59729. 803346c: e004 b.n 8033478 <snmp_asn1_enc_u32t+0x7c>
  59730. }
  59731. p = p->next;
  59732. 803346e: 6800 ldr r0, [r0, #0]
  59733. plen = 0;
  59734. while (p != NULL)
  59735. {
  59736. base = plen;
  59737. plen += p->len;
  59738. 8033470: 4625 mov r5, r4
  59739. {
  59740. u16_t plen, base;
  59741. u8_t *msg_ptr;
  59742. plen = 0;
  59743. while (p != NULL)
  59744. 8033472: 2800 cmp r0, #0
  59745. 8033474: d1c5 bne.n 8033402 <snmp_asn1_enc_u32t+0x6>
  59746. 8033476: e7d7 b.n 8033428 <snmp_asn1_enc_u32t+0x2c>
  59747. }
  59748. p = p->next;
  59749. }
  59750. /* p == NULL, ofs >= plen */
  59751. return ERR_ARG;
  59752. }
  59753. 8033478: b240 sxtb r0, r0
  59754. 803347a: bdf0 pop {r4, r5, r6, r7, pc}
  59755. 0803347c <snmp_asn1_enc_s32t>:
  59756. *
  59757. * @see snmp_asn1_enc_s32t_cnt()
  59758. */
  59759. err_t
  59760. snmp_asn1_enc_s32t(struct pbuf *p, u16_t ofs, u16_t octets_needed, s32_t value)
  59761. {
  59762. 803347c: b5f0 push {r4, r5, r6, r7, lr}
  59763. u16_t plen, base;
  59764. u8_t *msg_ptr;
  59765. plen = 0;
  59766. 803347e: 2600 movs r6, #0
  59767. while (p != NULL)
  59768. 8033480: e024 b.n 80334cc <snmp_asn1_enc_s32t+0x50>
  59769. {
  59770. base = plen;
  59771. plen += p->len;
  59772. 8033482: 8944 ldrh r4, [r0, #10]
  59773. 8033484: 1934 adds r4, r6, r4
  59774. 8033486: b2a4 uxth r4, r4
  59775. if (ofs < plen)
  59776. 8033488: 42a1 cmp r1, r4
  59777. 803348a: d21d bcs.n 80334c8 <snmp_asn1_enc_s32t+0x4c>
  59778. {
  59779. msg_ptr = (u8_t*)p->payload;
  59780. 803348c: 6847 ldr r7, [r0, #4]
  59781. msg_ptr += ofs - base;
  59782. 803348e: 1b8d subs r5, r1, r6
  59783. 8033490: 197d adds r5, r7, r5
  59784. * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) encode
  59785. *
  59786. * @see snmp_asn1_enc_s32t_cnt()
  59787. */
  59788. err_t
  59789. snmp_asn1_enc_s32t(struct pbuf *p, u16_t ofs, u16_t octets_needed, s32_t value)
  59790. 8033492: 1851 adds r1, r2, r1
  59791. if (ofs < plen)
  59792. {
  59793. msg_ptr = (u8_t*)p->payload;
  59794. msg_ptr += ofs - base;
  59795. while (octets_needed > 1)
  59796. 8033494: e013 b.n 80334be <snmp_asn1_enc_s32t+0x42>
  59797. {
  59798. octets_needed--;
  59799. 8033496: 3a01 subs r2, #1
  59800. 8033498: b292 uxth r2, r2
  59801. *msg_ptr = (u8_t)(value >> (octets_needed << 3));
  59802. 803349a: 00d6 lsls r6, r2, #3
  59803. 803349c: fa43 f606 asr.w r6, r3, r6
  59804. 80334a0: 702e strb r6, [r5, #0]
  59805. * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) encode
  59806. *
  59807. * @see snmp_asn1_enc_s32t_cnt()
  59808. */
  59809. err_t
  59810. snmp_asn1_enc_s32t(struct pbuf *p, u16_t ofs, u16_t octets_needed, s32_t value)
  59811. 80334a2: 1a8e subs r6, r1, r2
  59812. while (octets_needed > 1)
  59813. {
  59814. octets_needed--;
  59815. *msg_ptr = (u8_t)(value >> (octets_needed << 3));
  59816. ofs += 1;
  59817. if (ofs >= plen)
  59818. 80334a4: b2b6 uxth r6, r6
  59819. 80334a6: 42a6 cmp r6, r4
  59820. 80334a8: d308 bcc.n 80334bc <snmp_asn1_enc_s32t+0x40>
  59821. {
  59822. /* next octet in next pbuf */
  59823. p = p->next;
  59824. 80334aa: 6800 ldr r0, [r0, #0]
  59825. if (p == NULL) { return ERR_ARG; }
  59826. 80334ac: b908 cbnz r0, 80334b2 <snmp_asn1_enc_s32t+0x36>
  59827. 80334ae: 20f2 movs r0, #242 ; 0xf2
  59828. 80334b0: e00f b.n 80334d2 <snmp_asn1_enc_s32t+0x56>
  59829. msg_ptr = (u8_t*)p->payload;
  59830. plen += p->len;
  59831. 80334b2: 8946 ldrh r6, [r0, #10]
  59832. if (ofs >= plen)
  59833. {
  59834. /* next octet in next pbuf */
  59835. p = p->next;
  59836. if (p == NULL) { return ERR_ARG; }
  59837. msg_ptr = (u8_t*)p->payload;
  59838. 80334b4: 6845 ldr r5, [r0, #4]
  59839. plen += p->len;
  59840. 80334b6: 19a4 adds r4, r4, r6
  59841. 80334b8: b2a4 uxth r4, r4
  59842. 80334ba: e000 b.n 80334be <snmp_asn1_enc_s32t+0x42>
  59843. }
  59844. else
  59845. {
  59846. /* next octet in same pbuf */
  59847. msg_ptr++;
  59848. 80334bc: 3501 adds r5, #1
  59849. if (ofs < plen)
  59850. {
  59851. msg_ptr = (u8_t*)p->payload;
  59852. msg_ptr += ofs - base;
  59853. while (octets_needed > 1)
  59854. 80334be: 2a01 cmp r2, #1
  59855. 80334c0: d8e9 bhi.n 8033496 <snmp_asn1_enc_s32t+0x1a>
  59856. /* next octet in same pbuf */
  59857. msg_ptr++;
  59858. }
  59859. }
  59860. /* (only) one least significant octet */
  59861. *msg_ptr = (u8_t)value;
  59862. 80334c2: 702b strb r3, [r5, #0]
  59863. return ERR_OK;
  59864. 80334c4: 2000 movs r0, #0
  59865. 80334c6: e004 b.n 80334d2 <snmp_asn1_enc_s32t+0x56>
  59866. }
  59867. p = p->next;
  59868. 80334c8: 6800 ldr r0, [r0, #0]
  59869. plen = 0;
  59870. while (p != NULL)
  59871. {
  59872. base = plen;
  59873. plen += p->len;
  59874. 80334ca: 4626 mov r6, r4
  59875. {
  59876. u16_t plen, base;
  59877. u8_t *msg_ptr;
  59878. plen = 0;
  59879. while (p != NULL)
  59880. 80334cc: 2800 cmp r0, #0
  59881. 80334ce: d1d8 bne.n 8033482 <snmp_asn1_enc_s32t+0x6>
  59882. 80334d0: e7ed b.n 80334ae <snmp_asn1_enc_s32t+0x32>
  59883. }
  59884. p = p->next;
  59885. }
  59886. /* p == NULL, ofs >= plen */
  59887. return ERR_ARG;
  59888. }
  59889. 80334d2: b240 sxtb r0, r0
  59890. 80334d4: bdf0 pop {r4, r5, r6, r7, pc}
  59891. 080334d6 <snmp_asn1_enc_oid>:
  59892. * @param ident points to object identifier array
  59893. * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) encode
  59894. */
  59895. err_t
  59896. snmp_asn1_enc_oid(struct pbuf *p, u16_t ofs, u8_t ident_len, s32_t *ident)
  59897. {
  59898. 80334d6: e92d 43f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, lr}
  59899. u16_t plen, base;
  59900. u8_t *msg_ptr;
  59901. plen = 0;
  59902. 80334da: 2500 movs r5, #0
  59903. while (p != NULL)
  59904. 80334dc: e068 b.n 80335b0 <snmp_asn1_enc_oid+0xda>
  59905. {
  59906. base = plen;
  59907. plen += p->len;
  59908. 80334de: 8944 ldrh r4, [r0, #10]
  59909. 80334e0: 192c adds r4, r5, r4
  59910. 80334e2: b2a4 uxth r4, r4
  59911. if (ofs < plen)
  59912. 80334e4: 42a1 cmp r1, r4
  59913. 80334e6: d261 bcs.n 80335ac <snmp_asn1_enc_oid+0xd6>
  59914. {
  59915. msg_ptr = (u8_t*)p->payload;
  59916. 80334e8: 6846 ldr r6, [r0, #4]
  59917. msg_ptr += ofs - base;
  59918. 80334ea: 1b4d subs r5, r1, r5
  59919. if (ident_len > 1)
  59920. 80334ec: 2a01 cmp r2, #1
  59921. base = plen;
  59922. plen += p->len;
  59923. if (ofs < plen)
  59924. {
  59925. msg_ptr = (u8_t*)p->payload;
  59926. msg_ptr += ofs - base;
  59927. 80334ee: eb06 0805 add.w r8, r6, r5
  59928. if (ident_len > 1)
  59929. 80334f2: d801 bhi.n 80334f8 <snmp_asn1_enc_oid+0x22>
  59930. }
  59931. else
  59932. {
  59933. /* @bug: allow empty varbinds for symmetry (we must decode them for getnext), allow partial compression?? */
  59934. /* ident_len <= 1, at least we need zeroDotZero (0.0) (ident_len == 2) */
  59935. return ERR_ARG;
  59936. 80334f4: 20f2 movs r0, #242 ; 0xf2
  59937. 80334f6: e05e b.n 80335b6 <snmp_asn1_enc_oid+0xe0>
  59938. msg_ptr = (u8_t*)p->payload;
  59939. msg_ptr += ofs - base;
  59940. if (ident_len > 1)
  59941. {
  59942. if ((ident[0] == 1) && (ident[1] == 3))
  59943. 80334f8: f8d3 c000 ldr.w ip, [r3]
  59944. 80334fc: f1bc 0f01 cmp.w ip, #1
  59945. 8033500: d105 bne.n 803350e <snmp_asn1_enc_oid+0x38>
  59946. 8033502: 685f ldr r7, [r3, #4]
  59947. 8033504: 2f03 cmp r7, #3
  59948. 8033506: d102 bne.n 803350e <snmp_asn1_enc_oid+0x38>
  59949. {
  59950. /* compressed (most common) prefix .iso.org */
  59951. *msg_ptr = 0x2b;
  59952. 8033508: 272b movs r7, #43 ; 0x2b
  59953. 803350a: 5577 strb r7, [r6, r5]
  59954. 803350c: e006 b.n 803351c <snmp_asn1_enc_oid+0x46>
  59955. }
  59956. else
  59957. {
  59958. /* calculate prefix */
  59959. *msg_ptr = (u8_t)((ident[0] * 40) + ident[1]);
  59960. 803350e: 685f ldr r7, [r3, #4]
  59961. 8033510: f04f 0928 mov.w r9, #40 ; 0x28
  59962. 8033514: fb09 7c0c mla ip, r9, ip, r7
  59963. 8033518: f806 c005 strb.w ip, [r6, r5]
  59964. }
  59965. ofs += 1;
  59966. 803351c: 3101 adds r1, #1
  59967. 803351e: b289 uxth r1, r1
  59968. if (ofs >= plen)
  59969. 8033520: 42a1 cmp r1, r4
  59970. 8033522: d307 bcc.n 8033534 <snmp_asn1_enc_oid+0x5e>
  59971. {
  59972. /* next octet in next pbuf */
  59973. p = p->next;
  59974. 8033524: 6800 ldr r0, [r0, #0]
  59975. if (p == NULL) { return ERR_ARG; }
  59976. 8033526: 2800 cmp r0, #0
  59977. 8033528: d0e4 beq.n 80334f4 <snmp_asn1_enc_oid+0x1e>
  59978. msg_ptr = (u8_t*)p->payload;
  59979. plen += p->len;
  59980. 803352a: 8946 ldrh r6, [r0, #10]
  59981. if (ofs >= plen)
  59982. {
  59983. /* next octet in next pbuf */
  59984. p = p->next;
  59985. if (p == NULL) { return ERR_ARG; }
  59986. msg_ptr = (u8_t*)p->payload;
  59987. 803352c: 6845 ldr r5, [r0, #4]
  59988. plen += p->len;
  59989. 803352e: 19a4 adds r4, r4, r6
  59990. 8033530: b2a4 uxth r4, r4
  59991. 8033532: e001 b.n 8033538 <snmp_asn1_enc_oid+0x62>
  59992. }
  59993. else
  59994. {
  59995. /* next octet in same pbuf */
  59996. msg_ptr++;
  59997. 8033534: f108 0501 add.w r5, r8, #1
  59998. }
  59999. ident_len -= 2;
  60000. 8033538: 3a02 subs r2, #2
  60001. 803353a: b2d2 uxtb r2, r2
  60002. * @param ident_len object identifier array length
  60003. * @param ident points to object identifier array
  60004. * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) encode
  60005. */
  60006. err_t
  60007. snmp_asn1_enc_oid(struct pbuf *p, u16_t ofs, u8_t ident_len, s32_t *ident)
  60008. 803353c: 3304 adds r3, #4
  60009. {
  60010. /* @bug: allow empty varbinds for symmetry (we must decode them for getnext), allow partial compression?? */
  60011. /* ident_len <= 1, at least we need zeroDotZero (0.0) (ident_len == 2) */
  60012. return ERR_ARG;
  60013. }
  60014. while (ident_len > 0)
  60015. 803353e: e031 b.n 80335a4 <snmp_asn1_enc_oid+0xce>
  60016. {
  60017. s32_t sub_id;
  60018. u8_t shift, tail;
  60019. ident_len--;
  60020. 8033540: 3a01 subs r2, #1
  60021. sub_id = *ident;
  60022. 8033542: f853 cf04 ldr.w ip, [r3, #4]!
  60023. while (ident_len > 0)
  60024. {
  60025. s32_t sub_id;
  60026. u8_t shift, tail;
  60027. ident_len--;
  60028. 8033546: b2d2 uxtb r2, r2
  60029. sub_id = *ident;
  60030. 8033548: 261c movs r6, #28
  60031. tail = 0;
  60032. 803354a: 2700 movs r7, #0
  60033. shift = 28;
  60034. while(shift > 0)
  60035. {
  60036. u8_t code;
  60037. code = (u8_t)(sub_id >> shift);
  60038. 803354c: fa4c f806 asr.w r8, ip, r6
  60039. if ((code != 0) || (tail != 0))
  60040. 8033550: f018 0fff tst.w r8, #255 ; 0xff
  60041. 8033554: d100 bne.n 8033558 <snmp_asn1_enc_oid+0x82>
  60042. 8033556: b18f cbz r7, 803357c <snmp_asn1_enc_oid+0xa6>
  60043. {
  60044. tail = 1;
  60045. *msg_ptr = code | 0x80;
  60046. ofs += 1;
  60047. 8033558: 3101 adds r1, #1
  60048. 803355a: b289 uxth r1, r1
  60049. code = (u8_t)(sub_id >> shift);
  60050. if ((code != 0) || (tail != 0))
  60051. {
  60052. tail = 1;
  60053. *msg_ptr = code | 0x80;
  60054. 803355c: f048 0880 orr.w r8, r8, #128 ; 0x80
  60055. ofs += 1;
  60056. if (ofs >= plen)
  60057. 8033560: 42a1 cmp r1, r4
  60058. code = (u8_t)(sub_id >> shift);
  60059. if ((code != 0) || (tail != 0))
  60060. {
  60061. tail = 1;
  60062. *msg_ptr = code | 0x80;
  60063. 8033562: f885 8000 strb.w r8, [r5]
  60064. ofs += 1;
  60065. if (ofs >= plen)
  60066. 8033566: d307 bcc.n 8033578 <snmp_asn1_enc_oid+0xa2>
  60067. {
  60068. /* next octet in next pbuf */
  60069. p = p->next;
  60070. 8033568: 6800 ldr r0, [r0, #0]
  60071. if (p == NULL) { return ERR_ARG; }
  60072. 803356a: 2800 cmp r0, #0
  60073. 803356c: d0c2 beq.n 80334f4 <snmp_asn1_enc_oid+0x1e>
  60074. msg_ptr = (u8_t*)p->payload;
  60075. plen += p->len;
  60076. 803356e: 8947 ldrh r7, [r0, #10]
  60077. if (ofs >= plen)
  60078. {
  60079. /* next octet in next pbuf */
  60080. p = p->next;
  60081. if (p == NULL) { return ERR_ARG; }
  60082. msg_ptr = (u8_t*)p->payload;
  60083. 8033570: 6845 ldr r5, [r0, #4]
  60084. plen += p->len;
  60085. 8033572: 19e4 adds r4, r4, r7
  60086. 8033574: b2a4 uxth r4, r4
  60087. 8033576: e000 b.n 803357a <snmp_asn1_enc_oid+0xa4>
  60088. }
  60089. else
  60090. {
  60091. /* next octet in same pbuf */
  60092. msg_ptr++;
  60093. 8033578: 3501 adds r5, #1
  60094. u8_t code;
  60095. code = (u8_t)(sub_id >> shift);
  60096. if ((code != 0) || (tail != 0))
  60097. {
  60098. tail = 1;
  60099. 803357a: 2701 movs r7, #1
  60100. ident_len--;
  60101. sub_id = *ident;
  60102. tail = 0;
  60103. shift = 28;
  60104. while(shift > 0)
  60105. 803357c: 3e07 subs r6, #7
  60106. 803357e: d1e5 bne.n 803354c <snmp_asn1_enc_oid+0x76>
  60107. msg_ptr++;
  60108. }
  60109. }
  60110. shift -= 7;
  60111. }
  60112. *msg_ptr = (u8_t)sub_id & 0x7F;
  60113. 8033580: f00c 0c7f and.w ip, ip, #127 ; 0x7f
  60114. 8033584: f885 c000 strb.w ip, [r5]
  60115. if (ident_len > 0)
  60116. 8033588: b172 cbz r2, 80335a8 <snmp_asn1_enc_oid+0xd2>
  60117. {
  60118. ofs += 1;
  60119. 803358a: 3101 adds r1, #1
  60120. 803358c: b289 uxth r1, r1
  60121. if (ofs >= plen)
  60122. 803358e: 42a1 cmp r1, r4
  60123. 8033590: d307 bcc.n 80335a2 <snmp_asn1_enc_oid+0xcc>
  60124. {
  60125. /* next octet in next pbuf */
  60126. p = p->next;
  60127. 8033592: 6800 ldr r0, [r0, #0]
  60128. if (p == NULL) { return ERR_ARG; }
  60129. 8033594: 2800 cmp r0, #0
  60130. 8033596: d0ad beq.n 80334f4 <snmp_asn1_enc_oid+0x1e>
  60131. msg_ptr = (u8_t*)p->payload;
  60132. plen += p->len;
  60133. 8033598: 8946 ldrh r6, [r0, #10]
  60134. if (ofs >= plen)
  60135. {
  60136. /* next octet in next pbuf */
  60137. p = p->next;
  60138. if (p == NULL) { return ERR_ARG; }
  60139. msg_ptr = (u8_t*)p->payload;
  60140. 803359a: 6845 ldr r5, [r0, #4]
  60141. plen += p->len;
  60142. 803359c: 19a4 adds r4, r4, r6
  60143. 803359e: b2a4 uxth r4, r4
  60144. 80335a0: e000 b.n 80335a4 <snmp_asn1_enc_oid+0xce>
  60145. }
  60146. else
  60147. {
  60148. /* next octet in same pbuf */
  60149. msg_ptr++;
  60150. 80335a2: 3501 adds r5, #1
  60151. {
  60152. /* @bug: allow empty varbinds for symmetry (we must decode them for getnext), allow partial compression?? */
  60153. /* ident_len <= 1, at least we need zeroDotZero (0.0) (ident_len == 2) */
  60154. return ERR_ARG;
  60155. }
  60156. while (ident_len > 0)
  60157. 80335a4: 2a00 cmp r2, #0
  60158. 80335a6: d1cb bne.n 8033540 <snmp_asn1_enc_oid+0x6a>
  60159. }
  60160. }
  60161. /* proceed to next sub-identifier */
  60162. ident++;
  60163. }
  60164. return ERR_OK;
  60165. 80335a8: 2000 movs r0, #0
  60166. 80335aa: e004 b.n 80335b6 <snmp_asn1_enc_oid+0xe0>
  60167. }
  60168. p = p->next;
  60169. 80335ac: 6800 ldr r0, [r0, #0]
  60170. plen = 0;
  60171. while (p != NULL)
  60172. {
  60173. base = plen;
  60174. plen += p->len;
  60175. 80335ae: 4625 mov r5, r4
  60176. {
  60177. u16_t plen, base;
  60178. u8_t *msg_ptr;
  60179. plen = 0;
  60180. while (p != NULL)
  60181. 80335b0: 2800 cmp r0, #0
  60182. 80335b2: d194 bne.n 80334de <snmp_asn1_enc_oid+0x8>
  60183. 80335b4: e79e b.n 80334f4 <snmp_asn1_enc_oid+0x1e>
  60184. }
  60185. p = p->next;
  60186. }
  60187. /* p == NULL, ofs >= plen */
  60188. return ERR_ARG;
  60189. }
  60190. 80335b6: b240 sxtb r0, r0
  60191. 80335b8: e8bd 83f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, pc}
  60192. 080335bc <snmp_asn1_enc_raw>:
  60193. * @param raw points raw data
  60194. * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) encode
  60195. */
  60196. err_t
  60197. snmp_asn1_enc_raw(struct pbuf *p, u16_t ofs, u16_t raw_len, u8_t *raw)
  60198. {
  60199. 80335bc: b5f0 push {r4, r5, r6, r7, lr}
  60200. u16_t plen, base;
  60201. u8_t *msg_ptr;
  60202. plen = 0;
  60203. 80335be: 2600 movs r6, #0
  60204. while (p != NULL)
  60205. 80335c0: e025 b.n 803360e <snmp_asn1_enc_raw+0x52>
  60206. {
  60207. base = plen;
  60208. plen += p->len;
  60209. 80335c2: 8944 ldrh r4, [r0, #10]
  60210. 80335c4: 1934 adds r4, r6, r4
  60211. 80335c6: b2a4 uxth r4, r4
  60212. if (ofs < plen)
  60213. 80335c8: 42a1 cmp r1, r4
  60214. 80335ca: d21e bcs.n 803360a <snmp_asn1_enc_raw+0x4e>
  60215. {
  60216. msg_ptr = (u8_t*)p->payload;
  60217. 80335cc: 6847 ldr r7, [r0, #4]
  60218. msg_ptr += ofs - base;
  60219. 80335ce: 1b8d subs r5, r1, r6
  60220. 80335d0: 197d adds r5, r7, r5
  60221. * @param raw_len raw data length
  60222. * @param raw points raw data
  60223. * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) encode
  60224. */
  60225. err_t
  60226. snmp_asn1_enc_raw(struct pbuf *p, u16_t ofs, u16_t raw_len, u8_t *raw)
  60227. 80335d2: 1851 adds r1, r2, r1
  60228. if (ofs < plen)
  60229. {
  60230. msg_ptr = (u8_t*)p->payload;
  60231. msg_ptr += ofs - base;
  60232. while (raw_len > 1)
  60233. 80335d4: e012 b.n 80335fc <snmp_asn1_enc_raw+0x40>
  60234. {
  60235. /* copy raw_len - 1 octets */
  60236. raw_len--;
  60237. 80335d6: 3a01 subs r2, #1
  60238. *msg_ptr = *raw;
  60239. 80335d8: f813 6b01 ldrb.w r6, [r3], #1
  60240. msg_ptr += ofs - base;
  60241. while (raw_len > 1)
  60242. {
  60243. /* copy raw_len - 1 octets */
  60244. raw_len--;
  60245. 80335dc: b292 uxth r2, r2
  60246. *msg_ptr = *raw;
  60247. 80335de: 702e strb r6, [r5, #0]
  60248. * @param raw_len raw data length
  60249. * @param raw points raw data
  60250. * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) encode
  60251. */
  60252. err_t
  60253. snmp_asn1_enc_raw(struct pbuf *p, u16_t ofs, u16_t raw_len, u8_t *raw)
  60254. 80335e0: 1a8e subs r6, r1, r2
  60255. /* copy raw_len - 1 octets */
  60256. raw_len--;
  60257. *msg_ptr = *raw;
  60258. raw++;
  60259. ofs += 1;
  60260. if (ofs >= plen)
  60261. 80335e2: b2b6 uxth r6, r6
  60262. 80335e4: 42a6 cmp r6, r4
  60263. 80335e6: d308 bcc.n 80335fa <snmp_asn1_enc_raw+0x3e>
  60264. {
  60265. /* next octet in next pbuf */
  60266. p = p->next;
  60267. 80335e8: 6800 ldr r0, [r0, #0]
  60268. if (p == NULL) { return ERR_ARG; }
  60269. 80335ea: b908 cbnz r0, 80335f0 <snmp_asn1_enc_raw+0x34>
  60270. 80335ec: 20f2 movs r0, #242 ; 0xf2
  60271. 80335ee: e012 b.n 8033616 <snmp_asn1_enc_raw+0x5a>
  60272. msg_ptr = (u8_t*)p->payload;
  60273. plen += p->len;
  60274. 80335f0: 8946 ldrh r6, [r0, #10]
  60275. if (ofs >= plen)
  60276. {
  60277. /* next octet in next pbuf */
  60278. p = p->next;
  60279. if (p == NULL) { return ERR_ARG; }
  60280. msg_ptr = (u8_t*)p->payload;
  60281. 80335f2: 6845 ldr r5, [r0, #4]
  60282. plen += p->len;
  60283. 80335f4: 19a4 adds r4, r4, r6
  60284. 80335f6: b2a4 uxth r4, r4
  60285. 80335f8: e000 b.n 80335fc <snmp_asn1_enc_raw+0x40>
  60286. }
  60287. else
  60288. {
  60289. /* next octet in same pbuf */
  60290. msg_ptr++;
  60291. 80335fa: 3501 adds r5, #1
  60292. if (ofs < plen)
  60293. {
  60294. msg_ptr = (u8_t*)p->payload;
  60295. msg_ptr += ofs - base;
  60296. while (raw_len > 1)
  60297. 80335fc: 2a01 cmp r2, #1
  60298. 80335fe: d8ea bhi.n 80335d6 <snmp_asn1_enc_raw+0x1a>
  60299. {
  60300. /* next octet in same pbuf */
  60301. msg_ptr++;
  60302. }
  60303. }
  60304. if (raw_len > 0)
  60305. 8033600: b142 cbz r2, 8033614 <snmp_asn1_enc_raw+0x58>
  60306. {
  60307. /* copy last or single octet */
  60308. *msg_ptr = *raw;
  60309. 8033602: 781b ldrb r3, [r3, #0]
  60310. }
  60311. return ERR_OK;
  60312. 8033604: 2000 movs r0, #0
  60313. }
  60314. }
  60315. if (raw_len > 0)
  60316. {
  60317. /* copy last or single octet */
  60318. *msg_ptr = *raw;
  60319. 8033606: 702b strb r3, [r5, #0]
  60320. 8033608: e005 b.n 8033616 <snmp_asn1_enc_raw+0x5a>
  60321. }
  60322. return ERR_OK;
  60323. }
  60324. p = p->next;
  60325. 803360a: 6800 ldr r0, [r0, #0]
  60326. plen = 0;
  60327. while (p != NULL)
  60328. {
  60329. base = plen;
  60330. plen += p->len;
  60331. 803360c: 4626 mov r6, r4
  60332. {
  60333. u16_t plen, base;
  60334. u8_t *msg_ptr;
  60335. plen = 0;
  60336. while (p != NULL)
  60337. 803360e: 2800 cmp r0, #0
  60338. 8033610: d1d7 bne.n 80335c2 <snmp_asn1_enc_raw+0x6>
  60339. 8033612: e7eb b.n 80335ec <snmp_asn1_enc_raw+0x30>
  60340. if (raw_len > 0)
  60341. {
  60342. /* copy last or single octet */
  60343. *msg_ptr = *raw;
  60344. }
  60345. return ERR_OK;
  60346. 8033614: 4610 mov r0, r2
  60347. }
  60348. p = p->next;
  60349. }
  60350. /* p == NULL, ofs >= plen */
  60351. return ERR_ARG;
  60352. }
  60353. 8033616: b240 sxtb r0, r0
  60354. 8033618: bdf0 pop {r4, r5, r6, r7, pc}
  60355. 0803361a <noleafs_get_object_def>:
  60356. void
  60357. noleafs_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
  60358. {
  60359. LWIP_UNUSED_ARG(ident_len);
  60360. LWIP_UNUSED_ARG(ident);
  60361. od->instance = MIB_OBJECT_NONE;
  60362. 803361a: 2300 movs r3, #0
  60363. 803361c: 7013 strb r3, [r2, #0]
  60364. 803361e: 4770 bx lr
  60365. 08033620 <noleafs_get_value>:
  60366. }
  60367. void
  60368. noleafs_get_value(struct obj_def *od, u16_t len, void *value)
  60369. {
  60370. 8033620: 4770 bx lr
  60371. 08033622 <noleafs_set_test>:
  60372. LWIP_UNUSED_ARG(od);
  60373. LWIP_UNUSED_ARG(len);
  60374. LWIP_UNUSED_ARG(value);
  60375. /* can't set */
  60376. return 0;
  60377. }
  60378. 8033622: 2000 movs r0, #0
  60379. 8033624: 4770 bx lr
  60380. 08033626 <noleafs_set_value>:
  60381. void
  60382. noleafs_set_value(struct obj_def *od, u16_t len, void *value)
  60383. {
  60384. 8033626: 4770 bx lr
  60385. 08033628 <system_get_object_def>:
  60386. u8_t id;
  60387. /* return to object name, adding index depth (1) */
  60388. ident_len += 1;
  60389. ident -= 1;
  60390. if (ident_len == 2)
  60391. 8033628: 2801 cmp r0, #1
  60392. 803362a: d145 bne.n 80336b8 <system_get_object_def+0x90>
  60393. {
  60394. od->id_inst_len = ident_len;
  60395. 803362c: 2002 movs r0, #2
  60396. {
  60397. u8_t id;
  60398. /* return to object name, adding index depth (1) */
  60399. ident_len += 1;
  60400. ident -= 1;
  60401. 803362e: 1f0b subs r3, r1, #4
  60402. if (ident_len == 2)
  60403. {
  60404. od->id_inst_len = ident_len;
  60405. 8033630: 7190 strb r0, [r2, #6]
  60406. od->id_inst_ptr = ident;
  60407. 8033632: 6093 str r3, [r2, #8]
  60408. LWIP_ASSERT("invalid id", (ident[0] >= 0) && (ident[0] <= 0xff));
  60409. id = (u8_t)ident[0];
  60410. LWIP_DEBUGF(SNMP_MIB_DEBUG,("get_object_def system.%"U16_F".0\n",(u16_t)id));
  60411. switch (id)
  60412. 8033634: f811 3c04 ldrb.w r3, [r1, #-4]
  60413. 8033638: 3b01 subs r3, #1
  60414. 803363a: 2b06 cmp r3, #6
  60415. 803363c: d83c bhi.n 80336b8 <system_get_object_def+0x90>
  60416. 803363e: e8df f003 tbb [pc, r3]
  60417. 8033642: 0b04 .short 0x0b04
  60418. 8033644: 2a221a14 .word 0x2a221a14
  60419. 8033648: 34 .byte 0x34
  60420. 8033649: 00 .byte 0x00
  60421. {
  60422. case 1: /* sysDescr */
  60423. od->instance = MIB_OBJECT_SCALAR;
  60424. 803364a: 2301 movs r3, #1
  60425. 803364c: 7013 strb r3, [r2, #0]
  60426. od->access = MIB_OBJECT_READ_ONLY;
  60427. 803364e: 7053 strb r3, [r2, #1]
  60428. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR);
  60429. 8033650: 2304 movs r3, #4
  60430. 8033652: 7093 strb r3, [r2, #2]
  60431. od->v_len = *sysdescr_len_ptr;
  60432. 8033654: 4b1a ldr r3, [pc, #104] ; (80336c0 <system_get_object_def+0x98>)
  60433. 8033656: e025 b.n 80336a4 <system_get_object_def+0x7c>
  60434. break;
  60435. case 2: /* sysObjectID */
  60436. od->instance = MIB_OBJECT_SCALAR;
  60437. 8033658: 2301 movs r3, #1
  60438. 803365a: 7013 strb r3, [r2, #0]
  60439. od->access = MIB_OBJECT_READ_ONLY;
  60440. 803365c: 7053 strb r3, [r2, #1]
  60441. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID);
  60442. 803365e: 2306 movs r3, #6
  60443. 8033660: 7093 strb r3, [r2, #2]
  60444. od->v_len = sysobjid.len * sizeof(s32_t);
  60445. 8033662: 4b18 ldr r3, [pc, #96] ; (80336c4 <system_get_object_def+0x9c>)
  60446. 8033664: 781b ldrb r3, [r3, #0]
  60447. 8033666: 009b lsls r3, r3, #2
  60448. 8033668: e024 b.n 80336b4 <system_get_object_def+0x8c>
  60449. break;
  60450. case 3: /* sysUpTime */
  60451. od->instance = MIB_OBJECT_SCALAR;
  60452. 803366a: 2301 movs r3, #1
  60453. 803366c: 7013 strb r3, [r2, #0]
  60454. od->access = MIB_OBJECT_READ_ONLY;
  60455. 803366e: 7053 strb r3, [r2, #1]
  60456. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_TIMETICKS);
  60457. 8033670: 2343 movs r3, #67 ; 0x43
  60458. 8033672: 7093 strb r3, [r2, #2]
  60459. 8033674: e01d b.n 80336b2 <system_get_object_def+0x8a>
  60460. od->v_len = sizeof(u32_t);
  60461. break;
  60462. case 4: /* sysContact */
  60463. od->instance = MIB_OBJECT_SCALAR;
  60464. 8033676: 2301 movs r3, #1
  60465. 8033678: 7013 strb r3, [r2, #0]
  60466. od->access = MIB_OBJECT_READ_WRITE;
  60467. 803367a: 2303 movs r3, #3
  60468. 803367c: 7053 strb r3, [r2, #1]
  60469. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR);
  60470. 803367e: 2304 movs r3, #4
  60471. 8033680: 7093 strb r3, [r2, #2]
  60472. od->v_len = *syscontact_len_ptr;
  60473. 8033682: 4b11 ldr r3, [pc, #68] ; (80336c8 <system_get_object_def+0xa0>)
  60474. 8033684: e00e b.n 80336a4 <system_get_object_def+0x7c>
  60475. break;
  60476. case 5: /* sysName */
  60477. od->instance = MIB_OBJECT_SCALAR;
  60478. 8033686: 2301 movs r3, #1
  60479. 8033688: 7013 strb r3, [r2, #0]
  60480. od->access = MIB_OBJECT_READ_WRITE;
  60481. 803368a: 2303 movs r3, #3
  60482. 803368c: 7053 strb r3, [r2, #1]
  60483. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR);
  60484. 803368e: 2304 movs r3, #4
  60485. 8033690: 7093 strb r3, [r2, #2]
  60486. od->v_len = *sysname_len_ptr;
  60487. 8033692: 4b0e ldr r3, [pc, #56] ; (80336cc <system_get_object_def+0xa4>)
  60488. 8033694: e006 b.n 80336a4 <system_get_object_def+0x7c>
  60489. break;
  60490. case 6: /* sysLocation */
  60491. od->instance = MIB_OBJECT_SCALAR;
  60492. 8033696: 2301 movs r3, #1
  60493. 8033698: 7013 strb r3, [r2, #0]
  60494. od->access = MIB_OBJECT_READ_WRITE;
  60495. 803369a: 2303 movs r3, #3
  60496. 803369c: 7053 strb r3, [r2, #1]
  60497. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR);
  60498. 803369e: 2304 movs r3, #4
  60499. 80336a0: 7093 strb r3, [r2, #2]
  60500. od->v_len = *syslocation_len_ptr;
  60501. 80336a2: 4b0b ldr r3, [pc, #44] ; (80336d0 <system_get_object_def+0xa8>)
  60502. 80336a4: 681b ldr r3, [r3, #0]
  60503. 80336a6: 781b ldrb r3, [r3, #0]
  60504. 80336a8: e004 b.n 80336b4 <system_get_object_def+0x8c>
  60505. break;
  60506. case 7: /* sysServices */
  60507. od->instance = MIB_OBJECT_SCALAR;
  60508. 80336aa: 2301 movs r3, #1
  60509. 80336ac: 7013 strb r3, [r2, #0]
  60510. od->access = MIB_OBJECT_READ_ONLY;
  60511. 80336ae: 7053 strb r3, [r2, #1]
  60512. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
  60513. 80336b0: 7090 strb r0, [r2, #2]
  60514. od->v_len = sizeof(s32_t);
  60515. 80336b2: 2304 movs r3, #4
  60516. 80336b4: 8093 strh r3, [r2, #4]
  60517. break;
  60518. 80336b6: 4770 bx lr
  60519. };
  60520. }
  60521. else
  60522. {
  60523. LWIP_DEBUGF(SNMP_MIB_DEBUG,("system_get_object_def: no scalar\n"));
  60524. od->instance = MIB_OBJECT_NONE;
  60525. 80336b8: 2300 movs r3, #0
  60526. 80336ba: 7013 strb r3, [r2, #0]
  60527. 80336bc: 4770 bx lr
  60528. 80336be: bf00 nop
  60529. 80336c0: 2000094c .word 0x2000094c
  60530. 80336c4: 200007fc .word 0x200007fc
  60531. 80336c8: 200007a8 .word 0x200007a8
  60532. 80336cc: 200007a4 .word 0x200007a4
  60533. 80336d0: 20000990 .word 0x20000990
  60534. 080336d4 <interfaces_get_object_def>:
  60535. interfaces_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
  60536. {
  60537. /* return to object name, adding index depth (1) */
  60538. ident_len += 1;
  60539. ident -= 1;
  60540. if (ident_len == 2)
  60541. 80336d4: 2801 cmp r0, #1
  60542. 80336d6: d109 bne.n 80336ec <interfaces_get_object_def+0x18>
  60543. {
  60544. od->id_inst_len = ident_len;
  60545. 80336d8: 2302 movs r3, #2
  60546. 80336da: 7193 strb r3, [r2, #6]
  60547. static void
  60548. interfaces_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
  60549. {
  60550. /* return to object name, adding index depth (1) */
  60551. ident_len += 1;
  60552. ident -= 1;
  60553. 80336dc: 3904 subs r1, #4
  60554. od->id_inst_len = ident_len;
  60555. od->id_inst_ptr = ident;
  60556. od->instance = MIB_OBJECT_SCALAR;
  60557. od->access = MIB_OBJECT_READ_ONLY;
  60558. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
  60559. 80336de: 7093 strb r3, [r2, #2]
  60560. od->v_len = sizeof(s32_t);
  60561. 80336e0: 2304 movs r3, #4
  60562. ident_len += 1;
  60563. ident -= 1;
  60564. if (ident_len == 2)
  60565. {
  60566. od->id_inst_len = ident_len;
  60567. od->id_inst_ptr = ident;
  60568. 80336e2: 6091 str r1, [r2, #8]
  60569. od->instance = MIB_OBJECT_SCALAR;
  60570. 80336e4: 7010 strb r0, [r2, #0]
  60571. od->access = MIB_OBJECT_READ_ONLY;
  60572. 80336e6: 7050 strb r0, [r2, #1]
  60573. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
  60574. od->v_len = sizeof(s32_t);
  60575. 80336e8: 8093 strh r3, [r2, #4]
  60576. 80336ea: 4770 bx lr
  60577. }
  60578. else
  60579. {
  60580. LWIP_DEBUGF(SNMP_MIB_DEBUG,("interfaces_get_object_def: no scalar\n"));
  60581. od->instance = MIB_OBJECT_NONE;
  60582. 80336ec: 2300 movs r3, #0
  60583. 80336ee: 7013 strb r3, [r2, #0]
  60584. 80336f0: 4770 bx lr
  60585. 80336f2: 0000 movs r0, r0
  60586. 080336f4 <interfaces_get_value>:
  60587. */
  60588. static void
  60589. interfaces_get_value(struct obj_def *od, u16_t len, void *value)
  60590. {
  60591. LWIP_UNUSED_ARG(len);
  60592. if (od->id_inst_ptr[0] == 1)
  60593. 80336f4: 6883 ldr r3, [r0, #8]
  60594. 80336f6: 681b ldr r3, [r3, #0]
  60595. 80336f8: 2b01 cmp r3, #1
  60596. 80336fa: d102 bne.n 8033702 <interfaces_get_value+0xe>
  60597. {
  60598. s32_t *sint_ptr = (s32_t*)value;
  60599. *sint_ptr = iflist_root.count;
  60600. 80336fc: 4b01 ldr r3, [pc, #4] ; (8033704 <interfaces_get_value+0x10>)
  60601. 80336fe: 8b9b ldrh r3, [r3, #28]
  60602. 8033700: 6013 str r3, [r2, #0]
  60603. 8033702: 4770 bx lr
  60604. 8033704: 200007dc .word 0x200007dc
  60605. 08033708 <ip_get_value>:
  60606. {
  60607. u8_t id;
  60608. LWIP_UNUSED_ARG(len);
  60609. LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
  60610. id = (u8_t)od->id_inst_ptr[0];
  60611. 8033708: 6883 ldr r3, [r0, #8]
  60612. switch (id)
  60613. 803370a: 781b ldrb r3, [r3, #0]
  60614. 803370c: 3b01 subs r3, #1
  60615. 803370e: 2b16 cmp r3, #22
  60616. 8033710: d836 bhi.n 8033780 <ip_get_value+0x78>
  60617. 8033712: e8df f003 tbb [pc, r3]
  60618. 8033716: 0e0c .short 0x0e0c
  60619. 8033718: 16141210 .word 0x16141210
  60620. 803371c: 1e1c1a18 .word 0x1e1c1a18
  60621. 8033720: 26242220 .word 0x26242220
  60622. 8033724: 2e2c2a28 .word 0x2e2c2a28
  60623. 8033728: 35353530 .word 0x35353530
  60624. 803372c: 32 .byte 0x32
  60625. 803372d: 00 .byte 0x00
  60626. #if IP_FORWARD
  60627. /* forwarding */
  60628. *sint_ptr = 1;
  60629. #else
  60630. /* not-forwarding */
  60631. *sint_ptr = 2;
  60632. 803372e: 2302 movs r3, #2
  60633. 8033730: e025 b.n 803377e <ip_get_value+0x76>
  60634. }
  60635. break;
  60636. case 2: /* ipDefaultTTL */
  60637. {
  60638. s32_t *sint_ptr = (s32_t*)value;
  60639. *sint_ptr = IP_DEFAULT_TTL;
  60640. 8033732: 23ff movs r3, #255 ; 0xff
  60641. 8033734: e023 b.n 803377e <ip_get_value+0x76>
  60642. }
  60643. break;
  60644. case 3: /* ipInReceives */
  60645. {
  60646. u32_t *uint_ptr = (u32_t*)value;
  60647. *uint_ptr = ipinreceives;
  60648. 8033736: 4b13 ldr r3, [pc, #76] ; (8033784 <ip_get_value+0x7c>)
  60649. 8033738: e020 b.n 803377c <ip_get_value+0x74>
  60650. }
  60651. break;
  60652. case 4: /* ipInHdrErrors */
  60653. {
  60654. u32_t *uint_ptr = (u32_t*)value;
  60655. *uint_ptr = ipinhdrerrors;
  60656. 803373a: 4b13 ldr r3, [pc, #76] ; (8033788 <ip_get_value+0x80>)
  60657. 803373c: e01e b.n 803377c <ip_get_value+0x74>
  60658. }
  60659. break;
  60660. case 5: /* ipInAddrErrors */
  60661. {
  60662. u32_t *uint_ptr = (u32_t*)value;
  60663. *uint_ptr = ipinaddrerrors;
  60664. 803373e: 4b13 ldr r3, [pc, #76] ; (803378c <ip_get_value+0x84>)
  60665. 8033740: e01c b.n 803377c <ip_get_value+0x74>
  60666. }
  60667. break;
  60668. case 6: /* ipForwDatagrams */
  60669. {
  60670. u32_t *uint_ptr = (u32_t*)value;
  60671. *uint_ptr = ipforwdatagrams;
  60672. 8033742: 4b13 ldr r3, [pc, #76] ; (8033790 <ip_get_value+0x88>)
  60673. 8033744: e01a b.n 803377c <ip_get_value+0x74>
  60674. }
  60675. break;
  60676. case 7: /* ipInUnknownProtos */
  60677. {
  60678. u32_t *uint_ptr = (u32_t*)value;
  60679. *uint_ptr = ipinunknownprotos;
  60680. 8033746: 4b13 ldr r3, [pc, #76] ; (8033794 <ip_get_value+0x8c>)
  60681. 8033748: e018 b.n 803377c <ip_get_value+0x74>
  60682. }
  60683. break;
  60684. case 8: /* ipInDiscards */
  60685. {
  60686. u32_t *uint_ptr = (u32_t*)value;
  60687. *uint_ptr = ipindiscards;
  60688. 803374a: 4b13 ldr r3, [pc, #76] ; (8033798 <ip_get_value+0x90>)
  60689. 803374c: e016 b.n 803377c <ip_get_value+0x74>
  60690. }
  60691. break;
  60692. case 9: /* ipInDelivers */
  60693. {
  60694. u32_t *uint_ptr = (u32_t*)value;
  60695. *uint_ptr = ipindelivers;
  60696. 803374e: 4b13 ldr r3, [pc, #76] ; (803379c <ip_get_value+0x94>)
  60697. 8033750: e014 b.n 803377c <ip_get_value+0x74>
  60698. }
  60699. break;
  60700. case 10: /* ipOutRequests */
  60701. {
  60702. u32_t *uint_ptr = (u32_t*)value;
  60703. *uint_ptr = ipoutrequests;
  60704. 8033752: 4b13 ldr r3, [pc, #76] ; (80337a0 <ip_get_value+0x98>)
  60705. 8033754: e012 b.n 803377c <ip_get_value+0x74>
  60706. }
  60707. break;
  60708. case 11: /* ipOutDiscards */
  60709. {
  60710. u32_t *uint_ptr = (u32_t*)value;
  60711. *uint_ptr = ipoutdiscards;
  60712. 8033756: 4b13 ldr r3, [pc, #76] ; (80337a4 <ip_get_value+0x9c>)
  60713. 8033758: e010 b.n 803377c <ip_get_value+0x74>
  60714. }
  60715. break;
  60716. case 12: /* ipOutNoRoutes */
  60717. {
  60718. u32_t *uint_ptr = (u32_t*)value;
  60719. *uint_ptr = ipoutnoroutes;
  60720. 803375a: 4b13 ldr r3, [pc, #76] ; (80337a8 <ip_get_value+0xa0>)
  60721. 803375c: e00e b.n 803377c <ip_get_value+0x74>
  60722. {
  60723. s32_t *sint_ptr = (s32_t*)value;
  60724. #if IP_REASSEMBLY
  60725. *sint_ptr = IP_REASS_MAXAGE;
  60726. #else
  60727. *sint_ptr = 0;
  60728. 803375e: 2300 movs r3, #0
  60729. 8033760: e00d b.n 803377e <ip_get_value+0x76>
  60730. }
  60731. break;
  60732. case 14: /* ipReasmReqds */
  60733. {
  60734. u32_t *uint_ptr = (u32_t*)value;
  60735. *uint_ptr = ipreasmreqds;
  60736. 8033762: 4b12 ldr r3, [pc, #72] ; (80337ac <ip_get_value+0xa4>)
  60737. 8033764: e00a b.n 803377c <ip_get_value+0x74>
  60738. }
  60739. break;
  60740. case 15: /* ipReasmOKs */
  60741. {
  60742. u32_t *uint_ptr = (u32_t*)value;
  60743. *uint_ptr = ipreasmoks;
  60744. 8033766: 4b12 ldr r3, [pc, #72] ; (80337b0 <ip_get_value+0xa8>)
  60745. 8033768: e008 b.n 803377c <ip_get_value+0x74>
  60746. }
  60747. break;
  60748. case 16: /* ipReasmFails */
  60749. {
  60750. u32_t *uint_ptr = (u32_t*)value;
  60751. *uint_ptr = ipreasmfails;
  60752. 803376a: 4b12 ldr r3, [pc, #72] ; (80337b4 <ip_get_value+0xac>)
  60753. 803376c: e006 b.n 803377c <ip_get_value+0x74>
  60754. }
  60755. break;
  60756. case 17: /* ipFragOKs */
  60757. {
  60758. u32_t *uint_ptr = (u32_t*)value;
  60759. *uint_ptr = ipfragoks;
  60760. 803376e: 4b12 ldr r3, [pc, #72] ; (80337b8 <ip_get_value+0xb0>)
  60761. 8033770: e004 b.n 803377c <ip_get_value+0x74>
  60762. }
  60763. break;
  60764. case 18: /* ipFragFails */
  60765. {
  60766. u32_t *uint_ptr = (u32_t*)value;
  60767. *uint_ptr = ipfragfails;
  60768. 8033772: 4b12 ldr r3, [pc, #72] ; (80337bc <ip_get_value+0xb4>)
  60769. 8033774: e002 b.n 803377c <ip_get_value+0x74>
  60770. }
  60771. break;
  60772. case 19: /* ipFragCreates */
  60773. {
  60774. u32_t *uint_ptr = (u32_t*)value;
  60775. *uint_ptr = ipfragcreates;
  60776. 8033776: 4b12 ldr r3, [pc, #72] ; (80337c0 <ip_get_value+0xb8>)
  60777. 8033778: e000 b.n 803377c <ip_get_value+0x74>
  60778. break;
  60779. case 23: /* ipRoutingDiscards */
  60780. /** @todo can lwIP discard routes at all?? hardwire this to 0?? */
  60781. {
  60782. u32_t *uint_ptr = (u32_t*)value;
  60783. *uint_ptr = iproutingdiscards;
  60784. 803377a: 4b12 ldr r3, [pc, #72] ; (80337c4 <ip_get_value+0xbc>)
  60785. 803377c: 681b ldr r3, [r3, #0]
  60786. 803377e: 6013 str r3, [r2, #0]
  60787. 8033780: 4770 bx lr
  60788. 8033782: bf00 nop
  60789. 8033784: 2000c528 .word 0x2000c528
  60790. 8033788: 2000c4b0 .word 0x2000c4b0
  60791. 803378c: 2000c494 .word 0x2000c494
  60792. 8033790: 2000c5b0 .word 0x2000c5b0
  60793. 8033794: 2000c4f0 .word 0x2000c4f0
  60794. 8033798: 2000c57c .word 0x2000c57c
  60795. 803379c: 2000c5b4 .word 0x2000c5b4
  60796. 80337a0: 2000c59c .word 0x2000c59c
  60797. 80337a4: 2000c540 .word 0x2000c540
  60798. 80337a8: 2000c5c0 .word 0x2000c5c0
  60799. 80337ac: 2000c510 .word 0x2000c510
  60800. 80337b0: 2000c4bc .word 0x2000c4bc
  60801. 80337b4: 2000c570 .word 0x2000c570
  60802. 80337b8: 2000c480 .word 0x2000c480
  60803. 80337bc: 2000c4ec .word 0x2000c4ec
  60804. 80337c0: 2000c58c .word 0x2000c58c
  60805. 80337c4: 2000c578 .word 0x2000c578
  60806. 080337c8 <ip_set_test>:
  60807. s32_t *sint_ptr = (s32_t*)value;
  60808. LWIP_UNUSED_ARG(len);
  60809. set_ok = 0;
  60810. LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
  60811. id = (u8_t)od->id_inst_ptr[0];
  60812. 80337c8: 6883 ldr r3, [r0, #8]
  60813. switch (id)
  60814. 80337ca: 781b ldrb r3, [r3, #0]
  60815. 80337cc: 2b01 cmp r3, #1
  60816. 80337ce: d002 beq.n 80337d6 <ip_set_test+0xe>
  60817. 80337d0: 2b02 cmp r3, #2
  60818. 80337d2: d109 bne.n 80337e8 <ip_set_test+0x20>
  60819. 80337d4: e002 b.n 80337dc <ip_set_test+0x14>
  60820. #if IP_FORWARD
  60821. /* forwarding */
  60822. if (*sint_ptr == 1)
  60823. #else
  60824. /* not-forwarding */
  60825. if (*sint_ptr == 2)
  60826. 80337d6: 6810 ldr r0, [r2, #0]
  60827. {
  60828. u8_t id, set_ok;
  60829. s32_t *sint_ptr = (s32_t*)value;
  60830. LWIP_UNUSED_ARG(len);
  60831. set_ok = 0;
  60832. 80337d8: 2802 cmp r0, #2
  60833. 80337da: e001 b.n 80337e0 <ip_set_test+0x18>
  60834. {
  60835. set_ok = 1;
  60836. }
  60837. break;
  60838. case 2: /* ipDefaultTTL */
  60839. if (*sint_ptr == IP_DEFAULT_TTL)
  60840. 80337dc: 6810 ldr r0, [r2, #0]
  60841. {
  60842. u8_t id, set_ok;
  60843. s32_t *sint_ptr = (s32_t*)value;
  60844. LWIP_UNUSED_ARG(len);
  60845. set_ok = 0;
  60846. 80337de: 28ff cmp r0, #255 ; 0xff
  60847. 80337e0: bf14 ite ne
  60848. 80337e2: 2000 movne r0, #0
  60849. 80337e4: 2001 moveq r0, #1
  60850. 80337e6: 4770 bx lr
  60851. 80337e8: 2000 movs r0, #0
  60852. set_ok = 1;
  60853. }
  60854. break;
  60855. };
  60856. return set_ok;
  60857. }
  60858. 80337ea: 4770 bx lr
  60859. 080337ec <ip_rteentry_get_object_def>:
  60860. /* return to object name, adding index depth (4) */
  60861. ident_len += 4;
  60862. ident -= 4;
  60863. if (ident_len == 5)
  60864. 80337ec: 2801 cmp r0, #1
  60865. 80337ee: d12c bne.n 803384a <ip_rteentry_get_object_def+0x5e>
  60866. {
  60867. od->id_inst_len = ident_len;
  60868. 80337f0: 2305 movs r3, #5
  60869. 80337f2: 7193 strb r3, [r2, #6]
  60870. {
  60871. u8_t id;
  60872. /* return to object name, adding index depth (4) */
  60873. ident_len += 4;
  60874. ident -= 4;
  60875. 80337f4: f1a1 0310 sub.w r3, r1, #16
  60876. if (ident_len == 5)
  60877. {
  60878. od->id_inst_len = ident_len;
  60879. od->id_inst_ptr = ident;
  60880. 80337f8: 6093 str r3, [r2, #8]
  60881. LWIP_ASSERT("invalid id", (ident[0] >= 0) && (ident[0] <= 0xff));
  60882. id = (u8_t)ident[0];
  60883. switch (id)
  60884. 80337fa: f811 3c10 ldrb.w r3, [r1, #-16]
  60885. 80337fe: 3b01 subs r3, #1
  60886. 8033800: 2b0c cmp r3, #12
  60887. 8033802: d822 bhi.n 803384a <ip_rteentry_get_object_def+0x5e>
  60888. 8033804: e8df f003 tbb [pc, r3]
  60889. 8033808: 0d0d0d07 .word 0x0d0d0d07
  60890. 803380c: 0d070d0d .word 0x0d070d0d
  60891. 8033810: 0d070d11 .word 0x0d070d11
  60892. 8033814: 18 .byte 0x18
  60893. 8033815: 00 .byte 0x00
  60894. {
  60895. case 1: /* ipRouteDest */
  60896. case 7: /* ipRouteNextHop */
  60897. case 11: /* ipRouteMask */
  60898. od->instance = MIB_OBJECT_TAB;
  60899. 8033816: 2302 movs r3, #2
  60900. 8033818: 7013 strb r3, [r2, #0]
  60901. od->access = MIB_OBJECT_READ_WRITE;
  60902. 803381a: 2303 movs r3, #3
  60903. 803381c: 7053 strb r3, [r2, #1]
  60904. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR);
  60905. 803381e: 2340 movs r3, #64 ; 0x40
  60906. 8033820: e007 b.n 8033832 <ip_rteentry_get_object_def+0x46>
  60907. case 5: /* ipRouteMetric3 */
  60908. case 6: /* ipRouteMetric4 */
  60909. case 8: /* ipRouteType */
  60910. case 10: /* ipRouteAge */
  60911. case 12: /* ipRouteMetric5 */
  60912. od->instance = MIB_OBJECT_TAB;
  60913. 8033822: 2302 movs r3, #2
  60914. 8033824: 7013 strb r3, [r2, #0]
  60915. od->access = MIB_OBJECT_READ_WRITE;
  60916. 8033826: 2103 movs r1, #3
  60917. 8033828: e002 b.n 8033830 <ip_rteentry_get_object_def+0x44>
  60918. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
  60919. od->v_len = sizeof(s32_t);
  60920. break;
  60921. case 9: /* ipRouteProto */
  60922. od->instance = MIB_OBJECT_TAB;
  60923. 803382a: 2302 movs r3, #2
  60924. 803382c: 7013 strb r3, [r2, #0]
  60925. od->access = MIB_OBJECT_READ_ONLY;
  60926. 803382e: 2101 movs r1, #1
  60927. 8033830: 7051 strb r1, [r2, #1]
  60928. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
  60929. 8033832: 7093 strb r3, [r2, #2]
  60930. od->v_len = sizeof(s32_t);
  60931. 8033834: 2304 movs r3, #4
  60932. 8033836: e006 b.n 8033846 <ip_rteentry_get_object_def+0x5a>
  60933. break;
  60934. case 13: /* ipRouteInfo */
  60935. /** @note returning zeroDotZero (0.0) no routing protocol specific MIB */
  60936. od->instance = MIB_OBJECT_TAB;
  60937. 8033838: 2302 movs r3, #2
  60938. 803383a: 7013 strb r3, [r2, #0]
  60939. od->access = MIB_OBJECT_READ_ONLY;
  60940. 803383c: 2301 movs r3, #1
  60941. 803383e: 7053 strb r3, [r2, #1]
  60942. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID);
  60943. 8033840: 2306 movs r3, #6
  60944. 8033842: 7093 strb r3, [r2, #2]
  60945. od->v_len = iprouteinfo.len * sizeof(s32_t);
  60946. 8033844: 2308 movs r3, #8
  60947. 8033846: 8093 strh r3, [r2, #4]
  60948. break;
  60949. 8033848: 4770 bx lr
  60950. }
  60951. }
  60952. else
  60953. {
  60954. LWIP_DEBUGF(SNMP_MIB_DEBUG,("ip_rteentry_get_object_def: no scalar\n"));
  60955. od->instance = MIB_OBJECT_NONE;
  60956. 803384a: 2300 movs r3, #0
  60957. 803384c: 7013 strb r3, [r2, #0]
  60958. 803384e: 4770 bx lr
  60959. 08033850 <icmp_get_object_def>:
  60960. icmp_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
  60961. {
  60962. /* return to object name, adding index depth (1) */
  60963. ident_len += 1;
  60964. ident -= 1;
  60965. if ((ident_len == 2) &&
  60966. 8033850: 2801 cmp r0, #1
  60967. 8033852: d110 bne.n 8033876 <icmp_get_object_def+0x26>
  60968. (ident[0] > 0) && (ident[0] < 27))
  60969. 8033854: f851 3c04 ldr.w r3, [r1, #-4]
  60970. icmp_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
  60971. {
  60972. /* return to object name, adding index depth (1) */
  60973. ident_len += 1;
  60974. ident -= 1;
  60975. if ((ident_len == 2) &&
  60976. 8033858: 2b00 cmp r3, #0
  60977. 803385a: dd0c ble.n 8033876 <icmp_get_object_def+0x26>
  60978. (ident[0] > 0) && (ident[0] < 27))
  60979. 803385c: 2b1a cmp r3, #26
  60980. 803385e: dc0a bgt.n 8033876 <icmp_get_object_def+0x26>
  60981. {
  60982. od->id_inst_len = ident_len;
  60983. 8033860: 2302 movs r3, #2
  60984. 8033862: 7193 strb r3, [r2, #6]
  60985. od->id_inst_ptr = ident;
  60986. od->instance = MIB_OBJECT_SCALAR;
  60987. od->access = MIB_OBJECT_READ_ONLY;
  60988. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER);
  60989. 8033864: 2341 movs r3, #65 ; 0x41
  60990. static void
  60991. icmp_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
  60992. {
  60993. /* return to object name, adding index depth (1) */
  60994. ident_len += 1;
  60995. ident -= 1;
  60996. 8033866: 3904 subs r1, #4
  60997. od->id_inst_len = ident_len;
  60998. od->id_inst_ptr = ident;
  60999. od->instance = MIB_OBJECT_SCALAR;
  61000. od->access = MIB_OBJECT_READ_ONLY;
  61001. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER);
  61002. 8033868: 7093 strb r3, [r2, #2]
  61003. od->v_len = sizeof(u32_t);
  61004. 803386a: 2304 movs r3, #4
  61005. ident -= 1;
  61006. if ((ident_len == 2) &&
  61007. (ident[0] > 0) && (ident[0] < 27))
  61008. {
  61009. od->id_inst_len = ident_len;
  61010. od->id_inst_ptr = ident;
  61011. 803386c: 6091 str r1, [r2, #8]
  61012. od->instance = MIB_OBJECT_SCALAR;
  61013. 803386e: 7010 strb r0, [r2, #0]
  61014. od->access = MIB_OBJECT_READ_ONLY;
  61015. 8033870: 7050 strb r0, [r2, #1]
  61016. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER);
  61017. od->v_len = sizeof(u32_t);
  61018. 8033872: 8093 strh r3, [r2, #4]
  61019. 8033874: 4770 bx lr
  61020. }
  61021. else
  61022. {
  61023. LWIP_DEBUGF(SNMP_MIB_DEBUG,("icmp_get_object_def: no scalar\n"));
  61024. od->instance = MIB_OBJECT_NONE;
  61025. 8033876: 2300 movs r3, #0
  61026. 8033878: 7013 strb r3, [r2, #0]
  61027. 803387a: 4770 bx lr
  61028. 0803387c <icmp_get_value>:
  61029. u32_t *uint_ptr = (u32_t*)value;
  61030. u8_t id;
  61031. LWIP_UNUSED_ARG(len);
  61032. LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
  61033. id = (u8_t)od->id_inst_ptr[0];
  61034. 803387c: 6883 ldr r3, [r0, #8]
  61035. switch (id)
  61036. 803387e: 781b ldrb r3, [r3, #0]
  61037. 8033880: 3b01 subs r3, #1
  61038. 8033882: 2b19 cmp r3, #25
  61039. 8033884: d843 bhi.n 803390e <icmp_get_value+0x92>
  61040. 8033886: e8df f003 tbb [pc, r3]
  61041. 803388a: 0f0d .short 0x0f0d
  61042. 803388c: 17151311 .word 0x17151311
  61043. 8033890: 1f1d1b19 .word 0x1f1d1b19
  61044. 8033894: 27252321 .word 0x27252321
  61045. 8033898: 2f2d2b29 .word 0x2f2d2b29
  61046. 803389c: 37353331 .word 0x37353331
  61047. 80338a0: 3f3d3b39 .word 0x3f3d3b39
  61048. {
  61049. case 1: /* icmpInMsgs */
  61050. *uint_ptr = icmpinmsgs;
  61051. 80338a4: 4b1a ldr r3, [pc, #104] ; (8033910 <icmp_get_value+0x94>)
  61052. 80338a6: e030 b.n 803390a <icmp_get_value+0x8e>
  61053. break;
  61054. case 2: /* icmpInErrors */
  61055. *uint_ptr = icmpinerrors;
  61056. 80338a8: 4b1a ldr r3, [pc, #104] ; (8033914 <icmp_get_value+0x98>)
  61057. 80338aa: e02e b.n 803390a <icmp_get_value+0x8e>
  61058. break;
  61059. case 3: /* icmpInDestUnreachs */
  61060. *uint_ptr = icmpindestunreachs;
  61061. 80338ac: 4b1a ldr r3, [pc, #104] ; (8033918 <icmp_get_value+0x9c>)
  61062. 80338ae: e02c b.n 803390a <icmp_get_value+0x8e>
  61063. break;
  61064. case 4: /* icmpInTimeExcds */
  61065. *uint_ptr = icmpintimeexcds;
  61066. 80338b0: 4b1a ldr r3, [pc, #104] ; (803391c <icmp_get_value+0xa0>)
  61067. 80338b2: e02a b.n 803390a <icmp_get_value+0x8e>
  61068. break;
  61069. case 5: /* icmpInParmProbs */
  61070. *uint_ptr = icmpinparmprobs;
  61071. 80338b4: 4b1a ldr r3, [pc, #104] ; (8033920 <icmp_get_value+0xa4>)
  61072. 80338b6: e028 b.n 803390a <icmp_get_value+0x8e>
  61073. break;
  61074. case 6: /* icmpInSrcQuenchs */
  61075. *uint_ptr = icmpinsrcquenchs;
  61076. 80338b8: 4b1a ldr r3, [pc, #104] ; (8033924 <icmp_get_value+0xa8>)
  61077. 80338ba: e026 b.n 803390a <icmp_get_value+0x8e>
  61078. break;
  61079. case 7: /* icmpInRedirects */
  61080. *uint_ptr = icmpinredirects;
  61081. 80338bc: 4b1a ldr r3, [pc, #104] ; (8033928 <icmp_get_value+0xac>)
  61082. 80338be: e024 b.n 803390a <icmp_get_value+0x8e>
  61083. break;
  61084. case 8: /* icmpInEchos */
  61085. *uint_ptr = icmpinechos;
  61086. 80338c0: 4b1a ldr r3, [pc, #104] ; (803392c <icmp_get_value+0xb0>)
  61087. 80338c2: e022 b.n 803390a <icmp_get_value+0x8e>
  61088. break;
  61089. case 9: /* icmpInEchoReps */
  61090. *uint_ptr = icmpinechoreps;
  61091. 80338c4: 4b1a ldr r3, [pc, #104] ; (8033930 <icmp_get_value+0xb4>)
  61092. 80338c6: e020 b.n 803390a <icmp_get_value+0x8e>
  61093. break;
  61094. case 10: /* icmpInTimestamps */
  61095. *uint_ptr = icmpintimestamps;
  61096. 80338c8: 4b1a ldr r3, [pc, #104] ; (8033934 <icmp_get_value+0xb8>)
  61097. 80338ca: e01e b.n 803390a <icmp_get_value+0x8e>
  61098. break;
  61099. case 11: /* icmpInTimestampReps */
  61100. *uint_ptr = icmpintimestampreps;
  61101. 80338cc: 4b1a ldr r3, [pc, #104] ; (8033938 <icmp_get_value+0xbc>)
  61102. 80338ce: e01c b.n 803390a <icmp_get_value+0x8e>
  61103. break;
  61104. case 12: /* icmpInAddrMasks */
  61105. *uint_ptr = icmpinaddrmasks;
  61106. 80338d0: 4b1a ldr r3, [pc, #104] ; (803393c <icmp_get_value+0xc0>)
  61107. 80338d2: e01a b.n 803390a <icmp_get_value+0x8e>
  61108. break;
  61109. case 13: /* icmpInAddrMaskReps */
  61110. *uint_ptr = icmpinaddrmaskreps;
  61111. 80338d4: 4b1a ldr r3, [pc, #104] ; (8033940 <icmp_get_value+0xc4>)
  61112. 80338d6: e018 b.n 803390a <icmp_get_value+0x8e>
  61113. break;
  61114. case 14: /* icmpOutMsgs */
  61115. *uint_ptr = icmpoutmsgs;
  61116. 80338d8: 4b1a ldr r3, [pc, #104] ; (8033944 <icmp_get_value+0xc8>)
  61117. 80338da: e016 b.n 803390a <icmp_get_value+0x8e>
  61118. break;
  61119. case 15: /* icmpOutErrors */
  61120. *uint_ptr = icmpouterrors;
  61121. 80338dc: 4b1a ldr r3, [pc, #104] ; (8033948 <icmp_get_value+0xcc>)
  61122. 80338de: e014 b.n 803390a <icmp_get_value+0x8e>
  61123. break;
  61124. case 16: /* icmpOutDestUnreachs */
  61125. *uint_ptr = icmpoutdestunreachs;
  61126. 80338e0: 4b1a ldr r3, [pc, #104] ; (803394c <icmp_get_value+0xd0>)
  61127. 80338e2: e012 b.n 803390a <icmp_get_value+0x8e>
  61128. break;
  61129. case 17: /* icmpOutTimeExcds */
  61130. *uint_ptr = icmpouttimeexcds;
  61131. 80338e4: 4b1a ldr r3, [pc, #104] ; (8033950 <icmp_get_value+0xd4>)
  61132. 80338e6: e010 b.n 803390a <icmp_get_value+0x8e>
  61133. break;
  61134. case 18: /* icmpOutParmProbs */
  61135. *uint_ptr = icmpoutparmprobs;
  61136. 80338e8: 4b1a ldr r3, [pc, #104] ; (8033954 <icmp_get_value+0xd8>)
  61137. 80338ea: e00e b.n 803390a <icmp_get_value+0x8e>
  61138. break;
  61139. case 19: /* icmpOutSrcQuenchs */
  61140. *uint_ptr = icmpoutsrcquenchs;
  61141. 80338ec: 4b1a ldr r3, [pc, #104] ; (8033958 <icmp_get_value+0xdc>)
  61142. 80338ee: e00c b.n 803390a <icmp_get_value+0x8e>
  61143. break;
  61144. case 20: /* icmpOutRedirects */
  61145. *uint_ptr = icmpoutredirects;
  61146. 80338f0: 4b1a ldr r3, [pc, #104] ; (803395c <icmp_get_value+0xe0>)
  61147. 80338f2: e00a b.n 803390a <icmp_get_value+0x8e>
  61148. break;
  61149. case 21: /* icmpOutEchos */
  61150. *uint_ptr = icmpoutechos;
  61151. 80338f4: 4b1a ldr r3, [pc, #104] ; (8033960 <icmp_get_value+0xe4>)
  61152. 80338f6: e008 b.n 803390a <icmp_get_value+0x8e>
  61153. break;
  61154. case 22: /* icmpOutEchoReps */
  61155. *uint_ptr = icmpoutechoreps;
  61156. 80338f8: 4b1a ldr r3, [pc, #104] ; (8033964 <icmp_get_value+0xe8>)
  61157. 80338fa: e006 b.n 803390a <icmp_get_value+0x8e>
  61158. break;
  61159. case 23: /* icmpOutTimestamps */
  61160. *uint_ptr = icmpouttimestamps;
  61161. 80338fc: 4b1a ldr r3, [pc, #104] ; (8033968 <icmp_get_value+0xec>)
  61162. 80338fe: e004 b.n 803390a <icmp_get_value+0x8e>
  61163. break;
  61164. case 24: /* icmpOutTimestampReps */
  61165. *uint_ptr = icmpouttimestampreps;
  61166. 8033900: 4b1a ldr r3, [pc, #104] ; (803396c <icmp_get_value+0xf0>)
  61167. 8033902: e002 b.n 803390a <icmp_get_value+0x8e>
  61168. break;
  61169. case 25: /* icmpOutAddrMasks */
  61170. *uint_ptr = icmpoutaddrmasks;
  61171. 8033904: 4b1a ldr r3, [pc, #104] ; (8033970 <icmp_get_value+0xf4>)
  61172. 8033906: e000 b.n 803390a <icmp_get_value+0x8e>
  61173. break;
  61174. case 26: /* icmpOutAddrMaskReps */
  61175. *uint_ptr = icmpoutaddrmaskreps;
  61176. 8033908: 4b1a ldr r3, [pc, #104] ; (8033974 <icmp_get_value+0xf8>)
  61177. 803390a: 681b ldr r3, [r3, #0]
  61178. 803390c: 6013 str r3, [r2, #0]
  61179. 803390e: 4770 bx lr
  61180. 8033910: 2000c4b8 .word 0x2000c4b8
  61181. 8033914: 2000c4b4 .word 0x2000c4b4
  61182. 8033918: 2000c490 .word 0x2000c490
  61183. 803391c: 2000c574 .word 0x2000c574
  61184. 8033920: 2000c5a8 .word 0x2000c5a8
  61185. 8033924: 2000c4a0 .word 0x2000c4a0
  61186. 8033928: 2000c4cc .word 0x2000c4cc
  61187. 803392c: 2000c56c .word 0x2000c56c
  61188. 8033930: 2000c4e4 .word 0x2000c4e4
  61189. 8033934: 2000c4d4 .word 0x2000c4d4
  61190. 8033938: 2000c514 .word 0x2000c514
  61191. 803393c: 2000c5ac .word 0x2000c5ac
  61192. 8033940: 2000c548 .word 0x2000c548
  61193. 8033944: 2000c538 .word 0x2000c538
  61194. 8033948: 2000c5bc .word 0x2000c5bc
  61195. 803394c: 2000c550 .word 0x2000c550
  61196. 8033950: 2000c504 .word 0x2000c504
  61197. 8033954: 2000c4c8 .word 0x2000c4c8
  61198. 8033958: 2000c51c .word 0x2000c51c
  61199. 803395c: 2000c4d8 .word 0x2000c4d8
  61200. 8033960: 2000c5b8 .word 0x2000c5b8
  61201. 8033964: 2000c558 .word 0x2000c558
  61202. 8033968: 2000c524 .word 0x2000c524
  61203. 803396c: 2000c508 .word 0x2000c508
  61204. 8033970: 2000c4d0 .word 0x2000c4d0
  61205. 8033974: 2000c530 .word 0x2000c530
  61206. 08033978 <tcp_get_value>:
  61207. s32_t *sint_ptr = (s32_t*)value;
  61208. u8_t id;
  61209. LWIP_UNUSED_ARG(len);
  61210. LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
  61211. id = (u8_t)od->id_inst_ptr[0];
  61212. 8033978: 6883 ldr r3, [r0, #8]
  61213. switch (id)
  61214. 803397a: 781b ldrb r3, [r3, #0]
  61215. 803397c: 3b01 subs r3, #1
  61216. 803397e: 2b0e cmp r3, #14
  61217. 8033980: d836 bhi.n 80339f0 <tcp_get_value+0x78>
  61218. 8033982: e8df f003 tbb [pc, r3]
  61219. 8033986: 0a08 .short 0x0a08
  61220. 8033988: 1412100d .word 0x1412100d
  61221. 803398c: 2a1a1816 .word 0x2a1a1816
  61222. 8033990: 30352e2c .word 0x30352e2c
  61223. 8033994: 32 .byte 0x32
  61224. 8033995: 00 .byte 0x00
  61225. {
  61226. case 1: /* tcpRtoAlgorithm, vanj(4) */
  61227. *sint_ptr = 4;
  61228. 8033996: 2304 movs r3, #4
  61229. 8033998: e029 b.n 80339ee <tcp_get_value+0x76>
  61230. break;
  61231. case 2: /* tcpRtoMin */
  61232. /* @todo not the actual value, a guess,
  61233. needs to be calculated */
  61234. *sint_ptr = 1000;
  61235. 803399a: f44f 737a mov.w r3, #1000 ; 0x3e8
  61236. 803399e: e026 b.n 80339ee <tcp_get_value+0x76>
  61237. break;
  61238. case 3: /* tcpRtoMax */
  61239. /* @todo not the actual value, a guess,
  61240. needs to be calculated */
  61241. *sint_ptr = 60000;
  61242. 80339a0: f64e 2360 movw r3, #60000 ; 0xea60
  61243. 80339a4: e023 b.n 80339ee <tcp_get_value+0x76>
  61244. break;
  61245. case 4: /* tcpMaxConn */
  61246. *sint_ptr = MEMP_NUM_TCP_PCB;
  61247. 80339a6: 230c movs r3, #12
  61248. 80339a8: e021 b.n 80339ee <tcp_get_value+0x76>
  61249. break;
  61250. case 5: /* tcpActiveOpens */
  61251. *uint_ptr = tcpactiveopens;
  61252. 80339aa: 4b12 ldr r3, [pc, #72] ; (80339f4 <tcp_get_value+0x7c>)
  61253. 80339ac: e01e b.n 80339ec <tcp_get_value+0x74>
  61254. break;
  61255. case 6: /* tcpPassiveOpens */
  61256. *uint_ptr = tcppassiveopens;
  61257. 80339ae: 4b12 ldr r3, [pc, #72] ; (80339f8 <tcp_get_value+0x80>)
  61258. 80339b0: e01c b.n 80339ec <tcp_get_value+0x74>
  61259. break;
  61260. case 7: /* tcpAttemptFails */
  61261. *uint_ptr = tcpattemptfails;
  61262. 80339b2: 4b12 ldr r3, [pc, #72] ; (80339fc <tcp_get_value+0x84>)
  61263. 80339b4: e01a b.n 80339ec <tcp_get_value+0x74>
  61264. break;
  61265. case 8: /* tcpEstabResets */
  61266. *uint_ptr = tcpestabresets;
  61267. 80339b6: 4b12 ldr r3, [pc, #72] ; (8033a00 <tcp_get_value+0x88>)
  61268. 80339b8: e018 b.n 80339ec <tcp_get_value+0x74>
  61269. break;
  61270. case 9: /* tcpCurrEstab */
  61271. {
  61272. u16_t tcpcurrestab = 0;
  61273. struct tcp_pcb *pcb = tcp_active_pcbs;
  61274. 80339ba: 4b12 ldr r3, [pc, #72] ; (8033a04 <tcp_get_value+0x8c>)
  61275. case 8: /* tcpEstabResets */
  61276. *uint_ptr = tcpestabresets;
  61277. break;
  61278. case 9: /* tcpCurrEstab */
  61279. {
  61280. u16_t tcpcurrestab = 0;
  61281. 80339bc: 2100 movs r1, #0
  61282. struct tcp_pcb *pcb = tcp_active_pcbs;
  61283. 80339be: 681b ldr r3, [r3, #0]
  61284. while (pcb != NULL)
  61285. 80339c0: e007 b.n 80339d2 <tcp_get_value+0x5a>
  61286. {
  61287. if ((pcb->state == ESTABLISHED) ||
  61288. 80339c2: 7e18 ldrb r0, [r3, #24]
  61289. 80339c4: 2804 cmp r0, #4
  61290. 80339c6: d001 beq.n 80339cc <tcp_get_value+0x54>
  61291. 80339c8: 2807 cmp r0, #7
  61292. 80339ca: d101 bne.n 80339d0 <tcp_get_value+0x58>
  61293. (pcb->state == CLOSE_WAIT))
  61294. {
  61295. tcpcurrestab++;
  61296. 80339cc: 3101 adds r1, #1
  61297. 80339ce: b289 uxth r1, r1
  61298. }
  61299. pcb = pcb->next;
  61300. 80339d0: 68db ldr r3, [r3, #12]
  61301. break;
  61302. case 9: /* tcpCurrEstab */
  61303. {
  61304. u16_t tcpcurrestab = 0;
  61305. struct tcp_pcb *pcb = tcp_active_pcbs;
  61306. while (pcb != NULL)
  61307. 80339d2: 2b00 cmp r3, #0
  61308. 80339d4: d1f5 bne.n 80339c2 <tcp_get_value+0x4a>
  61309. {
  61310. tcpcurrestab++;
  61311. }
  61312. pcb = pcb->next;
  61313. }
  61314. *uint_ptr = tcpcurrestab;
  61315. 80339d6: 6011 str r1, [r2, #0]
  61316. }
  61317. break;
  61318. 80339d8: 4770 bx lr
  61319. case 10: /* tcpInSegs */
  61320. *uint_ptr = tcpinsegs;
  61321. 80339da: 4b0b ldr r3, [pc, #44] ; (8033a08 <tcp_get_value+0x90>)
  61322. 80339dc: e006 b.n 80339ec <tcp_get_value+0x74>
  61323. break;
  61324. case 11: /* tcpOutSegs */
  61325. *uint_ptr = tcpoutsegs;
  61326. 80339de: 4b0b ldr r3, [pc, #44] ; (8033a0c <tcp_get_value+0x94>)
  61327. 80339e0: e004 b.n 80339ec <tcp_get_value+0x74>
  61328. break;
  61329. case 12: /* tcpRetransSegs */
  61330. *uint_ptr = tcpretranssegs;
  61331. 80339e2: 4b0b ldr r3, [pc, #44] ; (8033a10 <tcp_get_value+0x98>)
  61332. 80339e4: e002 b.n 80339ec <tcp_get_value+0x74>
  61333. break;
  61334. case 14: /* tcpInErrs */
  61335. *uint_ptr = tcpinerrs;
  61336. 80339e6: 4b0b ldr r3, [pc, #44] ; (8033a14 <tcp_get_value+0x9c>)
  61337. 80339e8: e000 b.n 80339ec <tcp_get_value+0x74>
  61338. break;
  61339. case 15: /* tcpOutRsts */
  61340. *uint_ptr = tcpoutrsts;
  61341. 80339ea: 4b0b ldr r3, [pc, #44] ; (8033a18 <tcp_get_value+0xa0>)
  61342. 80339ec: 681b ldr r3, [r3, #0]
  61343. 80339ee: 6013 str r3, [r2, #0]
  61344. 80339f0: 4770 bx lr
  61345. 80339f2: bf00 nop
  61346. 80339f4: 2000c4ac .word 0x2000c4ac
  61347. 80339f8: 2000c4e0 .word 0x2000c4e0
  61348. 80339fc: 2000c52c .word 0x2000c52c
  61349. 8033a00: 2000c4c0 .word 0x2000c4c0
  61350. 8033a04: 2000ff20 .word 0x2000ff20
  61351. 8033a08: 2000c53c .word 0x2000c53c
  61352. 8033a0c: 2000c588 .word 0x2000c588
  61353. 8033a10: 2000c55c .word 0x2000c55c
  61354. 8033a14: 2000c4e8 .word 0x2000c4e8
  61355. 8033a18: 2000c54c .word 0x2000c54c
  61356. 08033a1c <udp_get_object_def>:
  61357. udp_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
  61358. {
  61359. /* return to object name, adding index depth (1) */
  61360. ident_len += 1;
  61361. ident -= 1;
  61362. if ((ident_len == 2) &&
  61363. 8033a1c: 2801 cmp r0, #1
  61364. 8033a1e: d110 bne.n 8033a42 <udp_get_object_def+0x26>
  61365. (ident[0] > 0) && (ident[0] < 6))
  61366. 8033a20: f851 3c04 ldr.w r3, [r1, #-4]
  61367. udp_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
  61368. {
  61369. /* return to object name, adding index depth (1) */
  61370. ident_len += 1;
  61371. ident -= 1;
  61372. if ((ident_len == 2) &&
  61373. 8033a24: 2b00 cmp r3, #0
  61374. 8033a26: dd0c ble.n 8033a42 <udp_get_object_def+0x26>
  61375. (ident[0] > 0) && (ident[0] < 6))
  61376. 8033a28: 2b05 cmp r3, #5
  61377. 8033a2a: dc0a bgt.n 8033a42 <udp_get_object_def+0x26>
  61378. {
  61379. od->id_inst_len = ident_len;
  61380. 8033a2c: 2302 movs r3, #2
  61381. 8033a2e: 7193 strb r3, [r2, #6]
  61382. od->id_inst_ptr = ident;
  61383. od->instance = MIB_OBJECT_SCALAR;
  61384. od->access = MIB_OBJECT_READ_ONLY;
  61385. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER);
  61386. 8033a30: 2341 movs r3, #65 ; 0x41
  61387. static void
  61388. udp_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
  61389. {
  61390. /* return to object name, adding index depth (1) */
  61391. ident_len += 1;
  61392. ident -= 1;
  61393. 8033a32: 3904 subs r1, #4
  61394. od->id_inst_len = ident_len;
  61395. od->id_inst_ptr = ident;
  61396. od->instance = MIB_OBJECT_SCALAR;
  61397. od->access = MIB_OBJECT_READ_ONLY;
  61398. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER);
  61399. 8033a34: 7093 strb r3, [r2, #2]
  61400. od->v_len = sizeof(u32_t);
  61401. 8033a36: 2304 movs r3, #4
  61402. ident -= 1;
  61403. if ((ident_len == 2) &&
  61404. (ident[0] > 0) && (ident[0] < 6))
  61405. {
  61406. od->id_inst_len = ident_len;
  61407. od->id_inst_ptr = ident;
  61408. 8033a38: 6091 str r1, [r2, #8]
  61409. od->instance = MIB_OBJECT_SCALAR;
  61410. 8033a3a: 7010 strb r0, [r2, #0]
  61411. od->access = MIB_OBJECT_READ_ONLY;
  61412. 8033a3c: 7050 strb r0, [r2, #1]
  61413. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER);
  61414. od->v_len = sizeof(u32_t);
  61415. 8033a3e: 8093 strh r3, [r2, #4]
  61416. 8033a40: 4770 bx lr
  61417. }
  61418. else
  61419. {
  61420. LWIP_DEBUGF(SNMP_MIB_DEBUG,("udp_get_object_def: no scalar\n"));
  61421. od->instance = MIB_OBJECT_NONE;
  61422. 8033a42: 2300 movs r3, #0
  61423. 8033a44: 7013 strb r3, [r2, #0]
  61424. 8033a46: 4770 bx lr
  61425. 08033a48 <udp_get_value>:
  61426. u32_t *uint_ptr = (u32_t*)value;
  61427. u8_t id;
  61428. LWIP_UNUSED_ARG(len);
  61429. LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
  61430. id = (u8_t)od->id_inst_ptr[0];
  61431. 8033a48: 6883 ldr r3, [r0, #8]
  61432. switch (id)
  61433. 8033a4a: 781b ldrb r3, [r3, #0]
  61434. 8033a4c: 3b01 subs r3, #1
  61435. 8033a4e: 2b03 cmp r3, #3
  61436. 8033a50: d80c bhi.n 8033a6c <udp_get_value+0x24>
  61437. 8033a52: e8df f003 tbb [pc, r3]
  61438. 8033a56: 0402 .short 0x0402
  61439. 8033a58: 0806 .short 0x0806
  61440. {
  61441. case 1: /* udpInDatagrams */
  61442. *uint_ptr = udpindatagrams;
  61443. 8033a5a: 4b05 ldr r3, [pc, #20] ; (8033a70 <udp_get_value+0x28>)
  61444. 8033a5c: e004 b.n 8033a68 <udp_get_value+0x20>
  61445. break;
  61446. case 2: /* udpNoPorts */
  61447. *uint_ptr = udpnoports;
  61448. 8033a5e: 4b05 ldr r3, [pc, #20] ; (8033a74 <udp_get_value+0x2c>)
  61449. 8033a60: e002 b.n 8033a68 <udp_get_value+0x20>
  61450. break;
  61451. case 3: /* udpInErrors */
  61452. *uint_ptr = udpinerrors;
  61453. 8033a62: 4b05 ldr r3, [pc, #20] ; (8033a78 <udp_get_value+0x30>)
  61454. 8033a64: e000 b.n 8033a68 <udp_get_value+0x20>
  61455. break;
  61456. case 4: /* udpOutDatagrams */
  61457. *uint_ptr = udpoutdatagrams;
  61458. 8033a66: 4b05 ldr r3, [pc, #20] ; (8033a7c <udp_get_value+0x34>)
  61459. 8033a68: 681b ldr r3, [r3, #0]
  61460. 8033a6a: 6013 str r3, [r2, #0]
  61461. 8033a6c: 4770 bx lr
  61462. 8033a6e: bf00 nop
  61463. 8033a70: 2000c568 .word 0x2000c568
  61464. 8033a74: 2000c520 .word 0x2000c520
  61465. 8033a78: 2000c590 .word 0x2000c590
  61466. 8033a7c: 2000c518 .word 0x2000c518
  61467. 08033a80 <snmp_get_value>:
  61468. u32_t *uint_ptr = (u32_t*)value;
  61469. u8_t id;
  61470. LWIP_UNUSED_ARG(len);
  61471. LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
  61472. id = (u8_t)od->id_inst_ptr[0];
  61473. 8033a80: 6883 ldr r3, [r0, #8]
  61474. switch (id)
  61475. 8033a82: 781b ldrb r3, [r3, #0]
  61476. 8033a84: 3b01 subs r3, #1
  61477. 8033a86: 2b1d cmp r3, #29
  61478. 8033a88: d84b bhi.n 8033b22 <snmp_get_value+0xa2>
  61479. 8033a8a: e8df f003 tbb [pc, r3]
  61480. 8033a8e: 110f .short 0x110f
  61481. 8033a90: 19171513 .word 0x19171513
  61482. 8033a94: 1f1d1b4a .word 0x1f1d1b4a
  61483. 8033a98: 27252321 .word 0x27252321
  61484. 8033a9c: 2f2d2b29 .word 0x2f2d2b29
  61485. 8033aa0: 37353331 .word 0x37353331
  61486. 8033aa4: 3d3b394a .word 0x3d3b394a
  61487. 8033aa8: 4643413f .word 0x4643413f
  61488. {
  61489. case 1: /* snmpInPkts */
  61490. *uint_ptr = snmpinpkts;
  61491. 8033aac: 4b1d ldr r3, [pc, #116] ; (8033b24 <snmp_get_value+0xa4>)
  61492. 8033aae: e032 b.n 8033b16 <snmp_get_value+0x96>
  61493. break;
  61494. case 2: /* snmpOutPkts */
  61495. *uint_ptr = snmpoutpkts;
  61496. 8033ab0: 4b1d ldr r3, [pc, #116] ; (8033b28 <snmp_get_value+0xa8>)
  61497. 8033ab2: e030 b.n 8033b16 <snmp_get_value+0x96>
  61498. break;
  61499. case 3: /* snmpInBadVersions */
  61500. *uint_ptr = snmpinbadversions;
  61501. 8033ab4: 4b1d ldr r3, [pc, #116] ; (8033b2c <snmp_get_value+0xac>)
  61502. 8033ab6: e02e b.n 8033b16 <snmp_get_value+0x96>
  61503. break;
  61504. case 4: /* snmpInBadCommunityNames */
  61505. *uint_ptr = snmpinbadcommunitynames;
  61506. 8033ab8: 4b1d ldr r3, [pc, #116] ; (8033b30 <snmp_get_value+0xb0>)
  61507. 8033aba: e02c b.n 8033b16 <snmp_get_value+0x96>
  61508. break;
  61509. case 5: /* snmpInBadCommunityUses */
  61510. *uint_ptr = snmpinbadcommunityuses;
  61511. 8033abc: 4b1d ldr r3, [pc, #116] ; (8033b34 <snmp_get_value+0xb4>)
  61512. 8033abe: e02a b.n 8033b16 <snmp_get_value+0x96>
  61513. break;
  61514. case 6: /* snmpInASNParseErrs */
  61515. *uint_ptr = snmpinasnparseerrs;
  61516. 8033ac0: 4b1d ldr r3, [pc, #116] ; (8033b38 <snmp_get_value+0xb8>)
  61517. 8033ac2: e028 b.n 8033b16 <snmp_get_value+0x96>
  61518. break;
  61519. case 8: /* snmpInTooBigs */
  61520. *uint_ptr = snmpintoobigs;
  61521. 8033ac4: 4b1d ldr r3, [pc, #116] ; (8033b3c <snmp_get_value+0xbc>)
  61522. 8033ac6: e026 b.n 8033b16 <snmp_get_value+0x96>
  61523. break;
  61524. case 9: /* snmpInNoSuchNames */
  61525. *uint_ptr = snmpinnosuchnames;
  61526. 8033ac8: 4b1d ldr r3, [pc, #116] ; (8033b40 <snmp_get_value+0xc0>)
  61527. 8033aca: e024 b.n 8033b16 <snmp_get_value+0x96>
  61528. break;
  61529. case 10: /* snmpInBadValues */
  61530. *uint_ptr = snmpinbadvalues;
  61531. 8033acc: 4b1d ldr r3, [pc, #116] ; (8033b44 <snmp_get_value+0xc4>)
  61532. 8033ace: e022 b.n 8033b16 <snmp_get_value+0x96>
  61533. break;
  61534. case 11: /* snmpInReadOnlys */
  61535. *uint_ptr = snmpinreadonlys;
  61536. 8033ad0: 4b1d ldr r3, [pc, #116] ; (8033b48 <snmp_get_value+0xc8>)
  61537. 8033ad2: e020 b.n 8033b16 <snmp_get_value+0x96>
  61538. break;
  61539. case 12: /* snmpInGenErrs */
  61540. *uint_ptr = snmpingenerrs;
  61541. 8033ad4: 4b1d ldr r3, [pc, #116] ; (8033b4c <snmp_get_value+0xcc>)
  61542. 8033ad6: e01e b.n 8033b16 <snmp_get_value+0x96>
  61543. break;
  61544. case 13: /* snmpInTotalReqVars */
  61545. *uint_ptr = snmpintotalreqvars;
  61546. 8033ad8: 4b1d ldr r3, [pc, #116] ; (8033b50 <snmp_get_value+0xd0>)
  61547. 8033ada: e01c b.n 8033b16 <snmp_get_value+0x96>
  61548. break;
  61549. case 14: /* snmpInTotalSetVars */
  61550. *uint_ptr = snmpintotalsetvars;
  61551. 8033adc: 4b1d ldr r3, [pc, #116] ; (8033b54 <snmp_get_value+0xd4>)
  61552. 8033ade: e01a b.n 8033b16 <snmp_get_value+0x96>
  61553. break;
  61554. case 15: /* snmpInGetRequests */
  61555. *uint_ptr = snmpingetrequests;
  61556. 8033ae0: 4b1d ldr r3, [pc, #116] ; (8033b58 <snmp_get_value+0xd8>)
  61557. 8033ae2: e018 b.n 8033b16 <snmp_get_value+0x96>
  61558. break;
  61559. case 16: /* snmpInGetNexts */
  61560. *uint_ptr = snmpingetnexts;
  61561. 8033ae4: 4b1d ldr r3, [pc, #116] ; (8033b5c <snmp_get_value+0xdc>)
  61562. 8033ae6: e016 b.n 8033b16 <snmp_get_value+0x96>
  61563. break;
  61564. case 17: /* snmpInSetRequests */
  61565. *uint_ptr = snmpinsetrequests;
  61566. 8033ae8: 4b1d ldr r3, [pc, #116] ; (8033b60 <snmp_get_value+0xe0>)
  61567. 8033aea: e014 b.n 8033b16 <snmp_get_value+0x96>
  61568. break;
  61569. case 18: /* snmpInGetResponses */
  61570. *uint_ptr = snmpingetresponses;
  61571. 8033aec: 4b1d ldr r3, [pc, #116] ; (8033b64 <snmp_get_value+0xe4>)
  61572. 8033aee: e012 b.n 8033b16 <snmp_get_value+0x96>
  61573. break;
  61574. case 19: /* snmpInTraps */
  61575. *uint_ptr = snmpintraps;
  61576. 8033af0: 4b1d ldr r3, [pc, #116] ; (8033b68 <snmp_get_value+0xe8>)
  61577. 8033af2: e010 b.n 8033b16 <snmp_get_value+0x96>
  61578. break;
  61579. case 20: /* snmpOutTooBigs */
  61580. *uint_ptr = snmpouttoobigs;
  61581. 8033af4: 4b1d ldr r3, [pc, #116] ; (8033b6c <snmp_get_value+0xec>)
  61582. 8033af6: e00e b.n 8033b16 <snmp_get_value+0x96>
  61583. break;
  61584. case 21: /* snmpOutNoSuchNames */
  61585. *uint_ptr = snmpoutnosuchnames;
  61586. 8033af8: 4b1d ldr r3, [pc, #116] ; (8033b70 <snmp_get_value+0xf0>)
  61587. 8033afa: e00c b.n 8033b16 <snmp_get_value+0x96>
  61588. break;
  61589. case 22: /* snmpOutBadValues */
  61590. *uint_ptr = snmpoutbadvalues;
  61591. 8033afc: 4b1d ldr r3, [pc, #116] ; (8033b74 <snmp_get_value+0xf4>)
  61592. 8033afe: e00a b.n 8033b16 <snmp_get_value+0x96>
  61593. break;
  61594. case 24: /* snmpOutGenErrs */
  61595. *uint_ptr = snmpoutgenerrs;
  61596. 8033b00: 4b1d ldr r3, [pc, #116] ; (8033b78 <snmp_get_value+0xf8>)
  61597. 8033b02: e008 b.n 8033b16 <snmp_get_value+0x96>
  61598. break;
  61599. case 25: /* snmpOutGetRequests */
  61600. *uint_ptr = snmpoutgetrequests;
  61601. 8033b04: 4b1d ldr r3, [pc, #116] ; (8033b7c <snmp_get_value+0xfc>)
  61602. 8033b06: e006 b.n 8033b16 <snmp_get_value+0x96>
  61603. break;
  61604. case 26: /* snmpOutGetNexts */
  61605. *uint_ptr = snmpoutgetnexts;
  61606. 8033b08: 4b1d ldr r3, [pc, #116] ; (8033b80 <snmp_get_value+0x100>)
  61607. 8033b0a: e004 b.n 8033b16 <snmp_get_value+0x96>
  61608. break;
  61609. case 27: /* snmpOutSetRequests */
  61610. *uint_ptr = snmpoutsetrequests;
  61611. 8033b0c: 4b1d ldr r3, [pc, #116] ; (8033b84 <snmp_get_value+0x104>)
  61612. 8033b0e: e002 b.n 8033b16 <snmp_get_value+0x96>
  61613. break;
  61614. case 28: /* snmpOutGetResponses */
  61615. *uint_ptr = snmpoutgetresponses;
  61616. 8033b10: 4b1d ldr r3, [pc, #116] ; (8033b88 <snmp_get_value+0x108>)
  61617. 8033b12: e000 b.n 8033b16 <snmp_get_value+0x96>
  61618. break;
  61619. case 29: /* snmpOutTraps */
  61620. *uint_ptr = snmpouttraps;
  61621. 8033b14: 4b1d ldr r3, [pc, #116] ; (8033b8c <snmp_get_value+0x10c>)
  61622. 8033b16: 681b ldr r3, [r3, #0]
  61623. 8033b18: e002 b.n 8033b20 <snmp_get_value+0xa0>
  61624. break;
  61625. case 30: /* snmpEnableAuthenTraps */
  61626. *uint_ptr = *snmpenableauthentraps_ptr;
  61627. 8033b1a: 4b1d ldr r3, [pc, #116] ; (8033b90 <snmp_get_value+0x110>)
  61628. 8033b1c: 681b ldr r3, [r3, #0]
  61629. 8033b1e: 781b ldrb r3, [r3, #0]
  61630. 8033b20: 6013 str r3, [r2, #0]
  61631. 8033b22: 4770 bx lr
  61632. 8033b24: 2000c4c4 .word 0x2000c4c4
  61633. 8033b28: 2000c594 .word 0x2000c594
  61634. 8033b2c: 2000c580 .word 0x2000c580
  61635. 8033b30: 2000c498 .word 0x2000c498
  61636. 8033b34: 2000c49c .word 0x2000c49c
  61637. 8033b38: 2000c584 .word 0x2000c584
  61638. 8033b3c: 2000c544 .word 0x2000c544
  61639. 8033b40: 2000c5c4 .word 0x2000c5c4
  61640. 8033b44: 2000c560 .word 0x2000c560
  61641. 8033b48: 2000c534 .word 0x2000c534
  61642. 8033b4c: 2000c50c .word 0x2000c50c
  61643. 8033b50: 2000c564 .word 0x2000c564
  61644. 8033b54: 2000c4a4 .word 0x2000c4a4
  61645. 8033b58: 2000c4f8 .word 0x2000c4f8
  61646. 8033b5c: 2000c47c .word 0x2000c47c
  61647. 8033b60: 2000c5a0 .word 0x2000c5a0
  61648. 8033b64: 2000c4f4 .word 0x2000c4f4
  61649. 8033b68: 2000c48c .word 0x2000c48c
  61650. 8033b6c: 2000c4dc .word 0x2000c4dc
  61651. 8033b70: 2000c4a8 .word 0x2000c4a8
  61652. 8033b74: 2000c488 .word 0x2000c488
  61653. 8033b78: 2000c5c8 .word 0x2000c5c8
  61654. 8033b7c: 2000c500 .word 0x2000c500
  61655. 8033b80: 2000c598 .word 0x2000c598
  61656. 8033b84: 2000c5a4 .word 0x2000c5a4
  61657. 8033b88: 2000c484 .word 0x2000c484
  61658. 8033b8c: 2000c4fc .word 0x2000c4fc
  61659. 8033b90: 200008a8 .word 0x200008a8
  61660. 08033b94 <snmp_set_value>:
  61661. {
  61662. u8_t id;
  61663. LWIP_UNUSED_ARG(len);
  61664. LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
  61665. id = (u8_t)od->id_inst_ptr[0];
  61666. 8033b94: 6883 ldr r3, [r0, #8]
  61667. if (id == 30)
  61668. 8033b96: 781b ldrb r3, [r3, #0]
  61669. 8033b98: 2b1e cmp r3, #30
  61670. 8033b9a: d103 bne.n 8033ba4 <snmp_set_value+0x10>
  61671. {
  61672. /* snmpEnableAuthenTraps */
  61673. /* @todo @fixme: which kind of pointer is 'value'? s32_t or u8_t??? */
  61674. u8_t *ptr = (u8_t*)value;
  61675. *snmpenableauthentraps_ptr = *ptr;
  61676. 8033b9c: 4b02 ldr r3, [pc, #8] ; (8033ba8 <snmp_set_value+0x14>)
  61677. 8033b9e: 7812 ldrb r2, [r2, #0]
  61678. 8033ba0: 681b ldr r3, [r3, #0]
  61679. 8033ba2: 701a strb r2, [r3, #0]
  61680. 8033ba4: 4770 bx lr
  61681. 8033ba6: bf00 nop
  61682. 8033ba8: 200008a8 .word 0x200008a8
  61683. 08033bac <ifentry_get_object_def>:
  61684. u8_t id;
  61685. /* return to object name, adding index depth (1) */
  61686. ident_len += 1;
  61687. ident -= 1;
  61688. if (ident_len == 2)
  61689. 8033bac: 2801 cmp r0, #1
  61690. * @param ident points to objectname.index
  61691. * @param od points to object definition.
  61692. */
  61693. static void
  61694. ifentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
  61695. {
  61696. 8033bae: b513 push {r0, r1, r4, lr}
  61697. 8033bb0: 4614 mov r4, r2
  61698. u8_t id;
  61699. /* return to object name, adding index depth (1) */
  61700. ident_len += 1;
  61701. ident -= 1;
  61702. if (ident_len == 2)
  61703. 8033bb2: d149 bne.n 8033c48 <ifentry_get_object_def+0x9c>
  61704. {
  61705. od->id_inst_len = ident_len;
  61706. 8033bb4: 2302 movs r3, #2
  61707. 8033bb6: 7193 strb r3, [r2, #6]
  61708. {
  61709. u8_t id;
  61710. /* return to object name, adding index depth (1) */
  61711. ident_len += 1;
  61712. ident -= 1;
  61713. 8033bb8: 1f0a subs r2, r1, #4
  61714. if (ident_len == 2)
  61715. {
  61716. od->id_inst_len = ident_len;
  61717. od->id_inst_ptr = ident;
  61718. 8033bba: 60a2 str r2, [r4, #8]
  61719. LWIP_ASSERT("invalid id", (ident[0] >= 0) && (ident[0] <= 0xff));
  61720. id = (u8_t)ident[0];
  61721. LWIP_DEBUGF(SNMP_MIB_DEBUG,("get_object_def ifentry.%"U16_F"\n",(u16_t)id));
  61722. switch (id)
  61723. 8033bbc: f811 2c04 ldrb.w r2, [r1, #-4]
  61724. 8033bc0: 3a01 subs r2, #1
  61725. 8033bc2: 2a15 cmp r2, #21
  61726. 8033bc4: d840 bhi.n 8033c48 <ifentry_get_object_def+0x9c>
  61727. 8033bc6: e8df f002 tbb [pc, r2]
  61728. 8033bca: 0e0b .short 0x0e0b
  61729. 8033bcc: 19140b0b .word 0x19140b0b
  61730. 8033bd0: 302b0b27 .word 0x302b0b27
  61731. 8033bd4: 30303030 .word 0x30303030
  61732. 8033bd8: 30303030 .word 0x30303030
  61733. 8033bdc: 37143030 .word 0x37143030
  61734. {
  61735. case 1: /* ifIndex */
  61736. case 3: /* ifType */
  61737. case 4: /* ifMtu */
  61738. case 8: /* ifOperStatus */
  61739. od->instance = MIB_OBJECT_TAB;
  61740. 8033be0: 7023 strb r3, [r4, #0]
  61741. od->access = MIB_OBJECT_READ_ONLY;
  61742. 8033be2: 2201 movs r2, #1
  61743. 8033be4: e01a b.n 8033c1c <ifentry_get_object_def+0x70>
  61744. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
  61745. od->v_len = sizeof(s32_t);
  61746. break;
  61747. case 2: /* ifDescr */
  61748. od->instance = MIB_OBJECT_TAB;
  61749. od->access = MIB_OBJECT_READ_ONLY;
  61750. 8033be6: 2201 movs r2, #1
  61751. 8033be8: 7062 strb r2, [r4, #1]
  61752. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR);
  61753. 8033bea: 2204 movs r2, #4
  61754. od->access = MIB_OBJECT_READ_ONLY;
  61755. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
  61756. od->v_len = sizeof(s32_t);
  61757. break;
  61758. case 2: /* ifDescr */
  61759. od->instance = MIB_OBJECT_TAB;
  61760. 8033bec: 7023 strb r3, [r4, #0]
  61761. od->access = MIB_OBJECT_READ_ONLY;
  61762. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR);
  61763. 8033bee: 70a2 strb r2, [r4, #2]
  61764. 8033bf0: e028 b.n 8033c44 <ifentry_get_object_def+0x98>
  61765. /** @todo this should be some sort of sizeof(struct netif.name) */
  61766. od->v_len = 2;
  61767. break;
  61768. case 5: /* ifSpeed */
  61769. case 21: /* ifOutQLen */
  61770. od->instance = MIB_OBJECT_TAB;
  61771. 8033bf2: 7023 strb r3, [r4, #0]
  61772. od->access = MIB_OBJECT_READ_ONLY;
  61773. 8033bf4: 2301 movs r3, #1
  61774. 8033bf6: 7063 strb r3, [r4, #1]
  61775. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_GAUGE);
  61776. 8033bf8: 2342 movs r3, #66 ; 0x42
  61777. 8033bfa: e01a b.n 8033c32 <ifentry_get_object_def+0x86>
  61778. break;
  61779. case 6: /* ifPhysAddress */
  61780. {
  61781. struct netif *netif;
  61782. snmp_ifindextonetif(ident[1], &netif);
  61783. 8033bfc: 6808 ldr r0, [r1, #0]
  61784. 8033bfe: a901 add r1, sp, #4
  61785. 8033c00: f001 f81c bl 8034c3c <snmp_ifindextonetif>
  61786. od->instance = MIB_OBJECT_TAB;
  61787. 8033c04: 2302 movs r3, #2
  61788. 8033c06: 7023 strb r3, [r4, #0]
  61789. od->access = MIB_OBJECT_READ_ONLY;
  61790. 8033c08: 2301 movs r3, #1
  61791. 8033c0a: 7063 strb r3, [r4, #1]
  61792. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR);
  61793. 8033c0c: 2304 movs r3, #4
  61794. 8033c0e: 70a3 strb r3, [r4, #2]
  61795. od->v_len = netif->hwaddr_len;
  61796. 8033c10: 9b01 ldr r3, [sp, #4]
  61797. 8033c12: f893 3026 ldrb.w r3, [r3, #38] ; 0x26
  61798. 8033c16: e015 b.n 8033c44 <ifentry_get_object_def+0x98>
  61799. }
  61800. break;
  61801. case 7: /* ifAdminStatus */
  61802. od->instance = MIB_OBJECT_TAB;
  61803. 8033c18: 7023 strb r3, [r4, #0]
  61804. od->access = MIB_OBJECT_READ_WRITE;
  61805. 8033c1a: 2203 movs r2, #3
  61806. 8033c1c: 7062 strb r2, [r4, #1]
  61807. 8033c1e: e008 b.n 8033c32 <ifentry_get_object_def+0x86>
  61808. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
  61809. od->v_len = sizeof(s32_t);
  61810. break;
  61811. case 9: /* ifLastChange */
  61812. od->instance = MIB_OBJECT_TAB;
  61813. 8033c20: 7023 strb r3, [r4, #0]
  61814. od->access = MIB_OBJECT_READ_ONLY;
  61815. 8033c22: 2301 movs r3, #1
  61816. 8033c24: 7063 strb r3, [r4, #1]
  61817. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_TIMETICKS);
  61818. 8033c26: 2343 movs r3, #67 ; 0x43
  61819. 8033c28: e003 b.n 8033c32 <ifentry_get_object_def+0x86>
  61820. case 16: /* ifOutOctets */
  61821. case 17: /* ifOutUcastPkts */
  61822. case 18: /* ifOutNUcastPkts */
  61823. case 19: /* ifOutDiscarts */
  61824. case 20: /* ifOutErrors */
  61825. od->instance = MIB_OBJECT_TAB;
  61826. 8033c2a: 7023 strb r3, [r4, #0]
  61827. od->access = MIB_OBJECT_READ_ONLY;
  61828. 8033c2c: 2301 movs r3, #1
  61829. 8033c2e: 7063 strb r3, [r4, #1]
  61830. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER);
  61831. 8033c30: 2341 movs r3, #65 ; 0x41
  61832. 8033c32: 70a3 strb r3, [r4, #2]
  61833. od->v_len = sizeof(u32_t);
  61834. 8033c34: 2304 movs r3, #4
  61835. 8033c36: e005 b.n 8033c44 <ifentry_get_object_def+0x98>
  61836. break;
  61837. case 22: /* ifSpecific */
  61838. /** @note returning zeroDotZero (0.0) no media specific MIB support */
  61839. od->instance = MIB_OBJECT_TAB;
  61840. 8033c38: 7023 strb r3, [r4, #0]
  61841. od->access = MIB_OBJECT_READ_ONLY;
  61842. 8033c3a: 2301 movs r3, #1
  61843. 8033c3c: 7063 strb r3, [r4, #1]
  61844. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID);
  61845. 8033c3e: 2306 movs r3, #6
  61846. 8033c40: 70a3 strb r3, [r4, #2]
  61847. od->v_len = ifspecific.len * sizeof(s32_t);
  61848. 8033c42: 2308 movs r3, #8
  61849. 8033c44: 80a3 strh r3, [r4, #4]
  61850. break;
  61851. 8033c46: e001 b.n 8033c4c <ifentry_get_object_def+0xa0>
  61852. };
  61853. }
  61854. else
  61855. {
  61856. LWIP_DEBUGF(SNMP_MIB_DEBUG,("ifentry_get_object_def: no scalar\n"));
  61857. od->instance = MIB_OBJECT_NONE;
  61858. 8033c48: 2300 movs r3, #0
  61859. 8033c4a: 7023 strb r3, [r4, #0]
  61860. }
  61861. }
  61862. 8033c4c: bd1c pop {r2, r3, r4, pc}
  61863. 8033c4e: 0000 movs r0, r0
  61864. 08033c50 <udpentry_get_value>:
  61865. }
  61866. }
  61867. static void
  61868. udpentry_get_value(struct obj_def *od, u16_t len, void *value)
  61869. {
  61870. 8033c50: b537 push {r0, r1, r2, r4, r5, lr}
  61871. 8033c52: 4604 mov r4, r0
  61872. struct udp_pcb *pcb;
  61873. ip_addr_t ip;
  61874. u16_t port;
  61875. LWIP_UNUSED_ARG(len);
  61876. snmp_oidtoip(&od->id_inst_ptr[1], &ip);
  61877. 8033c54: 6880 ldr r0, [r0, #8]
  61878. 8033c56: a901 add r1, sp, #4
  61879. 8033c58: 3004 adds r0, #4
  61880. }
  61881. }
  61882. static void
  61883. udpentry_get_value(struct obj_def *od, u16_t len, void *value)
  61884. {
  61885. 8033c5a: 4615 mov r5, r2
  61886. struct udp_pcb *pcb;
  61887. ip_addr_t ip;
  61888. u16_t port;
  61889. LWIP_UNUSED_ARG(len);
  61890. snmp_oidtoip(&od->id_inst_ptr[1], &ip);
  61891. 8033c5c: f001 f80c bl 8034c78 <snmp_oidtoip>
  61892. LWIP_ASSERT("invalid port", (od->id_inst_ptr[5] >= 0) && (od->id_inst_ptr[5] <= 0xffff));
  61893. port = (u16_t)od->id_inst_ptr[5];
  61894. 8033c60: 68a1 ldr r1, [r4, #8]
  61895. pcb = udp_pcbs;
  61896. 8033c62: 4b0c ldr r3, [pc, #48] ; (8033c94 <udpentry_get_value+0x44>)
  61897. u16_t port;
  61898. LWIP_UNUSED_ARG(len);
  61899. snmp_oidtoip(&od->id_inst_ptr[1], &ip);
  61900. LWIP_ASSERT("invalid port", (od->id_inst_ptr[5] >= 0) && (od->id_inst_ptr[5] <= 0xffff));
  61901. port = (u16_t)od->id_inst_ptr[5];
  61902. 8033c64: 8a8a ldrh r2, [r1, #20]
  61903. pcb = udp_pcbs;
  61904. 8033c66: 681b ldr r3, [r3, #0]
  61905. while ((pcb != NULL) &&
  61906. !(ip_addr_cmp(&pcb->local_ip, &ip) &&
  61907. 8033c68: 9801 ldr r0, [sp, #4]
  61908. snmp_oidtoip(&od->id_inst_ptr[1], &ip);
  61909. LWIP_ASSERT("invalid port", (od->id_inst_ptr[5] >= 0) && (od->id_inst_ptr[5] <= 0xffff));
  61910. port = (u16_t)od->id_inst_ptr[5];
  61911. pcb = udp_pcbs;
  61912. while ((pcb != NULL) &&
  61913. 8033c6a: e000 b.n 8033c6e <udpentry_get_value+0x1e>
  61914. !(ip_addr_cmp(&pcb->local_ip, &ip) &&
  61915. (pcb->local_port == port)))
  61916. {
  61917. pcb = pcb->next;
  61918. 8033c6c: 68db ldr r3, [r3, #12]
  61919. snmp_oidtoip(&od->id_inst_ptr[1], &ip);
  61920. LWIP_ASSERT("invalid port", (od->id_inst_ptr[5] >= 0) && (od->id_inst_ptr[5] <= 0xffff));
  61921. port = (u16_t)od->id_inst_ptr[5];
  61922. pcb = udp_pcbs;
  61923. while ((pcb != NULL) &&
  61924. 8033c6e: b17b cbz r3, 8033c90 <udpentry_get_value+0x40>
  61925. 8033c70: 681c ldr r4, [r3, #0]
  61926. 8033c72: 4284 cmp r4, r0
  61927. 8033c74: d1fa bne.n 8033c6c <udpentry_get_value+0x1c>
  61928. !(ip_addr_cmp(&pcb->local_ip, &ip) &&
  61929. (pcb->local_port == port)))
  61930. 8033c76: 8a5c ldrh r4, [r3, #18]
  61931. LWIP_ASSERT("invalid port", (od->id_inst_ptr[5] >= 0) && (od->id_inst_ptr[5] <= 0xffff));
  61932. port = (u16_t)od->id_inst_ptr[5];
  61933. pcb = udp_pcbs;
  61934. while ((pcb != NULL) &&
  61935. !(ip_addr_cmp(&pcb->local_ip, &ip) &&
  61936. 8033c78: 4294 cmp r4, r2
  61937. 8033c7a: d1f7 bne.n 8033c6c <udpentry_get_value+0x1c>
  61938. 8033c7c: e003 b.n 8033c86 <udpentry_get_value+0x36>
  61939. switch (id)
  61940. {
  61941. case 1: /* udpLocalAddress */
  61942. {
  61943. ip_addr_t *dst = (ip_addr_t*)value;
  61944. *dst = pcb->local_ip;
  61945. 8033c7e: 6028 str r0, [r5, #0]
  61946. }
  61947. break;
  61948. 8033c80: e006 b.n 8033c90 <udpentry_get_value+0x40>
  61949. case 2: /* udpLocalPort */
  61950. {
  61951. s32_t *sint_ptr = (s32_t*)value;
  61952. *sint_ptr = pcb->local_port;
  61953. 8033c82: 602a str r2, [r5, #0]
  61954. }
  61955. break;
  61956. 8033c84: e004 b.n 8033c90 <udpentry_get_value+0x40>
  61957. if (pcb != NULL)
  61958. {
  61959. LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
  61960. id = (u8_t)od->id_inst_ptr[0];
  61961. switch (id)
  61962. 8033c86: 780b ldrb r3, [r1, #0]
  61963. 8033c88: 2b01 cmp r3, #1
  61964. 8033c8a: d0f8 beq.n 8033c7e <udpentry_get_value+0x2e>
  61965. 8033c8c: 2b02 cmp r3, #2
  61966. 8033c8e: d0f8 beq.n 8033c82 <udpentry_get_value+0x32>
  61967. *sint_ptr = pcb->local_port;
  61968. }
  61969. break;
  61970. }
  61971. }
  61972. }
  61973. 8033c90: bd3e pop {r1, r2, r3, r4, r5, pc}
  61974. 8033c92: bf00 nop
  61975. 8033c94: 2000ff3c .word 0x2000ff3c
  61976. 08033c98 <ip_addrentry_get_value>:
  61977. }
  61978. }
  61979. static void
  61980. ip_addrentry_get_value(struct obj_def *od, u16_t len, void *value)
  61981. {
  61982. 8033c98: b573 push {r0, r1, r4, r5, r6, lr}
  61983. 8033c9a: 4606 mov r6, r0
  61984. u16_t ifidx;
  61985. ip_addr_t ip;
  61986. struct netif *netif = netif_list;
  61987. LWIP_UNUSED_ARG(len);
  61988. snmp_oidtoip(&od->id_inst_ptr[1], &ip);
  61989. 8033c9c: 6880 ldr r0, [r0, #8]
  61990. ip_addrentry_get_value(struct obj_def *od, u16_t len, void *value)
  61991. {
  61992. u8_t id;
  61993. u16_t ifidx;
  61994. ip_addr_t ip;
  61995. struct netif *netif = netif_list;
  61996. 8033c9e: 4b18 ldr r3, [pc, #96] ; (8033d00 <ip_addrentry_get_value+0x68>)
  61997. LWIP_UNUSED_ARG(len);
  61998. snmp_oidtoip(&od->id_inst_ptr[1], &ip);
  61999. 8033ca0: a901 add r1, sp, #4
  62000. 8033ca2: 3004 adds r0, #4
  62001. ip_addrentry_get_value(struct obj_def *od, u16_t len, void *value)
  62002. {
  62003. u8_t id;
  62004. u16_t ifidx;
  62005. ip_addr_t ip;
  62006. struct netif *netif = netif_list;
  62007. 8033ca4: 681c ldr r4, [r3, #0]
  62008. }
  62009. }
  62010. static void
  62011. ip_addrentry_get_value(struct obj_def *od, u16_t len, void *value)
  62012. {
  62013. 8033ca6: 4615 mov r5, r2
  62014. u16_t ifidx;
  62015. ip_addr_t ip;
  62016. struct netif *netif = netif_list;
  62017. LWIP_UNUSED_ARG(len);
  62018. snmp_oidtoip(&od->id_inst_ptr[1], &ip);
  62019. 8033ca8: f000 ffe6 bl 8034c78 <snmp_oidtoip>
  62020. ifidx = 0;
  62021. while ((netif != NULL) && !ip_addr_cmp(&ip, &netif->ip_addr))
  62022. 8033cac: 9901 ldr r1, [sp, #4]
  62023. ip_addr_t ip;
  62024. struct netif *netif = netif_list;
  62025. LWIP_UNUSED_ARG(len);
  62026. snmp_oidtoip(&od->id_inst_ptr[1], &ip);
  62027. ifidx = 0;
  62028. 8033cae: 2300 movs r3, #0
  62029. while ((netif != NULL) && !ip_addr_cmp(&ip, &netif->ip_addr))
  62030. 8033cb0: e002 b.n 8033cb8 <ip_addrentry_get_value+0x20>
  62031. {
  62032. netif = netif->next;
  62033. ifidx++;
  62034. 8033cb2: 3301 adds r3, #1
  62035. LWIP_UNUSED_ARG(len);
  62036. snmp_oidtoip(&od->id_inst_ptr[1], &ip);
  62037. ifidx = 0;
  62038. while ((netif != NULL) && !ip_addr_cmp(&ip, &netif->ip_addr))
  62039. {
  62040. netif = netif->next;
  62041. 8033cb4: 6824 ldr r4, [r4, #0]
  62042. ifidx++;
  62043. 8033cb6: b29b uxth r3, r3
  62044. struct netif *netif = netif_list;
  62045. LWIP_UNUSED_ARG(len);
  62046. snmp_oidtoip(&od->id_inst_ptr[1], &ip);
  62047. ifidx = 0;
  62048. while ((netif != NULL) && !ip_addr_cmp(&ip, &netif->ip_addr))
  62049. 8033cb8: b304 cbz r4, 8033cfc <ip_addrentry_get_value+0x64>
  62050. 8033cba: 6862 ldr r2, [r4, #4]
  62051. 8033cbc: 4291 cmp r1, r2
  62052. 8033cbe: d1f8 bne.n 8033cb2 <ip_addrentry_get_value+0x1a>
  62053. 8033cc0: e00a b.n 8033cd8 <ip_addrentry_get_value+0x40>
  62054. switch (id)
  62055. {
  62056. case 1: /* ipAdEntAddr */
  62057. {
  62058. ip_addr_t *dst = (ip_addr_t*)value;
  62059. *dst = netif->ip_addr;
  62060. 8033cc2: 6863 ldr r3, [r4, #4]
  62061. 8033cc4: e006 b.n 8033cd4 <ip_addrentry_get_value+0x3c>
  62062. }
  62063. break;
  62064. case 2: /* ipAdEntIfIndex */
  62065. {
  62066. s32_t *sint_ptr = (s32_t*)value;
  62067. *sint_ptr = ifidx + 1;
  62068. 8033cc6: 3301 adds r3, #1
  62069. 8033cc8: e004 b.n 8033cd4 <ip_addrentry_get_value+0x3c>
  62070. }
  62071. break;
  62072. case 3: /* ipAdEntNetMask */
  62073. {
  62074. ip_addr_t *dst = (ip_addr_t*)value;
  62075. *dst = netif->netmask;
  62076. 8033cca: 68a3 ldr r3, [r4, #8]
  62077. 8033ccc: e002 b.n 8033cd4 <ip_addrentry_get_value+0x3c>
  62078. {
  62079. s32_t *sint_ptr = (s32_t*)value;
  62080. /* lwIP oddity, there's no broadcast
  62081. address in the netif we can rely on */
  62082. *sint_ptr = IPADDR_BROADCAST & 1;
  62083. 8033cce: 2301 movs r3, #1
  62084. 8033cd0: e000 b.n 8033cd4 <ip_addrentry_get_value+0x3c>
  62085. *sint_ptr = (IP_HLEN + ((IP_REASS_MAX_PBUFS/2) *
  62086. (PBUF_POOL_BUFSIZE - PBUF_LINK_HLEN - IP_HLEN)));
  62087. #else
  62088. /** @todo returning MTU would be a bad thing and
  62089. returning a wild guess like '576' isn't good either */
  62090. *sint_ptr = 0;
  62091. 8033cd2: 2300 movs r3, #0
  62092. 8033cd4: 602b str r3, [r5, #0]
  62093. #endif
  62094. }
  62095. break;
  62096. 8033cd6: e011 b.n 8033cfc <ip_addrentry_get_value+0x64>
  62097. }
  62098. if (netif != NULL)
  62099. {
  62100. LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
  62101. id = (u8_t)od->id_inst_ptr[0];
  62102. 8033cd8: 68b2 ldr r2, [r6, #8]
  62103. switch (id)
  62104. 8033cda: 7812 ldrb r2, [r2, #0]
  62105. 8033cdc: 3a01 subs r2, #1
  62106. 8033cde: 2a04 cmp r2, #4
  62107. 8033ce0: d80c bhi.n 8033cfc <ip_addrentry_get_value+0x64>
  62108. 8033ce2: a101 add r1, pc, #4 ; (adr r1, 8033ce8 <ip_addrentry_get_value+0x50>)
  62109. 8033ce4: f851 f022 ldr.w pc, [r1, r2, lsl #2]
  62110. 8033ce8: 08033cc3 .word 0x08033cc3
  62111. 8033cec: 08033cc7 .word 0x08033cc7
  62112. 8033cf0: 08033ccb .word 0x08033ccb
  62113. 8033cf4: 08033ccf .word 0x08033ccf
  62114. 8033cf8: 08033cd3 .word 0x08033cd3
  62115. #endif
  62116. }
  62117. break;
  62118. }
  62119. }
  62120. }
  62121. 8033cfc: bd7c pop {r2, r3, r4, r5, r6, pc}
  62122. 8033cfe: bf00 nop
  62123. 8033d00: 2000ff14 .word 0x2000ff14
  62124. 08033d04 <ip_ntomentry_get_value>:
  62125. }
  62126. }
  62127. static void
  62128. ip_ntomentry_get_value(struct obj_def *od, u16_t len, void *value)
  62129. {
  62130. 8033d04: b530 push {r4, r5, lr}
  62131. struct netif *netif;
  62132. LWIP_UNUSED_ARG(len);
  62133. LWIP_UNUSED_ARG(value);/* if !LWIP_ARP */
  62134. snmp_ifindextonetif(od->id_inst_ptr[1], &netif);
  62135. 8033d06: 6883 ldr r3, [r0, #8]
  62136. }
  62137. }
  62138. static void
  62139. ip_ntomentry_get_value(struct obj_def *od, u16_t len, void *value)
  62140. {
  62141. 8033d08: b085 sub sp, #20
  62142. 8033d0a: 4605 mov r5, r0
  62143. struct netif *netif;
  62144. LWIP_UNUSED_ARG(len);
  62145. LWIP_UNUSED_ARG(value);/* if !LWIP_ARP */
  62146. snmp_ifindextonetif(od->id_inst_ptr[1], &netif);
  62147. 8033d0c: a903 add r1, sp, #12
  62148. 8033d0e: 6858 ldr r0, [r3, #4]
  62149. }
  62150. }
  62151. static void
  62152. ip_ntomentry_get_value(struct obj_def *od, u16_t len, void *value)
  62153. {
  62154. 8033d10: 4614 mov r4, r2
  62155. struct netif *netif;
  62156. LWIP_UNUSED_ARG(len);
  62157. LWIP_UNUSED_ARG(value);/* if !LWIP_ARP */
  62158. snmp_ifindextonetif(od->id_inst_ptr[1], &netif);
  62159. 8033d12: f000 ff93 bl 8034c3c <snmp_ifindextonetif>
  62160. snmp_oidtoip(&od->id_inst_ptr[2], &ip);
  62161. 8033d16: 68a8 ldr r0, [r5, #8]
  62162. 8033d18: a902 add r1, sp, #8
  62163. 8033d1a: 3008 adds r0, #8
  62164. 8033d1c: f000 ffac bl 8034c78 <snmp_oidtoip>
  62165. #if LWIP_ARP /** @todo implement a netif_find_addr */
  62166. if (etharp_find_addr(netif, &ip, &ethaddr_ret, &ipaddr_ret) > -1)
  62167. 8033d20: 9803 ldr r0, [sp, #12]
  62168. 8033d22: a902 add r1, sp, #8
  62169. 8033d24: 466a mov r2, sp
  62170. 8033d26: ab01 add r3, sp, #4
  62171. 8033d28: f002 ffea bl 8036d00 <etharp_find_addr>
  62172. 8033d2c: 2800 cmp r0, #0
  62173. 8033d2e: db15 blt.n 8033d5c <ip_ntomentry_get_value+0x58>
  62174. {
  62175. LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
  62176. id = (u8_t)od->id_inst_ptr[0];
  62177. 8033d30: 68ab ldr r3, [r5, #8]
  62178. switch (id)
  62179. 8033d32: 781a ldrb r2, [r3, #0]
  62180. 8033d34: 3a01 subs r2, #1
  62181. 8033d36: 2a03 cmp r2, #3
  62182. 8033d38: d810 bhi.n 8033d5c <ip_ntomentry_get_value+0x58>
  62183. 8033d3a: e8df f002 tbb [pc, r2]
  62184. 8033d3e: 0402 .short 0x0402
  62185. 8033d40: 0d0a .short 0x0d0a
  62186. {
  62187. case 1: /* ipNetToMediaIfIndex */
  62188. {
  62189. s32_t *sint_ptr = (s32_t*)value;
  62190. *sint_ptr = od->id_inst_ptr[1];
  62191. 8033d42: 685b ldr r3, [r3, #4]
  62192. 8033d44: e009 b.n 8033d5a <ip_ntomentry_get_value+0x56>
  62193. break;
  62194. case 2: /* ipNetToMediaPhysAddress */
  62195. {
  62196. struct eth_addr *dst = (struct eth_addr*)value;
  62197. *dst = *ethaddr_ret;
  62198. 8033d46: 9b00 ldr r3, [sp, #0]
  62199. 8033d48: 681a ldr r2, [r3, #0]
  62200. 8033d4a: 6022 str r2, [r4, #0]
  62201. 8033d4c: 889b ldrh r3, [r3, #4]
  62202. 8033d4e: 80a3 strh r3, [r4, #4]
  62203. }
  62204. break;
  62205. 8033d50: e004 b.n 8033d5c <ip_ntomentry_get_value+0x58>
  62206. case 3: /* ipNetToMediaNetAddress */
  62207. {
  62208. ip_addr_t *dst = (ip_addr_t*)value;
  62209. *dst = *ipaddr_ret;
  62210. 8033d52: 9b01 ldr r3, [sp, #4]
  62211. 8033d54: 681b ldr r3, [r3, #0]
  62212. 8033d56: e000 b.n 8033d5a <ip_ntomentry_get_value+0x56>
  62213. break;
  62214. case 4: /* ipNetToMediaType */
  62215. {
  62216. s32_t *sint_ptr = (s32_t*)value;
  62217. /* dynamic (?) */
  62218. *sint_ptr = 3;
  62219. 8033d58: 2303 movs r3, #3
  62220. 8033d5a: 6023 str r3, [r4, #0]
  62221. }
  62222. break;
  62223. }
  62224. }
  62225. #endif /* LWIP_ARP */
  62226. }
  62227. 8033d5c: b005 add sp, #20
  62228. 8033d5e: bd30 pop {r4, r5, pc}
  62229. 08033d60 <atentry_get_value>:
  62230. }
  62231. }
  62232. static void
  62233. atentry_get_value(struct obj_def *od, u16_t len, void *value)
  62234. {
  62235. 8033d60: b530 push {r4, r5, lr}
  62236. struct netif *netif;
  62237. LWIP_UNUSED_ARG(len);
  62238. LWIP_UNUSED_ARG(value);/* if !LWIP_ARP */
  62239. snmp_ifindextonetif(od->id_inst_ptr[1], &netif);
  62240. 8033d62: 6883 ldr r3, [r0, #8]
  62241. }
  62242. }
  62243. static void
  62244. atentry_get_value(struct obj_def *od, u16_t len, void *value)
  62245. {
  62246. 8033d64: b085 sub sp, #20
  62247. 8033d66: 4605 mov r5, r0
  62248. struct netif *netif;
  62249. LWIP_UNUSED_ARG(len);
  62250. LWIP_UNUSED_ARG(value);/* if !LWIP_ARP */
  62251. snmp_ifindextonetif(od->id_inst_ptr[1], &netif);
  62252. 8033d68: a903 add r1, sp, #12
  62253. 8033d6a: 6858 ldr r0, [r3, #4]
  62254. }
  62255. }
  62256. static void
  62257. atentry_get_value(struct obj_def *od, u16_t len, void *value)
  62258. {
  62259. 8033d6c: 4614 mov r4, r2
  62260. struct netif *netif;
  62261. LWIP_UNUSED_ARG(len);
  62262. LWIP_UNUSED_ARG(value);/* if !LWIP_ARP */
  62263. snmp_ifindextonetif(od->id_inst_ptr[1], &netif);
  62264. 8033d6e: f000 ff65 bl 8034c3c <snmp_ifindextonetif>
  62265. snmp_oidtoip(&od->id_inst_ptr[2], &ip);
  62266. 8033d72: 68a8 ldr r0, [r5, #8]
  62267. 8033d74: a902 add r1, sp, #8
  62268. 8033d76: 3008 adds r0, #8
  62269. 8033d78: f000 ff7e bl 8034c78 <snmp_oidtoip>
  62270. #if LWIP_ARP /** @todo implement a netif_find_addr */
  62271. if (etharp_find_addr(netif, &ip, &ethaddr_ret, &ipaddr_ret) > -1)
  62272. 8033d7c: 9803 ldr r0, [sp, #12]
  62273. 8033d7e: a902 add r1, sp, #8
  62274. 8033d80: 466a mov r2, sp
  62275. 8033d82: ab01 add r3, sp, #4
  62276. 8033d84: f002 ffbc bl 8036d00 <etharp_find_addr>
  62277. 8033d88: 2800 cmp r0, #0
  62278. 8033d8a: db12 blt.n 8033db2 <atentry_get_value+0x52>
  62279. {
  62280. LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
  62281. id = (u8_t)od->id_inst_ptr[0];
  62282. 8033d8c: 68aa ldr r2, [r5, #8]
  62283. switch (id)
  62284. 8033d8e: 7813 ldrb r3, [r2, #0]
  62285. 8033d90: 2b02 cmp r3, #2
  62286. 8033d92: d005 beq.n 8033da0 <atentry_get_value+0x40>
  62287. 8033d94: 2b03 cmp r3, #3
  62288. 8033d96: d009 beq.n 8033dac <atentry_get_value+0x4c>
  62289. 8033d98: 2b01 cmp r3, #1
  62290. 8033d9a: d10a bne.n 8033db2 <atentry_get_value+0x52>
  62291. {
  62292. case 1: /* atIfIndex */
  62293. {
  62294. s32_t *sint_ptr = (s32_t*)value;
  62295. *sint_ptr = od->id_inst_ptr[1];
  62296. 8033d9c: 6853 ldr r3, [r2, #4]
  62297. 8033d9e: e007 b.n 8033db0 <atentry_get_value+0x50>
  62298. break;
  62299. case 2: /* atPhysAddress */
  62300. {
  62301. struct eth_addr *dst = (struct eth_addr*)value;
  62302. *dst = *ethaddr_ret;
  62303. 8033da0: 9b00 ldr r3, [sp, #0]
  62304. 8033da2: 681a ldr r2, [r3, #0]
  62305. 8033da4: 6022 str r2, [r4, #0]
  62306. 8033da6: 889b ldrh r3, [r3, #4]
  62307. 8033da8: 80a3 strh r3, [r4, #4]
  62308. }
  62309. break;
  62310. 8033daa: e002 b.n 8033db2 <atentry_get_value+0x52>
  62311. case 3: /* atNetAddress */
  62312. {
  62313. ip_addr_t *dst = (ip_addr_t*)value;
  62314. *dst = *ipaddr_ret;
  62315. 8033dac: 9b01 ldr r3, [sp, #4]
  62316. 8033dae: 681b ldr r3, [r3, #0]
  62317. 8033db0: 6023 str r3, [r4, #0]
  62318. }
  62319. break;
  62320. }
  62321. }
  62322. #endif /* LWIP_ARP */
  62323. }
  62324. 8033db2: b005 add sp, #20
  62325. 8033db4: bd30 pop {r4, r5, pc}
  62326. 8033db6: 0000 movs r0, r0
  62327. 08033db8 <system_set_test>:
  62328. u8_t id, set_ok;
  62329. LWIP_UNUSED_ARG(value);
  62330. set_ok = 0;
  62331. LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
  62332. id = (u8_t)od->id_inst_ptr[0];
  62333. 8033db8: 6883 ldr r3, [r0, #8]
  62334. switch (id)
  62335. 8033dba: 781b ldrb r3, [r3, #0]
  62336. 8033dbc: 2b05 cmp r3, #5
  62337. 8033dbe: d007 beq.n 8033dd0 <system_set_test+0x18>
  62338. 8033dc0: 2b06 cmp r3, #6
  62339. 8033dc2: d00f beq.n 8033de4 <system_set_test+0x2c>
  62340. 8033dc4: 2b04 cmp r3, #4
  62341. 8033dc6: d111 bne.n 8033dec <system_set_test+0x34>
  62342. {
  62343. case 4: /* sysContact */
  62344. if ((syscontact_ptr != syscontact_default) &&
  62345. 8033dc8: 4b09 ldr r3, [pc, #36] ; (8033df0 <system_set_test+0x38>)
  62346. 8033dca: 681a ldr r2, [r3, #0]
  62347. 8033dcc: 4b09 ldr r3, [pc, #36] ; (8033df4 <system_set_test+0x3c>)
  62348. 8033dce: e002 b.n 8033dd6 <system_set_test+0x1e>
  62349. {
  62350. set_ok = 1;
  62351. }
  62352. break;
  62353. case 5: /* sysName */
  62354. if ((sysname_ptr != sysname_default) &&
  62355. 8033dd0: 4b09 ldr r3, [pc, #36] ; (8033df8 <system_set_test+0x40>)
  62356. 8033dd2: 681a ldr r2, [r3, #0]
  62357. 8033dd4: 4b09 ldr r3, [pc, #36] ; (8033dfc <system_set_test+0x44>)
  62358. 8033dd6: 429a cmp r2, r3
  62359. 8033dd8: d008 beq.n 8033dec <system_set_test+0x34>
  62360. system_set_test(struct obj_def *od, u16_t len, void *value)
  62361. {
  62362. u8_t id, set_ok;
  62363. LWIP_UNUSED_ARG(value);
  62364. set_ok = 0;
  62365. 8033dda: 29ff cmp r1, #255 ; 0xff
  62366. 8033ddc: bf8c ite hi
  62367. 8033dde: 2000 movhi r0, #0
  62368. 8033de0: 2001 movls r0, #1
  62369. 8033de2: 4770 bx lr
  62370. {
  62371. set_ok = 1;
  62372. }
  62373. break;
  62374. case 6: /* sysLocation */
  62375. if ((syslocation_ptr != syslocation_default) &&
  62376. 8033de4: 4b06 ldr r3, [pc, #24] ; (8033e00 <system_set_test+0x48>)
  62377. 8033de6: 681a ldr r2, [r3, #0]
  62378. 8033de8: 4b06 ldr r3, [pc, #24] ; (8033e04 <system_set_test+0x4c>)
  62379. 8033dea: e7f4 b.n 8033dd6 <system_set_test+0x1e>
  62380. system_set_test(struct obj_def *od, u16_t len, void *value)
  62381. {
  62382. u8_t id, set_ok;
  62383. LWIP_UNUSED_ARG(value);
  62384. set_ok = 0;
  62385. 8033dec: 2000 movs r0, #0
  62386. set_ok = 1;
  62387. }
  62388. break;
  62389. };
  62390. return set_ok;
  62391. }
  62392. 8033dee: 4770 bx lr
  62393. 8033df0: 20000924 .word 0x20000924
  62394. 8033df4: 08044b44 .word 0x08044b44
  62395. 8033df8: 200008b0 .word 0x200008b0
  62396. 8033dfc: 0804485c .word 0x0804485c
  62397. 8033e00: 20000a3c .word 0x20000a3c
  62398. 8033e04: 0804488c .word 0x0804488c
  62399. 08033e08 <atentry_get_object_def>:
  62400. {
  62401. /* return to object name, adding index depth (5) */
  62402. ident_len += 5;
  62403. ident -= 5;
  62404. if (ident_len == 6)
  62405. 8033e08: 2801 cmp r0, #1
  62406. 8033e0a: d120 bne.n 8033e4e <atentry_get_object_def+0x46>
  62407. {
  62408. od->id_inst_len = ident_len;
  62409. 8033e0c: 2006 movs r0, #6
  62410. static void
  62411. atentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
  62412. {
  62413. /* return to object name, adding index depth (5) */
  62414. ident_len += 5;
  62415. ident -= 5;
  62416. 8033e0e: f1a1 0314 sub.w r3, r1, #20
  62417. if (ident_len == 6)
  62418. {
  62419. od->id_inst_len = ident_len;
  62420. 8033e12: 7190 strb r0, [r2, #6]
  62421. od->id_inst_ptr = ident;
  62422. 8033e14: 6093 str r3, [r2, #8]
  62423. switch (ident[0])
  62424. 8033e16: f851 3c14 ldr.w r3, [r1, #-20]
  62425. 8033e1a: 2b02 cmp r3, #2
  62426. 8033e1c: d008 beq.n 8033e30 <atentry_get_object_def+0x28>
  62427. 8033e1e: 2b03 cmp r3, #3
  62428. 8033e20: d00d beq.n 8033e3e <atentry_get_object_def+0x36>
  62429. 8033e22: 2b01 cmp r3, #1
  62430. 8033e24: d113 bne.n 8033e4e <atentry_get_object_def+0x46>
  62431. {
  62432. case 1: /* atIfIndex */
  62433. od->instance = MIB_OBJECT_TAB;
  62434. 8033e26: 2302 movs r3, #2
  62435. od->access = MIB_OBJECT_READ_WRITE;
  62436. 8033e28: 2103 movs r1, #3
  62437. od->id_inst_ptr = ident;
  62438. switch (ident[0])
  62439. {
  62440. case 1: /* atIfIndex */
  62441. od->instance = MIB_OBJECT_TAB;
  62442. 8033e2a: 7013 strb r3, [r2, #0]
  62443. od->access = MIB_OBJECT_READ_WRITE;
  62444. 8033e2c: 7051 strb r1, [r2, #1]
  62445. 8033e2e: e00a b.n 8033e46 <atentry_get_object_def+0x3e>
  62446. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
  62447. od->v_len = sizeof(s32_t);
  62448. break;
  62449. case 2: /* atPhysAddress */
  62450. od->instance = MIB_OBJECT_TAB;
  62451. 8033e30: 7013 strb r3, [r2, #0]
  62452. od->access = MIB_OBJECT_READ_WRITE;
  62453. 8033e32: 2303 movs r3, #3
  62454. 8033e34: 7053 strb r3, [r2, #1]
  62455. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR);
  62456. 8033e36: 2304 movs r3, #4
  62457. 8033e38: 7093 strb r3, [r2, #2]
  62458. od->v_len = 6; /** @todo try to use netif::hwaddr_len */
  62459. 8033e3a: 8090 strh r0, [r2, #4]
  62460. break;
  62461. 8033e3c: 4770 bx lr
  62462. case 3: /* atNetAddress */
  62463. od->instance = MIB_OBJECT_TAB;
  62464. 8033e3e: 2102 movs r1, #2
  62465. od->access = MIB_OBJECT_READ_WRITE;
  62466. 8033e40: 7053 strb r3, [r2, #1]
  62467. od->access = MIB_OBJECT_READ_WRITE;
  62468. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR);
  62469. od->v_len = 6; /** @todo try to use netif::hwaddr_len */
  62470. break;
  62471. case 3: /* atNetAddress */
  62472. od->instance = MIB_OBJECT_TAB;
  62473. 8033e42: 7011 strb r1, [r2, #0]
  62474. od->access = MIB_OBJECT_READ_WRITE;
  62475. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR);
  62476. 8033e44: 2340 movs r3, #64 ; 0x40
  62477. 8033e46: 7093 strb r3, [r2, #2]
  62478. od->v_len = 4;
  62479. 8033e48: 2304 movs r3, #4
  62480. 8033e4a: 8093 strh r3, [r2, #4]
  62481. break;
  62482. 8033e4c: 4770 bx lr
  62483. }
  62484. }
  62485. else
  62486. {
  62487. LWIP_DEBUGF(SNMP_MIB_DEBUG,("atentry_get_object_def: no scalar\n"));
  62488. od->instance = MIB_OBJECT_NONE;
  62489. 8033e4e: 2300 movs r3, #0
  62490. 8033e50: 7013 strb r3, [r2, #0]
  62491. 8033e52: 4770 bx lr
  62492. 08033e54 <ip_get_object_def>:
  62493. u8_t id;
  62494. /* return to object name, adding index depth (1) */
  62495. ident_len += 1;
  62496. ident -= 1;
  62497. if (ident_len == 2)
  62498. 8033e54: 2801 cmp r0, #1
  62499. #endif /* LWIP_ARP */
  62500. }
  62501. static void
  62502. ip_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
  62503. {
  62504. 8033e56: b510 push {r4, lr}
  62505. u8_t id;
  62506. /* return to object name, adding index depth (1) */
  62507. ident_len += 1;
  62508. ident -= 1;
  62509. if (ident_len == 2)
  62510. 8033e58: d121 bne.n 8033e9e <ip_get_object_def+0x4a>
  62511. {
  62512. od->id_inst_len = ident_len;
  62513. 8033e5a: 2402 movs r4, #2
  62514. {
  62515. u8_t id;
  62516. /* return to object name, adding index depth (1) */
  62517. ident_len += 1;
  62518. ident -= 1;
  62519. 8033e5c: 1f0b subs r3, r1, #4
  62520. if (ident_len == 2)
  62521. {
  62522. od->id_inst_len = ident_len;
  62523. 8033e5e: 7194 strb r4, [r2, #6]
  62524. od->id_inst_ptr = ident;
  62525. 8033e60: 6093 str r3, [r2, #8]
  62526. LWIP_ASSERT("invalid id", (ident[0] >= 0) && (ident[0] <= 0xff));
  62527. id = (u8_t)ident[0];
  62528. LWIP_DEBUGF(SNMP_MIB_DEBUG,("get_object_def ip.%"U16_F".0\n",(u16_t)id));
  62529. switch (id)
  62530. 8033e62: f811 3c04 ldrb.w r3, [r1, #-4]
  62531. 8033e66: 2b17 cmp r3, #23
  62532. 8033e68: d819 bhi.n 8033e9e <ip_get_object_def+0x4a>
  62533. 8033e6a: 490e ldr r1, [pc, #56] ; (8033ea4 <ip_get_object_def+0x50>)
  62534. 8033e6c: 4099 lsls r1, r3
  62535. 8033e6e: d40b bmi.n 8033e88 <ip_get_object_def+0x34>
  62536. 8033e70: f44f 2180 mov.w r1, #262144 ; 0x40000
  62537. 8033e74: 4099 lsls r1, r3
  62538. 8033e76: d40c bmi.n 8033e92 <ip_get_object_def+0x3e>
  62539. 8033e78: f04f 41c0 mov.w r1, #1610612736 ; 0x60000000
  62540. 8033e7c: 4099 lsls r1, r3
  62541. 8033e7e: d50e bpl.n 8033e9e <ip_get_object_def+0x4a>
  62542. {
  62543. case 1: /* ipForwarding */
  62544. case 2: /* ipDefaultTTL */
  62545. od->instance = MIB_OBJECT_SCALAR;
  62546. od->access = MIB_OBJECT_READ_WRITE;
  62547. 8033e80: 2303 movs r3, #3
  62548. LWIP_DEBUGF(SNMP_MIB_DEBUG,("get_object_def ip.%"U16_F".0\n",(u16_t)id));
  62549. switch (id)
  62550. {
  62551. case 1: /* ipForwarding */
  62552. case 2: /* ipDefaultTTL */
  62553. od->instance = MIB_OBJECT_SCALAR;
  62554. 8033e82: 7010 strb r0, [r2, #0]
  62555. od->access = MIB_OBJECT_READ_WRITE;
  62556. 8033e84: 7053 strb r3, [r2, #1]
  62557. 8033e86: e006 b.n 8033e96 <ip_get_object_def+0x42>
  62558. case 18: /* ipFragFails */
  62559. case 19: /* ipFragCreates */
  62560. case 23: /* ipRoutingDiscards */
  62561. od->instance = MIB_OBJECT_SCALAR;
  62562. od->access = MIB_OBJECT_READ_ONLY;
  62563. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER);
  62564. 8033e88: 2341 movs r3, #65 ; 0x41
  62565. case 16: /* ipReasmFails */
  62566. case 17: /* ipFragOKs */
  62567. case 18: /* ipFragFails */
  62568. case 19: /* ipFragCreates */
  62569. case 23: /* ipRoutingDiscards */
  62570. od->instance = MIB_OBJECT_SCALAR;
  62571. 8033e8a: 7010 strb r0, [r2, #0]
  62572. od->access = MIB_OBJECT_READ_ONLY;
  62573. 8033e8c: 7050 strb r0, [r2, #1]
  62574. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER);
  62575. 8033e8e: 7093 strb r3, [r2, #2]
  62576. 8033e90: e002 b.n 8033e98 <ip_get_object_def+0x44>
  62577. od->v_len = sizeof(u32_t);
  62578. break;
  62579. case 13: /* ipReasmTimeout */
  62580. od->instance = MIB_OBJECT_SCALAR;
  62581. 8033e92: 7010 strb r0, [r2, #0]
  62582. od->access = MIB_OBJECT_READ_ONLY;
  62583. 8033e94: 7050 strb r0, [r2, #1]
  62584. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
  62585. 8033e96: 7094 strb r4, [r2, #2]
  62586. od->v_len = sizeof(s32_t);
  62587. 8033e98: 2304 movs r3, #4
  62588. 8033e9a: 8093 strh r3, [r2, #4]
  62589. break;
  62590. 8033e9c: bd10 pop {r4, pc}
  62591. };
  62592. }
  62593. else
  62594. {
  62595. LWIP_DEBUGF(SNMP_MIB_DEBUG,("ip_get_object_def: no scalar\n"));
  62596. od->instance = MIB_OBJECT_NONE;
  62597. 8033e9e: 2300 movs r3, #0
  62598. 8033ea0: 7013 strb r3, [r2, #0]
  62599. 8033ea2: bd10 pop {r4, pc}
  62600. 8033ea4: 1ffbf100 .word 0x1ffbf100
  62601. 08033ea8 <ip_addrentry_get_object_def>:
  62602. {
  62603. /* return to object name, adding index depth (4) */
  62604. ident_len += 4;
  62605. ident -= 4;
  62606. if (ident_len == 5)
  62607. 8033ea8: 2801 cmp r0, #1
  62608. 8033eaa: d11c bne.n 8033ee6 <ip_addrentry_get_object_def+0x3e>
  62609. {
  62610. u8_t id;
  62611. od->id_inst_len = ident_len;
  62612. 8033eac: 2305 movs r3, #5
  62613. 8033eae: 7193 strb r3, [r2, #6]
  62614. static void
  62615. ip_addrentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
  62616. {
  62617. /* return to object name, adding index depth (4) */
  62618. ident_len += 4;
  62619. ident -= 4;
  62620. 8033eb0: f1a1 0310 sub.w r3, r1, #16
  62621. if (ident_len == 5)
  62622. {
  62623. u8_t id;
  62624. od->id_inst_len = ident_len;
  62625. od->id_inst_ptr = ident;
  62626. 8033eb4: 6093 str r3, [r2, #8]
  62627. LWIP_ASSERT("invalid id", (ident[0] >= 0) && (ident[0] <= 0xff));
  62628. id = (u8_t)ident[0];
  62629. switch (id)
  62630. 8033eb6: f811 3c10 ldrb.w r3, [r1, #-16]
  62631. 8033eba: 2b05 cmp r3, #5
  62632. 8033ebc: d813 bhi.n 8033ee6 <ip_addrentry_get_object_def+0x3e>
  62633. 8033ebe: f04f 5130 mov.w r1, #738197504 ; 0x2c000000
  62634. 8033ec2: 4099 lsls r1, r3
  62635. 8033ec4: d408 bmi.n 8033ed8 <ip_addrentry_get_object_def+0x30>
  62636. 8033ec6: f04f 41a0 mov.w r1, #1342177280 ; 0x50000000
  62637. 8033eca: 4099 lsls r1, r3
  62638. 8033ecc: d50b bpl.n 8033ee6 <ip_addrentry_get_object_def+0x3e>
  62639. {
  62640. case 1: /* ipAdEntAddr */
  62641. case 3: /* ipAdEntNetMask */
  62642. od->instance = MIB_OBJECT_TAB;
  62643. 8033ece: 2302 movs r3, #2
  62644. 8033ed0: 7013 strb r3, [r2, #0]
  62645. od->access = MIB_OBJECT_READ_ONLY;
  62646. 8033ed2: 7050 strb r0, [r2, #1]
  62647. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR);
  62648. 8033ed4: 2340 movs r3, #64 ; 0x40
  62649. 8033ed6: e002 b.n 8033ede <ip_addrentry_get_object_def+0x36>
  62650. od->v_len = 4;
  62651. break;
  62652. case 2: /* ipAdEntIfIndex */
  62653. case 4: /* ipAdEntBcastAddr */
  62654. case 5: /* ipAdEntReasmMaxSize */
  62655. od->instance = MIB_OBJECT_TAB;
  62656. 8033ed8: 2302 movs r3, #2
  62657. 8033eda: 7013 strb r3, [r2, #0]
  62658. od->access = MIB_OBJECT_READ_ONLY;
  62659. 8033edc: 7050 strb r0, [r2, #1]
  62660. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
  62661. 8033ede: 7093 strb r3, [r2, #2]
  62662. od->v_len = sizeof(s32_t);
  62663. 8033ee0: 2304 movs r3, #4
  62664. 8033ee2: 8093 strh r3, [r2, #4]
  62665. break;
  62666. 8033ee4: 4770 bx lr
  62667. }
  62668. }
  62669. else
  62670. {
  62671. LWIP_DEBUGF(SNMP_MIB_DEBUG,("ip_addrentry_get_object_def: no scalar\n"));
  62672. od->instance = MIB_OBJECT_NONE;
  62673. 8033ee6: 2300 movs r3, #0
  62674. 8033ee8: 7013 strb r3, [r2, #0]
  62675. 8033eea: 4770 bx lr
  62676. 08033eec <ip_ntomentry_get_object_def>:
  62677. {
  62678. /* return to object name, adding index depth (5) */
  62679. ident_len += 5;
  62680. ident -= 5;
  62681. if (ident_len == 6)
  62682. 8033eec: 2801 cmp r0, #1
  62683. 8033eee: d123 bne.n 8033f38 <ip_ntomentry_get_object_def+0x4c>
  62684. {
  62685. u8_t id;
  62686. od->id_inst_len = ident_len;
  62687. 8033ef0: 2306 movs r3, #6
  62688. 8033ef2: 7193 strb r3, [r2, #6]
  62689. static void
  62690. ip_ntomentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
  62691. {
  62692. /* return to object name, adding index depth (5) */
  62693. ident_len += 5;
  62694. ident -= 5;
  62695. 8033ef4: f1a1 0314 sub.w r3, r1, #20
  62696. if (ident_len == 6)
  62697. {
  62698. u8_t id;
  62699. od->id_inst_len = ident_len;
  62700. od->id_inst_ptr = ident;
  62701. 8033ef8: 6093 str r3, [r2, #8]
  62702. LWIP_ASSERT("invalid id", (ident[0] >= 0) && (ident[0] <= 0xff));
  62703. id = (u8_t)ident[0];
  62704. switch (id)
  62705. 8033efa: f811 3c14 ldrb.w r3, [r1, #-20]
  62706. 8033efe: 3b01 subs r3, #1
  62707. 8033f00: 2b03 cmp r3, #3
  62708. 8033f02: d819 bhi.n 8033f38 <ip_ntomentry_get_object_def+0x4c>
  62709. 8033f04: e8df f003 tbb [pc, r3]
  62710. 8033f08: 020f0702 .word 0x020f0702
  62711. {
  62712. case 1: /* ipNetToMediaIfIndex */
  62713. case 4: /* ipNetToMediaType */
  62714. od->instance = MIB_OBJECT_TAB;
  62715. 8033f0c: 2302 movs r3, #2
  62716. od->access = MIB_OBJECT_READ_WRITE;
  62717. 8033f0e: 2103 movs r1, #3
  62718. id = (u8_t)ident[0];
  62719. switch (id)
  62720. {
  62721. case 1: /* ipNetToMediaIfIndex */
  62722. case 4: /* ipNetToMediaType */
  62723. od->instance = MIB_OBJECT_TAB;
  62724. 8033f10: 7013 strb r3, [r2, #0]
  62725. od->access = MIB_OBJECT_READ_WRITE;
  62726. 8033f12: 7051 strb r1, [r2, #1]
  62727. 8033f14: e00c b.n 8033f30 <ip_ntomentry_get_object_def+0x44>
  62728. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
  62729. od->v_len = sizeof(s32_t);
  62730. break;
  62731. case 2: /* ipNetToMediaPhysAddress */
  62732. od->instance = MIB_OBJECT_TAB;
  62733. 8033f16: 2302 movs r3, #2
  62734. 8033f18: 7013 strb r3, [r2, #0]
  62735. od->access = MIB_OBJECT_READ_WRITE;
  62736. 8033f1a: 2303 movs r3, #3
  62737. 8033f1c: 7053 strb r3, [r2, #1]
  62738. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR);
  62739. 8033f1e: 2304 movs r3, #4
  62740. 8033f20: 7093 strb r3, [r2, #2]
  62741. od->v_len = 6; /** @todo try to use netif::hwaddr_len */
  62742. 8033f22: 2306 movs r3, #6
  62743. 8033f24: e006 b.n 8033f34 <ip_ntomentry_get_object_def+0x48>
  62744. break;
  62745. case 3: /* ipNetToMediaNetAddress */
  62746. od->instance = MIB_OBJECT_TAB;
  62747. 8033f26: 2302 movs r3, #2
  62748. 8033f28: 7013 strb r3, [r2, #0]
  62749. od->access = MIB_OBJECT_READ_WRITE;
  62750. 8033f2a: 2303 movs r3, #3
  62751. 8033f2c: 7053 strb r3, [r2, #1]
  62752. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR);
  62753. 8033f2e: 2340 movs r3, #64 ; 0x40
  62754. 8033f30: 7093 strb r3, [r2, #2]
  62755. od->v_len = 4;
  62756. 8033f32: 2304 movs r3, #4
  62757. 8033f34: 8093 strh r3, [r2, #4]
  62758. break;
  62759. 8033f36: 4770 bx lr
  62760. }
  62761. }
  62762. else
  62763. {
  62764. LWIP_DEBUGF(SNMP_MIB_DEBUG,("ip_ntomentry_get_object_def: no scalar\n"));
  62765. od->instance = MIB_OBJECT_NONE;
  62766. 8033f38: 2300 movs r3, #0
  62767. 8033f3a: 7013 strb r3, [r2, #0]
  62768. 8033f3c: 4770 bx lr
  62769. 8033f3e: 0000 movs r0, r0
  62770. 08033f40 <tcp_get_object_def>:
  62771. u8_t id;
  62772. /* return to object name, adding index depth (1) */
  62773. ident_len += 1;
  62774. ident -= 1;
  62775. if (ident_len == 2)
  62776. 8033f40: 2801 cmp r0, #1
  62777. #if LWIP_TCP
  62778. /** @todo tcp grp */
  62779. static void
  62780. tcp_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
  62781. {
  62782. 8033f42: b510 push {r4, lr}
  62783. u8_t id;
  62784. /* return to object name, adding index depth (1) */
  62785. ident_len += 1;
  62786. ident -= 1;
  62787. if (ident_len == 2)
  62788. 8033f44: d121 bne.n 8033f8a <tcp_get_object_def+0x4a>
  62789. {
  62790. od->id_inst_len = ident_len;
  62791. 8033f46: 2402 movs r4, #2
  62792. {
  62793. u8_t id;
  62794. /* return to object name, adding index depth (1) */
  62795. ident_len += 1;
  62796. ident -= 1;
  62797. 8033f48: 1f0b subs r3, r1, #4
  62798. if (ident_len == 2)
  62799. {
  62800. od->id_inst_len = ident_len;
  62801. 8033f4a: 7194 strb r4, [r2, #6]
  62802. od->id_inst_ptr = ident;
  62803. 8033f4c: 6093 str r3, [r2, #8]
  62804. LWIP_ASSERT("invalid id", (ident[0] >= 0) && (ident[0] <= 0xff));
  62805. id = (u8_t)ident[0];
  62806. LWIP_DEBUGF(SNMP_MIB_DEBUG,("get_object_def tcp.%"U16_F".0\n",(u16_t)id));
  62807. switch (id)
  62808. 8033f4e: f811 3c04 ldrb.w r3, [r1, #-4]
  62809. 8033f52: 2b0f cmp r3, #15
  62810. 8033f54: d819 bhi.n 8033f8a <tcp_get_object_def+0x4a>
  62811. 8033f56: 490e ldr r1, [pc, #56] ; (8033f90 <tcp_get_object_def+0x50>)
  62812. 8033f58: 4099 lsls r1, r3
  62813. 8033f5a: d40b bmi.n 8033f74 <tcp_get_object_def+0x34>
  62814. 8033f5c: f44f 0180 mov.w r1, #4194304 ; 0x400000
  62815. 8033f60: 4099 lsls r1, r3
  62816. 8033f62: d40b bmi.n 8033f7c <tcp_get_object_def+0x3c>
  62817. 8033f64: f04f 41f0 mov.w r1, #2013265920 ; 0x78000000
  62818. 8033f68: 4099 lsls r1, r3
  62819. 8033f6a: d50e bpl.n 8033f8a <tcp_get_object_def+0x4a>
  62820. {
  62821. case 1: /* tcpRtoAlgorithm */
  62822. case 2: /* tcpRtoMin */
  62823. case 3: /* tcpRtoMax */
  62824. case 4: /* tcpMaxConn */
  62825. od->instance = MIB_OBJECT_SCALAR;
  62826. 8033f6c: 7010 strb r0, [r2, #0]
  62827. od->access = MIB_OBJECT_READ_ONLY;
  62828. 8033f6e: 7050 strb r0, [r2, #1]
  62829. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
  62830. 8033f70: 7094 strb r4, [r2, #2]
  62831. 8033f72: e007 b.n 8033f84 <tcp_get_object_def+0x44>
  62832. case 10: /* tcpInSegs */
  62833. case 11: /* tcpOutSegs */
  62834. case 12: /* tcpRetransSegs */
  62835. case 14: /* tcpInErrs */
  62836. case 15: /* tcpOutRsts */
  62837. od->instance = MIB_OBJECT_SCALAR;
  62838. 8033f74: 7010 strb r0, [r2, #0]
  62839. od->access = MIB_OBJECT_READ_ONLY;
  62840. 8033f76: 7050 strb r0, [r2, #1]
  62841. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER);
  62842. 8033f78: 2341 movs r3, #65 ; 0x41
  62843. 8033f7a: e002 b.n 8033f82 <tcp_get_object_def+0x42>
  62844. od->v_len = sizeof(u32_t);
  62845. break;
  62846. case 9: /* tcpCurrEstab */
  62847. od->instance = MIB_OBJECT_TAB;
  62848. 8033f7c: 7014 strb r4, [r2, #0]
  62849. od->access = MIB_OBJECT_READ_ONLY;
  62850. 8033f7e: 7050 strb r0, [r2, #1]
  62851. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_GAUGE);
  62852. 8033f80: 2342 movs r3, #66 ; 0x42
  62853. 8033f82: 7093 strb r3, [r2, #2]
  62854. od->v_len = sizeof(u32_t);
  62855. 8033f84: 2304 movs r3, #4
  62856. 8033f86: 8093 strh r3, [r2, #4]
  62857. break;
  62858. 8033f88: bd10 pop {r4, pc}
  62859. };
  62860. }
  62861. else
  62862. {
  62863. LWIP_DEBUGF(SNMP_MIB_DEBUG,("tcp_get_object_def: no scalar\n"));
  62864. od->instance = MIB_OBJECT_NONE;
  62865. 8033f8a: 2300 movs r3, #0
  62866. 8033f8c: 7013 strb r3, [r2, #0]
  62867. 8033f8e: bd10 pop {r4, pc}
  62868. 8033f90: 07bb0000 .word 0x07bb0000
  62869. 08033f94 <udpentry_get_object_def>:
  62870. {
  62871. /* return to object name, adding index depth (5) */
  62872. ident_len += 5;
  62873. ident -= 5;
  62874. if (ident_len == 6)
  62875. 8033f94: 2801 cmp r0, #1
  62876. 8033f96: d116 bne.n 8033fc6 <udpentry_get_object_def+0x32>
  62877. {
  62878. od->id_inst_len = ident_len;
  62879. 8033f98: 2306 movs r3, #6
  62880. 8033f9a: 7193 strb r3, [r2, #6]
  62881. static void
  62882. udpentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
  62883. {
  62884. /* return to object name, adding index depth (5) */
  62885. ident_len += 5;
  62886. ident -= 5;
  62887. 8033f9c: f1a1 0314 sub.w r3, r1, #20
  62888. if (ident_len == 6)
  62889. {
  62890. od->id_inst_len = ident_len;
  62891. od->id_inst_ptr = ident;
  62892. 8033fa0: 6093 str r3, [r2, #8]
  62893. switch (ident[0])
  62894. 8033fa2: f851 3c14 ldr.w r3, [r1, #-20]
  62895. 8033fa6: 2b01 cmp r3, #1
  62896. 8033fa8: d002 beq.n 8033fb0 <udpentry_get_object_def+0x1c>
  62897. 8033faa: 2b02 cmp r3, #2
  62898. 8033fac: d10b bne.n 8033fc6 <udpentry_get_object_def+0x32>
  62899. 8033fae: e004 b.n 8033fba <udpentry_get_object_def+0x26>
  62900. {
  62901. case 1: /* udpLocalAddress */
  62902. od->instance = MIB_OBJECT_TAB;
  62903. 8033fb0: 2102 movs r1, #2
  62904. od->access = MIB_OBJECT_READ_ONLY;
  62905. 8033fb2: 7053 strb r3, [r2, #1]
  62906. od->id_inst_ptr = ident;
  62907. switch (ident[0])
  62908. {
  62909. case 1: /* udpLocalAddress */
  62910. od->instance = MIB_OBJECT_TAB;
  62911. 8033fb4: 7011 strb r1, [r2, #0]
  62912. od->access = MIB_OBJECT_READ_ONLY;
  62913. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR);
  62914. 8033fb6: 2340 movs r3, #64 ; 0x40
  62915. 8033fb8: e001 b.n 8033fbe <udpentry_get_object_def+0x2a>
  62916. od->v_len = 4;
  62917. break;
  62918. case 2: /* udpLocalPort */
  62919. od->instance = MIB_OBJECT_TAB;
  62920. 8033fba: 7013 strb r3, [r2, #0]
  62921. od->access = MIB_OBJECT_READ_ONLY;
  62922. 8033fbc: 7050 strb r0, [r2, #1]
  62923. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
  62924. 8033fbe: 7093 strb r3, [r2, #2]
  62925. od->v_len = sizeof(s32_t);
  62926. 8033fc0: 2304 movs r3, #4
  62927. 8033fc2: 8093 strh r3, [r2, #4]
  62928. break;
  62929. 8033fc4: 4770 bx lr
  62930. }
  62931. }
  62932. else
  62933. {
  62934. LWIP_DEBUGF(SNMP_MIB_DEBUG,("udpentry_get_object_def: no scalar\n"));
  62935. od->instance = MIB_OBJECT_NONE;
  62936. 8033fc6: 2300 movs r3, #0
  62937. 8033fc8: 7013 strb r3, [r2, #0]
  62938. 8033fca: 4770 bx lr
  62939. 08033fcc <snmp_get_object_def>:
  62940. snmp_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
  62941. {
  62942. /* return to object name, adding index depth (1) */
  62943. ident_len += 1;
  62944. ident -= 1;
  62945. if (ident_len == 2)
  62946. 8033fcc: 2801 cmp r0, #1
  62947. }
  62948. }
  62949. static void
  62950. snmp_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
  62951. {
  62952. 8033fce: b510 push {r4, lr}
  62953. /* return to object name, adding index depth (1) */
  62954. ident_len += 1;
  62955. ident -= 1;
  62956. if (ident_len == 2)
  62957. 8033fd0: d119 bne.n 8034006 <snmp_get_object_def+0x3a>
  62958. {
  62959. u8_t id;
  62960. od->id_inst_len = ident_len;
  62961. 8033fd2: 2302 movs r3, #2
  62962. 8033fd4: 7193 strb r3, [r2, #6]
  62963. static void
  62964. snmp_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
  62965. {
  62966. /* return to object name, adding index depth (1) */
  62967. ident_len += 1;
  62968. ident -= 1;
  62969. 8033fd6: 1f0c subs r4, r1, #4
  62970. od->id_inst_len = ident_len;
  62971. od->id_inst_ptr = ident;
  62972. LWIP_ASSERT("invalid id", (ident[0] >= 0) && (ident[0] <= 0xff));
  62973. id = (u8_t)ident[0];
  62974. switch (id)
  62975. 8033fd8: f811 1c04 ldrb.w r1, [r1, #-4]
  62976. if (ident_len == 2)
  62977. {
  62978. u8_t id;
  62979. od->id_inst_len = ident_len;
  62980. od->id_inst_ptr = ident;
  62981. 8033fdc: 6094 str r4, [r2, #8]
  62982. LWIP_ASSERT("invalid id", (ident[0] >= 0) && (ident[0] <= 0xff));
  62983. id = (u8_t)ident[0];
  62984. switch (id)
  62985. 8033fde: 291e cmp r1, #30
  62986. 8033fe0: d811 bhi.n 8034006 <snmp_get_object_def+0x3a>
  62987. 8033fe2: 4c0a ldr r4, [pc, #40] ; (803400c <snmp_get_object_def+0x40>)
  62988. 8033fe4: 408c lsls r4, r1
  62989. 8033fe6: d403 bmi.n 8033ff0 <snmp_get_object_def+0x24>
  62990. 8033fe8: fa13 f101 lsls.w r1, r3, r1
  62991. 8033fec: d404 bmi.n 8033ff8 <snmp_get_object_def+0x2c>
  62992. 8033fee: e00a b.n 8034006 <snmp_get_object_def+0x3a>
  62993. case 25: /* snmpOutGetRequests */
  62994. case 26: /* snmpOutGetNexts */
  62995. case 27: /* snmpOutSetRequests */
  62996. case 28: /* snmpOutGetResponses */
  62997. case 29: /* snmpOutTraps */
  62998. od->instance = MIB_OBJECT_SCALAR;
  62999. 8033ff0: 7010 strb r0, [r2, #0]
  63000. od->access = MIB_OBJECT_READ_ONLY;
  63001. 8033ff2: 7050 strb r0, [r2, #1]
  63002. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER);
  63003. 8033ff4: 2341 movs r3, #65 ; 0x41
  63004. 8033ff6: e002 b.n 8033ffe <snmp_get_object_def+0x32>
  63005. od->v_len = sizeof(u32_t);
  63006. break;
  63007. case 30: /* snmpEnableAuthenTraps */
  63008. od->instance = MIB_OBJECT_SCALAR;
  63009. od->access = MIB_OBJECT_READ_WRITE;
  63010. 8033ff8: 2103 movs r1, #3
  63011. od->access = MIB_OBJECT_READ_ONLY;
  63012. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER);
  63013. od->v_len = sizeof(u32_t);
  63014. break;
  63015. case 30: /* snmpEnableAuthenTraps */
  63016. od->instance = MIB_OBJECT_SCALAR;
  63017. 8033ffa: 7010 strb r0, [r2, #0]
  63018. od->access = MIB_OBJECT_READ_WRITE;
  63019. 8033ffc: 7051 strb r1, [r2, #1]
  63020. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
  63021. 8033ffe: 7093 strb r3, [r2, #2]
  63022. od->v_len = sizeof(s32_t);
  63023. 8034000: 2304 movs r3, #4
  63024. 8034002: 8093 strh r3, [r2, #4]
  63025. break;
  63026. 8034004: bd10 pop {r4, pc}
  63027. };
  63028. }
  63029. else
  63030. {
  63031. LWIP_DEBUGF(SNMP_MIB_DEBUG,("snmp_get_object_def: no scalar\n"));
  63032. od->instance = MIB_OBJECT_NONE;
  63033. 8034006: 2300 movs r3, #0
  63034. 8034008: 7013 strb r3, [r2, #0]
  63035. 803400a: bd10 pop {r4, pc}
  63036. 803400c: 7efffefc .word 0x7efffefc
  63037. 08034010 <snmp_set_test>:
  63038. u8_t id, set_ok;
  63039. LWIP_UNUSED_ARG(len);
  63040. set_ok = 0;
  63041. LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
  63042. id = (u8_t)od->id_inst_ptr[0];
  63043. 8034010: 6883 ldr r3, [r0, #8]
  63044. if (id == 30)
  63045. 8034012: 781b ldrb r3, [r3, #0]
  63046. 8034014: 2b1e cmp r3, #30
  63047. 8034016: d10f bne.n 8034038 <snmp_set_test+0x28>
  63048. {
  63049. /* snmpEnableAuthenTraps */
  63050. s32_t *sint_ptr = (s32_t*)value;
  63051. if (snmpenableauthentraps_ptr != &snmpenableauthentraps_default)
  63052. 8034018: 4b08 ldr r3, [pc, #32] ; (803403c <snmp_set_test+0x2c>)
  63053. 803401a: 6810 ldr r0, [r2, #0]
  63054. 803401c: 6819 ldr r1, [r3, #0]
  63055. 803401e: 4b08 ldr r3, [pc, #32] ; (8034040 <snmp_set_test+0x30>)
  63056. 8034020: 4299 cmp r1, r3
  63057. 8034022: d005 beq.n 8034030 <snmp_set_test+0x20>
  63058. {
  63059. /* we should have writable non-volatile mem here */
  63060. if ((*sint_ptr == 1) || (*sint_ptr == 2))
  63061. 8034024: 3801 subs r0, #1
  63062. snmp_set_test(struct obj_def *od, u16_t len, void *value)
  63063. {
  63064. u8_t id, set_ok;
  63065. LWIP_UNUSED_ARG(len);
  63066. set_ok = 0;
  63067. 8034026: 2801 cmp r0, #1
  63068. 8034028: bf8c ite hi
  63069. 803402a: 2000 movhi r0, #0
  63070. 803402c: 2001 movls r0, #1
  63071. 803402e: 4770 bx lr
  63072. 8034030: 1e83 subs r3, r0, #2
  63073. 8034032: 4258 negs r0, r3
  63074. 8034034: 4158 adcs r0, r3
  63075. 8034036: 4770 bx lr
  63076. 8034038: 2000 movs r0, #0
  63077. set_ok = 1;
  63078. }
  63079. }
  63080. }
  63081. return set_ok;
  63082. }
  63083. 803403a: 4770 bx lr
  63084. 803403c: 200008a8 .word 0x200008a8
  63085. 8034040: 08044940 .word 0x08044940
  63086. 08034044 <ocstrncpy>:
  63087. * @param dst points to destination
  63088. * @param src points to source
  63089. * @param n number of octets to copy.
  63090. */
  63091. void ocstrncpy(u8_t *dst, u8_t *src, u16_t n)
  63092. {
  63093. 8034044: b510 push {r4, lr}
  63094. u16_t i = n;
  63095. while (i > 0) {
  63096. 8034046: 2300 movs r3, #0
  63097. 8034048: e002 b.n 8034050 <ocstrncpy+0xc>
  63098. i--;
  63099. *dst++ = *src++;
  63100. 803404a: 5ccc ldrb r4, [r1, r3]
  63101. 803404c: 54c4 strb r4, [r0, r3]
  63102. 803404e: 3301 adds r3, #1
  63103. * @param n number of octets to copy.
  63104. */
  63105. void ocstrncpy(u8_t *dst, u8_t *src, u16_t n)
  63106. {
  63107. u16_t i = n;
  63108. while (i > 0) {
  63109. 8034050: b29c uxth r4, r3
  63110. 8034052: 42a2 cmp r2, r4
  63111. 8034054: d1f9 bne.n 803404a <ocstrncpy+0x6>
  63112. i--;
  63113. *dst++ = *src++;
  63114. }
  63115. }
  63116. 8034056: bd10 pop {r4, pc}
  63117. 08034058 <system_set_value>:
  63118. {
  63119. u8_t id;
  63120. LWIP_ASSERT("invalid len", len <= 0xff);
  63121. LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
  63122. id = (u8_t)od->id_inst_ptr[0];
  63123. 8034058: 6883 ldr r3, [r0, #8]
  63124. switch (id)
  63125. 803405a: 781b ldrb r3, [r3, #0]
  63126. 803405c: 2b05 cmp r3, #5
  63127. return set_ok;
  63128. }
  63129. static void
  63130. system_set_value(struct obj_def *od, u16_t len, void *value)
  63131. {
  63132. 803405e: b510 push {r4, lr}
  63133. 8034060: 460c mov r4, r1
  63134. 8034062: 4611 mov r1, r2
  63135. u8_t id;
  63136. LWIP_ASSERT("invalid len", len <= 0xff);
  63137. LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
  63138. id = (u8_t)od->id_inst_ptr[0];
  63139. switch (id)
  63140. 8034064: d00a beq.n 803407c <system_set_value+0x24>
  63141. 8034066: 2b06 cmp r3, #6
  63142. 8034068: d00f beq.n 803408a <system_set_value+0x32>
  63143. 803406a: 2b04 cmp r3, #4
  63144. 803406c: d115 bne.n 803409a <system_set_value+0x42>
  63145. {
  63146. case 4: /* sysContact */
  63147. ocstrncpy(syscontact_ptr, (u8_t*)value, len);
  63148. 803406e: 4b0b ldr r3, [pc, #44] ; (803409c <system_set_value+0x44>)
  63149. 8034070: 4622 mov r2, r4
  63150. 8034072: 6818 ldr r0, [r3, #0]
  63151. 8034074: f7ff ffe6 bl 8034044 <ocstrncpy>
  63152. *syscontact_len_ptr = (u8_t)len;
  63153. 8034078: 4b09 ldr r3, [pc, #36] ; (80340a0 <system_set_value+0x48>)
  63154. 803407a: e00c b.n 8034096 <system_set_value+0x3e>
  63155. break;
  63156. case 5: /* sysName */
  63157. ocstrncpy(sysname_ptr, (u8_t*)value, len);
  63158. 803407c: 4b09 ldr r3, [pc, #36] ; (80340a4 <system_set_value+0x4c>)
  63159. 803407e: 4622 mov r2, r4
  63160. 8034080: 6818 ldr r0, [r3, #0]
  63161. 8034082: f7ff ffdf bl 8034044 <ocstrncpy>
  63162. *sysname_len_ptr = (u8_t)len;
  63163. 8034086: 4b08 ldr r3, [pc, #32] ; (80340a8 <system_set_value+0x50>)
  63164. 8034088: e005 b.n 8034096 <system_set_value+0x3e>
  63165. break;
  63166. case 6: /* sysLocation */
  63167. ocstrncpy(syslocation_ptr, (u8_t*)value, len);
  63168. 803408a: 4b08 ldr r3, [pc, #32] ; (80340ac <system_set_value+0x54>)
  63169. 803408c: 4622 mov r2, r4
  63170. 803408e: 6818 ldr r0, [r3, #0]
  63171. 8034090: f7ff ffd8 bl 8034044 <ocstrncpy>
  63172. *syslocation_len_ptr = (u8_t)len;
  63173. 8034094: 4b06 ldr r3, [pc, #24] ; (80340b0 <system_set_value+0x58>)
  63174. 8034096: 681b ldr r3, [r3, #0]
  63175. 8034098: 701c strb r4, [r3, #0]
  63176. 803409a: bd10 pop {r4, pc}
  63177. 803409c: 20000924 .word 0x20000924
  63178. 80340a0: 200007a8 .word 0x200007a8
  63179. 80340a4: 200008b0 .word 0x200008b0
  63180. 80340a8: 200007a4 .word 0x200007a4
  63181. 80340ac: 20000a3c .word 0x20000a3c
  63182. 80340b0: 20000990 .word 0x20000990
  63183. 080340b4 <objectidncpy>:
  63184. *
  63185. * @param dst points to destination
  63186. * @param src points to source
  63187. * @param n number of sub identifiers to copy.
  63188. */
  63189. void objectidncpy(s32_t *dst, s32_t *src, u8_t n)
  63190. 80340b4: 3904 subs r1, #4
  63191. {
  63192. u8_t i = n;
  63193. while(i > 0) {
  63194. 80340b6: e005 b.n 80340c4 <objectidncpy+0x10>
  63195. i--;
  63196. *dst++ = *src++;
  63197. 80340b8: f851 3f04 ldr.w r3, [r1, #4]!
  63198. */
  63199. void objectidncpy(s32_t *dst, s32_t *src, u8_t n)
  63200. {
  63201. u8_t i = n;
  63202. while(i > 0) {
  63203. i--;
  63204. 80340bc: 3a01 subs r2, #1
  63205. *dst++ = *src++;
  63206. 80340be: f840 3b04 str.w r3, [r0], #4
  63207. */
  63208. void objectidncpy(s32_t *dst, s32_t *src, u8_t n)
  63209. {
  63210. u8_t i = n;
  63211. while(i > 0) {
  63212. i--;
  63213. 80340c2: b2d2 uxtb r2, r2
  63214. * @param n number of sub identifiers to copy.
  63215. */
  63216. void objectidncpy(s32_t *dst, s32_t *src, u8_t n)
  63217. {
  63218. u8_t i = n;
  63219. while(i > 0) {
  63220. 80340c4: 2a00 cmp r2, #0
  63221. 80340c6: d1f7 bne.n 80340b8 <objectidncpy+0x4>
  63222. i--;
  63223. *dst++ = *src++;
  63224. }
  63225. }
  63226. 80340c8: 4770 bx lr
  63227. 80340ca: 0000 movs r0, r0
  63228. 080340cc <ifentry_get_value>:
  63229. * @param len return value space (in bytes)
  63230. * @param value points to (varbind) space to copy value into.
  63231. */
  63232. static void
  63233. ifentry_get_value(struct obj_def *od, u16_t len, void *value)
  63234. {
  63235. 80340cc: b573 push {r0, r1, r4, r5, r6, lr}
  63236. struct netif *netif;
  63237. u8_t id;
  63238. snmp_ifindextonetif(od->id_inst_ptr[1], &netif);
  63239. 80340ce: 6883 ldr r3, [r0, #8]
  63240. * @param len return value space (in bytes)
  63241. * @param value points to (varbind) space to copy value into.
  63242. */
  63243. static void
  63244. ifentry_get_value(struct obj_def *od, u16_t len, void *value)
  63245. {
  63246. 80340d0: 4606 mov r6, r0
  63247. 80340d2: 460d mov r5, r1
  63248. struct netif *netif;
  63249. u8_t id;
  63250. snmp_ifindextonetif(od->id_inst_ptr[1], &netif);
  63251. 80340d4: 6858 ldr r0, [r3, #4]
  63252. 80340d6: a901 add r1, sp, #4
  63253. * @param len return value space (in bytes)
  63254. * @param value points to (varbind) space to copy value into.
  63255. */
  63256. static void
  63257. ifentry_get_value(struct obj_def *od, u16_t len, void *value)
  63258. {
  63259. 80340d8: 4614 mov r4, r2
  63260. struct netif *netif;
  63261. u8_t id;
  63262. snmp_ifindextonetif(od->id_inst_ptr[1], &netif);
  63263. 80340da: f000 fdaf bl 8034c3c <snmp_ifindextonetif>
  63264. LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
  63265. id = (u8_t)od->id_inst_ptr[0];
  63266. 80340de: 68b3 ldr r3, [r6, #8]
  63267. switch (id)
  63268. 80340e0: 781a ldrb r2, [r3, #0]
  63269. 80340e2: 3a01 subs r2, #1
  63270. 80340e4: 2a15 cmp r2, #21
  63271. 80340e6: d85c bhi.n 80341a2 <ifentry_get_value+0xd6>
  63272. 80340e8: e8df f002 tbb [pc, r2]
  63273. 80340ec: 15110d0b .word 0x15110d0b
  63274. 80340f0: 2e221b18 .word 0x2e221b18
  63275. 80340f4: 403d3a37 .word 0x403d3a37
  63276. 80340f8: 46525243 .word 0x46525243
  63277. 80340fc: 524f4c49 .word 0x524f4c49
  63278. 8034100: 5552 .short 0x5552
  63279. {
  63280. case 1: /* ifIndex */
  63281. {
  63282. s32_t *sint_ptr = (s32_t*)value;
  63283. *sint_ptr = od->id_inst_ptr[1];
  63284. 8034102: 685b ldr r3, [r3, #4]
  63285. 8034104: e045 b.n 8034192 <ifentry_get_value+0xc6>
  63286. }
  63287. break;
  63288. case 2: /* ifDescr */
  63289. ocstrncpy((u8_t*)value, (u8_t*)netif->name, len);
  63290. 8034106: 9901 ldr r1, [sp, #4]
  63291. 8034108: 4620 mov r0, r4
  63292. 803410a: 312e adds r1, #46 ; 0x2e
  63293. 803410c: e00c b.n 8034128 <ifentry_get_value+0x5c>
  63294. break;
  63295. case 3: /* ifType */
  63296. {
  63297. s32_t *sint_ptr = (s32_t*)value;
  63298. *sint_ptr = netif->link_type;
  63299. 803410e: 9b01 ldr r3, [sp, #4]
  63300. 8034110: f893 3031 ldrb.w r3, [r3, #49] ; 0x31
  63301. 8034114: e03d b.n 8034192 <ifentry_get_value+0xc6>
  63302. }
  63303. break;
  63304. case 4: /* ifMtu */
  63305. {
  63306. s32_t *sint_ptr = (s32_t*)value;
  63307. *sint_ptr = netif->mtu;
  63308. 8034116: 9b01 ldr r3, [sp, #4]
  63309. 8034118: 8c9b ldrh r3, [r3, #36] ; 0x24
  63310. 803411a: e03a b.n 8034192 <ifentry_get_value+0xc6>
  63311. }
  63312. break;
  63313. case 5: /* ifSpeed */
  63314. {
  63315. u32_t *uint_ptr = (u32_t*)value;
  63316. *uint_ptr = netif->link_speed;
  63317. 803411c: 9b01 ldr r3, [sp, #4]
  63318. 803411e: 6b5b ldr r3, [r3, #52] ; 0x34
  63319. 8034120: e037 b.n 8034192 <ifentry_get_value+0xc6>
  63320. }
  63321. break;
  63322. case 6: /* ifPhysAddress */
  63323. ocstrncpy((u8_t*)value, netif->hwaddr, len);
  63324. 8034122: 9901 ldr r1, [sp, #4]
  63325. 8034124: 4620 mov r0, r4
  63326. 8034126: 3127 adds r1, #39 ; 0x27
  63327. 8034128: 462a mov r2, r5
  63328. 803412a: f7ff ff8b bl 8034044 <ocstrncpy>
  63329. break;
  63330. 803412e: e038 b.n 80341a2 <ifentry_get_value+0xd6>
  63331. case 7: /* ifAdminStatus */
  63332. {
  63333. s32_t *sint_ptr = (s32_t*)value;
  63334. if (netif_is_up(netif))
  63335. 8034130: 9b01 ldr r3, [sp, #4]
  63336. 8034132: f893 302d ldrb.w r3, [r3, #45] ; 0x2d
  63337. 8034136: 07d9 lsls r1, r3, #31
  63338. 8034138: d50d bpl.n 8034156 <ifentry_get_value+0x8a>
  63339. {
  63340. if (netif_is_link_up(netif))
  63341. 803413a: f003 0310 and.w r3, r3, #16
  63342. 803413e: b2db uxtb r3, r3
  63343. 8034140: b103 cbz r3, 8034144 <ifentry_get_value+0x78>
  63344. 8034142: e006 b.n 8034152 <ifentry_get_value+0x86>
  63345. {
  63346. *sint_ptr = 1; /* up */
  63347. }
  63348. else
  63349. {
  63350. *sint_ptr = 7; /* lowerLayerDown */
  63351. 8034144: 2307 movs r3, #7
  63352. 8034146: e024 b.n 8034192 <ifentry_get_value+0xc6>
  63353. }
  63354. break;
  63355. case 8: /* ifOperStatus */
  63356. {
  63357. s32_t *sint_ptr = (s32_t*)value;
  63358. if (netif_is_up(netif))
  63359. 8034148: 9b01 ldr r3, [sp, #4]
  63360. 803414a: f893 302d ldrb.w r3, [r3, #45] ; 0x2d
  63361. 803414e: 07da lsls r2, r3, #31
  63362. 8034150: d501 bpl.n 8034156 <ifentry_get_value+0x8a>
  63363. {
  63364. *sint_ptr = 1;
  63365. 8034152: 2301 movs r3, #1
  63366. 8034154: e01d b.n 8034192 <ifentry_get_value+0xc6>
  63367. }
  63368. else
  63369. {
  63370. *sint_ptr = 2;
  63371. 8034156: 2302 movs r3, #2
  63372. 8034158: e01b b.n 8034192 <ifentry_get_value+0xc6>
  63373. }
  63374. break;
  63375. case 9: /* ifLastChange */
  63376. {
  63377. u32_t *uint_ptr = (u32_t*)value;
  63378. *uint_ptr = netif->ts;
  63379. 803415a: 9b01 ldr r3, [sp, #4]
  63380. 803415c: 6b9b ldr r3, [r3, #56] ; 0x38
  63381. 803415e: e018 b.n 8034192 <ifentry_get_value+0xc6>
  63382. }
  63383. break;
  63384. case 10: /* ifInOctets */
  63385. {
  63386. u32_t *uint_ptr = (u32_t*)value;
  63387. *uint_ptr = netif->ifinoctets;
  63388. 8034160: 9b01 ldr r3, [sp, #4]
  63389. 8034162: 6bdb ldr r3, [r3, #60] ; 0x3c
  63390. 8034164: e015 b.n 8034192 <ifentry_get_value+0xc6>
  63391. }
  63392. break;
  63393. case 11: /* ifInUcastPkts */
  63394. {
  63395. u32_t *uint_ptr = (u32_t*)value;
  63396. *uint_ptr = netif->ifinucastpkts;
  63397. 8034166: 9b01 ldr r3, [sp, #4]
  63398. 8034168: 6c1b ldr r3, [r3, #64] ; 0x40
  63399. 803416a: e012 b.n 8034192 <ifentry_get_value+0xc6>
  63400. }
  63401. break;
  63402. case 12: /* ifInNUcastPkts */
  63403. {
  63404. u32_t *uint_ptr = (u32_t*)value;
  63405. *uint_ptr = netif->ifinnucastpkts;
  63406. 803416c: 9b01 ldr r3, [sp, #4]
  63407. 803416e: 6c5b ldr r3, [r3, #68] ; 0x44
  63408. 8034170: e00f b.n 8034192 <ifentry_get_value+0xc6>
  63409. }
  63410. break;
  63411. case 13: /* ifInDiscarts */
  63412. {
  63413. u32_t *uint_ptr = (u32_t*)value;
  63414. *uint_ptr = netif->ifindiscards;
  63415. 8034172: 9b01 ldr r3, [sp, #4]
  63416. 8034174: 6c9b ldr r3, [r3, #72] ; 0x48
  63417. 8034176: e00c b.n 8034192 <ifentry_get_value+0xc6>
  63418. }
  63419. break;
  63420. case 16: /* ifOutOctets */
  63421. {
  63422. u32_t *uint_ptr = (u32_t*)value;
  63423. *uint_ptr = netif->ifoutoctets;
  63424. 8034178: 9b01 ldr r3, [sp, #4]
  63425. 803417a: 6cdb ldr r3, [r3, #76] ; 0x4c
  63426. 803417c: e009 b.n 8034192 <ifentry_get_value+0xc6>
  63427. }
  63428. break;
  63429. case 17: /* ifOutUcastPkts */
  63430. {
  63431. u32_t *uint_ptr = (u32_t*)value;
  63432. *uint_ptr = netif->ifoutucastpkts;
  63433. 803417e: 9b01 ldr r3, [sp, #4]
  63434. 8034180: 6d1b ldr r3, [r3, #80] ; 0x50
  63435. 8034182: e006 b.n 8034192 <ifentry_get_value+0xc6>
  63436. }
  63437. break;
  63438. case 18: /* ifOutNUcastPkts */
  63439. {
  63440. u32_t *uint_ptr = (u32_t*)value;
  63441. *uint_ptr = netif->ifoutnucastpkts;
  63442. 8034184: 9b01 ldr r3, [sp, #4]
  63443. 8034186: 6d5b ldr r3, [r3, #84] ; 0x54
  63444. 8034188: e003 b.n 8034192 <ifentry_get_value+0xc6>
  63445. }
  63446. break;
  63447. case 19: /* ifOutDiscarts */
  63448. {
  63449. u32_t *uint_ptr = (u32_t*)value;
  63450. *uint_ptr = netif->ifoutdiscards;
  63451. 803418a: 9b01 ldr r3, [sp, #4]
  63452. 803418c: 6d9b ldr r3, [r3, #88] ; 0x58
  63453. 803418e: e000 b.n 8034192 <ifentry_get_value+0xc6>
  63454. break;
  63455. case 21: /* ifOutQLen */
  63456. /** @todo figure out if this must be 0 (no queue) or 1? */
  63457. {
  63458. u32_t *uint_ptr = (u32_t*)value;
  63459. *uint_ptr = 0;
  63460. 8034190: 2300 movs r3, #0
  63461. 8034192: 6023 str r3, [r4, #0]
  63462. }
  63463. break;
  63464. 8034194: e005 b.n 80341a2 <ifentry_get_value+0xd6>
  63465. case 22: /* ifSpecific */
  63466. objectidncpy((s32_t*)value, (s32_t*)ifspecific.id, (u8_t)(len / sizeof(s32_t)));
  63467. 8034196: 4620 mov r0, r4
  63468. 8034198: 4902 ldr r1, [pc, #8] ; (80341a4 <ifentry_get_value+0xd8>)
  63469. 803419a: f3c5 0287 ubfx r2, r5, #2, #8
  63470. 803419e: f7ff ff89 bl 80340b4 <objectidncpy>
  63471. break;
  63472. };
  63473. }
  63474. 80341a2: bd7c pop {r2, r3, r4, r5, r6, pc}
  63475. 80341a4: 080449c8 .word 0x080449c8
  63476. 080341a8 <ip_rteentry_get_value>:
  63477. }
  63478. }
  63479. static void
  63480. ip_rteentry_get_value(struct obj_def *od, u16_t len, void *value)
  63481. {
  63482. 80341a8: b5f7 push {r0, r1, r2, r4, r5, r6, r7, lr}
  63483. struct netif *netif;
  63484. ip_addr_t dest;
  63485. s32_t *ident;
  63486. u8_t id;
  63487. ident = od->id_inst_ptr;
  63488. 80341aa: 6885 ldr r5, [r0, #8]
  63489. }
  63490. }
  63491. static void
  63492. ip_rteentry_get_value(struct obj_def *od, u16_t len, void *value)
  63493. {
  63494. 80341ac: 460f mov r7, r1
  63495. ip_addr_t dest;
  63496. s32_t *ident;
  63497. u8_t id;
  63498. ident = od->id_inst_ptr;
  63499. snmp_oidtoip(&ident[1], &dest);
  63500. 80341ae: 1d28 adds r0, r5, #4
  63501. 80341b0: a901 add r1, sp, #4
  63502. }
  63503. }
  63504. static void
  63505. ip_rteentry_get_value(struct obj_def *od, u16_t len, void *value)
  63506. {
  63507. 80341b2: 4614 mov r4, r2
  63508. ip_addr_t dest;
  63509. s32_t *ident;
  63510. u8_t id;
  63511. ident = od->id_inst_ptr;
  63512. snmp_oidtoip(&ident[1], &dest);
  63513. 80341b4: f000 fd60 bl 8034c78 <snmp_oidtoip>
  63514. if (ip_addr_isany(&dest))
  63515. 80341b8: 9b01 ldr r3, [sp, #4]
  63516. 80341ba: b91b cbnz r3, 80341c4 <ip_rteentry_get_value+0x1c>
  63517. {
  63518. /* ip_route() uses default netif for default route */
  63519. netif = netif_default;
  63520. 80341bc: 4a23 ldr r2, [pc, #140] ; (803424c <ip_rteentry_get_value+0xa4>)
  63521. 80341be: 6810 ldr r0, [r2, #0]
  63522. !ip_addr_netcmp(&dest, &(netif->ip_addr), &(netif->netmask)) )
  63523. {
  63524. netif = netif->next;
  63525. }
  63526. }
  63527. if (netif != NULL)
  63528. 80341c0: b960 cbnz r0, 80341dc <ip_rteentry_get_value+0x34>
  63529. 80341c2: e041 b.n 8034248 <ip_rteentry_get_value+0xa0>
  63530. netif = netif_default;
  63531. }
  63532. else
  63533. {
  63534. /* not using ip_route(), need exact match! */
  63535. netif = netif_list;
  63536. 80341c4: 4a22 ldr r2, [pc, #136] ; (8034250 <ip_rteentry_get_value+0xa8>)
  63537. 80341c6: 6810 ldr r0, [r2, #0]
  63538. while ((netif != NULL) &&
  63539. 80341c8: e000 b.n 80341cc <ip_rteentry_get_value+0x24>
  63540. !ip_addr_netcmp(&dest, &(netif->ip_addr), &(netif->netmask)) )
  63541. {
  63542. netif = netif->next;
  63543. 80341ca: 6800 ldr r0, [r0, #0]
  63544. }
  63545. else
  63546. {
  63547. /* not using ip_route(), need exact match! */
  63548. netif = netif_list;
  63549. while ((netif != NULL) &&
  63550. 80341cc: 2800 cmp r0, #0
  63551. 80341ce: d03b beq.n 8034248 <ip_rteentry_get_value+0xa0>
  63552. !ip_addr_netcmp(&dest, &(netif->ip_addr), &(netif->netmask)) )
  63553. 80341d0: 6846 ldr r6, [r0, #4]
  63554. 80341d2: ea83 0206 eor.w r2, r3, r6
  63555. 80341d6: 6886 ldr r6, [r0, #8]
  63556. }
  63557. else
  63558. {
  63559. /* not using ip_route(), need exact match! */
  63560. netif = netif_list;
  63561. while ((netif != NULL) &&
  63562. 80341d8: 4232 tst r2, r6
  63563. 80341da: d1f6 bne.n 80341ca <ip_rteentry_get_value+0x22>
  63564. }
  63565. if (netif != NULL)
  63566. {
  63567. LWIP_ASSERT("invalid id", (ident[0] >= 0) && (ident[0] <= 0xff));
  63568. id = (u8_t)ident[0];
  63569. switch (id)
  63570. 80341dc: 782d ldrb r5, [r5, #0]
  63571. 80341de: 3d01 subs r5, #1
  63572. 80341e0: 2d0c cmp r5, #12
  63573. 80341e2: d831 bhi.n 8034248 <ip_rteentry_get_value+0xa0>
  63574. 80341e4: e8df f005 tbb [pc, r5]
  63575. 80341e8: 14110d07 .word 0x14110d07
  63576. 80341ec: 1c171414 .word 0x1c171414
  63577. 80341f0: 14252321 .word 0x14252321
  63578. 80341f4: 2a .byte 0x2a
  63579. 80341f5: 00 .byte 0x00
  63580. {
  63581. case 1: /* ipRouteDest */
  63582. {
  63583. ip_addr_t *dst = (ip_addr_t*)value;
  63584. if (ip_addr_isany(&dest))
  63585. 80341f6: b903 cbnz r3, 80341fa <ip_rteentry_get_value+0x52>
  63586. 80341f8: e01e b.n 8034238 <ip_rteentry_get_value+0x90>
  63587. ip_addr_set_zero(dst);
  63588. }
  63589. else
  63590. {
  63591. /* netifs have netaddress dest */
  63592. ip_addr_get_network(dst, &netif->ip_addr, &netif->netmask);
  63593. 80341fa: 6882 ldr r2, [r0, #8]
  63594. 80341fc: 6843 ldr r3, [r0, #4]
  63595. 80341fe: 4013 ands r3, r2
  63596. 8034200: e01a b.n 8034238 <ip_rteentry_get_value+0x90>
  63597. break;
  63598. case 2: /* ipRouteIfIndex */
  63599. {
  63600. s32_t *sint_ptr = (s32_t*)value;
  63601. snmp_netiftoifindex(netif, sint_ptr);
  63602. 8034202: 4621 mov r1, r4
  63603. 8034204: f000 fd28 bl 8034c58 <snmp_netiftoifindex>
  63604. }
  63605. break;
  63606. 8034208: e01e b.n 8034248 <ip_rteentry_get_value+0xa0>
  63607. case 3: /* ipRouteMetric1 */
  63608. {
  63609. s32_t *sint_ptr = (s32_t*)value;
  63610. if (ip_addr_isany(&dest))
  63611. 803420a: b983 cbnz r3, 803422e <ip_rteentry_get_value+0x86>
  63612. {
  63613. /* default rte has metric 1 */
  63614. *sint_ptr = 1;
  63615. 803420c: 2301 movs r3, #1
  63616. 803420e: e013 b.n 8034238 <ip_rteentry_get_value+0x90>
  63617. case 6: /* ipRouteMetric4 */
  63618. case 12: /* ipRouteMetric5 */
  63619. {
  63620. s32_t *sint_ptr = (s32_t*)value;
  63621. /* not used */
  63622. *sint_ptr = -1;
  63623. 8034210: f04f 33ff mov.w r3, #4294967295
  63624. 8034214: e010 b.n 8034238 <ip_rteentry_get_value+0x90>
  63625. break;
  63626. case 7: /* ipRouteNextHop */
  63627. {
  63628. ip_addr_t *dst = (ip_addr_t*)value;
  63629. if (ip_addr_isany(&dest))
  63630. 8034216: b90b cbnz r3, 803421c <ip_rteentry_get_value+0x74>
  63631. {
  63632. /* default rte: gateway */
  63633. *dst = netif->gw;
  63634. 8034218: 68c3 ldr r3, [r0, #12]
  63635. 803421a: e00d b.n 8034238 <ip_rteentry_get_value+0x90>
  63636. }
  63637. else
  63638. {
  63639. /* other rtes: netif ip_addr */
  63640. *dst = netif->ip_addr;
  63641. 803421c: 6843 ldr r3, [r0, #4]
  63642. 803421e: e00b b.n 8034238 <ip_rteentry_get_value+0x90>
  63643. break;
  63644. case 8: /* ipRouteType */
  63645. {
  63646. s32_t *sint_ptr = (s32_t*)value;
  63647. if (ip_addr_isany(&dest))
  63648. 8034220: b90b cbnz r3, 8034226 <ip_rteentry_get_value+0x7e>
  63649. {
  63650. /* default rte is indirect */
  63651. *sint_ptr = 4;
  63652. 8034222: 2304 movs r3, #4
  63653. 8034224: e008 b.n 8034238 <ip_rteentry_get_value+0x90>
  63654. }
  63655. else
  63656. {
  63657. /* other rtes are direct */
  63658. *sint_ptr = 3;
  63659. 8034226: 2303 movs r3, #3
  63660. 8034228: e006 b.n 8034238 <ip_rteentry_get_value+0x90>
  63661. break;
  63662. case 9: /* ipRouteProto */
  63663. {
  63664. s32_t *sint_ptr = (s32_t*)value;
  63665. /* locally defined routes */
  63666. *sint_ptr = 2;
  63667. 803422a: 2302 movs r3, #2
  63668. 803422c: e004 b.n 8034238 <ip_rteentry_get_value+0x90>
  63669. case 10: /* ipRouteAge */
  63670. {
  63671. s32_t *sint_ptr = (s32_t*)value;
  63672. /** @todo (sysuptime - timestamp last change) / 100
  63673. @see snmp_insert_iprteidx_tree() */
  63674. *sint_ptr = 0;
  63675. 803422e: 2300 movs r3, #0
  63676. 8034230: e002 b.n 8034238 <ip_rteentry_get_value+0x90>
  63677. break;
  63678. case 11: /* ipRouteMask */
  63679. {
  63680. ip_addr_t *dst = (ip_addr_t*)value;
  63681. if (ip_addr_isany(&dest))
  63682. 8034232: b903 cbnz r3, 8034236 <ip_rteentry_get_value+0x8e>
  63683. 8034234: e000 b.n 8034238 <ip_rteentry_get_value+0x90>
  63684. ip_addr_set_zero(dst);
  63685. }
  63686. else
  63687. {
  63688. /* other rtes use netmask */
  63689. *dst = netif->netmask;
  63690. 8034236: 6883 ldr r3, [r0, #8]
  63691. 8034238: 6023 str r3, [r4, #0]
  63692. 803423a: e005 b.n 8034248 <ip_rteentry_get_value+0xa0>
  63693. }
  63694. }
  63695. break;
  63696. case 13: /* ipRouteInfo */
  63697. objectidncpy((s32_t*)value, (s32_t*)iprouteinfo.id, (u8_t)(len / sizeof(s32_t)));
  63698. 803423c: 4620 mov r0, r4
  63699. 803423e: 4905 ldr r1, [pc, #20] ; (8034254 <ip_rteentry_get_value+0xac>)
  63700. 8034240: f3c7 0287 ubfx r2, r7, #2, #8
  63701. 8034244: f7ff ff36 bl 80340b4 <objectidncpy>
  63702. break;
  63703. }
  63704. }
  63705. }
  63706. 8034248: bdfe pop {r1, r2, r3, r4, r5, r6, r7, pc}
  63707. 803424a: bf00 nop
  63708. 803424c: 2000ff18 .word 0x2000ff18
  63709. 8034250: 2000ff14 .word 0x2000ff14
  63710. 8034254: 080447dc .word 0x080447dc
  63711. 08034258 <snmp_set_sysdesr>:
  63712. * @param str if non-NULL then copy str pointer
  63713. * @param len points to string length, excluding zero terminator
  63714. */
  63715. void snmp_set_sysdesr(u8_t *str, u8_t *len)
  63716. {
  63717. if (str != NULL)
  63718. 8034258: b118 cbz r0, 8034262 <snmp_set_sysdesr+0xa>
  63719. {
  63720. sysdescr_ptr = str;
  63721. 803425a: 4b02 ldr r3, [pc, #8] ; (8034264 <snmp_set_sysdesr+0xc>)
  63722. 803425c: 6018 str r0, [r3, #0]
  63723. sysdescr_len_ptr = len;
  63724. 803425e: 4b02 ldr r3, [pc, #8] ; (8034268 <snmp_set_sysdesr+0x10>)
  63725. 8034260: 6019 str r1, [r3, #0]
  63726. 8034262: 4770 bx lr
  63727. 8034264: 200008d0 .word 0x200008d0
  63728. 8034268: 2000094c .word 0x2000094c
  63729. 0803426c <snmp_set_sysobjid>:
  63730. * Initializes sysObjectID value.
  63731. *
  63732. * @param oid points to stuct snmp_obj_id to copy
  63733. */
  63734. void snmp_set_sysobjid(struct snmp_obj_id *oid)
  63735. {
  63736. 803426c: 4601 mov r1, r0
  63737. 803426e: b508 push {r3, lr}
  63738. sysobjid = *oid;
  63739. 8034270: 2284 movs r2, #132 ; 0x84
  63740. 8034272: 4802 ldr r0, [pc, #8] ; (803427c <snmp_set_sysobjid+0x10>)
  63741. 8034274: f7ed fd16 bl 8021ca4 <memcpy>
  63742. 8034278: bd08 pop {r3, pc}
  63743. 803427a: bf00 nop
  63744. 803427c: 200007fc .word 0x200007fc
  63745. 08034280 <snmp_inc_sysuptime>:
  63746. * Must be called at regular 10 msec interval from a timer interrupt
  63747. * or signal handler depending on your runtime environment.
  63748. */
  63749. void snmp_inc_sysuptime(void)
  63750. {
  63751. sysuptime++;
  63752. 8034280: 4b02 ldr r3, [pc, #8] ; (803428c <snmp_inc_sysuptime+0xc>)
  63753. 8034282: 681a ldr r2, [r3, #0]
  63754. 8034284: 3201 adds r2, #1
  63755. 8034286: 601a str r2, [r3, #0]
  63756. 8034288: 4770 bx lr
  63757. 803428a: bf00 nop
  63758. 803428c: 2000c554 .word 0x2000c554
  63759. 08034290 <snmp_get_sysuptime>:
  63760. {
  63761. sysuptime+=value;
  63762. }
  63763. void snmp_get_sysuptime(u32_t *value)
  63764. {
  63765. 8034290: b510 push {r4, lr}
  63766. 8034292: 4604 mov r4, r0
  63767. SNMP_GET_SYSUPTIME(sysuptime);
  63768. 8034294: f003 f983 bl 803759e <sys_now>
  63769. 8034298: 230a movs r3, #10
  63770. 803429a: 4a03 ldr r2, [pc, #12] ; (80342a8 <snmp_get_sysuptime+0x18>)
  63771. 803429c: fbb0 f0f3 udiv r0, r0, r3
  63772. 80342a0: 6010 str r0, [r2, #0]
  63773. *value = sysuptime;
  63774. 80342a2: 6020 str r0, [r4, #0]
  63775. 80342a4: bd10 pop {r4, pc}
  63776. 80342a6: bf00 nop
  63777. 80342a8: 2000c554 .word 0x2000c554
  63778. 080342ac <system_get_value>:
  63779. * @param len return value space (in bytes)
  63780. * @param value points to (varbind) space to copy value into.
  63781. */
  63782. static void
  63783. system_get_value(struct obj_def *od, u16_t len, void *value)
  63784. {
  63785. 80342ac: 4613 mov r3, r2
  63786. u8_t id;
  63787. LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
  63788. id = (u8_t)od->id_inst_ptr[0];
  63789. 80342ae: 6882 ldr r2, [r0, #8]
  63790. switch (id)
  63791. 80342b0: 7812 ldrb r2, [r2, #0]
  63792. 80342b2: 3a01 subs r2, #1
  63793. * @param len return value space (in bytes)
  63794. * @param value points to (varbind) space to copy value into.
  63795. */
  63796. static void
  63797. system_get_value(struct obj_def *od, u16_t len, void *value)
  63798. {
  63799. 80342b4: b510 push {r4, lr}
  63800. 80342b6: 460c mov r4, r1
  63801. u8_t id;
  63802. LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
  63803. id = (u8_t)od->id_inst_ptr[0];
  63804. switch (id)
  63805. 80342b8: 2a06 cmp r2, #6
  63806. 80342ba: d825 bhi.n 8034308 <system_get_value+0x5c>
  63807. 80342bc: e8df f002 tbb [pc, r2]
  63808. 80342c0: 140f0704 .word 0x140f0704
  63809. 80342c4: 1a17 .short 0x1a17
  63810. 80342c6: 22 .byte 0x22
  63811. 80342c7: 00 .byte 0x00
  63812. {
  63813. case 1: /* sysDescr */
  63814. ocstrncpy((u8_t*)value, sysdescr_ptr, len);
  63815. 80342c8: 4618 mov r0, r3
  63816. 80342ca: 4b10 ldr r3, [pc, #64] ; (803430c <system_get_value+0x60>)
  63817. 80342cc: e014 b.n 80342f8 <system_get_value+0x4c>
  63818. break;
  63819. case 2: /* sysObjectID */
  63820. objectidncpy((s32_t*)value, (s32_t*)sysobjid.id, (u8_t)(len / sizeof(s32_t)));
  63821. 80342ce: 4910 ldr r1, [pc, #64] ; (8034310 <system_get_value+0x64>)
  63822. 80342d0: 4618 mov r0, r3
  63823. 80342d2: f3c4 0287 ubfx r2, r4, #2, #8
  63824. s32_t *sint_ptr = (s32_t*)value;
  63825. *sint_ptr = sysservices;
  63826. }
  63827. break;
  63828. };
  63829. }
  63830. 80342d6: e8bd 4010 ldmia.w sp!, {r4, lr}
  63831. {
  63832. case 1: /* sysDescr */
  63833. ocstrncpy((u8_t*)value, sysdescr_ptr, len);
  63834. break;
  63835. case 2: /* sysObjectID */
  63836. objectidncpy((s32_t*)value, (s32_t*)sysobjid.id, (u8_t)(len / sizeof(s32_t)));
  63837. 80342da: f7ff beeb b.w 80340b4 <objectidncpy>
  63838. break;
  63839. case 3: /* sysUpTime */
  63840. {
  63841. snmp_get_sysuptime((u32_t*)value);
  63842. 80342de: 4618 mov r0, r3
  63843. s32_t *sint_ptr = (s32_t*)value;
  63844. *sint_ptr = sysservices;
  63845. }
  63846. break;
  63847. };
  63848. }
  63849. 80342e0: e8bd 4010 ldmia.w sp!, {r4, lr}
  63850. case 2: /* sysObjectID */
  63851. objectidncpy((s32_t*)value, (s32_t*)sysobjid.id, (u8_t)(len / sizeof(s32_t)));
  63852. break;
  63853. case 3: /* sysUpTime */
  63854. {
  63855. snmp_get_sysuptime((u32_t*)value);
  63856. 80342e4: f7ff bfd4 b.w 8034290 <snmp_get_sysuptime>
  63857. }
  63858. break;
  63859. case 4: /* sysContact */
  63860. ocstrncpy((u8_t*)value, syscontact_ptr, len);
  63861. 80342e8: 4618 mov r0, r3
  63862. 80342ea: 4b0a ldr r3, [pc, #40] ; (8034314 <system_get_value+0x68>)
  63863. 80342ec: e004 b.n 80342f8 <system_get_value+0x4c>
  63864. break;
  63865. case 5: /* sysName */
  63866. ocstrncpy((u8_t*)value, sysname_ptr, len);
  63867. 80342ee: 4618 mov r0, r3
  63868. 80342f0: 4b09 ldr r3, [pc, #36] ; (8034318 <system_get_value+0x6c>)
  63869. 80342f2: e001 b.n 80342f8 <system_get_value+0x4c>
  63870. break;
  63871. case 6: /* sysLocation */
  63872. ocstrncpy((u8_t*)value, syslocation_ptr, len);
  63873. 80342f4: 4618 mov r0, r3
  63874. 80342f6: 4b09 ldr r3, [pc, #36] ; (803431c <system_get_value+0x70>)
  63875. 80342f8: 6819 ldr r1, [r3, #0]
  63876. 80342fa: 4622 mov r2, r4
  63877. s32_t *sint_ptr = (s32_t*)value;
  63878. *sint_ptr = sysservices;
  63879. }
  63880. break;
  63881. };
  63882. }
  63883. 80342fc: e8bd 4010 ldmia.w sp!, {r4, lr}
  63884. break;
  63885. case 5: /* sysName */
  63886. ocstrncpy((u8_t*)value, sysname_ptr, len);
  63887. break;
  63888. case 6: /* sysLocation */
  63889. ocstrncpy((u8_t*)value, syslocation_ptr, len);
  63890. 8034300: f7ff bea0 b.w 8034044 <ocstrncpy>
  63891. break;
  63892. case 7: /* sysServices */
  63893. {
  63894. s32_t *sint_ptr = (s32_t*)value;
  63895. *sint_ptr = sysservices;
  63896. 8034304: 2248 movs r2, #72 ; 0x48
  63897. 8034306: 601a str r2, [r3, #0]
  63898. 8034308: bd10 pop {r4, pc}
  63899. 803430a: bf00 nop
  63900. 803430c: 200008d0 .word 0x200008d0
  63901. 8034310: 20000800 .word 0x20000800
  63902. 8034314: 20000924 .word 0x20000924
  63903. 8034318: 200008b0 .word 0x200008b0
  63904. 803431c: 20000a3c .word 0x20000a3c
  63905. 08034320 <snmp_set_syscontact>:
  63906. * @param ocstr if non-NULL then copy str pointer
  63907. * @param ocstrlen points to string length, excluding zero terminator
  63908. */
  63909. void snmp_set_syscontact(u8_t *ocstr, u8_t *ocstrlen)
  63910. {
  63911. if (ocstr != NULL)
  63912. 8034320: b118 cbz r0, 803432a <snmp_set_syscontact+0xa>
  63913. {
  63914. syscontact_ptr = ocstr;
  63915. 8034322: 4b02 ldr r3, [pc, #8] ; (803432c <snmp_set_syscontact+0xc>)
  63916. 8034324: 6018 str r0, [r3, #0]
  63917. syscontact_len_ptr = ocstrlen;
  63918. 8034326: 4b02 ldr r3, [pc, #8] ; (8034330 <snmp_set_syscontact+0x10>)
  63919. 8034328: 6019 str r1, [r3, #0]
  63920. 803432a: 4770 bx lr
  63921. 803432c: 20000924 .word 0x20000924
  63922. 8034330: 200007a8 .word 0x200007a8
  63923. 08034334 <snmp_set_sysname>:
  63924. * @param ocstr if non-NULL then copy str pointer
  63925. * @param ocstrlen points to string length, excluding zero terminator
  63926. */
  63927. void snmp_set_sysname(u8_t *ocstr, u8_t *ocstrlen)
  63928. {
  63929. if (ocstr != NULL)
  63930. 8034334: b118 cbz r0, 803433e <snmp_set_sysname+0xa>
  63931. {
  63932. sysname_ptr = ocstr;
  63933. 8034336: 4b02 ldr r3, [pc, #8] ; (8034340 <snmp_set_sysname+0xc>)
  63934. 8034338: 6018 str r0, [r3, #0]
  63935. sysname_len_ptr = ocstrlen;
  63936. 803433a: 4b02 ldr r3, [pc, #8] ; (8034344 <snmp_set_sysname+0x10>)
  63937. 803433c: 6019 str r1, [r3, #0]
  63938. 803433e: 4770 bx lr
  63939. 8034340: 200008b0 .word 0x200008b0
  63940. 8034344: 200007a4 .word 0x200007a4
  63941. 08034348 <snmp_set_syslocation>:
  63942. * @param ocstr if non-NULL then copy str pointer
  63943. * @param ocstrlen points to string length, excluding zero terminator
  63944. */
  63945. void snmp_set_syslocation(u8_t *ocstr, u8_t *ocstrlen)
  63946. {
  63947. if (ocstr != NULL)
  63948. 8034348: b118 cbz r0, 8034352 <snmp_set_syslocation+0xa>
  63949. {
  63950. syslocation_ptr = ocstr;
  63951. 803434a: 4b02 ldr r3, [pc, #8] ; (8034354 <snmp_set_syslocation+0xc>)
  63952. 803434c: 6018 str r0, [r3, #0]
  63953. syslocation_len_ptr = ocstrlen;
  63954. 803434e: 4b02 ldr r3, [pc, #8] ; (8034358 <snmp_set_syslocation+0x10>)
  63955. 8034350: 6019 str r1, [r3, #0]
  63956. 8034352: 4770 bx lr
  63957. 8034354: 20000a3c .word 0x20000a3c
  63958. 8034358: 20000990 .word 0x20000990
  63959. 0803435c <snmp_inc_iflist>:
  63960. {
  63961. (ni->ifoutdiscards)++;
  63962. }
  63963. void snmp_inc_iflist(void)
  63964. {
  63965. 803435c: b507 push {r0, r1, r2, lr}
  63966. struct mib_list_node *if_node = NULL;
  63967. snmp_mib_node_insert(&iflist_root, iflist_root.count + 1, &if_node);
  63968. 803435e: 4806 ldr r0, [pc, #24] ; (8034378 <snmp_inc_iflist+0x1c>)
  63969. (ni->ifoutdiscards)++;
  63970. }
  63971. void snmp_inc_iflist(void)
  63972. {
  63973. struct mib_list_node *if_node = NULL;
  63974. 8034360: aa02 add r2, sp, #8
  63975. snmp_mib_node_insert(&iflist_root, iflist_root.count + 1, &if_node);
  63976. 8034362: 8b81 ldrh r1, [r0, #28]
  63977. (ni->ifoutdiscards)++;
  63978. }
  63979. void snmp_inc_iflist(void)
  63980. {
  63981. struct mib_list_node *if_node = NULL;
  63982. 8034364: 2300 movs r3, #0
  63983. 8034366: f842 3d04 str.w r3, [r2, #-4]!
  63984. snmp_mib_node_insert(&iflist_root, iflist_root.count + 1, &if_node);
  63985. 803436a: 3101 adds r1, #1
  63986. 803436c: f000 fccc bl 8034d08 <snmp_mib_node_insert>
  63987. /* enable getnext traversal on filled table */
  63988. iftable.maxlength = 1;
  63989. 8034370: 4b02 ldr r3, [pc, #8] ; (803437c <snmp_inc_iflist+0x20>)
  63990. 8034372: 2201 movs r2, #1
  63991. 8034374: 825a strh r2, [r3, #18]
  63992. }
  63993. 8034376: bd0e pop {r1, r2, r3, pc}
  63994. 8034378: 200007dc .word 0x200007dc
  63995. 803437c: 20000954 .word 0x20000954
  63996. 08034380 <snmp_insert_arpidx_tree>:
  63997. /**
  63998. * Inserts ARP table indexes (.xIfIndex.xNetAddress)
  63999. * into arp table index trees (both atTable and ipNetToMediaTable).
  64000. */
  64001. void snmp_insert_arpidx_tree(struct netif *ni, ip_addr_t *ip)
  64002. {
  64003. 8034380: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
  64004. 8034384: b086 sub sp, #24
  64005. 8034386: 460c mov r4, r1
  64006. struct mib_list_node *at_node;
  64007. s32_t arpidx[5];
  64008. u8_t level, tree;
  64009. LWIP_ASSERT("ni != NULL", ni != NULL);
  64010. snmp_netiftoifindex(ni, &arpidx[0]);
  64011. 8034388: a901 add r1, sp, #4
  64012. 803438a: f000 fc65 bl 8034c58 <snmp_netiftoifindex>
  64013. snmp_iptooid(ip, &arpidx[1]);
  64014. 803438e: 4620 mov r0, r4
  64015. 8034390: a902 add r1, sp, #8
  64016. 8034392: f000 fc7e bl 8034c92 <snmp_iptooid>
  64017. for (tree = 0; tree < 2; tree++)
  64018. {
  64019. if (tree == 0)
  64020. {
  64021. at_rn = &arptree_root;
  64022. 8034396: f8df 80a0 ldr.w r8, [pc, #160] ; 8034438 <snmp_insert_arpidx_tree+0xb8>
  64023. LWIP_ASSERT("ni != NULL", ni != NULL);
  64024. snmp_netiftoifindex(ni, &arpidx[0]);
  64025. snmp_iptooid(ip, &arpidx[1]);
  64026. for (tree = 0; tree < 2; tree++)
  64027. 803439a: 2500 movs r5, #0
  64028. {
  64029. if (tree == 0)
  64030. {
  64031. at_rn = &arptree_root;
  64032. 803439c: 4c1f ldr r4, [pc, #124] ; (803441c <snmp_insert_arpidx_tree+0x9c>)
  64033. else
  64034. {
  64035. at_rn->get_object_def = ip_ntomentry_get_object_def;
  64036. at_rn->get_value = ip_ntomentry_get_value;
  64037. }
  64038. at_rn->set_test = noleafs_set_test;
  64039. 803439e: f8df 909c ldr.w r9, [pc, #156] ; 803443c <snmp_insert_arpidx_tree+0xbc>
  64040. at_rn->set_value = noleafs_set_value;
  64041. 80343a2: f8df a09c ldr.w sl, [pc, #156] ; 8034440 <snmp_insert_arpidx_tree+0xc0>
  64042. for (tree = 0; tree < 2; tree++)
  64043. {
  64044. if (tree == 0)
  64045. {
  64046. at_rn = &arptree_root;
  64047. 80343a6: 2d00 cmp r5, #0
  64048. 80343a8: bf18 it ne
  64049. 80343aa: 4644 movne r4, r8
  64050. }
  64051. else
  64052. {
  64053. at_rn = &ipntomtree_root;
  64054. 80343ac: 2600 movs r6, #0
  64055. }
  64056. for (level = 0; level < 5; level++)
  64057. {
  64058. at_node = NULL;
  64059. 80343ae: 2300 movs r3, #0
  64060. 80343b0: 9300 str r3, [sp, #0]
  64061. snmp_mib_node_insert(at_rn, arpidx[level], &at_node);
  64062. 80343b2: ab01 add r3, sp, #4
  64063. 80343b4: 4620 mov r0, r4
  64064. 80343b6: f853 1026 ldr.w r1, [r3, r6, lsl #2]
  64065. 80343ba: aa00 add r2, sp, #0
  64066. 80343bc: b2f7 uxtb r7, r6
  64067. 80343be: f000 fca3 bl 8034d08 <snmp_mib_node_insert>
  64068. if ((level != 4) && (at_node != NULL))
  64069. 80343c2: 2f04 cmp r7, #4
  64070. 80343c4: d01d beq.n 8034402 <snmp_insert_arpidx_tree+0x82>
  64071. 80343c6: 9b00 ldr r3, [sp, #0]
  64072. 80343c8: b1db cbz r3, 8034402 <snmp_insert_arpidx_tree+0x82>
  64073. {
  64074. if (at_node->nptr == NULL)
  64075. 80343ca: 68dc ldr r4, [r3, #12]
  64076. 80343cc: b9cc cbnz r4, 8034402 <snmp_insert_arpidx_tree+0x82>
  64077. {
  64078. at_rn = snmp_mib_lrn_alloc();
  64079. 80343ce: f000 fc79 bl 8034cc4 <snmp_mib_lrn_alloc>
  64080. at_node->nptr = (struct mib_node*)at_rn;
  64081. 80343d2: 9b00 ldr r3, [sp, #0]
  64082. snmp_mib_node_insert(at_rn, arpidx[level], &at_node);
  64083. if ((level != 4) && (at_node != NULL))
  64084. {
  64085. if (at_node->nptr == NULL)
  64086. {
  64087. at_rn = snmp_mib_lrn_alloc();
  64088. 80343d4: 4604 mov r4, r0
  64089. at_node->nptr = (struct mib_node*)at_rn;
  64090. 80343d6: 60d8 str r0, [r3, #12]
  64091. if (at_rn != NULL)
  64092. 80343d8: b920 cbnz r0, 80343e4 <snmp_insert_arpidx_tree+0x64>
  64093. LWIP_ASSERT("ni != NULL", ni != NULL);
  64094. snmp_netiftoifindex(ni, &arpidx[0]);
  64095. snmp_iptooid(ip, &arpidx[1]);
  64096. for (tree = 0; tree < 2; tree++)
  64097. 80343da: 3501 adds r5, #1
  64098. 80343dc: b2ed uxtb r5, r5
  64099. 80343de: 2d02 cmp r5, #2
  64100. 80343e0: d1dc bne.n 803439c <snmp_insert_arpidx_tree+0x1c>
  64101. 80343e2: e012 b.n 803440a <snmp_insert_arpidx_tree+0x8a>
  64102. {
  64103. at_rn = snmp_mib_lrn_alloc();
  64104. at_node->nptr = (struct mib_node*)at_rn;
  64105. if (at_rn != NULL)
  64106. {
  64107. if (level == 3)
  64108. 80343e4: 2f03 cmp r7, #3
  64109. 80343e6: d10c bne.n 8034402 <snmp_insert_arpidx_tree+0x82>
  64110. {
  64111. if (tree == 0)
  64112. 80343e8: b91d cbnz r5, 80343f2 <snmp_insert_arpidx_tree+0x72>
  64113. {
  64114. at_rn->get_object_def = atentry_get_object_def;
  64115. 80343ea: 4b0d ldr r3, [pc, #52] ; (8034420 <snmp_insert_arpidx_tree+0xa0>)
  64116. 80343ec: 6003 str r3, [r0, #0]
  64117. at_rn->get_value = atentry_get_value;
  64118. 80343ee: 4b0d ldr r3, [pc, #52] ; (8034424 <snmp_insert_arpidx_tree+0xa4>)
  64119. 80343f0: e002 b.n 80343f8 <snmp_insert_arpidx_tree+0x78>
  64120. }
  64121. else
  64122. {
  64123. at_rn->get_object_def = ip_ntomentry_get_object_def;
  64124. 80343f2: 4b0d ldr r3, [pc, #52] ; (8034428 <snmp_insert_arpidx_tree+0xa8>)
  64125. 80343f4: 6003 str r3, [r0, #0]
  64126. at_rn->get_value = ip_ntomentry_get_value;
  64127. 80343f6: 4b0d ldr r3, [pc, #52] ; (803442c <snmp_insert_arpidx_tree+0xac>)
  64128. 80343f8: 6063 str r3, [r4, #4]
  64129. }
  64130. at_rn->set_test = noleafs_set_test;
  64131. 80343fa: f8c4 9008 str.w r9, [r4, #8]
  64132. at_rn->set_value = noleafs_set_value;
  64133. 80343fe: f8c4 a00c str.w sl, [r4, #12]
  64134. 8034402: 3601 adds r6, #1
  64135. }
  64136. else
  64137. {
  64138. at_rn = &ipntomtree_root;
  64139. }
  64140. for (level = 0; level < 5; level++)
  64141. 8034404: 2e05 cmp r6, #5
  64142. 8034406: d1d2 bne.n 80343ae <snmp_insert_arpidx_tree+0x2e>
  64143. 8034408: e7e7 b.n 80343da <snmp_insert_arpidx_tree+0x5a>
  64144. }
  64145. }
  64146. }
  64147. }
  64148. /* enable getnext traversal on filled tables */
  64149. at.maxlength = 1;
  64150. 803440a: 4a09 ldr r2, [pc, #36] ; (8034430 <snmp_insert_arpidx_tree+0xb0>)
  64151. 803440c: 2301 movs r3, #1
  64152. 803440e: 8253 strh r3, [r2, #18]
  64153. ipntomtable.maxlength = 1;
  64154. 8034410: 4a08 ldr r2, [pc, #32] ; (8034434 <snmp_insert_arpidx_tree+0xb4>)
  64155. 8034412: 8253 strh r3, [r2, #18]
  64156. }
  64157. 8034414: b006 add sp, #24
  64158. 8034416: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc}
  64159. 803441a: bf00 nop
  64160. 803441c: 20000928 .word 0x20000928
  64161. 8034420: 08033e09 .word 0x08033e09
  64162. 8034424: 08033d61 .word 0x08033d61
  64163. 8034428: 08033eed .word 0x08033eed
  64164. 803442c: 08033d05 .word 0x08033d05
  64165. 8034430: 2000074c .word 0x2000074c
  64166. 8034434: 20000730 .word 0x20000730
  64167. 8034438: 20000a18 .word 0x20000a18
  64168. 803443c: 08033623 .word 0x08033623
  64169. 8034440: 08033627 .word 0x08033627
  64170. 08034444 <snmp_delete_arpidx_tree>:
  64171. /**
  64172. * Removes ARP table indexes (.xIfIndex.xNetAddress)
  64173. * from arp table index trees.
  64174. */
  64175. void snmp_delete_arpidx_tree(struct netif *ni, ip_addr_t *ip)
  64176. {
  64177. 8034444: b5f0 push {r4, r5, r6, r7, lr}
  64178. 8034446: b091 sub sp, #68 ; 0x44
  64179. 8034448: 460c mov r4, r1
  64180. struct mib_list_rootnode *at_rn, *next, *del_rn[5];
  64181. struct mib_list_node *at_n, *del_n[5];
  64182. s32_t arpidx[5];
  64183. u8_t fc, tree, level, del_cnt;
  64184. snmp_netiftoifindex(ni, &arpidx[0]);
  64185. 803444a: a90b add r1, sp, #44 ; 0x2c
  64186. 803444c: f000 fc04 bl 8034c58 <snmp_netiftoifindex>
  64187. snmp_iptooid(ip, &arpidx[1]);
  64188. 8034450: 4620 mov r0, r4
  64189. 8034452: a90c add r1, sp, #48 ; 0x30
  64190. 8034454: f000 fc1d bl 8034c92 <snmp_iptooid>
  64191. for (tree = 0; tree < 2; tree++)
  64192. 8034458: 2700 movs r7, #0
  64193. {
  64194. /* mark nodes for deletion */
  64195. if (tree == 0)
  64196. {
  64197. at_rn = &arptree_root;
  64198. 803445a: 4b26 ldr r3, [pc, #152] ; (80344f4 <snmp_delete_arpidx_tree+0xb0>)
  64199. 803445c: 4d26 ldr r5, [pc, #152] ; (80344f8 <snmp_delete_arpidx_tree+0xb4>)
  64200. }
  64201. else
  64202. {
  64203. at_rn = &ipntomtree_root;
  64204. 803445e: 2600 movs r6, #0
  64205. for (tree = 0; tree < 2; tree++)
  64206. {
  64207. /* mark nodes for deletion */
  64208. if (tree == 0)
  64209. {
  64210. at_rn = &arptree_root;
  64211. 8034460: 2f00 cmp r7, #0
  64212. 8034462: bf08 it eq
  64213. 8034464: 461d moveq r5, r3
  64214. }
  64215. else
  64216. {
  64217. at_rn = &ipntomtree_root;
  64218. 8034466: 4634 mov r4, r6
  64219. }
  64220. level = 0;
  64221. del_cnt = 0;
  64222. while ((level < 5) && (at_rn != NULL))
  64223. {
  64224. fc = snmp_mib_node_find(at_rn, arpidx[level], &at_n);
  64225. 8034468: ab0b add r3, sp, #44 ; 0x2c
  64226. 803446a: 4628 mov r0, r5
  64227. 803446c: 58f1 ldr r1, [r6, r3]
  64228. 803446e: aa00 add r2, sp, #0
  64229. 8034470: f000 fc85 bl 8034d7e <snmp_mib_node_find>
  64230. 8034474: b2c0 uxtb r0, r0
  64231. if (fc == 0)
  64232. 8034476: b198 cbz r0, 80344a0 <snmp_delete_arpidx_tree+0x5c>
  64233. {
  64234. /* arpidx[level] does not exist */
  64235. del_cnt = 0;
  64236. at_rn = NULL;
  64237. }
  64238. else if (fc == 1)
  64239. 8034478: 2801 cmp r0, #1
  64240. 803447a: d10b bne.n 8034494 <snmp_delete_arpidx_tree+0x50>
  64241. {
  64242. del_rn[del_cnt] = at_rn;
  64243. 803447c: ab10 add r3, sp, #64 ; 0x40
  64244. 803447e: eb03 0284 add.w r2, r3, r4, lsl #2
  64245. del_n[del_cnt] = at_n;
  64246. 8034482: 9b00 ldr r3, [sp, #0]
  64247. del_cnt = 0;
  64248. at_rn = NULL;
  64249. }
  64250. else if (fc == 1)
  64251. {
  64252. del_rn[del_cnt] = at_rn;
  64253. 8034484: f842 5c3c str.w r5, [r2, #-60]
  64254. del_n[del_cnt] = at_n;
  64255. del_cnt++;
  64256. 8034488: 3401 adds r4, #1
  64257. at_rn = NULL;
  64258. }
  64259. else if (fc == 1)
  64260. {
  64261. del_rn[del_cnt] = at_rn;
  64262. del_n[del_cnt] = at_n;
  64263. 803448a: f842 3c28 str.w r3, [r2, #-40]
  64264. del_cnt++;
  64265. 803448e: b2e4 uxtb r4, r4
  64266. at_rn = (struct mib_list_rootnode*)(at_n->nptr);
  64267. 8034490: 68dd ldr r5, [r3, #12]
  64268. 8034492: e007 b.n 80344a4 <snmp_delete_arpidx_tree+0x60>
  64269. }
  64270. else if (fc == 2)
  64271. 8034494: 2802 cmp r0, #2
  64272. 8034496: d105 bne.n 80344a4 <snmp_delete_arpidx_tree+0x60>
  64273. {
  64274. /* reset delete (2 or more childs) */
  64275. del_cnt = 0;
  64276. at_rn = (struct mib_list_rootnode*)(at_n->nptr);
  64277. 8034498: 9b00 ldr r3, [sp, #0]
  64278. at_rn = (struct mib_list_rootnode*)(at_n->nptr);
  64279. }
  64280. else if (fc == 2)
  64281. {
  64282. /* reset delete (2 or more childs) */
  64283. del_cnt = 0;
  64284. 803449a: 2400 movs r4, #0
  64285. at_rn = (struct mib_list_rootnode*)(at_n->nptr);
  64286. 803449c: 68dd ldr r5, [r3, #12]
  64287. 803449e: e001 b.n 80344a4 <snmp_delete_arpidx_tree+0x60>
  64288. {
  64289. fc = snmp_mib_node_find(at_rn, arpidx[level], &at_n);
  64290. if (fc == 0)
  64291. {
  64292. /* arpidx[level] does not exist */
  64293. del_cnt = 0;
  64294. 80344a0: 4604 mov r4, r0
  64295. at_rn = NULL;
  64296. 80344a2: 4605 mov r5, r0
  64297. 80344a4: 3604 adds r6, #4
  64298. {
  64299. at_rn = &ipntomtree_root;
  64300. }
  64301. level = 0;
  64302. del_cnt = 0;
  64303. while ((level < 5) && (at_rn != NULL))
  64304. 80344a6: 2e14 cmp r6, #20
  64305. 80344a8: d011 beq.n 80344ce <snmp_delete_arpidx_tree+0x8a>
  64306. 80344aa: 2d00 cmp r5, #0
  64307. 80344ac: d1dc bne.n 8034468 <snmp_delete_arpidx_tree+0x24>
  64308. 80344ae: e00e b.n 80344ce <snmp_delete_arpidx_tree+0x8a>
  64309. level++;
  64310. }
  64311. /* delete marked index nodes */
  64312. while (del_cnt > 0)
  64313. {
  64314. del_cnt--;
  64315. 80344b0: 3c01 subs r4, #1
  64316. 80344b2: b2e4 uxtb r4, r4
  64317. at_rn = del_rn[del_cnt];
  64318. 80344b4: aa10 add r2, sp, #64 ; 0x40
  64319. 80344b6: eb02 0384 add.w r3, r2, r4, lsl #2
  64320. at_n = del_n[del_cnt];
  64321. 80344ba: f853 1c28 ldr.w r1, [r3, #-40]
  64322. /* delete marked index nodes */
  64323. while (del_cnt > 0)
  64324. {
  64325. del_cnt--;
  64326. at_rn = del_rn[del_cnt];
  64327. 80344be: f853 0c3c ldr.w r0, [r3, #-60]
  64328. at_n = del_n[del_cnt];
  64329. 80344c2: 9100 str r1, [sp, #0]
  64330. next = snmp_mib_node_delete(at_rn, at_n);
  64331. 80344c4: f000 fc75 bl 8034db2 <snmp_mib_node_delete>
  64332. if (next != NULL)
  64333. 80344c8: b108 cbz r0, 80344ce <snmp_delete_arpidx_tree+0x8a>
  64334. {
  64335. LWIP_ASSERT("next_count == 0",next->count == 0);
  64336. snmp_mib_lrn_free(next);
  64337. 80344ca: f000 fc19 bl 8034d00 <snmp_mib_lrn_free>
  64338. at_rn = (struct mib_list_rootnode*)(at_n->nptr);
  64339. }
  64340. level++;
  64341. }
  64342. /* delete marked index nodes */
  64343. while (del_cnt > 0)
  64344. 80344ce: 2c00 cmp r4, #0
  64345. 80344d0: d1ee bne.n 80344b0 <snmp_delete_arpidx_tree+0x6c>
  64346. u8_t fc, tree, level, del_cnt;
  64347. snmp_netiftoifindex(ni, &arpidx[0]);
  64348. snmp_iptooid(ip, &arpidx[1]);
  64349. for (tree = 0; tree < 2; tree++)
  64350. 80344d2: 3701 adds r7, #1
  64351. 80344d4: b2ff uxtb r7, r7
  64352. 80344d6: 2f02 cmp r7, #2
  64353. 80344d8: d1bf bne.n 803445a <snmp_delete_arpidx_tree+0x16>
  64354. snmp_mib_lrn_free(next);
  64355. }
  64356. }
  64357. }
  64358. /* disable getnext traversal on empty tables */
  64359. if(arptree_root.count == 0) at.maxlength = 0;
  64360. 80344da: 4b06 ldr r3, [pc, #24] ; (80344f4 <snmp_delete_arpidx_tree+0xb0>)
  64361. 80344dc: 8b9b ldrh r3, [r3, #28]
  64362. 80344de: b90b cbnz r3, 80344e4 <snmp_delete_arpidx_tree+0xa0>
  64363. 80344e0: 4b06 ldr r3, [pc, #24] ; (80344fc <snmp_delete_arpidx_tree+0xb8>)
  64364. 80344e2: 825c strh r4, [r3, #18]
  64365. if(ipntomtree_root.count == 0) ipntomtable.maxlength = 0;
  64366. 80344e4: 4b04 ldr r3, [pc, #16] ; (80344f8 <snmp_delete_arpidx_tree+0xb4>)
  64367. 80344e6: 8b9b ldrh r3, [r3, #28]
  64368. 80344e8: b90b cbnz r3, 80344ee <snmp_delete_arpidx_tree+0xaa>
  64369. 80344ea: 4a05 ldr r2, [pc, #20] ; (8034500 <snmp_delete_arpidx_tree+0xbc>)
  64370. 80344ec: 8253 strh r3, [r2, #18]
  64371. }
  64372. 80344ee: b011 add sp, #68 ; 0x44
  64373. 80344f0: bdf0 pop {r4, r5, r6, r7, pc}
  64374. 80344f2: bf00 nop
  64375. 80344f4: 20000928 .word 0x20000928
  64376. 80344f8: 20000a18 .word 0x20000a18
  64377. 80344fc: 2000074c .word 0x2000074c
  64378. 8034500: 20000730 .word 0x20000730
  64379. 08034504 <snmp_inc_ipinreceives>:
  64380. void snmp_inc_ipinreceives(void)
  64381. {
  64382. ipinreceives++;
  64383. 8034504: 4b02 ldr r3, [pc, #8] ; (8034510 <snmp_inc_ipinreceives+0xc>)
  64384. 8034506: 681a ldr r2, [r3, #0]
  64385. 8034508: 3201 adds r2, #1
  64386. 803450a: 601a str r2, [r3, #0]
  64387. 803450c: 4770 bx lr
  64388. 803450e: bf00 nop
  64389. 8034510: 2000c528 .word 0x2000c528
  64390. 08034514 <snmp_inc_ipinhdrerrors>:
  64391. }
  64392. void snmp_inc_ipinhdrerrors(void)
  64393. {
  64394. ipinhdrerrors++;
  64395. 8034514: 4b02 ldr r3, [pc, #8] ; (8034520 <snmp_inc_ipinhdrerrors+0xc>)
  64396. 8034516: 681a ldr r2, [r3, #0]
  64397. 8034518: 3201 adds r2, #1
  64398. 803451a: 601a str r2, [r3, #0]
  64399. 803451c: 4770 bx lr
  64400. 803451e: bf00 nop
  64401. 8034520: 2000c4b0 .word 0x2000c4b0
  64402. 08034524 <snmp_inc_ipinaddrerrors>:
  64403. }
  64404. void snmp_inc_ipinaddrerrors(void)
  64405. {
  64406. ipinaddrerrors++;
  64407. 8034524: 4b02 ldr r3, [pc, #8] ; (8034530 <snmp_inc_ipinaddrerrors+0xc>)
  64408. 8034526: 681a ldr r2, [r3, #0]
  64409. 8034528: 3201 adds r2, #1
  64410. 803452a: 601a str r2, [r3, #0]
  64411. 803452c: 4770 bx lr
  64412. 803452e: bf00 nop
  64413. 8034530: 2000c494 .word 0x2000c494
  64414. 08034534 <snmp_inc_ipinunknownprotos>:
  64415. ipforwdatagrams++;
  64416. }
  64417. void snmp_inc_ipinunknownprotos(void)
  64418. {
  64419. ipinunknownprotos++;
  64420. 8034534: 4b02 ldr r3, [pc, #8] ; (8034540 <snmp_inc_ipinunknownprotos+0xc>)
  64421. 8034536: 681a ldr r2, [r3, #0]
  64422. 8034538: 3201 adds r2, #1
  64423. 803453a: 601a str r2, [r3, #0]
  64424. 803453c: 4770 bx lr
  64425. 803453e: bf00 nop
  64426. 8034540: 2000c4f0 .word 0x2000c4f0
  64427. 08034544 <snmp_inc_ipindiscards>:
  64428. }
  64429. void snmp_inc_ipindiscards(void)
  64430. {
  64431. ipindiscards++;
  64432. 8034544: 4b02 ldr r3, [pc, #8] ; (8034550 <snmp_inc_ipindiscards+0xc>)
  64433. 8034546: 681a ldr r2, [r3, #0]
  64434. 8034548: 3201 adds r2, #1
  64435. 803454a: 601a str r2, [r3, #0]
  64436. 803454c: 4770 bx lr
  64437. 803454e: bf00 nop
  64438. 8034550: 2000c57c .word 0x2000c57c
  64439. 08034554 <snmp_inc_ipindelivers>:
  64440. }
  64441. void snmp_inc_ipindelivers(void)
  64442. {
  64443. ipindelivers++;
  64444. 8034554: 4b02 ldr r3, [pc, #8] ; (8034560 <snmp_inc_ipindelivers+0xc>)
  64445. 8034556: 681a ldr r2, [r3, #0]
  64446. 8034558: 3201 adds r2, #1
  64447. 803455a: 601a str r2, [r3, #0]
  64448. 803455c: 4770 bx lr
  64449. 803455e: bf00 nop
  64450. 8034560: 2000c5b4 .word 0x2000c5b4
  64451. 08034564 <snmp_inc_ipoutrequests>:
  64452. }
  64453. void snmp_inc_ipoutrequests(void)
  64454. {
  64455. ipoutrequests++;
  64456. 8034564: 4b02 ldr r3, [pc, #8] ; (8034570 <snmp_inc_ipoutrequests+0xc>)
  64457. 8034566: 681a ldr r2, [r3, #0]
  64458. 8034568: 3201 adds r2, #1
  64459. 803456a: 601a str r2, [r3, #0]
  64460. 803456c: 4770 bx lr
  64461. 803456e: bf00 nop
  64462. 8034570: 2000c59c .word 0x2000c59c
  64463. 08034574 <snmp_inc_ipoutdiscards>:
  64464. }
  64465. void snmp_inc_ipoutdiscards(void)
  64466. {
  64467. ipoutdiscards++;
  64468. 8034574: 4b02 ldr r3, [pc, #8] ; (8034580 <snmp_inc_ipoutdiscards+0xc>)
  64469. 8034576: 681a ldr r2, [r3, #0]
  64470. 8034578: 3201 adds r2, #1
  64471. 803457a: 601a str r2, [r3, #0]
  64472. 803457c: 4770 bx lr
  64473. 803457e: bf00 nop
  64474. 8034580: 2000c540 .word 0x2000c540
  64475. 08034584 <snmp_inc_ipoutnoroutes>:
  64476. }
  64477. void snmp_inc_ipoutnoroutes(void)
  64478. {
  64479. ipoutnoroutes++;
  64480. 8034584: 4b02 ldr r3, [pc, #8] ; (8034590 <snmp_inc_ipoutnoroutes+0xc>)
  64481. 8034586: 681a ldr r2, [r3, #0]
  64482. 8034588: 3201 adds r2, #1
  64483. 803458a: 601a str r2, [r3, #0]
  64484. 803458c: 4770 bx lr
  64485. 803458e: bf00 nop
  64486. 8034590: 2000c5c0 .word 0x2000c5c0
  64487. 08034594 <snmp_insert_ipaddridx_tree>:
  64488. /**
  64489. * Inserts ipAddrTable indexes (.ipAdEntAddr)
  64490. * into index tree.
  64491. */
  64492. void snmp_insert_ipaddridx_tree(struct netif *ni)
  64493. {
  64494. 8034594: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  64495. 8034598: b086 sub sp, #24
  64496. struct mib_list_node *ipa_node;
  64497. s32_t ipaddridx[4];
  64498. u8_t level;
  64499. LWIP_ASSERT("ni != NULL", ni != NULL);
  64500. snmp_iptooid(&ni->ip_addr, &ipaddridx[0]);
  64501. 803459a: 3004 adds r0, #4
  64502. 803459c: a902 add r1, sp, #8
  64503. 803459e: f000 fb78 bl 8034c92 <snmp_iptooid>
  64504. level = 0;
  64505. ipa_rn = &ipaddrtree_root;
  64506. 80345a2: 4c17 ldr r4, [pc, #92] ; (8034600 <snmp_insert_ipaddridx_tree+0x6c>)
  64507. ipa_node->nptr = (struct mib_node*)ipa_rn;
  64508. if (ipa_rn != NULL)
  64509. {
  64510. if (level == 2)
  64511. {
  64512. ipa_rn->get_object_def = ip_addrentry_get_object_def;
  64513. 80345a4: 4f17 ldr r7, [pc, #92] ; (8034604 <snmp_insert_ipaddridx_tree+0x70>)
  64514. ipa_rn->get_value = ip_addrentry_get_value;
  64515. 80345a6: f8df 806c ldr.w r8, [pc, #108] ; 8034614 <snmp_insert_ipaddridx_tree+0x80>
  64516. struct mib_list_node *ipa_node;
  64517. s32_t ipaddridx[4];
  64518. u8_t level;
  64519. LWIP_ASSERT("ni != NULL", ni != NULL);
  64520. snmp_iptooid(&ni->ip_addr, &ipaddridx[0]);
  64521. 80345aa: 2500 movs r5, #0
  64522. level = 0;
  64523. ipa_rn = &ipaddrtree_root;
  64524. while (level < 4)
  64525. {
  64526. ipa_node = NULL;
  64527. 80345ac: 2300 movs r3, #0
  64528. 80345ae: 9301 str r3, [sp, #4]
  64529. snmp_mib_node_insert(ipa_rn, ipaddridx[level], &ipa_node);
  64530. 80345b0: ab02 add r3, sp, #8
  64531. 80345b2: 4620 mov r0, r4
  64532. 80345b4: f853 1025 ldr.w r1, [r3, r5, lsl #2]
  64533. 80345b8: aa01 add r2, sp, #4
  64534. 80345ba: b2ee uxtb r6, r5
  64535. 80345bc: f000 fba4 bl 8034d08 <snmp_mib_node_insert>
  64536. if ((level != 3) && (ipa_node != NULL))
  64537. 80345c0: 2e03 cmp r6, #3
  64538. 80345c2: d015 beq.n 80345f0 <snmp_insert_ipaddridx_tree+0x5c>
  64539. 80345c4: 9b01 ldr r3, [sp, #4]
  64540. 80345c6: b19b cbz r3, 80345f0 <snmp_insert_ipaddridx_tree+0x5c>
  64541. {
  64542. if (ipa_node->nptr == NULL)
  64543. 80345c8: 68dc ldr r4, [r3, #12]
  64544. 80345ca: b98c cbnz r4, 80345f0 <snmp_insert_ipaddridx_tree+0x5c>
  64545. {
  64546. ipa_rn = snmp_mib_lrn_alloc();
  64547. 80345cc: f000 fb7a bl 8034cc4 <snmp_mib_lrn_alloc>
  64548. ipa_node->nptr = (struct mib_node*)ipa_rn;
  64549. 80345d0: 9b01 ldr r3, [sp, #4]
  64550. snmp_mib_node_insert(ipa_rn, ipaddridx[level], &ipa_node);
  64551. if ((level != 3) && (ipa_node != NULL))
  64552. {
  64553. if (ipa_node->nptr == NULL)
  64554. {
  64555. ipa_rn = snmp_mib_lrn_alloc();
  64556. 80345d2: 4604 mov r4, r0
  64557. ipa_node->nptr = (struct mib_node*)ipa_rn;
  64558. 80345d4: 60d8 str r0, [r3, #12]
  64559. if (ipa_rn != NULL)
  64560. 80345d6: b918 cbnz r0, 80345e0 <snmp_insert_ipaddridx_tree+0x4c>
  64561. }
  64562. }
  64563. level++;
  64564. }
  64565. /* enable getnext traversal on filled table */
  64566. ipaddrtable.maxlength = 1;
  64567. 80345d8: 4b0b ldr r3, [pc, #44] ; (8034608 <snmp_insert_ipaddridx_tree+0x74>)
  64568. 80345da: 2201 movs r2, #1
  64569. 80345dc: 825a strh r2, [r3, #18]
  64570. 80345de: e00b b.n 80345f8 <snmp_insert_ipaddridx_tree+0x64>
  64571. {
  64572. ipa_rn = snmp_mib_lrn_alloc();
  64573. ipa_node->nptr = (struct mib_node*)ipa_rn;
  64574. if (ipa_rn != NULL)
  64575. {
  64576. if (level == 2)
  64577. 80345e0: 2e02 cmp r6, #2
  64578. 80345e2: d105 bne.n 80345f0 <snmp_insert_ipaddridx_tree+0x5c>
  64579. {
  64580. ipa_rn->get_object_def = ip_addrentry_get_object_def;
  64581. ipa_rn->get_value = ip_addrentry_get_value;
  64582. ipa_rn->set_test = noleafs_set_test;
  64583. 80345e4: 4b09 ldr r3, [pc, #36] ; (803460c <snmp_insert_ipaddridx_tree+0x78>)
  64584. if (ipa_rn != NULL)
  64585. {
  64586. if (level == 2)
  64587. {
  64588. ipa_rn->get_object_def = ip_addrentry_get_object_def;
  64589. ipa_rn->get_value = ip_addrentry_get_value;
  64590. 80345e6: e880 0180 stmia.w r0, {r7, r8}
  64591. ipa_rn->set_test = noleafs_set_test;
  64592. 80345ea: 6083 str r3, [r0, #8]
  64593. ipa_rn->set_value = noleafs_set_value;
  64594. 80345ec: 4b08 ldr r3, [pc, #32] ; (8034610 <snmp_insert_ipaddridx_tree+0x7c>)
  64595. 80345ee: 60c3 str r3, [r0, #12]
  64596. 80345f0: 3501 adds r5, #1
  64597. LWIP_ASSERT("ni != NULL", ni != NULL);
  64598. snmp_iptooid(&ni->ip_addr, &ipaddridx[0]);
  64599. level = 0;
  64600. ipa_rn = &ipaddrtree_root;
  64601. while (level < 4)
  64602. 80345f2: 2d04 cmp r5, #4
  64603. 80345f4: d1da bne.n 80345ac <snmp_insert_ipaddridx_tree+0x18>
  64604. 80345f6: e7ef b.n 80345d8 <snmp_insert_ipaddridx_tree+0x44>
  64605. }
  64606. level++;
  64607. }
  64608. /* enable getnext traversal on filled table */
  64609. ipaddrtable.maxlength = 1;
  64610. }
  64611. 80345f8: b006 add sp, #24
  64612. 80345fa: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  64613. 80345fe: bf00 nop
  64614. 8034600: 20000884 .word 0x20000884
  64615. 8034604: 08033ea9 .word 0x08033ea9
  64616. 8034608: 20000908 .word 0x20000908
  64617. 803460c: 08033623 .word 0x08033623
  64618. 8034610: 08033627 .word 0x08033627
  64619. 8034614: 08033c99 .word 0x08033c99
  64620. 08034618 <snmp_delete_ipaddridx_tree>:
  64621. /**
  64622. * Removes ipAddrTable indexes (.ipAdEntAddr)
  64623. * from index tree.
  64624. */
  64625. void snmp_delete_ipaddridx_tree(struct netif *ni)
  64626. {
  64627. 8034618: b570 push {r4, r5, r6, lr}
  64628. 803461a: b08e sub sp, #56 ; 0x38
  64629. struct mib_list_node *ipa_n, *del_n[4];
  64630. s32_t ipaddridx[4];
  64631. u8_t fc, level, del_cnt;
  64632. LWIP_ASSERT("ni != NULL", ni != NULL);
  64633. snmp_iptooid(&ni->ip_addr, &ipaddridx[0]);
  64634. 803461c: 3004 adds r0, #4
  64635. 803461e: a90a add r1, sp, #40 ; 0x28
  64636. 8034620: f000 fb37 bl 8034c92 <snmp_iptooid>
  64637. 8034624: 2600 movs r6, #0
  64638. /* mark nodes for deletion */
  64639. level = 0;
  64640. del_cnt = 0;
  64641. ipa_rn = &ipaddrtree_root;
  64642. 8034626: 4d1f ldr r5, [pc, #124] ; (80346a4 <snmp_delete_ipaddridx_tree+0x8c>)
  64643. LWIP_ASSERT("ni != NULL", ni != NULL);
  64644. snmp_iptooid(&ni->ip_addr, &ipaddridx[0]);
  64645. /* mark nodes for deletion */
  64646. level = 0;
  64647. del_cnt = 0;
  64648. 8034628: 4634 mov r4, r6
  64649. ipa_rn = &ipaddrtree_root;
  64650. while ((level < 4) && (ipa_rn != NULL))
  64651. {
  64652. fc = snmp_mib_node_find(ipa_rn, ipaddridx[level], &ipa_n);
  64653. 803462a: ab0a add r3, sp, #40 ; 0x28
  64654. 803462c: 4628 mov r0, r5
  64655. 803462e: 58f1 ldr r1, [r6, r3]
  64656. 8034630: aa01 add r2, sp, #4
  64657. 8034632: f000 fba4 bl 8034d7e <snmp_mib_node_find>
  64658. 8034636: b2c0 uxtb r0, r0
  64659. if (fc == 0)
  64660. 8034638: b198 cbz r0, 8034662 <snmp_delete_ipaddridx_tree+0x4a>
  64661. {
  64662. /* ipaddridx[level] does not exist */
  64663. del_cnt = 0;
  64664. ipa_rn = NULL;
  64665. }
  64666. else if (fc == 1)
  64667. 803463a: 2801 cmp r0, #1
  64668. 803463c: d10b bne.n 8034656 <snmp_delete_ipaddridx_tree+0x3e>
  64669. {
  64670. del_rn[del_cnt] = ipa_rn;
  64671. 803463e: ab0e add r3, sp, #56 ; 0x38
  64672. 8034640: eb03 0284 add.w r2, r3, r4, lsl #2
  64673. del_n[del_cnt] = ipa_n;
  64674. 8034644: 9b01 ldr r3, [sp, #4]
  64675. del_cnt = 0;
  64676. ipa_rn = NULL;
  64677. }
  64678. else if (fc == 1)
  64679. {
  64680. del_rn[del_cnt] = ipa_rn;
  64681. 8034646: f842 5c30 str.w r5, [r2, #-48]
  64682. del_n[del_cnt] = ipa_n;
  64683. del_cnt++;
  64684. 803464a: 3401 adds r4, #1
  64685. ipa_rn = NULL;
  64686. }
  64687. else if (fc == 1)
  64688. {
  64689. del_rn[del_cnt] = ipa_rn;
  64690. del_n[del_cnt] = ipa_n;
  64691. 803464c: f842 3c20 str.w r3, [r2, #-32]
  64692. del_cnt++;
  64693. 8034650: b2e4 uxtb r4, r4
  64694. ipa_rn = (struct mib_list_rootnode*)(ipa_n->nptr);
  64695. 8034652: 68dd ldr r5, [r3, #12]
  64696. 8034654: e007 b.n 8034666 <snmp_delete_ipaddridx_tree+0x4e>
  64697. }
  64698. else if (fc == 2)
  64699. 8034656: 2802 cmp r0, #2
  64700. 8034658: d105 bne.n 8034666 <snmp_delete_ipaddridx_tree+0x4e>
  64701. {
  64702. /* reset delete (2 or more childs) */
  64703. del_cnt = 0;
  64704. ipa_rn = (struct mib_list_rootnode*)(ipa_n->nptr);
  64705. 803465a: 9b01 ldr r3, [sp, #4]
  64706. ipa_rn = (struct mib_list_rootnode*)(ipa_n->nptr);
  64707. }
  64708. else if (fc == 2)
  64709. {
  64710. /* reset delete (2 or more childs) */
  64711. del_cnt = 0;
  64712. 803465c: 2400 movs r4, #0
  64713. ipa_rn = (struct mib_list_rootnode*)(ipa_n->nptr);
  64714. 803465e: 68dd ldr r5, [r3, #12]
  64715. 8034660: e001 b.n 8034666 <snmp_delete_ipaddridx_tree+0x4e>
  64716. {
  64717. fc = snmp_mib_node_find(ipa_rn, ipaddridx[level], &ipa_n);
  64718. if (fc == 0)
  64719. {
  64720. /* ipaddridx[level] does not exist */
  64721. del_cnt = 0;
  64722. 8034662: 4604 mov r4, r0
  64723. ipa_rn = NULL;
  64724. 8034664: 4605 mov r5, r0
  64725. /* mark nodes for deletion */
  64726. level = 0;
  64727. del_cnt = 0;
  64728. ipa_rn = &ipaddrtree_root;
  64729. while ((level < 4) && (ipa_rn != NULL))
  64730. 8034666: 2e0c cmp r6, #12
  64731. 8034668: d012 beq.n 8034690 <snmp_delete_ipaddridx_tree+0x78>
  64732. 803466a: 3604 adds r6, #4
  64733. 803466c: 2d00 cmp r5, #0
  64734. 803466e: d1dc bne.n 803462a <snmp_delete_ipaddridx_tree+0x12>
  64735. 8034670: e00e b.n 8034690 <snmp_delete_ipaddridx_tree+0x78>
  64736. level++;
  64737. }
  64738. /* delete marked index nodes */
  64739. while (del_cnt > 0)
  64740. {
  64741. del_cnt--;
  64742. 8034672: 3c01 subs r4, #1
  64743. 8034674: b2e4 uxtb r4, r4
  64744. ipa_rn = del_rn[del_cnt];
  64745. 8034676: aa0e add r2, sp, #56 ; 0x38
  64746. 8034678: eb02 0384 add.w r3, r2, r4, lsl #2
  64747. ipa_n = del_n[del_cnt];
  64748. 803467c: f853 1c20 ldr.w r1, [r3, #-32]
  64749. /* delete marked index nodes */
  64750. while (del_cnt > 0)
  64751. {
  64752. del_cnt--;
  64753. ipa_rn = del_rn[del_cnt];
  64754. 8034680: f853 0c30 ldr.w r0, [r3, #-48]
  64755. ipa_n = del_n[del_cnt];
  64756. 8034684: 9101 str r1, [sp, #4]
  64757. next = snmp_mib_node_delete(ipa_rn, ipa_n);
  64758. 8034686: f000 fb94 bl 8034db2 <snmp_mib_node_delete>
  64759. if (next != NULL)
  64760. 803468a: b108 cbz r0, 8034690 <snmp_delete_ipaddridx_tree+0x78>
  64761. {
  64762. LWIP_ASSERT("next_count == 0",next->count == 0);
  64763. snmp_mib_lrn_free(next);
  64764. 803468c: f000 fb38 bl 8034d00 <snmp_mib_lrn_free>
  64765. ipa_rn = (struct mib_list_rootnode*)(ipa_n->nptr);
  64766. }
  64767. level++;
  64768. }
  64769. /* delete marked index nodes */
  64770. while (del_cnt > 0)
  64771. 8034690: 2c00 cmp r4, #0
  64772. 8034692: d1ee bne.n 8034672 <snmp_delete_ipaddridx_tree+0x5a>
  64773. LWIP_ASSERT("next_count == 0",next->count == 0);
  64774. snmp_mib_lrn_free(next);
  64775. }
  64776. }
  64777. /* disable getnext traversal on empty table */
  64778. if (ipaddrtree_root.count == 0) ipaddrtable.maxlength = 0;
  64779. 8034694: 4b03 ldr r3, [pc, #12] ; (80346a4 <snmp_delete_ipaddridx_tree+0x8c>)
  64780. 8034696: 8b9b ldrh r3, [r3, #28]
  64781. 8034698: b90b cbnz r3, 803469e <snmp_delete_ipaddridx_tree+0x86>
  64782. 803469a: 4b03 ldr r3, [pc, #12] ; (80346a8 <snmp_delete_ipaddridx_tree+0x90>)
  64783. 803469c: 825c strh r4, [r3, #18]
  64784. }
  64785. 803469e: b00e add sp, #56 ; 0x38
  64786. 80346a0: bd70 pop {r4, r5, r6, pc}
  64787. 80346a2: bf00 nop
  64788. 80346a4: 20000884 .word 0x20000884
  64789. 80346a8: 20000908 .word 0x20000908
  64790. 080346ac <snmp_insert_iprteidx_tree>:
  64791. *
  64792. * @todo record sysuptime for _this_ route when it is installed
  64793. * (needed for ipRouteAge) in the netif.
  64794. */
  64795. void snmp_insert_iprteidx_tree(u8_t dflt, struct netif *ni)
  64796. {
  64797. 80346ac: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  64798. 80346b0: b086 sub sp, #24
  64799. u8_t insert = 0;
  64800. ip_addr_t dst;
  64801. if (dflt != 0)
  64802. 80346b2: b110 cbz r0, 80346ba <snmp_insert_iprteidx_tree+0xe>
  64803. {
  64804. /* the default route 0.0.0.0 */
  64805. ip_addr_set_any(&dst);
  64806. 80346b4: 2300 movs r3, #0
  64807. 80346b6: 9300 str r3, [sp, #0]
  64808. 80346b8: e02b b.n 8034712 <snmp_insert_iprteidx_tree+0x66>
  64809. insert = 1;
  64810. }
  64811. else
  64812. {
  64813. /* route to the network address */
  64814. ip_addr_get_network(&dst, &ni->ip_addr, &ni->netmask);
  64815. 80346ba: 688a ldr r2, [r1, #8]
  64816. 80346bc: 684b ldr r3, [r1, #4]
  64817. 80346be: 4013 ands r3, r2
  64818. 80346c0: 9300 str r3, [sp, #0]
  64819. /* exclude 0.0.0.0 network (reserved for default rte) */
  64820. if (!ip_addr_isany(&dst)) {
  64821. 80346c2: bb33 cbnz r3, 8034712 <snmp_insert_iprteidx_tree+0x66>
  64822. 80346c4: e021 b.n 803470a <snmp_insert_iprteidx_tree+0x5e>
  64823. snmp_iptooid(&dst, &iprteidx[0]);
  64824. level = 0;
  64825. iprte_rn = &iprtetree_root;
  64826. while (level < 4)
  64827. {
  64828. iprte_node = NULL;
  64829. 80346c6: 2300 movs r3, #0
  64830. 80346c8: 9301 str r3, [sp, #4]
  64831. snmp_mib_node_insert(iprte_rn, iprteidx[level], &iprte_node);
  64832. 80346ca: ab02 add r3, sp, #8
  64833. 80346cc: 4620 mov r0, r4
  64834. 80346ce: f853 1025 ldr.w r1, [r3, r5, lsl #2]
  64835. 80346d2: aa01 add r2, sp, #4
  64836. 80346d4: b2ee uxtb r6, r5
  64837. 80346d6: f000 fb17 bl 8034d08 <snmp_mib_node_insert>
  64838. if ((level != 3) && (iprte_node != NULL))
  64839. 80346da: 2e03 cmp r6, #3
  64840. 80346dc: d012 beq.n 8034704 <snmp_insert_iprteidx_tree+0x58>
  64841. 80346de: 9b01 ldr r3, [sp, #4]
  64842. 80346e0: b183 cbz r3, 8034704 <snmp_insert_iprteidx_tree+0x58>
  64843. {
  64844. if (iprte_node->nptr == NULL)
  64845. 80346e2: 68dc ldr r4, [r3, #12]
  64846. 80346e4: b974 cbnz r4, 8034704 <snmp_insert_iprteidx_tree+0x58>
  64847. {
  64848. iprte_rn = snmp_mib_lrn_alloc();
  64849. 80346e6: f000 faed bl 8034cc4 <snmp_mib_lrn_alloc>
  64850. iprte_node->nptr = (struct mib_node*)iprte_rn;
  64851. 80346ea: 9b01 ldr r3, [sp, #4]
  64852. snmp_mib_node_insert(iprte_rn, iprteidx[level], &iprte_node);
  64853. if ((level != 3) && (iprte_node != NULL))
  64854. {
  64855. if (iprte_node->nptr == NULL)
  64856. {
  64857. iprte_rn = snmp_mib_lrn_alloc();
  64858. 80346ec: 4604 mov r4, r0
  64859. iprte_node->nptr = (struct mib_node*)iprte_rn;
  64860. 80346ee: 60d8 str r0, [r3, #12]
  64861. if (iprte_rn != NULL)
  64862. 80346f0: b158 cbz r0, 803470a <snmp_insert_iprteidx_tree+0x5e>
  64863. {
  64864. if (level == 2)
  64865. 80346f2: 2e02 cmp r6, #2
  64866. 80346f4: d106 bne.n 8034704 <snmp_insert_iprteidx_tree+0x58>
  64867. {
  64868. iprte_rn->get_object_def = ip_rteentry_get_object_def;
  64869. iprte_rn->get_value = ip_rteentry_get_value;
  64870. iprte_rn->set_test = noleafs_set_test;
  64871. 80346f6: 4b0d ldr r3, [pc, #52] ; (803472c <snmp_insert_iprteidx_tree+0x80>)
  64872. iprte_node->nptr = (struct mib_node*)iprte_rn;
  64873. if (iprte_rn != NULL)
  64874. {
  64875. if (level == 2)
  64876. {
  64877. iprte_rn->get_object_def = ip_rteentry_get_object_def;
  64878. 80346f8: f8c0 8000 str.w r8, [r0]
  64879. iprte_rn->get_value = ip_rteentry_get_value;
  64880. iprte_rn->set_test = noleafs_set_test;
  64881. 80346fc: 6083 str r3, [r0, #8]
  64882. iprte_rn->set_value = noleafs_set_value;
  64883. 80346fe: 4b0c ldr r3, [pc, #48] ; (8034730 <snmp_insert_iprteidx_tree+0x84>)
  64884. if (iprte_rn != NULL)
  64885. {
  64886. if (level == 2)
  64887. {
  64888. iprte_rn->get_object_def = ip_rteentry_get_object_def;
  64889. iprte_rn->get_value = ip_rteentry_get_value;
  64890. 8034700: 6047 str r7, [r0, #4]
  64891. iprte_rn->set_test = noleafs_set_test;
  64892. iprte_rn->set_value = noleafs_set_value;
  64893. 8034702: 60c3 str r3, [r0, #12]
  64894. 8034704: 3501 adds r5, #1
  64895. u8_t level;
  64896. snmp_iptooid(&dst, &iprteidx[0]);
  64897. level = 0;
  64898. iprte_rn = &iprtetree_root;
  64899. while (level < 4)
  64900. 8034706: 2d04 cmp r5, #4
  64901. 8034708: d1dd bne.n 80346c6 <snmp_insert_iprteidx_tree+0x1a>
  64902. }
  64903. level++;
  64904. }
  64905. }
  64906. /* enable getnext traversal on filled table */
  64907. iprtetable.maxlength = 1;
  64908. 803470a: 4b0a ldr r3, [pc, #40] ; (8034734 <snmp_insert_iprteidx_tree+0x88>)
  64909. 803470c: 2201 movs r2, #1
  64910. 803470e: 825a strh r2, [r3, #18]
  64911. 8034710: e009 b.n 8034726 <snmp_insert_iprteidx_tree+0x7a>
  64912. struct mib_list_rootnode *iprte_rn;
  64913. struct mib_list_node *iprte_node;
  64914. s32_t iprteidx[4];
  64915. u8_t level;
  64916. snmp_iptooid(&dst, &iprteidx[0]);
  64917. 8034712: 4668 mov r0, sp
  64918. 8034714: a902 add r1, sp, #8
  64919. 8034716: f000 fabc bl 8034c92 <snmp_iptooid>
  64920. 803471a: 2500 movs r5, #0
  64921. level = 0;
  64922. iprte_rn = &iprtetree_root;
  64923. 803471c: 4c06 ldr r4, [pc, #24] ; (8034738 <snmp_insert_iprteidx_tree+0x8c>)
  64924. iprte_node->nptr = (struct mib_node*)iprte_rn;
  64925. if (iprte_rn != NULL)
  64926. {
  64927. if (level == 2)
  64928. {
  64929. iprte_rn->get_object_def = ip_rteentry_get_object_def;
  64930. 803471e: f8df 8020 ldr.w r8, [pc, #32] ; 8034740 <snmp_insert_iprteidx_tree+0x94>
  64931. iprte_rn->get_value = ip_rteentry_get_value;
  64932. 8034722: 4f06 ldr r7, [pc, #24] ; (803473c <snmp_insert_iprteidx_tree+0x90>)
  64933. 8034724: e7cf b.n 80346c6 <snmp_insert_iprteidx_tree+0x1a>
  64934. level++;
  64935. }
  64936. }
  64937. /* enable getnext traversal on filled table */
  64938. iprtetable.maxlength = 1;
  64939. }
  64940. 8034726: b006 add sp, #24
  64941. 8034728: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  64942. 803472c: 08033623 .word 0x08033623
  64943. 8034730: 08033627 .word 0x08033627
  64944. 8034734: 20000970 .word 0x20000970
  64945. 8034738: 200007b4 .word 0x200007b4
  64946. 803473c: 080341a9 .word 0x080341a9
  64947. 8034740: 080337ed .word 0x080337ed
  64948. 08034744 <snmp_delete_iprteidx_tree>:
  64949. * @param dflt non-zero for the default rte, zero for network rte
  64950. * @param ni points to network interface for this rte or NULL
  64951. * for default route to be removed.
  64952. */
  64953. void snmp_delete_iprteidx_tree(u8_t dflt, struct netif *ni)
  64954. {
  64955. 8034744: b570 push {r4, r5, r6, lr}
  64956. 8034746: b08e sub sp, #56 ; 0x38
  64957. u8_t del = 0;
  64958. ip_addr_t dst;
  64959. if (dflt != 0)
  64960. 8034748: b110 cbz r0, 8034750 <snmp_delete_iprteidx_tree+0xc>
  64961. {
  64962. /* the default route 0.0.0.0 */
  64963. ip_addr_set_any(&dst);
  64964. 803474a: 2300 movs r3, #0
  64965. 803474c: 9300 str r3, [sp, #0]
  64966. 803474e: e041 b.n 80347d4 <snmp_delete_iprteidx_tree+0x90>
  64967. del = 1;
  64968. }
  64969. else
  64970. {
  64971. /* route to the network address */
  64972. ip_addr_get_network(&dst, &ni->ip_addr, &ni->netmask);
  64973. 8034750: 688a ldr r2, [r1, #8]
  64974. 8034752: 684b ldr r3, [r1, #4]
  64975. 8034754: 4013 ands r3, r2
  64976. 8034756: 9300 str r3, [sp, #0]
  64977. /* exclude 0.0.0.0 network (reserved for default rte) */
  64978. if (!ip_addr_isany(&dst)) {
  64979. 8034758: 2b00 cmp r3, #0
  64980. 803475a: d13b bne.n 80347d4 <snmp_delete_iprteidx_tree+0x90>
  64981. 803475c: e034 b.n 80347c8 <snmp_delete_iprteidx_tree+0x84>
  64982. level = 0;
  64983. del_cnt = 0;
  64984. iprte_rn = &iprtetree_root;
  64985. while ((level < 4) && (iprte_rn != NULL))
  64986. {
  64987. fc = snmp_mib_node_find(iprte_rn, iprteidx[level], &iprte_n);
  64988. 803475e: ab0a add r3, sp, #40 ; 0x28
  64989. 8034760: 4628 mov r0, r5
  64990. 8034762: 58f1 ldr r1, [r6, r3]
  64991. 8034764: aa01 add r2, sp, #4
  64992. 8034766: f000 fb0a bl 8034d7e <snmp_mib_node_find>
  64993. 803476a: b2c0 uxtb r0, r0
  64994. if (fc == 0)
  64995. 803476c: b198 cbz r0, 8034796 <snmp_delete_iprteidx_tree+0x52>
  64996. {
  64997. /* iprteidx[level] does not exist */
  64998. del_cnt = 0;
  64999. iprte_rn = NULL;
  65000. }
  65001. else if (fc == 1)
  65002. 803476e: 2801 cmp r0, #1
  65003. 8034770: d10b bne.n 803478a <snmp_delete_iprteidx_tree+0x46>
  65004. {
  65005. del_rn[del_cnt] = iprte_rn;
  65006. 8034772: ab0e add r3, sp, #56 ; 0x38
  65007. 8034774: eb03 0284 add.w r2, r3, r4, lsl #2
  65008. del_n[del_cnt] = iprte_n;
  65009. 8034778: 9b01 ldr r3, [sp, #4]
  65010. del_cnt = 0;
  65011. iprte_rn = NULL;
  65012. }
  65013. else if (fc == 1)
  65014. {
  65015. del_rn[del_cnt] = iprte_rn;
  65016. 803477a: f842 5c30 str.w r5, [r2, #-48]
  65017. del_n[del_cnt] = iprte_n;
  65018. del_cnt++;
  65019. 803477e: 3401 adds r4, #1
  65020. iprte_rn = NULL;
  65021. }
  65022. else if (fc == 1)
  65023. {
  65024. del_rn[del_cnt] = iprte_rn;
  65025. del_n[del_cnt] = iprte_n;
  65026. 8034780: f842 3c20 str.w r3, [r2, #-32]
  65027. del_cnt++;
  65028. 8034784: b2e4 uxtb r4, r4
  65029. iprte_rn = (struct mib_list_rootnode*)(iprte_n->nptr);
  65030. 8034786: 68dd ldr r5, [r3, #12]
  65031. 8034788: e007 b.n 803479a <snmp_delete_iprteidx_tree+0x56>
  65032. }
  65033. else if (fc == 2)
  65034. 803478a: 2802 cmp r0, #2
  65035. 803478c: d105 bne.n 803479a <snmp_delete_iprteidx_tree+0x56>
  65036. {
  65037. /* reset delete (2 or more childs) */
  65038. del_cnt = 0;
  65039. iprte_rn = (struct mib_list_rootnode*)(iprte_n->nptr);
  65040. 803478e: 9b01 ldr r3, [sp, #4]
  65041. iprte_rn = (struct mib_list_rootnode*)(iprte_n->nptr);
  65042. }
  65043. else if (fc == 2)
  65044. {
  65045. /* reset delete (2 or more childs) */
  65046. del_cnt = 0;
  65047. 8034790: 2400 movs r4, #0
  65048. iprte_rn = (struct mib_list_rootnode*)(iprte_n->nptr);
  65049. 8034792: 68dd ldr r5, [r3, #12]
  65050. 8034794: e001 b.n 803479a <snmp_delete_iprteidx_tree+0x56>
  65051. {
  65052. fc = snmp_mib_node_find(iprte_rn, iprteidx[level], &iprte_n);
  65053. if (fc == 0)
  65054. {
  65055. /* iprteidx[level] does not exist */
  65056. del_cnt = 0;
  65057. 8034796: 4604 mov r4, r0
  65058. iprte_rn = NULL;
  65059. 8034798: 4605 mov r5, r0
  65060. snmp_iptooid(&dst, &iprteidx[0]);
  65061. /* mark nodes for deletion */
  65062. level = 0;
  65063. del_cnt = 0;
  65064. iprte_rn = &iprtetree_root;
  65065. while ((level < 4) && (iprte_rn != NULL))
  65066. 803479a: 2e0c cmp r6, #12
  65067. 803479c: d012 beq.n 80347c4 <snmp_delete_iprteidx_tree+0x80>
  65068. 803479e: 3604 adds r6, #4
  65069. 80347a0: 2d00 cmp r5, #0
  65070. 80347a2: d1dc bne.n 803475e <snmp_delete_iprteidx_tree+0x1a>
  65071. 80347a4: e00e b.n 80347c4 <snmp_delete_iprteidx_tree+0x80>
  65072. level++;
  65073. }
  65074. /* delete marked index nodes */
  65075. while (del_cnt > 0)
  65076. {
  65077. del_cnt--;
  65078. 80347a6: 3c01 subs r4, #1
  65079. 80347a8: b2e4 uxtb r4, r4
  65080. iprte_rn = del_rn[del_cnt];
  65081. 80347aa: aa0e add r2, sp, #56 ; 0x38
  65082. 80347ac: eb02 0384 add.w r3, r2, r4, lsl #2
  65083. iprte_n = del_n[del_cnt];
  65084. 80347b0: f853 1c20 ldr.w r1, [r3, #-32]
  65085. /* delete marked index nodes */
  65086. while (del_cnt > 0)
  65087. {
  65088. del_cnt--;
  65089. iprte_rn = del_rn[del_cnt];
  65090. 80347b4: f853 0c30 ldr.w r0, [r3, #-48]
  65091. iprte_n = del_n[del_cnt];
  65092. 80347b8: 9101 str r1, [sp, #4]
  65093. next = snmp_mib_node_delete(iprte_rn, iprte_n);
  65094. 80347ba: f000 fafa bl 8034db2 <snmp_mib_node_delete>
  65095. if (next != NULL)
  65096. 80347be: b108 cbz r0, 80347c4 <snmp_delete_iprteidx_tree+0x80>
  65097. {
  65098. LWIP_ASSERT("next_count == 0",next->count == 0);
  65099. snmp_mib_lrn_free(next);
  65100. 80347c0: f000 fa9e bl 8034d00 <snmp_mib_lrn_free>
  65101. iprte_rn = (struct mib_list_rootnode*)(iprte_n->nptr);
  65102. }
  65103. level++;
  65104. }
  65105. /* delete marked index nodes */
  65106. while (del_cnt > 0)
  65107. 80347c4: 2c00 cmp r4, #0
  65108. 80347c6: d1ee bne.n 80347a6 <snmp_delete_iprteidx_tree+0x62>
  65109. snmp_mib_lrn_free(next);
  65110. }
  65111. }
  65112. }
  65113. /* disable getnext traversal on empty table */
  65114. if (iprtetree_root.count == 0) iprtetable.maxlength = 0;
  65115. 80347c8: 4b07 ldr r3, [pc, #28] ; (80347e8 <snmp_delete_iprteidx_tree+0xa4>)
  65116. 80347ca: 8b9b ldrh r3, [r3, #28]
  65117. 80347cc: b953 cbnz r3, 80347e4 <snmp_delete_iprteidx_tree+0xa0>
  65118. 80347ce: 4a07 ldr r2, [pc, #28] ; (80347ec <snmp_delete_iprteidx_tree+0xa8>)
  65119. 80347d0: 8253 strh r3, [r2, #18]
  65120. 80347d2: e007 b.n 80347e4 <snmp_delete_iprteidx_tree+0xa0>
  65121. struct mib_list_rootnode *iprte_rn, *next, *del_rn[4];
  65122. struct mib_list_node *iprte_n, *del_n[4];
  65123. s32_t iprteidx[4];
  65124. u8_t fc, level, del_cnt;
  65125. snmp_iptooid(&dst, &iprteidx[0]);
  65126. 80347d4: 4668 mov r0, sp
  65127. 80347d6: a90a add r1, sp, #40 ; 0x28
  65128. 80347d8: 2600 movs r6, #0
  65129. 80347da: f000 fa5a bl 8034c92 <snmp_iptooid>
  65130. /* mark nodes for deletion */
  65131. level = 0;
  65132. del_cnt = 0;
  65133. 80347de: 4634 mov r4, r6
  65134. iprte_rn = &iprtetree_root;
  65135. 80347e0: 4d01 ldr r5, [pc, #4] ; (80347e8 <snmp_delete_iprteidx_tree+0xa4>)
  65136. 80347e2: e7bc b.n 803475e <snmp_delete_iprteidx_tree+0x1a>
  65137. }
  65138. }
  65139. }
  65140. /* disable getnext traversal on empty table */
  65141. if (iprtetree_root.count == 0) iprtetable.maxlength = 0;
  65142. }
  65143. 80347e4: b00e add sp, #56 ; 0x38
  65144. 80347e6: bd70 pop {r4, r5, r6, pc}
  65145. 80347e8: 200007b4 .word 0x200007b4
  65146. 80347ec: 20000970 .word 0x20000970
  65147. 080347f0 <snmp_inc_icmpinmsgs>:
  65148. void snmp_inc_icmpinmsgs(void)
  65149. {
  65150. icmpinmsgs++;
  65151. 80347f0: 4b02 ldr r3, [pc, #8] ; (80347fc <snmp_inc_icmpinmsgs+0xc>)
  65152. 80347f2: 681a ldr r2, [r3, #0]
  65153. 80347f4: 3201 adds r2, #1
  65154. 80347f6: 601a str r2, [r3, #0]
  65155. 80347f8: 4770 bx lr
  65156. 80347fa: bf00 nop
  65157. 80347fc: 2000c4b8 .word 0x2000c4b8
  65158. 08034800 <snmp_inc_icmpinerrors>:
  65159. }
  65160. void snmp_inc_icmpinerrors(void)
  65161. {
  65162. icmpinerrors++;
  65163. 8034800: 4b02 ldr r3, [pc, #8] ; (803480c <snmp_inc_icmpinerrors+0xc>)
  65164. 8034802: 681a ldr r2, [r3, #0]
  65165. 8034804: 3201 adds r2, #1
  65166. 8034806: 601a str r2, [r3, #0]
  65167. 8034808: 4770 bx lr
  65168. 803480a: bf00 nop
  65169. 803480c: 2000c4b4 .word 0x2000c4b4
  65170. 08034810 <snmp_inc_icmpoutmsgs>:
  65171. icmpinaddrmaskreps++;
  65172. }
  65173. void snmp_inc_icmpoutmsgs(void)
  65174. {
  65175. icmpoutmsgs++;
  65176. 8034810: 4b02 ldr r3, [pc, #8] ; (803481c <snmp_inc_icmpoutmsgs+0xc>)
  65177. 8034812: 681a ldr r2, [r3, #0]
  65178. 8034814: 3201 adds r2, #1
  65179. 8034816: 601a str r2, [r3, #0]
  65180. 8034818: 4770 bx lr
  65181. 803481a: bf00 nop
  65182. 803481c: 2000c538 .word 0x2000c538
  65183. 08034820 <snmp_inc_icmpouttimeexcds>:
  65184. icmpoutdestunreachs++;
  65185. }
  65186. void snmp_inc_icmpouttimeexcds(void)
  65187. {
  65188. icmpouttimeexcds++;
  65189. 8034820: 4b02 ldr r3, [pc, #8] ; (803482c <snmp_inc_icmpouttimeexcds+0xc>)
  65190. 8034822: 681a ldr r2, [r3, #0]
  65191. 8034824: 3201 adds r2, #1
  65192. 8034826: 601a str r2, [r3, #0]
  65193. 8034828: 4770 bx lr
  65194. 803482a: bf00 nop
  65195. 803482c: 2000c504 .word 0x2000c504
  65196. 08034830 <snmp_inc_icmpoutechoreps>:
  65197. icmpoutechos++;
  65198. }
  65199. void snmp_inc_icmpoutechoreps(void)
  65200. {
  65201. icmpoutechoreps++;
  65202. 8034830: 4b02 ldr r3, [pc, #8] ; (803483c <snmp_inc_icmpoutechoreps+0xc>)
  65203. 8034832: 681a ldr r2, [r3, #0]
  65204. 8034834: 3201 adds r2, #1
  65205. 8034836: 601a str r2, [r3, #0]
  65206. 8034838: 4770 bx lr
  65207. 803483a: bf00 nop
  65208. 803483c: 2000c558 .word 0x2000c558
  65209. 08034840 <snmp_inc_tcppassiveopens>:
  65210. tcpactiveopens++;
  65211. }
  65212. void snmp_inc_tcppassiveopens(void)
  65213. {
  65214. tcppassiveopens++;
  65215. 8034840: 4b02 ldr r3, [pc, #8] ; (803484c <snmp_inc_tcppassiveopens+0xc>)
  65216. 8034842: 681a ldr r2, [r3, #0]
  65217. 8034844: 3201 adds r2, #1
  65218. 8034846: 601a str r2, [r3, #0]
  65219. 8034848: 4770 bx lr
  65220. 803484a: bf00 nop
  65221. 803484c: 2000c4e0 .word 0x2000c4e0
  65222. 08034850 <snmp_inc_tcpattemptfails>:
  65223. }
  65224. void snmp_inc_tcpattemptfails(void)
  65225. {
  65226. tcpattemptfails++;
  65227. 8034850: 4b02 ldr r3, [pc, #8] ; (803485c <snmp_inc_tcpattemptfails+0xc>)
  65228. 8034852: 681a ldr r2, [r3, #0]
  65229. 8034854: 3201 adds r2, #1
  65230. 8034856: 601a str r2, [r3, #0]
  65231. 8034858: 4770 bx lr
  65232. 803485a: bf00 nop
  65233. 803485c: 2000c52c .word 0x2000c52c
  65234. 08034860 <snmp_inc_tcpestabresets>:
  65235. }
  65236. void snmp_inc_tcpestabresets(void)
  65237. {
  65238. tcpestabresets++;
  65239. 8034860: 4b02 ldr r3, [pc, #8] ; (803486c <snmp_inc_tcpestabresets+0xc>)
  65240. 8034862: 681a ldr r2, [r3, #0]
  65241. 8034864: 3201 adds r2, #1
  65242. 8034866: 601a str r2, [r3, #0]
  65243. 8034868: 4770 bx lr
  65244. 803486a: bf00 nop
  65245. 803486c: 2000c4c0 .word 0x2000c4c0
  65246. 08034870 <snmp_inc_tcpinsegs>:
  65247. }
  65248. void snmp_inc_tcpinsegs(void)
  65249. {
  65250. tcpinsegs++;
  65251. 8034870: 4b02 ldr r3, [pc, #8] ; (803487c <snmp_inc_tcpinsegs+0xc>)
  65252. 8034872: 681a ldr r2, [r3, #0]
  65253. 8034874: 3201 adds r2, #1
  65254. 8034876: 601a str r2, [r3, #0]
  65255. 8034878: 4770 bx lr
  65256. 803487a: bf00 nop
  65257. 803487c: 2000c53c .word 0x2000c53c
  65258. 08034880 <snmp_inc_tcpoutsegs>:
  65259. }
  65260. void snmp_inc_tcpoutsegs(void)
  65261. {
  65262. tcpoutsegs++;
  65263. 8034880: 4b02 ldr r3, [pc, #8] ; (803488c <snmp_inc_tcpoutsegs+0xc>)
  65264. 8034882: 681a ldr r2, [r3, #0]
  65265. 8034884: 3201 adds r2, #1
  65266. 8034886: 601a str r2, [r3, #0]
  65267. 8034888: 4770 bx lr
  65268. 803488a: bf00 nop
  65269. 803488c: 2000c588 .word 0x2000c588
  65270. 08034890 <snmp_inc_tcpretranssegs>:
  65271. }
  65272. void snmp_inc_tcpretranssegs(void)
  65273. {
  65274. tcpretranssegs++;
  65275. 8034890: 4b02 ldr r3, [pc, #8] ; (803489c <snmp_inc_tcpretranssegs+0xc>)
  65276. 8034892: 681a ldr r2, [r3, #0]
  65277. 8034894: 3201 adds r2, #1
  65278. 8034896: 601a str r2, [r3, #0]
  65279. 8034898: 4770 bx lr
  65280. 803489a: bf00 nop
  65281. 803489c: 2000c55c .word 0x2000c55c
  65282. 080348a0 <snmp_inc_tcpinerrs>:
  65283. }
  65284. void snmp_inc_tcpinerrs(void)
  65285. {
  65286. tcpinerrs++;
  65287. 80348a0: 4b02 ldr r3, [pc, #8] ; (80348ac <snmp_inc_tcpinerrs+0xc>)
  65288. 80348a2: 681a ldr r2, [r3, #0]
  65289. 80348a4: 3201 adds r2, #1
  65290. 80348a6: 601a str r2, [r3, #0]
  65291. 80348a8: 4770 bx lr
  65292. 80348aa: bf00 nop
  65293. 80348ac: 2000c4e8 .word 0x2000c4e8
  65294. 080348b0 <snmp_inc_tcpoutrsts>:
  65295. }
  65296. void snmp_inc_tcpoutrsts(void)
  65297. {
  65298. tcpoutrsts++;
  65299. 80348b0: 4b02 ldr r3, [pc, #8] ; (80348bc <snmp_inc_tcpoutrsts+0xc>)
  65300. 80348b2: 681a ldr r2, [r3, #0]
  65301. 80348b4: 3201 adds r2, #1
  65302. 80348b6: 601a str r2, [r3, #0]
  65303. 80348b8: 4770 bx lr
  65304. 80348ba: bf00 nop
  65305. 80348bc: 2000c54c .word 0x2000c54c
  65306. 080348c0 <snmp_inc_udpindatagrams>:
  65307. }
  65308. void snmp_inc_udpindatagrams(void)
  65309. {
  65310. udpindatagrams++;
  65311. 80348c0: 4b02 ldr r3, [pc, #8] ; (80348cc <snmp_inc_udpindatagrams+0xc>)
  65312. 80348c2: 681a ldr r2, [r3, #0]
  65313. 80348c4: 3201 adds r2, #1
  65314. 80348c6: 601a str r2, [r3, #0]
  65315. 80348c8: 4770 bx lr
  65316. 80348ca: bf00 nop
  65317. 80348cc: 2000c568 .word 0x2000c568
  65318. 080348d0 <snmp_inc_udpnoports>:
  65319. }
  65320. void snmp_inc_udpnoports(void)
  65321. {
  65322. udpnoports++;
  65323. 80348d0: 4b02 ldr r3, [pc, #8] ; (80348dc <snmp_inc_udpnoports+0xc>)
  65324. 80348d2: 681a ldr r2, [r3, #0]
  65325. 80348d4: 3201 adds r2, #1
  65326. 80348d6: 601a str r2, [r3, #0]
  65327. 80348d8: 4770 bx lr
  65328. 80348da: bf00 nop
  65329. 80348dc: 2000c520 .word 0x2000c520
  65330. 080348e0 <snmp_inc_udpinerrors>:
  65331. }
  65332. void snmp_inc_udpinerrors(void)
  65333. {
  65334. udpinerrors++;
  65335. 80348e0: 4b02 ldr r3, [pc, #8] ; (80348ec <snmp_inc_udpinerrors+0xc>)
  65336. 80348e2: 681a ldr r2, [r3, #0]
  65337. 80348e4: 3201 adds r2, #1
  65338. 80348e6: 601a str r2, [r3, #0]
  65339. 80348e8: 4770 bx lr
  65340. 80348ea: bf00 nop
  65341. 80348ec: 2000c590 .word 0x2000c590
  65342. 080348f0 <snmp_inc_udpoutdatagrams>:
  65343. }
  65344. void snmp_inc_udpoutdatagrams(void)
  65345. {
  65346. udpoutdatagrams++;
  65347. 80348f0: 4b02 ldr r3, [pc, #8] ; (80348fc <snmp_inc_udpoutdatagrams+0xc>)
  65348. 80348f2: 681a ldr r2, [r3, #0]
  65349. 80348f4: 3201 adds r2, #1
  65350. 80348f6: 601a str r2, [r3, #0]
  65351. 80348f8: 4770 bx lr
  65352. 80348fa: bf00 nop
  65353. 80348fc: 2000c518 .word 0x2000c518
  65354. 08034900 <snmp_insert_udpidx_tree>:
  65355. /**
  65356. * Inserts udpTable indexes (.udpLocalAddress.udpLocalPort)
  65357. * into index tree.
  65358. */
  65359. void snmp_insert_udpidx_tree(struct udp_pcb *pcb)
  65360. {
  65361. 8034900: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  65362. 8034904: 4604 mov r4, r0
  65363. 8034906: b086 sub sp, #24
  65364. struct mib_list_node *udp_node;
  65365. s32_t udpidx[5];
  65366. u8_t level;
  65367. LWIP_ASSERT("pcb != NULL", pcb != NULL);
  65368. snmp_iptooid(&pcb->local_ip, &udpidx[0]);
  65369. 8034908: a901 add r1, sp, #4
  65370. 803490a: f000 f9c2 bl 8034c92 <snmp_iptooid>
  65371. udpidx[4] = pcb->local_port;
  65372. 803490e: 8a63 ldrh r3, [r4, #18]
  65373. udp_node->nptr = (struct mib_node*)udp_rn;
  65374. if (udp_rn != NULL)
  65375. {
  65376. if (level == 3)
  65377. {
  65378. udp_rn->get_object_def = udpentry_get_object_def;
  65379. 8034910: 4f17 ldr r7, [pc, #92] ; (8034970 <snmp_insert_udpidx_tree+0x70>)
  65380. LWIP_ASSERT("pcb != NULL", pcb != NULL);
  65381. snmp_iptooid(&pcb->local_ip, &udpidx[0]);
  65382. udpidx[4] = pcb->local_port;
  65383. udp_rn = &udp_root;
  65384. 8034912: 4c18 ldr r4, [pc, #96] ; (8034974 <snmp_insert_udpidx_tree+0x74>)
  65385. if (udp_rn != NULL)
  65386. {
  65387. if (level == 3)
  65388. {
  65389. udp_rn->get_object_def = udpentry_get_object_def;
  65390. udp_rn->get_value = udpentry_get_value;
  65391. 8034914: f8df 806c ldr.w r8, [pc, #108] ; 8034984 <snmp_insert_udpidx_tree+0x84>
  65392. s32_t udpidx[5];
  65393. u8_t level;
  65394. LWIP_ASSERT("pcb != NULL", pcb != NULL);
  65395. snmp_iptooid(&pcb->local_ip, &udpidx[0]);
  65396. udpidx[4] = pcb->local_port;
  65397. 8034918: 9305 str r3, [sp, #20]
  65398. 803491a: 2500 movs r5, #0
  65399. udp_rn = &udp_root;
  65400. for (level = 0; level < 5; level++)
  65401. {
  65402. udp_node = NULL;
  65403. 803491c: 2300 movs r3, #0
  65404. 803491e: 9300 str r3, [sp, #0]
  65405. snmp_mib_node_insert(udp_rn, udpidx[level], &udp_node);
  65406. 8034920: ab01 add r3, sp, #4
  65407. 8034922: 4620 mov r0, r4
  65408. 8034924: f853 1025 ldr.w r1, [r3, r5, lsl #2]
  65409. 8034928: 466a mov r2, sp
  65410. 803492a: b2ee uxtb r6, r5
  65411. 803492c: f000 f9ec bl 8034d08 <snmp_mib_node_insert>
  65412. if ((level != 4) && (udp_node != NULL))
  65413. 8034930: 2e04 cmp r6, #4
  65414. 8034932: d015 beq.n 8034960 <snmp_insert_udpidx_tree+0x60>
  65415. 8034934: 9b00 ldr r3, [sp, #0]
  65416. 8034936: b19b cbz r3, 8034960 <snmp_insert_udpidx_tree+0x60>
  65417. {
  65418. if (udp_node->nptr == NULL)
  65419. 8034938: 68dc ldr r4, [r3, #12]
  65420. 803493a: b98c cbnz r4, 8034960 <snmp_insert_udpidx_tree+0x60>
  65421. {
  65422. udp_rn = snmp_mib_lrn_alloc();
  65423. 803493c: f000 f9c2 bl 8034cc4 <snmp_mib_lrn_alloc>
  65424. udp_node->nptr = (struct mib_node*)udp_rn;
  65425. 8034940: 9b00 ldr r3, [sp, #0]
  65426. snmp_mib_node_insert(udp_rn, udpidx[level], &udp_node);
  65427. if ((level != 4) && (udp_node != NULL))
  65428. {
  65429. if (udp_node->nptr == NULL)
  65430. {
  65431. udp_rn = snmp_mib_lrn_alloc();
  65432. 8034942: 4604 mov r4, r0
  65433. udp_node->nptr = (struct mib_node*)udp_rn;
  65434. 8034944: 60d8 str r0, [r3, #12]
  65435. if (udp_rn != NULL)
  65436. 8034946: b918 cbnz r0, 8034950 <snmp_insert_udpidx_tree+0x50>
  65437. {
  65438. udp_rn = (struct mib_list_rootnode*)udp_node->nptr;
  65439. }
  65440. }
  65441. }
  65442. udptable.maxlength = 1;
  65443. 8034948: 4b0b ldr r3, [pc, #44] ; (8034978 <snmp_insert_udpidx_tree+0x78>)
  65444. 803494a: 2201 movs r2, #1
  65445. 803494c: 825a strh r2, [r3, #18]
  65446. 803494e: e00b b.n 8034968 <snmp_insert_udpidx_tree+0x68>
  65447. {
  65448. udp_rn = snmp_mib_lrn_alloc();
  65449. udp_node->nptr = (struct mib_node*)udp_rn;
  65450. if (udp_rn != NULL)
  65451. {
  65452. if (level == 3)
  65453. 8034950: 2e03 cmp r6, #3
  65454. 8034952: d105 bne.n 8034960 <snmp_insert_udpidx_tree+0x60>
  65455. {
  65456. udp_rn->get_object_def = udpentry_get_object_def;
  65457. udp_rn->get_value = udpentry_get_value;
  65458. udp_rn->set_test = noleafs_set_test;
  65459. 8034954: 4b09 ldr r3, [pc, #36] ; (803497c <snmp_insert_udpidx_tree+0x7c>)
  65460. if (udp_rn != NULL)
  65461. {
  65462. if (level == 3)
  65463. {
  65464. udp_rn->get_object_def = udpentry_get_object_def;
  65465. udp_rn->get_value = udpentry_get_value;
  65466. 8034956: e880 0180 stmia.w r0, {r7, r8}
  65467. udp_rn->set_test = noleafs_set_test;
  65468. 803495a: 6083 str r3, [r0, #8]
  65469. udp_rn->set_value = noleafs_set_value;
  65470. 803495c: 4b08 ldr r3, [pc, #32] ; (8034980 <snmp_insert_udpidx_tree+0x80>)
  65471. 803495e: 60c3 str r3, [r0, #12]
  65472. 8034960: 3501 adds r5, #1
  65473. LWIP_ASSERT("pcb != NULL", pcb != NULL);
  65474. snmp_iptooid(&pcb->local_ip, &udpidx[0]);
  65475. udpidx[4] = pcb->local_port;
  65476. udp_rn = &udp_root;
  65477. for (level = 0; level < 5; level++)
  65478. 8034962: 2d05 cmp r5, #5
  65479. 8034964: d1da bne.n 803491c <snmp_insert_udpidx_tree+0x1c>
  65480. 8034966: e7ef b.n 8034948 <snmp_insert_udpidx_tree+0x48>
  65481. udp_rn = (struct mib_list_rootnode*)udp_node->nptr;
  65482. }
  65483. }
  65484. }
  65485. udptable.maxlength = 1;
  65486. }
  65487. 8034968: b006 add sp, #24
  65488. 803496a: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  65489. 803496e: bf00 nop
  65490. 8034970: 08033f95 .word 0x08033f95
  65491. 8034974: 20000784 .word 0x20000784
  65492. 8034978: 20000768 .word 0x20000768
  65493. 803497c: 08033623 .word 0x08033623
  65494. 8034980: 08033627 .word 0x08033627
  65495. 8034984: 08033c51 .word 0x08033c51
  65496. 08034988 <snmp_delete_udpidx_tree>:
  65497. /**
  65498. * Removes udpTable indexes (.udpLocalAddress.udpLocalPort)
  65499. * from index tree.
  65500. */
  65501. void snmp_delete_udpidx_tree(struct udp_pcb *pcb)
  65502. {
  65503. 8034988: b570 push {r4, r5, r6, lr}
  65504. 803498a: 4604 mov r4, r0
  65505. 803498c: b090 sub sp, #64 ; 0x40
  65506. struct mib_list_node *udp_n, *del_n[5];
  65507. s32_t udpidx[5];
  65508. u8_t bindings, fc, level, del_cnt;
  65509. LWIP_ASSERT("pcb != NULL", pcb != NULL);
  65510. snmp_iptooid(&pcb->local_ip, &udpidx[0]);
  65511. 803498e: a90b add r1, sp, #44 ; 0x2c
  65512. 8034990: f000 f97f bl 8034c92 <snmp_iptooid>
  65513. udpidx[4] = pcb->local_port;
  65514. 8034994: 8a61 ldrh r1, [r4, #18]
  65515. /* count PCBs for a given binding
  65516. (e.g. when reusing ports or for temp output PCBs) */
  65517. bindings = 0;
  65518. npcb = udp_pcbs;
  65519. 8034996: 4b2a ldr r3, [pc, #168] ; (8034a40 <snmp_delete_udpidx_tree+0xb8>)
  65520. s32_t udpidx[5];
  65521. u8_t bindings, fc, level, del_cnt;
  65522. LWIP_ASSERT("pcb != NULL", pcb != NULL);
  65523. snmp_iptooid(&pcb->local_ip, &udpidx[0]);
  65524. udpidx[4] = pcb->local_port;
  65525. 8034998: 910f str r1, [sp, #60] ; 0x3c
  65526. /* count PCBs for a given binding
  65527. (e.g. when reusing ports or for temp output PCBs) */
  65528. bindings = 0;
  65529. npcb = udp_pcbs;
  65530. 803499a: 681b ldr r3, [r3, #0]
  65531. snmp_iptooid(&pcb->local_ip, &udpidx[0]);
  65532. udpidx[4] = pcb->local_port;
  65533. /* count PCBs for a given binding
  65534. (e.g. when reusing ports or for temp output PCBs) */
  65535. bindings = 0;
  65536. 803499c: 2200 movs r2, #0
  65537. npcb = udp_pcbs;
  65538. while ((npcb != NULL))
  65539. 803499e: e009 b.n 80349b4 <snmp_delete_udpidx_tree+0x2c>
  65540. {
  65541. if (ip_addr_cmp(&npcb->local_ip, &pcb->local_ip) &&
  65542. 80349a0: 681d ldr r5, [r3, #0]
  65543. 80349a2: 6820 ldr r0, [r4, #0]
  65544. 80349a4: 4285 cmp r5, r0
  65545. 80349a6: d104 bne.n 80349b2 <snmp_delete_udpidx_tree+0x2a>
  65546. (npcb->local_port == udpidx[4]))
  65547. 80349a8: 8a58 ldrh r0, [r3, #18]
  65548. (e.g. when reusing ports or for temp output PCBs) */
  65549. bindings = 0;
  65550. npcb = udp_pcbs;
  65551. while ((npcb != NULL))
  65552. {
  65553. if (ip_addr_cmp(&npcb->local_ip, &pcb->local_ip) &&
  65554. 80349aa: 4288 cmp r0, r1
  65555. 80349ac: d101 bne.n 80349b2 <snmp_delete_udpidx_tree+0x2a>
  65556. (npcb->local_port == udpidx[4]))
  65557. {
  65558. bindings++;
  65559. 80349ae: 3201 adds r2, #1
  65560. 80349b0: b2d2 uxtb r2, r2
  65561. }
  65562. npcb = npcb->next;
  65563. 80349b2: 68db ldr r3, [r3, #12]
  65564. /* count PCBs for a given binding
  65565. (e.g. when reusing ports or for temp output PCBs) */
  65566. bindings = 0;
  65567. npcb = udp_pcbs;
  65568. while ((npcb != NULL))
  65569. 80349b4: 2b00 cmp r3, #0
  65570. 80349b6: d1f3 bne.n 80349a0 <snmp_delete_udpidx_tree+0x18>
  65571. {
  65572. bindings++;
  65573. }
  65574. npcb = npcb->next;
  65575. }
  65576. if (bindings == 1)
  65577. 80349b8: 2a01 cmp r2, #1
  65578. 80349ba: d004 beq.n 80349c6 <snmp_delete_udpidx_tree+0x3e>
  65579. snmp_mib_lrn_free(next);
  65580. }
  65581. }
  65582. }
  65583. /* disable getnext traversal on empty table */
  65584. if (udp_root.count == 0) udptable.maxlength = 0;
  65585. 80349bc: 4b21 ldr r3, [pc, #132] ; (8034a44 <snmp_delete_udpidx_tree+0xbc>)
  65586. 80349be: 8b9b ldrh r3, [r3, #28]
  65587. 80349c0: 2b00 cmp r3, #0
  65588. 80349c2: d039 beq.n 8034a38 <snmp_delete_udpidx_tree+0xb0>
  65589. 80349c4: e03a b.n 8034a3c <snmp_delete_udpidx_tree+0xb4>
  65590. {
  65591. /* selectively remove */
  65592. /* mark nodes for deletion */
  65593. level = 0;
  65594. del_cnt = 0;
  65595. udp_rn = &udp_root;
  65596. 80349c6: 4d1f ldr r5, [pc, #124] ; (8034a44 <snmp_delete_udpidx_tree+0xbc>)
  65597. {
  65598. bindings++;
  65599. }
  65600. npcb = npcb->next;
  65601. }
  65602. if (bindings == 1)
  65603. 80349c8: 461e mov r6, r3
  65604. 80349ca: 461c mov r4, r3
  65605. level = 0;
  65606. del_cnt = 0;
  65607. udp_rn = &udp_root;
  65608. while ((level < 5) && (udp_rn != NULL))
  65609. {
  65610. fc = snmp_mib_node_find(udp_rn, udpidx[level], &udp_n);
  65611. 80349cc: ab0b add r3, sp, #44 ; 0x2c
  65612. 80349ce: 4628 mov r0, r5
  65613. 80349d0: 58f1 ldr r1, [r6, r3]
  65614. 80349d2: 466a mov r2, sp
  65615. 80349d4: f000 f9d3 bl 8034d7e <snmp_mib_node_find>
  65616. 80349d8: b2c0 uxtb r0, r0
  65617. if (fc == 0)
  65618. 80349da: b198 cbz r0, 8034a04 <snmp_delete_udpidx_tree+0x7c>
  65619. {
  65620. /* udpidx[level] does not exist */
  65621. del_cnt = 0;
  65622. udp_rn = NULL;
  65623. }
  65624. else if (fc == 1)
  65625. 80349dc: 2801 cmp r0, #1
  65626. 80349de: d10b bne.n 80349f8 <snmp_delete_udpidx_tree+0x70>
  65627. {
  65628. del_rn[del_cnt] = udp_rn;
  65629. 80349e0: ab10 add r3, sp, #64 ; 0x40
  65630. 80349e2: eb03 0284 add.w r2, r3, r4, lsl #2
  65631. del_n[del_cnt] = udp_n;
  65632. 80349e6: 9b00 ldr r3, [sp, #0]
  65633. del_cnt = 0;
  65634. udp_rn = NULL;
  65635. }
  65636. else if (fc == 1)
  65637. {
  65638. del_rn[del_cnt] = udp_rn;
  65639. 80349e8: f842 5c3c str.w r5, [r2, #-60]
  65640. del_n[del_cnt] = udp_n;
  65641. del_cnt++;
  65642. 80349ec: 3401 adds r4, #1
  65643. udp_rn = NULL;
  65644. }
  65645. else if (fc == 1)
  65646. {
  65647. del_rn[del_cnt] = udp_rn;
  65648. del_n[del_cnt] = udp_n;
  65649. 80349ee: f842 3c28 str.w r3, [r2, #-40]
  65650. del_cnt++;
  65651. 80349f2: b2e4 uxtb r4, r4
  65652. udp_rn = (struct mib_list_rootnode*)(udp_n->nptr);
  65653. 80349f4: 68dd ldr r5, [r3, #12]
  65654. 80349f6: e007 b.n 8034a08 <snmp_delete_udpidx_tree+0x80>
  65655. }
  65656. else if (fc == 2)
  65657. 80349f8: 2802 cmp r0, #2
  65658. 80349fa: d105 bne.n 8034a08 <snmp_delete_udpidx_tree+0x80>
  65659. {
  65660. /* reset delete (2 or more childs) */
  65661. del_cnt = 0;
  65662. udp_rn = (struct mib_list_rootnode*)(udp_n->nptr);
  65663. 80349fc: 9b00 ldr r3, [sp, #0]
  65664. udp_rn = (struct mib_list_rootnode*)(udp_n->nptr);
  65665. }
  65666. else if (fc == 2)
  65667. {
  65668. /* reset delete (2 or more childs) */
  65669. del_cnt = 0;
  65670. 80349fe: 2400 movs r4, #0
  65671. udp_rn = (struct mib_list_rootnode*)(udp_n->nptr);
  65672. 8034a00: 68dd ldr r5, [r3, #12]
  65673. 8034a02: e001 b.n 8034a08 <snmp_delete_udpidx_tree+0x80>
  65674. {
  65675. fc = snmp_mib_node_find(udp_rn, udpidx[level], &udp_n);
  65676. if (fc == 0)
  65677. {
  65678. /* udpidx[level] does not exist */
  65679. del_cnt = 0;
  65680. 8034a04: 4604 mov r4, r0
  65681. udp_rn = NULL;
  65682. 8034a06: 4605 mov r5, r0
  65683. /* selectively remove */
  65684. /* mark nodes for deletion */
  65685. level = 0;
  65686. del_cnt = 0;
  65687. udp_rn = &udp_root;
  65688. while ((level < 5) && (udp_rn != NULL))
  65689. 8034a08: 2e10 cmp r6, #16
  65690. 8034a0a: d012 beq.n 8034a32 <snmp_delete_udpidx_tree+0xaa>
  65691. 8034a0c: 3604 adds r6, #4
  65692. 8034a0e: 2d00 cmp r5, #0
  65693. 8034a10: d1dc bne.n 80349cc <snmp_delete_udpidx_tree+0x44>
  65694. 8034a12: e00e b.n 8034a32 <snmp_delete_udpidx_tree+0xaa>
  65695. level++;
  65696. }
  65697. /* delete marked index nodes */
  65698. while (del_cnt > 0)
  65699. {
  65700. del_cnt--;
  65701. 8034a14: 3c01 subs r4, #1
  65702. 8034a16: b2e4 uxtb r4, r4
  65703. udp_rn = del_rn[del_cnt];
  65704. 8034a18: aa10 add r2, sp, #64 ; 0x40
  65705. 8034a1a: eb02 0384 add.w r3, r2, r4, lsl #2
  65706. udp_n = del_n[del_cnt];
  65707. 8034a1e: f853 1c28 ldr.w r1, [r3, #-40]
  65708. /* delete marked index nodes */
  65709. while (del_cnt > 0)
  65710. {
  65711. del_cnt--;
  65712. udp_rn = del_rn[del_cnt];
  65713. 8034a22: f853 0c3c ldr.w r0, [r3, #-60]
  65714. udp_n = del_n[del_cnt];
  65715. 8034a26: 9100 str r1, [sp, #0]
  65716. next = snmp_mib_node_delete(udp_rn, udp_n);
  65717. 8034a28: f000 f9c3 bl 8034db2 <snmp_mib_node_delete>
  65718. if (next != NULL)
  65719. 8034a2c: b108 cbz r0, 8034a32 <snmp_delete_udpidx_tree+0xaa>
  65720. {
  65721. LWIP_ASSERT("next_count == 0",next->count == 0);
  65722. snmp_mib_lrn_free(next);
  65723. 8034a2e: f000 f967 bl 8034d00 <snmp_mib_lrn_free>
  65724. udp_rn = (struct mib_list_rootnode*)(udp_n->nptr);
  65725. }
  65726. level++;
  65727. }
  65728. /* delete marked index nodes */
  65729. while (del_cnt > 0)
  65730. 8034a32: 2c00 cmp r4, #0
  65731. 8034a34: d1ee bne.n 8034a14 <snmp_delete_udpidx_tree+0x8c>
  65732. 8034a36: e7c1 b.n 80349bc <snmp_delete_udpidx_tree+0x34>
  65733. snmp_mib_lrn_free(next);
  65734. }
  65735. }
  65736. }
  65737. /* disable getnext traversal on empty table */
  65738. if (udp_root.count == 0) udptable.maxlength = 0;
  65739. 8034a38: 4a03 ldr r2, [pc, #12] ; (8034a48 <snmp_delete_udpidx_tree+0xc0>)
  65740. 8034a3a: 8253 strh r3, [r2, #18]
  65741. }
  65742. 8034a3c: b010 add sp, #64 ; 0x40
  65743. 8034a3e: bd70 pop {r4, r5, r6, pc}
  65744. 8034a40: 2000ff3c .word 0x2000ff3c
  65745. 8034a44: 20000784 .word 0x20000784
  65746. 8034a48: 20000768 .word 0x20000768
  65747. 08034a4c <snmp_inc_snmpinpkts>:
  65748. void snmp_inc_snmpinpkts(void)
  65749. {
  65750. snmpinpkts++;
  65751. 8034a4c: 4b02 ldr r3, [pc, #8] ; (8034a58 <snmp_inc_snmpinpkts+0xc>)
  65752. 8034a4e: 681a ldr r2, [r3, #0]
  65753. 8034a50: 3201 adds r2, #1
  65754. 8034a52: 601a str r2, [r3, #0]
  65755. 8034a54: 4770 bx lr
  65756. 8034a56: bf00 nop
  65757. 8034a58: 2000c4c4 .word 0x2000c4c4
  65758. 08034a5c <snmp_inc_snmpoutpkts>:
  65759. }
  65760. void snmp_inc_snmpoutpkts(void)
  65761. {
  65762. snmpoutpkts++;
  65763. 8034a5c: 4b02 ldr r3, [pc, #8] ; (8034a68 <snmp_inc_snmpoutpkts+0xc>)
  65764. 8034a5e: 681a ldr r2, [r3, #0]
  65765. 8034a60: 3201 adds r2, #1
  65766. 8034a62: 601a str r2, [r3, #0]
  65767. 8034a64: 4770 bx lr
  65768. 8034a66: bf00 nop
  65769. 8034a68: 2000c594 .word 0x2000c594
  65770. 08034a6c <snmp_inc_snmpinbadversions>:
  65771. }
  65772. void snmp_inc_snmpinbadversions(void)
  65773. {
  65774. snmpinbadversions++;
  65775. 8034a6c: 4b02 ldr r3, [pc, #8] ; (8034a78 <snmp_inc_snmpinbadversions+0xc>)
  65776. 8034a6e: 681a ldr r2, [r3, #0]
  65777. 8034a70: 3201 adds r2, #1
  65778. 8034a72: 601a str r2, [r3, #0]
  65779. 8034a74: 4770 bx lr
  65780. 8034a76: bf00 nop
  65781. 8034a78: 2000c580 .word 0x2000c580
  65782. 08034a7c <snmp_inc_snmpinbadcommunitynames>:
  65783. }
  65784. void snmp_inc_snmpinbadcommunitynames(void)
  65785. {
  65786. snmpinbadcommunitynames++;
  65787. 8034a7c: 4b02 ldr r3, [pc, #8] ; (8034a88 <snmp_inc_snmpinbadcommunitynames+0xc>)
  65788. 8034a7e: 681a ldr r2, [r3, #0]
  65789. 8034a80: 3201 adds r2, #1
  65790. 8034a82: 601a str r2, [r3, #0]
  65791. 8034a84: 4770 bx lr
  65792. 8034a86: bf00 nop
  65793. 8034a88: 2000c498 .word 0x2000c498
  65794. 08034a8c <snmp_inc_snmpinasnparseerrs>:
  65795. snmpinbadcommunityuses++;
  65796. }
  65797. void snmp_inc_snmpinasnparseerrs(void)
  65798. {
  65799. snmpinasnparseerrs++;
  65800. 8034a8c: 4b02 ldr r3, [pc, #8] ; (8034a98 <snmp_inc_snmpinasnparseerrs+0xc>)
  65801. 8034a8e: 681a ldr r2, [r3, #0]
  65802. 8034a90: 3201 adds r2, #1
  65803. 8034a92: 601a str r2, [r3, #0]
  65804. 8034a94: 4770 bx lr
  65805. 8034a96: bf00 nop
  65806. 8034a98: 2000c584 .word 0x2000c584
  65807. 08034a9c <snmp_inc_snmpintoobigs>:
  65808. }
  65809. void snmp_inc_snmpintoobigs(void)
  65810. {
  65811. snmpintoobigs++;
  65812. 8034a9c: 4b02 ldr r3, [pc, #8] ; (8034aa8 <snmp_inc_snmpintoobigs+0xc>)
  65813. 8034a9e: 681a ldr r2, [r3, #0]
  65814. 8034aa0: 3201 adds r2, #1
  65815. 8034aa2: 601a str r2, [r3, #0]
  65816. 8034aa4: 4770 bx lr
  65817. 8034aa6: bf00 nop
  65818. 8034aa8: 2000c544 .word 0x2000c544
  65819. 08034aac <snmp_inc_snmpinnosuchnames>:
  65820. }
  65821. void snmp_inc_snmpinnosuchnames(void)
  65822. {
  65823. snmpinnosuchnames++;
  65824. 8034aac: 4b02 ldr r3, [pc, #8] ; (8034ab8 <snmp_inc_snmpinnosuchnames+0xc>)
  65825. 8034aae: 681a ldr r2, [r3, #0]
  65826. 8034ab0: 3201 adds r2, #1
  65827. 8034ab2: 601a str r2, [r3, #0]
  65828. 8034ab4: 4770 bx lr
  65829. 8034ab6: bf00 nop
  65830. 8034ab8: 2000c5c4 .word 0x2000c5c4
  65831. 08034abc <snmp_inc_snmpinbadvalues>:
  65832. }
  65833. void snmp_inc_snmpinbadvalues(void)
  65834. {
  65835. snmpinbadvalues++;
  65836. 8034abc: 4b02 ldr r3, [pc, #8] ; (8034ac8 <snmp_inc_snmpinbadvalues+0xc>)
  65837. 8034abe: 681a ldr r2, [r3, #0]
  65838. 8034ac0: 3201 adds r2, #1
  65839. 8034ac2: 601a str r2, [r3, #0]
  65840. 8034ac4: 4770 bx lr
  65841. 8034ac6: bf00 nop
  65842. 8034ac8: 2000c560 .word 0x2000c560
  65843. 08034acc <snmp_inc_snmpinreadonlys>:
  65844. }
  65845. void snmp_inc_snmpinreadonlys(void)
  65846. {
  65847. snmpinreadonlys++;
  65848. 8034acc: 4b02 ldr r3, [pc, #8] ; (8034ad8 <snmp_inc_snmpinreadonlys+0xc>)
  65849. 8034ace: 681a ldr r2, [r3, #0]
  65850. 8034ad0: 3201 adds r2, #1
  65851. 8034ad2: 601a str r2, [r3, #0]
  65852. 8034ad4: 4770 bx lr
  65853. 8034ad6: bf00 nop
  65854. 8034ad8: 2000c534 .word 0x2000c534
  65855. 08034adc <snmp_inc_snmpingenerrs>:
  65856. }
  65857. void snmp_inc_snmpingenerrs(void)
  65858. {
  65859. snmpingenerrs++;
  65860. 8034adc: 4b02 ldr r3, [pc, #8] ; (8034ae8 <snmp_inc_snmpingenerrs+0xc>)
  65861. 8034ade: 681a ldr r2, [r3, #0]
  65862. 8034ae0: 3201 adds r2, #1
  65863. 8034ae2: 601a str r2, [r3, #0]
  65864. 8034ae4: 4770 bx lr
  65865. 8034ae6: bf00 nop
  65866. 8034ae8: 2000c50c .word 0x2000c50c
  65867. 08034aec <snmp_add_snmpintotalreqvars>:
  65868. }
  65869. void snmp_add_snmpintotalreqvars(u8_t value)
  65870. {
  65871. snmpintotalreqvars += value;
  65872. 8034aec: 4b02 ldr r3, [pc, #8] ; (8034af8 <snmp_add_snmpintotalreqvars+0xc>)
  65873. 8034aee: 681a ldr r2, [r3, #0]
  65874. 8034af0: 1880 adds r0, r0, r2
  65875. 8034af2: 6018 str r0, [r3, #0]
  65876. 8034af4: 4770 bx lr
  65877. 8034af6: bf00 nop
  65878. 8034af8: 2000c564 .word 0x2000c564
  65879. 08034afc <snmp_add_snmpintotalsetvars>:
  65880. }
  65881. void snmp_add_snmpintotalsetvars(u8_t value)
  65882. {
  65883. snmpintotalsetvars += value;
  65884. 8034afc: 4b02 ldr r3, [pc, #8] ; (8034b08 <snmp_add_snmpintotalsetvars+0xc>)
  65885. 8034afe: 681a ldr r2, [r3, #0]
  65886. 8034b00: 1880 adds r0, r0, r2
  65887. 8034b02: 6018 str r0, [r3, #0]
  65888. 8034b04: 4770 bx lr
  65889. 8034b06: bf00 nop
  65890. 8034b08: 2000c4a4 .word 0x2000c4a4
  65891. 08034b0c <snmp_inc_snmpingetrequests>:
  65892. }
  65893. void snmp_inc_snmpingetrequests(void)
  65894. {
  65895. snmpingetrequests++;
  65896. 8034b0c: 4b02 ldr r3, [pc, #8] ; (8034b18 <snmp_inc_snmpingetrequests+0xc>)
  65897. 8034b0e: 681a ldr r2, [r3, #0]
  65898. 8034b10: 3201 adds r2, #1
  65899. 8034b12: 601a str r2, [r3, #0]
  65900. 8034b14: 4770 bx lr
  65901. 8034b16: bf00 nop
  65902. 8034b18: 2000c4f8 .word 0x2000c4f8
  65903. 08034b1c <snmp_inc_snmpingetnexts>:
  65904. }
  65905. void snmp_inc_snmpingetnexts(void)
  65906. {
  65907. snmpingetnexts++;
  65908. 8034b1c: 4b02 ldr r3, [pc, #8] ; (8034b28 <snmp_inc_snmpingetnexts+0xc>)
  65909. 8034b1e: 681a ldr r2, [r3, #0]
  65910. 8034b20: 3201 adds r2, #1
  65911. 8034b22: 601a str r2, [r3, #0]
  65912. 8034b24: 4770 bx lr
  65913. 8034b26: bf00 nop
  65914. 8034b28: 2000c47c .word 0x2000c47c
  65915. 08034b2c <snmp_inc_snmpinsetrequests>:
  65916. }
  65917. void snmp_inc_snmpinsetrequests(void)
  65918. {
  65919. snmpinsetrequests++;
  65920. 8034b2c: 4b02 ldr r3, [pc, #8] ; (8034b38 <snmp_inc_snmpinsetrequests+0xc>)
  65921. 8034b2e: 681a ldr r2, [r3, #0]
  65922. 8034b30: 3201 adds r2, #1
  65923. 8034b32: 601a str r2, [r3, #0]
  65924. 8034b34: 4770 bx lr
  65925. 8034b36: bf00 nop
  65926. 8034b38: 2000c5a0 .word 0x2000c5a0
  65927. 08034b3c <snmp_inc_snmpingetresponses>:
  65928. }
  65929. void snmp_inc_snmpingetresponses(void)
  65930. {
  65931. snmpingetresponses++;
  65932. 8034b3c: 4b02 ldr r3, [pc, #8] ; (8034b48 <snmp_inc_snmpingetresponses+0xc>)
  65933. 8034b3e: 681a ldr r2, [r3, #0]
  65934. 8034b40: 3201 adds r2, #1
  65935. 8034b42: 601a str r2, [r3, #0]
  65936. 8034b44: 4770 bx lr
  65937. 8034b46: bf00 nop
  65938. 8034b48: 2000c4f4 .word 0x2000c4f4
  65939. 08034b4c <snmp_inc_snmpintraps>:
  65940. }
  65941. void snmp_inc_snmpintraps(void)
  65942. {
  65943. snmpintraps++;
  65944. 8034b4c: 4b02 ldr r3, [pc, #8] ; (8034b58 <snmp_inc_snmpintraps+0xc>)
  65945. 8034b4e: 681a ldr r2, [r3, #0]
  65946. 8034b50: 3201 adds r2, #1
  65947. 8034b52: 601a str r2, [r3, #0]
  65948. 8034b54: 4770 bx lr
  65949. 8034b56: bf00 nop
  65950. 8034b58: 2000c48c .word 0x2000c48c
  65951. 08034b5c <snmp_inc_snmpouttoobigs>:
  65952. }
  65953. void snmp_inc_snmpouttoobigs(void)
  65954. {
  65955. snmpouttoobigs++;
  65956. 8034b5c: 4b02 ldr r3, [pc, #8] ; (8034b68 <snmp_inc_snmpouttoobigs+0xc>)
  65957. 8034b5e: 681a ldr r2, [r3, #0]
  65958. 8034b60: 3201 adds r2, #1
  65959. 8034b62: 601a str r2, [r3, #0]
  65960. 8034b64: 4770 bx lr
  65961. 8034b66: bf00 nop
  65962. 8034b68: 2000c4dc .word 0x2000c4dc
  65963. 08034b6c <snmp_inc_snmpoutnosuchnames>:
  65964. }
  65965. void snmp_inc_snmpoutnosuchnames(void)
  65966. {
  65967. snmpoutnosuchnames++;
  65968. 8034b6c: 4b02 ldr r3, [pc, #8] ; (8034b78 <snmp_inc_snmpoutnosuchnames+0xc>)
  65969. 8034b6e: 681a ldr r2, [r3, #0]
  65970. 8034b70: 3201 adds r2, #1
  65971. 8034b72: 601a str r2, [r3, #0]
  65972. 8034b74: 4770 bx lr
  65973. 8034b76: bf00 nop
  65974. 8034b78: 2000c4a8 .word 0x2000c4a8
  65975. 08034b7c <snmp_inc_snmpoutbadvalues>:
  65976. }
  65977. void snmp_inc_snmpoutbadvalues(void)
  65978. {
  65979. snmpoutbadvalues++;
  65980. 8034b7c: 4b02 ldr r3, [pc, #8] ; (8034b88 <snmp_inc_snmpoutbadvalues+0xc>)
  65981. 8034b7e: 681a ldr r2, [r3, #0]
  65982. 8034b80: 3201 adds r2, #1
  65983. 8034b82: 601a str r2, [r3, #0]
  65984. 8034b84: 4770 bx lr
  65985. 8034b86: bf00 nop
  65986. 8034b88: 2000c488 .word 0x2000c488
  65987. 08034b8c <snmp_inc_snmpoutgenerrs>:
  65988. }
  65989. void snmp_inc_snmpoutgenerrs(void)
  65990. {
  65991. snmpoutgenerrs++;
  65992. 8034b8c: 4b02 ldr r3, [pc, #8] ; (8034b98 <snmp_inc_snmpoutgenerrs+0xc>)
  65993. 8034b8e: 681a ldr r2, [r3, #0]
  65994. 8034b90: 3201 adds r2, #1
  65995. 8034b92: 601a str r2, [r3, #0]
  65996. 8034b94: 4770 bx lr
  65997. 8034b96: bf00 nop
  65998. 8034b98: 2000c5c8 .word 0x2000c5c8
  65999. 08034b9c <snmp_inc_snmpoutgetresponses>:
  66000. snmpoutsetrequests++;
  66001. }
  66002. void snmp_inc_snmpoutgetresponses(void)
  66003. {
  66004. snmpoutgetresponses++;
  66005. 8034b9c: 4b02 ldr r3, [pc, #8] ; (8034ba8 <snmp_inc_snmpoutgetresponses+0xc>)
  66006. 8034b9e: 681a ldr r2, [r3, #0]
  66007. 8034ba0: 3201 adds r2, #1
  66008. 8034ba2: 601a str r2, [r3, #0]
  66009. 8034ba4: 4770 bx lr
  66010. 8034ba6: bf00 nop
  66011. 8034ba8: 2000c484 .word 0x2000c484
  66012. 08034bac <snmp_inc_snmpouttraps>:
  66013. }
  66014. void snmp_inc_snmpouttraps(void)
  66015. {
  66016. snmpouttraps++;
  66017. 8034bac: 4b02 ldr r3, [pc, #8] ; (8034bb8 <snmp_inc_snmpouttraps+0xc>)
  66018. 8034bae: 681a ldr r2, [r3, #0]
  66019. 8034bb0: 3201 adds r2, #1
  66020. 8034bb2: 601a str r2, [r3, #0]
  66021. 8034bb4: 4770 bx lr
  66022. 8034bb6: bf00 nop
  66023. 8034bb8: 2000c4fc .word 0x2000c4fc
  66024. 08034bbc <snmp_get_snmpgrpid_ptr>:
  66025. }
  66026. void snmp_get_snmpgrpid_ptr(struct snmp_obj_id **oid)
  66027. {
  66028. *oid = &snmpgrp_id;
  66029. 8034bbc: 4b01 ldr r3, [pc, #4] ; (8034bc4 <snmp_get_snmpgrpid_ptr+0x8>)
  66030. 8034bbe: 6003 str r3, [r0, #0]
  66031. 8034bc0: 4770 bx lr
  66032. 8034bc2: bf00 nop
  66033. 8034bc4: 20000994 .word 0x20000994
  66034. 08034bc8 <snmp_get_snmpenableauthentraps>:
  66035. }
  66036. }
  66037. void snmp_get_snmpenableauthentraps(u8_t *value)
  66038. {
  66039. *value = *snmpenableauthentraps_ptr;
  66040. 8034bc8: 4b02 ldr r3, [pc, #8] ; (8034bd4 <snmp_get_snmpenableauthentraps+0xc>)
  66041. 8034bca: 681b ldr r3, [r3, #0]
  66042. 8034bcc: 781b ldrb r3, [r3, #0]
  66043. 8034bce: 7003 strb r3, [r0, #0]
  66044. 8034bd0: 4770 bx lr
  66045. 8034bd2: bf00 nop
  66046. 8034bd4: 200008a8 .word 0x200008a8
  66047. 08034bd8 <push_node>:
  66048. /**
  66049. * Pushes nse struct onto stack.
  66050. */
  66051. static void
  66052. push_node(struct nse* node)
  66053. {
  66054. 8034bd8: b530 push {r4, r5, lr}
  66055. LWIP_ASSERT("node_stack_cnt < NODE_STACK_SIZE",node_stack_cnt < NODE_STACK_SIZE);
  66056. LWIP_DEBUGF(SNMP_MIB_DEBUG,("push_node() node=%p id=%"S32_F"\n",(void*)(node->r_ptr),node->r_id));
  66057. if (node_stack_cnt < NODE_STACK_SIZE)
  66058. 8034bda: 4d07 ldr r5, [pc, #28] ; (8034bf8 <push_node+0x20>)
  66059. 8034bdc: 782b ldrb r3, [r5, #0]
  66060. 8034bde: 2b1f cmp r3, #31
  66061. 8034be0: d808 bhi.n 8034bf4 <push_node+0x1c>
  66062. {
  66063. node_stack[node_stack_cnt] = *node;
  66064. 8034be2: 4a06 ldr r2, [pc, #24] ; (8034bfc <push_node+0x24>)
  66065. 8034be4: 240c movs r4, #12
  66066. 8034be6: fb04 2403 mla r4, r4, r3, r2
  66067. 8034bea: c807 ldmia r0, {r0, r1, r2}
  66068. 8034bec: e884 0007 stmia.w r4, {r0, r1, r2}
  66069. node_stack_cnt++;
  66070. 8034bf0: 3301 adds r3, #1
  66071. 8034bf2: 702b strb r3, [r5, #0]
  66072. 8034bf4: bd30 pop {r4, r5, pc}
  66073. 8034bf6: bf00 nop
  66074. 8034bf8: 2000c5cc .word 0x2000c5cc
  66075. 8034bfc: 2000c5d0 .word 0x2000c5d0
  66076. 08034c00 <empty_table>:
  66077. empty_table(struct mib_node *node)
  66078. {
  66079. u8_t node_type;
  66080. u8_t empty = 0;
  66081. if (node != NULL)
  66082. 8034c00: b1d0 cbz r0, 8034c38 <empty_table+0x38>
  66083. {
  66084. node_type = node->node_type;
  66085. 8034c02: 7c03 ldrb r3, [r0, #16]
  66086. if (node_type == MIB_NODE_LR)
  66087. 8034c04: 2b04 cmp r3, #4
  66088. 8034c06: d105 bne.n 8034c14 <empty_table+0x14>
  66089. {
  66090. struct mib_list_rootnode *lrn;
  66091. lrn = (struct mib_list_rootnode *)node;
  66092. if ((lrn->count == 0) || (lrn->head == NULL))
  66093. 8034c08: 8b83 ldrh r3, [r0, #28]
  66094. 8034c0a: b903 cbnz r3, 8034c0e <empty_table+0xe>
  66095. 8034c0c: e009 b.n 8034c22 <empty_table+0x22>
  66096. 8034c0e: 6943 ldr r3, [r0, #20]
  66097. 8034c10: b13b cbz r3, 8034c22 <empty_table+0x22>
  66098. 8034c12: e010 b.n 8034c36 <empty_table+0x36>
  66099. {
  66100. empty = 1;
  66101. }
  66102. }
  66103. else if ((node_type == MIB_NODE_AR) || (node_type == MIB_NODE_RA))
  66104. 8034c14: 1e9a subs r2, r3, #2
  66105. 8034c16: 2a01 cmp r2, #1
  66106. 8034c18: d805 bhi.n 8034c26 <empty_table+0x26>
  66107. {
  66108. struct mib_array_node *an;
  66109. an = (struct mib_array_node *)node;
  66110. if ((an->maxlength == 0) || (an->nptr == NULL))
  66111. 8034c1a: 8a43 ldrh r3, [r0, #18]
  66112. 8034c1c: b10b cbz r3, 8034c22 <empty_table+0x22>
  66113. 8034c1e: 6980 ldr r0, [r0, #24]
  66114. 8034c20: e004 b.n 8034c2c <empty_table+0x2c>
  66115. {
  66116. empty = 1;
  66117. 8034c22: 2001 movs r0, #1
  66118. 8034c24: 4770 bx lr
  66119. }
  66120. }
  66121. else if (node_type == MIB_NODE_EX)
  66122. 8034c26: 2b05 cmp r3, #5
  66123. 8034c28: d105 bne.n 8034c36 <empty_table+0x36>
  66124. {
  66125. struct mib_external_node *en;
  66126. en = (struct mib_external_node *)node;
  66127. if (en->tree_levels == 0)
  66128. 8034c2a: 7e00 ldrb r0, [r0, #24]
  66129. */
  66130. static u8_t
  66131. empty_table(struct mib_node *node)
  66132. {
  66133. u8_t node_type;
  66134. u8_t empty = 0;
  66135. 8034c2c: f1d0 0001 rsbs r0, r0, #1
  66136. 8034c30: bf38 it cc
  66137. 8034c32: 2000 movcc r0, #0
  66138. 8034c34: 4770 bx lr
  66139. 8034c36: 2000 movs r0, #0
  66140. empty = 1;
  66141. }
  66142. }
  66143. }
  66144. return empty;
  66145. }
  66146. 8034c38: 4770 bx lr
  66147. 8034c3a: 0000 movs r0, r0
  66148. 08034c3c <snmp_ifindextonetif>:
  66149. * @param netif points to returned netif struct pointer
  66150. */
  66151. void
  66152. snmp_ifindextonetif(s32_t ifindex, struct netif **netif)
  66153. {
  66154. struct netif *nif = netif_list;
  66155. 8034c3c: 4b05 ldr r3, [pc, #20] ; (8034c54 <snmp_ifindextonetif+0x18>)
  66156. s32_t i, ifidx;
  66157. ifidx = ifindex - 1;
  66158. 8034c3e: 3801 subs r0, #1
  66159. * @param netif points to returned netif struct pointer
  66160. */
  66161. void
  66162. snmp_ifindextonetif(s32_t ifindex, struct netif **netif)
  66163. {
  66164. struct netif *nif = netif_list;
  66165. 8034c40: 681b ldr r3, [r3, #0]
  66166. s32_t i, ifidx;
  66167. ifidx = ifindex - 1;
  66168. i = 0;
  66169. 8034c42: 2200 movs r2, #0
  66170. while ((nif != NULL) && (i < ifidx))
  66171. 8034c44: e001 b.n 8034c4a <snmp_ifindextonetif+0xe>
  66172. {
  66173. nif = nif->next;
  66174. 8034c46: 681b ldr r3, [r3, #0]
  66175. i++;
  66176. 8034c48: 3201 adds r2, #1
  66177. struct netif *nif = netif_list;
  66178. s32_t i, ifidx;
  66179. ifidx = ifindex - 1;
  66180. i = 0;
  66181. while ((nif != NULL) && (i < ifidx))
  66182. 8034c4a: b10b cbz r3, 8034c50 <snmp_ifindextonetif+0x14>
  66183. 8034c4c: 4282 cmp r2, r0
  66184. 8034c4e: dbfa blt.n 8034c46 <snmp_ifindextonetif+0xa>
  66185. {
  66186. nif = nif->next;
  66187. i++;
  66188. }
  66189. *netif = nif;
  66190. 8034c50: 600b str r3, [r1, #0]
  66191. 8034c52: 4770 bx lr
  66192. 8034c54: 2000ff14 .word 0x2000ff14
  66193. 08034c58 <snmp_netiftoifindex>:
  66194. * @param ifidx points to s32_t object sub-identifier
  66195. */
  66196. void
  66197. snmp_netiftoifindex(struct netif *netif, s32_t *ifidx)
  66198. {
  66199. struct netif *nif = netif_list;
  66200. 8034c58: 4b06 ldr r3, [pc, #24] ; (8034c74 <snmp_netiftoifindex+0x1c>)
  66201. u16_t i;
  66202. i = 0;
  66203. 8034c5a: 2200 movs r2, #0
  66204. * @param ifidx points to s32_t object sub-identifier
  66205. */
  66206. void
  66207. snmp_netiftoifindex(struct netif *netif, s32_t *ifidx)
  66208. {
  66209. struct netif *nif = netif_list;
  66210. 8034c5c: 681b ldr r3, [r3, #0]
  66211. u16_t i;
  66212. i = 0;
  66213. while ((nif != NULL) && (nif != netif))
  66214. 8034c5e: e001 b.n 8034c64 <snmp_netiftoifindex+0xc>
  66215. {
  66216. nif = nif->next;
  66217. 8034c60: 681b ldr r3, [r3, #0]
  66218. i++;
  66219. 8034c62: b292 uxth r2, r2
  66220. 8034c64: 3201 adds r2, #1
  66221. {
  66222. struct netif *nif = netif_list;
  66223. u16_t i;
  66224. i = 0;
  66225. while ((nif != NULL) && (nif != netif))
  66226. 8034c66: b90b cbnz r3, 8034c6c <snmp_netiftoifindex+0x14>
  66227. {
  66228. nif = nif->next;
  66229. i++;
  66230. }
  66231. *ifidx = i+1;
  66232. 8034c68: 600a str r2, [r1, #0]
  66233. 8034c6a: 4770 bx lr
  66234. {
  66235. struct netif *nif = netif_list;
  66236. u16_t i;
  66237. i = 0;
  66238. while ((nif != NULL) && (nif != netif))
  66239. 8034c6c: 4283 cmp r3, r0
  66240. 8034c6e: d1f7 bne.n 8034c60 <snmp_netiftoifindex+0x8>
  66241. 8034c70: e7fa b.n 8034c68 <snmp_netiftoifindex+0x10>
  66242. 8034c72: bf00 nop
  66243. 8034c74: 2000ff14 .word 0x2000ff14
  66244. 08034c78 <snmp_oidtoip>:
  66245. * @param ip points to output struct
  66246. */
  66247. void
  66248. snmp_oidtoip(s32_t *ident, ip_addr_t *ip)
  66249. {
  66250. IP4_ADDR(ip, ident[0], ident[1], ident[2], ident[3]);
  66251. 8034c78: 7802 ldrb r2, [r0, #0]
  66252. 8034c7a: 68c3 ldr r3, [r0, #12]
  66253. 8034c7c: ea42 6303 orr.w r3, r2, r3, lsl #24
  66254. 8034c80: 7a02 ldrb r2, [r0, #8]
  66255. 8034c82: ea43 4302 orr.w r3, r3, r2, lsl #16
  66256. 8034c86: 6842 ldr r2, [r0, #4]
  66257. 8034c88: 0612 lsls r2, r2, #24
  66258. 8034c8a: ea43 4312 orr.w r3, r3, r2, lsr #16
  66259. 8034c8e: 600b str r3, [r1, #0]
  66260. 8034c90: 4770 bx lr
  66261. 08034c92 <snmp_iptooid>:
  66262. * @param ident points to s32_t ident[4] output
  66263. */
  66264. void
  66265. snmp_iptooid(ip_addr_t *ip, s32_t *ident)
  66266. {
  66267. ident[0] = ip4_addr1(ip);
  66268. 8034c92: 7803 ldrb r3, [r0, #0]
  66269. 8034c94: 600b str r3, [r1, #0]
  66270. ident[1] = ip4_addr2(ip);
  66271. 8034c96: 7843 ldrb r3, [r0, #1]
  66272. 8034c98: 604b str r3, [r1, #4]
  66273. ident[2] = ip4_addr3(ip);
  66274. 8034c9a: 7883 ldrb r3, [r0, #2]
  66275. 8034c9c: 608b str r3, [r1, #8]
  66276. ident[3] = ip4_addr4(ip);
  66277. 8034c9e: 78c3 ldrb r3, [r0, #3]
  66278. 8034ca0: 60cb str r3, [r1, #12]
  66279. 8034ca2: 4770 bx lr
  66280. 08034ca4 <snmp_mib_ln_alloc>:
  66281. }
  66282. struct mib_list_node *
  66283. snmp_mib_ln_alloc(s32_t id)
  66284. {
  66285. 8034ca4: b510 push {r4, lr}
  66286. 8034ca6: 4604 mov r4, r0
  66287. struct mib_list_node *ln;
  66288. ln = (struct mib_list_node *)memp_malloc(MEMP_SNMP_NODE);
  66289. 8034ca8: 200b movs r0, #11
  66290. 8034caa: f7fa fecd bl 802fa48 <memp_malloc>
  66291. if (ln != NULL)
  66292. 8034cae: b120 cbz r0, 8034cba <snmp_mib_ln_alloc+0x16>
  66293. {
  66294. ln->prev = NULL;
  66295. 8034cb0: 2300 movs r3, #0
  66296. 8034cb2: 6003 str r3, [r0, #0]
  66297. ln->next = NULL;
  66298. 8034cb4: 6043 str r3, [r0, #4]
  66299. ln->objid = id;
  66300. 8034cb6: 6084 str r4, [r0, #8]
  66301. ln->nptr = NULL;
  66302. 8034cb8: 60c3 str r3, [r0, #12]
  66303. }
  66304. return ln;
  66305. }
  66306. 8034cba: bd10 pop {r4, pc}
  66307. 08034cbc <snmp_mib_ln_free>:
  66308. void
  66309. snmp_mib_ln_free(struct mib_list_node *ln)
  66310. {
  66311. 8034cbc: 4601 mov r1, r0
  66312. memp_free(MEMP_SNMP_NODE, ln);
  66313. 8034cbe: 200b movs r0, #11
  66314. 8034cc0: f7fa bed8 b.w 802fa74 <memp_free>
  66315. 08034cc4 <snmp_mib_lrn_alloc>:
  66316. }
  66317. struct mib_list_rootnode *
  66318. snmp_mib_lrn_alloc(void)
  66319. {
  66320. 8034cc4: b508 push {r3, lr}
  66321. struct mib_list_rootnode *lrn;
  66322. lrn = (struct mib_list_rootnode*)memp_malloc(MEMP_SNMP_ROOTNODE);
  66323. 8034cc6: 200a movs r0, #10
  66324. 8034cc8: f7fa febe bl 802fa48 <memp_malloc>
  66325. if (lrn != NULL)
  66326. 8034ccc: b170 cbz r0, 8034cec <snmp_mib_lrn_alloc+0x28>
  66327. {
  66328. lrn->get_object_def = noleafs_get_object_def;
  66329. 8034cce: 4b08 ldr r3, [pc, #32] ; (8034cf0 <snmp_mib_lrn_alloc+0x2c>)
  66330. 8034cd0: 6003 str r3, [r0, #0]
  66331. lrn->get_value = noleafs_get_value;
  66332. 8034cd2: 4b08 ldr r3, [pc, #32] ; (8034cf4 <snmp_mib_lrn_alloc+0x30>)
  66333. 8034cd4: 6043 str r3, [r0, #4]
  66334. lrn->set_test = noleafs_set_test;
  66335. 8034cd6: 4b08 ldr r3, [pc, #32] ; (8034cf8 <snmp_mib_lrn_alloc+0x34>)
  66336. 8034cd8: 6083 str r3, [r0, #8]
  66337. lrn->set_value = noleafs_set_value;
  66338. 8034cda: 4b08 ldr r3, [pc, #32] ; (8034cfc <snmp_mib_lrn_alloc+0x38>)
  66339. 8034cdc: 60c3 str r3, [r0, #12]
  66340. lrn->node_type = MIB_NODE_LR;
  66341. 8034cde: 2304 movs r3, #4
  66342. 8034ce0: 7403 strb r3, [r0, #16]
  66343. lrn->maxlength = 0;
  66344. 8034ce2: 2300 movs r3, #0
  66345. 8034ce4: 8243 strh r3, [r0, #18]
  66346. lrn->head = NULL;
  66347. 8034ce6: 6143 str r3, [r0, #20]
  66348. lrn->tail = NULL;
  66349. 8034ce8: 6183 str r3, [r0, #24]
  66350. lrn->count = 0;
  66351. 8034cea: 8383 strh r3, [r0, #28]
  66352. }
  66353. return lrn;
  66354. }
  66355. 8034cec: bd08 pop {r3, pc}
  66356. 8034cee: bf00 nop
  66357. 8034cf0: 0803361b .word 0x0803361b
  66358. 8034cf4: 08033621 .word 0x08033621
  66359. 8034cf8: 08033623 .word 0x08033623
  66360. 8034cfc: 08033627 .word 0x08033627
  66361. 08034d00 <snmp_mib_lrn_free>:
  66362. void
  66363. snmp_mib_lrn_free(struct mib_list_rootnode *lrn)
  66364. {
  66365. 8034d00: 4601 mov r1, r0
  66366. memp_free(MEMP_SNMP_ROOTNODE, lrn);
  66367. 8034d02: 200a movs r0, #10
  66368. 8034d04: f7fa beb6 b.w 802fa74 <memp_free>
  66369. 08034d08 <snmp_mib_node_insert>:
  66370. * used for constructing the tree.
  66371. * @return -1 if failed, 1 if inserted, 2 if present.
  66372. */
  66373. s8_t
  66374. snmp_mib_node_insert(struct mib_list_rootnode *rn, s32_t objid, struct mib_list_node **insn)
  66375. {
  66376. 8034d08: b5f8 push {r3, r4, r5, r6, r7, lr}
  66377. 8034d0a: 4605 mov r5, r0
  66378. 8034d0c: 4616 mov r6, r2
  66379. LWIP_ASSERT("rn != NULL",rn != NULL);
  66380. /* -1 = malloc failure, 0 = not inserted, 1 = inserted, 2 = was present */
  66381. insert = 0;
  66382. if (rn->head == NULL)
  66383. 8034d0e: 696c ldr r4, [r5, #20]
  66384. * used for constructing the tree.
  66385. * @return -1 if failed, 1 if inserted, 2 if present.
  66386. */
  66387. s8_t
  66388. snmp_mib_node_insert(struct mib_list_rootnode *rn, s32_t objid, struct mib_list_node **insn)
  66389. {
  66390. 8034d10: 4608 mov r0, r1
  66391. LWIP_ASSERT("rn != NULL",rn != NULL);
  66392. /* -1 = malloc failure, 0 = not inserted, 1 = inserted, 2 = was present */
  66393. insert = 0;
  66394. if (rn->head == NULL)
  66395. 8034d12: b93c cbnz r4, 8034d24 <snmp_mib_node_insert+0x1c>
  66396. {
  66397. /* empty list, add first node */
  66398. LWIP_DEBUGF(SNMP_MIB_DEBUG,("alloc empty list objid==%"S32_F"\n",objid));
  66399. nn = snmp_mib_ln_alloc(objid);
  66400. 8034d14: f7ff ffc6 bl 8034ca4 <snmp_mib_ln_alloc>
  66401. if (nn != NULL)
  66402. 8034d18: b350 cbz r0, 8034d70 <snmp_mib_node_insert+0x68>
  66403. {
  66404. rn->head = nn;
  66405. 8034d1a: 6168 str r0, [r5, #20]
  66406. rn->tail = nn;
  66407. 8034d1c: 61a8 str r0, [r5, #24]
  66408. *insn = nn;
  66409. 8034d1e: 6030 str r0, [r6, #0]
  66410. 8034d20: e021 b.n 8034d66 <snmp_mib_node_insert+0x5e>
  66411. *insn = n;
  66412. insert = 2;
  66413. }
  66414. else if (n->objid < objid)
  66415. {
  66416. if (n->next == NULL)
  66417. 8034d22: 463c mov r4, r7
  66418. struct mib_list_node *n;
  66419. /* at least one node is present */
  66420. n = rn->head;
  66421. while ((n != NULL) && (insert == 0))
  66422. {
  66423. if (n->objid == objid)
  66424. 8034d24: 68a3 ldr r3, [r4, #8]
  66425. 8034d26: 4283 cmp r3, r0
  66426. 8034d28: d102 bne.n 8034d30 <snmp_mib_node_insert+0x28>
  66427. {
  66428. /* node is already there */
  66429. LWIP_DEBUGF(SNMP_MIB_DEBUG,("node already there objid==%"S32_F"\n",objid));
  66430. *insn = n;
  66431. 8034d2a: 6034 str r4, [r6, #0]
  66432. insert = 2;
  66433. 8034d2c: 2302 movs r3, #2
  66434. 8034d2e: e023 b.n 8034d78 <snmp_mib_node_insert+0x70>
  66435. }
  66436. else if (n->objid < objid)
  66437. 8034d30: da0a bge.n 8034d48 <snmp_mib_node_insert+0x40>
  66438. {
  66439. if (n->next == NULL)
  66440. 8034d32: 6867 ldr r7, [r4, #4]
  66441. 8034d34: 2f00 cmp r7, #0
  66442. 8034d36: d1f4 bne.n 8034d22 <snmp_mib_node_insert+0x1a>
  66443. {
  66444. /* alloc and insert at the tail */
  66445. LWIP_DEBUGF(SNMP_MIB_DEBUG,("alloc ins tail objid==%"S32_F"\n",objid));
  66446. nn = snmp_mib_ln_alloc(objid);
  66447. 8034d38: f7ff ffb4 bl 8034ca4 <snmp_mib_ln_alloc>
  66448. if (nn != NULL)
  66449. 8034d3c: b1d8 cbz r0, 8034d76 <snmp_mib_node_insert+0x6e>
  66450. {
  66451. nn->next = NULL;
  66452. nn->prev = n;
  66453. 8034d3e: e880 0090 stmia.w r0, {r4, r7}
  66454. n->next = nn;
  66455. 8034d42: 6060 str r0, [r4, #4]
  66456. rn->tail = nn;
  66457. 8034d44: 61a8 str r0, [r5, #24]
  66458. 8034d46: e00b b.n 8034d60 <snmp_mib_node_insert+0x58>
  66459. else
  66460. {
  66461. /* n->objid > objid */
  66462. /* alloc and insert between n->prev and n */
  66463. LWIP_DEBUGF(SNMP_MIB_DEBUG,("alloc ins n->prev, objid==%"S32_F", n\n",objid));
  66464. nn = snmp_mib_ln_alloc(objid);
  66465. 8034d48: f7ff ffac bl 8034ca4 <snmp_mib_ln_alloc>
  66466. if (nn != NULL)
  66467. 8034d4c: b198 cbz r0, 8034d76 <snmp_mib_node_insert+0x6e>
  66468. {
  66469. if (n->prev == NULL)
  66470. 8034d4e: 6822 ldr r2, [r4, #0]
  66471. {
  66472. /* insert at the head */
  66473. nn->next = n;
  66474. nn->prev = NULL;
  66475. 8034d50: e880 0014 stmia.w r0, {r2, r4}
  66476. /* alloc and insert between n->prev and n */
  66477. LWIP_DEBUGF(SNMP_MIB_DEBUG,("alloc ins n->prev, objid==%"S32_F", n\n",objid));
  66478. nn = snmp_mib_ln_alloc(objid);
  66479. if (nn != NULL)
  66480. {
  66481. if (n->prev == NULL)
  66482. 8034d54: b90a cbnz r2, 8034d5a <snmp_mib_node_insert+0x52>
  66483. {
  66484. /* insert at the head */
  66485. nn->next = n;
  66486. nn->prev = NULL;
  66487. rn->head = nn;
  66488. 8034d56: 6168 str r0, [r5, #20]
  66489. 8034d58: e001 b.n 8034d5e <snmp_mib_node_insert+0x56>
  66490. else
  66491. {
  66492. /* insert in the middle */
  66493. nn->next = n;
  66494. nn->prev = n->prev;
  66495. n->prev->next = nn;
  66496. 8034d5a: 6822 ldr r2, [r4, #0]
  66497. 8034d5c: 6050 str r0, [r2, #4]
  66498. n->prev = nn;
  66499. 8034d5e: 6020 str r0, [r4, #0]
  66500. }
  66501. *insn = nn;
  66502. 8034d60: 6030 str r0, [r6, #0]
  66503. insert = 1;
  66504. 8034d62: 2301 movs r3, #1
  66505. 8034d64: e008 b.n 8034d78 <snmp_mib_node_insert+0x70>
  66506. }
  66507. }
  66508. }
  66509. if (insert == 1)
  66510. {
  66511. rn->count += 1;
  66512. 8034d66: 8bab ldrh r3, [r5, #28]
  66513. 8034d68: 3301 adds r3, #1
  66514. 8034d6a: 83ab strh r3, [r5, #28]
  66515. 8034d6c: 2301 movs r3, #1
  66516. 8034d6e: e000 b.n 8034d72 <snmp_mib_node_insert+0x6a>
  66517. *insn = nn;
  66518. insert = 1;
  66519. }
  66520. else
  66521. {
  66522. insert = -1;
  66523. 8034d70: 23ff movs r3, #255 ; 0xff
  66524. if (insert == 1)
  66525. {
  66526. rn->count += 1;
  66527. }
  66528. LWIP_ASSERT("insert != 0",insert != 0);
  66529. return insert;
  66530. 8034d72: b258 sxtb r0, r3
  66531. 8034d74: bdf8 pop {r3, r4, r5, r6, r7, pc}
  66532. insert = 1;
  66533. }
  66534. else
  66535. {
  66536. /* insertion failure */
  66537. insert = -1;
  66538. 8034d76: 23ff movs r3, #255 ; 0xff
  66539. }
  66540. }
  66541. }
  66542. }
  66543. if (insert == 1)
  66544. 8034d78: 2b01 cmp r3, #1
  66545. 8034d7a: d1fa bne.n 8034d72 <snmp_mib_node_insert+0x6a>
  66546. 8034d7c: e7f3 b.n 8034d66 <snmp_mib_node_insert+0x5e>
  66547. 08034d7e <snmp_mib_node_find>:
  66548. {
  66549. s8_t fc;
  66550. struct mib_list_node *n;
  66551. LWIP_ASSERT("rn != NULL",rn != NULL);
  66552. n = rn->head;
  66553. 8034d7e: 6943 ldr r3, [r0, #20]
  66554. while ((n != NULL) && (n->objid != objid))
  66555. 8034d80: e000 b.n 8034d84 <snmp_mib_node_find+0x6>
  66556. {
  66557. n = n->next;
  66558. 8034d82: 685b ldr r3, [r3, #4]
  66559. s8_t fc;
  66560. struct mib_list_node *n;
  66561. LWIP_ASSERT("rn != NULL",rn != NULL);
  66562. n = rn->head;
  66563. while ((n != NULL) && (n->objid != objid))
  66564. 8034d84: b16b cbz r3, 8034da2 <snmp_mib_node_find+0x24>
  66565. 8034d86: 6898 ldr r0, [r3, #8]
  66566. 8034d88: 4288 cmp r0, r1
  66567. 8034d8a: d1fa bne.n 8034d82 <snmp_mib_node_find+0x4>
  66568. }
  66569. if (n == NULL)
  66570. {
  66571. fc = 0;
  66572. }
  66573. else if (n->nptr == NULL)
  66574. 8034d8c: 68d9 ldr r1, [r3, #12]
  66575. 8034d8e: b161 cbz r1, 8034daa <snmp_mib_node_find+0x2c>
  66576. }
  66577. else
  66578. {
  66579. struct mib_list_rootnode *r;
  66580. if (n->nptr->node_type == MIB_NODE_LR)
  66581. 8034d90: 7c08 ldrb r0, [r1, #16]
  66582. 8034d92: 2804 cmp r0, #4
  66583. 8034d94: d107 bne.n 8034da6 <snmp_mib_node_find+0x28>
  66584. {
  66585. r = (struct mib_list_rootnode *)n->nptr;
  66586. if (r->count > 1)
  66587. 8034d96: 8b88 ldrh r0, [r1, #28]
  66588. {
  66589. /* can't delete node */
  66590. fc = 2;
  66591. 8034d98: 2801 cmp r0, #1
  66592. 8034d9a: bf94 ite ls
  66593. 8034d9c: 2001 movls r0, #1
  66594. 8034d9e: 2002 movhi r0, #2
  66595. 8034da0: e004 b.n 8034dac <snmp_mib_node_find+0x2e>
  66596. {
  66597. n = n->next;
  66598. }
  66599. if (n == NULL)
  66600. {
  66601. fc = 0;
  66602. 8034da2: 4618 mov r0, r3
  66603. 8034da4: e002 b.n 8034dac <snmp_mib_node_find+0x2e>
  66604. }
  66605. }
  66606. else
  66607. {
  66608. /* other node type */
  66609. fc = 3;
  66610. 8034da6: 2003 movs r0, #3
  66611. 8034da8: e000 b.n 8034dac <snmp_mib_node_find+0x2e>
  66612. fc = 0;
  66613. }
  66614. else if (n->nptr == NULL)
  66615. {
  66616. /* leaf, can delete node */
  66617. fc = 1;
  66618. 8034daa: 2001 movs r0, #1
  66619. {
  66620. /* other node type */
  66621. fc = 3;
  66622. }
  66623. }
  66624. *fn = n;
  66625. 8034dac: 6013 str r3, [r2, #0]
  66626. return fc;
  66627. }
  66628. 8034dae: b240 sxtb r0, r0
  66629. 8034db0: 4770 bx lr
  66630. 08034db2 <snmp_mib_node_delete>:
  66631. * @param n points to the node to delete
  66632. * @return the nptr to be freed by caller
  66633. */
  66634. struct mib_list_rootnode *
  66635. snmp_mib_node_delete(struct mib_list_rootnode *rn, struct mib_list_node *n)
  66636. {
  66637. 8034db2: b538 push {r3, r4, r5, lr}
  66638. LWIP_ASSERT("rn != NULL",rn != NULL);
  66639. LWIP_ASSERT("n != NULL",n != NULL);
  66640. /* caller must remove this sub-tree */
  66641. next = (struct mib_list_rootnode*)(n->nptr);
  66642. rn->count -= 1;
  66643. 8034db4: 8b83 ldrh r3, [r0, #28]
  66644. LWIP_ASSERT("rn != NULL",rn != NULL);
  66645. LWIP_ASSERT("n != NULL",n != NULL);
  66646. /* caller must remove this sub-tree */
  66647. next = (struct mib_list_rootnode*)(n->nptr);
  66648. 8034db6: 68cd ldr r5, [r1, #12]
  66649. rn->count -= 1;
  66650. 8034db8: 3b01 subs r3, #1
  66651. 8034dba: 8383 strh r3, [r0, #28]
  66652. if (n == rn->head)
  66653. 8034dbc: 6943 ldr r3, [r0, #20]
  66654. 8034dbe: 4299 cmp r1, r3
  66655. * @param n points to the node to delete
  66656. * @return the nptr to be freed by caller
  66657. */
  66658. struct mib_list_rootnode *
  66659. snmp_mib_node_delete(struct mib_list_rootnode *rn, struct mib_list_node *n)
  66660. {
  66661. 8034dc0: 4604 mov r4, r0
  66662. /* caller must remove this sub-tree */
  66663. next = (struct mib_list_rootnode*)(n->nptr);
  66664. rn->count -= 1;
  66665. if (n == rn->head)
  66666. 8034dc2: d105 bne.n 8034dd0 <snmp_mib_node_delete+0x1e>
  66667. {
  66668. rn->head = n->next;
  66669. 8034dc4: 684b ldr r3, [r1, #4]
  66670. 8034dc6: 6143 str r3, [r0, #20]
  66671. if (n->next != NULL)
  66672. 8034dc8: b17b cbz r3, 8034dea <snmp_mib_node_delete+0x38>
  66673. {
  66674. /* not last node, new list begin */
  66675. n->next->prev = NULL;
  66676. 8034dca: 2200 movs r2, #0
  66677. 8034dcc: 601a str r2, [r3, #0]
  66678. 8034dce: e00c b.n 8034dea <snmp_mib_node_delete+0x38>
  66679. }
  66680. }
  66681. else if (n == rn->tail)
  66682. 8034dd0: 6983 ldr r3, [r0, #24]
  66683. 8034dd2: 4299 cmp r1, r3
  66684. 8034dd4: 680b ldr r3, [r1, #0]
  66685. 8034dd6: d104 bne.n 8034de2 <snmp_mib_node_delete+0x30>
  66686. {
  66687. rn->tail = n->prev;
  66688. 8034dd8: 6183 str r3, [r0, #24]
  66689. if (n->prev != NULL)
  66690. 8034dda: b133 cbz r3, 8034dea <snmp_mib_node_delete+0x38>
  66691. {
  66692. /* not last node, new list end */
  66693. n->prev->next = NULL;
  66694. 8034ddc: 2200 movs r2, #0
  66695. 8034dde: 605a str r2, [r3, #4]
  66696. 8034de0: e003 b.n 8034dea <snmp_mib_node_delete+0x38>
  66697. }
  66698. }
  66699. else
  66700. {
  66701. /* node must be in the middle */
  66702. n->prev->next = n->next;
  66703. 8034de2: 684a ldr r2, [r1, #4]
  66704. 8034de4: 605a str r2, [r3, #4]
  66705. n->next->prev = n->prev;
  66706. 8034de6: 684a ldr r2, [r1, #4]
  66707. 8034de8: 6013 str r3, [r2, #0]
  66708. }
  66709. LWIP_DEBUGF(SNMP_MIB_DEBUG,("free list objid==%"S32_F"\n",n->objid));
  66710. snmp_mib_ln_free(n);
  66711. 8034dea: 4608 mov r0, r1
  66712. 8034dec: f7ff ff66 bl 8034cbc <snmp_mib_ln_free>
  66713. if (rn->count == 0)
  66714. 8034df0: 8ba3 ldrh r3, [r4, #28]
  66715. 8034df2: b90b cbnz r3, 8034df8 <snmp_mib_node_delete+0x46>
  66716. {
  66717. rn->head = NULL;
  66718. 8034df4: 6163 str r3, [r4, #20]
  66719. rn->tail = NULL;
  66720. 8034df6: 61a3 str r3, [r4, #24]
  66721. }
  66722. return next;
  66723. }
  66724. 8034df8: 4628 mov r0, r5
  66725. 8034dfa: bd38 pop {r3, r4, r5, pc}
  66726. 08034dfc <snmp_search_tree>:
  66727. * @param np points to the found object instance (return)
  66728. * @return pointer to the requested parent (!) node if success, NULL otherwise
  66729. */
  66730. struct mib_node *
  66731. snmp_search_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct snmp_name_ptr *np)
  66732. {
  66733. 8034dfc: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  66734. 8034e00: 4604 mov r4, r0
  66735. 8034e02: b085 sub sp, #20
  66736. 8034e04: 460d mov r5, r1
  66737. 8034e06: 461e mov r6, r3
  66738. * @param ident points to the array of sub identifiers
  66739. * @param np points to the found object instance (return)
  66740. * @return pointer to the requested parent (!) node if success, NULL otherwise
  66741. */
  66742. struct mib_node *
  66743. snmp_search_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct snmp_name_ptr *np)
  66744. 8034e08: f102 0804 add.w r8, r2, #4
  66745. {
  66746. u8_t node_type, ext_level;
  66747. ext_level = 0;
  66748. 8034e0c: f04f 0b00 mov.w fp, #0
  66749. LWIP_DEBUGF(SNMP_MIB_DEBUG,("node==%p *ident==%"S32_F"\n",(void*)node,*ident));
  66750. while (node != NULL)
  66751. 8034e10: e068 b.n 8034ee4 <snmp_search_tree+0xe8>
  66752. {
  66753. node_type = node->node_type;
  66754. 8034e12: 7c23 ldrb r3, [r4, #16]
  66755. if ((node_type == MIB_NODE_AR) || (node_type == MIB_NODE_RA))
  66756. 8034e14: 1e9a subs r2, r3, #2
  66757. 8034e16: 2a01 cmp r2, #1
  66758. 8034e18: d812 bhi.n 8034e40 <snmp_search_tree+0x44>
  66759. {
  66760. struct mib_array_node *an;
  66761. u16_t i;
  66762. if (ident_len > 0)
  66763. 8034e1a: b90d cbnz r5, 8034e20 <snmp_search_tree+0x24>
  66764. }
  66765. else
  66766. {
  66767. /* search failed, short object identifier (nosuchname) */
  66768. LWIP_DEBUGF(SNMP_MIB_DEBUG,("an search failed, short object identifier\n"));
  66769. return NULL;
  66770. 8034e1c: 2000 movs r0, #0
  66771. 8034e1e: e06a b.n 8034ef6 <snmp_search_tree+0xfa>
  66772. if (ident_len > 0)
  66773. {
  66774. /* array node (internal ROM or RAM, fixed length) */
  66775. an = (struct mib_array_node *)node;
  66776. i = 0;
  66777. while ((i < an->maxlength) && (an->objid[i] != *ident))
  66778. 8034e20: 8a67 ldrh r7, [r4, #18]
  66779. 8034e22: 2300 movs r3, #0
  66780. 8034e24: b29a uxth r2, r3
  66781. 8034e26: 42ba cmp r2, r7
  66782. 8034e28: d2f8 bcs.n 8034e1c <snmp_search_tree+0x20>
  66783. 8034e2a: 009a lsls r2, r3, #2
  66784. 8034e2c: 6961 ldr r1, [r4, #20]
  66785. 8034e2e: 5888 ldr r0, [r1, r2]
  66786. 8034e30: f858 1c04 ldr.w r1, [r8, #-4]
  66787. 8034e34: 3301 adds r3, #1
  66788. 8034e36: 4288 cmp r0, r1
  66789. 8034e38: d1f4 bne.n 8034e24 <snmp_search_tree+0x28>
  66790. }
  66791. if (i < an->maxlength)
  66792. {
  66793. /* found it, if available proceed to child, otherwise inspect leaf */
  66794. LWIP_DEBUGF(SNMP_MIB_DEBUG,("an->objid[%"U16_F"]==%"S32_F" *ident==%"S32_F"\n",i,an->objid[i],*ident));
  66795. if (an->nptr[i] == NULL)
  66796. 8034e3a: 69a3 ldr r3, [r4, #24]
  66797. 8034e3c: 589b ldr r3, [r3, r2]
  66798. 8034e3e: e057 b.n 8034ef0 <snmp_search_tree+0xf4>
  66799. /* search failed, short object identifier (nosuchname) */
  66800. LWIP_DEBUGF(SNMP_MIB_DEBUG,("an search failed, short object identifier\n"));
  66801. return NULL;
  66802. }
  66803. }
  66804. else if(node_type == MIB_NODE_LR)
  66805. 8034e40: 2b04 cmp r3, #4
  66806. 8034e42: d10c bne.n 8034e5e <snmp_search_tree+0x62>
  66807. {
  66808. struct mib_list_rootnode *lrn;
  66809. struct mib_list_node *ln;
  66810. if (ident_len > 0)
  66811. 8034e44: 2d00 cmp r5, #0
  66812. 8034e46: d0e9 beq.n 8034e1c <snmp_search_tree+0x20>
  66813. {
  66814. /* list root node (internal 'RAM', variable length) */
  66815. lrn = (struct mib_list_rootnode *)node;
  66816. ln = lrn->head;
  66817. 8034e48: 6963 ldr r3, [r4, #20]
  66818. /* iterate over list, head to tail */
  66819. while ((ln != NULL) && (ln->objid != *ident))
  66820. 8034e4a: e000 b.n 8034e4e <snmp_search_tree+0x52>
  66821. {
  66822. ln = ln->next;
  66823. 8034e4c: 685b ldr r3, [r3, #4]
  66824. {
  66825. /* list root node (internal 'RAM', variable length) */
  66826. lrn = (struct mib_list_rootnode *)node;
  66827. ln = lrn->head;
  66828. /* iterate over list, head to tail */
  66829. while ((ln != NULL) && (ln->objid != *ident))
  66830. 8034e4e: 2b00 cmp r3, #0
  66831. 8034e50: d0e4 beq.n 8034e1c <snmp_search_tree+0x20>
  66832. 8034e52: 6899 ldr r1, [r3, #8]
  66833. 8034e54: f858 2c04 ldr.w r2, [r8, #-4]
  66834. 8034e58: 4291 cmp r1, r2
  66835. 8034e5a: d1f7 bne.n 8034e4c <snmp_search_tree+0x50>
  66836. 8034e5c: e047 b.n 8034eee <snmp_search_tree+0xf2>
  66837. /* search failed, short object identifier (nosuchname) */
  66838. LWIP_DEBUGF(SNMP_MIB_DEBUG,("ln search failed, short object identifier\n"));
  66839. return NULL;
  66840. }
  66841. }
  66842. else if(node_type == MIB_NODE_EX)
  66843. 8034e5e: 2b05 cmp r3, #5
  66844. 8034e60: d12e bne.n 8034ec0 <snmp_search_tree+0xc4>
  66845. {
  66846. struct mib_external_node *en;
  66847. u16_t i, len;
  66848. if (ident_len > 0)
  66849. 8034e62: 2d00 cmp r5, #0
  66850. 8034e64: d0da beq.n 8034e1c <snmp_search_tree+0x20>
  66851. {
  66852. /* external node (addressing and access via functions) */
  66853. en = (struct mib_external_node *)node;
  66854. i = 0;
  66855. len = en->level_length(en->addr_inf,ext_level);
  66856. 8034e66: 69e3 ldr r3, [r4, #28]
  66857. 8034e68: 6960 ldr r0, [r4, #20]
  66858. 8034e6a: 4659 mov r1, fp
  66859. 8034e6c: 4798 blx r3
  66860. if (ident_len > 0)
  66861. {
  66862. /* external node (addressing and access via functions) */
  66863. en = (struct mib_external_node *)node;
  66864. i = 0;
  66865. 8034e6e: f04f 0900 mov.w r9, #0
  66866. len = en->level_length(en->addr_inf,ext_level);
  66867. 8034e72: 4684 mov ip, r0
  66868. while ((i < len) && (en->ident_cmp(en->addr_inf,ext_level,i,*ident) != 0))
  66869. 8034e74: e003 b.n 8034e7e <snmp_search_tree+0x82>
  66870. {
  66871. i++;
  66872. 8034e76: f109 0901 add.w r9, r9, #1
  66873. 8034e7a: fa1f f989 uxth.w r9, r9
  66874. /* external node (addressing and access via functions) */
  66875. en = (struct mib_external_node *)node;
  66876. i = 0;
  66877. len = en->level_length(en->addr_inf,ext_level);
  66878. while ((i < len) && (en->ident_cmp(en->addr_inf,ext_level,i,*ident) != 0))
  66879. 8034e7e: 45e1 cmp r9, ip
  66880. 8034e80: d0cc beq.n 8034e1c <snmp_search_tree+0x20>
  66881. 8034e82: 6960 ldr r0, [r4, #20]
  66882. 8034e84: f858 3c04 ldr.w r3, [r8, #-4]
  66883. 8034e88: 6a27 ldr r7, [r4, #32]
  66884. 8034e8a: f8cd c004 str.w ip, [sp, #4]
  66885. 8034e8e: 4659 mov r1, fp
  66886. 8034e90: 464a mov r2, r9
  66887. 8034e92: 47b8 blx r7
  66888. 8034e94: f8dd c004 ldr.w ip, [sp, #4]
  66889. 8034e98: 2800 cmp r0, #0
  66890. 8034e9a: d1ec bne.n 8034e76 <snmp_search_tree+0x7a>
  66891. {
  66892. i++;
  66893. }
  66894. if (i < len)
  66895. 8034e9c: 45e1 cmp r9, ip
  66896. 8034e9e: d2bd bcs.n 8034e1c <snmp_search_tree+0x20>
  66897. {
  66898. s32_t debug_id;
  66899. en->get_objid(en->addr_inf,ext_level,i,&debug_id);
  66900. 8034ea0: 4659 mov r1, fp
  66901. 8034ea2: ab03 add r3, sp, #12
  66902. 8034ea4: 6a67 ldr r7, [r4, #36] ; 0x24
  66903. 8034ea6: 6960 ldr r0, [r4, #20]
  66904. 8034ea8: 464a mov r2, r9
  66905. 8034eaa: 47b8 blx r7
  66906. LWIP_DEBUGF(SNMP_MIB_DEBUG,("en->objid==%"S32_F" *ident==%"S32_F"\n",debug_id,*ident));
  66907. if ((ext_level + 1) == en->tree_levels)
  66908. 8034eac: 7e23 ldrb r3, [r4, #24]
  66909. 8034eae: f10b 0b01 add.w fp, fp, #1
  66910. 8034eb2: 459b cmp fp, r3
  66911. 8034eb4: d100 bne.n 8034eb8 <snmp_search_tree+0xbc>
  66912. 8034eb6: e00b b.n 8034ed0 <snmp_search_tree+0xd4>
  66913. else
  66914. {
  66915. /* found it, proceed to child */
  66916. ident_len--;
  66917. ident++;
  66918. ext_level++;
  66919. 8034eb8: fa5f fb8b uxtb.w fp, fp
  66920. 8034ebc: 4623 mov r3, r4
  66921. 8034ebe: e00c b.n 8034eda <snmp_search_tree+0xde>
  66922. /* search failed, short object identifier (nosuchname) */
  66923. LWIP_DEBUGF(SNMP_MIB_DEBUG,("en search failed, short object identifier\n"));
  66924. return NULL;
  66925. }
  66926. }
  66927. else if (node_type == MIB_NODE_SC)
  66928. 8034ec0: 2b01 cmp r3, #1
  66929. 8034ec2: d1ab bne.n 8034e1c <snmp_search_tree+0x20>
  66930. {
  66931. mib_scalar_node *sn;
  66932. sn = (mib_scalar_node *)node;
  66933. if ((ident_len == 1) && (*ident == 0))
  66934. 8034ec4: 2d01 cmp r5, #1
  66935. 8034ec6: d1a9 bne.n 8034e1c <snmp_search_tree+0x20>
  66936. 8034ec8: f8da 3000 ldr.w r3, [sl]
  66937. 8034ecc: 2b00 cmp r3, #0
  66938. 8034ece: d1a5 bne.n 8034e1c <snmp_search_tree+0x20>
  66939. {
  66940. np->ident_len = ident_len;
  66941. 8034ed0: 7035 strb r5, [r6, #0]
  66942. np->ident = ident;
  66943. 8034ed2: f8c6 a004 str.w sl, [r6, #4]
  66944. return (struct mib_node*)sn;
  66945. 8034ed6: 4620 mov r0, r4
  66946. 8034ed8: e00d b.n 8034ef6 <snmp_search_tree+0xfa>
  66947. 8034eda: 3d01 subs r5, #1
  66948. 8034edc: b2ed uxtb r5, r5
  66949. 8034ede: f108 0804 add.w r8, r8, #4
  66950. 8034ee2: 461c mov r4, r3
  66951. * @param ident points to the array of sub identifiers
  66952. * @param np points to the found object instance (return)
  66953. * @return pointer to the requested parent (!) node if success, NULL otherwise
  66954. */
  66955. struct mib_node *
  66956. snmp_search_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct snmp_name_ptr *np)
  66957. 8034ee4: f1a8 0a04 sub.w sl, r8, #4
  66958. {
  66959. u8_t node_type, ext_level;
  66960. ext_level = 0;
  66961. LWIP_DEBUGF(SNMP_MIB_DEBUG,("node==%p *ident==%"S32_F"\n",(void*)node,*ident));
  66962. while (node != NULL)
  66963. 8034ee8: 2c00 cmp r4, #0
  66964. 8034eea: d192 bne.n 8034e12 <snmp_search_tree+0x16>
  66965. 8034eec: e796 b.n 8034e1c <snmp_search_tree+0x20>
  66966. }
  66967. if (ln != NULL)
  66968. {
  66969. /* found it, proceed to child */;
  66970. LWIP_DEBUGF(SNMP_MIB_DEBUG,("ln->objid==%"S32_F" *ident==%"S32_F"\n",ln->objid,*ident));
  66971. if (ln->nptr == NULL)
  66972. 8034eee: 68db ldr r3, [r3, #12]
  66973. 8034ef0: 2b00 cmp r3, #0
  66974. 8034ef2: d1f2 bne.n 8034eda <snmp_search_tree+0xde>
  66975. 8034ef4: e7ec b.n 8034ed0 <snmp_search_tree+0xd4>
  66976. }
  66977. }
  66978. /* done, found nothing */
  66979. LWIP_DEBUGF(SNMP_MIB_DEBUG,("search failed node==%p\n",(void*)node));
  66980. return NULL;
  66981. }
  66982. 8034ef6: b005 add sp, #20
  66983. 8034ef8: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  66984. 08034efc <snmp_expand_tree>:
  66985. /**
  66986. * Tree expansion.
  66987. */
  66988. struct mib_node *
  66989. snmp_expand_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct snmp_obj_id *oidret)
  66990. {
  66991. 8034efc: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  66992. 8034f00: 461d mov r5, r3
  66993. 8034f02: b08b sub sp, #44 ; 0x2c
  66994. u8_t node_type, ext_level, climb_tree;
  66995. ext_level = 0;
  66996. /* reset node stack */
  66997. node_stack_cnt = 0;
  66998. 8034f04: 4ba4 ldr r3, [pc, #656] ; (8035198 <snmp_expand_tree+0x29c>)
  66999. 8034f06: f04f 0a00 mov.w sl, #0
  67000. j = (u8_t)i + 1;
  67001. if (j < len)
  67002. {
  67003. /* right node is the current external node */
  67004. cur_node.r_ptr = node;
  67005. en->get_objid(en->addr_inf,ext_level,j,&cur_node.r_id);
  67006. 8034f0a: af08 add r7, sp, #32
  67007. /**
  67008. * Tree expansion.
  67009. */
  67010. struct mib_node *
  67011. snmp_expand_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct snmp_obj_id *oidret)
  67012. {
  67013. 8034f0c: 4604 mov r4, r0
  67014. 8034f0e: 460e mov r6, r1
  67015. 8034f10: 4690 mov r8, r2
  67016. u8_t node_type, ext_level, climb_tree;
  67017. ext_level = 0;
  67018. /* reset node stack */
  67019. node_stack_cnt = 0;
  67020. 8034f12: f883 a000 strb.w sl, [r3]
  67021. j = (u8_t)i + 1;
  67022. if (j < len)
  67023. {
  67024. /* right node is the current external node */
  67025. cur_node.r_ptr = node;
  67026. en->get_objid(en->addr_inf,ext_level,j,&cur_node.r_id);
  67027. 8034f16: 9705 str r7, [sp, #20]
  67028. u8_t node_type, ext_level, climb_tree;
  67029. ext_level = 0;
  67030. /* reset node stack */
  67031. node_stack_cnt = 0;
  67032. while (node != NULL)
  67033. 8034f18: e19c b.n 8035254 <snmp_expand_tree+0x358>
  67034. {
  67035. climb_tree = 0;
  67036. node_type = node->node_type;
  67037. 8034f1a: 7c23 ldrb r3, [r4, #16]
  67038. if ((node_type == MIB_NODE_AR) || (node_type == MIB_NODE_RA))
  67039. 8034f1c: 1e9a subs r2, r3, #2
  67040. 8034f1e: 2a01 cmp r2, #1
  67041. 8034f20: f200 808f bhi.w 8035042 <snmp_expand_tree+0x146>
  67042. 8034f24: 8a67 ldrh r7, [r4, #18]
  67043. struct mib_array_node *an;
  67044. u16_t i;
  67045. /* array node (internal ROM or RAM, fixed length) */
  67046. an = (struct mib_array_node *)node;
  67047. if (ident_len > 0)
  67048. 8034f26: b90e cbnz r6, 8034f2c <snmp_expand_tree+0x30>
  67049. else
  67050. {
  67051. u8_t j;
  67052. /* ident_len == 0, complete with leftmost '.thing' */
  67053. j = 0;
  67054. while ((j < an->maxlength) && empty_table(an->nptr[j]))
  67055. 8034f28: 46b1 mov r9, r6
  67056. 8034f2a: e06f b.n 803500c <snmp_expand_tree+0x110>
  67057. /* array node (internal ROM or RAM, fixed length) */
  67058. an = (struct mib_array_node *)node;
  67059. if (ident_len > 0)
  67060. {
  67061. i = 0;
  67062. while ((i < an->maxlength) && (an->objid[i] < *ident))
  67063. 8034f2c: f04f 0c00 mov.w ip, #0
  67064. 8034f30: fa1f f28c uxth.w r2, ip
  67065. 8034f34: 42ba cmp r2, r7
  67066. 8034f36: f080 8168 bcs.w 803520a <snmp_expand_tree+0x30e>
  67067. 8034f3a: 6963 ldr r3, [r4, #20]
  67068. 8034f3c: f853 102c ldr.w r1, [r3, ip, lsl #2]
  67069. 8034f40: f8d8 3000 ldr.w r3, [r8]
  67070. 8034f44: 4299 cmp r1, r3
  67071. 8034f46: ea4f 098c mov.w r9, ip, lsl #2
  67072. 8034f4a: f10c 0c01 add.w ip, ip, #1
  67073. 8034f4e: dbef blt.n 8034f30 <snmp_expand_tree+0x34>
  67074. }
  67075. if (i < an->maxlength)
  67076. {
  67077. LWIP_DEBUGF(SNMP_MIB_DEBUG,("an->objid[%"U16_F"]==%"S32_F" *ident==%"S32_F"\n",i,an->objid[i],*ident));
  67078. /* add identifier to oidret */
  67079. oidret->id[oidret->len] = an->objid[i];
  67080. 8034f50: 782b ldrb r3, [r5, #0]
  67081. 8034f52: eb05 0783 add.w r7, r5, r3, lsl #2
  67082. 8034f56: 6079 str r1, [r7, #4]
  67083. (oidret->len)++;
  67084. 8034f58: 1c59 adds r1, r3, #1
  67085. 8034f5a: 7029 strb r1, [r5, #0]
  67086. if (an->nptr[i] == NULL)
  67087. 8034f5c: f8d4 b018 ldr.w fp, [r4, #24]
  67088. 8034f60: f85b 0009 ldr.w r0, [fp, r9]
  67089. 8034f64: b998 cbnz r0, 8034f8e <snmp_expand_tree+0x92>
  67090. {
  67091. LWIP_DEBUGF(SNMP_MIB_DEBUG,("leaf node\n"));
  67092. /* leaf node (e.g. in a fixed size table) */
  67093. if (an->objid[i] > *ident)
  67094. 8034f66: 6960 ldr r0, [r4, #20]
  67095. 8034f68: f850 6009 ldr.w r6, [r0, r9]
  67096. 8034f6c: f8d8 0000 ldr.w r0, [r8]
  67097. 8034f70: 4286 cmp r6, r0
  67098. 8034f72: f300 8173 bgt.w 803525c <snmp_expand_tree+0x360>
  67099. {
  67100. return (struct mib_node*)an;
  67101. }
  67102. else if ((i + 1) < an->maxlength)
  67103. 8034f76: 8a60 ldrh r0, [r4, #18]
  67104. {
  67105. /* an->objid[i] == *ident */
  67106. (oidret->len)--;
  67107. 8034f78: 702b strb r3, [r5, #0]
  67108. /* leaf node (e.g. in a fixed size table) */
  67109. if (an->objid[i] > *ident)
  67110. {
  67111. return (struct mib_node*)an;
  67112. }
  67113. else if ((i + 1) < an->maxlength)
  67114. 8034f7a: 3201 adds r2, #1
  67115. 8034f7c: 4282 cmp r2, r0
  67116. 8034f7e: f280 8144 bge.w 803520a <snmp_expand_tree+0x30e>
  67117. {
  67118. /* an->objid[i] == *ident */
  67119. (oidret->len)--;
  67120. oidret->id[oidret->len] = an->objid[i + 1];
  67121. 8034f82: 6963 ldr r3, [r4, #20]
  67122. 8034f84: f853 302c ldr.w r3, [r3, ip, lsl #2]
  67123. (oidret->len)++;
  67124. 8034f88: 7029 strb r1, [r5, #0]
  67125. }
  67126. else if ((i + 1) < an->maxlength)
  67127. {
  67128. /* an->objid[i] == *ident */
  67129. (oidret->len)--;
  67130. oidret->id[oidret->len] = an->objid[i + 1];
  67131. 8034f8a: 607b str r3, [r7, #4]
  67132. 8034f8c: e166 b.n 803525c <snmp_expand_tree+0x360>
  67133. struct nse cur_node;
  67134. LWIP_DEBUGF(SNMP_MIB_DEBUG,("non-leaf node\n"));
  67135. /* non-leaf, store right child ptr and id */
  67136. LWIP_ASSERT("i < 0xff", i < 0xff);
  67137. j = (u8_t)i + 1;
  67138. 8034f8e: 3201 adds r2, #1
  67139. while ((j < an->maxlength) && (empty_table(an->nptr[j])))
  67140. 8034f90: 8a61 ldrh r1, [r4, #18]
  67141. struct nse cur_node;
  67142. LWIP_DEBUGF(SNMP_MIB_DEBUG,("non-leaf node\n"));
  67143. /* non-leaf, store right child ptr and id */
  67144. LWIP_ASSERT("i < 0xff", i < 0xff);
  67145. j = (u8_t)i + 1;
  67146. 8034f92: fa5f fc82 uxtb.w ip, r2
  67147. while ((j < an->maxlength) && (empty_table(an->nptr[j])))
  67148. 8034f96: 2700 movs r7, #0
  67149. /**
  67150. * Tree expansion.
  67151. */
  67152. struct mib_node *
  67153. snmp_expand_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct snmp_obj_id *oidret)
  67154. 8034f98: eb0c 0307 add.w r3, ip, r7
  67155. 8034f9c: b2db uxtb r3, r3
  67156. LWIP_DEBUGF(SNMP_MIB_DEBUG,("non-leaf node\n"));
  67157. /* non-leaf, store right child ptr and id */
  67158. LWIP_ASSERT("i < 0xff", i < 0xff);
  67159. j = (u8_t)i + 1;
  67160. while ((j < an->maxlength) && (empty_table(an->nptr[j])))
  67161. 8034f9e: 428b cmp r3, r1
  67162. 8034fa0: d21a bcs.n 8034fd8 <snmp_expand_tree+0xdc>
  67163. 8034fa2: b21b sxth r3, r3
  67164. 8034fa4: 009a lsls r2, r3, #2
  67165. 8034fa6: f85b 3023 ldr.w r3, [fp, r3, lsl #2]
  67166. 8034faa: 9104 str r1, [sp, #16]
  67167. 8034fac: 4618 mov r0, r3
  67168. 8034fae: 9203 str r2, [sp, #12]
  67169. 8034fb0: 9302 str r3, [sp, #8]
  67170. 8034fb2: f8cd c004 str.w ip, [sp, #4]
  67171. 8034fb6: f7ff fe23 bl 8034c00 <empty_table>
  67172. 8034fba: 3701 adds r7, #1
  67173. 8034fbc: 9904 ldr r1, [sp, #16]
  67174. 8034fbe: 9a03 ldr r2, [sp, #12]
  67175. 8034fc0: 9b02 ldr r3, [sp, #8]
  67176. 8034fc2: f8dd c004 ldr.w ip, [sp, #4]
  67177. 8034fc6: 2800 cmp r0, #0
  67178. 8034fc8: d1e6 bne.n 8034f98 <snmp_expand_tree+0x9c>
  67179. {
  67180. j++;
  67181. }
  67182. if (j < an->maxlength)
  67183. {
  67184. cur_node.r_ptr = an->nptr[j];
  67185. 8034fca: 9307 str r3, [sp, #28]
  67186. cur_node.r_id = an->objid[j];
  67187. 8034fcc: 6963 ldr r3, [r4, #20]
  67188. 8034fce: 589b ldr r3, [r3, r2]
  67189. cur_node.r_nl = 0;
  67190. 8034fd0: f88d 0024 strb.w r0, [sp, #36] ; 0x24
  67191. j++;
  67192. }
  67193. if (j < an->maxlength)
  67194. {
  67195. cur_node.r_ptr = an->nptr[j];
  67196. cur_node.r_id = an->objid[j];
  67197. 8034fd4: 9308 str r3, [sp, #32]
  67198. 8034fd6: e001 b.n 8034fdc <snmp_expand_tree+0xe0>
  67199. cur_node.r_nl = 0;
  67200. }
  67201. else
  67202. {
  67203. cur_node.r_ptr = NULL;
  67204. 8034fd8: 2300 movs r3, #0
  67205. 8034fda: 9307 str r3, [sp, #28]
  67206. }
  67207. push_node(&cur_node);
  67208. 8034fdc: a807 add r0, sp, #28
  67209. 8034fde: f7ff fdfb bl 8034bd8 <push_node>
  67210. if (an->objid[i] == *ident)
  67211. 8034fe2: 6963 ldr r3, [r4, #20]
  67212. 8034fe4: f853 2009 ldr.w r2, [r3, r9]
  67213. 8034fe8: f8d8 3000 ldr.w r3, [r8]
  67214. 8034fec: 429a cmp r2, r3
  67215. 8034fee: d104 bne.n 8034ffa <snmp_expand_tree+0xfe>
  67216. {
  67217. ident_len--;
  67218. 8034ff0: 3e01 subs r6, #1
  67219. 8034ff2: b2f6 uxtb r6, r6
  67220. ident++;
  67221. 8034ff4: f108 0804 add.w r8, r8, #4
  67222. 8034ff8: e000 b.n 8034ffc <snmp_expand_tree+0x100>
  67223. }
  67224. else
  67225. {
  67226. /* an->objid[i] < *ident */
  67227. ident_len = 0;
  67228. 8034ffa: 2600 movs r6, #0
  67229. }
  67230. /* follow next child pointer */
  67231. node = an->nptr[i];
  67232. 8034ffc: 69a3 ldr r3, [r4, #24]
  67233. 8034ffe: f853 3009 ldr.w r3, [r3, r9]
  67234. 8035002: e140 b.n 8035286 <snmp_expand_tree+0x38a>
  67235. u8_t j;
  67236. /* ident_len == 0, complete with leftmost '.thing' */
  67237. j = 0;
  67238. while ((j < an->maxlength) && empty_table(an->nptr[j]))
  67239. {
  67240. j++;
  67241. 8035004: f109 0901 add.w r9, r9, #1
  67242. 8035008: fa5f f989 uxtb.w r9, r9
  67243. else
  67244. {
  67245. u8_t j;
  67246. /* ident_len == 0, complete with leftmost '.thing' */
  67247. j = 0;
  67248. while ((j < an->maxlength) && empty_table(an->nptr[j]))
  67249. 803500c: 45b9 cmp r9, r7
  67250. 803500e: f080 80fc bcs.w 803520a <snmp_expand_tree+0x30e>
  67251. 8035012: fa0f f289 sxth.w r2, r9
  67252. 8035016: 69a3 ldr r3, [r4, #24]
  67253. 8035018: f853 0022 ldr.w r0, [r3, r2, lsl #2]
  67254. 803501c: ea4f 0b82 mov.w fp, r2, lsl #2
  67255. 8035020: f7ff fdee bl 8034c00 <empty_table>
  67256. 8035024: 2800 cmp r0, #0
  67257. 8035026: d1ed bne.n 8035004 <snmp_expand_tree+0x108>
  67258. j++;
  67259. }
  67260. if (j < an->maxlength)
  67261. {
  67262. LWIP_DEBUGF(SNMP_MIB_DEBUG,("left an->objid[j]==%"S32_F"\n",an->objid[j]));
  67263. oidret->id[oidret->len] = an->objid[j];
  67264. 8035028: 6962 ldr r2, [r4, #20]
  67265. 803502a: 782b ldrb r3, [r5, #0]
  67266. 803502c: f852 100b ldr.w r1, [r2, fp]
  67267. 8035030: eb05 0283 add.w r2, r5, r3, lsl #2
  67268. (oidret->len)++;
  67269. 8035034: 3301 adds r3, #1
  67270. 8035036: 702b strb r3, [r5, #0]
  67271. if (an->nptr[j] == NULL)
  67272. 8035038: 69a3 ldr r3, [r4, #24]
  67273. j++;
  67274. }
  67275. if (j < an->maxlength)
  67276. {
  67277. LWIP_DEBUGF(SNMP_MIB_DEBUG,("left an->objid[j]==%"S32_F"\n",an->objid[j]));
  67278. oidret->id[oidret->len] = an->objid[j];
  67279. 803503a: 6051 str r1, [r2, #4]
  67280. (oidret->len)++;
  67281. if (an->nptr[j] == NULL)
  67282. 803503c: f853 300b ldr.w r3, [r3, fp]
  67283. 8035040: e11f b.n 8035282 <snmp_expand_tree+0x386>
  67284. /* j == an->maxlength */
  67285. climb_tree = 1;
  67286. }
  67287. }
  67288. }
  67289. else if(node_type == MIB_NODE_LR)
  67290. 8035042: 2b04 cmp r3, #4
  67291. 8035044: d14c bne.n 80350e0 <snmp_expand_tree+0x1e4>
  67292. 8035046: 6967 ldr r7, [r4, #20]
  67293. struct mib_list_rootnode *lrn;
  67294. struct mib_list_node *ln;
  67295. /* list root node (internal 'RAM', variable length) */
  67296. lrn = (struct mib_list_rootnode *)node;
  67297. if (ident_len > 0)
  67298. 8035048: 2e00 cmp r6, #0
  67299. 803504a: d040 beq.n 80350ce <snmp_expand_tree+0x1d2>
  67300. {
  67301. ln = lrn->head;
  67302. /* iterate over list, head to tail */
  67303. while ((ln != NULL) && (ln->objid < *ident))
  67304. 803504c: e000 b.n 8035050 <snmp_expand_tree+0x154>
  67305. {
  67306. ln = ln->next;
  67307. 803504e: 687f ldr r7, [r7, #4]
  67308. lrn = (struct mib_list_rootnode *)node;
  67309. if (ident_len > 0)
  67310. {
  67311. ln = lrn->head;
  67312. /* iterate over list, head to tail */
  67313. while ((ln != NULL) && (ln->objid < *ident))
  67314. 8035050: 2f00 cmp r7, #0
  67315. 8035052: f000 80da beq.w 803520a <snmp_expand_tree+0x30e>
  67316. 8035056: 68ba ldr r2, [r7, #8]
  67317. 8035058: f8d8 3000 ldr.w r3, [r8]
  67318. 803505c: 429a cmp r2, r3
  67319. 803505e: dbf6 blt.n 803504e <snmp_expand_tree+0x152>
  67320. ln = ln->next;
  67321. }
  67322. if (ln != NULL)
  67323. {
  67324. LWIP_DEBUGF(SNMP_MIB_DEBUG,("ln->objid==%"S32_F" *ident==%"S32_F"\n",ln->objid,*ident));
  67325. oidret->id[oidret->len] = ln->objid;
  67326. 8035060: 782b ldrb r3, [r5, #0]
  67327. 8035062: eb05 0183 add.w r1, r5, r3, lsl #2
  67328. 8035066: 604a str r2, [r1, #4]
  67329. (oidret->len)++;
  67330. 8035068: 1c5a adds r2, r3, #1
  67331. 803506a: 702a strb r2, [r5, #0]
  67332. if (ln->nptr == NULL)
  67333. 803506c: 68f8 ldr r0, [r7, #12]
  67334. 803506e: b978 cbnz r0, 8035090 <snmp_expand_tree+0x194>
  67335. {
  67336. /* leaf node */
  67337. if (ln->objid > *ident)
  67338. 8035070: 68b8 ldr r0, [r7, #8]
  67339. 8035072: f8d8 6000 ldr.w r6, [r8]
  67340. 8035076: 42b0 cmp r0, r6
  67341. 8035078: f300 80f0 bgt.w 803525c <snmp_expand_tree+0x360>
  67342. {
  67343. return (struct mib_node*)lrn;
  67344. }
  67345. else if (ln->next != NULL)
  67346. 803507c: 6878 ldr r0, [r7, #4]
  67347. {
  67348. /* ln->objid == *ident */
  67349. (oidret->len)--;
  67350. 803507e: 702b strb r3, [r5, #0]
  67351. /* leaf node */
  67352. if (ln->objid > *ident)
  67353. {
  67354. return (struct mib_node*)lrn;
  67355. }
  67356. else if (ln->next != NULL)
  67357. 8035080: 2800 cmp r0, #0
  67358. 8035082: f000 80c2 beq.w 803520a <snmp_expand_tree+0x30e>
  67359. {
  67360. /* ln->objid == *ident */
  67361. (oidret->len)--;
  67362. oidret->id[oidret->len] = ln->next->objid;
  67363. 8035086: 687b ldr r3, [r7, #4]
  67364. 8035088: 689b ldr r3, [r3, #8]
  67365. (oidret->len)++;
  67366. 803508a: 702a strb r2, [r5, #0]
  67367. }
  67368. else if (ln->next != NULL)
  67369. {
  67370. /* ln->objid == *ident */
  67371. (oidret->len)--;
  67372. oidret->id[oidret->len] = ln->next->objid;
  67373. 803508c: 604b str r3, [r1, #4]
  67374. 803508e: e0e5 b.n 803525c <snmp_expand_tree+0x360>
  67375. {
  67376. struct mib_list_node *jn;
  67377. struct nse cur_node;
  67378. /* non-leaf, store right child ptr and id */
  67379. jn = ln->next;
  67380. 8035090: 687c ldr r4, [r7, #4]
  67381. while ((jn != NULL) && empty_table(jn->nptr))
  67382. 8035092: e000 b.n 8035096 <snmp_expand_tree+0x19a>
  67383. {
  67384. jn = jn->next;
  67385. 8035094: 6864 ldr r4, [r4, #4]
  67386. struct mib_list_node *jn;
  67387. struct nse cur_node;
  67388. /* non-leaf, store right child ptr and id */
  67389. jn = ln->next;
  67390. while ((jn != NULL) && empty_table(jn->nptr))
  67391. 8035096: 2c00 cmp r4, #0
  67392. 8035098: f000 80e9 beq.w 803526e <snmp_expand_tree+0x372>
  67393. 803509c: f8d4 900c ldr.w r9, [r4, #12]
  67394. 80350a0: 4648 mov r0, r9
  67395. 80350a2: f7ff fdad bl 8034c00 <empty_table>
  67396. 80350a6: 2800 cmp r0, #0
  67397. 80350a8: d1f4 bne.n 8035094 <snmp_expand_tree+0x198>
  67398. 80350aa: e0d9 b.n 8035260 <snmp_expand_tree+0x364>
  67399. }
  67400. else
  67401. {
  67402. cur_node.r_ptr = NULL;
  67403. }
  67404. push_node(&cur_node);
  67405. 80350ac: a807 add r0, sp, #28
  67406. 80350ae: f7ff fd93 bl 8034bd8 <push_node>
  67407. if (ln->objid == *ident)
  67408. 80350b2: 68ba ldr r2, [r7, #8]
  67409. 80350b4: f8d8 3000 ldr.w r3, [r8]
  67410. 80350b8: 429a cmp r2, r3
  67411. 80350ba: d104 bne.n 80350c6 <snmp_expand_tree+0x1ca>
  67412. {
  67413. ident_len--;
  67414. 80350bc: 3e01 subs r6, #1
  67415. 80350be: b2f6 uxtb r6, r6
  67416. ident++;
  67417. 80350c0: f108 0804 add.w r8, r8, #4
  67418. 80350c4: e000 b.n 80350c8 <snmp_expand_tree+0x1cc>
  67419. }
  67420. else
  67421. {
  67422. /* ln->objid < *ident */
  67423. ident_len = 0;
  67424. 80350c6: 2600 movs r6, #0
  67425. }
  67426. /* follow next child pointer */
  67427. node = ln->nptr;
  67428. 80350c8: 68fb ldr r3, [r7, #12]
  67429. 80350ca: e0dc b.n 8035286 <snmp_expand_tree+0x38a>
  67430. struct mib_list_node *jn;
  67431. /* ident_len == 0, complete with leftmost '.thing' */
  67432. jn = lrn->head;
  67433. while ((jn != NULL) && empty_table(jn->nptr))
  67434. {
  67435. jn = jn->next;
  67436. 80350cc: 687f ldr r7, [r7, #4]
  67437. else
  67438. {
  67439. struct mib_list_node *jn;
  67440. /* ident_len == 0, complete with leftmost '.thing' */
  67441. jn = lrn->head;
  67442. while ((jn != NULL) && empty_table(jn->nptr))
  67443. 80350ce: 2f00 cmp r7, #0
  67444. 80350d0: f000 809b beq.w 803520a <snmp_expand_tree+0x30e>
  67445. 80350d4: 68f8 ldr r0, [r7, #12]
  67446. 80350d6: f7ff fd93 bl 8034c00 <empty_table>
  67447. 80350da: 2800 cmp r0, #0
  67448. 80350dc: d1f6 bne.n 80350cc <snmp_expand_tree+0x1d0>
  67449. 80350de: e0c8 b.n 8035272 <snmp_expand_tree+0x376>
  67450. /* jn == NULL */
  67451. climb_tree = 1;
  67452. }
  67453. }
  67454. }
  67455. else if(node_type == MIB_NODE_EX)
  67456. 80350e0: 2b05 cmp r3, #5
  67457. 80350e2: f040 8086 bne.w 80351f2 <snmp_expand_tree+0x2f6>
  67458. struct mib_external_node *en;
  67459. s32_t ex_id;
  67460. /* external node (addressing and access via functions) */
  67461. en = (struct mib_external_node *)node;
  67462. if (ident_len > 0)
  67463. 80350e6: 2e00 cmp r6, #0
  67464. 80350e8: d06e beq.n 80351c8 <snmp_expand_tree+0x2cc>
  67465. {
  67466. u16_t i, len;
  67467. i = 0;
  67468. len = en->level_length(en->addr_inf,ext_level);
  67469. 80350ea: 69e3 ldr r3, [r4, #28]
  67470. 80350ec: 6960 ldr r0, [r4, #20]
  67471. 80350ee: 4651 mov r1, sl
  67472. 80350f0: 4798 blx r3
  67473. en = (struct mib_external_node *)node;
  67474. if (ident_len > 0)
  67475. {
  67476. u16_t i, len;
  67477. i = 0;
  67478. 80350f2: f04f 0900 mov.w r9, #0
  67479. len = en->level_length(en->addr_inf,ext_level);
  67480. 80350f6: 4683 mov fp, r0
  67481. while ((i < len) && (en->ident_cmp(en->addr_inf,ext_level,i,*ident) < 0))
  67482. 80350f8: e003 b.n 8035102 <snmp_expand_tree+0x206>
  67483. {
  67484. i++;
  67485. 80350fa: f109 0901 add.w r9, r9, #1
  67486. 80350fe: fa1f f989 uxth.w r9, r9
  67487. {
  67488. u16_t i, len;
  67489. i = 0;
  67490. len = en->level_length(en->addr_inf,ext_level);
  67491. while ((i < len) && (en->ident_cmp(en->addr_inf,ext_level,i,*ident) < 0))
  67492. 8035102: 45d9 cmp r9, fp
  67493. 8035104: f000 8081 beq.w 803520a <snmp_expand_tree+0x30e>
  67494. 8035108: 6a27 ldr r7, [r4, #32]
  67495. 803510a: 6960 ldr r0, [r4, #20]
  67496. 803510c: f8d8 3000 ldr.w r3, [r8]
  67497. 8035110: 4651 mov r1, sl
  67498. 8035112: 464a mov r2, r9
  67499. 8035114: 47b8 blx r7
  67500. 8035116: 2800 cmp r0, #0
  67501. 8035118: dbef blt.n 80350fa <snmp_expand_tree+0x1fe>
  67502. {
  67503. i++;
  67504. }
  67505. if (i < len)
  67506. 803511a: 45d9 cmp r9, fp
  67507. 803511c: d275 bcs.n 803520a <snmp_expand_tree+0x30e>
  67508. {
  67509. /* add identifier to oidret */
  67510. en->get_objid(en->addr_inf,ext_level,i,&ex_id);
  67511. 803511e: 4651 mov r1, sl
  67512. 8035120: 464a mov r2, r9
  67513. 8035122: ab06 add r3, sp, #24
  67514. 8035124: 6a67 ldr r7, [r4, #36] ; 0x24
  67515. 8035126: 6960 ldr r0, [r4, #20]
  67516. 8035128: 47b8 blx r7
  67517. LWIP_DEBUGF(SNMP_MIB_DEBUG,("en->objid[%"U16_F"]==%"S32_F" *ident==%"S32_F"\n",i,ex_id,*ident));
  67518. oidret->id[oidret->len] = ex_id;
  67519. 803512a: 782b ldrb r3, [r5, #0]
  67520. 803512c: 9a06 ldr r2, [sp, #24]
  67521. 803512e: eb05 0183 add.w r1, r5, r3, lsl #2
  67522. (oidret->len)++;
  67523. if ((ext_level + 1) == en->tree_levels)
  67524. 8035132: f10a 0c01 add.w ip, sl, #1
  67525. if (i < len)
  67526. {
  67527. /* add identifier to oidret */
  67528. en->get_objid(en->addr_inf,ext_level,i,&ex_id);
  67529. LWIP_DEBUGF(SNMP_MIB_DEBUG,("en->objid[%"U16_F"]==%"S32_F" *ident==%"S32_F"\n",i,ex_id,*ident));
  67530. oidret->id[oidret->len] = ex_id;
  67531. 8035136: 604a str r2, [r1, #4]
  67532. (oidret->len)++;
  67533. 8035138: 1c59 adds r1, r3, #1
  67534. 803513a: 7029 strb r1, [r5, #0]
  67535. if ((ext_level + 1) == en->tree_levels)
  67536. 803513c: 7e21 ldrb r1, [r4, #24]
  67537. 803513e: 458c cmp ip, r1
  67538. 8035140: d118 bne.n 8035174 <snmp_expand_tree+0x278>
  67539. {
  67540. LWIP_DEBUGF(SNMP_MIB_DEBUG,("leaf node\n"));
  67541. /* leaf node */
  67542. if (ex_id > *ident)
  67543. 8035142: f8d8 1000 ldr.w r1, [r8]
  67544. 8035146: 428a cmp r2, r1
  67545. 8035148: f300 8088 bgt.w 803525c <snmp_expand_tree+0x360>
  67546. {
  67547. return (struct mib_node*)en;
  67548. }
  67549. else if ((i + 1) < len)
  67550. 803514c: f109 0201 add.w r2, r9, #1
  67551. 8035150: 455a cmp r2, fp
  67552. 8035152: da0d bge.n 8035170 <snmp_expand_tree+0x274>
  67553. {
  67554. /* ex_id == *ident */
  67555. en->get_objid(en->addr_inf,ext_level,i + 1,&ex_id);
  67556. 8035154: ab06 add r3, sp, #24
  67557. 8035156: 6a66 ldr r6, [r4, #36] ; 0x24
  67558. 8035158: 6960 ldr r0, [r4, #20]
  67559. 803515a: 4651 mov r1, sl
  67560. 803515c: b292 uxth r2, r2
  67561. 803515e: 47b0 blx r6
  67562. (oidret->len)--;
  67563. 8035160: 782b ldrb r3, [r5, #0]
  67564. 8035162: 3b01 subs r3, #1
  67565. oidret->id[oidret->len] = ex_id;
  67566. 8035164: b2db uxtb r3, r3
  67567. 8035166: eb05 0583 add.w r5, r5, r3, lsl #2
  67568. 803516a: 9b06 ldr r3, [sp, #24]
  67569. 803516c: 606b str r3, [r5, #4]
  67570. 803516e: e075 b.n 803525c <snmp_expand_tree+0x360>
  67571. return (struct mib_node*)en;
  67572. }
  67573. else
  67574. {
  67575. /* (i + 1) == len */
  67576. (oidret->len)--;
  67577. 8035170: 702b strb r3, [r5, #0]
  67578. 8035172: e04a b.n 803520a <snmp_expand_tree+0x30e>
  67579. struct nse cur_node;
  67580. LWIP_DEBUGF(SNMP_MIB_DEBUG,("non-leaf node\n"));
  67581. /* non-leaf, store right child ptr and id */
  67582. LWIP_ASSERT("i < 0xff", i < 0xff);
  67583. j = (u8_t)i + 1;
  67584. 8035174: f109 0201 add.w r2, r9, #1
  67585. if (j < len)
  67586. 8035178: b2d2 uxtb r2, r2
  67587. 803517a: 455a cmp r2, fp
  67588. 803517c: d20e bcs.n 803519c <snmp_expand_tree+0x2a0>
  67589. {
  67590. /* right node is the current external node */
  67591. cur_node.r_ptr = node;
  67592. 803517e: 9407 str r4, [sp, #28]
  67593. en->get_objid(en->addr_inf,ext_level,j,&cur_node.r_id);
  67594. 8035180: 6960 ldr r0, [r4, #20]
  67595. 8035182: 9b05 ldr r3, [sp, #20]
  67596. 8035184: f8cd c004 str.w ip, [sp, #4]
  67597. 8035188: 4651 mov r1, sl
  67598. 803518a: 6a67 ldr r7, [r4, #36] ; 0x24
  67599. 803518c: 47b8 blx r7
  67600. cur_node.r_nl = ext_level + 1;
  67601. 803518e: f8dd c004 ldr.w ip, [sp, #4]
  67602. 8035192: f88d c024 strb.w ip, [sp, #36] ; 0x24
  67603. 8035196: e003 b.n 80351a0 <snmp_expand_tree+0x2a4>
  67604. 8035198: 2000c5cc .word 0x2000c5cc
  67605. }
  67606. else
  67607. {
  67608. cur_node.r_ptr = NULL;
  67609. 803519c: 2300 movs r3, #0
  67610. 803519e: 9307 str r3, [sp, #28]
  67611. }
  67612. push_node(&cur_node);
  67613. 80351a0: a807 add r0, sp, #28
  67614. 80351a2: f7ff fd19 bl 8034bd8 <push_node>
  67615. if (en->ident_cmp(en->addr_inf,ext_level,i,*ident) == 0)
  67616. 80351a6: 6a27 ldr r7, [r4, #32]
  67617. 80351a8: 6960 ldr r0, [r4, #20]
  67618. 80351aa: f8d8 3000 ldr.w r3, [r8]
  67619. 80351ae: 4651 mov r1, sl
  67620. 80351b0: 464a mov r2, r9
  67621. 80351b2: 47b8 blx r7
  67622. 80351b4: b920 cbnz r0, 80351c0 <snmp_expand_tree+0x2c4>
  67623. {
  67624. ident_len--;
  67625. 80351b6: 3e01 subs r6, #1
  67626. 80351b8: b2f6 uxtb r6, r6
  67627. ident++;
  67628. 80351ba: f108 0804 add.w r8, r8, #4
  67629. 80351be: e000 b.n 80351c2 <snmp_expand_tree+0x2c6>
  67630. }
  67631. else
  67632. {
  67633. /* external id < *ident */
  67634. ident_len = 0;
  67635. 80351c0: 2600 movs r6, #0
  67636. }
  67637. /* proceed to child */
  67638. ext_level++;
  67639. 80351c2: f10a 0a01 add.w sl, sl, #1
  67640. 80351c6: e011 b.n 80351ec <snmp_expand_tree+0x2f0>
  67641. }
  67642. }
  67643. else
  67644. {
  67645. /* ident_len == 0, complete with leftmost '.thing' */
  67646. en->get_objid(en->addr_inf,ext_level,0,&ex_id);
  67647. 80351c8: 4651 mov r1, sl
  67648. 80351ca: 4632 mov r2, r6
  67649. 80351cc: ab06 add r3, sp, #24
  67650. 80351ce: 6a67 ldr r7, [r4, #36] ; 0x24
  67651. 80351d0: 6960 ldr r0, [r4, #20]
  67652. 80351d2: 47b8 blx r7
  67653. LWIP_DEBUGF(SNMP_MIB_DEBUG,("left en->objid==%"S32_F"\n",ex_id));
  67654. oidret->id[oidret->len] = ex_id;
  67655. 80351d4: 782b ldrb r3, [r5, #0]
  67656. 80351d6: 9a06 ldr r2, [sp, #24]
  67657. 80351d8: eb05 0183 add.w r1, r5, r3, lsl #2
  67658. (oidret->len)++;
  67659. 80351dc: 3301 adds r3, #1
  67660. else
  67661. {
  67662. /* ident_len == 0, complete with leftmost '.thing' */
  67663. en->get_objid(en->addr_inf,ext_level,0,&ex_id);
  67664. LWIP_DEBUGF(SNMP_MIB_DEBUG,("left en->objid==%"S32_F"\n",ex_id));
  67665. oidret->id[oidret->len] = ex_id;
  67666. 80351de: 604a str r2, [r1, #4]
  67667. (oidret->len)++;
  67668. 80351e0: 702b strb r3, [r5, #0]
  67669. if ((ext_level + 1) == en->tree_levels)
  67670. 80351e2: 7e23 ldrb r3, [r4, #24]
  67671. 80351e4: f10a 0a01 add.w sl, sl, #1
  67672. 80351e8: 459a cmp sl, r3
  67673. 80351ea: d037 beq.n 803525c <snmp_expand_tree+0x360>
  67674. return (struct mib_node*)en;
  67675. }
  67676. else
  67677. {
  67678. /* no leaf, proceed to child */
  67679. ext_level++;
  67680. 80351ec: fa5f fa8a uxtb.w sl, sl
  67681. 80351f0: e030 b.n 8035254 <snmp_expand_tree+0x358>
  67682. }
  67683. }
  67684. }
  67685. else if(node_type == MIB_NODE_SC)
  67686. 80351f2: 2b01 cmp r3, #1
  67687. 80351f4: d001 beq.n 80351fa <snmp_expand_tree+0x2fe>
  67688. }
  67689. else
  67690. {
  67691. /* unknown/unhandled node_type */
  67692. LWIP_DEBUGF(SNMP_MIB_DEBUG,("expand failed node_type %"U16_F" unkown\n",(u16_t)node_type));
  67693. return NULL;
  67694. 80351f6: 2000 movs r0, #0
  67695. 80351f8: e047 b.n 803528a <snmp_expand_tree+0x38e>
  67696. {
  67697. mib_scalar_node *sn;
  67698. /* scalar node */
  67699. sn = (mib_scalar_node *)node;
  67700. if (ident_len > 0)
  67701. 80351fa: b936 cbnz r6, 803520a <snmp_expand_tree+0x30e>
  67702. climb_tree = 1;
  67703. }
  67704. else
  67705. {
  67706. /* ident_len == 0, complete object identifier */
  67707. oidret->id[oidret->len] = 0;
  67708. 80351fc: 782b ldrb r3, [r5, #0]
  67709. 80351fe: eb05 0283 add.w r2, r5, r3, lsl #2
  67710. (oidret->len)++;
  67711. 8035202: 3301 adds r3, #1
  67712. climb_tree = 1;
  67713. }
  67714. else
  67715. {
  67716. /* ident_len == 0, complete object identifier */
  67717. oidret->id[oidret->len] = 0;
  67718. 8035204: 6056 str r6, [r2, #4]
  67719. (oidret->len)++;
  67720. 8035206: 702b strb r3, [r5, #0]
  67721. 8035208: e028 b.n 803525c <snmp_expand_tree+0x360>
  67722. 803520a: 4921 ldr r1, [pc, #132] ; (8035290 <snmp_expand_tree+0x394>)
  67723. struct nse child;
  67724. /* find right child ptr */
  67725. child.r_ptr = NULL;
  67726. child.r_id = 0;
  67727. child.r_nl = 0;
  67728. 803520c: f04f 0a00 mov.w sl, #0
  67729. 8035210: 780b ldrb r3, [r1, #0]
  67730. pop_node(struct nse* node)
  67731. {
  67732. if (node_stack_cnt > 0)
  67733. {
  67734. node_stack_cnt--;
  67735. *node = node_stack[node_stack_cnt];
  67736. 8035212: 4920 ldr r1, [pc, #128] ; (8035294 <snmp_expand_tree+0x398>)
  67737. {
  67738. struct nse child;
  67739. /* find right child ptr */
  67740. child.r_ptr = NULL;
  67741. child.r_id = 0;
  67742. 8035214: 4652 mov r2, sl
  67743. if (climb_tree)
  67744. {
  67745. struct nse child;
  67746. /* find right child ptr */
  67747. child.r_ptr = NULL;
  67748. 8035216: 4654 mov r4, sl
  67749. pop_node(struct nse* node)
  67750. {
  67751. if (node_stack_cnt > 0)
  67752. {
  67753. node_stack_cnt--;
  67754. *node = node_stack[node_stack_cnt];
  67755. 8035218: 260c movs r6, #12
  67756. /* find right child ptr */
  67757. child.r_ptr = NULL;
  67758. child.r_id = 0;
  67759. child.r_nl = 0;
  67760. while ((node_stack_cnt > 0) && (child.r_ptr == NULL))
  67761. 803521a: e00b b.n 8035234 <snmp_expand_tree+0x338>
  67762. static void
  67763. pop_node(struct nse* node)
  67764. {
  67765. if (node_stack_cnt > 0)
  67766. {
  67767. node_stack_cnt--;
  67768. 803521c: 3b01 subs r3, #1
  67769. 803521e: b2db uxtb r3, r3
  67770. *node = node_stack[node_stack_cnt];
  67771. 8035220: fb06 f203 mul.w r2, r6, r3
  67772. 8035224: 1888 adds r0, r1, r2
  67773. 8035226: 588c ldr r4, [r1, r2]
  67774. 8035228: f890 a008 ldrb.w sl, [r0, #8]
  67775. 803522c: 6842 ldr r2, [r0, #4]
  67776. child.r_nl = 0;
  67777. while ((node_stack_cnt > 0) && (child.r_ptr == NULL))
  67778. {
  67779. pop_node(&child);
  67780. /* trim returned oid */
  67781. (oidret->len)--;
  67782. 803522e: 7828 ldrb r0, [r5, #0]
  67783. 8035230: 3801 subs r0, #1
  67784. 8035232: 7028 strb r0, [r5, #0]
  67785. /* find right child ptr */
  67786. child.r_ptr = NULL;
  67787. child.r_id = 0;
  67788. child.r_nl = 0;
  67789. while ((node_stack_cnt > 0) && (child.r_ptr == NULL))
  67790. 8035234: b91b cbnz r3, 803523e <snmp_expand_tree+0x342>
  67791. 8035236: 4f16 ldr r7, [pc, #88] ; (8035290 <snmp_expand_tree+0x394>)
  67792. 8035238: 703b strb r3, [r7, #0]
  67793. {
  67794. pop_node(&child);
  67795. /* trim returned oid */
  67796. (oidret->len)--;
  67797. }
  67798. if (child.r_ptr != NULL)
  67799. 803523a: b924 cbnz r4, 8035246 <snmp_expand_tree+0x34a>
  67800. 803523c: e7db b.n 80351f6 <snmp_expand_tree+0x2fa>
  67801. /* find right child ptr */
  67802. child.r_ptr = NULL;
  67803. child.r_id = 0;
  67804. child.r_nl = 0;
  67805. while ((node_stack_cnt > 0) && (child.r_ptr == NULL))
  67806. 803523e: 2c00 cmp r4, #0
  67807. 8035240: d0ec beq.n 803521c <snmp_expand_tree+0x320>
  67808. 8035242: 4913 ldr r1, [pc, #76] ; (8035290 <snmp_expand_tree+0x394>)
  67809. 8035244: 700b strb r3, [r1, #0]
  67810. }
  67811. if (child.r_ptr != NULL)
  67812. {
  67813. /* incoming ident is useless beyond this point */
  67814. ident_len = 0;
  67815. oidret->id[oidret->len] = child.r_id;
  67816. 8035246: 782b ldrb r3, [r5, #0]
  67817. 8035248: eb05 0183 add.w r1, r5, r3, lsl #2
  67818. oidret->len++;
  67819. 803524c: 3301 adds r3, #1
  67820. }
  67821. if (child.r_ptr != NULL)
  67822. {
  67823. /* incoming ident is useless beyond this point */
  67824. ident_len = 0;
  67825. oidret->id[oidret->len] = child.r_id;
  67826. 803524e: 604a str r2, [r1, #4]
  67827. oidret->len++;
  67828. 8035250: 702b strb r3, [r5, #0]
  67829. (oidret->len)--;
  67830. }
  67831. if (child.r_ptr != NULL)
  67832. {
  67833. /* incoming ident is useless beyond this point */
  67834. ident_len = 0;
  67835. 8035252: 2600 movs r6, #0
  67836. u8_t node_type, ext_level, climb_tree;
  67837. ext_level = 0;
  67838. /* reset node stack */
  67839. node_stack_cnt = 0;
  67840. while (node != NULL)
  67841. 8035254: 2c00 cmp r4, #0
  67842. 8035256: f47f ae60 bne.w 8034f1a <snmp_expand_tree+0x1e>
  67843. 803525a: e7cc b.n 80351f6 <snmp_expand_tree+0x2fa>
  67844. if (jn != NULL)
  67845. {
  67846. LWIP_DEBUGF(SNMP_MIB_DEBUG,("left jn->objid==%"S32_F"\n",jn->objid));
  67847. oidret->id[oidret->len] = jn->objid;
  67848. (oidret->len)++;
  67849. if (jn->nptr == NULL)
  67850. 803525c: 4620 mov r0, r4
  67851. 803525e: e014 b.n 803528a <snmp_expand_tree+0x38e>
  67852. jn = jn->next;
  67853. }
  67854. if (jn != NULL)
  67855. {
  67856. cur_node.r_ptr = jn->nptr;
  67857. cur_node.r_id = jn->objid;
  67858. 8035260: 68a3 ldr r3, [r4, #8]
  67859. {
  67860. jn = jn->next;
  67861. }
  67862. if (jn != NULL)
  67863. {
  67864. cur_node.r_ptr = jn->nptr;
  67865. 8035262: f8cd 901c str.w r9, [sp, #28]
  67866. cur_node.r_id = jn->objid;
  67867. 8035266: 9308 str r3, [sp, #32]
  67868. cur_node.r_nl = 0;
  67869. 8035268: f88d 0024 strb.w r0, [sp, #36] ; 0x24
  67870. 803526c: e71e b.n 80350ac <snmp_expand_tree+0x1b0>
  67871. }
  67872. else
  67873. {
  67874. cur_node.r_ptr = NULL;
  67875. 803526e: 9407 str r4, [sp, #28]
  67876. 8035270: e71c b.n 80350ac <snmp_expand_tree+0x1b0>
  67877. jn = jn->next;
  67878. }
  67879. if (jn != NULL)
  67880. {
  67881. LWIP_DEBUGF(SNMP_MIB_DEBUG,("left jn->objid==%"S32_F"\n",jn->objid));
  67882. oidret->id[oidret->len] = jn->objid;
  67883. 8035272: 782b ldrb r3, [r5, #0]
  67884. 8035274: 68ba ldr r2, [r7, #8]
  67885. 8035276: eb05 0183 add.w r1, r5, r3, lsl #2
  67886. (oidret->len)++;
  67887. 803527a: 3301 adds r3, #1
  67888. 803527c: 702b strb r3, [r5, #0]
  67889. if (jn->nptr == NULL)
  67890. 803527e: 68fb ldr r3, [r7, #12]
  67891. jn = jn->next;
  67892. }
  67893. if (jn != NULL)
  67894. {
  67895. LWIP_DEBUGF(SNMP_MIB_DEBUG,("left jn->objid==%"S32_F"\n",jn->objid));
  67896. oidret->id[oidret->len] = jn->objid;
  67897. 8035280: 604a str r2, [r1, #4]
  67898. (oidret->len)++;
  67899. if (jn->nptr == NULL)
  67900. 8035282: 2b00 cmp r3, #0
  67901. 8035284: d0ea beq.n 803525c <snmp_expand_tree+0x360>
  67902. (oidret->len)--;
  67903. }
  67904. if (child.r_ptr != NULL)
  67905. {
  67906. /* incoming ident is useless beyond this point */
  67907. ident_len = 0;
  67908. 8035286: 461c mov r4, r3
  67909. 8035288: e7e4 b.n 8035254 <snmp_expand_tree+0x358>
  67910. }
  67911. }
  67912. /* done, found nothing */
  67913. LWIP_DEBUGF(SNMP_MIB_DEBUG,("expand failed node==%p\n",(void*)node));
  67914. return NULL;
  67915. }
  67916. 803528a: b00b add sp, #44 ; 0x2c
  67917. 803528c: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  67918. 8035290: 2000c5cc .word 0x2000c5cc
  67919. 8035294: 2000c5d0 .word 0x2000c5d0
  67920. 08035298 <snmp_iso_prefix_tst>:
  67921. * @return 1 if it matches, 0 otherwise
  67922. */
  67923. u8_t
  67924. snmp_iso_prefix_tst(u8_t ident_len, s32_t *ident)
  67925. {
  67926. if ((ident_len > 3) &&
  67927. 8035298: 2803 cmp r0, #3
  67928. 803529a: d90d bls.n 80352b8 <snmp_iso_prefix_tst+0x20>
  67929. 803529c: 680b ldr r3, [r1, #0]
  67930. 803529e: 2b01 cmp r3, #1
  67931. 80352a0: d10a bne.n 80352b8 <snmp_iso_prefix_tst+0x20>
  67932. (ident[0] == 1) && (ident[1] == 3) &&
  67933. 80352a2: 684b ldr r3, [r1, #4]
  67934. 80352a4: 2b03 cmp r3, #3
  67935. 80352a6: d107 bne.n 80352b8 <snmp_iso_prefix_tst+0x20>
  67936. 80352a8: 688b ldr r3, [r1, #8]
  67937. 80352aa: 2b06 cmp r3, #6
  67938. 80352ac: d104 bne.n 80352b8 <snmp_iso_prefix_tst+0x20>
  67939. (ident[2] == 6) && (ident[3] == 1))
  67940. 80352ae: 68c8 ldr r0, [r1, #12]
  67941. {
  67942. return 1;
  67943. 80352b0: 1e43 subs r3, r0, #1
  67944. 80352b2: 4258 negs r0, r3
  67945. 80352b4: 4158 adcs r0, r3
  67946. 80352b6: 4770 bx lr
  67947. }
  67948. else
  67949. {
  67950. return 0;
  67951. 80352b8: 2000 movs r0, #0
  67952. }
  67953. }
  67954. 80352ba: 4770 bx lr
  67955. 080352bc <snmp_iso_prefix_expand>:
  67956. i = 0;
  67957. prefix_ptr = &prefix[0];
  67958. ret_ptr = &oidret->id[0];
  67959. ident_len = ((ident_len < 4)?ident_len:4);
  67960. while ((i < ident_len) && ((*ident) <= (*prefix_ptr)))
  67961. 80352bc: 2300 movs r3, #0
  67962. *
  67963. * @note ident_len 0 is allowed, expanding to the first known object id!!
  67964. */
  67965. u8_t
  67966. snmp_iso_prefix_expand(u8_t ident_len, s32_t *ident, struct snmp_obj_id *oidret)
  67967. {
  67968. 80352be: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  67969. s32_t *ret_ptr;
  67970. u8_t i;
  67971. i = 0;
  67972. prefix_ptr = &prefix[0];
  67973. ret_ptr = &oidret->id[0];
  67974. 80352c2: 1d15 adds r5, r2, #4
  67975. ident_len = ((ident_len < 4)?ident_len:4);
  67976. 80352c4: 2804 cmp r0, #4
  67977. 80352c6: bf34 ite cc
  67978. 80352c8: 4680 movcc r8, r0
  67979. 80352ca: f04f 0804 movcs.w r8, #4
  67980. {
  67981. const s32_t *prefix_ptr;
  67982. s32_t *ret_ptr;
  67983. u8_t i;
  67984. i = 0;
  67985. 80352ce: 461c mov r4, r3
  67986. * @return 1 if it matches, 0 otherwise
  67987. *
  67988. * @note ident_len 0 is allowed, expanding to the first known object id!!
  67989. */
  67990. u8_t
  67991. snmp_iso_prefix_expand(u8_t ident_len, s32_t *ident, struct snmp_obj_id *oidret)
  67992. 80352d0: 4f10 ldr r7, [pc, #64] ; (8035314 <snmp_iso_prefix_expand+0x58>)
  67993. i = 0;
  67994. prefix_ptr = &prefix[0];
  67995. ret_ptr = &oidret->id[0];
  67996. ident_len = ((ident_len < 4)?ident_len:4);
  67997. while ((i < ident_len) && ((*ident) <= (*prefix_ptr)))
  67998. 80352d2: e003 b.n 80352dc <snmp_iso_prefix_expand+0x20>
  67999. {
  68000. *ret_ptr++ = *prefix_ptr++;
  68001. ident++;
  68002. i++;
  68003. 80352d4: 3401 adds r4, #1
  68004. prefix_ptr = &prefix[0];
  68005. ret_ptr = &oidret->id[0];
  68006. ident_len = ((ident_len < 4)?ident_len:4);
  68007. while ((i < ident_len) && ((*ident) <= (*prefix_ptr)))
  68008. {
  68009. *ret_ptr++ = *prefix_ptr++;
  68010. 80352d6: 50ee str r6, [r5, r3]
  68011. ident++;
  68012. i++;
  68013. 80352d8: b2e4 uxtb r4, r4
  68014. 80352da: 3304 adds r3, #4
  68015. i = 0;
  68016. prefix_ptr = &prefix[0];
  68017. ret_ptr = &oidret->id[0];
  68018. ident_len = ((ident_len < 4)?ident_len:4);
  68019. while ((i < ident_len) && ((*ident) <= (*prefix_ptr)))
  68020. 80352dc: 4544 cmp r4, r8
  68021. * @return 1 if it matches, 0 otherwise
  68022. *
  68023. * @note ident_len 0 is allowed, expanding to the first known object id!!
  68024. */
  68025. u8_t
  68026. snmp_iso_prefix_expand(u8_t ident_len, s32_t *ident, struct snmp_obj_id *oidret)
  68027. 80352de: eb05 0c03 add.w ip, r5, r3
  68028. 80352e2: eb07 0603 add.w r6, r7, r3
  68029. i = 0;
  68030. prefix_ptr = &prefix[0];
  68031. ret_ptr = &oidret->id[0];
  68032. ident_len = ((ident_len < 4)?ident_len:4);
  68033. while ((i < ident_len) && ((*ident) <= (*prefix_ptr)))
  68034. 80352e6: d101 bne.n 80352ec <snmp_iso_prefix_expand+0x30>
  68035. 80352e8: 2300 movs r3, #0
  68036. 80352ea: e00c b.n 8035306 <snmp_iso_prefix_expand+0x4a>
  68037. 80352ec: 59de ldr r6, [r3, r7]
  68038. 80352ee: 58c8 ldr r0, [r1, r3]
  68039. 80352f0: 42b0 cmp r0, r6
  68040. 80352f2: ddef ble.n 80352d4 <snmp_iso_prefix_expand+0x18>
  68041. return 1;
  68042. }
  68043. else
  68044. {
  68045. /* i != ident_len */
  68046. return 0;
  68047. 80352f4: 2000 movs r0, #0
  68048. 80352f6: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  68049. if (i == ident_len)
  68050. {
  68051. /* match, complete missing bits */
  68052. while (i < 4)
  68053. {
  68054. *ret_ptr++ = *prefix_ptr++;
  68055. 80352fa: 58f1 ldr r1, [r6, r3]
  68056. i++;
  68057. 80352fc: 3401 adds r4, #1
  68058. if (i == ident_len)
  68059. {
  68060. /* match, complete missing bits */
  68061. while (i < 4)
  68062. {
  68063. *ret_ptr++ = *prefix_ptr++;
  68064. 80352fe: f84c 1003 str.w r1, [ip, r3]
  68065. i++;
  68066. 8035302: b2e4 uxtb r4, r4
  68067. 8035304: 3304 adds r3, #4
  68068. i++;
  68069. }
  68070. if (i == ident_len)
  68071. {
  68072. /* match, complete missing bits */
  68073. while (i < 4)
  68074. 8035306: 2c03 cmp r4, #3
  68075. 8035308: d9f7 bls.n 80352fa <snmp_iso_prefix_expand+0x3e>
  68076. {
  68077. *ret_ptr++ = *prefix_ptr++;
  68078. i++;
  68079. }
  68080. oidret->len = i;
  68081. 803530a: 7014 strb r4, [r2, #0]
  68082. return 1;
  68083. 803530c: 2001 movs r0, #1
  68084. else
  68085. {
  68086. /* i != ident_len */
  68087. return 0;
  68088. }
  68089. }
  68090. 803530e: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  68091. 8035312: bf00 nop
  68092. 8035314: 08045058 .word 0x08045058
  68093. 08035318 <snmp_init>:
  68094. * Starts SNMP Agent.
  68095. * Allocates UDP pcb and binds it to IP_ADDR_ANY port 161.
  68096. */
  68097. void
  68098. snmp_init(void)
  68099. {
  68100. 8035318: b510 push {r4, lr}
  68101. struct snmp_msg_pstat *msg_ps;
  68102. u8_t i;
  68103. snmp1_pcb = udp_new();
  68104. 803531a: f7fd fa1d bl 8032758 <udp_new>
  68105. 803531e: 4c0b ldr r4, [pc, #44] ; (803534c <snmp_init+0x34>)
  68106. 8035320: 6020 str r0, [r4, #0]
  68107. if (snmp1_pcb != NULL)
  68108. 8035322: b140 cbz r0, 8035336 <snmp_init+0x1e>
  68109. {
  68110. udp_recv(snmp1_pcb, snmp_recv, (void *)SNMP_IN_PORT);
  68111. 8035324: 490a ldr r1, [pc, #40] ; (8035350 <snmp_init+0x38>)
  68112. 8035326: 22a1 movs r2, #161 ; 0xa1
  68113. 8035328: f7fd f9f6 bl 8032718 <udp_recv>
  68114. udp_bind(snmp1_pcb, IP_ADDR_ANY, SNMP_IN_PORT);
  68115. 803532c: 6820 ldr r0, [r4, #0]
  68116. 803532e: 4909 ldr r1, [pc, #36] ; (8035354 <snmp_init+0x3c>)
  68117. 8035330: 22a1 movs r2, #161 ; 0xa1
  68118. 8035332: f7fd f8f9 bl 8032528 <udp_bind>
  68119. }
  68120. msg_ps = &msg_input_list[0];
  68121. for (i=0; i<SNMP_CONCURRENT_REQUESTS; i++)
  68122. {
  68123. msg_ps->state = SNMP_MSG_EMPTY;
  68124. 8035336: 4b08 ldr r3, [pc, #32] ; (8035358 <snmp_init+0x40>)
  68125. 8035338: 2200 movs r2, #0
  68126. 803533a: f883 205a strb.w r2, [r3, #90] ; 0x5a
  68127. msg_ps->error_index = 0;
  68128. 803533e: 615a str r2, [r3, #20]
  68129. msg_ps->error_status = SNMP_ES_NOERROR;
  68130. 8035340: 611a str r2, [r3, #16]
  68131. msg_ps++;
  68132. }
  68133. trap_msg.pcb = snmp1_pcb;
  68134. 8035342: 4b02 ldr r3, [pc, #8] ; (803534c <snmp_init+0x34>)
  68135. 8035344: 681a ldr r2, [r3, #0]
  68136. 8035346: 4b05 ldr r3, [pc, #20] ; (803535c <snmp_init+0x44>)
  68137. 8035348: 601a str r2, [r3, #0]
  68138. 803534a: bd10 pop {r4, pc}
  68139. 803534c: 2000ff50 .word 0x2000ff50
  68140. 8035350: 08035ec5 .word 0x08035ec5
  68141. 8035354: 08044744 .word 0x08044744
  68142. 8035358: 2000ff54 .word 0x2000ff54
  68143. 803535c: 2001008c .word 0x2001008c
  68144. 08035360 <snmp_varbind_alloc>:
  68145. return ERR_OK;
  68146. }
  68147. struct snmp_varbind*
  68148. snmp_varbind_alloc(struct snmp_obj_id *oid, u8_t type, u8_t len)
  68149. {
  68150. 8035360: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr}
  68151. 8035364: 4680 mov r8, r0
  68152. struct snmp_varbind *vb;
  68153. vb = (struct snmp_varbind *)memp_malloc(MEMP_SNMP_VARBIND);
  68154. 8035366: 200c movs r0, #12
  68155. return ERR_OK;
  68156. }
  68157. struct snmp_varbind*
  68158. snmp_varbind_alloc(struct snmp_obj_id *oid, u8_t type, u8_t len)
  68159. {
  68160. 8035368: 4689 mov r9, r1
  68161. 803536a: 4617 mov r7, r2
  68162. struct snmp_varbind *vb;
  68163. vb = (struct snmp_varbind *)memp_malloc(MEMP_SNMP_VARBIND);
  68164. 803536c: f7fa fb6c bl 802fa48 <memp_malloc>
  68165. if (vb != NULL)
  68166. 8035370: 4604 mov r4, r0
  68167. 8035372: 2800 cmp r0, #0
  68168. 8035374: d032 beq.n 80353dc <snmp_varbind_alloc+0x7c>
  68169. {
  68170. u8_t i;
  68171. vb->next = NULL;
  68172. 8035376: 2300 movs r3, #0
  68173. 8035378: 6003 str r3, [r0, #0]
  68174. vb->prev = NULL;
  68175. 803537a: 6043 str r3, [r0, #4]
  68176. i = oid->len;
  68177. 803537c: f898 5000 ldrb.w r5, [r8]
  68178. vb->ident_len = i;
  68179. 8035380: 7205 strb r5, [r0, #8]
  68180. if (i > 0)
  68181. 8035382: b1ad cbz r5, 80353b0 <snmp_varbind_alloc+0x50>
  68182. {
  68183. LWIP_ASSERT("SNMP_MAX_TREE_DEPTH is configured too low", i <= SNMP_MAX_TREE_DEPTH);
  68184. /* allocate array of s32_t for our object identifier */
  68185. vb->ident = (s32_t*)memp_malloc(MEMP_SNMP_VALUE);
  68186. 8035384: 200d movs r0, #13
  68187. 8035386: f7fa fb5f bl 802fa48 <memp_malloc>
  68188. 803538a: 4606 mov r6, r0
  68189. 803538c: 60e0 str r0, [r4, #12]
  68190. if (vb->ident == NULL)
  68191. 803538e: b928 cbnz r0, 803539c <snmp_varbind_alloc+0x3c>
  68192. {
  68193. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_varbind_alloc: couldn't allocate ident value space\n"));
  68194. memp_free(MEMP_SNMP_VARBIND, vb);
  68195. 8035390: 4621 mov r1, r4
  68196. 8035392: 200c movs r0, #12
  68197. 8035394: f7fa fb6e bl 802fa74 <memp_free>
  68198. return NULL;
  68199. 8035398: 4634 mov r4, r6
  68200. 803539a: e01f b.n 80353dc <snmp_varbind_alloc+0x7c>
  68201. }
  68202. while(i > 0)
  68203. {
  68204. i--;
  68205. 803539c: 3d01 subs r5, #1
  68206. 803539e: b2ed uxtb r5, r5
  68207. vb->ident[i] = oid->id[i];
  68208. 80353a0: eb08 0385 add.w r3, r8, r5, lsl #2
  68209. 80353a4: 685b ldr r3, [r3, #4]
  68210. 80353a6: f846 3025 str.w r3, [r6, r5, lsl #2]
  68211. {
  68212. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_varbind_alloc: couldn't allocate ident value space\n"));
  68213. memp_free(MEMP_SNMP_VARBIND, vb);
  68214. return NULL;
  68215. }
  68216. while(i > 0)
  68217. 80353aa: 2d00 cmp r5, #0
  68218. 80353ac: d1f6 bne.n 803539c <snmp_varbind_alloc+0x3c>
  68219. 80353ae: e000 b.n 80353b2 <snmp_varbind_alloc+0x52>
  68220. }
  68221. }
  68222. else
  68223. {
  68224. /* i == 0, pass zero length object identifier */
  68225. vb->ident = NULL;
  68226. 80353b0: 60c5 str r5, [r0, #12]
  68227. }
  68228. vb->value_type = type;
  68229. 80353b2: f884 9010 strb.w r9, [r4, #16]
  68230. vb->value_len = len;
  68231. 80353b6: 7467 strb r7, [r4, #17]
  68232. if (len > 0)
  68233. 80353b8: b17f cbz r7, 80353da <snmp_varbind_alloc+0x7a>
  68234. {
  68235. LWIP_ASSERT("SNMP_MAX_OCTET_STRING_LEN is configured too low", vb->value_len <= SNMP_MAX_VALUE_SIZE);
  68236. /* allocate raw bytes for our object value */
  68237. vb->value = memp_malloc(MEMP_SNMP_VALUE);
  68238. 80353ba: 200d movs r0, #13
  68239. 80353bc: f7fa fb44 bl 802fa48 <memp_malloc>
  68240. 80353c0: 6160 str r0, [r4, #20]
  68241. if (vb->value == NULL)
  68242. 80353c2: b958 cbnz r0, 80353dc <snmp_varbind_alloc+0x7c>
  68243. {
  68244. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_varbind_alloc: couldn't allocate value space\n"));
  68245. if (vb->ident != NULL)
  68246. 80353c4: 68e1 ldr r1, [r4, #12]
  68247. 80353c6: b111 cbz r1, 80353ce <snmp_varbind_alloc+0x6e>
  68248. {
  68249. memp_free(MEMP_SNMP_VALUE, vb->ident);
  68250. 80353c8: 200d movs r0, #13
  68251. 80353ca: f7fa fb53 bl 802fa74 <memp_free>
  68252. }
  68253. memp_free(MEMP_SNMP_VARBIND, vb);
  68254. 80353ce: 4621 mov r1, r4
  68255. 80353d0: 200c movs r0, #12
  68256. 80353d2: f7fa fb4f bl 802fa74 <memp_free>
  68257. return NULL;
  68258. 80353d6: 2400 movs r4, #0
  68259. 80353d8: e000 b.n 80353dc <snmp_varbind_alloc+0x7c>
  68260. }
  68261. }
  68262. else
  68263. {
  68264. /* ASN1_NUL type, or zero length ASN1_OC_STR */
  68265. vb->value = NULL;
  68266. 80353da: 6167 str r7, [r4, #20]
  68267. else
  68268. {
  68269. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_varbind_alloc: couldn't allocate varbind space\n"));
  68270. }
  68271. return vb;
  68272. }
  68273. 80353dc: 4620 mov r0, r4
  68274. 80353de: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc}
  68275. 080353e2 <snmp_varbind_free>:
  68276. void
  68277. snmp_varbind_free(struct snmp_varbind *vb)
  68278. {
  68279. if (vb->value != NULL )
  68280. 80353e2: 6941 ldr r1, [r0, #20]
  68281. return vb;
  68282. }
  68283. void
  68284. snmp_varbind_free(struct snmp_varbind *vb)
  68285. {
  68286. 80353e4: b510 push {r4, lr}
  68287. 80353e6: 4604 mov r4, r0
  68288. if (vb->value != NULL )
  68289. 80353e8: b111 cbz r1, 80353f0 <snmp_varbind_free+0xe>
  68290. {
  68291. memp_free(MEMP_SNMP_VALUE, vb->value);
  68292. 80353ea: 200d movs r0, #13
  68293. 80353ec: f7fa fb42 bl 802fa74 <memp_free>
  68294. }
  68295. if (vb->ident != NULL )
  68296. 80353f0: 68e1 ldr r1, [r4, #12]
  68297. 80353f2: b111 cbz r1, 80353fa <snmp_varbind_free+0x18>
  68298. {
  68299. memp_free(MEMP_SNMP_VALUE, vb->ident);
  68300. 80353f4: 200d movs r0, #13
  68301. 80353f6: f7fa fb3d bl 802fa74 <memp_free>
  68302. }
  68303. memp_free(MEMP_SNMP_VARBIND, vb);
  68304. 80353fa: 200c movs r0, #12
  68305. 80353fc: 4621 mov r1, r4
  68306. }
  68307. 80353fe: e8bd 4010 ldmia.w sp!, {r4, lr}
  68308. }
  68309. if (vb->ident != NULL )
  68310. {
  68311. memp_free(MEMP_SNMP_VALUE, vb->ident);
  68312. }
  68313. memp_free(MEMP_SNMP_VARBIND, vb);
  68314. 8035402: f7fa bb37 b.w 802fa74 <memp_free>
  68315. 08035406 <snmp_varbind_list_free>:
  68316. }
  68317. void
  68318. snmp_varbind_list_free(struct snmp_varbind_root *root)
  68319. {
  68320. 8035406: b538 push {r3, r4, r5, lr}
  68321. 8035408: 4604 mov r4, r0
  68322. struct snmp_varbind *vb, *prev;
  68323. vb = root->tail;
  68324. 803540a: 6840 ldr r0, [r0, #4]
  68325. while ( vb != NULL )
  68326. 803540c: e003 b.n 8035416 <snmp_varbind_list_free+0x10>
  68327. {
  68328. prev = vb->prev;
  68329. 803540e: 6845 ldr r5, [r0, #4]
  68330. snmp_varbind_free(vb);
  68331. 8035410: f7ff ffe7 bl 80353e2 <snmp_varbind_free>
  68332. vb = prev;
  68333. 8035414: 4628 mov r0, r5
  68334. snmp_varbind_list_free(struct snmp_varbind_root *root)
  68335. {
  68336. struct snmp_varbind *vb, *prev;
  68337. vb = root->tail;
  68338. while ( vb != NULL )
  68339. 8035416: 2800 cmp r0, #0
  68340. 8035418: d1f9 bne.n 803540e <snmp_varbind_list_free+0x8>
  68341. {
  68342. prev = vb->prev;
  68343. snmp_varbind_free(vb);
  68344. vb = prev;
  68345. }
  68346. root->count = 0;
  68347. 803541a: 7220 strb r0, [r4, #8]
  68348. root->head = NULL;
  68349. 803541c: 6020 str r0, [r4, #0]
  68350. root->tail = NULL;
  68351. 803541e: 6060 str r0, [r4, #4]
  68352. 8035420: bd38 pop {r3, r4, r5, pc}
  68353. 08035422 <snmp_error_response>:
  68354. //snmp_coldstart_trap();
  68355. }
  68356. static void
  68357. snmp_error_response(struct snmp_msg_pstat *msg_ps, u8_t error)
  68358. {
  68359. 8035422: b570 push {r4, r5, r6, lr}
  68360. 8035424: 4604 mov r4, r0
  68361. /* move names back from outvb to invb */
  68362. int v;
  68363. struct snmp_varbind *vbi = msg_ps->invb.head;
  68364. struct snmp_varbind *vbo = msg_ps->outvb.head;
  68365. for (v=0; v<msg_ps->vb_idx; v++) {
  68366. 8035426: 2200 movs r2, #0
  68367. //snmp_coldstart_trap();
  68368. }
  68369. static void
  68370. snmp_error_response(struct snmp_msg_pstat *msg_ps, u8_t error)
  68371. {
  68372. 8035428: 460e mov r6, r1
  68373. /* move names back from outvb to invb */
  68374. int v;
  68375. struct snmp_varbind *vbi = msg_ps->invb.head;
  68376. 803542a: f8d0 0100 ldr.w r0, [r0, #256] ; 0x100
  68377. struct snmp_varbind *vbo = msg_ps->outvb.head;
  68378. 803542e: f8d4 310c ldr.w r3, [r4, #268] ; 0x10c
  68379. for (v=0; v<msg_ps->vb_idx; v++) {
  68380. vbi->ident_len = vbo->ident_len;
  68381. vbo->ident_len = 0;
  68382. 8035432: 4611 mov r1, r2
  68383. {
  68384. /* move names back from outvb to invb */
  68385. int v;
  68386. struct snmp_varbind *vbi = msg_ps->invb.head;
  68387. struct snmp_varbind *vbo = msg_ps->outvb.head;
  68388. for (v=0; v<msg_ps->vb_idx; v++) {
  68389. 8035434: e008 b.n 8035448 <snmp_error_response+0x26>
  68390. vbi->ident_len = vbo->ident_len;
  68391. 8035436: 7a1d ldrb r5, [r3, #8]
  68392. 8035438: 7205 strb r5, [r0, #8]
  68393. vbo->ident_len = 0;
  68394. vbi->ident = vbo->ident;
  68395. 803543a: 68dd ldr r5, [r3, #12]
  68396. int v;
  68397. struct snmp_varbind *vbi = msg_ps->invb.head;
  68398. struct snmp_varbind *vbo = msg_ps->outvb.head;
  68399. for (v=0; v<msg_ps->vb_idx; v++) {
  68400. vbi->ident_len = vbo->ident_len;
  68401. vbo->ident_len = 0;
  68402. 803543c: 7219 strb r1, [r3, #8]
  68403. vbi->ident = vbo->ident;
  68404. 803543e: 60c5 str r5, [r0, #12]
  68405. vbo->ident = NULL;
  68406. 8035440: 60d9 str r1, [r3, #12]
  68407. vbi = vbi->next;
  68408. 8035442: 6800 ldr r0, [r0, #0]
  68409. vbo = vbo->next;
  68410. 8035444: 681b ldr r3, [r3, #0]
  68411. {
  68412. /* move names back from outvb to invb */
  68413. int v;
  68414. struct snmp_varbind *vbi = msg_ps->invb.head;
  68415. struct snmp_varbind *vbo = msg_ps->outvb.head;
  68416. for (v=0; v<msg_ps->vb_idx; v++) {
  68417. 8035446: 3201 adds r2, #1
  68418. 8035448: f894 50f8 ldrb.w r5, [r4, #248] ; 0xf8
  68419. 803544c: 42aa cmp r2, r5
  68420. 803544e: dbf2 blt.n 8035436 <snmp_error_response+0x14>
  68421. vbo->ident = NULL;
  68422. vbi = vbi->next;
  68423. vbo = vbo->next;
  68424. }
  68425. /* free outvb */
  68426. snmp_varbind_list_free(&msg_ps->outvb);
  68427. 8035450: f504 7586 add.w r5, r4, #268 ; 0x10c
  68428. 8035454: 4628 mov r0, r5
  68429. 8035456: f7ff ffd6 bl 8035406 <snmp_varbind_list_free>
  68430. /* we send invb back */
  68431. msg_ps->outvb = msg_ps->invb;
  68432. 803545a: f504 7380 add.w r3, r4, #256 ; 0x100
  68433. 803545e: e893 0007 ldmia.w r3, {r0, r1, r2}
  68434. msg_ps->invb.head = NULL;
  68435. 8035462: 2300 movs r3, #0
  68436. msg_ps->invb.tail = NULL;
  68437. msg_ps->invb.count = 0;
  68438. msg_ps->error_status = error;
  68439. /* error index must be 0 for error too big */
  68440. msg_ps->error_index = (error != SNMP_ES_TOOBIG) ? (1 + msg_ps->vb_idx) : 0;
  68441. 8035464: 2e01 cmp r6, #1
  68442. }
  68443. /* free outvb */
  68444. snmp_varbind_list_free(&msg_ps->outvb);
  68445. /* we send invb back */
  68446. msg_ps->outvb = msg_ps->invb;
  68447. msg_ps->invb.head = NULL;
  68448. 8035466: f8c4 3100 str.w r3, [r4, #256] ; 0x100
  68449. msg_ps->invb.tail = NULL;
  68450. 803546a: f8c4 3104 str.w r3, [r4, #260] ; 0x104
  68451. msg_ps->invb.count = 0;
  68452. 803546e: f884 3108 strb.w r3, [r4, #264] ; 0x108
  68453. msg_ps->error_status = error;
  68454. /* error index must be 0 for error too big */
  68455. msg_ps->error_index = (error != SNMP_ES_TOOBIG) ? (1 + msg_ps->vb_idx) : 0;
  68456. 8035472: bf18 it ne
  68457. 8035474: f894 30f8 ldrbne.w r3, [r4, #248] ; 0xf8
  68458. /* we send invb back */
  68459. msg_ps->outvb = msg_ps->invb;
  68460. msg_ps->invb.head = NULL;
  68461. msg_ps->invb.tail = NULL;
  68462. msg_ps->invb.count = 0;
  68463. msg_ps->error_status = error;
  68464. 8035478: 6126 str r6, [r4, #16]
  68465. /* error index must be 0 for error too big */
  68466. msg_ps->error_index = (error != SNMP_ES_TOOBIG) ? (1 + msg_ps->vb_idx) : 0;
  68467. 803547a: bf18 it ne
  68468. 803547c: 3301 addne r3, #1
  68469. vbo = vbo->next;
  68470. }
  68471. /* free outvb */
  68472. snmp_varbind_list_free(&msg_ps->outvb);
  68473. /* we send invb back */
  68474. msg_ps->outvb = msg_ps->invb;
  68475. 803547e: e885 0007 stmia.w r5, {r0, r1, r2}
  68476. msg_ps->invb.head = NULL;
  68477. msg_ps->invb.tail = NULL;
  68478. msg_ps->invb.count = 0;
  68479. msg_ps->error_status = error;
  68480. /* error index must be 0 for error too big */
  68481. msg_ps->error_index = (error != SNMP_ES_TOOBIG) ? (1 + msg_ps->vb_idx) : 0;
  68482. 8035482: 6163 str r3, [r4, #20]
  68483. snmp_send_response(msg_ps);
  68484. 8035484: 4620 mov r0, r4
  68485. 8035486: f001 f877 bl 8036578 <snmp_send_response>
  68486. snmp_varbind_list_free(&msg_ps->outvb);
  68487. 803548a: 4628 mov r0, r5
  68488. 803548c: f7ff ffbb bl 8035406 <snmp_varbind_list_free>
  68489. msg_ps->state = SNMP_MSG_EMPTY;
  68490. 8035490: 2300 movs r3, #0
  68491. 8035492: f884 305a strb.w r3, [r4, #90] ; 0x5a
  68492. 8035496: bd70 pop {r4, r5, r6, pc}
  68493. 08035498 <snmp_ok_response>:
  68494. }
  68495. static void
  68496. snmp_ok_response(struct snmp_msg_pstat *msg_ps)
  68497. {
  68498. 8035498: b510 push {r4, lr}
  68499. 803549a: 4604 mov r4, r0
  68500. err_t err_ret;
  68501. err_ret = snmp_send_response(msg_ps);
  68502. 803549c: f001 f86c bl 8036578 <snmp_send_response>
  68503. else
  68504. {
  68505. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_event = %"S32_F"\n",msg_ps->error_status));
  68506. }
  68507. /* free varbinds (if available) */
  68508. snmp_varbind_list_free(&msg_ps->invb);
  68509. 80354a0: f504 7080 add.w r0, r4, #256 ; 0x100
  68510. 80354a4: f7ff ffaf bl 8035406 <snmp_varbind_list_free>
  68511. snmp_varbind_list_free(&msg_ps->outvb);
  68512. 80354a8: f504 7086 add.w r0, r4, #268 ; 0x10c
  68513. 80354ac: f7ff ffab bl 8035406 <snmp_varbind_list_free>
  68514. msg_ps->state = SNMP_MSG_EMPTY;
  68515. 80354b0: 2300 movs r3, #0
  68516. 80354b2: f884 305a strb.w r3, [r4, #90] ; 0x5a
  68517. 80354b6: bd10 pop {r4, pc}
  68518. 080354b8 <snmp_varbind_tail_add>:
  68519. }
  68520. void
  68521. snmp_varbind_tail_add(struct snmp_varbind_root *root, struct snmp_varbind *vb)
  68522. {
  68523. if (root->count == 0)
  68524. 80354b8: 7a03 ldrb r3, [r0, #8]
  68525. 80354ba: b90b cbnz r3, 80354c0 <snmp_varbind_tail_add+0x8>
  68526. {
  68527. /* add first varbind to list */
  68528. root->head = vb;
  68529. 80354bc: 6001 str r1, [r0, #0]
  68530. 80354be: e002 b.n 80354c6 <snmp_varbind_tail_add+0xe>
  68531. root->tail = vb;
  68532. }
  68533. else
  68534. {
  68535. /* add nth varbind to list tail */
  68536. root->tail->next = vb;
  68537. 80354c0: 6843 ldr r3, [r0, #4]
  68538. 80354c2: 6019 str r1, [r3, #0]
  68539. vb->prev = root->tail;
  68540. 80354c4: 604b str r3, [r1, #4]
  68541. root->tail = vb;
  68542. }
  68543. root->count += 1;
  68544. 80354c6: 7a03 ldrb r3, [r0, #8]
  68545. else
  68546. {
  68547. /* add nth varbind to list tail */
  68548. root->tail->next = vb;
  68549. vb->prev = root->tail;
  68550. root->tail = vb;
  68551. 80354c8: 6041 str r1, [r0, #4]
  68552. }
  68553. root->count += 1;
  68554. 80354ca: 3301 adds r3, #1
  68555. 80354cc: 7203 strb r3, [r0, #8]
  68556. 80354ce: 4770 bx lr
  68557. 080354d0 <snmp_msg_event>:
  68558. *
  68559. * @param request_id identifies requests from 0 to (SNMP_CONCURRENT_REQUESTS-1)
  68560. */
  68561. void
  68562. snmp_msg_event(u8_t request_id)
  68563. {
  68564. 80354d0: e92d 43f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, lr}
  68565. struct snmp_msg_pstat *msg_ps;
  68566. if (request_id < SNMP_CONCURRENT_REQUESTS)
  68567. 80354d4: 4605 mov r5, r0
  68568. *
  68569. * @param request_id identifies requests from 0 to (SNMP_CONCURRENT_REQUESTS-1)
  68570. */
  68571. void
  68572. snmp_msg_event(u8_t request_id)
  68573. {
  68574. 80354d6: b0a7 sub sp, #156 ; 0x9c
  68575. struct snmp_msg_pstat *msg_ps;
  68576. if (request_id < SNMP_CONCURRENT_REQUESTS)
  68577. 80354d8: 2800 cmp r0, #0
  68578. 80354da: f040 8390 bne.w 8035bfe <snmp_msg_event+0x72e>
  68579. {
  68580. msg_ps = &msg_input_list[request_id];
  68581. if (msg_ps->rt == SNMP_ASN1_PDU_GET_NEXT_REQ)
  68582. 80354de: 4cb2 ldr r4, [pc, #712] ; (80357a8 <snmp_msg_event+0x2d8>)
  68583. 80354e0: 7aa6 ldrb r6, [r4, #10]
  68584. 80354e2: 2e01 cmp r6, #1
  68585. 80354e4: f040 80d4 bne.w 8035690 <snmp_msg_event+0x1c0>
  68586. static void
  68587. snmp_msg_getnext_event(u8_t request_id, struct snmp_msg_pstat *msg_ps)
  68588. {
  68589. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_getnext_event: msg_ps->state==%"U16_F"\n",(u16_t)msg_ps->state));
  68590. if (msg_ps->state == SNMP_MSG_EXTERNAL_GET_OBJDEF)
  68591. 80354e8: f894 305a ldrb.w r3, [r4, #90] ; 0x5a
  68592. 80354ec: 2b07 cmp r3, #7
  68593. 80354ee: d125 bne.n 803553c <snmp_msg_event+0x6c>
  68594. /* get_object_def() answer*/
  68595. en = msg_ps->ext_mib_node;
  68596. /* translate answer into a known lifeform */
  68597. en->get_object_def_a(request_id, 1, &msg_ps->ext_oid.id[msg_ps->ext_oid.len - 1], &msg_ps->ext_object_def);
  68598. 80354f0: f894 2074 ldrb.w r2, [r4, #116] ; 0x74
  68599. if (msg_ps->state == SNMP_MSG_EXTERNAL_GET_OBJDEF)
  68600. {
  68601. struct mib_external_node *en;
  68602. /* get_object_def() answer*/
  68603. en = msg_ps->ext_mib_node;
  68604. 80354f4: f8d4 805c ldr.w r8, [r4, #92] ; 0x5c
  68605. /* translate answer into a known lifeform */
  68606. en->get_object_def_a(request_id, 1, &msg_ps->ext_oid.id[msg_ps->ext_oid.len - 1], &msg_ps->ext_object_def);
  68607. 80354f8: eb04 0282 add.w r2, r4, r2, lsl #2
  68608. 80354fc: 4631 mov r1, r6
  68609. 80354fe: 3274 adds r2, #116 ; 0x74
  68610. 8035500: f104 0368 add.w r3, r4, #104 ; 0x68
  68611. 8035504: f8d8 7038 ldr.w r7, [r8, #56] ; 0x38
  68612. 8035508: 47b8 blx r7
  68613. if (msg_ps->ext_object_def.instance != MIB_OBJECT_NONE)
  68614. 803550a: f894 0068 ldrb.w r0, [r4, #104] ; 0x68
  68615. 803550e: b148 cbz r0, 8035524 <snmp_msg_event+0x54>
  68616. {
  68617. msg_ps->state = SNMP_MSG_EXTERNAL_GET_VALUE;
  68618. 8035510: 2308 movs r3, #8
  68619. 8035512: f884 305a strb.w r3, [r4, #90] ; 0x5a
  68620. en->get_value_q(request_id, &msg_ps->ext_object_def);
  68621. 8035516: f8d8 302c ldr.w r3, [r8, #44] ; 0x2c
  68622. 803551a: 4628 mov r0, r5
  68623. 803551c: f104 0168 add.w r1, r4, #104 ; 0x68
  68624. 8035520: 4798 blx r3
  68625. 8035522: e0a6 b.n 8035672 <snmp_msg_event+0x1a2>
  68626. }
  68627. else
  68628. {
  68629. en->get_object_def_pc(request_id, 1, &msg_ps->ext_oid.id[msg_ps->ext_oid.len - 1]);
  68630. 8035524: f894 2074 ldrb.w r2, [r4, #116] ; 0x74
  68631. 8035528: f8d8 3048 ldr.w r3, [r8, #72] ; 0x48
  68632. 803552c: eb04 0282 add.w r2, r4, r2, lsl #2
  68633. 8035530: 4631 mov r1, r6
  68634. 8035532: 3274 adds r2, #116 ; 0x74
  68635. 8035534: 4798 blx r3
  68636. /* search failed, object id points to unknown object (nosuchname) */
  68637. snmp_error_response(msg_ps,SNMP_ES_NOSUCHNAME);
  68638. 8035536: 4620 mov r0, r4
  68639. 8035538: 2102 movs r1, #2
  68640. 803553a: e02a b.n 8035592 <snmp_msg_event+0xc2>
  68641. }
  68642. }
  68643. else if (msg_ps->state == SNMP_MSG_EXTERNAL_GET_VALUE)
  68644. 803553c: 2b08 cmp r3, #8
  68645. 803553e: f040 8098 bne.w 8035672 <snmp_msg_event+0x1a2>
  68646. /* get_value() answer */
  68647. en = msg_ps->ext_mib_node;
  68648. LWIP_ASSERT("invalid length", msg_ps->ext_object_def.v_len <= 0xff);
  68649. vb = snmp_varbind_alloc(&msg_ps->ext_oid,
  68650. 8035542: f104 0074 add.w r0, r4, #116 ; 0x74
  68651. 8035546: f894 106a ldrb.w r1, [r4, #106] ; 0x6a
  68652. 803554a: f894 206c ldrb.w r2, [r4, #108] ; 0x6c
  68653. {
  68654. struct mib_external_node *en;
  68655. struct snmp_varbind *vb;
  68656. /* get_value() answer */
  68657. en = msg_ps->ext_mib_node;
  68658. 803554e: f8d4 805c ldr.w r8, [r4, #92] ; 0x5c
  68659. LWIP_ASSERT("invalid length", msg_ps->ext_object_def.v_len <= 0xff);
  68660. vb = snmp_varbind_alloc(&msg_ps->ext_oid,
  68661. 8035552: f7ff ff05 bl 8035360 <snmp_varbind_alloc>
  68662. msg_ps->ext_object_def.asn_type,
  68663. (u8_t)msg_ps->ext_object_def.v_len);
  68664. if (vb != NULL)
  68665. 8035556: 4607 mov r7, r0
  68666. 8035558: b1a0 cbz r0, 8035584 <snmp_msg_event+0xb4>
  68667. {
  68668. en->get_value_a(request_id, &msg_ps->ext_object_def, vb->value_len, vb->value);
  68669. 803555a: 697b ldr r3, [r7, #20]
  68670. 803555c: f8d8 c03c ldr.w ip, [r8, #60] ; 0x3c
  68671. 8035560: 7c7a ldrb r2, [r7, #17]
  68672. 8035562: 4628 mov r0, r5
  68673. 8035564: f104 0168 add.w r1, r4, #104 ; 0x68
  68674. 8035568: 47e0 blx ip
  68675. snmp_varbind_tail_add(&msg_ps->outvb, vb);
  68676. 803556a: f504 7086 add.w r0, r4, #268 ; 0x10c
  68677. 803556e: 4639 mov r1, r7
  68678. 8035570: f7ff ffa2 bl 80354b8 <snmp_varbind_tail_add>
  68679. msg_ps->state = SNMP_MSG_SEARCH_OBJ;
  68680. msg_ps->vb_idx += 1;
  68681. 8035574: f894 30f8 ldrb.w r3, [r4, #248] ; 0xf8
  68682. (u8_t)msg_ps->ext_object_def.v_len);
  68683. if (vb != NULL)
  68684. {
  68685. en->get_value_a(request_id, &msg_ps->ext_object_def, vb->value_len, vb->value);
  68686. snmp_varbind_tail_add(&msg_ps->outvb, vb);
  68687. msg_ps->state = SNMP_MSG_SEARCH_OBJ;
  68688. 8035578: f884 605a strb.w r6, [r4, #90] ; 0x5a
  68689. msg_ps->vb_idx += 1;
  68690. 803557c: 3301 adds r3, #1
  68691. 803557e: f884 30f8 strb.w r3, [r4, #248] ; 0xf8
  68692. 8035582: e076 b.n 8035672 <snmp_msg_event+0x1a2>
  68693. }
  68694. else
  68695. {
  68696. en->get_value_pc(request_id, &msg_ps->ext_object_def);
  68697. 8035584: f104 0168 add.w r1, r4, #104 ; 0x68
  68698. 8035588: f8d8 304c ldr.w r3, [r8, #76] ; 0x4c
  68699. 803558c: 4798 blx r3
  68700. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_getnext_event: couldn't allocate outvb space\n"));
  68701. snmp_error_response(msg_ps,SNMP_ES_TOOBIG);
  68702. 803558e: 4620 mov r0, r4
  68703. 8035590: 4631 mov r1, r6
  68704. 8035592: f7ff ff46 bl 8035422 <snmp_error_response>
  68705. 8035596: e06c b.n 8035672 <snmp_msg_event+0x1a2>
  68706. (msg_ps->vb_idx < msg_ps->invb.count))
  68707. {
  68708. struct mib_node *mn;
  68709. struct snmp_obj_id oid;
  68710. if (msg_ps->vb_idx == 0)
  68711. 8035598: b913 cbnz r3, 80355a0 <snmp_msg_event+0xd0>
  68712. {
  68713. msg_ps->vb_ptr = msg_ps->invb.head;
  68714. 803559a: f8d4 3100 ldr.w r3, [r4, #256] ; 0x100
  68715. 803559e: e002 b.n 80355a6 <snmp_msg_event+0xd6>
  68716. }
  68717. else
  68718. {
  68719. msg_ps->vb_ptr = msg_ps->vb_ptr->next;
  68720. 80355a0: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  68721. 80355a4: 681b ldr r3, [r3, #0]
  68722. 80355a6: f8c4 30fc str.w r3, [r4, #252] ; 0xfc
  68723. }
  68724. if (snmp_iso_prefix_expand(msg_ps->vb_ptr->ident_len, msg_ps->vb_ptr->ident, &oid))
  68725. 80355aa: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  68726. 80355ae: aa05 add r2, sp, #20
  68727. 80355b0: 7a18 ldrb r0, [r3, #8]
  68728. 80355b2: 68d9 ldr r1, [r3, #12]
  68729. 80355b4: f7ff fe82 bl 80352bc <snmp_iso_prefix_expand>
  68730. 80355b8: 2800 cmp r0, #0
  68731. 80355ba: f000 82ff beq.w 8035bbc <snmp_msg_event+0x6ec>
  68732. {
  68733. if (msg_ps->vb_ptr->ident_len > 3)
  68734. 80355be: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  68735. 80355c2: 7a19 ldrb r1, [r3, #8]
  68736. 80355c4: 2903 cmp r1, #3
  68737. 80355c6: d905 bls.n 80355d4 <snmp_msg_event+0x104>
  68738. {
  68739. /* can offset ident_len and ident */
  68740. mn = snmp_expand_tree((struct mib_node*)&internet,
  68741. 80355c8: 68da ldr r2, [r3, #12]
  68742. 80355ca: 4878 ldr r0, [pc, #480] ; (80357ac <snmp_msg_event+0x2dc>)
  68743. 80355cc: 3904 subs r1, #4
  68744. 80355ce: b2c9 uxtb r1, r1
  68745. 80355d0: 3210 adds r2, #16
  68746. 80355d2: e002 b.n 80355da <snmp_msg_event+0x10a>
  68747. msg_ps->vb_ptr->ident + 4, &oid);
  68748. }
  68749. else
  68750. {
  68751. /* can't offset ident_len -4, ident + 4 */
  68752. mn = snmp_expand_tree((struct mib_node*)&internet, 0, NULL, &oid);
  68753. 80355d4: 2100 movs r1, #0
  68754. 80355d6: 4875 ldr r0, [pc, #468] ; (80357ac <snmp_msg_event+0x2dc>)
  68755. 80355d8: 460a mov r2, r1
  68756. 80355da: ab05 add r3, sp, #20
  68757. 80355dc: f7ff fc8e bl 8034efc <snmp_expand_tree>
  68758. 80355e0: 4605 mov r5, r0
  68759. }
  68760. else
  68761. {
  68762. mn = NULL;
  68763. }
  68764. if (mn != NULL)
  68765. 80355e2: 2800 cmp r0, #0
  68766. 80355e4: f000 82ea beq.w 8035bbc <snmp_msg_event+0x6ec>
  68767. {
  68768. if (mn->node_type == MIB_NODE_EX)
  68769. 80355e8: 7c03 ldrb r3, [r0, #16]
  68770. 80355ea: 2b05 cmp r3, #5
  68771. 80355ec: d113 bne.n 8035616 <snmp_msg_event+0x146>
  68772. {
  68773. /* external object */
  68774. struct mib_external_node *en = (struct mib_external_node*)mn;
  68775. msg_ps->state = SNMP_MSG_EXTERNAL_GET_OBJDEF;
  68776. 80355ee: 2307 movs r3, #7
  68777. /* save en && args in msg_ps!! */
  68778. msg_ps->ext_mib_node = en;
  68779. 80355f0: 65e0 str r0, [r4, #92] ; 0x5c
  68780. msg_ps->ext_oid = oid;
  68781. 80355f2: a905 add r1, sp, #20
  68782. 80355f4: 2284 movs r2, #132 ; 0x84
  68783. 80355f6: 486e ldr r0, [pc, #440] ; (80357b0 <snmp_msg_event+0x2e0>)
  68784. if (mn->node_type == MIB_NODE_EX)
  68785. {
  68786. /* external object */
  68787. struct mib_external_node *en = (struct mib_external_node*)mn;
  68788. msg_ps->state = SNMP_MSG_EXTERNAL_GET_OBJDEF;
  68789. 80355f8: f884 305a strb.w r3, [r4, #90] ; 0x5a
  68790. /* save en && args in msg_ps!! */
  68791. msg_ps->ext_mib_node = en;
  68792. msg_ps->ext_oid = oid;
  68793. 80355fc: f7ec fb52 bl 8021ca4 <memcpy>
  68794. en->get_object_def_q(en->addr_inf, request_id, 1, &oid.id[oid.len - 1]);
  68795. 8035600: f89d 3014 ldrb.w r3, [sp, #20]
  68796. 8035604: 6aae ldr r6, [r5, #40] ; 0x28
  68797. 8035606: 6968 ldr r0, [r5, #20]
  68798. 8035608: ad05 add r5, sp, #20
  68799. 803560a: 2100 movs r1, #0
  68800. 803560c: 2201 movs r2, #1
  68801. 803560e: eb05 0383 add.w r3, r5, r3, lsl #2
  68802. 8035612: 47b0 blx r6
  68803. 8035614: e02e b.n 8035674 <snmp_msg_event+0x1a4>
  68804. {
  68805. /* internal object */
  68806. struct obj_def object_def;
  68807. struct snmp_varbind *vb;
  68808. msg_ps->state = SNMP_MSG_INTERNAL_GET_OBJDEF;
  68809. 8035616: 2302 movs r3, #2
  68810. mn->get_object_def(1, &oid.id[oid.len - 1], &object_def);
  68811. 8035618: f89d 1014 ldrb.w r1, [sp, #20]
  68812. {
  68813. /* internal object */
  68814. struct obj_def object_def;
  68815. struct snmp_varbind *vb;
  68816. msg_ps->state = SNMP_MSG_INTERNAL_GET_OBJDEF;
  68817. 803561c: f884 305a strb.w r3, [r4, #90] ; 0x5a
  68818. mn->get_object_def(1, &oid.id[oid.len - 1], &object_def);
  68819. 8035620: af05 add r7, sp, #20
  68820. 8035622: 6803 ldr r3, [r0, #0]
  68821. 8035624: eb07 0181 add.w r1, r7, r1, lsl #2
  68822. 8035628: 2001 movs r0, #1
  68823. 803562a: aa02 add r2, sp, #8
  68824. 803562c: 4798 blx r3
  68825. LWIP_ASSERT("invalid length", object_def.v_len <= 0xff);
  68826. vb = snmp_varbind_alloc(&oid, object_def.asn_type, (u8_t)object_def.v_len);
  68827. 803562e: a805 add r0, sp, #20
  68828. 8035630: f89d 100a ldrb.w r1, [sp, #10]
  68829. 8035634: f89d 200c ldrb.w r2, [sp, #12]
  68830. 8035638: f7ff fe92 bl 8035360 <snmp_varbind_alloc>
  68831. if (vb != NULL)
  68832. 803563c: 4606 mov r6, r0
  68833. 803563e: b1a8 cbz r0, 803566c <snmp_msg_event+0x19c>
  68834. {
  68835. msg_ps->state = SNMP_MSG_INTERNAL_GET_VALUE;
  68836. 8035640: 2303 movs r3, #3
  68837. 8035642: f884 305a strb.w r3, [r4, #90] ; 0x5a
  68838. mn->get_value(&object_def, object_def.v_len, vb->value);
  68839. 8035646: 686b ldr r3, [r5, #4]
  68840. 8035648: f8bd 100c ldrh.w r1, [sp, #12]
  68841. 803564c: 6972 ldr r2, [r6, #20]
  68842. 803564e: a802 add r0, sp, #8
  68843. 8035650: 4798 blx r3
  68844. snmp_varbind_tail_add(&msg_ps->outvb, vb);
  68845. 8035652: 4858 ldr r0, [pc, #352] ; (80357b4 <snmp_msg_event+0x2e4>)
  68846. 8035654: 4631 mov r1, r6
  68847. 8035656: f7ff ff2f bl 80354b8 <snmp_varbind_tail_add>
  68848. msg_ps->state = SNMP_MSG_SEARCH_OBJ;
  68849. 803565a: 2301 movs r3, #1
  68850. 803565c: f884 305a strb.w r3, [r4, #90] ; 0x5a
  68851. msg_ps->vb_idx += 1;
  68852. 8035660: f894 30f8 ldrb.w r3, [r4, #248] ; 0xf8
  68853. 8035664: 3301 adds r3, #1
  68854. 8035666: f884 30f8 strb.w r3, [r4, #248] ; 0xf8
  68855. 803566a: e003 b.n 8035674 <snmp_msg_event+0x1a4>
  68856. }
  68857. else
  68858. {
  68859. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_recv couldn't allocate outvb space\n"));
  68860. snmp_error_response(msg_ps,SNMP_ES_TOOBIG);
  68861. 803566c: 484e ldr r0, [pc, #312] ; (80357a8 <snmp_msg_event+0x2d8>)
  68862. 803566e: 2101 movs r1, #1
  68863. 8035670: e2a6 b.n 8035bc0 <snmp_msg_event+0x6f0>
  68864. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_getnext_event: couldn't allocate outvb space\n"));
  68865. snmp_error_response(msg_ps,SNMP_ES_TOOBIG);
  68866. }
  68867. }
  68868. while ((msg_ps->state == SNMP_MSG_SEARCH_OBJ) &&
  68869. 8035672: 4c4d ldr r4, [pc, #308] ; (80357a8 <snmp_msg_event+0x2d8>)
  68870. 8035674: f894 305a ldrb.w r3, [r4, #90] ; 0x5a
  68871. 8035678: 2b01 cmp r3, #1
  68872. 803567a: f040 82c0 bne.w 8035bfe <snmp_msg_event+0x72e>
  68873. (msg_ps->vb_idx < msg_ps->invb.count))
  68874. 803567e: f894 30f8 ldrb.w r3, [r4, #248] ; 0xf8
  68875. 8035682: f894 2108 ldrb.w r2, [r4, #264] ; 0x108
  68876. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_getnext_event: couldn't allocate outvb space\n"));
  68877. snmp_error_response(msg_ps,SNMP_ES_TOOBIG);
  68878. }
  68879. }
  68880. while ((msg_ps->state == SNMP_MSG_SEARCH_OBJ) &&
  68881. 8035686: 4293 cmp r3, r2
  68882. 8035688: d386 bcc.n 8035598 <snmp_msg_event+0xc8>
  68883. 803568a: e2a7 b.n 8035bdc <snmp_msg_event+0x70c>
  68884. }
  68885. }
  68886. if ((msg_ps->state == SNMP_MSG_SEARCH_OBJ) &&
  68887. (msg_ps->vb_idx == msg_ps->invb.count))
  68888. {
  68889. snmp_ok_response(msg_ps);
  68890. 803568c: 4846 ldr r0, [pc, #280] ; (80357a8 <snmp_msg_event+0x2d8>)
  68891. 803568e: e292 b.n 8035bb6 <snmp_msg_event+0x6e6>
  68892. msg_ps = &msg_input_list[request_id];
  68893. if (msg_ps->rt == SNMP_ASN1_PDU_GET_NEXT_REQ)
  68894. {
  68895. snmp_msg_getnext_event(request_id, msg_ps);
  68896. }
  68897. else if (msg_ps->rt == SNMP_ASN1_PDU_GET_REQ)
  68898. 8035690: 2e00 cmp r6, #0
  68899. 8035692: f040 8126 bne.w 80358e2 <snmp_msg_event+0x412>
  68900. static void
  68901. snmp_msg_get_event(u8_t request_id, struct snmp_msg_pstat *msg_ps)
  68902. {
  68903. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_get_event: msg_ps->state==%"U16_F"\n",(u16_t)msg_ps->state));
  68904. if (msg_ps->state == SNMP_MSG_EXTERNAL_GET_OBJDEF)
  68905. 8035696: f894 305a ldrb.w r3, [r4, #90] ; 0x5a
  68906. 803569a: 2b07 cmp r3, #7
  68907. 803569c: d122 bne.n 80356e4 <snmp_msg_event+0x214>
  68908. {
  68909. struct mib_external_node *en;
  68910. struct snmp_name_ptr np;
  68911. /* get_object_def() answer*/
  68912. en = msg_ps->ext_mib_node;
  68913. 803569e: 6de5 ldr r5, [r4, #92] ; 0x5c
  68914. np = msg_ps->ext_name_ptr;
  68915. 80356a0: f894 9060 ldrb.w r9, [r4, #96] ; 0x60
  68916. 80356a4: f8d4 8064 ldr.w r8, [r4, #100] ; 0x64
  68917. /* translate answer into a known lifeform */
  68918. en->get_object_def_a(request_id, np.ident_len, np.ident, &msg_ps->ext_object_def);
  68919. 80356a8: 6baf ldr r7, [r5, #56] ; 0x38
  68920. 80356aa: f104 0368 add.w r3, r4, #104 ; 0x68
  68921. 80356ae: 4649 mov r1, r9
  68922. 80356b0: 4642 mov r2, r8
  68923. 80356b2: 47b8 blx r7
  68924. if ((msg_ps->ext_object_def.instance != MIB_OBJECT_NONE) &&
  68925. 80356b4: f894 3068 ldrb.w r3, [r4, #104] ; 0x68
  68926. 80356b8: b163 cbz r3, 80356d4 <snmp_msg_event+0x204>
  68927. (msg_ps->ext_object_def.access & MIB_ACCESS_READ))
  68928. 80356ba: f894 3069 ldrb.w r3, [r4, #105] ; 0x69
  68929. en = msg_ps->ext_mib_node;
  68930. np = msg_ps->ext_name_ptr;
  68931. /* translate answer into a known lifeform */
  68932. en->get_object_def_a(request_id, np.ident_len, np.ident, &msg_ps->ext_object_def);
  68933. if ((msg_ps->ext_object_def.instance != MIB_OBJECT_NONE) &&
  68934. 80356be: 07da lsls r2, r3, #31
  68935. 80356c0: d508 bpl.n 80356d4 <snmp_msg_event+0x204>
  68936. (msg_ps->ext_object_def.access & MIB_ACCESS_READ))
  68937. {
  68938. msg_ps->state = SNMP_MSG_EXTERNAL_GET_VALUE;
  68939. 80356c2: 2308 movs r3, #8
  68940. 80356c4: f884 305a strb.w r3, [r4, #90] ; 0x5a
  68941. en->get_value_q(request_id, &msg_ps->ext_object_def);
  68942. 80356c8: 6aeb ldr r3, [r5, #44] ; 0x2c
  68943. 80356ca: 4630 mov r0, r6
  68944. 80356cc: f104 0168 add.w r1, r4, #104 ; 0x68
  68945. 80356d0: 4798 blx r3
  68946. 80356d2: e0f7 b.n 80358c4 <snmp_msg_event+0x3f4>
  68947. }
  68948. else
  68949. {
  68950. en->get_object_def_pc(request_id, np.ident_len, np.ident);
  68951. 80356d4: 2000 movs r0, #0
  68952. 80356d6: 4649 mov r1, r9
  68953. 80356d8: 6cab ldr r3, [r5, #72] ; 0x48
  68954. 80356da: 4642 mov r2, r8
  68955. 80356dc: 4798 blx r3
  68956. /* search failed, object id points to unknown object (nosuchname) */
  68957. snmp_error_response(msg_ps,SNMP_ES_NOSUCHNAME);
  68958. 80356de: 4832 ldr r0, [pc, #200] ; (80357a8 <snmp_msg_event+0x2d8>)
  68959. 80356e0: 2102 movs r1, #2
  68960. 80356e2: e059 b.n 8035798 <snmp_msg_event+0x2c8>
  68961. }
  68962. }
  68963. else if (msg_ps->state == SNMP_MSG_EXTERNAL_GET_VALUE)
  68964. 80356e4: 2b08 cmp r3, #8
  68965. 80356e6: f040 80ed bne.w 80358c4 <snmp_msg_event+0x3f4>
  68966. /* get_value() answer */
  68967. en = msg_ps->ext_mib_node;
  68968. /* allocate output varbind */
  68969. vb = (struct snmp_varbind *)memp_malloc(MEMP_SNMP_VARBIND);
  68970. 80356ea: 200c movs r0, #12
  68971. {
  68972. struct mib_external_node *en;
  68973. struct snmp_varbind *vb;
  68974. /* get_value() answer */
  68975. en = msg_ps->ext_mib_node;
  68976. 80356ec: f8d4 805c ldr.w r8, [r4, #92] ; 0x5c
  68977. /* allocate output varbind */
  68978. vb = (struct snmp_varbind *)memp_malloc(MEMP_SNMP_VARBIND);
  68979. 80356f0: f7fa f9aa bl 802fa48 <memp_malloc>
  68980. if (vb != NULL)
  68981. 80356f4: 4605 mov r5, r0
  68982. 80356f6: 2800 cmp r0, #0
  68983. 80356f8: d047 beq.n 803578a <snmp_msg_event+0x2ba>
  68984. {
  68985. vb->next = NULL;
  68986. 80356fa: 6006 str r6, [r0, #0]
  68987. vb->prev = NULL;
  68988. 80356fc: 6046 str r6, [r0, #4]
  68989. /* move name from invb to outvb */
  68990. vb->ident = msg_ps->vb_ptr->ident;
  68991. 80356fe: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  68992. 8035702: 68da ldr r2, [r3, #12]
  68993. vb->ident_len = msg_ps->vb_ptr->ident_len;
  68994. 8035704: 7a1b ldrb r3, [r3, #8]
  68995. {
  68996. vb->next = NULL;
  68997. vb->prev = NULL;
  68998. /* move name from invb to outvb */
  68999. vb->ident = msg_ps->vb_ptr->ident;
  69000. 8035706: 60c2 str r2, [r0, #12]
  69001. vb->ident_len = msg_ps->vb_ptr->ident_len;
  69002. 8035708: 7203 strb r3, [r0, #8]
  69003. /* ensure this memory is refereced once only */
  69004. msg_ps->vb_ptr->ident = NULL;
  69005. 803570a: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  69006. msg_ps->vb_ptr->ident_len = 0;
  69007. 803570e: 721e strb r6, [r3, #8]
  69008. /* move name from invb to outvb */
  69009. vb->ident = msg_ps->vb_ptr->ident;
  69010. vb->ident_len = msg_ps->vb_ptr->ident_len;
  69011. /* ensure this memory is refereced once only */
  69012. msg_ps->vb_ptr->ident = NULL;
  69013. 8035710: 60de str r6, [r3, #12]
  69014. msg_ps->vb_ptr->ident_len = 0;
  69015. vb->value_type = msg_ps->ext_object_def.asn_type;
  69016. 8035712: f894 306a ldrb.w r3, [r4, #106] ; 0x6a
  69017. 8035716: 7403 strb r3, [r0, #16]
  69018. LWIP_ASSERT("invalid length", msg_ps->ext_object_def.v_len <= 0xff);
  69019. vb->value_len = (u8_t)msg_ps->ext_object_def.v_len;
  69020. 8035718: f894 706c ldrb.w r7, [r4, #108] ; 0x6c
  69021. 803571c: 7447 strb r7, [r0, #17]
  69022. if (vb->value_len > 0)
  69023. 803571e: b1ef cbz r7, 803575c <snmp_msg_event+0x28c>
  69024. {
  69025. LWIP_ASSERT("SNMP_MAX_OCTET_STRING_LEN is configured too low", vb->value_len <= SNMP_MAX_VALUE_SIZE);
  69026. vb->value = memp_malloc(MEMP_SNMP_VALUE);
  69027. 8035720: 200d movs r0, #13
  69028. 8035722: f7fa f991 bl 802fa48 <memp_malloc>
  69029. 8035726: 4603 mov r3, r0
  69030. 8035728: 6168 str r0, [r5, #20]
  69031. if (vb->value != NULL)
  69032. 803572a: b138 cbz r0, 803573c <snmp_msg_event+0x26c>
  69033. {
  69034. en->get_value_a(request_id, &msg_ps->ext_object_def, vb->value_len, vb->value);
  69035. 803572c: f8d8 703c ldr.w r7, [r8, #60] ; 0x3c
  69036. 8035730: 7c6a ldrb r2, [r5, #17]
  69037. 8035732: 4630 mov r0, r6
  69038. 8035734: f104 0168 add.w r1, r4, #104 ; 0x68
  69039. 8035738: 47b8 blx r7
  69040. 803573a: e018 b.n 803576e <snmp_msg_event+0x29e>
  69041. msg_ps->state = SNMP_MSG_SEARCH_OBJ;
  69042. msg_ps->vb_idx += 1;
  69043. }
  69044. else
  69045. {
  69046. en->get_value_pc(request_id, &msg_ps->ext_object_def);
  69047. 803573c: f8d8 304c ldr.w r3, [r8, #76] ; 0x4c
  69048. 8035740: f104 0168 add.w r1, r4, #104 ; 0x68
  69049. 8035744: 4798 blx r3
  69050. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_event: no variable space\n"));
  69051. msg_ps->vb_ptr->ident = vb->ident;
  69052. 8035746: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  69053. 803574a: 68ea ldr r2, [r5, #12]
  69054. 803574c: 60da str r2, [r3, #12]
  69055. msg_ps->vb_ptr->ident_len = vb->ident_len;
  69056. 803574e: 7a2a ldrb r2, [r5, #8]
  69057. memp_free(MEMP_SNMP_VARBIND, vb);
  69058. 8035750: 200c movs r0, #12
  69059. else
  69060. {
  69061. en->get_value_pc(request_id, &msg_ps->ext_object_def);
  69062. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_event: no variable space\n"));
  69063. msg_ps->vb_ptr->ident = vb->ident;
  69064. msg_ps->vb_ptr->ident_len = vb->ident_len;
  69065. 8035752: 721a strb r2, [r3, #8]
  69066. memp_free(MEMP_SNMP_VARBIND, vb);
  69067. 8035754: 4629 mov r1, r5
  69068. 8035756: f7fa f98d bl 802fa74 <memp_free>
  69069. 803575a: e01b b.n 8035794 <snmp_msg_event+0x2c4>
  69070. }
  69071. }
  69072. else
  69073. {
  69074. /* vb->value_len == 0, empty value (e.g. empty string) */
  69075. en->get_value_a(request_id, &msg_ps->ext_object_def, 0, NULL);
  69076. 803575c: f8d8 603c ldr.w r6, [r8, #60] ; 0x3c
  69077. 8035760: 4638 mov r0, r7
  69078. 8035762: f104 0168 add.w r1, r4, #104 ; 0x68
  69079. 8035766: 463a mov r2, r7
  69080. 8035768: 463b mov r3, r7
  69081. 803576a: 47b0 blx r6
  69082. vb->value = NULL;
  69083. 803576c: 616f str r7, [r5, #20]
  69084. snmp_varbind_tail_add(&msg_ps->outvb, vb);
  69085. 803576e: f504 7086 add.w r0, r4, #268 ; 0x10c
  69086. 8035772: 4629 mov r1, r5
  69087. 8035774: f7ff fea0 bl 80354b8 <snmp_varbind_tail_add>
  69088. /* search again (if vb_idx < msg_ps->invb.count) */
  69089. msg_ps->state = SNMP_MSG_SEARCH_OBJ;
  69090. 8035778: 2301 movs r3, #1
  69091. 803577a: f884 305a strb.w r3, [r4, #90] ; 0x5a
  69092. msg_ps->vb_idx += 1;
  69093. 803577e: f894 30f8 ldrb.w r3, [r4, #248] ; 0xf8
  69094. 8035782: 3301 adds r3, #1
  69095. 8035784: f884 30f8 strb.w r3, [r4, #248] ; 0xf8
  69096. 8035788: e09c b.n 80358c4 <snmp_msg_event+0x3f4>
  69097. }
  69098. }
  69099. else
  69100. {
  69101. en->get_value_pc(request_id, &msg_ps->ext_object_def);
  69102. 803578a: f8d8 304c ldr.w r3, [r8, #76] ; 0x4c
  69103. 803578e: f104 0168 add.w r1, r4, #104 ; 0x68
  69104. 8035792: 4798 blx r3
  69105. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_event: no outvb space\n"));
  69106. snmp_error_response(msg_ps,SNMP_ES_TOOBIG);
  69107. 8035794: 4620 mov r0, r4
  69108. 8035796: 2101 movs r1, #1
  69109. 8035798: f7ff fe43 bl 8035422 <snmp_error_response>
  69110. 803579c: e092 b.n 80358c4 <snmp_msg_event+0x3f4>
  69111. (msg_ps->vb_idx < msg_ps->invb.count))
  69112. {
  69113. struct mib_node *mn;
  69114. struct snmp_name_ptr np;
  69115. if (msg_ps->vb_idx == 0)
  69116. 803579e: b95b cbnz r3, 80357b8 <snmp_msg_event+0x2e8>
  69117. {
  69118. msg_ps->vb_ptr = msg_ps->invb.head;
  69119. 80357a0: f8d4 3100 ldr.w r3, [r4, #256] ; 0x100
  69120. 80357a4: e00b b.n 80357be <snmp_msg_event+0x2ee>
  69121. 80357a6: bf00 nop
  69122. 80357a8: 2000ff54 .word 0x2000ff54
  69123. 80357ac: 08044f70 .word 0x08044f70
  69124. 80357b0: 2000ffc8 .word 0x2000ffc8
  69125. 80357b4: 20010060 .word 0x20010060
  69126. }
  69127. else
  69128. {
  69129. msg_ps->vb_ptr = msg_ps->vb_ptr->next;
  69130. 80357b8: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  69131. 80357bc: 681b ldr r3, [r3, #0]
  69132. 80357be: f8c4 30fc str.w r3, [r4, #252] ; 0xfc
  69133. }
  69134. /** test object identifier for .iso.org.dod.internet prefix */
  69135. if (snmp_iso_prefix_tst(msg_ps->vb_ptr->ident_len, msg_ps->vb_ptr->ident))
  69136. 80357c2: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  69137. 80357c6: 7a18 ldrb r0, [r3, #8]
  69138. 80357c8: 68d9 ldr r1, [r3, #12]
  69139. 80357ca: f7ff fd65 bl 8035298 <snmp_iso_prefix_tst>
  69140. 80357ce: 2800 cmp r0, #0
  69141. 80357d0: d073 beq.n 80358ba <snmp_msg_event+0x3ea>
  69142. {
  69143. mn = snmp_search_tree((struct mib_node*)&internet, msg_ps->vb_ptr->ident_len - 4,
  69144. 80357d2: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  69145. 80357d6: 48a6 ldr r0, [pc, #664] ; (8035a70 <snmp_msg_event+0x5a0>)
  69146. 80357d8: 7a19 ldrb r1, [r3, #8]
  69147. 80357da: 68da ldr r2, [r3, #12]
  69148. 80357dc: 3904 subs r1, #4
  69149. 80357de: b2c9 uxtb r1, r1
  69150. 80357e0: 3210 adds r2, #16
  69151. 80357e2: 466b mov r3, sp
  69152. 80357e4: f7ff fb0a bl 8034dfc <snmp_search_tree>
  69153. msg_ps->vb_ptr->ident + 4, &np);
  69154. if (mn != NULL)
  69155. 80357e8: 4606 mov r6, r0
  69156. 80357ea: 2800 cmp r0, #0
  69157. 80357ec: d065 beq.n 80358ba <snmp_msg_event+0x3ea>
  69158. {
  69159. if (mn->node_type == MIB_NODE_EX)
  69160. 80357ee: 7c03 ldrb r3, [r0, #16]
  69161. 80357f0: 2b05 cmp r3, #5
  69162. 80357f2: d110 bne.n 8035816 <snmp_msg_event+0x346>
  69163. /* external object */
  69164. struct mib_external_node *en = (struct mib_external_node*)mn;
  69165. msg_ps->state = SNMP_MSG_EXTERNAL_GET_OBJDEF;
  69166. /* save en && args in msg_ps!! */
  69167. msg_ps->ext_mib_node = en;
  69168. 80357f4: 65e0 str r0, [r4, #92] ; 0x5c
  69169. if (mn->node_type == MIB_NODE_EX)
  69170. {
  69171. /* external object */
  69172. struct mib_external_node *en = (struct mib_external_node*)mn;
  69173. msg_ps->state = SNMP_MSG_EXTERNAL_GET_OBJDEF;
  69174. 80357f6: 2307 movs r3, #7
  69175. /* save en && args in msg_ps!! */
  69176. msg_ps->ext_mib_node = en;
  69177. msg_ps->ext_name_ptr = np;
  69178. 80357f8: e898 0003 ldmia.w r8, {r0, r1}
  69179. if (mn->node_type == MIB_NODE_EX)
  69180. {
  69181. /* external object */
  69182. struct mib_external_node *en = (struct mib_external_node*)mn;
  69183. msg_ps->state = SNMP_MSG_EXTERNAL_GET_OBJDEF;
  69184. 80357fc: f884 305a strb.w r3, [r4, #90] ; 0x5a
  69185. /* save en && args in msg_ps!! */
  69186. msg_ps->ext_mib_node = en;
  69187. msg_ps->ext_name_ptr = np;
  69188. 8035800: 4b9c ldr r3, [pc, #624] ; (8035a74 <snmp_msg_event+0x5a4>)
  69189. en->get_object_def_q(en->addr_inf, request_id, np.ident_len, np.ident);
  69190. 8035802: f89d 2000 ldrb.w r2, [sp]
  69191. struct mib_external_node *en = (struct mib_external_node*)mn;
  69192. msg_ps->state = SNMP_MSG_EXTERNAL_GET_OBJDEF;
  69193. /* save en && args in msg_ps!! */
  69194. msg_ps->ext_mib_node = en;
  69195. msg_ps->ext_name_ptr = np;
  69196. 8035806: e883 0003 stmia.w r3, {r0, r1}
  69197. en->get_object_def_q(en->addr_inf, request_id, np.ident_len, np.ident);
  69198. 803580a: 2100 movs r1, #0
  69199. 803580c: 6ab5 ldr r5, [r6, #40] ; 0x28
  69200. 803580e: 6970 ldr r0, [r6, #20]
  69201. 8035810: 9b01 ldr r3, [sp, #4]
  69202. 8035812: 47a8 blx r5
  69203. 8035814: e058 b.n 80358c8 <snmp_msg_event+0x3f8>
  69204. else
  69205. {
  69206. /* internal object */
  69207. struct obj_def object_def;
  69208. msg_ps->state = SNMP_MSG_INTERNAL_GET_OBJDEF;
  69209. 8035816: 2302 movs r3, #2
  69210. 8035818: f884 305a strb.w r3, [r4, #90] ; 0x5a
  69211. mn->get_object_def(np.ident_len, np.ident, &object_def);
  69212. 803581c: 6803 ldr r3, [r0, #0]
  69213. 803581e: 9901 ldr r1, [sp, #4]
  69214. 8035820: f89d 0000 ldrb.w r0, [sp]
  69215. 8035824: aa02 add r2, sp, #8
  69216. 8035826: 4798 blx r3
  69217. if ((object_def.instance != MIB_OBJECT_NONE) &&
  69218. 8035828: f89d 3008 ldrb.w r3, [sp, #8]
  69219. 803582c: 2b00 cmp r3, #0
  69220. 803582e: d044 beq.n 80358ba <snmp_msg_event+0x3ea>
  69221. (object_def.access & MIB_ACCESS_READ))
  69222. 8035830: f89d 3009 ldrb.w r3, [sp, #9]
  69223. /* internal object */
  69224. struct obj_def object_def;
  69225. msg_ps->state = SNMP_MSG_INTERNAL_GET_OBJDEF;
  69226. mn->get_object_def(np.ident_len, np.ident, &object_def);
  69227. if ((object_def.instance != MIB_OBJECT_NONE) &&
  69228. 8035834: 07db lsls r3, r3, #31
  69229. 8035836: f100 81c6 bmi.w 8035bc6 <snmp_msg_event+0x6f6>
  69230. 803583a: e03e b.n 80358ba <snmp_msg_event+0x3ea>
  69231. msg_ps->state = SNMP_MSG_INTERNAL_GET_VALUE;
  69232. /* allocate output varbind */
  69233. vb = (struct snmp_varbind *)memp_malloc(MEMP_SNMP_VARBIND);
  69234. if (vb != NULL)
  69235. {
  69236. vb->next = NULL;
  69237. 803583c: 2200 movs r2, #0
  69238. 803583e: 602a str r2, [r5, #0]
  69239. vb->prev = NULL;
  69240. 8035840: 606a str r2, [r5, #4]
  69241. /* move name from invb to outvb */
  69242. vb->ident = msg_ps->vb_ptr->ident;
  69243. 8035842: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  69244. 8035846: 68d9 ldr r1, [r3, #12]
  69245. vb->ident_len = msg_ps->vb_ptr->ident_len;
  69246. 8035848: 7a1b ldrb r3, [r3, #8]
  69247. {
  69248. vb->next = NULL;
  69249. vb->prev = NULL;
  69250. /* move name from invb to outvb */
  69251. vb->ident = msg_ps->vb_ptr->ident;
  69252. 803584a: 60e9 str r1, [r5, #12]
  69253. vb->ident_len = msg_ps->vb_ptr->ident_len;
  69254. 803584c: 722b strb r3, [r5, #8]
  69255. /* ensure this memory is refereced once only */
  69256. msg_ps->vb_ptr->ident = NULL;
  69257. 803584e: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  69258. msg_ps->vb_ptr->ident_len = 0;
  69259. 8035852: 721a strb r2, [r3, #8]
  69260. /* move name from invb to outvb */
  69261. vb->ident = msg_ps->vb_ptr->ident;
  69262. vb->ident_len = msg_ps->vb_ptr->ident_len;
  69263. /* ensure this memory is refereced once only */
  69264. msg_ps->vb_ptr->ident = NULL;
  69265. 8035854: 60da str r2, [r3, #12]
  69266. msg_ps->vb_ptr->ident_len = 0;
  69267. vb->value_type = object_def.asn_type;
  69268. 8035856: f89d 300a ldrb.w r3, [sp, #10]
  69269. 803585a: 742b strb r3, [r5, #16]
  69270. LWIP_ASSERT("invalid length", object_def.v_len <= 0xff);
  69271. vb->value_len = (u8_t)object_def.v_len;
  69272. 803585c: f89d 300c ldrb.w r3, [sp, #12]
  69273. 8035860: 746b strb r3, [r5, #17]
  69274. if (vb->value_len > 0)
  69275. 8035862: b1bb cbz r3, 8035894 <snmp_msg_event+0x3c4>
  69276. {
  69277. LWIP_ASSERT("SNMP_MAX_OCTET_STRING_LEN is configured too low",
  69278. vb->value_len <= SNMP_MAX_VALUE_SIZE);
  69279. vb->value = memp_malloc(MEMP_SNMP_VALUE);
  69280. 8035864: 200d movs r0, #13
  69281. 8035866: f7fa f8ef bl 802fa48 <memp_malloc>
  69282. 803586a: 4602 mov r2, r0
  69283. 803586c: 6168 str r0, [r5, #20]
  69284. if (vb->value != NULL)
  69285. 803586e: b120 cbz r0, 803587a <snmp_msg_event+0x3aa>
  69286. {
  69287. mn->get_value(&object_def, vb->value_len, vb->value);
  69288. 8035870: 6877 ldr r7, [r6, #4]
  69289. 8035872: 7c69 ldrb r1, [r5, #17]
  69290. 8035874: a802 add r0, sp, #8
  69291. 8035876: 47b8 blx r7
  69292. 8035878: e00d b.n 8035896 <snmp_msg_event+0x3c6>
  69293. msg_ps->vb_idx += 1;
  69294. }
  69295. else
  69296. {
  69297. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_event: couldn't allocate variable space\n"));
  69298. msg_ps->vb_ptr->ident = vb->ident;
  69299. 803587a: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  69300. 803587e: 68e9 ldr r1, [r5, #12]
  69301. 8035880: 60d9 str r1, [r3, #12]
  69302. msg_ps->vb_ptr->ident_len = vb->ident_len;
  69303. 8035882: 7a29 ldrb r1, [r5, #8]
  69304. vb->ident = NULL;
  69305. 8035884: 60e8 str r0, [r5, #12]
  69306. }
  69307. else
  69308. {
  69309. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_event: couldn't allocate variable space\n"));
  69310. msg_ps->vb_ptr->ident = vb->ident;
  69311. msg_ps->vb_ptr->ident_len = vb->ident_len;
  69312. 8035886: 7219 strb r1, [r3, #8]
  69313. vb->ident = NULL;
  69314. vb->ident_len = 0;
  69315. 8035888: 7228 strb r0, [r5, #8]
  69316. memp_free(MEMP_SNMP_VARBIND, vb);
  69317. 803588a: 4629 mov r1, r5
  69318. 803588c: 200c movs r0, #12
  69319. 803588e: f7fa f8f1 bl 802fa74 <memp_free>
  69320. 8035892: e00d b.n 80358b0 <snmp_msg_event+0x3e0>
  69321. }
  69322. }
  69323. else
  69324. {
  69325. /* vb->value_len == 0, empty value (e.g. empty string) */
  69326. vb->value = NULL;
  69327. 8035894: 616b str r3, [r5, #20]
  69328. snmp_varbind_tail_add(&msg_ps->outvb, vb);
  69329. 8035896: 4878 ldr r0, [pc, #480] ; (8035a78 <snmp_msg_event+0x5a8>)
  69330. 8035898: 4629 mov r1, r5
  69331. 803589a: f7ff fe0d bl 80354b8 <snmp_varbind_tail_add>
  69332. msg_ps->state = SNMP_MSG_SEARCH_OBJ;
  69333. 803589e: 2301 movs r3, #1
  69334. 80358a0: f884 305a strb.w r3, [r4, #90] ; 0x5a
  69335. msg_ps->vb_idx += 1;
  69336. 80358a4: f894 30f8 ldrb.w r3, [r4, #248] ; 0xf8
  69337. 80358a8: 3301 adds r3, #1
  69338. 80358aa: f884 30f8 strb.w r3, [r4, #248] ; 0xf8
  69339. 80358ae: e003 b.n 80358b8 <snmp_msg_event+0x3e8>
  69340. }
  69341. }
  69342. else
  69343. {
  69344. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_event: couldn't allocate outvb space\n"));
  69345. snmp_error_response(msg_ps,SNMP_ES_TOOBIG);
  69346. 80358b0: 4872 ldr r0, [pc, #456] ; (8035a7c <snmp_msg_event+0x5ac>)
  69347. 80358b2: 2101 movs r1, #1
  69348. 80358b4: f7ff fdb5 bl 8035422 <snmp_error_response>
  69349. }
  69350. else
  69351. {
  69352. mn = NULL;
  69353. }
  69354. if (mn == NULL)
  69355. 80358b8: b936 cbnz r6, 80358c8 <snmp_msg_event+0x3f8>
  69356. {
  69357. /* mn == NULL, noSuchName */
  69358. snmp_error_response(msg_ps,SNMP_ES_NOSUCHNAME);
  69359. 80358ba: 4870 ldr r0, [pc, #448] ; (8035a7c <snmp_msg_event+0x5ac>)
  69360. 80358bc: 2102 movs r1, #2
  69361. 80358be: f7ff fdb0 bl 8035422 <snmp_error_response>
  69362. 80358c2: e001 b.n 80358c8 <snmp_msg_event+0x3f8>
  69363. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_event: no outvb space\n"));
  69364. snmp_error_response(msg_ps,SNMP_ES_TOOBIG);
  69365. }
  69366. }
  69367. while ((msg_ps->state == SNMP_MSG_SEARCH_OBJ) &&
  69368. 80358c4: 4c6d ldr r4, [pc, #436] ; (8035a7c <snmp_msg_event+0x5ac>)
  69369. msg_ps->vb_ptr = msg_ps->vb_ptr->next;
  69370. }
  69371. /** test object identifier for .iso.org.dod.internet prefix */
  69372. if (snmp_iso_prefix_tst(msg_ps->vb_ptr->ident_len, msg_ps->vb_ptr->ident))
  69373. {
  69374. mn = snmp_search_tree((struct mib_node*)&internet, msg_ps->vb_ptr->ident_len - 4,
  69375. 80358c6: 46e8 mov r8, sp
  69376. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_event: no outvb space\n"));
  69377. snmp_error_response(msg_ps,SNMP_ES_TOOBIG);
  69378. }
  69379. }
  69380. while ((msg_ps->state == SNMP_MSG_SEARCH_OBJ) &&
  69381. 80358c8: f894 305a ldrb.w r3, [r4, #90] ; 0x5a
  69382. 80358cc: 2b01 cmp r3, #1
  69383. 80358ce: f040 8196 bne.w 8035bfe <snmp_msg_event+0x72e>
  69384. (msg_ps->vb_idx < msg_ps->invb.count))
  69385. 80358d2: f894 30f8 ldrb.w r3, [r4, #248] ; 0xf8
  69386. 80358d6: f894 2108 ldrb.w r2, [r4, #264] ; 0x108
  69387. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_event: no outvb space\n"));
  69388. snmp_error_response(msg_ps,SNMP_ES_TOOBIG);
  69389. }
  69390. }
  69391. while ((msg_ps->state == SNMP_MSG_SEARCH_OBJ) &&
  69392. 80358da: 4293 cmp r3, r2
  69393. 80358dc: f4ff af5f bcc.w 803579e <snmp_msg_event+0x2ce>
  69394. 80358e0: e17c b.n 8035bdc <snmp_msg_event+0x70c>
  69395. }
  69396. else if (msg_ps->rt == SNMP_ASN1_PDU_GET_REQ)
  69397. {
  69398. snmp_msg_get_event(request_id, msg_ps);
  69399. }
  69400. else if(msg_ps->rt == SNMP_ASN1_PDU_SET_REQ)
  69401. 80358e2: 2e03 cmp r6, #3
  69402. 80358e4: f040 818b bne.w 8035bfe <snmp_msg_event+0x72e>
  69403. static void
  69404. snmp_msg_set_event(u8_t request_id, struct snmp_msg_pstat *msg_ps)
  69405. {
  69406. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_set_event: msg_ps->state==%"U16_F"\n",(u16_t)msg_ps->state));
  69407. if (msg_ps->state == SNMP_MSG_EXTERNAL_GET_OBJDEF)
  69408. 80358e8: f894 305a ldrb.w r3, [r4, #90] ; 0x5a
  69409. 80358ec: 2b07 cmp r3, #7
  69410. 80358ee: d11b bne.n 8035928 <snmp_msg_event+0x458>
  69411. {
  69412. struct mib_external_node *en;
  69413. struct snmp_name_ptr np;
  69414. /* get_object_def() answer*/
  69415. en = msg_ps->ext_mib_node;
  69416. 80358f0: 6de6 ldr r6, [r4, #92] ; 0x5c
  69417. np = msg_ps->ext_name_ptr;
  69418. 80358f2: f894 9060 ldrb.w r9, [r4, #96] ; 0x60
  69419. 80358f6: f8d4 8064 ldr.w r8, [r4, #100] ; 0x64
  69420. /* translate answer into a known lifeform */
  69421. en->get_object_def_a(request_id, np.ident_len, np.ident, &msg_ps->ext_object_def);
  69422. 80358fa: 6bb7 ldr r7, [r6, #56] ; 0x38
  69423. 80358fc: 4649 mov r1, r9
  69424. 80358fe: 4642 mov r2, r8
  69425. 8035900: f104 0368 add.w r3, r4, #104 ; 0x68
  69426. 8035904: 47b8 blx r7
  69427. if (msg_ps->ext_object_def.instance != MIB_OBJECT_NONE)
  69428. 8035906: f894 0068 ldrb.w r0, [r4, #104] ; 0x68
  69429. 803590a: b140 cbz r0, 803591e <snmp_msg_event+0x44e>
  69430. {
  69431. msg_ps->state = SNMP_MSG_EXTERNAL_SET_TEST;
  69432. 803590c: 2309 movs r3, #9
  69433. 803590e: f884 305a strb.w r3, [r4, #90] ; 0x5a
  69434. en->set_test_q(request_id, &msg_ps->ext_object_def);
  69435. 8035912: 6b33 ldr r3, [r6, #48] ; 0x30
  69436. 8035914: 4628 mov r0, r5
  69437. 8035916: f104 0168 add.w r1, r4, #104 ; 0x68
  69438. 803591a: 4798 blx r3
  69439. 803591c: e0d5 b.n 8035aca <snmp_msg_event+0x5fa>
  69440. }
  69441. else
  69442. {
  69443. en->get_object_def_pc(request_id, np.ident_len, np.ident);
  69444. 803591e: 6cb3 ldr r3, [r6, #72] ; 0x48
  69445. 8035920: 4649 mov r1, r9
  69446. 8035922: 4642 mov r2, r8
  69447. 8035924: 4798 blx r3
  69448. 8035926: e023 b.n 8035970 <snmp_msg_event+0x4a0>
  69449. /* search failed, object id points to unknown object (nosuchname) */
  69450. snmp_error_response(msg_ps,SNMP_ES_NOSUCHNAME);
  69451. }
  69452. }
  69453. else if (msg_ps->state == SNMP_MSG_EXTERNAL_SET_TEST)
  69454. 8035928: 2b09 cmp r3, #9
  69455. 803592a: d124 bne.n 8035976 <snmp_msg_event+0x4a6>
  69456. struct mib_external_node *en;
  69457. /* set_test() answer*/
  69458. en = msg_ps->ext_mib_node;
  69459. if (msg_ps->ext_object_def.access & MIB_ACCESS_WRITE)
  69460. 803592c: f894 3069 ldrb.w r3, [r4, #105] ; 0x69
  69461. else if (msg_ps->state == SNMP_MSG_EXTERNAL_SET_TEST)
  69462. {
  69463. struct mib_external_node *en;
  69464. /* set_test() answer*/
  69465. en = msg_ps->ext_mib_node;
  69466. 8035930: 6de5 ldr r5, [r4, #92] ; 0x5c
  69467. if (msg_ps->ext_object_def.access & MIB_ACCESS_WRITE)
  69468. 8035932: f003 0302 and.w r3, r3, #2
  69469. 8035936: b2db uxtb r3, r3
  69470. 8035938: b1b3 cbz r3, 8035968 <snmp_msg_event+0x498>
  69471. {
  69472. if ((msg_ps->ext_object_def.asn_type == msg_ps->vb_ptr->value_type) &&
  69473. 803593a: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  69474. 803593e: f894 106a ldrb.w r1, [r4, #106] ; 0x6a
  69475. 8035942: 7c1a ldrb r2, [r3, #16]
  69476. 8035944: 4291 cmp r1, r2
  69477. 8035946: d108 bne.n 803595a <snmp_msg_event+0x48a>
  69478. (en->set_test_a(request_id,&msg_ps->ext_object_def,
  69479. 8035948: 7c5a ldrb r2, [r3, #17]
  69480. 803594a: 6c2e ldr r6, [r5, #64] ; 0x40
  69481. 803594c: 695b ldr r3, [r3, #20]
  69482. 803594e: f104 0168 add.w r1, r4, #104 ; 0x68
  69483. 8035952: 47b0 blx r6
  69484. /* set_test() answer*/
  69485. en = msg_ps->ext_mib_node;
  69486. if (msg_ps->ext_object_def.access & MIB_ACCESS_WRITE)
  69487. {
  69488. if ((msg_ps->ext_object_def.asn_type == msg_ps->vb_ptr->value_type) &&
  69489. 8035954: b108 cbz r0, 803595a <snmp_msg_event+0x48a>
  69490. (en->set_test_a(request_id,&msg_ps->ext_object_def,
  69491. msg_ps->vb_ptr->value_len,msg_ps->vb_ptr->value) != 0))
  69492. {
  69493. msg_ps->state = SNMP_MSG_SEARCH_OBJ;
  69494. 8035956: 2301 movs r3, #1
  69495. 8035958: e040 b.n 80359dc <snmp_msg_event+0x50c>
  69496. msg_ps->vb_idx += 1;
  69497. }
  69498. else
  69499. {
  69500. en->set_test_pc(request_id,&msg_ps->ext_object_def);
  69501. 803595a: 2000 movs r0, #0
  69502. 803595c: 4948 ldr r1, [pc, #288] ; (8035a80 <snmp_msg_event+0x5b0>)
  69503. 803595e: 6d2b ldr r3, [r5, #80] ; 0x50
  69504. 8035960: 4798 blx r3
  69505. /* bad value */
  69506. snmp_error_response(msg_ps,SNMP_ES_BADVALUE);
  69507. 8035962: 4846 ldr r0, [pc, #280] ; (8035a7c <snmp_msg_event+0x5ac>)
  69508. 8035964: 2103 movs r1, #3
  69509. 8035966: e029 b.n 80359bc <snmp_msg_event+0x4ec>
  69510. }
  69511. }
  69512. else
  69513. {
  69514. en->set_test_pc(request_id,&msg_ps->ext_object_def);
  69515. 8035968: 6d2b ldr r3, [r5, #80] ; 0x50
  69516. 803596a: f104 0168 add.w r1, r4, #104 ; 0x68
  69517. 803596e: 4798 blx r3
  69518. /* object not available for set */
  69519. snmp_error_response(msg_ps,SNMP_ES_NOSUCHNAME);
  69520. 8035970: 4620 mov r0, r4
  69521. 8035972: 2102 movs r1, #2
  69522. 8035974: e022 b.n 80359bc <snmp_msg_event+0x4ec>
  69523. }
  69524. }
  69525. else if (msg_ps->state == SNMP_MSG_EXTERNAL_GET_OBJDEF_S)
  69526. 8035976: 2b0a cmp r3, #10
  69527. 8035978: d123 bne.n 80359c2 <snmp_msg_event+0x4f2>
  69528. {
  69529. struct mib_external_node *en;
  69530. struct snmp_name_ptr np;
  69531. /* get_object_def() answer*/
  69532. en = msg_ps->ext_mib_node;
  69533. 803597a: 6de6 ldr r6, [r4, #92] ; 0x5c
  69534. np = msg_ps->ext_name_ptr;
  69535. 803597c: f894 9060 ldrb.w r9, [r4, #96] ; 0x60
  69536. 8035980: f8d4 8064 ldr.w r8, [r4, #100] ; 0x64
  69537. /* translate answer into a known lifeform */
  69538. en->get_object_def_a(request_id, np.ident_len, np.ident, &msg_ps->ext_object_def);
  69539. 8035984: 6bb7 ldr r7, [r6, #56] ; 0x38
  69540. 8035986: 4649 mov r1, r9
  69541. 8035988: 4642 mov r2, r8
  69542. 803598a: f104 0368 add.w r3, r4, #104 ; 0x68
  69543. 803598e: 47b8 blx r7
  69544. if (msg_ps->ext_object_def.instance != MIB_OBJECT_NONE)
  69545. 8035990: f894 0068 ldrb.w r0, [r4, #104] ; 0x68
  69546. 8035994: b160 cbz r0, 80359b0 <snmp_msg_event+0x4e0>
  69547. {
  69548. msg_ps->state = SNMP_MSG_EXTERNAL_SET_VALUE;
  69549. 8035996: 230b movs r3, #11
  69550. 8035998: f884 305a strb.w r3, [r4, #90] ; 0x5a
  69551. en->set_value_q(request_id, &msg_ps->ext_object_def,
  69552. msg_ps->vb_ptr->value_len,msg_ps->vb_ptr->value);
  69553. 803599c: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  69554. /* translate answer into a known lifeform */
  69555. en->get_object_def_a(request_id, np.ident_len, np.ident, &msg_ps->ext_object_def);
  69556. if (msg_ps->ext_object_def.instance != MIB_OBJECT_NONE)
  69557. {
  69558. msg_ps->state = SNMP_MSG_EXTERNAL_SET_VALUE;
  69559. en->set_value_q(request_id, &msg_ps->ext_object_def,
  69560. 80359a0: 6b76 ldr r6, [r6, #52] ; 0x34
  69561. 80359a2: 7c5a ldrb r2, [r3, #17]
  69562. 80359a4: 695b ldr r3, [r3, #20]
  69563. 80359a6: 4628 mov r0, r5
  69564. 80359a8: f104 0168 add.w r1, r4, #104 ; 0x68
  69565. 80359ac: 47b0 blx r6
  69566. 80359ae: e08c b.n 8035aca <snmp_msg_event+0x5fa>
  69567. msg_ps->vb_ptr->value_len,msg_ps->vb_ptr->value);
  69568. }
  69569. else
  69570. {
  69571. en->get_object_def_pc(request_id, np.ident_len, np.ident);
  69572. 80359b0: 4649 mov r1, r9
  69573. 80359b2: 6cb3 ldr r3, [r6, #72] ; 0x48
  69574. 80359b4: 4642 mov r2, r8
  69575. 80359b6: 4798 blx r3
  69576. /* set_value failed, object has disappeared for some odd reason?? */
  69577. snmp_error_response(msg_ps,SNMP_ES_GENERROR);
  69578. 80359b8: 4620 mov r0, r4
  69579. 80359ba: 2105 movs r1, #5
  69580. 80359bc: f7ff fd31 bl 8035422 <snmp_error_response>
  69581. 80359c0: e083 b.n 8035aca <snmp_msg_event+0x5fa>
  69582. }
  69583. }
  69584. else if (msg_ps->state == SNMP_MSG_EXTERNAL_SET_VALUE)
  69585. 80359c2: 2b0b cmp r3, #11
  69586. 80359c4: f040 8081 bne.w 8035aca <snmp_msg_event+0x5fa>
  69587. struct mib_external_node *en;
  69588. /** set_value_a() */
  69589. en = msg_ps->ext_mib_node;
  69590. en->set_value_a(request_id, &msg_ps->ext_object_def,
  69591. msg_ps->vb_ptr->value_len, msg_ps->vb_ptr->value);
  69592. 80359c8: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  69593. {
  69594. struct mib_external_node *en;
  69595. /** set_value_a() */
  69596. en = msg_ps->ext_mib_node;
  69597. en->set_value_a(request_id, &msg_ps->ext_object_def,
  69598. 80359cc: 6de2 ldr r2, [r4, #92] ; 0x5c
  69599. 80359ce: f104 0168 add.w r1, r4, #104 ; 0x68
  69600. 80359d2: 6c55 ldr r5, [r2, #68] ; 0x44
  69601. 80359d4: 7c5a ldrb r2, [r3, #17]
  69602. 80359d6: 695b ldr r3, [r3, #20]
  69603. 80359d8: 47a8 blx r5
  69604. msg_ps->vb_ptr->value_len, msg_ps->vb_ptr->value);
  69605. /** @todo use set_value_pc() if toobig */
  69606. msg_ps->state = SNMP_MSG_INTERNAL_SET_VALUE;
  69607. 80359da: 2306 movs r3, #6
  69608. 80359dc: f884 305a strb.w r3, [r4, #90] ; 0x5a
  69609. msg_ps->vb_idx += 1;
  69610. 80359e0: f894 30f8 ldrb.w r3, [r4, #248] ; 0xf8
  69611. 80359e4: 3301 adds r3, #1
  69612. 80359e6: f884 30f8 strb.w r3, [r4, #248] ; 0xf8
  69613. 80359ea: e06e b.n 8035aca <snmp_msg_event+0x5fa>
  69614. (msg_ps->vb_idx < msg_ps->invb.count))
  69615. {
  69616. struct mib_node *mn;
  69617. struct snmp_name_ptr np;
  69618. if (msg_ps->vb_idx == 0)
  69619. 80359ec: b912 cbnz r2, 80359f4 <snmp_msg_event+0x524>
  69620. {
  69621. msg_ps->vb_ptr = msg_ps->invb.head;
  69622. 80359ee: f8d4 3100 ldr.w r3, [r4, #256] ; 0x100
  69623. 80359f2: e002 b.n 80359fa <snmp_msg_event+0x52a>
  69624. }
  69625. else
  69626. {
  69627. msg_ps->vb_ptr = msg_ps->vb_ptr->next;
  69628. 80359f4: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  69629. 80359f8: 681b ldr r3, [r3, #0]
  69630. 80359fa: f8c4 30fc str.w r3, [r4, #252] ; 0xfc
  69631. }
  69632. /** test object identifier for .iso.org.dod.internet prefix */
  69633. if (snmp_iso_prefix_tst(msg_ps->vb_ptr->ident_len, msg_ps->vb_ptr->ident))
  69634. 80359fe: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  69635. 8035a02: 7a18 ldrb r0, [r3, #8]
  69636. 8035a04: 68d9 ldr r1, [r3, #12]
  69637. 8035a06: f7ff fc47 bl 8035298 <snmp_iso_prefix_tst>
  69638. 8035a0a: 2800 cmp r0, #0
  69639. 8035a0c: d058 beq.n 8035ac0 <snmp_msg_event+0x5f0>
  69640. {
  69641. mn = snmp_search_tree((struct mib_node*)&internet, msg_ps->vb_ptr->ident_len - 4,
  69642. 8035a0e: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  69643. 8035a12: 4817 ldr r0, [pc, #92] ; (8035a70 <snmp_msg_event+0x5a0>)
  69644. 8035a14: 7a19 ldrb r1, [r3, #8]
  69645. 8035a16: 68da ldr r2, [r3, #12]
  69646. 8035a18: 3904 subs r1, #4
  69647. 8035a1a: b2c9 uxtb r1, r1
  69648. 8035a1c: 3210 adds r2, #16
  69649. 8035a1e: 466b mov r3, sp
  69650. 8035a20: f7ff f9ec bl 8034dfc <snmp_search_tree>
  69651. msg_ps->vb_ptr->ident + 4, &np);
  69652. if (mn != NULL)
  69653. 8035a24: 4605 mov r5, r0
  69654. 8035a26: 2800 cmp r0, #0
  69655. 8035a28: d04a beq.n 8035ac0 <snmp_msg_event+0x5f0>
  69656. {
  69657. if (mn->node_type == MIB_NODE_EX)
  69658. 8035a2a: 7c03 ldrb r3, [r0, #16]
  69659. 8035a2c: 2b05 cmp r3, #5
  69660. 8035a2e: d110 bne.n 8035a52 <snmp_msg_event+0x582>
  69661. /* external object */
  69662. struct mib_external_node *en = (struct mib_external_node*)mn;
  69663. msg_ps->state = SNMP_MSG_EXTERNAL_GET_OBJDEF;
  69664. /* save en && args in msg_ps!! */
  69665. msg_ps->ext_mib_node = en;
  69666. 8035a30: 65e0 str r0, [r4, #92] ; 0x5c
  69667. if (mn->node_type == MIB_NODE_EX)
  69668. {
  69669. /* external object */
  69670. struct mib_external_node *en = (struct mib_external_node*)mn;
  69671. msg_ps->state = SNMP_MSG_EXTERNAL_GET_OBJDEF;
  69672. 8035a32: 2307 movs r3, #7
  69673. /* save en && args in msg_ps!! */
  69674. msg_ps->ext_mib_node = en;
  69675. msg_ps->ext_name_ptr = np;
  69676. 8035a34: e896 0003 ldmia.w r6, {r0, r1}
  69677. if (mn->node_type == MIB_NODE_EX)
  69678. {
  69679. /* external object */
  69680. struct mib_external_node *en = (struct mib_external_node*)mn;
  69681. msg_ps->state = SNMP_MSG_EXTERNAL_GET_OBJDEF;
  69682. 8035a38: f884 305a strb.w r3, [r4, #90] ; 0x5a
  69683. /* save en && args in msg_ps!! */
  69684. msg_ps->ext_mib_node = en;
  69685. msg_ps->ext_name_ptr = np;
  69686. 8035a3c: 4b0d ldr r3, [pc, #52] ; (8035a74 <snmp_msg_event+0x5a4>)
  69687. en->get_object_def_q(en->addr_inf, request_id, np.ident_len, np.ident);
  69688. 8035a3e: f89d 2000 ldrb.w r2, [sp]
  69689. struct mib_external_node *en = (struct mib_external_node*)mn;
  69690. msg_ps->state = SNMP_MSG_EXTERNAL_GET_OBJDEF;
  69691. /* save en && args in msg_ps!! */
  69692. msg_ps->ext_mib_node = en;
  69693. msg_ps->ext_name_ptr = np;
  69694. 8035a42: e883 0003 stmia.w r3, {r0, r1}
  69695. en->get_object_def_q(en->addr_inf, request_id, np.ident_len, np.ident);
  69696. 8035a46: 2100 movs r1, #0
  69697. 8035a48: 6aaf ldr r7, [r5, #40] ; 0x28
  69698. 8035a4a: 6968 ldr r0, [r5, #20]
  69699. 8035a4c: 9b01 ldr r3, [sp, #4]
  69700. 8035a4e: 47b8 blx r7
  69701. 8035a50: e03d b.n 8035ace <snmp_msg_event+0x5fe>
  69702. else
  69703. {
  69704. /* internal object */
  69705. struct obj_def object_def;
  69706. msg_ps->state = SNMP_MSG_INTERNAL_GET_OBJDEF;
  69707. 8035a52: 2702 movs r7, #2
  69708. 8035a54: f884 705a strb.w r7, [r4, #90] ; 0x5a
  69709. mn->get_object_def(np.ident_len, np.ident, &object_def);
  69710. 8035a58: 6803 ldr r3, [r0, #0]
  69711. 8035a5a: 9901 ldr r1, [sp, #4]
  69712. 8035a5c: f89d 0000 ldrb.w r0, [sp]
  69713. 8035a60: aa02 add r2, sp, #8
  69714. 8035a62: 4798 blx r3
  69715. if (object_def.instance != MIB_OBJECT_NONE)
  69716. 8035a64: f89d 3008 ldrb.w r3, [sp, #8]
  69717. 8035a68: 2b00 cmp r3, #0
  69718. 8035a6a: f040 80b9 bne.w 8035be0 <snmp_msg_event+0x710>
  69719. 8035a6e: e027 b.n 8035ac0 <snmp_msg_event+0x5f0>
  69720. 8035a70: 08044f70 .word 0x08044f70
  69721. 8035a74: 2000ffb4 .word 0x2000ffb4
  69722. 8035a78: 20010060 .word 0x20010060
  69723. 8035a7c: 2000ff54 .word 0x2000ff54
  69724. 8035a80: 2000ffbc .word 0x2000ffbc
  69725. {
  69726. msg_ps->state = SNMP_MSG_INTERNAL_SET_TEST;
  69727. if (object_def.access & MIB_ACCESS_WRITE)
  69728. {
  69729. if ((object_def.asn_type == msg_ps->vb_ptr->value_type) &&
  69730. 8035a84: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  69731. 8035a88: f89d 100a ldrb.w r1, [sp, #10]
  69732. 8035a8c: 7c1a ldrb r2, [r3, #16]
  69733. 8035a8e: 4291 cmp r1, r2
  69734. 8035a90: d10e bne.n 8035ab0 <snmp_msg_event+0x5e0>
  69735. (mn->set_test(&object_def,msg_ps->vb_ptr->value_len,msg_ps->vb_ptr->value) != 0))
  69736. 8035a92: 68af ldr r7, [r5, #8]
  69737. 8035a94: 7c59 ldrb r1, [r3, #17]
  69738. 8035a96: 695a ldr r2, [r3, #20]
  69739. 8035a98: a802 add r0, sp, #8
  69740. 8035a9a: 47b8 blx r7
  69741. {
  69742. msg_ps->state = SNMP_MSG_INTERNAL_SET_TEST;
  69743. if (object_def.access & MIB_ACCESS_WRITE)
  69744. {
  69745. if ((object_def.asn_type == msg_ps->vb_ptr->value_type) &&
  69746. 8035a9c: b140 cbz r0, 8035ab0 <snmp_msg_event+0x5e0>
  69747. (mn->set_test(&object_def,msg_ps->vb_ptr->value_len,msg_ps->vb_ptr->value) != 0))
  69748. {
  69749. msg_ps->state = SNMP_MSG_SEARCH_OBJ;
  69750. 8035a9e: 2301 movs r3, #1
  69751. 8035aa0: f884 305a strb.w r3, [r4, #90] ; 0x5a
  69752. msg_ps->vb_idx += 1;
  69753. 8035aa4: f894 30f8 ldrb.w r3, [r4, #248] ; 0xf8
  69754. 8035aa8: 3301 adds r3, #1
  69755. 8035aaa: f884 30f8 strb.w r3, [r4, #248] ; 0xf8
  69756. 8035aae: e006 b.n 8035abe <snmp_msg_event+0x5ee>
  69757. }
  69758. else
  69759. {
  69760. /* bad value */
  69761. snmp_error_response(msg_ps,SNMP_ES_BADVALUE);
  69762. 8035ab0: 4854 ldr r0, [pc, #336] ; (8035c04 <snmp_msg_event+0x734>)
  69763. 8035ab2: 2103 movs r1, #3
  69764. 8035ab4: e001 b.n 8035aba <snmp_msg_event+0x5ea>
  69765. }
  69766. }
  69767. else
  69768. {
  69769. /* object not available for set */
  69770. snmp_error_response(msg_ps,SNMP_ES_NOSUCHNAME);
  69771. 8035ab6: 4853 ldr r0, [pc, #332] ; (8035c04 <snmp_msg_event+0x734>)
  69772. 8035ab8: 4639 mov r1, r7
  69773. 8035aba: f7ff fcb2 bl 8035422 <snmp_error_response>
  69774. }
  69775. else
  69776. {
  69777. mn = NULL;
  69778. }
  69779. if (mn == NULL)
  69780. 8035abe: b935 cbnz r5, 8035ace <snmp_msg_event+0x5fe>
  69781. {
  69782. /* mn == NULL, noSuchName */
  69783. snmp_error_response(msg_ps,SNMP_ES_NOSUCHNAME);
  69784. 8035ac0: 4850 ldr r0, [pc, #320] ; (8035c04 <snmp_msg_event+0x734>)
  69785. 8035ac2: 2102 movs r1, #2
  69786. 8035ac4: f7ff fcad bl 8035422 <snmp_error_response>
  69787. 8035ac8: e001 b.n 8035ace <snmp_msg_event+0x5fe>
  69788. msg_ps->state = SNMP_MSG_INTERNAL_SET_VALUE;
  69789. msg_ps->vb_idx += 1;
  69790. }
  69791. /* test all values before setting */
  69792. while ((msg_ps->state == SNMP_MSG_SEARCH_OBJ) &&
  69793. 8035aca: 4c4e ldr r4, [pc, #312] ; (8035c04 <snmp_msg_event+0x734>)
  69794. msg_ps->vb_ptr = msg_ps->vb_ptr->next;
  69795. }
  69796. /** test object identifier for .iso.org.dod.internet prefix */
  69797. if (snmp_iso_prefix_tst(msg_ps->vb_ptr->ident_len, msg_ps->vb_ptr->ident))
  69798. {
  69799. mn = snmp_search_tree((struct mib_node*)&internet, msg_ps->vb_ptr->ident_len - 4,
  69800. 8035acc: 466e mov r6, sp
  69801. msg_ps->state = SNMP_MSG_INTERNAL_SET_VALUE;
  69802. msg_ps->vb_idx += 1;
  69803. }
  69804. /* test all values before setting */
  69805. while ((msg_ps->state == SNMP_MSG_SEARCH_OBJ) &&
  69806. 8035ace: f894 205a ldrb.w r2, [r4, #90] ; 0x5a
  69807. 8035ad2: 4b4c ldr r3, [pc, #304] ; (8035c04 <snmp_msg_event+0x734>)
  69808. 8035ad4: 2a01 cmp r2, #1
  69809. 8035ad6: d151 bne.n 8035b7c <snmp_msg_event+0x6ac>
  69810. (msg_ps->vb_idx < msg_ps->invb.count))
  69811. 8035ad8: f894 20f8 ldrb.w r2, [r4, #248] ; 0xf8
  69812. 8035adc: f894 1108 ldrb.w r1, [r4, #264] ; 0x108
  69813. msg_ps->state = SNMP_MSG_INTERNAL_SET_VALUE;
  69814. msg_ps->vb_idx += 1;
  69815. }
  69816. /* test all values before setting */
  69817. while ((msg_ps->state == SNMP_MSG_SEARCH_OBJ) &&
  69818. 8035ae0: 428a cmp r2, r1
  69819. 8035ae2: d383 bcc.n 80359ec <snmp_msg_event+0x51c>
  69820. 8035ae4: e088 b.n 8035bf8 <snmp_msg_event+0x728>
  69821. }
  69822. if ((msg_ps->state == SNMP_MSG_SEARCH_OBJ) &&
  69823. (msg_ps->vb_idx == msg_ps->invb.count))
  69824. {
  69825. msg_ps->vb_idx = 0;
  69826. 8035ae6: 2200 movs r2, #0
  69827. 8035ae8: f883 20f8 strb.w r2, [r3, #248] ; 0xf8
  69828. msg_ps->state = SNMP_MSG_INTERNAL_SET_VALUE;
  69829. 8035aec: 2206 movs r2, #6
  69830. 8035aee: f883 205a strb.w r2, [r3, #90] ; 0x5a
  69831. 8035af2: e043 b.n 8035b7c <snmp_msg_event+0x6ac>
  69832. (msg_ps->vb_idx < msg_ps->invb.count))
  69833. {
  69834. struct mib_node *mn;
  69835. struct snmp_name_ptr np;
  69836. if (msg_ps->vb_idx == 0)
  69837. 8035af4: b913 cbnz r3, 8035afc <snmp_msg_event+0x62c>
  69838. {
  69839. msg_ps->vb_ptr = msg_ps->invb.head;
  69840. 8035af6: f8d4 3100 ldr.w r3, [r4, #256] ; 0x100
  69841. 8035afa: e002 b.n 8035b02 <snmp_msg_event+0x632>
  69842. }
  69843. else
  69844. {
  69845. msg_ps->vb_ptr = msg_ps->vb_ptr->next;
  69846. 8035afc: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  69847. 8035b00: 681b ldr r3, [r3, #0]
  69848. 8035b02: f8c4 30fc str.w r3, [r4, #252] ; 0xfc
  69849. }
  69850. /* skip iso prefix test, was done previously while settesting() */
  69851. mn = snmp_search_tree((struct mib_node*)&internet, msg_ps->vb_ptr->ident_len - 4,
  69852. 8035b06: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  69853. 8035b0a: 483f ldr r0, [pc, #252] ; (8035c08 <snmp_msg_event+0x738>)
  69854. 8035b0c: 7a19 ldrb r1, [r3, #8]
  69855. 8035b0e: 68da ldr r2, [r3, #12]
  69856. 8035b10: 3904 subs r1, #4
  69857. 8035b12: b2c9 uxtb r1, r1
  69858. 8035b14: 3210 adds r2, #16
  69859. 8035b16: 466b mov r3, sp
  69860. 8035b18: f7ff f970 bl 8034dfc <snmp_search_tree>
  69861. msg_ps->vb_ptr->ident + 4, &np);
  69862. /* check if object is still available
  69863. (e.g. external hot-plug thingy present?) */
  69864. if (mn != NULL)
  69865. 8035b1c: 4605 mov r5, r0
  69866. 8035b1e: 2800 cmp r0, #0
  69867. 8035b20: d02e beq.n 8035b80 <snmp_msg_event+0x6b0>
  69868. {
  69869. if (mn->node_type == MIB_NODE_EX)
  69870. 8035b22: 7c03 ldrb r3, [r0, #16]
  69871. 8035b24: 2b05 cmp r3, #5
  69872. 8035b26: d110 bne.n 8035b4a <snmp_msg_event+0x67a>
  69873. /* external object */
  69874. struct mib_external_node *en = (struct mib_external_node*)mn;
  69875. msg_ps->state = SNMP_MSG_EXTERNAL_GET_OBJDEF_S;
  69876. /* save en && args in msg_ps!! */
  69877. msg_ps->ext_mib_node = en;
  69878. 8035b28: 65e0 str r0, [r4, #92] ; 0x5c
  69879. if (mn->node_type == MIB_NODE_EX)
  69880. {
  69881. /* external object */
  69882. struct mib_external_node *en = (struct mib_external_node*)mn;
  69883. msg_ps->state = SNMP_MSG_EXTERNAL_GET_OBJDEF_S;
  69884. 8035b2a: 230a movs r3, #10
  69885. /* save en && args in msg_ps!! */
  69886. msg_ps->ext_mib_node = en;
  69887. msg_ps->ext_name_ptr = np;
  69888. 8035b2c: e896 0003 ldmia.w r6, {r0, r1}
  69889. if (mn->node_type == MIB_NODE_EX)
  69890. {
  69891. /* external object */
  69892. struct mib_external_node *en = (struct mib_external_node*)mn;
  69893. msg_ps->state = SNMP_MSG_EXTERNAL_GET_OBJDEF_S;
  69894. 8035b30: f884 305a strb.w r3, [r4, #90] ; 0x5a
  69895. /* save en && args in msg_ps!! */
  69896. msg_ps->ext_mib_node = en;
  69897. msg_ps->ext_name_ptr = np;
  69898. 8035b34: 4b35 ldr r3, [pc, #212] ; (8035c0c <snmp_msg_event+0x73c>)
  69899. en->get_object_def_q(en->addr_inf, request_id, np.ident_len, np.ident);
  69900. 8035b36: f89d 2000 ldrb.w r2, [sp]
  69901. struct mib_external_node *en = (struct mib_external_node*)mn;
  69902. msg_ps->state = SNMP_MSG_EXTERNAL_GET_OBJDEF_S;
  69903. /* save en && args in msg_ps!! */
  69904. msg_ps->ext_mib_node = en;
  69905. msg_ps->ext_name_ptr = np;
  69906. 8035b3a: e883 0003 stmia.w r3, {r0, r1}
  69907. en->get_object_def_q(en->addr_inf, request_id, np.ident_len, np.ident);
  69908. 8035b3e: 2100 movs r1, #0
  69909. 8035b40: 6aaf ldr r7, [r5, #40] ; 0x28
  69910. 8035b42: 6968 ldr r0, [r5, #20]
  69911. 8035b44: 9b01 ldr r3, [sp, #4]
  69912. 8035b46: 47b8 blx r7
  69913. 8035b48: e01a b.n 8035b80 <snmp_msg_event+0x6b0>
  69914. else
  69915. {
  69916. /* internal object */
  69917. struct obj_def object_def;
  69918. msg_ps->state = SNMP_MSG_INTERNAL_GET_OBJDEF_S;
  69919. 8035b4a: 2305 movs r3, #5
  69920. 8035b4c: f884 305a strb.w r3, [r4, #90] ; 0x5a
  69921. mn->get_object_def(np.ident_len, np.ident, &object_def);
  69922. 8035b50: 6803 ldr r3, [r0, #0]
  69923. 8035b52: 9901 ldr r1, [sp, #4]
  69924. 8035b54: f89d 0000 ldrb.w r0, [sp]
  69925. 8035b58: aa02 add r2, sp, #8
  69926. 8035b5a: 4798 blx r3
  69927. msg_ps->state = SNMP_MSG_INTERNAL_SET_VALUE;
  69928. 8035b5c: 2306 movs r3, #6
  69929. 8035b5e: f884 305a strb.w r3, [r4, #90] ; 0x5a
  69930. mn->set_value(&object_def,msg_ps->vb_ptr->value_len,msg_ps->vb_ptr->value);
  69931. 8035b62: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  69932. 8035b66: 68ed ldr r5, [r5, #12]
  69933. 8035b68: 7c59 ldrb r1, [r3, #17]
  69934. 8035b6a: 695a ldr r2, [r3, #20]
  69935. 8035b6c: a802 add r0, sp, #8
  69936. 8035b6e: 47a8 blx r5
  69937. msg_ps->vb_idx += 1;
  69938. 8035b70: f894 30f8 ldrb.w r3, [r4, #248] ; 0xf8
  69939. 8035b74: 3301 adds r3, #1
  69940. 8035b76: f884 30f8 strb.w r3, [r4, #248] ; 0xf8
  69941. 8035b7a: e001 b.n 8035b80 <snmp_msg_event+0x6b0>
  69942. msg_ps->vb_idx = 0;
  69943. msg_ps->state = SNMP_MSG_INTERNAL_SET_VALUE;
  69944. }
  69945. /* set all values "atomically" (be as "atomic" as possible) */
  69946. while ((msg_ps->state == SNMP_MSG_INTERNAL_SET_VALUE) &&
  69947. 8035b7c: 4c21 ldr r4, [pc, #132] ; (8035c04 <snmp_msg_event+0x734>)
  69948. else
  69949. {
  69950. msg_ps->vb_ptr = msg_ps->vb_ptr->next;
  69951. }
  69952. /* skip iso prefix test, was done previously while settesting() */
  69953. mn = snmp_search_tree((struct mib_node*)&internet, msg_ps->vb_ptr->ident_len - 4,
  69954. 8035b7e: 466e mov r6, sp
  69955. msg_ps->vb_idx = 0;
  69956. msg_ps->state = SNMP_MSG_INTERNAL_SET_VALUE;
  69957. }
  69958. /* set all values "atomically" (be as "atomic" as possible) */
  69959. while ((msg_ps->state == SNMP_MSG_INTERNAL_SET_VALUE) &&
  69960. 8035b80: f894 305a ldrb.w r3, [r4, #90] ; 0x5a
  69961. 8035b84: 4d1f ldr r5, [pc, #124] ; (8035c04 <snmp_msg_event+0x734>)
  69962. 8035b86: 2b06 cmp r3, #6
  69963. 8035b88: d139 bne.n 8035bfe <snmp_msg_event+0x72e>
  69964. (msg_ps->vb_idx < msg_ps->invb.count))
  69965. 8035b8a: f894 30f8 ldrb.w r3, [r4, #248] ; 0xf8
  69966. 8035b8e: f894 2108 ldrb.w r2, [r4, #264] ; 0x108
  69967. msg_ps->vb_idx = 0;
  69968. msg_ps->state = SNMP_MSG_INTERNAL_SET_VALUE;
  69969. }
  69970. /* set all values "atomically" (be as "atomic" as possible) */
  69971. while ((msg_ps->state == SNMP_MSG_INTERNAL_SET_VALUE) &&
  69972. 8035b92: 4293 cmp r3, r2
  69973. 8035b94: d3ae bcc.n 8035af4 <snmp_msg_event+0x624>
  69974. 8035b96: e031 b.n 8035bfc <snmp_msg_event+0x72c>
  69975. (msg_ps->vb_idx == msg_ps->invb.count))
  69976. {
  69977. /* simply echo the input if we can set it
  69978. @todo do we need to return the actual value?
  69979. e.g. if value is silently modified or behaves sticky? */
  69980. msg_ps->outvb = msg_ps->invb;
  69981. 8035b98: f505 7280 add.w r2, r5, #256 ; 0x100
  69982. 8035b9c: ca07 ldmia r2, {r0, r1, r2}
  69983. 8035b9e: f505 7386 add.w r3, r5, #268 ; 0x10c
  69984. 8035ba2: e883 0007 stmia.w r3, {r0, r1, r2}
  69985. msg_ps->invb.head = NULL;
  69986. 8035ba6: 2300 movs r3, #0
  69987. 8035ba8: f8c5 3100 str.w r3, [r5, #256] ; 0x100
  69988. msg_ps->invb.tail = NULL;
  69989. 8035bac: f8c5 3104 str.w r3, [r5, #260] ; 0x104
  69990. msg_ps->invb.count = 0;
  69991. 8035bb0: f885 3108 strb.w r3, [r5, #264] ; 0x108
  69992. snmp_ok_response(msg_ps);
  69993. 8035bb4: 4628 mov r0, r5
  69994. 8035bb6: f7ff fc6f bl 8035498 <snmp_ok_response>
  69995. 8035bba: e020 b.n 8035bfe <snmp_msg_event+0x72e>
  69996. }
  69997. }
  69998. if (mn == NULL)
  69999. {
  70000. /* mn == NULL, noSuchName */
  70001. snmp_error_response(msg_ps,SNMP_ES_NOSUCHNAME);
  70002. 8035bbc: 4811 ldr r0, [pc, #68] ; (8035c04 <snmp_msg_event+0x734>)
  70003. 8035bbe: 2102 movs r1, #2
  70004. 8035bc0: f7ff fc2f bl 8035422 <snmp_error_response>
  70005. 8035bc4: e556 b.n 8035674 <snmp_msg_event+0x1a4>
  70006. }
  70007. if (mn != NULL)
  70008. {
  70009. struct snmp_varbind *vb;
  70010. msg_ps->state = SNMP_MSG_INTERNAL_GET_VALUE;
  70011. 8035bc6: 2303 movs r3, #3
  70012. /* allocate output varbind */
  70013. vb = (struct snmp_varbind *)memp_malloc(MEMP_SNMP_VARBIND);
  70014. 8035bc8: 200c movs r0, #12
  70015. }
  70016. if (mn != NULL)
  70017. {
  70018. struct snmp_varbind *vb;
  70019. msg_ps->state = SNMP_MSG_INTERNAL_GET_VALUE;
  70020. 8035bca: f884 305a strb.w r3, [r4, #90] ; 0x5a
  70021. /* allocate output varbind */
  70022. vb = (struct snmp_varbind *)memp_malloc(MEMP_SNMP_VARBIND);
  70023. 8035bce: f7f9 ff3b bl 802fa48 <memp_malloc>
  70024. if (vb != NULL)
  70025. 8035bd2: 4605 mov r5, r0
  70026. 8035bd4: 2800 cmp r0, #0
  70027. 8035bd6: f47f ae31 bne.w 803583c <snmp_msg_event+0x36c>
  70028. 8035bda: e669 b.n 80358b0 <snmp_msg_event+0x3e0>
  70029. {
  70030. /* mn == NULL, noSuchName */
  70031. snmp_error_response(msg_ps,SNMP_ES_NOSUCHNAME);
  70032. }
  70033. }
  70034. if ((msg_ps->state == SNMP_MSG_SEARCH_OBJ) &&
  70035. 8035bdc: d10f bne.n 8035bfe <snmp_msg_event+0x72e>
  70036. 8035bde: e555 b.n 803568c <snmp_msg_event+0x1bc>
  70037. /* search failed, object id points to unknown object (nosuchname) */
  70038. mn = NULL;
  70039. }
  70040. if (mn != NULL)
  70041. {
  70042. msg_ps->state = SNMP_MSG_INTERNAL_SET_TEST;
  70043. 8035be0: 2304 movs r3, #4
  70044. 8035be2: f884 305a strb.w r3, [r4, #90] ; 0x5a
  70045. if (object_def.access & MIB_ACCESS_WRITE)
  70046. 8035be6: f89d 3009 ldrb.w r3, [sp, #9]
  70047. 8035bea: f003 0302 and.w r3, r3, #2
  70048. 8035bee: b2db uxtb r3, r3
  70049. 8035bf0: 2b00 cmp r3, #0
  70050. 8035bf2: f47f af47 bne.w 8035a84 <snmp_msg_event+0x5b4>
  70051. 8035bf6: e75e b.n 8035ab6 <snmp_msg_event+0x5e6>
  70052. /* mn == NULL, noSuchName */
  70053. snmp_error_response(msg_ps,SNMP_ES_NOSUCHNAME);
  70054. }
  70055. }
  70056. if ((msg_ps->state == SNMP_MSG_SEARCH_OBJ) &&
  70057. 8035bf8: d1c0 bne.n 8035b7c <snmp_msg_event+0x6ac>
  70058. 8035bfa: e774 b.n 8035ae6 <snmp_msg_event+0x616>
  70059. mn->set_value(&object_def,msg_ps->vb_ptr->value_len,msg_ps->vb_ptr->value);
  70060. msg_ps->vb_idx += 1;
  70061. }
  70062. }
  70063. }
  70064. if ((msg_ps->state == SNMP_MSG_INTERNAL_SET_VALUE) &&
  70065. 8035bfc: d0cc beq.n 8035b98 <snmp_msg_event+0x6c8>
  70066. else if(msg_ps->rt == SNMP_ASN1_PDU_SET_REQ)
  70067. {
  70068. snmp_msg_set_event(request_id, msg_ps);
  70069. }
  70070. }
  70071. }
  70072. 8035bfe: b027 add sp, #156 ; 0x9c
  70073. 8035c00: e8bd 83f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, pc}
  70074. 8035c04: 2000ff54 .word 0x2000ff54
  70075. 8035c08: 08044f70 .word 0x08044f70
  70076. 8035c0c: 2000ffb4 .word 0x2000ffb4
  70077. 08035c10 <snmp_pdu_dec_varbindlist>:
  70078. return ERR_OK;
  70079. }
  70080. static err_t
  70081. snmp_pdu_dec_varbindlist(struct pbuf *p, u16_t ofs, u16_t *ofs_ret, struct snmp_msg_pstat *m_stat)
  70082. {
  70083. 8035c10: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  70084. 8035c14: b0c7 sub sp, #284 ; 0x11c
  70085. u16_t len, vb_len;
  70086. u8_t len_octets;
  70087. u8_t type;
  70088. /* variable binding list */
  70089. snmp_asn1_dec_type(p, ofs, &type);
  70090. 8035c16: f10d 070b add.w r7, sp, #11
  70091. return ERR_OK;
  70092. }
  70093. static err_t
  70094. snmp_pdu_dec_varbindlist(struct pbuf *p, u16_t ofs, u16_t *ofs_ret, struct snmp_msg_pstat *m_stat)
  70095. {
  70096. 8035c1a: 468a mov sl, r1
  70097. 8035c1c: 4691 mov r9, r2
  70098. u16_t len, vb_len;
  70099. u8_t len_octets;
  70100. u8_t type;
  70101. /* variable binding list */
  70102. snmp_asn1_dec_type(p, ofs, &type);
  70103. 8035c1e: 463a mov r2, r7
  70104. return ERR_OK;
  70105. }
  70106. static err_t
  70107. snmp_pdu_dec_varbindlist(struct pbuf *p, u16_t ofs, u16_t *ofs_ret, struct snmp_msg_pstat *m_stat)
  70108. {
  70109. 8035c20: 4604 mov r4, r0
  70110. 8035c22: 461d mov r5, r3
  70111. u8_t len_octets;
  70112. u8_t type;
  70113. /* variable binding list */
  70114. snmp_asn1_dec_type(p, ofs, &type);
  70115. derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &vb_len);
  70116. 8035c24: f10d 060e add.w r6, sp, #14
  70117. u16_t len, vb_len;
  70118. u8_t len_octets;
  70119. u8_t type;
  70120. /* variable binding list */
  70121. snmp_asn1_dec_type(p, ofs, &type);
  70122. 8035c28: f7fd f928 bl 8032e7c <snmp_asn1_dec_type>
  70123. derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &vb_len);
  70124. 8035c2c: f10a 0101 add.w r1, sl, #1
  70125. 8035c30: 4620 mov r0, r4
  70126. 8035c32: b289 uxth r1, r1
  70127. 8035c34: f10d 020a add.w r2, sp, #10
  70128. 8035c38: 4633 mov r3, r6
  70129. 8035c3a: f7fd f934 bl 8032ea6 <snmp_asn1_dec_length>
  70130. if ((derr != ERR_OK) ||
  70131. 8035c3e: b910 cbnz r0, 8035c46 <snmp_pdu_dec_varbindlist+0x36>
  70132. 8035c40: 783b ldrb r3, [r7, #0]
  70133. 8035c42: 2b30 cmp r3, #48 ; 0x30
  70134. 8035c44: d002 beq.n 8035c4c <snmp_pdu_dec_varbindlist+0x3c>
  70135. (type != (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ)))
  70136. {
  70137. snmp_inc_snmpinasnparseerrs();
  70138. 8035c46: f7fe ff21 bl 8034a8c <snmp_inc_snmpinasnparseerrs>
  70139. 8035c4a: e02b b.n 8035ca4 <snmp_pdu_dec_varbindlist+0x94>
  70140. return ERR_ARG;
  70141. }
  70142. ofs += (1 + len_octets);
  70143. 8035c4c: f89d 800a ldrb.w r8, [sp, #10]
  70144. /* start with empty list */
  70145. m_stat->invb.count = 0;
  70146. 8035c50: f885 0108 strb.w r0, [r5, #264] ; 0x108
  70147. (type != (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ)))
  70148. {
  70149. snmp_inc_snmpinasnparseerrs();
  70150. return ERR_ARG;
  70151. }
  70152. ofs += (1 + len_octets);
  70153. 8035c54: f108 0801 add.w r8, r8, #1
  70154. 8035c58: 44d0 add r8, sl
  70155. 8035c5a: fa1f f888 uxth.w r8, r8
  70156. /* start with empty list */
  70157. m_stat->invb.count = 0;
  70158. m_stat->invb.head = NULL;
  70159. 8035c5e: f8c5 0100 str.w r0, [r5, #256] ; 0x100
  70160. m_stat->invb.tail = NULL;
  70161. 8035c62: f8c5 0104 str.w r0, [r5, #260] ; 0x104
  70162. while (vb_len > 0)
  70163. 8035c66: e118 b.n 8035e9a <snmp_pdu_dec_varbindlist+0x28a>
  70164. {
  70165. struct snmp_obj_id oid, oid_value;
  70166. struct snmp_varbind *vb;
  70167. snmp_asn1_dec_type(p, ofs, &type);
  70168. 8035c68: 4641 mov r1, r8
  70169. 8035c6a: 463a mov r2, r7
  70170. 8035c6c: 4620 mov r0, r4
  70171. 8035c6e: f7fd f905 bl 8032e7c <snmp_asn1_dec_type>
  70172. derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
  70173. 8035c72: f108 0101 add.w r1, r8, #1
  70174. 8035c76: 4620 mov r0, r4
  70175. 8035c78: b289 uxth r1, r1
  70176. 8035c7a: f10d 020a add.w r2, sp, #10
  70177. 8035c7e: ab03 add r3, sp, #12
  70178. 8035c80: f7fd f911 bl 8032ea6 <snmp_asn1_dec_length>
  70179. if ((derr != ERR_OK) ||
  70180. 8035c84: b940 cbnz r0, 8035c98 <snmp_pdu_dec_varbindlist+0x88>
  70181. 8035c86: 783b ldrb r3, [r7, #0]
  70182. 8035c88: 2b30 cmp r3, #48 ; 0x30
  70183. 8035c8a: d105 bne.n 8035c98 <snmp_pdu_dec_varbindlist+0x88>
  70184. (type != (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ)) ||
  70185. (len == 0) || (len > vb_len))
  70186. 8035c8c: f8bd 200c ldrh.w r2, [sp, #12]
  70187. struct snmp_varbind *vb;
  70188. snmp_asn1_dec_type(p, ofs, &type);
  70189. derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
  70190. if ((derr != ERR_OK) ||
  70191. (type != (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ)) ||
  70192. 8035c90: b112 cbz r2, 8035c98 <snmp_pdu_dec_varbindlist+0x88>
  70193. (len == 0) || (len > vb_len))
  70194. 8035c92: 8833 ldrh r3, [r6, #0]
  70195. 8035c94: 429a cmp r2, r3
  70196. 8035c96: d907 bls.n 8035ca8 <snmp_pdu_dec_varbindlist+0x98>
  70197. {
  70198. snmp_inc_snmpinasnparseerrs();
  70199. 8035c98: f7fe fef8 bl 8034a8c <snmp_inc_snmpinasnparseerrs>
  70200. /* free varbinds (if available) */
  70201. snmp_varbind_list_free(&m_stat->invb);
  70202. 8035c9c: f505 7080 add.w r0, r5, #256 ; 0x100
  70203. 8035ca0: f7ff fbb1 bl 8035406 <snmp_varbind_list_free>
  70204. 8035ca4: 20f2 movs r0, #242 ; 0xf2
  70205. 8035ca6: e109 b.n 8035ebc <snmp_pdu_dec_varbindlist+0x2ac>
  70206. return ERR_ARG;
  70207. }
  70208. ofs += (1 + len_octets);
  70209. 8035ca8: f89d 200a ldrb.w r2, [sp, #10]
  70210. 8035cac: 4490 add r8, r2
  70211. 8035cae: fa1f f888 uxth.w r8, r8
  70212. 8035cb2: f108 0a01 add.w sl, r8, #1
  70213. vb_len -= (1 + len_octets);
  70214. 8035cb6: 43d2 mvns r2, r2
  70215. snmp_inc_snmpinasnparseerrs();
  70216. /* free varbinds (if available) */
  70217. snmp_varbind_list_free(&m_stat->invb);
  70218. return ERR_ARG;
  70219. }
  70220. ofs += (1 + len_octets);
  70221. 8035cb8: fa1f fa8a uxth.w sl, sl
  70222. vb_len -= (1 + len_octets);
  70223. 8035cbc: 189b adds r3, r3, r2
  70224. snmp_asn1_dec_type(p, ofs, &type);
  70225. 8035cbe: 4651 mov r1, sl
  70226. 8035cc0: 463a mov r2, r7
  70227. 8035cc2: 4620 mov r0, r4
  70228. /* free varbinds (if available) */
  70229. snmp_varbind_list_free(&m_stat->invb);
  70230. return ERR_ARG;
  70231. }
  70232. ofs += (1 + len_octets);
  70233. vb_len -= (1 + len_octets);
  70234. 8035cc4: 8033 strh r3, [r6, #0]
  70235. snmp_asn1_dec_type(p, ofs, &type);
  70236. 8035cc6: f7fd f8d9 bl 8032e7c <snmp_asn1_dec_type>
  70237. derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
  70238. 8035cca: f108 0102 add.w r1, r8, #2
  70239. 8035cce: 4620 mov r0, r4
  70240. 8035cd0: b289 uxth r1, r1
  70241. 8035cd2: f10d 020a add.w r2, sp, #10
  70242. 8035cd6: ab03 add r3, sp, #12
  70243. 8035cd8: f7fd f8e5 bl 8032ea6 <snmp_asn1_dec_length>
  70244. if ((derr != ERR_OK) || (type != (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID)))
  70245. 8035cdc: 2800 cmp r0, #0
  70246. 8035cde: d1db bne.n 8035c98 <snmp_pdu_dec_varbindlist+0x88>
  70247. 8035ce0: 783b ldrb r3, [r7, #0]
  70248. 8035ce2: 2b06 cmp r3, #6
  70249. 8035ce4: d1d8 bne.n 8035c98 <snmp_pdu_dec_varbindlist+0x88>
  70250. snmp_inc_snmpinasnparseerrs();
  70251. /* free varbinds (if available) */
  70252. snmp_varbind_list_free(&m_stat->invb);
  70253. return ERR_ARG;
  70254. }
  70255. derr = snmp_asn1_dec_oid(p, ofs + 1 + len_octets, len, &oid);
  70256. 8035ce6: f89d 100a ldrb.w r1, [sp, #10]
  70257. 8035cea: f8bd 200c ldrh.w r2, [sp, #12]
  70258. 8035cee: 3101 adds r1, #1
  70259. 8035cf0: 4451 add r1, sl
  70260. 8035cf2: 4620 mov r0, r4
  70261. 8035cf4: b289 uxth r1, r1
  70262. 8035cf6: ab04 add r3, sp, #16
  70263. 8035cf8: f7fd fa04 bl 8033104 <snmp_asn1_dec_oid>
  70264. if (derr != ERR_OK)
  70265. 8035cfc: 2800 cmp r0, #0
  70266. 8035cfe: d1cb bne.n 8035c98 <snmp_pdu_dec_varbindlist+0x88>
  70267. snmp_inc_snmpinasnparseerrs();
  70268. /* free varbinds (if available) */
  70269. snmp_varbind_list_free(&m_stat->invb);
  70270. return ERR_ARG;
  70271. }
  70272. ofs += (1 + len_octets + len);
  70273. 8035d00: f89d 300a ldrb.w r3, [sp, #10]
  70274. 8035d04: f8bd 200c ldrh.w r2, [sp, #12]
  70275. 8035d08: 1899 adds r1, r3, r2
  70276. 8035d0a: 448a add sl, r1
  70277. 8035d0c: fa1f fa8a uxth.w sl, sl
  70278. vb_len -= (1 + len_octets + len);
  70279. 8035d10: 8831 ldrh r1, [r6, #0]
  70280. snmp_inc_snmpinasnparseerrs();
  70281. /* free varbinds (if available) */
  70282. snmp_varbind_list_free(&m_stat->invb);
  70283. return ERR_ARG;
  70284. }
  70285. ofs += (1 + len_octets + len);
  70286. 8035d12: f10a 0801 add.w r8, sl, #1
  70287. vb_len -= (1 + len_octets + len);
  70288. 8035d16: 1a8a subs r2, r1, r2
  70289. snmp_inc_snmpinasnparseerrs();
  70290. /* free varbinds (if available) */
  70291. snmp_varbind_list_free(&m_stat->invb);
  70292. return ERR_ARG;
  70293. }
  70294. ofs += (1 + len_octets + len);
  70295. 8035d18: fa1f f888 uxth.w r8, r8
  70296. vb_len -= (1 + len_octets + len);
  70297. 8035d1c: 43db mvns r3, r3
  70298. 8035d1e: 18d3 adds r3, r2, r3
  70299. snmp_asn1_dec_type(p, ofs, &type);
  70300. 8035d20: 4641 mov r1, r8
  70301. 8035d22: 463a mov r2, r7
  70302. 8035d24: 4620 mov r0, r4
  70303. /* free varbinds (if available) */
  70304. snmp_varbind_list_free(&m_stat->invb);
  70305. return ERR_ARG;
  70306. }
  70307. ofs += (1 + len_octets + len);
  70308. vb_len -= (1 + len_octets + len);
  70309. 8035d26: 8033 strh r3, [r6, #0]
  70310. snmp_asn1_dec_type(p, ofs, &type);
  70311. 8035d28: f7fd f8a8 bl 8032e7c <snmp_asn1_dec_type>
  70312. derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
  70313. 8035d2c: f10a 0102 add.w r1, sl, #2
  70314. 8035d30: 4620 mov r0, r4
  70315. 8035d32: b289 uxth r1, r1
  70316. 8035d34: f10d 020a add.w r2, sp, #10
  70317. 8035d38: ab03 add r3, sp, #12
  70318. 8035d3a: f7fd f8b4 bl 8032ea6 <snmp_asn1_dec_length>
  70319. if (derr != ERR_OK)
  70320. 8035d3e: 2800 cmp r0, #0
  70321. 8035d40: d1aa bne.n 8035c98 <snmp_pdu_dec_varbindlist+0x88>
  70322. /* free varbinds (if available) */
  70323. snmp_varbind_list_free(&m_stat->invb);
  70324. return ERR_ARG;
  70325. }
  70326. switch (type)
  70327. 8035d42: 7839 ldrb r1, [r7, #0]
  70328. 8035d44: 2906 cmp r1, #6
  70329. 8035d46: d047 beq.n 8035dd8 <snmp_pdu_dec_varbindlist+0x1c8>
  70330. 8035d48: d805 bhi.n 8035d56 <snmp_pdu_dec_varbindlist+0x146>
  70331. 8035d4a: 2904 cmp r1, #4
  70332. 8035d4c: d036 beq.n 8035dbc <snmp_pdu_dec_varbindlist+0x1ac>
  70333. 8035d4e: d839 bhi.n 8035dc4 <snmp_pdu_dec_varbindlist+0x1b4>
  70334. 8035d50: 2902 cmp r1, #2
  70335. 8035d52: d1a1 bne.n 8035c98 <snmp_pdu_dec_varbindlist+0x88>
  70336. 8035d54: e009 b.n 8035d6a <snmp_pdu_dec_varbindlist+0x15a>
  70337. 8035d56: 2943 cmp r1, #67 ; 0x43
  70338. 8035d58: d804 bhi.n 8035d64 <snmp_pdu_dec_varbindlist+0x154>
  70339. 8035d5a: 2941 cmp r1, #65 ; 0x41
  70340. 8035d5c: d219 bcs.n 8035d92 <snmp_pdu_dec_varbindlist+0x182>
  70341. 8035d5e: 2940 cmp r1, #64 ; 0x40
  70342. 8035d60: d19a bne.n 8035c98 <snmp_pdu_dec_varbindlist+0x88>
  70343. 8035d62: e069 b.n 8035e38 <snmp_pdu_dec_varbindlist+0x228>
  70344. 8035d64: 2944 cmp r1, #68 ; 0x44
  70345. 8035d66: d197 bne.n 8035c98 <snmp_pdu_dec_varbindlist+0x88>
  70346. 8035d68: e028 b.n 8035dbc <snmp_pdu_dec_varbindlist+0x1ac>
  70347. {
  70348. case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG):
  70349. vb = snmp_varbind_alloc(&oid, type, sizeof(s32_t));
  70350. 8035d6a: a804 add r0, sp, #16
  70351. 8035d6c: 2204 movs r2, #4
  70352. 8035d6e: f7ff faf7 bl 8035360 <snmp_varbind_alloc>
  70353. if (vb != NULL)
  70354. 8035d72: 4683 mov fp, r0
  70355. 8035d74: 2800 cmp r0, #0
  70356. 8035d76: d08f beq.n 8035c98 <snmp_pdu_dec_varbindlist+0x88>
  70357. {
  70358. s32_t *vptr = (s32_t*)vb->value;
  70359. derr = snmp_asn1_dec_s32t(p, ofs + 1 + len_octets, len, vptr);
  70360. 8035d78: f89d 100a ldrb.w r1, [sp, #10]
  70361. 8035d7c: f8bd 200c ldrh.w r2, [sp, #12]
  70362. 8035d80: f8db 3014 ldr.w r3, [fp, #20]
  70363. 8035d84: 3101 adds r1, #1
  70364. 8035d86: 4441 add r1, r8
  70365. 8035d88: 4620 mov r0, r4
  70366. 8035d8a: b289 uxth r1, r1
  70367. 8035d8c: f7fd f961 bl 8033052 <snmp_asn1_dec_s32t>
  70368. 8035d90: e06b b.n 8035e6a <snmp_pdu_dec_varbindlist+0x25a>
  70369. }
  70370. break;
  70371. case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER):
  70372. case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_GAUGE):
  70373. case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_TIMETICKS):
  70374. vb = snmp_varbind_alloc(&oid, type, sizeof(u32_t));
  70375. 8035d92: a804 add r0, sp, #16
  70376. 8035d94: 2204 movs r2, #4
  70377. 8035d96: f7ff fae3 bl 8035360 <snmp_varbind_alloc>
  70378. if (vb != NULL)
  70379. 8035d9a: 4683 mov fp, r0
  70380. 8035d9c: 2800 cmp r0, #0
  70381. 8035d9e: f43f af7b beq.w 8035c98 <snmp_pdu_dec_varbindlist+0x88>
  70382. {
  70383. u32_t *vptr = (u32_t*)vb->value;
  70384. derr = snmp_asn1_dec_u32t(p, ofs + 1 + len_octets, len, vptr);
  70385. 8035da2: f89d 100a ldrb.w r1, [sp, #10]
  70386. 8035da6: f8bd 200c ldrh.w r2, [sp, #12]
  70387. 8035daa: f8db 3014 ldr.w r3, [fp, #20]
  70388. 8035dae: 3101 adds r1, #1
  70389. 8035db0: 4441 add r1, r8
  70390. 8035db2: 4620 mov r0, r4
  70391. 8035db4: b289 uxth r1, r1
  70392. 8035db6: f7fd f8f8 bl 8032faa <snmp_asn1_dec_u32t>
  70393. 8035dba: e056 b.n 8035e6a <snmp_pdu_dec_varbindlist+0x25a>
  70394. }
  70395. break;
  70396. case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR):
  70397. case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_OPAQUE):
  70398. LWIP_ASSERT("invalid length", len <= 0xff);
  70399. vb = snmp_varbind_alloc(&oid, type, (u8_t)len);
  70400. 8035dbc: a804 add r0, sp, #16
  70401. 8035dbe: f89d 200c ldrb.w r2, [sp, #12]
  70402. 8035dc2: e03f b.n 8035e44 <snmp_pdu_dec_varbindlist+0x234>
  70403. {
  70404. derr = ERR_ARG;
  70405. }
  70406. break;
  70407. case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_NUL):
  70408. vb = snmp_varbind_alloc(&oid, type, 0);
  70409. 8035dc4: 2105 movs r1, #5
  70410. 8035dc6: a804 add r0, sp, #16
  70411. 8035dc8: 2200 movs r2, #0
  70412. 8035dca: f7ff fac9 bl 8035360 <snmp_varbind_alloc>
  70413. if (vb != NULL)
  70414. 8035dce: 4601 mov r1, r0
  70415. 8035dd0: 2800 cmp r0, #0
  70416. 8035dd2: f43f af61 beq.w 8035c98 <snmp_pdu_dec_varbindlist+0x88>
  70417. 8035dd6: e02a b.n 8035e2e <snmp_pdu_dec_varbindlist+0x21e>
  70418. {
  70419. derr = ERR_ARG;
  70420. }
  70421. break;
  70422. case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID):
  70423. derr = snmp_asn1_dec_oid(p, ofs + 1 + len_octets, len, &oid_value);
  70424. 8035dd8: f89d 100a ldrb.w r1, [sp, #10]
  70425. 8035ddc: f8bd 200c ldrh.w r2, [sp, #12]
  70426. 8035de0: 3101 adds r1, #1
  70427. 8035de2: 4441 add r1, r8
  70428. 8035de4: 4620 mov r0, r4
  70429. 8035de6: b289 uxth r1, r1
  70430. 8035de8: ab25 add r3, sp, #148 ; 0x94
  70431. 8035dea: f7fd f98b bl 8033104 <snmp_asn1_dec_oid>
  70432. if (derr == ERR_OK)
  70433. 8035dee: 2800 cmp r0, #0
  70434. 8035df0: f47f af52 bne.w 8035c98 <snmp_pdu_dec_varbindlist+0x88>
  70435. {
  70436. vb = snmp_varbind_alloc(&oid, type, oid_value.len * sizeof(s32_t));
  70437. 8035df4: f89d 2094 ldrb.w r2, [sp, #148] ; 0x94
  70438. 8035df8: 7839 ldrb r1, [r7, #0]
  70439. 8035dfa: 0092 lsls r2, r2, #2
  70440. 8035dfc: a804 add r0, sp, #16
  70441. 8035dfe: f002 02fc and.w r2, r2, #252 ; 0xfc
  70442. 8035e02: f7ff faad bl 8035360 <snmp_varbind_alloc>
  70443. if (vb != NULL)
  70444. 8035e06: 4601 mov r1, r0
  70445. 8035e08: 2800 cmp r0, #0
  70446. 8035e0a: f43f af45 beq.w 8035c98 <snmp_pdu_dec_varbindlist+0x88>
  70447. {
  70448. u8_t i = oid_value.len;
  70449. 8035e0e: f89d 3094 ldrb.w r3, [sp, #148] ; 0x94
  70450. s32_t *vptr = (s32_t*)vb->value;
  70451. 8035e12: 6940 ldr r0, [r0, #20]
  70452. while(i > 0)
  70453. 8035e14: e009 b.n 8035e2a <snmp_pdu_dec_varbindlist+0x21a>
  70454. {
  70455. i--;
  70456. 8035e16: 3b01 subs r3, #1
  70457. 8035e18: b2db uxtb r3, r3
  70458. vptr[i] = oid_value.id[i];
  70459. 8035e1a: f50d 7e8c add.w lr, sp, #280 ; 0x118
  70460. 8035e1e: eb0e 0283 add.w r2, lr, r3, lsl #2
  70461. 8035e22: f852 2c80 ldr.w r2, [r2, #-128]
  70462. 8035e26: f840 2023 str.w r2, [r0, r3, lsl #2]
  70463. if (vb != NULL)
  70464. {
  70465. u8_t i = oid_value.len;
  70466. s32_t *vptr = (s32_t*)vb->value;
  70467. while(i > 0)
  70468. 8035e2a: 2b00 cmp r3, #0
  70469. 8035e2c: d1f3 bne.n 8035e16 <snmp_pdu_dec_varbindlist+0x206>
  70470. {
  70471. i--;
  70472. vptr[i] = oid_value.id[i];
  70473. }
  70474. snmp_varbind_tail_add(&m_stat->invb, vb);
  70475. 8035e2e: f505 7080 add.w r0, r5, #256 ; 0x100
  70476. 8035e32: f7ff fb41 bl 80354b8 <snmp_varbind_tail_add>
  70477. 8035e36: e022 b.n 8035e7e <snmp_pdu_dec_varbindlist+0x26e>
  70478. derr = ERR_ARG;
  70479. }
  70480. }
  70481. break;
  70482. case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR):
  70483. if (len == 4)
  70484. 8035e38: f8bd 200c ldrh.w r2, [sp, #12]
  70485. 8035e3c: 2a04 cmp r2, #4
  70486. 8035e3e: f47f af2b bne.w 8035c98 <snmp_pdu_dec_varbindlist+0x88>
  70487. {
  70488. /* must be exactly 4 octets! */
  70489. vb = snmp_varbind_alloc(&oid, type, 4);
  70490. 8035e42: a804 add r0, sp, #16
  70491. 8035e44: f7ff fa8c bl 8035360 <snmp_varbind_alloc>
  70492. if (vb != NULL)
  70493. 8035e48: 4683 mov fp, r0
  70494. 8035e4a: 2800 cmp r0, #0
  70495. 8035e4c: f43f af24 beq.w 8035c98 <snmp_pdu_dec_varbindlist+0x88>
  70496. {
  70497. derr = snmp_asn1_dec_raw(p, ofs + 1 + len_octets, len, vb->value_len, (u8_t*)vb->value);
  70498. 8035e50: f89d 100a ldrb.w r1, [sp, #10]
  70499. 8035e54: 7c43 ldrb r3, [r0, #17]
  70500. 8035e56: 6940 ldr r0, [r0, #20]
  70501. 8035e58: f8bd 200c ldrh.w r2, [sp, #12]
  70502. 8035e5c: 9000 str r0, [sp, #0]
  70503. 8035e5e: 3101 adds r1, #1
  70504. 8035e60: 4441 add r1, r8
  70505. 8035e62: 4620 mov r0, r4
  70506. 8035e64: b289 uxth r1, r1
  70507. 8035e66: f7fd f9e9 bl 803323c <snmp_asn1_dec_raw>
  70508. 8035e6a: 4682 mov sl, r0
  70509. snmp_varbind_tail_add(&m_stat->invb, vb);
  70510. 8035e6c: 4659 mov r1, fp
  70511. 8035e6e: f505 7080 add.w r0, r5, #256 ; 0x100
  70512. 8035e72: f7ff fb21 bl 80354b8 <snmp_varbind_tail_add>
  70513. break;
  70514. default:
  70515. derr = ERR_ARG;
  70516. break;
  70517. }
  70518. if (derr != ERR_OK)
  70519. 8035e76: f1ba 0f00 cmp.w sl, #0
  70520. 8035e7a: f47f af0d bne.w 8035c98 <snmp_pdu_dec_varbindlist+0x88>
  70521. snmp_inc_snmpinasnparseerrs();
  70522. /* free varbinds (if available) */
  70523. snmp_varbind_list_free(&m_stat->invb);
  70524. return ERR_ARG;
  70525. }
  70526. ofs += (1 + len_octets + len);
  70527. 8035e7e: f8bd 200c ldrh.w r2, [sp, #12]
  70528. 8035e82: f89d 300a ldrb.w r3, [sp, #10]
  70529. 8035e86: 1c51 adds r1, r2, #1
  70530. 8035e88: 1859 adds r1, r3, r1
  70531. 8035e8a: 4488 add r8, r1
  70532. vb_len -= (1 + len_octets + len);
  70533. 8035e8c: 8831 ldrh r1, [r6, #0]
  70534. 8035e8e: 43db mvns r3, r3
  70535. 8035e90: 1a8a subs r2, r1, r2
  70536. 8035e92: 18d3 adds r3, r2, r3
  70537. snmp_inc_snmpinasnparseerrs();
  70538. /* free varbinds (if available) */
  70539. snmp_varbind_list_free(&m_stat->invb);
  70540. return ERR_ARG;
  70541. }
  70542. ofs += (1 + len_octets + len);
  70543. 8035e94: fa1f f888 uxth.w r8, r8
  70544. vb_len -= (1 + len_octets + len);
  70545. 8035e98: 8033 strh r3, [r6, #0]
  70546. /* start with empty list */
  70547. m_stat->invb.count = 0;
  70548. m_stat->invb.head = NULL;
  70549. m_stat->invb.tail = NULL;
  70550. while (vb_len > 0)
  70551. 8035e9a: 8833 ldrh r3, [r6, #0]
  70552. 8035e9c: 2b00 cmp r3, #0
  70553. 8035e9e: f47f aee3 bne.w 8035c68 <snmp_pdu_dec_varbindlist+0x58>
  70554. }
  70555. ofs += (1 + len_octets + len);
  70556. vb_len -= (1 + len_octets + len);
  70557. }
  70558. if (m_stat->rt == SNMP_ASN1_PDU_SET_REQ)
  70559. 8035ea2: 7aab ldrb r3, [r5, #10]
  70560. 8035ea4: f895 0108 ldrb.w r0, [r5, #264] ; 0x108
  70561. 8035ea8: 2b03 cmp r3, #3
  70562. 8035eaa: d102 bne.n 8035eb2 <snmp_pdu_dec_varbindlist+0x2a2>
  70563. {
  70564. snmp_add_snmpintotalsetvars(m_stat->invb.count);
  70565. 8035eac: f7fe fe26 bl 8034afc <snmp_add_snmpintotalsetvars>
  70566. 8035eb0: e001 b.n 8035eb6 <snmp_pdu_dec_varbindlist+0x2a6>
  70567. }
  70568. else
  70569. {
  70570. snmp_add_snmpintotalreqvars(m_stat->invb.count);
  70571. 8035eb2: f7fe fe1b bl 8034aec <snmp_add_snmpintotalreqvars>
  70572. }
  70573. *ofs_ret = ofs;
  70574. 8035eb6: f8a9 8000 strh.w r8, [r9]
  70575. return ERR_OK;
  70576. 8035eba: 2000 movs r0, #0
  70577. }
  70578. 8035ebc: b240 sxtb r0, r0
  70579. 8035ebe: b047 add sp, #284 ; 0x11c
  70580. 8035ec0: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  70581. 08035ec4 <snmp_recv>:
  70582. /* lwIP UDP receive callback function */
  70583. static void
  70584. snmp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, ip_addr_t *addr, u16_t port)
  70585. {
  70586. 8035ec4: e92d 43f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, lr}
  70587. LWIP_UNUSED_ARG(arg);
  70588. /* traverse input message process list, look for SNMP_MSG_EMPTY */
  70589. msg_ps = &msg_input_list[0];
  70590. req_idx = 0;
  70591. while ((req_idx < SNMP_CONCURRENT_REQUESTS) && (msg_ps->state != SNMP_MSG_EMPTY))
  70592. 8035ec8: 4da3 ldr r5, [pc, #652] ; (8036158 <snmp_recv+0x294>)
  70593. {
  70594. //volatile struct snmp_msg_pstat *msg_ps;
  70595. struct snmp_msg_pstat *msg_ps;
  70596. u8_t req_idx;
  70597. err_t err_ret;
  70598. u16_t payload_len = p->tot_len;
  70599. 8035eca: 8917 ldrh r7, [r2, #8]
  70600. LWIP_UNUSED_ARG(arg);
  70601. /* traverse input message process list, look for SNMP_MSG_EMPTY */
  70602. msg_ps = &msg_input_list[0];
  70603. req_idx = 0;
  70604. while ((req_idx < SNMP_CONCURRENT_REQUESTS) && (msg_ps->state != SNMP_MSG_EMPTY))
  70605. 8035ecc: f895 605a ldrb.w r6, [r5, #90] ; 0x5a
  70606. /* lwIP UDP receive callback function */
  70607. static void
  70608. snmp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, ip_addr_t *addr, u16_t port)
  70609. {
  70610. 8035ed0: b087 sub sp, #28
  70611. 8035ed2: 4699 mov r9, r3
  70612. struct snmp_msg_pstat *msg_ps;
  70613. u8_t req_idx;
  70614. err_t err_ret;
  70615. u16_t payload_len = p->tot_len;
  70616. u16_t payload_ofs = 0;
  70617. u16_t varbind_ofs = 0;
  70618. 8035ed4: 2300 movs r3, #0
  70619. /* lwIP UDP receive callback function */
  70620. static void
  70621. snmp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, ip_addr_t *addr, u16_t port)
  70622. {
  70623. 8035ed6: 4688 mov r8, r1
  70624. 8035ed8: 4614 mov r4, r2
  70625. struct snmp_msg_pstat *msg_ps;
  70626. u8_t req_idx;
  70627. err_t err_ret;
  70628. u16_t payload_len = p->tot_len;
  70629. u16_t payload_ofs = 0;
  70630. u16_t varbind_ofs = 0;
  70631. 8035eda: f8ad 3010 strh.w r3, [sp, #16]
  70632. LWIP_UNUSED_ARG(arg);
  70633. /* traverse input message process list, look for SNMP_MSG_EMPTY */
  70634. msg_ps = &msg_input_list[0];
  70635. req_idx = 0;
  70636. while ((req_idx < SNMP_CONCURRENT_REQUESTS) && (msg_ps->state != SNMP_MSG_EMPTY))
  70637. 8035ede: 2e00 cmp r6, #0
  70638. 8035ee0: f000 81a7 beq.w 8036232 <snmp_recv+0x36e>
  70639. msg_ps++;
  70640. }
  70641. if (req_idx == SNMP_CONCURRENT_REQUESTS)
  70642. {
  70643. /* exceeding number of concurrent requests */
  70644. pbuf_free(p);
  70645. 8035ee4: 4620 mov r0, r4
  70646. 8035ee6: f7f9 fecf bl 802fc88 <pbuf_free>
  70647. 8035eea: e1d3 b.n 8036294 <snmp_recv+0x3d0>
  70648. ofs_base = ofs;
  70649. snmp_asn1_dec_type(p, ofs, &type);
  70650. derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
  70651. if ((derr != ERR_OK) ||
  70652. (pdu_len != (1 + len_octets + len)) ||
  70653. 8035eec: f89d 600e ldrb.w r6, [sp, #14]
  70654. 8035ef0: f8bd 3012 ldrh.w r3, [sp, #18]
  70655. 8035ef4: 1c75 adds r5, r6, #1
  70656. 8035ef6: 18eb adds r3, r5, r3
  70657. s32_t version;
  70658. ofs_base = ofs;
  70659. snmp_asn1_dec_type(p, ofs, &type);
  70660. derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
  70661. if ((derr != ERR_OK) ||
  70662. 8035ef8: 429f cmp r7, r3
  70663. 8035efa: f040 80c4 bne.w 8036086 <snmp_recv+0x1c2>
  70664. (pdu_len != (1 + len_octets + len)) ||
  70665. 8035efe: f89d 300f ldrb.w r3, [sp, #15]
  70666. 8035f02: 2b30 cmp r3, #48 ; 0x30
  70667. 8035f04: d000 beq.n 8035f08 <snmp_recv+0x44>
  70668. 8035f06: e0be b.n 8036086 <snmp_recv+0x1c2>
  70669. (type != (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ)))
  70670. {
  70671. snmp_inc_snmpinasnparseerrs();
  70672. return ERR_ARG;
  70673. }
  70674. ofs += (1 + len_octets);
  70675. 8035f08: b2ad uxth r5, r5
  70676. snmp_asn1_dec_type(p, ofs, &type);
  70677. 8035f0a: 4629 mov r1, r5
  70678. 8035f0c: f10d 020f add.w r2, sp, #15
  70679. 8035f10: 4620 mov r0, r4
  70680. 8035f12: f7fc ffb3 bl 8032e7c <snmp_asn1_dec_type>
  70681. derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
  70682. 8035f16: 4620 mov r0, r4
  70683. 8035f18: 1cb1 adds r1, r6, #2
  70684. 8035f1a: f10d 020e add.w r2, sp, #14
  70685. 8035f1e: f10d 0312 add.w r3, sp, #18
  70686. 8035f22: f7fc ffc0 bl 8032ea6 <snmp_asn1_dec_length>
  70687. if ((derr != ERR_OK) || (type != (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG)))
  70688. 8035f26: 2800 cmp r0, #0
  70689. 8035f28: f040 80ad bne.w 8036086 <snmp_recv+0x1c2>
  70690. 8035f2c: f89d 300f ldrb.w r3, [sp, #15]
  70691. 8035f30: 2b02 cmp r3, #2
  70692. 8035f32: f040 80a8 bne.w 8036086 <snmp_recv+0x1c2>
  70693. {
  70694. /* can't decode or no integer (version) */
  70695. snmp_inc_snmpinasnparseerrs();
  70696. return ERR_ARG;
  70697. }
  70698. derr = snmp_asn1_dec_s32t(p, ofs + 1 + len_octets, len, &version);
  70699. 8035f36: f89d 100e ldrb.w r1, [sp, #14]
  70700. 8035f3a: f8bd 2012 ldrh.w r2, [sp, #18]
  70701. 8035f3e: 3101 adds r1, #1
  70702. 8035f40: 4620 mov r0, r4
  70703. 8035f42: 1869 adds r1, r5, r1
  70704. 8035f44: ab05 add r3, sp, #20
  70705. 8035f46: f7fd f884 bl 8033052 <snmp_asn1_dec_s32t>
  70706. if (derr != ERR_OK)
  70707. 8035f4a: 2800 cmp r0, #0
  70708. 8035f4c: f040 809b bne.w 8036086 <snmp_recv+0x1c2>
  70709. {
  70710. /* can't decode */
  70711. snmp_inc_snmpinasnparseerrs();
  70712. return ERR_ARG;
  70713. }
  70714. if (version != 0)
  70715. 8035f50: 9b05 ldr r3, [sp, #20]
  70716. 8035f52: b113 cbz r3, 8035f5a <snmp_recv+0x96>
  70717. {
  70718. /* not version 1 */
  70719. snmp_inc_snmpinbadversions();
  70720. 8035f54: f7fe fd8a bl 8034a6c <snmp_inc_snmpinbadversions>
  70721. 8035f58: e7c4 b.n 8035ee4 <snmp_recv+0x20>
  70722. return ERR_ARG;
  70723. }
  70724. ofs += (1 + len_octets + len);
  70725. 8035f5a: f89d 200e ldrb.w r2, [sp, #14]
  70726. 8035f5e: f8bd 3012 ldrh.w r3, [sp, #18]
  70727. 8035f62: 18d3 adds r3, r2, r3
  70728. 8035f64: 18ed adds r5, r5, r3
  70729. 8035f66: b2ad uxth r5, r5
  70730. 8035f68: 1c6e adds r6, r5, #1
  70731. 8035f6a: b2b6 uxth r6, r6
  70732. snmp_asn1_dec_type(p, ofs, &type);
  70733. 8035f6c: 4631 mov r1, r6
  70734. 8035f6e: f10d 020f add.w r2, sp, #15
  70735. 8035f72: 4620 mov r0, r4
  70736. 8035f74: f7fc ff82 bl 8032e7c <snmp_asn1_dec_type>
  70737. derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
  70738. 8035f78: 1ca9 adds r1, r5, #2
  70739. 8035f7a: 4620 mov r0, r4
  70740. 8035f7c: b289 uxth r1, r1
  70741. 8035f7e: f10d 020e add.w r2, sp, #14
  70742. 8035f82: f10d 0312 add.w r3, sp, #18
  70743. 8035f86: f7fc ff8e bl 8032ea6 <snmp_asn1_dec_length>
  70744. if ((derr != ERR_OK) || (type != (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR)))
  70745. 8035f8a: 2800 cmp r0, #0
  70746. 8035f8c: d17b bne.n 8036086 <snmp_recv+0x1c2>
  70747. 8035f8e: f89d 300f ldrb.w r3, [sp, #15]
  70748. 8035f92: 2b04 cmp r3, #4
  70749. 8035f94: d177 bne.n 8036086 <snmp_recv+0x1c2>
  70750. {
  70751. /* can't decode or no octet string (community) */
  70752. snmp_inc_snmpinasnparseerrs();
  70753. return ERR_ARG;
  70754. }
  70755. derr = snmp_asn1_dec_raw(p, ofs + 1 + len_octets, len, SNMP_COMMUNITY_STR_LEN, m_stat->community);
  70756. 8035f96: f89d 100e ldrb.w r1, [sp, #14]
  70757. 8035f9a: 4d70 ldr r5, [pc, #448] ; (803615c <snmp_recv+0x298>)
  70758. 8035f9c: f8bd 2012 ldrh.w r2, [sp, #18]
  70759. 8035fa0: 9500 str r5, [sp, #0]
  70760. 8035fa2: 3101 adds r1, #1
  70761. 8035fa4: 1871 adds r1, r6, r1
  70762. 8035fa6: 4620 mov r0, r4
  70763. 8035fa8: b289 uxth r1, r1
  70764. 8035faa: 2340 movs r3, #64 ; 0x40
  70765. 8035fac: f7fd f946 bl 803323c <snmp_asn1_dec_raw>
  70766. if (derr != ERR_OK)
  70767. 8035fb0: 2800 cmp r0, #0
  70768. 8035fb2: d168 bne.n 8036086 <snmp_recv+0x1c2>
  70769. {
  70770. snmp_inc_snmpinasnparseerrs();
  70771. return ERR_ARG;
  70772. }
  70773. /* add zero terminator */
  70774. len = ((len < (SNMP_COMMUNITY_STR_LEN))?(len):(SNMP_COMMUNITY_STR_LEN));
  70775. 8035fb4: f8bd 3012 ldrh.w r3, [sp, #18]
  70776. m_stat->community[len] = 0;
  70777. 8035fb8: f1a5 0218 sub.w r2, r5, #24
  70778. {
  70779. snmp_inc_snmpinasnparseerrs();
  70780. return ERR_ARG;
  70781. }
  70782. /* add zero terminator */
  70783. len = ((len < (SNMP_COMMUNITY_STR_LEN))?(len):(SNMP_COMMUNITY_STR_LEN));
  70784. 8035fbc: 2b40 cmp r3, #64 ; 0x40
  70785. 8035fbe: bf28 it cs
  70786. 8035fc0: 2340 movcs r3, #64 ; 0x40
  70787. m_stat->community[len] = 0;
  70788. 8035fc2: 18d1 adds r1, r2, r3
  70789. snmp_inc_snmpinbadcommunitynames();
  70790. snmp_authfail_trap();
  70791. return ERR_ARG;
  70792. }*/
  70793. ofs += (1 + len_octets + len);
  70794. 8035fc4: f89d 200e ldrb.w r2, [sp, #14]
  70795. {
  70796. snmp_inc_snmpinasnparseerrs();
  70797. return ERR_ARG;
  70798. }
  70799. /* add zero terminator */
  70800. len = ((len < (SNMP_COMMUNITY_STR_LEN))?(len):(SNMP_COMMUNITY_STR_LEN));
  70801. 8035fc8: f8ad 3012 strh.w r3, [sp, #18]
  70802. m_stat->community[len] = 0;
  70803. m_stat->com_strlen = (u8_t)len;
  70804. 8035fcc: f885 3041 strb.w r3, [r5, #65] ; 0x41
  70805. snmp_inc_snmpinbadcommunitynames();
  70806. snmp_authfail_trap();
  70807. return ERR_ARG;
  70808. }*/
  70809. ofs += (1 + len_octets + len);
  70810. 8035fd0: 189b adds r3, r3, r2
  70811. 8035fd2: 18f6 adds r6, r6, r3
  70812. 8035fd4: b2b6 uxth r6, r6
  70813. 8035fd6: f106 0801 add.w r8, r6, #1
  70814. 8035fda: fa1f f888 uxth.w r8, r8
  70815. snmp_inc_snmpinasnparseerrs();
  70816. return ERR_ARG;
  70817. }
  70818. /* add zero terminator */
  70819. len = ((len < (SNMP_COMMUNITY_STR_LEN))?(len):(SNMP_COMMUNITY_STR_LEN));
  70820. m_stat->community[len] = 0;
  70821. 8035fde: 7608 strb r0, [r1, #24]
  70822. snmp_authfail_trap();
  70823. return ERR_ARG;
  70824. }*/
  70825. ofs += (1 + len_octets + len);
  70826. snmp_asn1_dec_type(p, ofs, &type);
  70827. 8035fe0: f10d 020f add.w r2, sp, #15
  70828. 8035fe4: 4641 mov r1, r8
  70829. 8035fe6: 4620 mov r0, r4
  70830. 8035fe8: f7fc ff48 bl 8032e7c <snmp_asn1_dec_type>
  70831. derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
  70832. 8035fec: 1cb1 adds r1, r6, #2
  70833. 8035fee: 4620 mov r0, r4
  70834. 8035ff0: b289 uxth r1, r1
  70835. 8035ff2: f10d 020e add.w r2, sp, #14
  70836. 8035ff6: f10d 0312 add.w r3, sp, #18
  70837. 8035ffa: f7fc ff54 bl 8032ea6 <snmp_asn1_dec_length>
  70838. if (derr != ERR_OK)
  70839. 8035ffe: 2800 cmp r0, #0
  70840. 8036000: d141 bne.n 8036086 <snmp_recv+0x1c2>
  70841. return ERR_ARG;
  70842. }
  70843. /* FIX for write/read communuty */
  70844. /* GetRequest PDU */
  70845. if (type == (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_GET_REQ))
  70846. 8036002: f89d 300f ldrb.w r3, [sp, #15]
  70847. 8036006: 2ba0 cmp r3, #160 ; 0xa0
  70848. 8036008: d10f bne.n 803602a <snmp_recv+0x166>
  70849. {
  70850. if (strncmp(sSettings.sSnmp.readCommunity, (const char*)m_stat->community, strlen(sSettings.sSnmp.readCommunity)) != 0
  70851. 803600a: 4855 ldr r0, [pc, #340] ; (8036160 <snmp_recv+0x29c>)
  70852. 803600c: f7ec f8dc bl 80221c8 <strlen>
  70853. 8036010: 4629 mov r1, r5
  70854. 8036012: 4602 mov r2, r0
  70855. 8036014: 4852 ldr r0, [pc, #328] ; (8036160 <snmp_recv+0x29c>)
  70856. 8036016: f7ec f939 bl 802228c <strncmp>
  70857. 803601a: b120 cbz r0, 8036026 <snmp_recv+0x162>
  70858. || (strlen(sSettings.sSnmp.readCommunity) != strlen((const char*)m_stat->community)) )
  70859. {
  70860. snmp_inc_snmpinbadcommunitynames();
  70861. 803601c: f7fe fd2e bl 8034a7c <snmp_inc_snmpinbadcommunitynames>
  70862. snmp_authfail_trap();
  70863. 8036020: f000 fd82 bl 8036b28 <snmp_authfail_trap>
  70864. 8036024: e75e b.n 8035ee4 <snmp_recv+0x20>
  70865. /* FIX for write/read communuty */
  70866. /* GetRequest PDU */
  70867. if (type == (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_GET_REQ))
  70868. {
  70869. if (strncmp(sSettings.sSnmp.readCommunity, (const char*)m_stat->community, strlen(sSettings.sSnmp.readCommunity)) != 0
  70870. || (strlen(sSettings.sSnmp.readCommunity) != strlen((const char*)m_stat->community)) )
  70871. 8036026: 484e ldr r0, [pc, #312] ; (8036160 <snmp_recv+0x29c>)
  70872. 8036028: e00c b.n 8036044 <snmp_recv+0x180>
  70873. snmp_authfail_trap();
  70874. return ERR_ARG;
  70875. }
  70876. }
  70877. /* SetRequest PDU */
  70878. else if (type == (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_SET_REQ))
  70879. 803602a: 2ba3 cmp r3, #163 ; 0xa3
  70880. 803602c: d112 bne.n 8036054 <snmp_recv+0x190>
  70881. {
  70882. if (strncmp(sSettings.sSnmp.writeCommunity, (const char*)m_stat->community, strlen(sSettings.sSnmp.writeCommunity)) != 0
  70883. 803602e: 484d ldr r0, [pc, #308] ; (8036164 <snmp_recv+0x2a0>)
  70884. 8036030: f7ec f8ca bl 80221c8 <strlen>
  70885. 8036034: 4629 mov r1, r5
  70886. 8036036: 4602 mov r2, r0
  70887. 8036038: 484a ldr r0, [pc, #296] ; (8036164 <snmp_recv+0x2a0>)
  70888. 803603a: f7ec f927 bl 802228c <strncmp>
  70889. 803603e: 2800 cmp r0, #0
  70890. 8036040: d1ec bne.n 803601c <snmp_recv+0x158>
  70891. || (strlen(sSettings.sSnmp.writeCommunity) != strlen((const char*)m_stat->community)) )
  70892. 8036042: 4848 ldr r0, [pc, #288] ; (8036164 <snmp_recv+0x2a0>)
  70893. 8036044: f7ec f8c0 bl 80221c8 <strlen>
  70894. 8036048: 4606 mov r6, r0
  70895. 803604a: 4628 mov r0, r5
  70896. 803604c: f7ec f8bc bl 80221c8 <strlen>
  70897. 8036050: 4286 cmp r6, r0
  70898. 8036052: d1e3 bne.n 803601c <snmp_recv+0x158>
  70899. snmp_authfail_trap();
  70900. return ERR_ARG;
  70901. }
  70902. }
  70903. switch(type)
  70904. 8036054: f89d 300f ldrb.w r3, [sp, #15]
  70905. 8036058: 3ba0 subs r3, #160 ; 0xa0
  70906. 803605a: 2b04 cmp r3, #4
  70907. 803605c: d813 bhi.n 8036086 <snmp_recv+0x1c2>
  70908. 803605e: e8df f003 tbb [pc, r3]
  70909. 8036062: 0603 .short 0x0603
  70910. 8036064: 0c09 .short 0x0c09
  70911. 8036066: 0f .byte 0x0f
  70912. 8036067: 00 .byte 0x00
  70913. {
  70914. case (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_GET_REQ):
  70915. // GetRequest PDU
  70916. snmp_inc_snmpingetrequests();
  70917. 8036068: f7fe fd50 bl 8034b0c <snmp_inc_snmpingetrequests>
  70918. 803606c: e0fd b.n 803626a <snmp_recv+0x3a6>
  70919. derr = ERR_OK;
  70920. break;
  70921. case (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_GET_NEXT_REQ):
  70922. // GetNextRequest PDU
  70923. snmp_inc_snmpingetnexts();
  70924. 803606e: f7fe fd55 bl 8034b1c <snmp_inc_snmpingetnexts>
  70925. 8036072: e0fa b.n 803626a <snmp_recv+0x3a6>
  70926. derr = ERR_OK;
  70927. break;
  70928. case (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_GET_RESP):
  70929. // GetResponse PDU
  70930. snmp_inc_snmpingetresponses();
  70931. 8036074: f7fe fd62 bl 8034b3c <snmp_inc_snmpingetresponses>
  70932. 8036078: e734 b.n 8035ee4 <snmp_recv+0x20>
  70933. derr = ERR_ARG;
  70934. break;
  70935. case (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_SET_REQ):
  70936. // SetRequest PDU
  70937. snmp_inc_snmpinsetrequests();
  70938. 803607a: f7fe fd57 bl 8034b2c <snmp_inc_snmpinsetrequests>
  70939. 803607e: e0f4 b.n 803626a <snmp_recv+0x3a6>
  70940. derr = ERR_OK;
  70941. break;
  70942. case (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_TRAP):
  70943. // Trap PDU
  70944. snmp_inc_snmpintraps();
  70945. 8036080: f7fe fd64 bl 8034b4c <snmp_inc_snmpintraps>
  70946. 8036084: e72e b.n 8035ee4 <snmp_recv+0x20>
  70947. derr = ERR_ARG;
  70948. break;
  70949. default:
  70950. snmp_inc_snmpinasnparseerrs();
  70951. 8036086: f7fe fd01 bl 8034a8c <snmp_inc_snmpinasnparseerrs>
  70952. 803608a: e72b b.n 8035ee4 <snmp_recv+0x20>
  70953. {
  70954. /* decoded PDU length does not equal actual payload length */
  70955. snmp_inc_snmpinasnparseerrs();
  70956. return ERR_ARG;
  70957. }
  70958. snmp_asn1_dec_type(p, ofs, &type);
  70959. 803608c: 4631 mov r1, r6
  70960. 803608e: f10d 020f add.w r2, sp, #15
  70961. 8036092: 4620 mov r0, r4
  70962. 8036094: f7fc fef2 bl 8032e7c <snmp_asn1_dec_type>
  70963. derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
  70964. 8036098: f108 0102 add.w r1, r8, #2
  70965. 803609c: 4620 mov r0, r4
  70966. 803609e: b289 uxth r1, r1
  70967. 80360a0: f10d 020e add.w r2, sp, #14
  70968. 80360a4: f10d 0312 add.w r3, sp, #18
  70969. 80360a8: f7fc fefd bl 8032ea6 <snmp_asn1_dec_length>
  70970. if ((derr != ERR_OK) || (type != (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG)))
  70971. 80360ac: 2800 cmp r0, #0
  70972. 80360ae: d1ea bne.n 8036086 <snmp_recv+0x1c2>
  70973. 80360b0: f89d 300f ldrb.w r3, [sp, #15]
  70974. 80360b4: 2b02 cmp r3, #2
  70975. 80360b6: d1e6 bne.n 8036086 <snmp_recv+0x1c2>
  70976. {
  70977. /* can't decode or no integer (request ID) */
  70978. snmp_inc_snmpinasnparseerrs();
  70979. return ERR_ARG;
  70980. }
  70981. derr = snmp_asn1_dec_s32t(p, ofs + 1 + len_octets, len, &m_stat->rid);
  70982. 80360b8: f89d 100e ldrb.w r1, [sp, #14]
  70983. 80360bc: f8bd 2012 ldrh.w r2, [sp, #18]
  70984. 80360c0: 3101 adds r1, #1
  70985. 80360c2: 1871 adds r1, r6, r1
  70986. 80360c4: 4620 mov r0, r4
  70987. 80360c6: b289 uxth r1, r1
  70988. 80360c8: f105 030c add.w r3, r5, #12
  70989. 80360cc: f7fc ffc1 bl 8033052 <snmp_asn1_dec_s32t>
  70990. if (derr != ERR_OK)
  70991. 80360d0: 2800 cmp r0, #0
  70992. 80360d2: d1d8 bne.n 8036086 <snmp_recv+0x1c2>
  70993. {
  70994. /* can't decode */
  70995. snmp_inc_snmpinasnparseerrs();
  70996. return ERR_ARG;
  70997. }
  70998. ofs += (1 + len_octets + len);
  70999. 80360d4: f89d 200e ldrb.w r2, [sp, #14]
  71000. 80360d8: f8bd 3012 ldrh.w r3, [sp, #18]
  71001. 80360dc: 18d3 adds r3, r2, r3
  71002. 80360de: 18f6 adds r6, r6, r3
  71003. 80360e0: b2b6 uxth r6, r6
  71004. 80360e2: 1c77 adds r7, r6, #1
  71005. 80360e4: b2bf uxth r7, r7
  71006. snmp_asn1_dec_type(p, ofs, &type);
  71007. 80360e6: 4639 mov r1, r7
  71008. 80360e8: f10d 020f add.w r2, sp, #15
  71009. 80360ec: 4620 mov r0, r4
  71010. 80360ee: f7fc fec5 bl 8032e7c <snmp_asn1_dec_type>
  71011. derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
  71012. 80360f2: 1cb1 adds r1, r6, #2
  71013. 80360f4: 4620 mov r0, r4
  71014. 80360f6: b289 uxth r1, r1
  71015. 80360f8: f10d 020e add.w r2, sp, #14
  71016. 80360fc: f10d 0312 add.w r3, sp, #18
  71017. 8036100: f7fc fed1 bl 8032ea6 <snmp_asn1_dec_length>
  71018. if ((derr != ERR_OK) || (type != (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG)))
  71019. 8036104: 2800 cmp r0, #0
  71020. 8036106: d1be bne.n 8036086 <snmp_recv+0x1c2>
  71021. 8036108: f89d 300f ldrb.w r3, [sp, #15]
  71022. 803610c: 2b02 cmp r3, #2
  71023. 803610e: d1ba bne.n 8036086 <snmp_recv+0x1c2>
  71024. snmp_inc_snmpinasnparseerrs();
  71025. return ERR_ARG;
  71026. }
  71027. /* must be noError (0) for incoming requests.
  71028. log errors for mib-2 completeness and for debug purposes */
  71029. derr = snmp_asn1_dec_s32t(p, ofs + 1 + len_octets, len, &m_stat->error_status);
  71030. 8036110: f89d 100e ldrb.w r1, [sp, #14]
  71031. 8036114: f8bd 2012 ldrh.w r2, [sp, #18]
  71032. 8036118: 3101 adds r1, #1
  71033. 803611a: 1879 adds r1, r7, r1
  71034. 803611c: 4620 mov r0, r4
  71035. 803611e: b289 uxth r1, r1
  71036. 8036120: f105 0310 add.w r3, r5, #16
  71037. 8036124: f7fc ff95 bl 8033052 <snmp_asn1_dec_s32t>
  71038. if (derr != ERR_OK)
  71039. 8036128: 2800 cmp r0, #0
  71040. 803612a: d1ac bne.n 8036086 <snmp_recv+0x1c2>
  71041. {
  71042. /* can't decode */
  71043. snmp_inc_snmpinasnparseerrs();
  71044. return ERR_ARG;
  71045. }
  71046. switch (m_stat->error_status)
  71047. 803612c: 692b ldr r3, [r5, #16]
  71048. 803612e: 3b01 subs r3, #1
  71049. 8036130: 2b04 cmp r3, #4
  71050. 8036132: d81b bhi.n 803616c <snmp_recv+0x2a8>
  71051. 8036134: e8df f003 tbb [pc, r3]
  71052. 8036138: 0c090603 .word 0x0c090603
  71053. 803613c: 18 .byte 0x18
  71054. 803613d: 00 .byte 0x00
  71055. {
  71056. case SNMP_ES_TOOBIG:
  71057. snmp_inc_snmpintoobigs();
  71058. 803613e: f7fe fcad bl 8034a9c <snmp_inc_snmpintoobigs>
  71059. 8036142: e013 b.n 803616c <snmp_recv+0x2a8>
  71060. break;
  71061. case SNMP_ES_NOSUCHNAME:
  71062. snmp_inc_snmpinnosuchnames();
  71063. 8036144: f7fe fcb2 bl 8034aac <snmp_inc_snmpinnosuchnames>
  71064. 8036148: e010 b.n 803616c <snmp_recv+0x2a8>
  71065. break;
  71066. case SNMP_ES_BADVALUE:
  71067. snmp_inc_snmpinbadvalues();
  71068. 803614a: f7fe fcb7 bl 8034abc <snmp_inc_snmpinbadvalues>
  71069. 803614e: e00d b.n 803616c <snmp_recv+0x2a8>
  71070. break;
  71071. case SNMP_ES_READONLY:
  71072. snmp_inc_snmpinreadonlys();
  71073. 8036150: f7fe fcbc bl 8034acc <snmp_inc_snmpinreadonlys>
  71074. 8036154: e00a b.n 803616c <snmp_recv+0x2a8>
  71075. 8036156: bf00 nop
  71076. 8036158: 2000ff54 .word 0x2000ff54
  71077. 803615c: 2000ff6c .word 0x2000ff6c
  71078. 8036160: 2000d5e5 .word 0x2000d5e5
  71079. 8036164: 2000d5f9 .word 0x2000d5f9
  71080. break;
  71081. case SNMP_ES_GENERROR:
  71082. snmp_inc_snmpingenerrs();
  71083. 8036168: f7fe fcb8 bl 8034adc <snmp_inc_snmpingenerrs>
  71084. break;
  71085. }
  71086. ofs += (1 + len_octets + len);
  71087. 803616c: f89d 200e ldrb.w r2, [sp, #14]
  71088. 8036170: f8bd 3012 ldrh.w r3, [sp, #18]
  71089. 8036174: 18d3 adds r3, r2, r3
  71090. 8036176: 18ff adds r7, r7, r3
  71091. 8036178: b2bf uxth r7, r7
  71092. 803617a: 1c7d adds r5, r7, #1
  71093. 803617c: b2ad uxth r5, r5
  71094. snmp_asn1_dec_type(p, ofs, &type);
  71095. 803617e: 4629 mov r1, r5
  71096. 8036180: f10d 020f add.w r2, sp, #15
  71097. 8036184: 4620 mov r0, r4
  71098. 8036186: f7fc fe79 bl 8032e7c <snmp_asn1_dec_type>
  71099. derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
  71100. 803618a: 1cb9 adds r1, r7, #2
  71101. 803618c: 4620 mov r0, r4
  71102. 803618e: b289 uxth r1, r1
  71103. 8036190: f10d 020e add.w r2, sp, #14
  71104. 8036194: f10d 0312 add.w r3, sp, #18
  71105. 8036198: f7fc fe85 bl 8032ea6 <snmp_asn1_dec_length>
  71106. if ((derr != ERR_OK) || (type != (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG)))
  71107. 803619c: 2800 cmp r0, #0
  71108. 803619e: f47f af72 bne.w 8036086 <snmp_recv+0x1c2>
  71109. 80361a2: f89d 300f ldrb.w r3, [sp, #15]
  71110. 80361a6: 2b02 cmp r3, #2
  71111. 80361a8: f47f af6d bne.w 8036086 <snmp_recv+0x1c2>
  71112. snmp_inc_snmpinasnparseerrs();
  71113. return ERR_ARG;
  71114. }
  71115. /* must be 0 for incoming requests.
  71116. decode anyway to catch bad integers (and dirty tricks) */
  71117. derr = snmp_asn1_dec_s32t(p, ofs + 1 + len_octets, len, &m_stat->error_index);
  71118. 80361ac: f89d 100e ldrb.w r1, [sp, #14]
  71119. 80361b0: f8bd 2012 ldrh.w r2, [sp, #18]
  71120. 80361b4: 4b39 ldr r3, [pc, #228] ; (803629c <snmp_recv+0x3d8>)
  71121. 80361b6: 3101 adds r1, #1
  71122. 80361b8: 1869 adds r1, r5, r1
  71123. 80361ba: 4620 mov r0, r4
  71124. 80361bc: b289 uxth r1, r1
  71125. 80361be: f7fc ff48 bl 8033052 <snmp_asn1_dec_s32t>
  71126. if (derr != ERR_OK)
  71127. 80361c2: 2800 cmp r0, #0
  71128. 80361c4: f47f af5f bne.w 8036086 <snmp_recv+0x1c2>
  71129. {
  71130. /* can't decode */
  71131. snmp_inc_snmpinasnparseerrs();
  71132. return ERR_ARG;
  71133. }
  71134. ofs += (1 + len_octets + len);
  71135. 80361c8: f8bd 3012 ldrh.w r3, [sp, #18]
  71136. 80361cc: f89d 200e ldrb.w r2, [sp, #14]
  71137. 80361d0: 3301 adds r3, #1
  71138. 80361d2: 189b adds r3, r3, r2
  71139. /* check total length, version, community, pdu type */
  71140. err_ret = snmp_pdu_header_check(p, payload_ofs, payload_len, &varbind_ofs, msg_ps);
  71141. /* Only accept requests and requests without error (be robust) */
  71142. /* Reject response and trap headers or error requests as input! */
  71143. if ((err_ret != ERR_OK) ||
  71144. ((msg_ps->rt != SNMP_ASN1_PDU_GET_REQ) &&
  71145. 80361d4: 4a32 ldr r2, [pc, #200] ; (80362a0 <snmp_recv+0x3dc>)
  71146. {
  71147. /* can't decode */
  71148. snmp_inc_snmpinasnparseerrs();
  71149. return ERR_ARG;
  71150. }
  71151. ofs += (1 + len_octets + len);
  71152. 80361d6: 18ed adds r5, r5, r3
  71153. /* check total length, version, community, pdu type */
  71154. err_ret = snmp_pdu_header_check(p, payload_ofs, payload_len, &varbind_ofs, msg_ps);
  71155. /* Only accept requests and requests without error (be robust) */
  71156. /* Reject response and trap headers or error requests as input! */
  71157. if ((err_ret != ERR_OK) ||
  71158. ((msg_ps->rt != SNMP_ASN1_PDU_GET_REQ) &&
  71159. 80361d8: 7a93 ldrb r3, [r2, #10]
  71160. /* can't decode */
  71161. snmp_inc_snmpinasnparseerrs();
  71162. return ERR_ARG;
  71163. }
  71164. ofs += (1 + len_octets + len);
  71165. *ofs_ret = ofs;
  71166. 80361da: f8ad 5010 strh.w r5, [sp, #16]
  71167. /* check total length, version, community, pdu type */
  71168. err_ret = snmp_pdu_header_check(p, payload_ofs, payload_len, &varbind_ofs, msg_ps);
  71169. /* Only accept requests and requests without error (be robust) */
  71170. /* Reject response and trap headers or error requests as input! */
  71171. if ((err_ret != ERR_OK) ||
  71172. 80361de: 2b01 cmp r3, #1
  71173. 80361e0: d902 bls.n 80361e8 <snmp_recv+0x324>
  71174. ((msg_ps->rt != SNMP_ASN1_PDU_GET_REQ) &&
  71175. (msg_ps->rt != SNMP_ASN1_PDU_GET_NEXT_REQ) &&
  71176. 80361e2: 2b03 cmp r3, #3
  71177. 80361e4: f47f ae7e bne.w 8035ee4 <snmp_recv+0x20>
  71178. (msg_ps->rt != SNMP_ASN1_PDU_SET_REQ)) ||
  71179. 80361e8: 6913 ldr r3, [r2, #16]
  71180. ((msg_ps->error_status != SNMP_ES_NOERROR) ||
  71181. 80361ea: 4d2d ldr r5, [pc, #180] ; (80362a0 <snmp_recv+0x3dc>)
  71182. /* Only accept requests and requests without error (be robust) */
  71183. /* Reject response and trap headers or error requests as input! */
  71184. if ((err_ret != ERR_OK) ||
  71185. ((msg_ps->rt != SNMP_ASN1_PDU_GET_REQ) &&
  71186. (msg_ps->rt != SNMP_ASN1_PDU_GET_NEXT_REQ) &&
  71187. (msg_ps->rt != SNMP_ASN1_PDU_SET_REQ)) ||
  71188. 80361ec: 2b00 cmp r3, #0
  71189. 80361ee: f47f ae79 bne.w 8035ee4 <snmp_recv+0x20>
  71190. ((msg_ps->error_status != SNMP_ES_NOERROR) ||
  71191. 80361f2: 696b ldr r3, [r5, #20]
  71192. 80361f4: 2b00 cmp r3, #0
  71193. 80361f6: f47f ae75 bne.w 8035ee4 <snmp_recv+0x20>
  71194. }
  71195. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_recv ok, community %s\n", msg_ps->community));
  71196. /* Builds a list of variable bindings. Copy the varbinds from the pbuf
  71197. chain to glue them when these are divided over two or more pbuf's. */
  71198. err_ret = snmp_pdu_dec_varbindlist(p, varbind_ofs, &varbind_ofs, msg_ps);
  71199. 80361fa: aa06 add r2, sp, #24
  71200. 80361fc: 4620 mov r0, r4
  71201. 80361fe: f832 1d08 ldrh.w r1, [r2, #-8]!
  71202. 8036202: 462b mov r3, r5
  71203. 8036204: f7ff fd04 bl 8035c10 <snmp_pdu_dec_varbindlist>
  71204. 8036208: 4606 mov r6, r0
  71205. /* we've decoded the incoming message, release input msg now */
  71206. pbuf_free(p);
  71207. 803620a: 4620 mov r0, r4
  71208. 803620c: f7f9 fd3c bl 802fc88 <pbuf_free>
  71209. if ((err_ret != ERR_OK) || (msg_ps->invb.count == 0))
  71210. 8036210: 2e00 cmp r6, #0
  71211. 8036212: d13f bne.n 8036294 <snmp_recv+0x3d0>
  71212. 8036214: f895 3108 ldrb.w r3, [r5, #264] ; 0x108
  71213. 8036218: 2b00 cmp r3, #0
  71214. 803621a: d03b beq.n 8036294 <snmp_recv+0x3d0>
  71215. }
  71216. msg_ps->error_status = SNMP_ES_NOERROR;
  71217. msg_ps->error_index = 0;
  71218. /* find object for each variable binding */
  71219. msg_ps->state = SNMP_MSG_SEARCH_OBJ;
  71220. 803621c: 2301 movs r3, #1
  71221. (errors are only returned for a specific varbind failure) */
  71222. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_pdu_dec_varbindlist() failed\n"));
  71223. return;
  71224. }
  71225. msg_ps->error_status = SNMP_ES_NOERROR;
  71226. 803621e: 612e str r6, [r5, #16]
  71227. msg_ps->error_index = 0;
  71228. 8036220: 616e str r6, [r5, #20]
  71229. /* find object for each variable binding */
  71230. msg_ps->state = SNMP_MSG_SEARCH_OBJ;
  71231. 8036222: f885 305a strb.w r3, [r5, #90] ; 0x5a
  71232. /* first variable binding from list to inspect */
  71233. msg_ps->vb_idx = 0;
  71234. 8036226: f885 60f8 strb.w r6, [r5, #248] ; 0xf8
  71235. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_recv varbind cnt=%"U16_F"\n",(u16_t)msg_ps->invb.count));
  71236. /* handle input event and as much objects as possible in one go */
  71237. snmp_msg_event(req_idx);
  71238. 803622a: 4630 mov r0, r6
  71239. 803622c: f7ff f950 bl 80354d0 <snmp_msg_event>
  71240. 8036230: e030 b.n 8036294 <snmp_recv+0x3d0>
  71241. pbuf_free(p);
  71242. return;
  71243. }
  71244. /* accepting request */
  71245. snmp_inc_snmpinpkts();
  71246. 8036232: f7fe fc0b bl 8034a4c <snmp_inc_snmpinpkts>
  71247. /* record used 'protocol control block' */
  71248. msg_ps->pcb = pcb;
  71249. /* source address (network order) */
  71250. msg_ps->sip = *addr;
  71251. 8036236: f8d9 3000 ldr.w r3, [r9]
  71252. }
  71253. /* accepting request */
  71254. snmp_inc_snmpinpkts();
  71255. /* record used 'protocol control block' */
  71256. msg_ps->pcb = pcb;
  71257. 803623a: f8c5 8000 str.w r8, [r5]
  71258. /* source address (network order) */
  71259. msg_ps->sip = *addr;
  71260. 803623e: 606b str r3, [r5, #4]
  71261. /* source port (host order (lwIP oddity)) */
  71262. msg_ps->sp = port;
  71263. 8036240: f8bd 3038 ldrh.w r3, [sp, #56] ; 0x38
  71264. u8_t len_octets;
  71265. u8_t type;
  71266. s32_t version;
  71267. ofs_base = ofs;
  71268. snmp_asn1_dec_type(p, ofs, &type);
  71269. 8036244: 4631 mov r1, r6
  71270. /* record used 'protocol control block' */
  71271. msg_ps->pcb = pcb;
  71272. /* source address (network order) */
  71273. msg_ps->sip = *addr;
  71274. /* source port (host order (lwIP oddity)) */
  71275. msg_ps->sp = port;
  71276. 8036246: 812b strh r3, [r5, #8]
  71277. u8_t len_octets;
  71278. u8_t type;
  71279. s32_t version;
  71280. ofs_base = ofs;
  71281. snmp_asn1_dec_type(p, ofs, &type);
  71282. 8036248: f10d 020f add.w r2, sp, #15
  71283. 803624c: 4620 mov r0, r4
  71284. 803624e: f7fc fe15 bl 8032e7c <snmp_asn1_dec_type>
  71285. derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
  71286. 8036252: 4620 mov r0, r4
  71287. 8036254: 2101 movs r1, #1
  71288. 8036256: f10d 020e add.w r2, sp, #14
  71289. 803625a: f10d 0312 add.w r3, sp, #18
  71290. 803625e: f7fc fe22 bl 8032ea6 <snmp_asn1_dec_length>
  71291. if ((derr != ERR_OK) ||
  71292. 8036262: 2800 cmp r0, #0
  71293. 8036264: f43f ae42 beq.w 8035eec <snmp_recv+0x28>
  71294. 8036268: e70d b.n 8036086 <snmp_recv+0x1c2>
  71295. if (derr != ERR_OK)
  71296. {
  71297. /* unsupported input PDU for this agent (no parse error) */
  71298. return ERR_ARG;
  71299. }
  71300. m_stat->rt = type & 0x1F;
  71301. 803626a: f89d 300f ldrb.w r3, [sp, #15]
  71302. 803626e: 4d0c ldr r5, [pc, #48] ; (80362a0 <snmp_recv+0x3dc>)
  71303. 8036270: f003 031f and.w r3, r3, #31
  71304. 8036274: 72ab strb r3, [r5, #10]
  71305. ofs += (1 + len_octets);
  71306. 8036276: f89d 300e ldrb.w r3, [sp, #14]
  71307. 803627a: 4498 add r8, r3
  71308. 803627c: fa1f f888 uxth.w r8, r8
  71309. 8036280: f108 0601 add.w r6, r8, #1
  71310. 8036284: b2b6 uxth r6, r6
  71311. if (len != (pdu_len - (ofs - ofs_base)))
  71312. 8036286: f8bd 3012 ldrh.w r3, [sp, #18]
  71313. 803628a: 1bbf subs r7, r7, r6
  71314. 803628c: 42bb cmp r3, r7
  71315. 803628e: f43f aefd beq.w 803608c <snmp_recv+0x1c8>
  71316. 8036292: e6f8 b.n 8036086 <snmp_recv+0x1c2>
  71317. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_recv varbind cnt=%"U16_F"\n",(u16_t)msg_ps->invb.count));
  71318. /* handle input event and as much objects as possible in one go */
  71319. snmp_msg_event(req_idx);
  71320. }
  71321. 8036294: b007 add sp, #28
  71322. 8036296: e8bd 83f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, pc}
  71323. 803629a: bf00 nop
  71324. 803629c: 2000ff68 .word 0x2000ff68
  71325. 80362a0: 2000ff54 .word 0x2000ff54
  71326. 080362a4 <snmp_varbind_list_sum>:
  71327. * @param root points to the root of the variable binding list
  71328. * @return the required lenght for encoding the variable bindings
  71329. */
  71330. static u16_t
  71331. snmp_varbind_list_sum(struct snmp_varbind_root *root)
  71332. {
  71333. 80362a4: b5f8 push {r3, r4, r5, r6, r7, lr}
  71334. struct snmp_varbind *vb;
  71335. u32_t *uint_ptr;
  71336. s32_t *sint_ptr;
  71337. u16_t tot_len;
  71338. tot_len = 0;
  71339. 80362a6: 2500 movs r5, #0
  71340. * @param root points to the root of the variable binding list
  71341. * @return the required lenght for encoding the variable bindings
  71342. */
  71343. static u16_t
  71344. snmp_varbind_list_sum(struct snmp_varbind_root *root)
  71345. {
  71346. 80362a8: 4606 mov r6, r0
  71347. u32_t *uint_ptr;
  71348. s32_t *sint_ptr;
  71349. u16_t tot_len;
  71350. tot_len = 0;
  71351. vb = root->tail;
  71352. 80362aa: 6844 ldr r4, [r0, #4]
  71353. sint_ptr = (s32_t*)vb->value;
  71354. snmp_asn1_enc_oid_cnt(vb->value_len / sizeof(s32_t), sint_ptr, &vb->vlen);
  71355. break;
  71356. default:
  71357. /* unsupported type */
  71358. vb->vlen = 0;
  71359. 80362ac: 462f mov r7, r5
  71360. s32_t *sint_ptr;
  71361. u16_t tot_len;
  71362. tot_len = 0;
  71363. vb = root->tail;
  71364. while ( vb != NULL )
  71365. 80362ae: e051 b.n 8036354 <snmp_varbind_list_sum+0xb0>
  71366. {
  71367. /* encoded value lenght depends on type */
  71368. switch (vb->value_type)
  71369. 80362b0: 7c23 ldrb r3, [r4, #16]
  71370. 80362b2: 2b06 cmp r3, #6
  71371. 80362b4: d020 beq.n 80362f8 <snmp_varbind_list_sum+0x54>
  71372. 80362b6: d805 bhi.n 80362c4 <snmp_varbind_list_sum+0x20>
  71373. 80362b8: 2b02 cmp r3, #2
  71374. 80362ba: d00c beq.n 80362d6 <snmp_varbind_list_sum+0x32>
  71375. 80362bc: d324 bcc.n 8036308 <snmp_varbind_list_sum+0x64>
  71376. 80362be: 2b04 cmp r3, #4
  71377. 80362c0: d322 bcc.n 8036308 <snmp_varbind_list_sum+0x64>
  71378. 80362c2: e016 b.n 80362f2 <snmp_varbind_list_sum+0x4e>
  71379. 80362c4: 2b43 cmp r3, #67 ; 0x43
  71380. 80362c6: d803 bhi.n 80362d0 <snmp_varbind_list_sum+0x2c>
  71381. 80362c8: 2b41 cmp r3, #65 ; 0x41
  71382. 80362ca: d20b bcs.n 80362e4 <snmp_varbind_list_sum+0x40>
  71383. 80362cc: 2b40 cmp r3, #64 ; 0x40
  71384. 80362ce: e000 b.n 80362d2 <snmp_varbind_list_sum+0x2e>
  71385. 80362d0: 2b44 cmp r3, #68 ; 0x44
  71386. 80362d2: d119 bne.n 8036308 <snmp_varbind_list_sum+0x64>
  71387. 80362d4: e00d b.n 80362f2 <snmp_varbind_list_sum+0x4e>
  71388. {
  71389. case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG):
  71390. sint_ptr = (s32_t*)vb->value;
  71391. snmp_asn1_enc_s32t_cnt(*sint_ptr, &vb->vlen);
  71392. 80362d6: 6963 ldr r3, [r4, #20]
  71393. 80362d8: f104 0120 add.w r1, r4, #32
  71394. 80362dc: 6818 ldr r0, [r3, #0]
  71395. 80362de: f7fd f804 bl 80332ea <snmp_asn1_enc_s32t_cnt>
  71396. break;
  71397. 80362e2: e012 b.n 803630a <snmp_varbind_list_sum+0x66>
  71398. case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER):
  71399. case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_GAUGE):
  71400. case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_TIMETICKS):
  71401. uint_ptr = (u32_t*)vb->value;
  71402. snmp_asn1_enc_u32t_cnt(*uint_ptr, &vb->vlen);
  71403. 80362e4: 6963 ldr r3, [r4, #20]
  71404. 80362e6: f104 0120 add.w r1, r4, #32
  71405. 80362ea: 6818 ldr r0, [r3, #0]
  71406. 80362ec: f7fc ffe8 bl 80332c0 <snmp_asn1_enc_u32t_cnt>
  71407. break;
  71408. 80362f0: e00b b.n 803630a <snmp_varbind_list_sum+0x66>
  71409. case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR):
  71410. case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_NUL):
  71411. case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR):
  71412. case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_OPAQUE):
  71413. vb->vlen = vb->value_len;
  71414. 80362f2: 7c63 ldrb r3, [r4, #17]
  71415. 80362f4: 8423 strh r3, [r4, #32]
  71416. break;
  71417. 80362f6: e008 b.n 803630a <snmp_varbind_list_sum+0x66>
  71418. case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID):
  71419. sint_ptr = (s32_t*)vb->value;
  71420. snmp_asn1_enc_oid_cnt(vb->value_len / sizeof(s32_t), sint_ptr, &vb->vlen);
  71421. 80362f8: 7c60 ldrb r0, [r4, #17]
  71422. 80362fa: 6961 ldr r1, [r4, #20]
  71423. 80362fc: 0880 lsrs r0, r0, #2
  71424. 80362fe: f104 0220 add.w r2, r4, #32
  71425. 8036302: f7fd f807 bl 8033314 <snmp_asn1_enc_oid_cnt>
  71426. break;
  71427. 8036306: e000 b.n 803630a <snmp_varbind_list_sum+0x66>
  71428. default:
  71429. /* unsupported type */
  71430. vb->vlen = 0;
  71431. 8036308: 8427 strh r7, [r4, #32]
  71432. break;
  71433. };
  71434. /* encoding length of value length field */
  71435. snmp_asn1_enc_length_cnt(vb->vlen, &vb->vlenlen);
  71436. 803630a: 8c20 ldrh r0, [r4, #32]
  71437. 803630c: f104 011a add.w r1, r4, #26
  71438. 8036310: f7fc ffcb bl 80332aa <snmp_asn1_enc_length_cnt>
  71439. snmp_asn1_enc_oid_cnt(vb->ident_len, vb->ident, &vb->olen);
  71440. 8036314: f104 021e add.w r2, r4, #30
  71441. 8036318: 7a20 ldrb r0, [r4, #8]
  71442. 803631a: 68e1 ldr r1, [r4, #12]
  71443. 803631c: f7fc fffa bl 8033314 <snmp_asn1_enc_oid_cnt>
  71444. snmp_asn1_enc_length_cnt(vb->olen, &vb->olenlen);
  71445. 8036320: 8be0 ldrh r0, [r4, #30]
  71446. 8036322: f104 0119 add.w r1, r4, #25
  71447. 8036326: f7fc ffc0 bl 80332aa <snmp_asn1_enc_length_cnt>
  71448. vb->seqlen = 1 + vb->vlenlen + vb->vlen;
  71449. 803632a: 8be3 ldrh r3, [r4, #30]
  71450. 803632c: 8c20 ldrh r0, [r4, #32]
  71451. 803632e: 18c0 adds r0, r0, r3
  71452. 8036330: 7ea3 ldrb r3, [r4, #26]
  71453. vb->seqlen += 1 + vb->olenlen + vb->olen;
  71454. 8036332: 3002 adds r0, #2
  71455. 8036334: 18c0 adds r0, r0, r3
  71456. 8036336: 7e63 ldrb r3, [r4, #25]
  71457. 8036338: 18c0 adds r0, r0, r3
  71458. 803633a: b280 uxth r0, r0
  71459. 803633c: 83a0 strh r0, [r4, #28]
  71460. snmp_asn1_enc_length_cnt(vb->seqlen, &vb->seqlenlen);
  71461. 803633e: f104 0118 add.w r1, r4, #24
  71462. 8036342: f7fc ffb2 bl 80332aa <snmp_asn1_enc_length_cnt>
  71463. /* varbind seq */
  71464. tot_len += 1 + vb->seqlenlen + vb->seqlen;
  71465. 8036346: 8ba3 ldrh r3, [r4, #28]
  71466. 8036348: 7e22 ldrb r2, [r4, #24]
  71467. vb = vb->prev;
  71468. 803634a: 6864 ldr r4, [r4, #4]
  71469. vb->seqlen = 1 + vb->vlenlen + vb->vlen;
  71470. vb->seqlen += 1 + vb->olenlen + vb->olen;
  71471. snmp_asn1_enc_length_cnt(vb->seqlen, &vb->seqlenlen);
  71472. /* varbind seq */
  71473. tot_len += 1 + vb->seqlenlen + vb->seqlen;
  71474. 803634c: 3301 adds r3, #1
  71475. 803634e: 189b adds r3, r3, r2
  71476. 8036350: 18ed adds r5, r5, r3
  71477. 8036352: b2ad uxth r5, r5
  71478. s32_t *sint_ptr;
  71479. u16_t tot_len;
  71480. tot_len = 0;
  71481. vb = root->tail;
  71482. while ( vb != NULL )
  71483. 8036354: 2c00 cmp r4, #0
  71484. 8036356: d1ab bne.n 80362b0 <snmp_varbind_list_sum+0xc>
  71485. vb = vb->prev;
  71486. }
  71487. /* varbind-list seq */
  71488. root->seqlen = tot_len;
  71489. snmp_asn1_enc_length_cnt(root->seqlen, &root->seqlenlen);
  71490. 8036358: 4628 mov r0, r5
  71491. vb = vb->prev;
  71492. }
  71493. /* varbind-list seq */
  71494. root->seqlen = tot_len;
  71495. 803635a: 8175 strh r5, [r6, #10]
  71496. snmp_asn1_enc_length_cnt(root->seqlen, &root->seqlenlen);
  71497. 803635c: f106 0109 add.w r1, r6, #9
  71498. 8036360: f7fc ffa3 bl 80332aa <snmp_asn1_enc_length_cnt>
  71499. tot_len += 1 + root->seqlenlen;
  71500. 8036364: 7a73 ldrb r3, [r6, #9]
  71501. 8036366: 3301 adds r3, #1
  71502. 8036368: 18e8 adds r0, r5, r3
  71503. return tot_len;
  71504. }
  71505. 803636a: b280 uxth r0, r0
  71506. 803636c: bdf8 pop {r3, r4, r5, r6, r7, pc}
  71507. 803636e: 0000 movs r0, r0
  71508. 08036370 <snmp_resp_header_sum>:
  71509. * @param rhl points to returned header lengths
  71510. * @return the required lenght for encoding the response header
  71511. */
  71512. static u16_t
  71513. snmp_resp_header_sum(struct snmp_msg_pstat *m_stat, u16_t vb_len)
  71514. {
  71515. 8036370: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
  71516. 8036374: 4604 mov r4, r0
  71517. u16_t tot_len;
  71518. struct snmp_resp_header_lengths *rhl;
  71519. rhl = &m_stat->rhl;
  71520. tot_len = vb_len;
  71521. snmp_asn1_enc_s32t_cnt(m_stat->error_index, &rhl->erridxlen);
  71522. 8036376: f500 758c add.w r5, r0, #280 ; 0x118
  71523. * @param rhl points to returned header lengths
  71524. * @return the required lenght for encoding the response header
  71525. */
  71526. static u16_t
  71527. snmp_resp_header_sum(struct snmp_msg_pstat *m_stat, u16_t vb_len)
  71528. {
  71529. 803637a: 460f mov r7, r1
  71530. u16_t tot_len;
  71531. struct snmp_resp_header_lengths *rhl;
  71532. rhl = &m_stat->rhl;
  71533. tot_len = vb_len;
  71534. snmp_asn1_enc_s32t_cnt(m_stat->error_index, &rhl->erridxlen);
  71535. 803637c: 6940 ldr r0, [r0, #20]
  71536. 803637e: f504 7190 add.w r1, r4, #288 ; 0x120
  71537. 8036382: f7fc ffb2 bl 80332ea <snmp_asn1_enc_s32t_cnt>
  71538. snmp_asn1_enc_length_cnt(rhl->erridxlen, &rhl->erridxlenlen);
  71539. 8036386: f8b4 0120 ldrh.w r0, [r4, #288] ; 0x120
  71540. 803638a: 4629 mov r1, r5
  71541. 803638c: f7fc ff8d bl 80332aa <snmp_asn1_enc_length_cnt>
  71542. tot_len += 1 + rhl->erridxlenlen + rhl->erridxlen;
  71543. snmp_asn1_enc_s32t_cnt(m_stat->error_status, &rhl->errstatlen);
  71544. 8036390: 6920 ldr r0, [r4, #16]
  71545. rhl = &m_stat->rhl;
  71546. tot_len = vb_len;
  71547. snmp_asn1_enc_s32t_cnt(m_stat->error_index, &rhl->erridxlen);
  71548. snmp_asn1_enc_length_cnt(rhl->erridxlen, &rhl->erridxlenlen);
  71549. tot_len += 1 + rhl->erridxlenlen + rhl->erridxlen;
  71550. 8036392: f894 8118 ldrb.w r8, [r4, #280] ; 0x118
  71551. 8036396: f8b4 a120 ldrh.w sl, [r4, #288] ; 0x120
  71552. snmp_asn1_enc_s32t_cnt(m_stat->error_status, &rhl->errstatlen);
  71553. 803639a: f504 7191 add.w r1, r4, #290 ; 0x122
  71554. 803639e: f7fc ffa4 bl 80332ea <snmp_asn1_enc_s32t_cnt>
  71555. snmp_asn1_enc_length_cnt(rhl->errstatlen, &rhl->errstatlenlen);
  71556. 80363a2: 1c69 adds r1, r5, #1
  71557. 80363a4: f8b4 0122 ldrh.w r0, [r4, #290] ; 0x122
  71558. 80363a8: f7fc ff7f bl 80332aa <snmp_asn1_enc_length_cnt>
  71559. tot_len += 1 + rhl->errstatlenlen + rhl->errstatlen;
  71560. 80363ac: f8b4 9122 ldrh.w r9, [r4, #290] ; 0x122
  71561. snmp_asn1_enc_s32t_cnt(m_stat->rid, &rhl->ridlen);
  71562. 80363b0: 68e0 ldr r0, [r4, #12]
  71563. snmp_asn1_enc_length_cnt(rhl->erridxlen, &rhl->erridxlenlen);
  71564. tot_len += 1 + rhl->erridxlenlen + rhl->erridxlen;
  71565. snmp_asn1_enc_s32t_cnt(m_stat->error_status, &rhl->errstatlen);
  71566. snmp_asn1_enc_length_cnt(rhl->errstatlen, &rhl->errstatlenlen);
  71567. tot_len += 1 + rhl->errstatlenlen + rhl->errstatlen;
  71568. 80363b2: f894 6119 ldrb.w r6, [r4, #281] ; 0x119
  71569. snmp_asn1_enc_s32t_cnt(m_stat->rid, &rhl->ridlen);
  71570. 80363b6: f504 7192 add.w r1, r4, #292 ; 0x124
  71571. 80363ba: f7fc ff96 bl 80332ea <snmp_asn1_enc_s32t_cnt>
  71572. snmp_asn1_enc_length_cnt(rhl->ridlen, &rhl->ridlenlen);
  71573. 80363be: f8b4 0124 ldrh.w r0, [r4, #292] ; 0x124
  71574. 80363c2: f504 718d add.w r1, r4, #282 ; 0x11a
  71575. 80363c6: f7fc ff70 bl 80332aa <snmp_asn1_enc_length_cnt>
  71576. rhl = &m_stat->rhl;
  71577. tot_len = vb_len;
  71578. snmp_asn1_enc_s32t_cnt(m_stat->error_index, &rhl->erridxlen);
  71579. snmp_asn1_enc_length_cnt(rhl->erridxlen, &rhl->erridxlenlen);
  71580. tot_len += 1 + rhl->erridxlenlen + rhl->erridxlen;
  71581. 80363ca: 44d1 add r9, sl
  71582. snmp_asn1_enc_s32t_cnt(m_stat->error_status, &rhl->errstatlen);
  71583. snmp_asn1_enc_length_cnt(rhl->errstatlen, &rhl->errstatlenlen);
  71584. tot_len += 1 + rhl->errstatlenlen + rhl->errstatlen;
  71585. 80363cc: f8b4 3124 ldrh.w r3, [r4, #292] ; 0x124
  71586. 80363d0: f109 0903 add.w r9, r9, #3
  71587. 80363d4: 4499 add r9, r3
  71588. 80363d6: fa18 f889 uxtah r8, r8, r9
  71589. snmp_asn1_enc_s32t_cnt(m_stat->rid, &rhl->ridlen);
  71590. snmp_asn1_enc_length_cnt(rhl->ridlen, &rhl->ridlenlen);
  71591. tot_len += 1 + rhl->ridlenlen + rhl->ridlen;
  71592. 80363da: f894 311a ldrb.w r3, [r4, #282] ; 0x11a
  71593. 80363de: 4446 add r6, r8
  71594. 80363e0: 18f6 adds r6, r6, r3
  71595. 80363e2: fa17 f686 uxtah r6, r7, r6
  71596. 80363e6: b2b6 uxth r6, r6
  71597. rhl->pdulen = tot_len;
  71598. snmp_asn1_enc_length_cnt(rhl->pdulen, &rhl->pdulenlen);
  71599. 80363e8: 1ce9 adds r1, r5, #3
  71600. 80363ea: 4630 mov r0, r6
  71601. snmp_asn1_enc_s32t_cnt(m_stat->rid, &rhl->ridlen);
  71602. snmp_asn1_enc_length_cnt(rhl->ridlen, &rhl->ridlenlen);
  71603. tot_len += 1 + rhl->ridlenlen + rhl->ridlen;
  71604. rhl->pdulen = tot_len;
  71605. 80363ec: f8a4 6126 strh.w r6, [r4, #294] ; 0x126
  71606. snmp_asn1_enc_length_cnt(rhl->pdulen, &rhl->pdulenlen);
  71607. 80363f0: f7fc ff5b bl 80332aa <snmp_asn1_enc_length_cnt>
  71608. tot_len += 1 + rhl->pdulenlen;
  71609. rhl->comlen = m_stat->com_strlen;
  71610. 80363f4: f894 0059 ldrb.w r0, [r4, #89] ; 0x59
  71611. snmp_asn1_enc_length_cnt(rhl->ridlen, &rhl->ridlenlen);
  71612. tot_len += 1 + rhl->ridlenlen + rhl->ridlen;
  71613. rhl->pdulen = tot_len;
  71614. snmp_asn1_enc_length_cnt(rhl->pdulen, &rhl->pdulenlen);
  71615. tot_len += 1 + rhl->pdulenlen;
  71616. 80363f8: f894 811b ldrb.w r8, [r4, #283] ; 0x11b
  71617. rhl->comlen = m_stat->com_strlen;
  71618. 80363fc: f8a4 0128 strh.w r0, [r4, #296] ; 0x128
  71619. snmp_asn1_enc_length_cnt(rhl->comlen, &rhl->comlenlen);
  71620. 8036400: f504 718e add.w r1, r4, #284 ; 0x11c
  71621. 8036404: f7fc ff51 bl 80332aa <snmp_asn1_enc_length_cnt>
  71622. tot_len += 1 + rhl->comlenlen + rhl->comlen;
  71623. snmp_asn1_enc_s32t_cnt(snmp_version, &rhl->verlen);
  71624. 8036408: 4b14 ldr r3, [pc, #80] ; (803645c <snmp_resp_header_sum+0xec>)
  71625. snmp_asn1_enc_length_cnt(rhl->pdulen, &rhl->pdulenlen);
  71626. tot_len += 1 + rhl->pdulenlen;
  71627. rhl->comlen = m_stat->com_strlen;
  71628. snmp_asn1_enc_length_cnt(rhl->comlen, &rhl->comlenlen);
  71629. tot_len += 1 + rhl->comlenlen + rhl->comlen;
  71630. 803640a: f894 711c ldrb.w r7, [r4, #284] ; 0x11c
  71631. snmp_asn1_enc_s32t_cnt(snmp_version, &rhl->verlen);
  71632. 803640e: 6818 ldr r0, [r3, #0]
  71633. snmp_asn1_enc_length_cnt(rhl->pdulen, &rhl->pdulenlen);
  71634. tot_len += 1 + rhl->pdulenlen;
  71635. rhl->comlen = m_stat->com_strlen;
  71636. snmp_asn1_enc_length_cnt(rhl->comlen, &rhl->comlenlen);
  71637. tot_len += 1 + rhl->comlenlen + rhl->comlen;
  71638. 8036410: f8b4 9128 ldrh.w r9, [r4, #296] ; 0x128
  71639. snmp_asn1_enc_s32t_cnt(snmp_version, &rhl->verlen);
  71640. 8036414: f504 7195 add.w r1, r4, #298 ; 0x12a
  71641. 8036418: f7fc ff67 bl 80332ea <snmp_asn1_enc_s32t_cnt>
  71642. snmp_asn1_enc_length_cnt(rhl->verlen, &rhl->verlenlen);
  71643. 803641c: 1d69 adds r1, r5, #5
  71644. 803641e: f8b4 012a ldrh.w r0, [r4, #298] ; 0x12a
  71645. 8036422: f7fc ff42 bl 80332aa <snmp_asn1_enc_length_cnt>
  71646. snmp_asn1_enc_length_cnt(rhl->pdulen, &rhl->pdulenlen);
  71647. tot_len += 1 + rhl->pdulenlen;
  71648. rhl->comlen = m_stat->com_strlen;
  71649. snmp_asn1_enc_length_cnt(rhl->comlen, &rhl->comlenlen);
  71650. tot_len += 1 + rhl->comlenlen + rhl->comlen;
  71651. 8036426: f8b4 512a ldrh.w r5, [r4, #298] ; 0x12a
  71652. snmp_asn1_enc_s32t_cnt(snmp_version, &rhl->verlen);
  71653. snmp_asn1_enc_length_cnt(rhl->verlen, &rhl->verlenlen);
  71654. tot_len += 1 + rhl->verlen + rhl->verlenlen;
  71655. 803642a: f894 311d ldrb.w r3, [r4, #285] ; 0x11d
  71656. snmp_asn1_enc_length_cnt(rhl->pdulen, &rhl->pdulenlen);
  71657. tot_len += 1 + rhl->pdulenlen;
  71658. rhl->comlen = m_stat->com_strlen;
  71659. snmp_asn1_enc_length_cnt(rhl->comlen, &rhl->comlenlen);
  71660. tot_len += 1 + rhl->comlenlen + rhl->comlen;
  71661. 803642e: 444d add r5, r9
  71662. 8036430: 3503 adds r5, #3
  71663. 8036432: 4445 add r5, r8
  71664. snmp_asn1_enc_s32t_cnt(snmp_version, &rhl->verlen);
  71665. snmp_asn1_enc_length_cnt(rhl->verlen, &rhl->verlenlen);
  71666. tot_len += 1 + rhl->verlen + rhl->verlenlen;
  71667. 8036434: 197d adds r5, r7, r5
  71668. 8036436: 18ed adds r5, r5, r3
  71669. 8036438: fa16 f585 uxtah r5, r6, r5
  71670. 803643c: b2ad uxth r5, r5
  71671. rhl->seqlen = tot_len;
  71672. snmp_asn1_enc_length_cnt(rhl->seqlen, &rhl->seqlenlen);
  71673. 803643e: 4628 mov r0, r5
  71674. snmp_asn1_enc_s32t_cnt(snmp_version, &rhl->verlen);
  71675. snmp_asn1_enc_length_cnt(rhl->verlen, &rhl->verlenlen);
  71676. tot_len += 1 + rhl->verlen + rhl->verlenlen;
  71677. rhl->seqlen = tot_len;
  71678. 8036440: f8a4 512c strh.w r5, [r4, #300] ; 0x12c
  71679. snmp_asn1_enc_length_cnt(rhl->seqlen, &rhl->seqlenlen);
  71680. 8036444: f504 718f add.w r1, r4, #286 ; 0x11e
  71681. 8036448: f7fc ff2f bl 80332aa <snmp_asn1_enc_length_cnt>
  71682. tot_len += 1 + rhl->seqlenlen;
  71683. 803644c: f894 311e ldrb.w r3, [r4, #286] ; 0x11e
  71684. 8036450: 3301 adds r3, #1
  71685. 8036452: 18e8 adds r0, r5, r3
  71686. return tot_len;
  71687. }
  71688. 8036454: b280 uxth r0, r0
  71689. 8036456: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc}
  71690. 803645a: bf00 nop
  71691. 803645c: 08045068 .word 0x08045068
  71692. 08036460 <snmp_varbind_list_enc>:
  71693. /**
  71694. * Encodes varbind list from head to tail.
  71695. */
  71696. static u16_t
  71697. snmp_varbind_list_enc(struct snmp_varbind_root *root, struct pbuf *p, u16_t ofs)
  71698. {
  71699. 8036460: b570 push {r4, r5, r6, lr}
  71700. 8036462: 4616 mov r6, r2
  71701. 8036464: 4604 mov r4, r0
  71702. s32_t *sint_ptr;
  71703. u32_t *uint_ptr;
  71704. u8_t *raw_ptr;
  71705. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ));
  71706. ofs += 1;
  71707. 8036466: 3601 adds r6, #1
  71708. /**
  71709. * Encodes varbind list from head to tail.
  71710. */
  71711. static u16_t
  71712. snmp_varbind_list_enc(struct snmp_varbind_root *root, struct pbuf *p, u16_t ofs)
  71713. {
  71714. 8036468: 460d mov r5, r1
  71715. struct snmp_varbind *vb;
  71716. s32_t *sint_ptr;
  71717. u32_t *uint_ptr;
  71718. u8_t *raw_ptr;
  71719. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ));
  71720. 803646a: 4608 mov r0, r1
  71721. ofs += 1;
  71722. 803646c: b2b6 uxth r6, r6
  71723. struct snmp_varbind *vb;
  71724. s32_t *sint_ptr;
  71725. u32_t *uint_ptr;
  71726. u8_t *raw_ptr;
  71727. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ));
  71728. 803646e: 4611 mov r1, r2
  71729. 8036470: 2230 movs r2, #48 ; 0x30
  71730. 8036472: f7fc ff67 bl 8033344 <snmp_asn1_enc_type>
  71731. ofs += 1;
  71732. snmp_asn1_enc_length(p, ofs, root->seqlen);
  71733. 8036476: 4628 mov r0, r5
  71734. 8036478: 4631 mov r1, r6
  71735. 803647a: 8962 ldrh r2, [r4, #10]
  71736. 803647c: f7fc ff76 bl 803336c <snmp_asn1_enc_length>
  71737. ofs += root->seqlenlen;
  71738. 8036480: 7a63 ldrb r3, [r4, #9]
  71739. 8036482: e064 b.n 803654e <snmp_varbind_list_enc+0xee>
  71740. vb = root->head;
  71741. while ( vb != NULL )
  71742. {
  71743. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ));
  71744. 8036484: 4631 mov r1, r6
  71745. ofs += 1;
  71746. 8036486: 3601 adds r6, #1
  71747. ofs += root->seqlenlen;
  71748. vb = root->head;
  71749. while ( vb != NULL )
  71750. {
  71751. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ));
  71752. 8036488: 2230 movs r2, #48 ; 0x30
  71753. ofs += 1;
  71754. 803648a: b2b6 uxth r6, r6
  71755. ofs += root->seqlenlen;
  71756. vb = root->head;
  71757. while ( vb != NULL )
  71758. {
  71759. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ));
  71760. 803648c: 4628 mov r0, r5
  71761. 803648e: f7fc ff59 bl 8033344 <snmp_asn1_enc_type>
  71762. ofs += 1;
  71763. snmp_asn1_enc_length(p, ofs, vb->seqlen);
  71764. 8036492: 4631 mov r1, r6
  71765. 8036494: 8ba2 ldrh r2, [r4, #28]
  71766. 8036496: 4628 mov r0, r5
  71767. 8036498: f7fc ff68 bl 803336c <snmp_asn1_enc_length>
  71768. ofs += vb->seqlenlen;
  71769. 803649c: 7e23 ldrb r3, [r4, #24]
  71770. 803649e: 18f6 adds r6, r6, r3
  71771. 80364a0: b2b6 uxth r6, r6
  71772. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID));
  71773. 80364a2: 4631 mov r1, r6
  71774. ofs += 1;
  71775. 80364a4: 3601 adds r6, #1
  71776. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ));
  71777. ofs += 1;
  71778. snmp_asn1_enc_length(p, ofs, vb->seqlen);
  71779. ofs += vb->seqlenlen;
  71780. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID));
  71781. 80364a6: 2206 movs r2, #6
  71782. ofs += 1;
  71783. 80364a8: b2b6 uxth r6, r6
  71784. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ));
  71785. ofs += 1;
  71786. snmp_asn1_enc_length(p, ofs, vb->seqlen);
  71787. ofs += vb->seqlenlen;
  71788. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID));
  71789. 80364aa: 4628 mov r0, r5
  71790. 80364ac: f7fc ff4a bl 8033344 <snmp_asn1_enc_type>
  71791. ofs += 1;
  71792. snmp_asn1_enc_length(p, ofs, vb->olen);
  71793. 80364b0: 4631 mov r1, r6
  71794. 80364b2: 8be2 ldrh r2, [r4, #30]
  71795. 80364b4: 4628 mov r0, r5
  71796. 80364b6: f7fc ff59 bl 803336c <snmp_asn1_enc_length>
  71797. ofs += vb->olenlen;
  71798. 80364ba: 7e63 ldrb r3, [r4, #25]
  71799. snmp_asn1_enc_oid(p, ofs, vb->ident_len, &vb->ident[0]);
  71800. 80364bc: 7a22 ldrb r2, [r4, #8]
  71801. ofs += vb->seqlenlen;
  71802. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID));
  71803. ofs += 1;
  71804. snmp_asn1_enc_length(p, ofs, vb->olen);
  71805. ofs += vb->olenlen;
  71806. 80364be: 18f6 adds r6, r6, r3
  71807. 80364c0: b2b6 uxth r6, r6
  71808. snmp_asn1_enc_oid(p, ofs, vb->ident_len, &vb->ident[0]);
  71809. 80364c2: 4631 mov r1, r6
  71810. 80364c4: 68e3 ldr r3, [r4, #12]
  71811. 80364c6: 4628 mov r0, r5
  71812. 80364c8: f7fd f805 bl 80334d6 <snmp_asn1_enc_oid>
  71813. ofs += vb->olen;
  71814. 80364cc: 8be3 ldrh r3, [r4, #30]
  71815. snmp_asn1_enc_type(p, ofs, vb->value_type);
  71816. 80364ce: 7c22 ldrb r2, [r4, #16]
  71817. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID));
  71818. ofs += 1;
  71819. snmp_asn1_enc_length(p, ofs, vb->olen);
  71820. ofs += vb->olenlen;
  71821. snmp_asn1_enc_oid(p, ofs, vb->ident_len, &vb->ident[0]);
  71822. ofs += vb->olen;
  71823. 80364d0: 18f6 adds r6, r6, r3
  71824. 80364d2: b2b6 uxth r6, r6
  71825. snmp_asn1_enc_type(p, ofs, vb->value_type);
  71826. 80364d4: 4631 mov r1, r6
  71827. ofs += 1;
  71828. 80364d6: 3601 adds r6, #1
  71829. 80364d8: b2b6 uxth r6, r6
  71830. snmp_asn1_enc_length(p, ofs, vb->olen);
  71831. ofs += vb->olenlen;
  71832. snmp_asn1_enc_oid(p, ofs, vb->ident_len, &vb->ident[0]);
  71833. ofs += vb->olen;
  71834. snmp_asn1_enc_type(p, ofs, vb->value_type);
  71835. 80364da: 4628 mov r0, r5
  71836. 80364dc: f7fc ff32 bl 8033344 <snmp_asn1_enc_type>
  71837. ofs += 1;
  71838. snmp_asn1_enc_length(p, ofs, vb->vlen);
  71839. 80364e0: 4631 mov r1, r6
  71840. 80364e2: 4628 mov r0, r5
  71841. 80364e4: 8c22 ldrh r2, [r4, #32]
  71842. 80364e6: f7fc ff41 bl 803336c <snmp_asn1_enc_length>
  71843. ofs += vb->vlenlen;
  71844. 80364ea: 7ea3 ldrb r3, [r4, #26]
  71845. 80364ec: 18f6 adds r6, r6, r3
  71846. switch (vb->value_type)
  71847. 80364ee: 7c23 ldrb r3, [r4, #16]
  71848. 80364f0: 2b40 cmp r3, #64 ; 0x40
  71849. ofs += vb->olen;
  71850. snmp_asn1_enc_type(p, ofs, vb->value_type);
  71851. ofs += 1;
  71852. snmp_asn1_enc_length(p, ofs, vb->vlen);
  71853. ofs += vb->vlenlen;
  71854. 80364f2: b2b6 uxth r6, r6
  71855. switch (vb->value_type)
  71856. 80364f4: d01c beq.n 8036530 <snmp_varbind_list_enc+0xd0>
  71857. 80364f6: d806 bhi.n 8036506 <snmp_varbind_list_enc+0xa6>
  71858. 80364f8: 2b04 cmp r3, #4
  71859. 80364fa: d019 beq.n 8036530 <snmp_varbind_list_enc+0xd0>
  71860. 80364fc: 2b06 cmp r3, #6
  71861. 80364fe: d01e beq.n 803653e <snmp_varbind_list_enc+0xde>
  71862. 8036500: 2b02 cmp r3, #2
  71863. 8036502: d123 bne.n 803654c <snmp_varbind_list_enc+0xec>
  71864. 8036504: e004 b.n 8036510 <snmp_varbind_list_enc+0xb0>
  71865. 8036506: 2b43 cmp r3, #67 ; 0x43
  71866. 8036508: d90a bls.n 8036520 <snmp_varbind_list_enc+0xc0>
  71867. 803650a: 2b44 cmp r3, #68 ; 0x44
  71868. 803650c: d11e bne.n 803654c <snmp_varbind_list_enc+0xec>
  71869. 803650e: e00f b.n 8036530 <snmp_varbind_list_enc+0xd0>
  71870. {
  71871. case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG):
  71872. sint_ptr = (s32_t*)vb->value;
  71873. snmp_asn1_enc_s32t(p, ofs, vb->vlen, *sint_ptr);
  71874. 8036510: 6963 ldr r3, [r4, #20]
  71875. 8036512: 8c22 ldrh r2, [r4, #32]
  71876. 8036514: 681b ldr r3, [r3, #0]
  71877. 8036516: 4628 mov r0, r5
  71878. 8036518: 4631 mov r1, r6
  71879. 803651a: f7fc ffaf bl 803347c <snmp_asn1_enc_s32t>
  71880. break;
  71881. 803651e: e015 b.n 803654c <snmp_varbind_list_enc+0xec>
  71882. case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER):
  71883. case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_GAUGE):
  71884. case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_TIMETICKS):
  71885. uint_ptr = (u32_t*)vb->value;
  71886. snmp_asn1_enc_u32t(p, ofs, vb->vlen, *uint_ptr);
  71887. 8036520: 6963 ldr r3, [r4, #20]
  71888. 8036522: 8c22 ldrh r2, [r4, #32]
  71889. 8036524: 681b ldr r3, [r3, #0]
  71890. 8036526: 4628 mov r0, r5
  71891. 8036528: 4631 mov r1, r6
  71892. 803652a: f7fc ff67 bl 80333fc <snmp_asn1_enc_u32t>
  71893. break;
  71894. 803652e: e00d b.n 803654c <snmp_varbind_list_enc+0xec>
  71895. case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR):
  71896. case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR):
  71897. case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_OPAQUE):
  71898. raw_ptr = (u8_t*)vb->value;
  71899. snmp_asn1_enc_raw(p, ofs, vb->vlen, raw_ptr);
  71900. 8036530: 4628 mov r0, r5
  71901. 8036532: 4631 mov r1, r6
  71902. 8036534: 8c22 ldrh r2, [r4, #32]
  71903. 8036536: 6963 ldr r3, [r4, #20]
  71904. 8036538: f7fd f840 bl 80335bc <snmp_asn1_enc_raw>
  71905. break;
  71906. 803653c: e006 b.n 803654c <snmp_varbind_list_enc+0xec>
  71907. case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_NUL):
  71908. break;
  71909. case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID):
  71910. sint_ptr = (s32_t*)vb->value;
  71911. snmp_asn1_enc_oid(p, ofs, vb->value_len / sizeof(s32_t), sint_ptr);
  71912. 803653e: 7c62 ldrb r2, [r4, #17]
  71913. 8036540: 6963 ldr r3, [r4, #20]
  71914. 8036542: 4628 mov r0, r5
  71915. 8036544: 4631 mov r1, r6
  71916. 8036546: 0892 lsrs r2, r2, #2
  71917. 8036548: f7fc ffc5 bl 80334d6 <snmp_asn1_enc_oid>
  71918. break;
  71919. default:
  71920. /* unsupported type */
  71921. break;
  71922. };
  71923. ofs += vb->vlen;
  71924. 803654c: 8c23 ldrh r3, [r4, #32]
  71925. vb = vb->next;
  71926. 803654e: 6824 ldr r4, [r4, #0]
  71927. break;
  71928. default:
  71929. /* unsupported type */
  71930. break;
  71931. };
  71932. ofs += vb->vlen;
  71933. 8036550: 18f6 adds r6, r6, r3
  71934. 8036552: b2b6 uxth r6, r6
  71935. ofs += 1;
  71936. snmp_asn1_enc_length(p, ofs, root->seqlen);
  71937. ofs += root->seqlenlen;
  71938. vb = root->head;
  71939. while ( vb != NULL )
  71940. 8036554: 2c00 cmp r4, #0
  71941. 8036556: d195 bne.n 8036484 <snmp_varbind_list_enc+0x24>
  71942. };
  71943. ofs += vb->vlen;
  71944. vb = vb->next;
  71945. }
  71946. return ofs;
  71947. }
  71948. 8036558: 4630 mov r0, r6
  71949. 803655a: bd70 pop {r4, r5, r6, pc}
  71950. 0803655c <snmp_trap_dst_enable>:
  71951. * @param enable switch if 0 destination is disabled >0 enabled.
  71952. */
  71953. void
  71954. snmp_trap_dst_enable(u8_t dst_idx, u8_t enable)
  71955. {
  71956. if (dst_idx < SNMP_TRAP_DESTINATIONS)
  71957. 803655c: b908 cbnz r0, 8036562 <snmp_trap_dst_enable+0x6>
  71958. {
  71959. trap_dst[dst_idx].enable = enable;
  71960. 803655e: 4b01 ldr r3, [pc, #4] ; (8036564 <snmp_trap_dst_enable+0x8>)
  71961. 8036560: 7119 strb r1, [r3, #4]
  71962. 8036562: 4770 bx lr
  71963. 8036564: 20010084 .word 0x20010084
  71964. 08036568 <snmp_trap_dst_ip_set>:
  71965. * @param dst IPv4 address in host order.
  71966. */
  71967. void
  71968. snmp_trap_dst_ip_set(u8_t dst_idx, ip_addr_t *dst)
  71969. {
  71970. if (dst_idx < SNMP_TRAP_DESTINATIONS)
  71971. 8036568: b918 cbnz r0, 8036572 <snmp_trap_dst_ip_set+0xa>
  71972. {
  71973. ip_addr_set(&trap_dst[dst_idx].dip, dst);
  71974. 803656a: b101 cbz r1, 803656e <snmp_trap_dst_ip_set+0x6>
  71975. 803656c: 6809 ldr r1, [r1, #0]
  71976. 803656e: 4b01 ldr r3, [pc, #4] ; (8036574 <snmp_trap_dst_ip_set+0xc>)
  71977. 8036570: 6019 str r1, [r3, #0]
  71978. 8036572: 4770 bx lr
  71979. 8036574: 20010084 .word 0x20010084
  71980. 08036578 <snmp_send_response>:
  71981. * @note the caller is responsible for filling in outvb in the m_stat
  71982. * and provide error-status and index (except for tooBig errors) ...
  71983. */
  71984. err_t
  71985. snmp_send_response(struct snmp_msg_pstat *m_stat)
  71986. {
  71987. 8036578: b5f0 push {r4, r5, r6, r7, lr}
  71988. 803657a: 4604 mov r4, r0
  71989. 803657c: b085 sub sp, #20
  71990. struct snmp_varbind_root emptyvb = {NULL, NULL, 0, 0, 0};
  71991. 803657e: 220c movs r2, #12
  71992. 8036580: 2100 movs r1, #0
  71993. 8036582: a801 add r0, sp, #4
  71994. struct pbuf *p;
  71995. u16_t tot_len;
  71996. err_t err;
  71997. /* pass 0, calculate length fields */
  71998. tot_len = snmp_varbind_list_sum(&m_stat->outvb);
  71999. 8036584: f504 7686 add.w r6, r4, #268 ; 0x10c
  72000. * and provide error-status and index (except for tooBig errors) ...
  72001. */
  72002. err_t
  72003. snmp_send_response(struct snmp_msg_pstat *m_stat)
  72004. {
  72005. struct snmp_varbind_root emptyvb = {NULL, NULL, 0, 0, 0};
  72006. 8036588: f7eb fc46 bl 8021e18 <memset>
  72007. struct pbuf *p;
  72008. u16_t tot_len;
  72009. err_t err;
  72010. /* pass 0, calculate length fields */
  72011. tot_len = snmp_varbind_list_sum(&m_stat->outvb);
  72012. 803658c: 4630 mov r0, r6
  72013. 803658e: f7ff fe89 bl 80362a4 <snmp_varbind_list_sum>
  72014. 8036592: 4601 mov r1, r0
  72015. tot_len = snmp_resp_header_sum(m_stat, tot_len);
  72016. 8036594: 4620 mov r0, r4
  72017. 8036596: f7ff feeb bl 8036370 <snmp_resp_header_sum>
  72018. /* try allocating pbuf(s) for complete response */
  72019. p = pbuf_alloc(PBUF_TRANSPORT, tot_len, PBUF_POOL);
  72020. 803659a: 2203 movs r2, #3
  72021. u16_t tot_len;
  72022. err_t err;
  72023. /* pass 0, calculate length fields */
  72024. tot_len = snmp_varbind_list_sum(&m_stat->outvb);
  72025. tot_len = snmp_resp_header_sum(m_stat, tot_len);
  72026. 803659c: 4601 mov r1, r0
  72027. /* try allocating pbuf(s) for complete response */
  72028. p = pbuf_alloc(PBUF_TRANSPORT, tot_len, PBUF_POOL);
  72029. 803659e: 2000 movs r0, #0
  72030. 80365a0: f7f9 fbbf bl 802fd22 <pbuf_alloc>
  72031. if (p == NULL)
  72032. 80365a4: 4605 mov r5, r0
  72033. 80365a6: b990 cbnz r0, 80365ce <snmp_send_response+0x56>
  72034. {
  72035. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_snd_response() tooBig\n"));
  72036. /* can't construct reply, return error-status tooBig */
  72037. m_stat->error_status = SNMP_ES_TOOBIG;
  72038. 80365a8: 2301 movs r3, #1
  72039. 80365aa: 6123 str r3, [r4, #16]
  72040. m_stat->error_index = 0;
  72041. 80365ac: 6160 str r0, [r4, #20]
  72042. /* pass 0, recalculate lengths, for empty varbind-list */
  72043. tot_len = snmp_varbind_list_sum(&emptyvb);
  72044. 80365ae: a801 add r0, sp, #4
  72045. 80365b0: f7ff fe78 bl 80362a4 <snmp_varbind_list_sum>
  72046. 80365b4: 4601 mov r1, r0
  72047. tot_len = snmp_resp_header_sum(m_stat, tot_len);
  72048. 80365b6: 4620 mov r0, r4
  72049. 80365b8: f7ff feda bl 8036370 <snmp_resp_header_sum>
  72050. /* retry allocation once for header and empty varbind-list */
  72051. p = pbuf_alloc(PBUF_TRANSPORT, tot_len, PBUF_POOL);
  72052. 80365bc: 2203 movs r2, #3
  72053. /* can't construct reply, return error-status tooBig */
  72054. m_stat->error_status = SNMP_ES_TOOBIG;
  72055. m_stat->error_index = 0;
  72056. /* pass 0, recalculate lengths, for empty varbind-list */
  72057. tot_len = snmp_varbind_list_sum(&emptyvb);
  72058. tot_len = snmp_resp_header_sum(m_stat, tot_len);
  72059. 80365be: 4601 mov r1, r0
  72060. /* retry allocation once for header and empty varbind-list */
  72061. p = pbuf_alloc(PBUF_TRANSPORT, tot_len, PBUF_POOL);
  72062. 80365c0: 4628 mov r0, r5
  72063. 80365c2: f7f9 fbae bl 802fd22 <pbuf_alloc>
  72064. }
  72065. if (p != NULL)
  72066. 80365c6: 4605 mov r5, r0
  72067. 80365c8: 2800 cmp r0, #0
  72068. 80365ca: f000 80dc beq.w 8036786 <snmp_send_response+0x20e>
  72069. snmp_resp_header_enc(struct snmp_msg_pstat *m_stat, struct pbuf *p)
  72070. {
  72071. u16_t ofs;
  72072. ofs = 0;
  72073. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ));
  72074. 80365ce: 2100 movs r1, #0
  72075. 80365d0: 2230 movs r2, #48 ; 0x30
  72076. 80365d2: 4628 mov r0, r5
  72077. 80365d4: f7fc feb6 bl 8033344 <snmp_asn1_enc_type>
  72078. ofs += 1;
  72079. snmp_asn1_enc_length(p, ofs, m_stat->rhl.seqlen);
  72080. 80365d8: 2101 movs r1, #1
  72081. 80365da: f8b4 212c ldrh.w r2, [r4, #300] ; 0x12c
  72082. 80365de: 4628 mov r0, r5
  72083. 80365e0: f7fc fec4 bl 803336c <snmp_asn1_enc_length>
  72084. ofs += m_stat->rhl.seqlenlen;
  72085. 80365e4: f894 711e ldrb.w r7, [r4, #286] ; 0x11e
  72086. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  72087. 80365e8: 2202 movs r2, #2
  72088. 80365ea: 1c79 adds r1, r7, #1
  72089. 80365ec: 4628 mov r0, r5
  72090. ofs += 1;
  72091. 80365ee: 3702 adds r7, #2
  72092. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ));
  72093. ofs += 1;
  72094. snmp_asn1_enc_length(p, ofs, m_stat->rhl.seqlen);
  72095. ofs += m_stat->rhl.seqlenlen;
  72096. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  72097. 80365f0: f7fc fea8 bl 8033344 <snmp_asn1_enc_type>
  72098. ofs += 1;
  72099. snmp_asn1_enc_length(p, ofs, m_stat->rhl.verlen);
  72100. 80365f4: 4639 mov r1, r7
  72101. 80365f6: f8b4 212a ldrh.w r2, [r4, #298] ; 0x12a
  72102. 80365fa: 4628 mov r0, r5
  72103. 80365fc: f7fc feb6 bl 803336c <snmp_asn1_enc_length>
  72104. ofs += m_stat->rhl.verlenlen;
  72105. 8036600: f894 311d ldrb.w r3, [r4, #285] ; 0x11d
  72106. snmp_asn1_enc_s32t(p, ofs, m_stat->rhl.verlen, snmp_version);
  72107. 8036604: f8b4 212a ldrh.w r2, [r4, #298] ; 0x12a
  72108. ofs += m_stat->rhl.seqlenlen;
  72109. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  72110. ofs += 1;
  72111. snmp_asn1_enc_length(p, ofs, m_stat->rhl.verlen);
  72112. ofs += m_stat->rhl.verlenlen;
  72113. 8036608: 18ff adds r7, r7, r3
  72114. snmp_asn1_enc_s32t(p, ofs, m_stat->rhl.verlen, snmp_version);
  72115. 803660a: 4b61 ldr r3, [pc, #388] ; (8036790 <snmp_send_response+0x218>)
  72116. 803660c: 4639 mov r1, r7
  72117. 803660e: 681b ldr r3, [r3, #0]
  72118. 8036610: 4628 mov r0, r5
  72119. 8036612: f7fc ff33 bl 803347c <snmp_asn1_enc_s32t>
  72120. ofs += m_stat->rhl.verlen;
  72121. 8036616: f8b4 312a ldrh.w r3, [r4, #298] ; 0x12a
  72122. 803661a: 18ff adds r7, r7, r3
  72123. 803661c: b2bf uxth r7, r7
  72124. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR));
  72125. 803661e: 4639 mov r1, r7
  72126. ofs += 1;
  72127. 8036620: 3701 adds r7, #1
  72128. snmp_asn1_enc_length(p, ofs, m_stat->rhl.verlen);
  72129. ofs += m_stat->rhl.verlenlen;
  72130. snmp_asn1_enc_s32t(p, ofs, m_stat->rhl.verlen, snmp_version);
  72131. ofs += m_stat->rhl.verlen;
  72132. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR));
  72133. 8036622: 2204 movs r2, #4
  72134. ofs += 1;
  72135. 8036624: b2bf uxth r7, r7
  72136. snmp_asn1_enc_length(p, ofs, m_stat->rhl.verlen);
  72137. ofs += m_stat->rhl.verlenlen;
  72138. snmp_asn1_enc_s32t(p, ofs, m_stat->rhl.verlen, snmp_version);
  72139. ofs += m_stat->rhl.verlen;
  72140. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR));
  72141. 8036626: 4628 mov r0, r5
  72142. 8036628: f7fc fe8c bl 8033344 <snmp_asn1_enc_type>
  72143. ofs += 1;
  72144. snmp_asn1_enc_length(p, ofs, m_stat->rhl.comlen);
  72145. 803662c: 4639 mov r1, r7
  72146. 803662e: f8b4 2128 ldrh.w r2, [r4, #296] ; 0x128
  72147. 8036632: 4628 mov r0, r5
  72148. 8036634: f7fc fe9a bl 803336c <snmp_asn1_enc_length>
  72149. ofs += m_stat->rhl.comlenlen;
  72150. 8036638: f894 311c ldrb.w r3, [r4, #284] ; 0x11c
  72151. snmp_asn1_enc_raw(p, ofs, m_stat->rhl.comlen, m_stat->community);
  72152. 803663c: f8b4 2128 ldrh.w r2, [r4, #296] ; 0x128
  72153. ofs += m_stat->rhl.verlen;
  72154. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR));
  72155. ofs += 1;
  72156. snmp_asn1_enc_length(p, ofs, m_stat->rhl.comlen);
  72157. ofs += m_stat->rhl.comlenlen;
  72158. 8036640: 18ff adds r7, r7, r3
  72159. 8036642: b2bf uxth r7, r7
  72160. snmp_asn1_enc_raw(p, ofs, m_stat->rhl.comlen, m_stat->community);
  72161. 8036644: 4639 mov r1, r7
  72162. 8036646: f104 0318 add.w r3, r4, #24
  72163. 803664a: 4628 mov r0, r5
  72164. 803664c: f7fc ffb6 bl 80335bc <snmp_asn1_enc_raw>
  72165. ofs += m_stat->rhl.comlen;
  72166. 8036650: f8b4 3128 ldrh.w r3, [r4, #296] ; 0x128
  72167. 8036654: 18ff adds r7, r7, r3
  72168. 8036656: b2bf uxth r7, r7
  72169. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_GET_RESP));
  72170. 8036658: 4639 mov r1, r7
  72171. ofs += 1;
  72172. 803665a: 3701 adds r7, #1
  72173. snmp_asn1_enc_length(p, ofs, m_stat->rhl.comlen);
  72174. ofs += m_stat->rhl.comlenlen;
  72175. snmp_asn1_enc_raw(p, ofs, m_stat->rhl.comlen, m_stat->community);
  72176. ofs += m_stat->rhl.comlen;
  72177. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_GET_RESP));
  72178. 803665c: 22a2 movs r2, #162 ; 0xa2
  72179. ofs += 1;
  72180. 803665e: b2bf uxth r7, r7
  72181. snmp_asn1_enc_length(p, ofs, m_stat->rhl.comlen);
  72182. ofs += m_stat->rhl.comlenlen;
  72183. snmp_asn1_enc_raw(p, ofs, m_stat->rhl.comlen, m_stat->community);
  72184. ofs += m_stat->rhl.comlen;
  72185. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_GET_RESP));
  72186. 8036660: 4628 mov r0, r5
  72187. 8036662: f7fc fe6f bl 8033344 <snmp_asn1_enc_type>
  72188. ofs += 1;
  72189. snmp_asn1_enc_length(p, ofs, m_stat->rhl.pdulen);
  72190. 8036666: 4639 mov r1, r7
  72191. 8036668: f8b4 2126 ldrh.w r2, [r4, #294] ; 0x126
  72192. 803666c: 4628 mov r0, r5
  72193. 803666e: f7fc fe7d bl 803336c <snmp_asn1_enc_length>
  72194. ofs += m_stat->rhl.pdulenlen;
  72195. 8036672: f894 311b ldrb.w r3, [r4, #283] ; 0x11b
  72196. 8036676: 18ff adds r7, r7, r3
  72197. 8036678: b2bf uxth r7, r7
  72198. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  72199. 803667a: 4639 mov r1, r7
  72200. ofs += 1;
  72201. 803667c: 3701 adds r7, #1
  72202. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_GET_RESP));
  72203. ofs += 1;
  72204. snmp_asn1_enc_length(p, ofs, m_stat->rhl.pdulen);
  72205. ofs += m_stat->rhl.pdulenlen;
  72206. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  72207. 803667e: 2202 movs r2, #2
  72208. ofs += 1;
  72209. 8036680: b2bf uxth r7, r7
  72210. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_GET_RESP));
  72211. ofs += 1;
  72212. snmp_asn1_enc_length(p, ofs, m_stat->rhl.pdulen);
  72213. ofs += m_stat->rhl.pdulenlen;
  72214. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  72215. 8036682: 4628 mov r0, r5
  72216. 8036684: f7fc fe5e bl 8033344 <snmp_asn1_enc_type>
  72217. ofs += 1;
  72218. snmp_asn1_enc_length(p, ofs, m_stat->rhl.ridlen);
  72219. 8036688: 4639 mov r1, r7
  72220. 803668a: f8b4 2124 ldrh.w r2, [r4, #292] ; 0x124
  72221. 803668e: 4628 mov r0, r5
  72222. 8036690: f7fc fe6c bl 803336c <snmp_asn1_enc_length>
  72223. ofs += m_stat->rhl.ridlenlen;
  72224. 8036694: f894 311a ldrb.w r3, [r4, #282] ; 0x11a
  72225. snmp_asn1_enc_s32t(p, ofs, m_stat->rhl.ridlen, m_stat->rid);
  72226. 8036698: f8b4 2124 ldrh.w r2, [r4, #292] ; 0x124
  72227. ofs += m_stat->rhl.pdulenlen;
  72228. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  72229. ofs += 1;
  72230. snmp_asn1_enc_length(p, ofs, m_stat->rhl.ridlen);
  72231. ofs += m_stat->rhl.ridlenlen;
  72232. 803669c: 18ff adds r7, r7, r3
  72233. 803669e: b2bf uxth r7, r7
  72234. snmp_asn1_enc_s32t(p, ofs, m_stat->rhl.ridlen, m_stat->rid);
  72235. 80366a0: 4639 mov r1, r7
  72236. 80366a2: 68e3 ldr r3, [r4, #12]
  72237. 80366a4: 4628 mov r0, r5
  72238. 80366a6: f7fc fee9 bl 803347c <snmp_asn1_enc_s32t>
  72239. ofs += m_stat->rhl.ridlen;
  72240. 80366aa: f8b4 3124 ldrh.w r3, [r4, #292] ; 0x124
  72241. 80366ae: 18ff adds r7, r7, r3
  72242. 80366b0: b2bf uxth r7, r7
  72243. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  72244. 80366b2: 4639 mov r1, r7
  72245. ofs += 1;
  72246. 80366b4: 3701 adds r7, #1
  72247. snmp_asn1_enc_length(p, ofs, m_stat->rhl.ridlen);
  72248. ofs += m_stat->rhl.ridlenlen;
  72249. snmp_asn1_enc_s32t(p, ofs, m_stat->rhl.ridlen, m_stat->rid);
  72250. ofs += m_stat->rhl.ridlen;
  72251. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  72252. 80366b6: 2202 movs r2, #2
  72253. ofs += 1;
  72254. 80366b8: b2bf uxth r7, r7
  72255. snmp_asn1_enc_length(p, ofs, m_stat->rhl.ridlen);
  72256. ofs += m_stat->rhl.ridlenlen;
  72257. snmp_asn1_enc_s32t(p, ofs, m_stat->rhl.ridlen, m_stat->rid);
  72258. ofs += m_stat->rhl.ridlen;
  72259. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  72260. 80366ba: 4628 mov r0, r5
  72261. 80366bc: f7fc fe42 bl 8033344 <snmp_asn1_enc_type>
  72262. ofs += 1;
  72263. snmp_asn1_enc_length(p, ofs, m_stat->rhl.errstatlen);
  72264. 80366c0: 4639 mov r1, r7
  72265. 80366c2: f8b4 2122 ldrh.w r2, [r4, #290] ; 0x122
  72266. 80366c6: 4628 mov r0, r5
  72267. 80366c8: f7fc fe50 bl 803336c <snmp_asn1_enc_length>
  72268. ofs += m_stat->rhl.errstatlenlen;
  72269. 80366cc: f894 3119 ldrb.w r3, [r4, #281] ; 0x119
  72270. snmp_asn1_enc_s32t(p, ofs, m_stat->rhl.errstatlen, m_stat->error_status);
  72271. 80366d0: f8b4 2122 ldrh.w r2, [r4, #290] ; 0x122
  72272. ofs += m_stat->rhl.ridlen;
  72273. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  72274. ofs += 1;
  72275. snmp_asn1_enc_length(p, ofs, m_stat->rhl.errstatlen);
  72276. ofs += m_stat->rhl.errstatlenlen;
  72277. 80366d4: 18ff adds r7, r7, r3
  72278. 80366d6: b2bf uxth r7, r7
  72279. snmp_asn1_enc_s32t(p, ofs, m_stat->rhl.errstatlen, m_stat->error_status);
  72280. 80366d8: 4639 mov r1, r7
  72281. 80366da: 6923 ldr r3, [r4, #16]
  72282. 80366dc: 4628 mov r0, r5
  72283. 80366de: f7fc fecd bl 803347c <snmp_asn1_enc_s32t>
  72284. ofs += m_stat->rhl.errstatlen;
  72285. 80366e2: f8b4 3122 ldrh.w r3, [r4, #290] ; 0x122
  72286. 80366e6: 18ff adds r7, r7, r3
  72287. 80366e8: b2bf uxth r7, r7
  72288. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  72289. 80366ea: 4639 mov r1, r7
  72290. ofs += 1;
  72291. 80366ec: 3701 adds r7, #1
  72292. snmp_asn1_enc_length(p, ofs, m_stat->rhl.errstatlen);
  72293. ofs += m_stat->rhl.errstatlenlen;
  72294. snmp_asn1_enc_s32t(p, ofs, m_stat->rhl.errstatlen, m_stat->error_status);
  72295. ofs += m_stat->rhl.errstatlen;
  72296. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  72297. 80366ee: 2202 movs r2, #2
  72298. ofs += 1;
  72299. 80366f0: b2bf uxth r7, r7
  72300. snmp_asn1_enc_length(p, ofs, m_stat->rhl.errstatlen);
  72301. ofs += m_stat->rhl.errstatlenlen;
  72302. snmp_asn1_enc_s32t(p, ofs, m_stat->rhl.errstatlen, m_stat->error_status);
  72303. ofs += m_stat->rhl.errstatlen;
  72304. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  72305. 80366f2: 4628 mov r0, r5
  72306. 80366f4: f7fc fe26 bl 8033344 <snmp_asn1_enc_type>
  72307. ofs += 1;
  72308. snmp_asn1_enc_length(p, ofs, m_stat->rhl.erridxlen);
  72309. 80366f8: 4639 mov r1, r7
  72310. 80366fa: f8b4 2120 ldrh.w r2, [r4, #288] ; 0x120
  72311. 80366fe: 4628 mov r0, r5
  72312. 8036700: f7fc fe34 bl 803336c <snmp_asn1_enc_length>
  72313. ofs += m_stat->rhl.erridxlenlen;
  72314. 8036704: f894 3118 ldrb.w r3, [r4, #280] ; 0x118
  72315. snmp_asn1_enc_s32t(p, ofs, m_stat->rhl.erridxlen, m_stat->error_index);
  72316. 8036708: f8b4 2120 ldrh.w r2, [r4, #288] ; 0x120
  72317. ofs += m_stat->rhl.errstatlen;
  72318. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  72319. ofs += 1;
  72320. snmp_asn1_enc_length(p, ofs, m_stat->rhl.erridxlen);
  72321. ofs += m_stat->rhl.erridxlenlen;
  72322. 803670c: 18ff adds r7, r7, r3
  72323. 803670e: b2bf uxth r7, r7
  72324. snmp_asn1_enc_s32t(p, ofs, m_stat->rhl.erridxlen, m_stat->error_index);
  72325. 8036710: 4639 mov r1, r7
  72326. 8036712: 6963 ldr r3, [r4, #20]
  72327. 8036714: 4628 mov r0, r5
  72328. 8036716: f7fc feb1 bl 803347c <snmp_asn1_enc_s32t>
  72329. ofs += m_stat->rhl.erridxlen;
  72330. 803671a: f8b4 3120 ldrh.w r3, [r4, #288] ; 0x120
  72331. 803671e: 18fa adds r2, r7, r3
  72332. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_snd_response() p != NULL\n"));
  72333. /* pass 1, size error, encode packet ino the pbuf(s) */
  72334. ofs = snmp_resp_header_enc(m_stat, p);
  72335. snmp_varbind_list_enc(&m_stat->outvb, p, ofs);
  72336. 8036720: 4630 mov r0, r6
  72337. 8036722: 4629 mov r1, r5
  72338. 8036724: b292 uxth r2, r2
  72339. 8036726: f7ff fe9b bl 8036460 <snmp_varbind_list_enc>
  72340. switch (m_stat->error_status)
  72341. 803672a: 6923 ldr r3, [r4, #16]
  72342. 803672c: 3b01 subs r3, #1
  72343. 803672e: 2b04 cmp r3, #4
  72344. 8036730: d80f bhi.n 8036752 <snmp_send_response+0x1da>
  72345. 8036732: e8df f003 tbb [pc, r3]
  72346. 8036736: 0603 .short 0x0603
  72347. 8036738: 0e09 .short 0x0e09
  72348. 803673a: 0c .byte 0x0c
  72349. 803673b: 00 .byte 0x00
  72350. {
  72351. case SNMP_ES_TOOBIG:
  72352. snmp_inc_snmpouttoobigs();
  72353. 803673c: f7fe fa0e bl 8034b5c <snmp_inc_snmpouttoobigs>
  72354. break;
  72355. 8036740: e007 b.n 8036752 <snmp_send_response+0x1da>
  72356. case SNMP_ES_NOSUCHNAME:
  72357. snmp_inc_snmpoutnosuchnames();
  72358. 8036742: f7fe fa13 bl 8034b6c <snmp_inc_snmpoutnosuchnames>
  72359. break;
  72360. 8036746: e004 b.n 8036752 <snmp_send_response+0x1da>
  72361. case SNMP_ES_BADVALUE:
  72362. snmp_inc_snmpoutbadvalues();
  72363. 8036748: f7fe fa18 bl 8034b7c <snmp_inc_snmpoutbadvalues>
  72364. break;
  72365. 803674c: e001 b.n 8036752 <snmp_send_response+0x1da>
  72366. case SNMP_ES_GENERROR:
  72367. snmp_inc_snmpoutgenerrs();
  72368. 803674e: f7fe fa1d bl 8034b8c <snmp_inc_snmpoutgenerrs>
  72369. break;
  72370. }
  72371. snmp_inc_snmpoutgetresponses();
  72372. 8036752: f7fe fa23 bl 8034b9c <snmp_inc_snmpoutgetresponses>
  72373. snmp_inc_snmpoutpkts();
  72374. 8036756: f7fe f981 bl 8034a5c <snmp_inc_snmpoutpkts>
  72375. /** @todo do we need separate rx and tx pcbs for threaded case? */
  72376. /** connect to the originating source */
  72377. udp_connect(m_stat->pcb, &m_stat->sip, m_stat->sp);
  72378. 803675a: 8922 ldrh r2, [r4, #8]
  72379. 803675c: 6820 ldr r0, [r4, #0]
  72380. 803675e: 1d21 adds r1, r4, #4
  72381. 8036760: f7fb ffac bl 80326bc <udp_connect>
  72382. err = udp_send(m_stat->pcb, p);
  72383. 8036764: 4629 mov r1, r5
  72384. 8036766: 6820 ldr r0, [r4, #0]
  72385. 8036768: f7fb ffa3 bl 80326b2 <udp_send>
  72386. /** @todo release some memory, retry and return tooBig? tooMuchHassle? */
  72387. err = ERR_MEM;
  72388. }
  72389. else
  72390. {
  72391. err = ERR_OK;
  72392. 803676c: f1b0 3fff cmp.w r0, #4294967295
  72393. 8036770: bf0c ite eq
  72394. 8036772: f04f 36ff moveq.w r6, #4294967295
  72395. 8036776: 2600 movne r6, #0
  72396. }
  72397. /** disassociate remote address and port with this pcb */
  72398. udp_disconnect(m_stat->pcb);
  72399. 8036778: 6820 ldr r0, [r4, #0]
  72400. 803677a: f7fb ffc5 bl 8032708 <udp_disconnect>
  72401. pbuf_free(p);
  72402. 803677e: 4628 mov r0, r5
  72403. 8036780: f7f9 fa82 bl 802fc88 <pbuf_free>
  72404. 8036784: e000 b.n 8036788 <snmp_send_response+0x210>
  72405. }
  72406. else
  72407. {
  72408. /* first pbuf alloc try or retry alloc failed
  72409. very low on memory, couldn't return tooBig */
  72410. return ERR_MEM;
  72411. 8036786: 26ff movs r6, #255 ; 0xff
  72412. }
  72413. }
  72414. 8036788: b270 sxtb r0, r6
  72415. 803678a: b005 add sp, #20
  72416. 803678c: bdf0 pop {r4, r5, r6, r7, pc}
  72417. 803678e: bf00 nop
  72418. 8036790: 08045068 .word 0x08045068
  72419. 08036794 <snmp_send_trap>:
  72420. * and .iso.org.dod.internet.private.enterprises.yourenterprise
  72421. * (sysObjectID) for specific traps.
  72422. */
  72423. err_t
  72424. snmp_send_trap(s8_t generic_trap, struct snmp_obj_id *eoid, s32_t specific_trap)
  72425. {
  72426. 8036794: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  72427. struct pbuf *p;
  72428. u16_t i,tot_len;
  72429. for (i=0, td = &trap_dst[0]; i<SNMP_TRAP_DESTINATIONS; i++, td++)
  72430. {
  72431. if ((td->enable != 0) && !ip_addr_isany(&td->dip))
  72432. 8036798: 4b11 ldr r3, [pc, #68] ; (80367e0 <snmp_send_trap+0x4c>)
  72433. * and .iso.org.dod.internet.private.enterprises.yourenterprise
  72434. * (sysObjectID) for specific traps.
  72435. */
  72436. err_t
  72437. snmp_send_trap(s8_t generic_trap, struct snmp_obj_id *eoid, s32_t specific_trap)
  72438. {
  72439. 803679a: 4617 mov r7, r2
  72440. struct pbuf *p;
  72441. u16_t i,tot_len;
  72442. for (i=0, td = &trap_dst[0]; i<SNMP_TRAP_DESTINATIONS; i++, td++)
  72443. {
  72444. if ((td->enable != 0) && !ip_addr_isany(&td->dip))
  72445. 803679c: 791a ldrb r2, [r3, #4]
  72446. * and .iso.org.dod.internet.private.enterprises.yourenterprise
  72447. * (sysObjectID) for specific traps.
  72448. */
  72449. err_t
  72450. snmp_send_trap(s8_t generic_trap, struct snmp_obj_id *eoid, s32_t specific_trap)
  72451. {
  72452. 803679e: b085 sub sp, #20
  72453. 80367a0: 4605 mov r5, r0
  72454. 80367a2: 460e mov r6, r1
  72455. struct pbuf *p;
  72456. u16_t i,tot_len;
  72457. for (i=0, td = &trap_dst[0]; i<SNMP_TRAP_DESTINATIONS; i++, td++)
  72458. {
  72459. if ((td->enable != 0) && !ip_addr_isany(&td->dip))
  72460. 80367a4: 2a00 cmp r2, #0
  72461. 80367a6: f000 81b8 beq.w 8036b1a <snmp_send_trap+0x386>
  72462. 80367aa: 6818 ldr r0, [r3, #0]
  72463. 80367ac: 2800 cmp r0, #0
  72464. 80367ae: f000 81b4 beq.w 8036b1a <snmp_send_trap+0x386>
  72465. {
  72466. /* network order trap destination */
  72467. ip_addr_copy(trap_msg.dip, td->dip);
  72468. 80367b2: 4c0c ldr r4, [pc, #48] ; (80367e4 <snmp_send_trap+0x50>)
  72469. 80367b4: 6060 str r0, [r4, #4]
  72470. /* lookup current source address for this dst */
  72471. dst_if = ip_route(&td->dip);
  72472. 80367b6: 4618 mov r0, r3
  72473. 80367b8: f7fc f9f0 bl 8032b9c <ip_route>
  72474. ip_addr_copy(dst_ip, dst_if->ip_addr);
  72475. 80367bc: 6843 ldr r3, [r0, #4]
  72476. /* @todo: what about IPv6? */
  72477. trap_msg.sip_raw[0] = ip4_addr1(&dst_ip);
  72478. trap_msg.sip_raw[1] = ip4_addr2(&dst_ip);
  72479. trap_msg.sip_raw[2] = ip4_addr3(&dst_ip);
  72480. trap_msg.sip_raw[3] = ip4_addr4(&dst_ip);
  72481. trap_msg.gen_trap = generic_trap;
  72482. 80367be: 6125 str r5, [r4, #16]
  72483. /* lookup current source address for this dst */
  72484. dst_if = ip_route(&td->dip);
  72485. ip_addr_copy(dst_ip, dst_if->ip_addr);
  72486. /* @todo: what about IPv6? */
  72487. trap_msg.sip_raw[0] = ip4_addr1(&dst_ip);
  72488. trap_msg.sip_raw[1] = ip4_addr2(&dst_ip);
  72489. 80367c0: f3c3 2207 ubfx r2, r3, #8, #8
  72490. ip_addr_copy(trap_msg.dip, td->dip);
  72491. /* lookup current source address for this dst */
  72492. dst_if = ip_route(&td->dip);
  72493. ip_addr_copy(dst_ip, dst_if->ip_addr);
  72494. /* @todo: what about IPv6? */
  72495. trap_msg.sip_raw[0] = ip4_addr1(&dst_ip);
  72496. 80367c4: 7323 strb r3, [r4, #12]
  72497. trap_msg.sip_raw[1] = ip4_addr2(&dst_ip);
  72498. 80367c6: 7362 strb r2, [r4, #13]
  72499. trap_msg.sip_raw[2] = ip4_addr3(&dst_ip);
  72500. trap_msg.sip_raw[3] = ip4_addr4(&dst_ip);
  72501. trap_msg.gen_trap = generic_trap;
  72502. trap_msg.spc_trap = specific_trap;
  72503. if (generic_trap == SNMP_GENTRAP_ENTERPRISESPC)
  72504. 80367c8: 2d06 cmp r5, #6
  72505. dst_if = ip_route(&td->dip);
  72506. ip_addr_copy(dst_ip, dst_if->ip_addr);
  72507. /* @todo: what about IPv6? */
  72508. trap_msg.sip_raw[0] = ip4_addr1(&dst_ip);
  72509. trap_msg.sip_raw[1] = ip4_addr2(&dst_ip);
  72510. trap_msg.sip_raw[2] = ip4_addr3(&dst_ip);
  72511. 80367ca: f3c3 4207 ubfx r2, r3, #16, #8
  72512. trap_msg.sip_raw[3] = ip4_addr4(&dst_ip);
  72513. 80367ce: f3c3 6307 ubfx r3, r3, #24, #8
  72514. dst_if = ip_route(&td->dip);
  72515. ip_addr_copy(dst_ip, dst_if->ip_addr);
  72516. /* @todo: what about IPv6? */
  72517. trap_msg.sip_raw[0] = ip4_addr1(&dst_ip);
  72518. trap_msg.sip_raw[1] = ip4_addr2(&dst_ip);
  72519. trap_msg.sip_raw[2] = ip4_addr3(&dst_ip);
  72520. 80367d2: 73a2 strb r2, [r4, #14]
  72521. trap_msg.sip_raw[3] = ip4_addr4(&dst_ip);
  72522. 80367d4: 73e3 strb r3, [r4, #15]
  72523. trap_msg.gen_trap = generic_trap;
  72524. trap_msg.spc_trap = specific_trap;
  72525. 80367d6: 6167 str r7, [r4, #20]
  72526. if (generic_trap == SNMP_GENTRAP_ENTERPRISESPC)
  72527. 80367d8: d106 bne.n 80367e8 <snmp_send_trap+0x54>
  72528. {
  72529. /* enterprise-Specific trap */
  72530. trap_msg.enterprise = eoid;
  72531. 80367da: 60a6 str r6, [r4, #8]
  72532. 80367dc: e008 b.n 80367f0 <snmp_send_trap+0x5c>
  72533. 80367de: bf00 nop
  72534. 80367e0: 20010084 .word 0x20010084
  72535. 80367e4: 2001008c .word 0x2001008c
  72536. }
  72537. else
  72538. {
  72539. /* generic (MIB-II) trap */
  72540. snmp_get_snmpgrpid_ptr(&trap_msg.enterprise);
  72541. 80367e8: f104 0008 add.w r0, r4, #8
  72542. 80367ec: f7fe f9e6 bl 8034bbc <snmp_get_snmpgrpid_ptr>
  72543. }
  72544. snmp_get_sysuptime(&trap_msg.ts);
  72545. 80367f0: 48bb ldr r0, [pc, #748] ; (8036ae0 <snmp_send_trap+0x34c>)
  72546. struct snmp_trap_header_lengths *thl;
  72547. thl = &m_trap->thl;
  72548. tot_len = vb_len;
  72549. snmp_asn1_enc_u32t_cnt(m_trap->ts, &thl->tslen);
  72550. 80367f2: 4cbc ldr r4, [pc, #752] ; (8036ae4 <snmp_send_trap+0x350>)
  72551. else
  72552. {
  72553. /* generic (MIB-II) trap */
  72554. snmp_get_snmpgrpid_ptr(&trap_msg.enterprise);
  72555. }
  72556. snmp_get_sysuptime(&trap_msg.ts);
  72557. 80367f4: f7fd fd4c bl 8034290 <snmp_get_sysuptime>
  72558. /* pass 0, calculate length fields */
  72559. tot_len = snmp_varbind_list_sum(&trap_msg.outvb);
  72560. 80367f8: 48bb ldr r0, [pc, #748] ; (8036ae8 <snmp_send_trap+0x354>)
  72561. 80367fa: f7ff fd53 bl 80362a4 <snmp_varbind_list_sum>
  72562. struct snmp_trap_header_lengths *thl;
  72563. thl = &m_trap->thl;
  72564. tot_len = vb_len;
  72565. snmp_asn1_enc_u32t_cnt(m_trap->ts, &thl->tslen);
  72566. 80367fe: f104 0132 add.w r1, r4, #50 ; 0x32
  72567. snmp_get_snmpgrpid_ptr(&trap_msg.enterprise);
  72568. }
  72569. snmp_get_sysuptime(&trap_msg.ts);
  72570. /* pass 0, calculate length fields */
  72571. tot_len = snmp_varbind_list_sum(&trap_msg.outvb);
  72572. 8036802: 4606 mov r6, r0
  72573. struct snmp_trap_header_lengths *thl;
  72574. thl = &m_trap->thl;
  72575. tot_len = vb_len;
  72576. snmp_asn1_enc_u32t_cnt(m_trap->ts, &thl->tslen);
  72577. 8036804: 69a0 ldr r0, [r4, #24]
  72578. 8036806: f7fc fd5b bl 80332c0 <snmp_asn1_enc_u32t_cnt>
  72579. snmp_asn1_enc_length_cnt(thl->tslen, &thl->tslenlen);
  72580. 803680a: 8e60 ldrh r0, [r4, #50] ; 0x32
  72581. 803680c: f104 0128 add.w r1, r4, #40 ; 0x28
  72582. 8036810: f7fc fd4b bl 80332aa <snmp_asn1_enc_length_cnt>
  72583. tot_len += 1 + thl->tslen + thl->tslenlen;
  72584. 8036814: f8b4 c032 ldrh.w ip, [r4, #50] ; 0x32
  72585. snmp_asn1_enc_s32t_cnt(m_trap->spc_trap, &thl->strplen);
  72586. 8036818: 6960 ldr r0, [r4, #20]
  72587. 803681a: f8cd c004 str.w ip, [sp, #4]
  72588. 803681e: f104 0134 add.w r1, r4, #52 ; 0x34
  72589. thl = &m_trap->thl;
  72590. tot_len = vb_len;
  72591. snmp_asn1_enc_u32t_cnt(m_trap->ts, &thl->tslen);
  72592. snmp_asn1_enc_length_cnt(thl->tslen, &thl->tslenlen);
  72593. tot_len += 1 + thl->tslen + thl->tslenlen;
  72594. 8036822: f894 9028 ldrb.w r9, [r4, #40] ; 0x28
  72595. snmp_asn1_enc_s32t_cnt(m_trap->spc_trap, &thl->strplen);
  72596. 8036826: f7fc fd60 bl 80332ea <snmp_asn1_enc_s32t_cnt>
  72597. snmp_asn1_enc_length_cnt(thl->strplen, &thl->strplenlen);
  72598. 803682a: 8ea0 ldrh r0, [r4, #52] ; 0x34
  72599. 803682c: f104 0129 add.w r1, r4, #41 ; 0x29
  72600. 8036830: f7fc fd3b bl 80332aa <snmp_asn1_enc_length_cnt>
  72601. tot_len += 1 + thl->strplen + thl->strplenlen;
  72602. 8036834: 8ea3 ldrh r3, [r4, #52] ; 0x34
  72603. snmp_asn1_enc_s32t_cnt(m_trap->gen_trap, &thl->gtrplen);
  72604. 8036836: 6920 ldr r0, [r4, #16]
  72605. 8036838: 9302 str r3, [sp, #8]
  72606. 803683a: f104 0136 add.w r1, r4, #54 ; 0x36
  72607. snmp_asn1_enc_length_cnt(thl->tslen, &thl->tslenlen);
  72608. tot_len += 1 + thl->tslen + thl->tslenlen;
  72609. snmp_asn1_enc_s32t_cnt(m_trap->spc_trap, &thl->strplen);
  72610. snmp_asn1_enc_length_cnt(thl->strplen, &thl->strplenlen);
  72611. tot_len += 1 + thl->strplen + thl->strplenlen;
  72612. 803683e: f894 8029 ldrb.w r8, [r4, #41] ; 0x29
  72613. snmp_asn1_enc_s32t_cnt(m_trap->gen_trap, &thl->gtrplen);
  72614. snmp_asn1_enc_length_cnt(thl->gtrplen, &thl->gtrplenlen);
  72615. tot_len += 1 + thl->gtrplen + thl->gtrplenlen;
  72616. thl->aaddrlen = 4;
  72617. 8036842: 2504 movs r5, #4
  72618. snmp_asn1_enc_s32t_cnt(m_trap->spc_trap, &thl->strplen);
  72619. snmp_asn1_enc_length_cnt(thl->strplen, &thl->strplenlen);
  72620. tot_len += 1 + thl->strplen + thl->strplenlen;
  72621. snmp_asn1_enc_s32t_cnt(m_trap->gen_trap, &thl->gtrplen);
  72622. 8036844: f7fc fd51 bl 80332ea <snmp_asn1_enc_s32t_cnt>
  72623. snmp_asn1_enc_length_cnt(thl->gtrplen, &thl->gtrplenlen);
  72624. 8036848: 8ee0 ldrh r0, [r4, #54] ; 0x36
  72625. 803684a: f104 012a add.w r1, r4, #42 ; 0x2a
  72626. 803684e: f7fc fd2c bl 80332aa <snmp_asn1_enc_length_cnt>
  72627. tot_len += 1 + thl->gtrplen + thl->gtrplenlen;
  72628. thl->aaddrlen = 4;
  72629. snmp_asn1_enc_length_cnt(thl->aaddrlen, &thl->aaddrlenlen);
  72630. 8036852: 4628 mov r0, r5
  72631. 8036854: f104 012b add.w r1, r4, #43 ; 0x2b
  72632. snmp_asn1_enc_length_cnt(thl->strplen, &thl->strplenlen);
  72633. tot_len += 1 + thl->strplen + thl->strplenlen;
  72634. snmp_asn1_enc_s32t_cnt(m_trap->gen_trap, &thl->gtrplen);
  72635. snmp_asn1_enc_length_cnt(thl->gtrplen, &thl->gtrplenlen);
  72636. tot_len += 1 + thl->gtrplen + thl->gtrplenlen;
  72637. 8036858: f8b4 b036 ldrh.w fp, [r4, #54] ; 0x36
  72638. 803685c: f894 702a ldrb.w r7, [r4, #42] ; 0x2a
  72639. thl->aaddrlen = 4;
  72640. 8036860: 8725 strh r5, [r4, #56] ; 0x38
  72641. snmp_asn1_enc_length_cnt(thl->aaddrlen, &thl->aaddrlenlen);
  72642. 8036862: f7fc fd22 bl 80332aa <snmp_asn1_enc_length_cnt>
  72643. tot_len += 1 + thl->aaddrlen + thl->aaddrlenlen;
  72644. 8036866: f894 202b ldrb.w r2, [r4, #43] ; 0x2b
  72645. snmp_asn1_enc_oid_cnt(m_trap->enterprise->len, &m_trap->enterprise->id[0], &thl->eidlen);
  72646. 803686a: 68a1 ldr r1, [r4, #8]
  72647. snmp_asn1_enc_length_cnt(thl->gtrplen, &thl->gtrplenlen);
  72648. tot_len += 1 + thl->gtrplen + thl->gtrplenlen;
  72649. thl->aaddrlen = 4;
  72650. snmp_asn1_enc_length_cnt(thl->aaddrlen, &thl->aaddrlenlen);
  72651. tot_len += 1 + thl->aaddrlen + thl->aaddrlenlen;
  72652. 803686c: 9203 str r2, [sp, #12]
  72653. snmp_asn1_enc_oid_cnt(m_trap->enterprise->len, &m_trap->enterprise->id[0], &thl->eidlen);
  72654. 803686e: f811 0b04 ldrb.w r0, [r1], #4
  72655. snmp_asn1_enc_length_cnt(thl->gtrplen, &thl->gtrplenlen);
  72656. tot_len += 1 + thl->gtrplen + thl->gtrplenlen;
  72657. thl->aaddrlen = 4;
  72658. snmp_asn1_enc_length_cnt(thl->aaddrlen, &thl->aaddrlenlen);
  72659. tot_len += 1 + thl->aaddrlen + thl->aaddrlenlen;
  72660. 8036872: f8b4 a038 ldrh.w sl, [r4, #56] ; 0x38
  72661. snmp_asn1_enc_oid_cnt(m_trap->enterprise->len, &m_trap->enterprise->id[0], &thl->eidlen);
  72662. 8036876: f104 023a add.w r2, r4, #58 ; 0x3a
  72663. 803687a: f7fc fd4b bl 8033314 <snmp_asn1_enc_oid_cnt>
  72664. snmp_asn1_enc_length_cnt(thl->eidlen, &thl->eidlenlen);
  72665. 803687e: 8f60 ldrh r0, [r4, #58] ; 0x3a
  72666. 8036880: f104 012c add.w r1, r4, #44 ; 0x2c
  72667. 8036884: f7fc fd11 bl 80332aa <snmp_asn1_enc_length_cnt>
  72668. snmp_asn1_enc_length_cnt(thl->tslen, &thl->tslenlen);
  72669. tot_len += 1 + thl->tslen + thl->tslenlen;
  72670. snmp_asn1_enc_s32t_cnt(m_trap->spc_trap, &thl->strplen);
  72671. snmp_asn1_enc_length_cnt(thl->strplen, &thl->strplenlen);
  72672. tot_len += 1 + thl->strplen + thl->strplenlen;
  72673. 8036888: f8dd c004 ldr.w ip, [sp, #4]
  72674. 803688c: 9b02 ldr r3, [sp, #8]
  72675. snmp_asn1_enc_s32t_cnt(m_trap->gen_trap, &thl->gtrplen);
  72676. snmp_asn1_enc_length_cnt(thl->gtrplen, &thl->gtrplenlen);
  72677. tot_len += 1 + thl->gtrplen + thl->gtrplenlen;
  72678. 803688e: 8f62 ldrh r2, [r4, #58] ; 0x3a
  72679. snmp_asn1_enc_length_cnt(thl->tslen, &thl->tslenlen);
  72680. tot_len += 1 + thl->tslen + thl->tslenlen;
  72681. snmp_asn1_enc_s32t_cnt(m_trap->spc_trap, &thl->strplen);
  72682. snmp_asn1_enc_length_cnt(thl->strplen, &thl->strplenlen);
  72683. tot_len += 1 + thl->strplen + thl->strplenlen;
  72684. 8036890: 4463 add r3, ip
  72685. 8036892: 3305 adds r3, #5
  72686. snmp_asn1_enc_s32t_cnt(m_trap->gen_trap, &thl->gtrplen);
  72687. snmp_asn1_enc_length_cnt(thl->gtrplen, &thl->gtrplenlen);
  72688. tot_len += 1 + thl->gtrplen + thl->gtrplenlen;
  72689. 8036894: 449b add fp, r3
  72690. 8036896: 44da add sl, fp
  72691. 8036898: fa12 fa8a uxtah sl, r2, sl
  72692. thl->aaddrlen = 4;
  72693. snmp_asn1_enc_length_cnt(thl->aaddrlen, &thl->aaddrlenlen);
  72694. tot_len += 1 + thl->aaddrlen + thl->aaddrlenlen;
  72695. 803689c: 44d1 add r9, sl
  72696. 803689e: 44c8 add r8, r9
  72697. snmp_asn1_enc_oid_cnt(m_trap->enterprise->len, &m_trap->enterprise->id[0], &thl->eidlen);
  72698. snmp_asn1_enc_length_cnt(thl->eidlen, &thl->eidlenlen);
  72699. tot_len += 1 + thl->eidlen + thl->eidlenlen;
  72700. 80368a0: 9b03 ldr r3, [sp, #12]
  72701. snmp_asn1_enc_length_cnt(thl->gtrplen, &thl->gtrplenlen);
  72702. tot_len += 1 + thl->gtrplen + thl->gtrplenlen;
  72703. thl->aaddrlen = 4;
  72704. snmp_asn1_enc_length_cnt(thl->aaddrlen, &thl->aaddrlenlen);
  72705. tot_len += 1 + thl->aaddrlen + thl->aaddrlenlen;
  72706. 80368a2: fa17 f788 uxtah r7, r7, r8
  72707. snmp_asn1_enc_oid_cnt(m_trap->enterprise->len, &m_trap->enterprise->id[0], &thl->eidlen);
  72708. snmp_asn1_enc_length_cnt(thl->eidlen, &thl->eidlenlen);
  72709. tot_len += 1 + thl->eidlen + thl->eidlenlen;
  72710. 80368a6: 19df adds r7, r3, r7
  72711. 80368a8: f894 302c ldrb.w r3, [r4, #44] ; 0x2c
  72712. 80368ac: 18ff adds r7, r7, r3
  72713. 80368ae: fa16 f687 uxtah r6, r6, r7
  72714. 80368b2: b2b6 uxth r6, r6
  72715. thl->pdulen = tot_len;
  72716. snmp_asn1_enc_length_cnt(thl->pdulen, &thl->pdulenlen);
  72717. 80368b4: 4630 mov r0, r6
  72718. 80368b6: f104 012d add.w r1, r4, #45 ; 0x2d
  72719. tot_len += 1 + thl->pdulenlen;
  72720. thl->comlen = sizeof(snmp_publiccommunity) - 1;
  72721. 80368ba: 2706 movs r7, #6
  72722. snmp_asn1_enc_oid_cnt(m_trap->enterprise->len, &m_trap->enterprise->id[0], &thl->eidlen);
  72723. snmp_asn1_enc_length_cnt(thl->eidlen, &thl->eidlenlen);
  72724. tot_len += 1 + thl->eidlen + thl->eidlenlen;
  72725. thl->pdulen = tot_len;
  72726. 80368bc: 87a6 strh r6, [r4, #60] ; 0x3c
  72727. snmp_asn1_enc_length_cnt(thl->pdulen, &thl->pdulenlen);
  72728. 80368be: f7fc fcf4 bl 80332aa <snmp_asn1_enc_length_cnt>
  72729. tot_len += 1 + thl->pdulenlen;
  72730. thl->comlen = sizeof(snmp_publiccommunity) - 1;
  72731. snmp_asn1_enc_length_cnt(thl->comlen, &thl->comlenlen);
  72732. 80368c2: 4638 mov r0, r7
  72733. 80368c4: f104 012e add.w r1, r4, #46 ; 0x2e
  72734. snmp_asn1_enc_length_cnt(thl->eidlen, &thl->eidlenlen);
  72735. tot_len += 1 + thl->eidlen + thl->eidlenlen;
  72736. thl->pdulen = tot_len;
  72737. snmp_asn1_enc_length_cnt(thl->pdulen, &thl->pdulenlen);
  72738. tot_len += 1 + thl->pdulenlen;
  72739. 80368c8: f894 a02d ldrb.w sl, [r4, #45] ; 0x2d
  72740. thl->comlen = sizeof(snmp_publiccommunity) - 1;
  72741. 80368cc: 87e7 strh r7, [r4, #62] ; 0x3e
  72742. snmp_asn1_enc_length_cnt(thl->comlen, &thl->comlenlen);
  72743. 80368ce: f7fc fcec bl 80332aa <snmp_asn1_enc_length_cnt>
  72744. tot_len += 1 + thl->comlenlen + thl->comlen;
  72745. snmp_asn1_enc_s32t_cnt(snmp_version, &thl->verlen);
  72746. 80368d2: 4b86 ldr r3, [pc, #536] ; (8036aec <snmp_send_trap+0x358>)
  72747. snmp_asn1_enc_length_cnt(thl->pdulen, &thl->pdulenlen);
  72748. tot_len += 1 + thl->pdulenlen;
  72749. thl->comlen = sizeof(snmp_publiccommunity) - 1;
  72750. snmp_asn1_enc_length_cnt(thl->comlen, &thl->comlenlen);
  72751. tot_len += 1 + thl->comlenlen + thl->comlen;
  72752. 80368d4: f894 902e ldrb.w r9, [r4, #46] ; 0x2e
  72753. snmp_asn1_enc_s32t_cnt(snmp_version, &thl->verlen);
  72754. 80368d8: f8d3 8000 ldr.w r8, [r3]
  72755. snmp_asn1_enc_length_cnt(thl->pdulen, &thl->pdulenlen);
  72756. tot_len += 1 + thl->pdulenlen;
  72757. thl->comlen = sizeof(snmp_publiccommunity) - 1;
  72758. snmp_asn1_enc_length_cnt(thl->comlen, &thl->comlenlen);
  72759. tot_len += 1 + thl->comlenlen + thl->comlen;
  72760. 80368dc: f8b4 b03e ldrh.w fp, [r4, #62] ; 0x3e
  72761. snmp_asn1_enc_s32t_cnt(snmp_version, &thl->verlen);
  72762. 80368e0: 4640 mov r0, r8
  72763. 80368e2: f104 0140 add.w r1, r4, #64 ; 0x40
  72764. 80368e6: f7fc fd00 bl 80332ea <snmp_asn1_enc_s32t_cnt>
  72765. snmp_asn1_enc_length_cnt(thl->verlen, &thl->verlenlen);
  72766. 80368ea: f8b4 0040 ldrh.w r0, [r4, #64] ; 0x40
  72767. 80368ee: f104 012f add.w r1, r4, #47 ; 0x2f
  72768. 80368f2: f7fc fcda bl 80332aa <snmp_asn1_enc_length_cnt>
  72769. snmp_asn1_enc_length_cnt(thl->pdulen, &thl->pdulenlen);
  72770. tot_len += 1 + thl->pdulenlen;
  72771. thl->comlen = sizeof(snmp_publiccommunity) - 1;
  72772. snmp_asn1_enc_length_cnt(thl->comlen, &thl->comlenlen);
  72773. tot_len += 1 + thl->comlenlen + thl->comlen;
  72774. 80368f6: f8b4 3040 ldrh.w r3, [r4, #64] ; 0x40
  72775. 80368fa: 449b add fp, r3
  72776. 80368fc: f10b 0b03 add.w fp, fp, #3
  72777. snmp_asn1_enc_s32t_cnt(snmp_version, &thl->verlen);
  72778. snmp_asn1_enc_length_cnt(thl->verlen, &thl->verlenlen);
  72779. tot_len += 1 + thl->verlen + thl->verlenlen;
  72780. 8036900: f894 302f ldrb.w r3, [r4, #47] ; 0x2f
  72781. snmp_asn1_enc_length_cnt(thl->pdulen, &thl->pdulenlen);
  72782. tot_len += 1 + thl->pdulenlen;
  72783. thl->comlen = sizeof(snmp_publiccommunity) - 1;
  72784. snmp_asn1_enc_length_cnt(thl->comlen, &thl->comlenlen);
  72785. tot_len += 1 + thl->comlenlen + thl->comlen;
  72786. 8036904: 44da add sl, fp
  72787. snmp_asn1_enc_s32t_cnt(snmp_version, &thl->verlen);
  72788. snmp_asn1_enc_length_cnt(thl->verlen, &thl->verlenlen);
  72789. tot_len += 1 + thl->verlen + thl->verlenlen;
  72790. 8036906: 44d1 add r9, sl
  72791. 8036908: 4499 add r9, r3
  72792. 803690a: fa16 f689 uxtah r6, r6, r9
  72793. 803690e: b2b6 uxth r6, r6
  72794. thl->seqlen = tot_len;
  72795. snmp_asn1_enc_length_cnt(thl->seqlen, &thl->seqlenlen);
  72796. 8036910: 4630 mov r0, r6
  72797. 8036912: f104 0130 add.w r1, r4, #48 ; 0x30
  72798. snmp_asn1_enc_s32t_cnt(snmp_version, &thl->verlen);
  72799. snmp_asn1_enc_length_cnt(thl->verlen, &thl->verlenlen);
  72800. tot_len += 1 + thl->verlen + thl->verlenlen;
  72801. thl->seqlen = tot_len;
  72802. 8036916: f8a4 6042 strh.w r6, [r4, #66] ; 0x42
  72803. snmp_asn1_enc_length_cnt(thl->seqlen, &thl->seqlenlen);
  72804. 803691a: f7fc fcc6 bl 80332aa <snmp_asn1_enc_length_cnt>
  72805. tot_len += 1 + thl->seqlenlen;
  72806. 803691e: f894 3030 ldrb.w r3, [r4, #48] ; 0x30
  72807. 8036922: 3301 adds r3, #1
  72808. 8036924: 18f1 adds r1, r6, r3
  72809. /* pass 0, calculate length fields */
  72810. tot_len = snmp_varbind_list_sum(&trap_msg.outvb);
  72811. tot_len = snmp_trap_header_sum(&trap_msg, tot_len);
  72812. /* allocate pbuf(s) */
  72813. p = pbuf_alloc(PBUF_TRANSPORT, tot_len, PBUF_POOL);
  72814. 8036926: 2000 movs r0, #0
  72815. 8036928: b289 uxth r1, r1
  72816. 803692a: 2203 movs r2, #3
  72817. 803692c: f7f9 f9f9 bl 802fd22 <pbuf_alloc>
  72818. if (p != NULL)
  72819. 8036930: 4606 mov r6, r0
  72820. 8036932: 2800 cmp r0, #0
  72821. 8036934: f000 80f3 beq.w 8036b1e <snmp_send_trap+0x38a>
  72822. snmp_trap_header_enc(struct snmp_msg_trap *m_trap, struct pbuf *p)
  72823. {
  72824. u16_t ofs;
  72825. ofs = 0;
  72826. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ));
  72827. 8036938: 2100 movs r1, #0
  72828. 803693a: 2230 movs r2, #48 ; 0x30
  72829. 803693c: f7fc fd02 bl 8033344 <snmp_asn1_enc_type>
  72830. ofs += 1;
  72831. snmp_asn1_enc_length(p, ofs, m_trap->thl.seqlen);
  72832. 8036940: 2101 movs r1, #1
  72833. 8036942: f8b4 2042 ldrh.w r2, [r4, #66] ; 0x42
  72834. 8036946: 4630 mov r0, r6
  72835. 8036948: f7fc fd10 bl 803336c <snmp_asn1_enc_length>
  72836. ofs += m_trap->thl.seqlenlen;
  72837. 803694c: f894 9030 ldrb.w r9, [r4, #48] ; 0x30
  72838. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  72839. 8036950: 2202 movs r2, #2
  72840. 8036952: f109 0101 add.w r1, r9, #1
  72841. 8036956: 4630 mov r0, r6
  72842. ofs += 1;
  72843. 8036958: f109 0902 add.w r9, r9, #2
  72844. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ));
  72845. ofs += 1;
  72846. snmp_asn1_enc_length(p, ofs, m_trap->thl.seqlen);
  72847. ofs += m_trap->thl.seqlenlen;
  72848. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  72849. 803695c: f7fc fcf2 bl 8033344 <snmp_asn1_enc_type>
  72850. ofs += 1;
  72851. snmp_asn1_enc_length(p, ofs, m_trap->thl.verlen);
  72852. 8036960: 4649 mov r1, r9
  72853. 8036962: f8b4 2040 ldrh.w r2, [r4, #64] ; 0x40
  72854. 8036966: 4630 mov r0, r6
  72855. 8036968: f7fc fd00 bl 803336c <snmp_asn1_enc_length>
  72856. ofs += m_trap->thl.verlenlen;
  72857. 803696c: f894 302f ldrb.w r3, [r4, #47] ; 0x2f
  72858. snmp_asn1_enc_s32t(p, ofs, m_trap->thl.verlen, snmp_version);
  72859. 8036970: f8b4 2040 ldrh.w r2, [r4, #64] ; 0x40
  72860. ofs += m_trap->thl.seqlenlen;
  72861. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  72862. ofs += 1;
  72863. snmp_asn1_enc_length(p, ofs, m_trap->thl.verlen);
  72864. ofs += m_trap->thl.verlenlen;
  72865. 8036974: 4499 add r9, r3
  72866. snmp_asn1_enc_s32t(p, ofs, m_trap->thl.verlen, snmp_version);
  72867. 8036976: 4649 mov r1, r9
  72868. 8036978: 4643 mov r3, r8
  72869. 803697a: 4630 mov r0, r6
  72870. 803697c: f7fc fd7e bl 803347c <snmp_asn1_enc_s32t>
  72871. ofs += m_trap->thl.verlen;
  72872. 8036980: f8b4 3040 ldrh.w r3, [r4, #64] ; 0x40
  72873. 8036984: 4499 add r9, r3
  72874. 8036986: fa1f f989 uxth.w r9, r9
  72875. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR));
  72876. 803698a: 462a mov r2, r5
  72877. ofs += 1;
  72878. 803698c: f109 0501 add.w r5, r9, #1
  72879. snmp_asn1_enc_length(p, ofs, m_trap->thl.verlen);
  72880. ofs += m_trap->thl.verlenlen;
  72881. snmp_asn1_enc_s32t(p, ofs, m_trap->thl.verlen, snmp_version);
  72882. ofs += m_trap->thl.verlen;
  72883. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR));
  72884. 8036990: 4649 mov r1, r9
  72885. ofs += 1;
  72886. 8036992: b2ad uxth r5, r5
  72887. snmp_asn1_enc_length(p, ofs, m_trap->thl.verlen);
  72888. ofs += m_trap->thl.verlenlen;
  72889. snmp_asn1_enc_s32t(p, ofs, m_trap->thl.verlen, snmp_version);
  72890. ofs += m_trap->thl.verlen;
  72891. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR));
  72892. 8036994: 4630 mov r0, r6
  72893. 8036996: f7fc fcd5 bl 8033344 <snmp_asn1_enc_type>
  72894. ofs += 1;
  72895. snmp_asn1_enc_length(p, ofs, m_trap->thl.comlen);
  72896. 803699a: 4629 mov r1, r5
  72897. 803699c: 8fe2 ldrh r2, [r4, #62] ; 0x3e
  72898. 803699e: 4630 mov r0, r6
  72899. 80369a0: f7fc fce4 bl 803336c <snmp_asn1_enc_length>
  72900. ofs += m_trap->thl.comlenlen;
  72901. 80369a4: f894 302e ldrb.w r3, [r4, #46] ; 0x2e
  72902. snmp_asn1_enc_raw(p, ofs, m_trap->thl.comlen, (u8_t *)&snmp_publiccommunity[0]);
  72903. 80369a8: 8fe2 ldrh r2, [r4, #62] ; 0x3e
  72904. ofs += m_trap->thl.verlen;
  72905. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR));
  72906. ofs += 1;
  72907. snmp_asn1_enc_length(p, ofs, m_trap->thl.comlen);
  72908. ofs += m_trap->thl.comlenlen;
  72909. 80369aa: 18ed adds r5, r5, r3
  72910. 80369ac: b2ad uxth r5, r5
  72911. snmp_asn1_enc_raw(p, ofs, m_trap->thl.comlen, (u8_t *)&snmp_publiccommunity[0]);
  72912. 80369ae: 4629 mov r1, r5
  72913. 80369b0: 4b4f ldr r3, [pc, #316] ; (8036af0 <snmp_send_trap+0x35c>)
  72914. 80369b2: 4630 mov r0, r6
  72915. 80369b4: f7fc fe02 bl 80335bc <snmp_asn1_enc_raw>
  72916. ofs += m_trap->thl.comlen;
  72917. 80369b8: 8fe3 ldrh r3, [r4, #62] ; 0x3e
  72918. 80369ba: 18ed adds r5, r5, r3
  72919. 80369bc: b2ad uxth r5, r5
  72920. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_TRAP));
  72921. 80369be: 4629 mov r1, r5
  72922. ofs += 1;
  72923. 80369c0: 3501 adds r5, #1
  72924. snmp_asn1_enc_length(p, ofs, m_trap->thl.comlen);
  72925. ofs += m_trap->thl.comlenlen;
  72926. snmp_asn1_enc_raw(p, ofs, m_trap->thl.comlen, (u8_t *)&snmp_publiccommunity[0]);
  72927. ofs += m_trap->thl.comlen;
  72928. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_TRAP));
  72929. 80369c2: 22a4 movs r2, #164 ; 0xa4
  72930. ofs += 1;
  72931. 80369c4: b2ad uxth r5, r5
  72932. snmp_asn1_enc_length(p, ofs, m_trap->thl.comlen);
  72933. ofs += m_trap->thl.comlenlen;
  72934. snmp_asn1_enc_raw(p, ofs, m_trap->thl.comlen, (u8_t *)&snmp_publiccommunity[0]);
  72935. ofs += m_trap->thl.comlen;
  72936. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_TRAP));
  72937. 80369c6: 4630 mov r0, r6
  72938. 80369c8: f7fc fcbc bl 8033344 <snmp_asn1_enc_type>
  72939. ofs += 1;
  72940. snmp_asn1_enc_length(p, ofs, m_trap->thl.pdulen);
  72941. 80369cc: 4629 mov r1, r5
  72942. 80369ce: 8fa2 ldrh r2, [r4, #60] ; 0x3c
  72943. 80369d0: 4630 mov r0, r6
  72944. 80369d2: f7fc fccb bl 803336c <snmp_asn1_enc_length>
  72945. ofs += m_trap->thl.pdulenlen;
  72946. 80369d6: f894 302d ldrb.w r3, [r4, #45] ; 0x2d
  72947. 80369da: 18ed adds r5, r5, r3
  72948. 80369dc: b2ad uxth r5, r5
  72949. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID));
  72950. 80369de: 4629 mov r1, r5
  72951. ofs += 1;
  72952. 80369e0: 3501 adds r5, #1
  72953. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_TRAP));
  72954. ofs += 1;
  72955. snmp_asn1_enc_length(p, ofs, m_trap->thl.pdulen);
  72956. ofs += m_trap->thl.pdulenlen;
  72957. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID));
  72958. 80369e2: 463a mov r2, r7
  72959. ofs += 1;
  72960. 80369e4: b2ad uxth r5, r5
  72961. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_TRAP));
  72962. ofs += 1;
  72963. snmp_asn1_enc_length(p, ofs, m_trap->thl.pdulen);
  72964. ofs += m_trap->thl.pdulenlen;
  72965. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID));
  72966. 80369e6: 4630 mov r0, r6
  72967. 80369e8: f7fc fcac bl 8033344 <snmp_asn1_enc_type>
  72968. ofs += 1;
  72969. snmp_asn1_enc_length(p, ofs, m_trap->thl.eidlen);
  72970. 80369ec: 4629 mov r1, r5
  72971. 80369ee: 8f62 ldrh r2, [r4, #58] ; 0x3a
  72972. 80369f0: 4630 mov r0, r6
  72973. 80369f2: f7fc fcbb bl 803336c <snmp_asn1_enc_length>
  72974. ofs += m_trap->thl.eidlenlen;
  72975. 80369f6: f894 302c ldrb.w r3, [r4, #44] ; 0x2c
  72976. 80369fa: 18ed adds r5, r5, r3
  72977. snmp_asn1_enc_oid(p, ofs, m_trap->enterprise->len, &m_trap->enterprise->id[0]);
  72978. 80369fc: 68a3 ldr r3, [r4, #8]
  72979. ofs += m_trap->thl.pdulenlen;
  72980. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID));
  72981. ofs += 1;
  72982. snmp_asn1_enc_length(p, ofs, m_trap->thl.eidlen);
  72983. ofs += m_trap->thl.eidlenlen;
  72984. 80369fe: b2ad uxth r5, r5
  72985. snmp_asn1_enc_oid(p, ofs, m_trap->enterprise->len, &m_trap->enterprise->id[0]);
  72986. 8036a00: 4629 mov r1, r5
  72987. 8036a02: f813 2b04 ldrb.w r2, [r3], #4
  72988. 8036a06: 4630 mov r0, r6
  72989. 8036a08: f7fc fd65 bl 80334d6 <snmp_asn1_enc_oid>
  72990. ofs += m_trap->thl.eidlen;
  72991. 8036a0c: 8f63 ldrh r3, [r4, #58] ; 0x3a
  72992. 8036a0e: 18ed adds r5, r5, r3
  72993. 8036a10: b2ad uxth r5, r5
  72994. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR));
  72995. 8036a12: 4629 mov r1, r5
  72996. ofs += 1;
  72997. 8036a14: 3501 adds r5, #1
  72998. snmp_asn1_enc_length(p, ofs, m_trap->thl.eidlen);
  72999. ofs += m_trap->thl.eidlenlen;
  73000. snmp_asn1_enc_oid(p, ofs, m_trap->enterprise->len, &m_trap->enterprise->id[0]);
  73001. ofs += m_trap->thl.eidlen;
  73002. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR));
  73003. 8036a16: 2240 movs r2, #64 ; 0x40
  73004. ofs += 1;
  73005. 8036a18: b2ad uxth r5, r5
  73006. snmp_asn1_enc_length(p, ofs, m_trap->thl.eidlen);
  73007. ofs += m_trap->thl.eidlenlen;
  73008. snmp_asn1_enc_oid(p, ofs, m_trap->enterprise->len, &m_trap->enterprise->id[0]);
  73009. ofs += m_trap->thl.eidlen;
  73010. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR));
  73011. 8036a1a: 4630 mov r0, r6
  73012. 8036a1c: f7fc fc92 bl 8033344 <snmp_asn1_enc_type>
  73013. ofs += 1;
  73014. snmp_asn1_enc_length(p, ofs, m_trap->thl.aaddrlen);
  73015. 8036a20: 4629 mov r1, r5
  73016. 8036a22: 8f22 ldrh r2, [r4, #56] ; 0x38
  73017. 8036a24: 4630 mov r0, r6
  73018. 8036a26: f7fc fca1 bl 803336c <snmp_asn1_enc_length>
  73019. ofs += m_trap->thl.aaddrlenlen;
  73020. 8036a2a: f894 302b ldrb.w r3, [r4, #43] ; 0x2b
  73021. snmp_asn1_enc_raw(p, ofs, m_trap->thl.aaddrlen, &m_trap->sip_raw[0]);
  73022. 8036a2e: 8f22 ldrh r2, [r4, #56] ; 0x38
  73023. ofs += m_trap->thl.eidlen;
  73024. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR));
  73025. ofs += 1;
  73026. snmp_asn1_enc_length(p, ofs, m_trap->thl.aaddrlen);
  73027. ofs += m_trap->thl.aaddrlenlen;
  73028. 8036a30: 18ed adds r5, r5, r3
  73029. 8036a32: b2ad uxth r5, r5
  73030. snmp_asn1_enc_raw(p, ofs, m_trap->thl.aaddrlen, &m_trap->sip_raw[0]);
  73031. 8036a34: 4629 mov r1, r5
  73032. 8036a36: f104 030c add.w r3, r4, #12
  73033. 8036a3a: 4630 mov r0, r6
  73034. 8036a3c: f7fc fdbe bl 80335bc <snmp_asn1_enc_raw>
  73035. ofs += m_trap->thl.aaddrlen;
  73036. 8036a40: 8f23 ldrh r3, [r4, #56] ; 0x38
  73037. 8036a42: 18ed adds r5, r5, r3
  73038. 8036a44: b2ad uxth r5, r5
  73039. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  73040. 8036a46: 4629 mov r1, r5
  73041. ofs += 1;
  73042. 8036a48: 3501 adds r5, #1
  73043. snmp_asn1_enc_length(p, ofs, m_trap->thl.aaddrlen);
  73044. ofs += m_trap->thl.aaddrlenlen;
  73045. snmp_asn1_enc_raw(p, ofs, m_trap->thl.aaddrlen, &m_trap->sip_raw[0]);
  73046. ofs += m_trap->thl.aaddrlen;
  73047. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  73048. 8036a4a: 2202 movs r2, #2
  73049. ofs += 1;
  73050. 8036a4c: b2ad uxth r5, r5
  73051. snmp_asn1_enc_length(p, ofs, m_trap->thl.aaddrlen);
  73052. ofs += m_trap->thl.aaddrlenlen;
  73053. snmp_asn1_enc_raw(p, ofs, m_trap->thl.aaddrlen, &m_trap->sip_raw[0]);
  73054. ofs += m_trap->thl.aaddrlen;
  73055. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  73056. 8036a4e: 4630 mov r0, r6
  73057. 8036a50: f7fc fc78 bl 8033344 <snmp_asn1_enc_type>
  73058. ofs += 1;
  73059. snmp_asn1_enc_length(p, ofs, m_trap->thl.gtrplen);
  73060. 8036a54: 4629 mov r1, r5
  73061. 8036a56: 8ee2 ldrh r2, [r4, #54] ; 0x36
  73062. 8036a58: 4630 mov r0, r6
  73063. 8036a5a: f7fc fc87 bl 803336c <snmp_asn1_enc_length>
  73064. ofs += m_trap->thl.gtrplenlen;
  73065. 8036a5e: f894 302a ldrb.w r3, [r4, #42] ; 0x2a
  73066. snmp_asn1_enc_u32t(p, ofs, m_trap->thl.gtrplen, m_trap->gen_trap);
  73067. 8036a62: 8ee2 ldrh r2, [r4, #54] ; 0x36
  73068. ofs += m_trap->thl.aaddrlen;
  73069. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  73070. ofs += 1;
  73071. snmp_asn1_enc_length(p, ofs, m_trap->thl.gtrplen);
  73072. ofs += m_trap->thl.gtrplenlen;
  73073. 8036a64: 18ed adds r5, r5, r3
  73074. 8036a66: b2ad uxth r5, r5
  73075. snmp_asn1_enc_u32t(p, ofs, m_trap->thl.gtrplen, m_trap->gen_trap);
  73076. 8036a68: 4629 mov r1, r5
  73077. 8036a6a: 6923 ldr r3, [r4, #16]
  73078. 8036a6c: 4630 mov r0, r6
  73079. 8036a6e: f7fc fcc5 bl 80333fc <snmp_asn1_enc_u32t>
  73080. ofs += m_trap->thl.gtrplen;
  73081. 8036a72: 8ee3 ldrh r3, [r4, #54] ; 0x36
  73082. 8036a74: 18ed adds r5, r5, r3
  73083. 8036a76: b2ad uxth r5, r5
  73084. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  73085. 8036a78: 4629 mov r1, r5
  73086. ofs += 1;
  73087. 8036a7a: 3501 adds r5, #1
  73088. snmp_asn1_enc_length(p, ofs, m_trap->thl.gtrplen);
  73089. ofs += m_trap->thl.gtrplenlen;
  73090. snmp_asn1_enc_u32t(p, ofs, m_trap->thl.gtrplen, m_trap->gen_trap);
  73091. ofs += m_trap->thl.gtrplen;
  73092. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  73093. 8036a7c: 2202 movs r2, #2
  73094. ofs += 1;
  73095. 8036a7e: b2ad uxth r5, r5
  73096. snmp_asn1_enc_length(p, ofs, m_trap->thl.gtrplen);
  73097. ofs += m_trap->thl.gtrplenlen;
  73098. snmp_asn1_enc_u32t(p, ofs, m_trap->thl.gtrplen, m_trap->gen_trap);
  73099. ofs += m_trap->thl.gtrplen;
  73100. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  73101. 8036a80: 4630 mov r0, r6
  73102. 8036a82: f7fc fc5f bl 8033344 <snmp_asn1_enc_type>
  73103. ofs += 1;
  73104. snmp_asn1_enc_length(p, ofs, m_trap->thl.strplen);
  73105. 8036a86: 4629 mov r1, r5
  73106. 8036a88: 8ea2 ldrh r2, [r4, #52] ; 0x34
  73107. 8036a8a: 4630 mov r0, r6
  73108. 8036a8c: f7fc fc6e bl 803336c <snmp_asn1_enc_length>
  73109. ofs += m_trap->thl.strplenlen;
  73110. 8036a90: f894 3029 ldrb.w r3, [r4, #41] ; 0x29
  73111. snmp_asn1_enc_u32t(p, ofs, m_trap->thl.strplen, m_trap->spc_trap);
  73112. 8036a94: 8ea2 ldrh r2, [r4, #52] ; 0x34
  73113. ofs += m_trap->thl.gtrplen;
  73114. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  73115. ofs += 1;
  73116. snmp_asn1_enc_length(p, ofs, m_trap->thl.strplen);
  73117. ofs += m_trap->thl.strplenlen;
  73118. 8036a96: 18ed adds r5, r5, r3
  73119. 8036a98: b2ad uxth r5, r5
  73120. snmp_asn1_enc_u32t(p, ofs, m_trap->thl.strplen, m_trap->spc_trap);
  73121. 8036a9a: 4629 mov r1, r5
  73122. 8036a9c: 6963 ldr r3, [r4, #20]
  73123. 8036a9e: 4630 mov r0, r6
  73124. 8036aa0: f7fc fcac bl 80333fc <snmp_asn1_enc_u32t>
  73125. ofs += m_trap->thl.strplen;
  73126. 8036aa4: 8ea3 ldrh r3, [r4, #52] ; 0x34
  73127. 8036aa6: 18ed adds r5, r5, r3
  73128. 8036aa8: b2ad uxth r5, r5
  73129. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_TIMETICKS));
  73130. 8036aaa: 4629 mov r1, r5
  73131. ofs += 1;
  73132. 8036aac: 3501 adds r5, #1
  73133. snmp_asn1_enc_length(p, ofs, m_trap->thl.strplen);
  73134. ofs += m_trap->thl.strplenlen;
  73135. snmp_asn1_enc_u32t(p, ofs, m_trap->thl.strplen, m_trap->spc_trap);
  73136. ofs += m_trap->thl.strplen;
  73137. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_TIMETICKS));
  73138. 8036aae: 2243 movs r2, #67 ; 0x43
  73139. ofs += 1;
  73140. 8036ab0: b2ad uxth r5, r5
  73141. snmp_asn1_enc_length(p, ofs, m_trap->thl.strplen);
  73142. ofs += m_trap->thl.strplenlen;
  73143. snmp_asn1_enc_u32t(p, ofs, m_trap->thl.strplen, m_trap->spc_trap);
  73144. ofs += m_trap->thl.strplen;
  73145. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_TIMETICKS));
  73146. 8036ab2: 4630 mov r0, r6
  73147. 8036ab4: f7fc fc46 bl 8033344 <snmp_asn1_enc_type>
  73148. ofs += 1;
  73149. snmp_asn1_enc_length(p, ofs, m_trap->thl.tslen);
  73150. 8036ab8: 4629 mov r1, r5
  73151. 8036aba: 8e62 ldrh r2, [r4, #50] ; 0x32
  73152. 8036abc: 4630 mov r0, r6
  73153. 8036abe: f7fc fc55 bl 803336c <snmp_asn1_enc_length>
  73154. ofs += m_trap->thl.tslenlen;
  73155. 8036ac2: f894 3028 ldrb.w r3, [r4, #40] ; 0x28
  73156. snmp_asn1_enc_u32t(p, ofs, m_trap->thl.tslen, m_trap->ts);
  73157. 8036ac6: 8e62 ldrh r2, [r4, #50] ; 0x32
  73158. ofs += m_trap->thl.strplen;
  73159. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_TIMETICKS));
  73160. ofs += 1;
  73161. snmp_asn1_enc_length(p, ofs, m_trap->thl.tslen);
  73162. ofs += m_trap->thl.tslenlen;
  73163. 8036ac8: 18ed adds r5, r5, r3
  73164. 8036aca: b2ad uxth r5, r5
  73165. snmp_asn1_enc_u32t(p, ofs, m_trap->thl.tslen, m_trap->ts);
  73166. 8036acc: 4629 mov r1, r5
  73167. 8036ace: 69a3 ldr r3, [r4, #24]
  73168. 8036ad0: 4630 mov r0, r6
  73169. 8036ad2: f7fc fc93 bl 80333fc <snmp_asn1_enc_u32t>
  73170. ofs += m_trap->thl.tslen;
  73171. 8036ad6: 8e63 ldrh r3, [r4, #50] ; 0x32
  73172. 8036ad8: 18ea adds r2, r5, r3
  73173. {
  73174. u16_t ofs;
  73175. /* pass 1, encode packet ino the pbuf(s) */
  73176. ofs = snmp_trap_header_enc(&trap_msg, p);
  73177. snmp_varbind_list_enc(&trap_msg.outvb, p, ofs);
  73178. 8036ada: 4631 mov r1, r6
  73179. 8036adc: e00a b.n 8036af4 <snmp_send_trap+0x360>
  73180. 8036ade: bf00 nop
  73181. 8036ae0: 200100a4 .word 0x200100a4
  73182. 8036ae4: 2001008c .word 0x2001008c
  73183. 8036ae8: 200100a8 .word 0x200100a8
  73184. 8036aec: 08045068 .word 0x08045068
  73185. 8036af0: 0804506c .word 0x0804506c
  73186. 8036af4: b292 uxth r2, r2
  73187. 8036af6: f104 001c add.w r0, r4, #28
  73188. 8036afa: f7ff fcb1 bl 8036460 <snmp_varbind_list_enc>
  73189. snmp_inc_snmpouttraps();
  73190. 8036afe: f7fe f855 bl 8034bac <snmp_inc_snmpouttraps>
  73191. snmp_inc_snmpoutpkts();
  73192. 8036b02: f7fd ffab bl 8034a5c <snmp_inc_snmpoutpkts>
  73193. /** send to the TRAP destination */
  73194. udp_sendto(trap_msg.pcb, p, &trap_msg.dip, SNMP_TRAP_PORT);
  73195. 8036b06: 4622 mov r2, r4
  73196. 8036b08: 4631 mov r1, r6
  73197. 8036b0a: f852 0b04 ldr.w r0, [r2], #4
  73198. 8036b0e: 23a2 movs r3, #162 ; 0xa2
  73199. 8036b10: f7fb fdbb bl 803268a <udp_sendto>
  73200. pbuf_free(p);
  73201. 8036b14: 4630 mov r0, r6
  73202. 8036b16: f7f9 f8b7 bl 802fc88 <pbuf_free>
  73203. {
  73204. return ERR_MEM;
  73205. }
  73206. }
  73207. }
  73208. return ERR_OK;
  73209. 8036b1a: 2000 movs r0, #0
  73210. 8036b1c: e000 b.n 8036b20 <snmp_send_trap+0x38c>
  73211. pbuf_free(p);
  73212. }
  73213. else
  73214. {
  73215. return ERR_MEM;
  73216. 8036b1e: 20ff movs r0, #255 ; 0xff
  73217. }
  73218. }
  73219. }
  73220. return ERR_OK;
  73221. }
  73222. 8036b20: b240 sxtb r0, r0
  73223. 8036b22: b005 add sp, #20
  73224. 8036b24: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  73225. 08036b28 <snmp_authfail_trap>:
  73226. snmp_send_trap(SNMP_GENTRAP_COLDSTART, NULL, 0);
  73227. }
  73228. void
  73229. snmp_authfail_trap(void)
  73230. {
  73231. 8036b28: b507 push {r0, r1, r2, lr}
  73232. u8_t enable;
  73233. snmp_get_snmpenableauthentraps(&enable);
  73234. 8036b2a: f10d 0007 add.w r0, sp, #7
  73235. 8036b2e: f7fe f84b bl 8034bc8 <snmp_get_snmpenableauthentraps>
  73236. if (enable == 1)
  73237. 8036b32: f89d 3007 ldrb.w r3, [sp, #7]
  73238. 8036b36: 2b01 cmp r3, #1
  73239. 8036b38: d109 bne.n 8036b4e <snmp_authfail_trap+0x26>
  73240. {
  73241. trap_msg.outvb.head = NULL;
  73242. 8036b3a: 2100 movs r1, #0
  73243. 8036b3c: 4b04 ldr r3, [pc, #16] ; (8036b50 <snmp_authfail_trap+0x28>)
  73244. trap_msg.outvb.tail = NULL;
  73245. trap_msg.outvb.count = 0;
  73246. snmp_send_trap(SNMP_GENTRAP_AUTHFAIL, NULL, 0);
  73247. 8036b3e: 2004 movs r0, #4
  73248. 8036b40: 460a mov r2, r1
  73249. {
  73250. u8_t enable;
  73251. snmp_get_snmpenableauthentraps(&enable);
  73252. if (enable == 1)
  73253. {
  73254. trap_msg.outvb.head = NULL;
  73255. 8036b42: 61d9 str r1, [r3, #28]
  73256. trap_msg.outvb.tail = NULL;
  73257. 8036b44: 6219 str r1, [r3, #32]
  73258. trap_msg.outvb.count = 0;
  73259. 8036b46: f883 1024 strb.w r1, [r3, #36] ; 0x24
  73260. snmp_send_trap(SNMP_GENTRAP_AUTHFAIL, NULL, 0);
  73261. 8036b4a: f7ff fe23 bl 8036794 <snmp_send_trap>
  73262. }
  73263. }
  73264. 8036b4e: bd0e pop {r1, r2, r3, pc}
  73265. 8036b50: 2001008c .word 0x2001008c
  73266. 08036b54 <etharp_send_ip>:
  73267. * @params dst the destination MAC address to be copied into the ethernet header
  73268. * @return ERR_OK if the packet was sent, any other err_t on failure
  73269. */
  73270. static err_t
  73271. etharp_send_ip(struct netif *netif, struct pbuf *p, struct eth_addr *src, struct eth_addr *dst)
  73272. {
  73273. 8036b54: b5f8 push {r3, r4, r5, r6, r7, lr}
  73274. struct eth_hdr *ethhdr = (struct eth_hdr *)p->payload;
  73275. 8036b56: 684c ldr r4, [r1, #4]
  73276. * @params dst the destination MAC address to be copied into the ethernet header
  73277. * @return ERR_OK if the packet was sent, any other err_t on failure
  73278. */
  73279. static err_t
  73280. etharp_send_ip(struct netif *netif, struct pbuf *p, struct eth_addr *src, struct eth_addr *dst)
  73281. {
  73282. 8036b58: 4606 mov r6, r0
  73283. 8036b5a: 460d mov r5, r1
  73284. 8036b5c: 4617 mov r7, r2
  73285. struct eth_hdr *ethhdr = (struct eth_hdr *)p->payload;
  73286. LWIP_ASSERT("netif->hwaddr_len must be the same as ETHARP_HWADDR_LEN for etharp!",
  73287. (netif->hwaddr_len == ETHARP_HWADDR_LEN));
  73288. ETHADDR32_COPY(&ethhdr->dest, dst);
  73289. 8036b5e: 4619 mov r1, r3
  73290. 8036b60: 2206 movs r2, #6
  73291. 8036b62: 4620 mov r0, r4
  73292. 8036b64: f7eb f89e bl 8021ca4 <memcpy>
  73293. ETHADDR16_COPY(&ethhdr->src, src);
  73294. 8036b68: 4639 mov r1, r7
  73295. 8036b6a: 1da0 adds r0, r4, #6
  73296. 8036b6c: 2206 movs r2, #6
  73297. 8036b6e: f7eb f899 bl 8021ca4 <memcpy>
  73298. ethhdr->type = PP_HTONS(ETHTYPE_IP);
  73299. 8036b72: 2308 movs r3, #8
  73300. 8036b74: 7323 strb r3, [r4, #12]
  73301. 8036b76: 2300 movs r3, #0
  73302. 8036b78: 7363 strb r3, [r4, #13]
  73303. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_send_ip: sending packet %p\n", (void *)p));
  73304. /* send the packet */
  73305. return netif->linkoutput(netif, p);
  73306. 8036b7a: 69b3 ldr r3, [r6, #24]
  73307. 8036b7c: 4630 mov r0, r6
  73308. 8036b7e: 4629 mov r1, r5
  73309. 8036b80: 4798 blx r3
  73310. }
  73311. 8036b82: bdf8 pop {r3, r4, r5, r6, r7, pc}
  73312. 08036b84 <etharp_free_entry>:
  73313. #endif /* ARP_QUEUEING */
  73314. /** Clean up ARP table entries */
  73315. static void
  73316. etharp_free_entry(int i)
  73317. {
  73318. 8036b84: b570 push {r4, r5, r6, lr}
  73319. /* remove from SNMP ARP index tree */
  73320. snmp_delete_arpidx_tree(arp_table[i].netif, &arp_table[i].ipaddr);
  73321. 8036b86: 4d0b ldr r5, [pc, #44] ; (8036bb4 <etharp_free_entry+0x30>)
  73322. 8036b88: 2414 movs r4, #20
  73323. 8036b8a: 4344 muls r4, r0
  73324. 8036b8c: 1929 adds r1, r5, r4
  73325. #endif /* ARP_QUEUEING */
  73326. /** Clean up ARP table entries */
  73327. static void
  73328. etharp_free_entry(int i)
  73329. {
  73330. 8036b8e: 4606 mov r6, r0
  73331. /* remove from SNMP ARP index tree */
  73332. snmp_delete_arpidx_tree(arp_table[i].netif, &arp_table[i].ipaddr);
  73333. 8036b90: 3104 adds r1, #4
  73334. 8036b92: 6848 ldr r0, [r1, #4]
  73335. 8036b94: f7fd fc56 bl 8034444 <snmp_delete_arpidx_tree>
  73336. /* and empty packet queue */
  73337. if (arp_table[i].q != NULL) {
  73338. 8036b98: 5928 ldr r0, [r5, r4]
  73339. 8036b9a: b118 cbz r0, 8036ba4 <etharp_free_entry+0x20>
  73340. /* remove all queued packets */
  73341. LWIP_DEBUGF(ETHARP_DEBUG, ("etharp_free_entry: freeing entry %"U16_F", packet queue %p.\n", (u16_t)i, (void *)(arp_table[i].q)));
  73342. free_etharp_q(arp_table[i].q);
  73343. 8036b9c: f7f9 f874 bl 802fc88 <pbuf_free>
  73344. arp_table[i].q = NULL;
  73345. 8036ba0: 2300 movs r3, #0
  73346. 8036ba2: 512b str r3, [r5, r4]
  73347. }
  73348. /* recycle entry for re-use */
  73349. arp_table[i].state = ETHARP_STATE_EMPTY;
  73350. 8036ba4: 2314 movs r3, #20
  73351. 8036ba6: fb03 5506 mla r5, r3, r6, r5
  73352. 8036baa: 2300 movs r3, #0
  73353. 8036bac: 74ab strb r3, [r5, #18]
  73354. 8036bae: 3510 adds r5, #16
  73355. 8036bb0: bd70 pop {r4, r5, r6, pc}
  73356. 8036bb2: bf00 nop
  73357. 8036bb4: 2000c754 .word 0x2000c754
  73358. 08036bb8 <etharp_find_entry>:
  73359. * @return The ARP entry index that matched or is created, ERR_MEM if no
  73360. * entry is found or could be recycled.
  73361. */
  73362. static s8_t
  73363. etharp_find_entry(ip_addr_t *ipaddr, u8_t flags)
  73364. {
  73365. 8036bb8: e92d 4ff7 stmdb sp!, {r0, r1, r2, r4, r5, r6, r7, r8, r9, sl, fp, lr}
  73366. s8_t empty = ARP_TABLE_SIZE;
  73367. u8_t i = 0, age_pending = 0, age_stable = 0;
  73368. /* oldest entry with packets on queue */
  73369. s8_t old_queue = ARP_TABLE_SIZE;
  73370. /* its age */
  73371. u8_t age_queue = 0;
  73372. 8036bbc: 2500 movs r5, #0
  73373. {
  73374. s8_t old_pending = ARP_TABLE_SIZE, old_stable = ARP_TABLE_SIZE;
  73375. s8_t empty = ARP_TABLE_SIZE;
  73376. u8_t i = 0, age_pending = 0, age_stable = 0;
  73377. /* oldest entry with packets on queue */
  73378. s8_t old_queue = ARP_TABLE_SIZE;
  73379. 8036bbe: 240a movs r4, #10
  73380. 8036bc0: 4a35 ldr r2, [pc, #212] ; (8036c98 <etharp_find_entry+0xe0>)
  73381. * @return The ARP entry index that matched or is created, ERR_MEM if no
  73382. * entry is found or could be recycled.
  73383. */
  73384. static s8_t
  73385. etharp_find_entry(ip_addr_t *ipaddr, u8_t flags)
  73386. {
  73387. 8036bc2: 9101 str r1, [sp, #4]
  73388. 8036bc4: 4606 mov r6, r0
  73389. s8_t old_pending = ARP_TABLE_SIZE, old_stable = ARP_TABLE_SIZE;
  73390. s8_t empty = ARP_TABLE_SIZE;
  73391. u8_t i = 0, age_pending = 0, age_stable = 0;
  73392. 8036bc6: 46a8 mov r8, r5
  73393. 8036bc8: 46aa mov sl, r5
  73394. * 4) remember the oldest pending entry with queued packets (if any)
  73395. * 5) search for a matching IP entry, either pending or stable
  73396. * until 5 matches, or all entries are searched for.
  73397. */
  73398. for (i = 0; i < ARP_TABLE_SIZE; ++i) {
  73399. 8036bca: 462b mov r3, r5
  73400. */
  73401. static s8_t
  73402. etharp_find_entry(ip_addr_t *ipaddr, u8_t flags)
  73403. {
  73404. s8_t old_pending = ARP_TABLE_SIZE, old_stable = ARP_TABLE_SIZE;
  73405. s8_t empty = ARP_TABLE_SIZE;
  73406. 8036bcc: 4627 mov r7, r4
  73407. * entry is found or could be recycled.
  73408. */
  73409. static s8_t
  73410. etharp_find_entry(ip_addr_t *ipaddr, u8_t flags)
  73411. {
  73412. s8_t old_pending = ARP_TABLE_SIZE, old_stable = ARP_TABLE_SIZE;
  73413. 8036bce: 46a4 mov ip, r4
  73414. 8036bd0: 46a3 mov fp, r4
  73415. */
  73416. for (i = 0; i < ARP_TABLE_SIZE; ++i) {
  73417. u8_t state = arp_table[i].state;
  73418. /* no empty entry found yet and now we do find one? */
  73419. if ((empty == ARP_TABLE_SIZE) && (state == ETHARP_STATE_EMPTY)) {
  73420. 8036bd2: 2f0a cmp r7, #10
  73421. * 5) search for a matching IP entry, either pending or stable
  73422. * until 5 matches, or all entries are searched for.
  73423. */
  73424. for (i = 0; i < ARP_TABLE_SIZE; ++i) {
  73425. u8_t state = arp_table[i].state;
  73426. 8036bd4: f892 9012 ldrb.w r9, [r2, #18]
  73427. /* no empty entry found yet and now we do find one? */
  73428. if ((empty == ARP_TABLE_SIZE) && (state == ETHARP_STATE_EMPTY)) {
  73429. 8036bd8: d104 bne.n 8036be4 <etharp_find_entry+0x2c>
  73430. 8036bda: f1b9 0f00 cmp.w r9, #0
  73431. 8036bde: d104 bne.n 8036bea <etharp_find_entry+0x32>
  73432. LWIP_DEBUGF(ETHARP_DEBUG, ("etharp_find_entry: found empty entry %"U16_F"\n", (u16_t)i));
  73433. /* remember first empty entry */
  73434. empty = i;
  73435. 8036be0: b2df uxtb r7, r3
  73436. 8036be2: e023 b.n 8036c2c <etharp_find_entry+0x74>
  73437. } else if (state != ETHARP_STATE_EMPTY) {
  73438. 8036be4: f1b9 0f00 cmp.w r9, #0
  73439. 8036be8: d020 beq.n 8036c2c <etharp_find_entry+0x74>
  73440. LWIP_ASSERT("state == ETHARP_STATE_PENDING || state >= ETHARP_STATE_STABLE",
  73441. state == ETHARP_STATE_PENDING || state >= ETHARP_STATE_STABLE);
  73442. /* if given, does IP address match IP address in ARP entry? */
  73443. if (ipaddr && ip_addr_cmp(ipaddr, &arp_table[i].ipaddr)) {
  73444. 8036bea: b12e cbz r6, 8036bf8 <etharp_find_entry+0x40>
  73445. 8036bec: 6830 ldr r0, [r6, #0]
  73446. 8036bee: 6851 ldr r1, [r2, #4]
  73447. 8036bf0: 4288 cmp r0, r1
  73448. 8036bf2: d101 bne.n 8036bf8 <etharp_find_entry+0x40>
  73449. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: found matching entry %"U16_F"\n", (u16_t)i));
  73450. /* found exact IP address match, simply bail out */
  73451. return i;
  73452. 8036bf4: 4618 mov r0, r3
  73453. 8036bf6: e04b b.n 8036c90 <etharp_find_entry+0xd8>
  73454. }
  73455. /* pending entry? */
  73456. if (state == ETHARP_STATE_PENDING) {
  73457. 8036bf8: f1b9 0f01 cmp.w r9, #1
  73458. 8036bfc: d10e bne.n 8036c1c <etharp_find_entry+0x64>
  73459. /* pending with queued packets? */
  73460. if (arp_table[i].q != NULL) {
  73461. 8036bfe: 6810 ldr r0, [r2, #0]
  73462. if (arp_table[i].ctime >= age_queue) {
  73463. 8036c00: f892 9013 ldrb.w r9, [r2, #19]
  73464. return i;
  73465. }
  73466. /* pending entry? */
  73467. if (state == ETHARP_STATE_PENDING) {
  73468. /* pending with queued packets? */
  73469. if (arp_table[i].q != NULL) {
  73470. 8036c04: b120 cbz r0, 8036c10 <etharp_find_entry+0x58>
  73471. if (arp_table[i].ctime >= age_queue) {
  73472. 8036c06: 45a9 cmp r9, r5
  73473. 8036c08: d310 bcc.n 8036c2c <etharp_find_entry+0x74>
  73474. old_queue = i;
  73475. 8036c0a: b2dc uxtb r4, r3
  73476. 8036c0c: 464d mov r5, r9
  73477. 8036c0e: e00d b.n 8036c2c <etharp_find_entry+0x74>
  73478. age_queue = arp_table[i].ctime;
  73479. }
  73480. } else
  73481. /* pending without queued packets? */
  73482. {
  73483. if (arp_table[i].ctime >= age_pending) {
  73484. 8036c10: 45d1 cmp r9, sl
  73485. 8036c12: d30b bcc.n 8036c2c <etharp_find_entry+0x74>
  73486. old_pending = i;
  73487. 8036c14: fa5f fb83 uxtb.w fp, r3
  73488. 8036c18: 46ca mov sl, r9
  73489. 8036c1a: e007 b.n 8036c2c <etharp_find_entry+0x74>
  73490. age_pending = arp_table[i].ctime;
  73491. }
  73492. }
  73493. /* stable entry? */
  73494. } else if (state >= ETHARP_STATE_STABLE) {
  73495. 8036c1c: d906 bls.n 8036c2c <etharp_find_entry+0x74>
  73496. /* don't record old_stable for static entries since they never expire */
  73497. if (state < ETHARP_STATE_STATIC)
  73498. #endif /* ETHARP_SUPPORT_STATIC_ENTRIES */
  73499. {
  73500. /* remember entry with oldest stable entry in oldest, its age in maxtime */
  73501. if (arp_table[i].ctime >= age_stable) {
  73502. 8036c1e: f892 9013 ldrb.w r9, [r2, #19]
  73503. 8036c22: 45c1 cmp r9, r8
  73504. old_stable = i;
  73505. 8036c24: bf24 itt cs
  73506. 8036c26: fa5f fc83 uxtbcs.w ip, r3
  73507. 8036c2a: 46c8 movcs r8, r9
  73508. * 4) remember the oldest pending entry with queued packets (if any)
  73509. * 5) search for a matching IP entry, either pending or stable
  73510. * until 5 matches, or all entries are searched for.
  73511. */
  73512. for (i = 0; i < ARP_TABLE_SIZE; ++i) {
  73513. 8036c2c: 3301 adds r3, #1
  73514. 8036c2e: b2db uxtb r3, r3
  73515. 8036c30: 3214 adds r2, #20
  73516. 8036c32: 2b0a cmp r3, #10
  73517. 8036c34: d1cd bne.n 8036bd2 <etharp_find_entry+0x1a>
  73518. }
  73519. }
  73520. /* { we have no match } => try to create a new entry */
  73521. /* don't create new entry, only search? */
  73522. if (((flags & ETHARP_FLAG_FIND_ONLY) != 0) ||
  73523. 8036c36: 9a01 ldr r2, [sp, #4]
  73524. 8036c38: f002 0302 and.w r3, r2, #2
  73525. 8036c3c: b2db uxtb r3, r3
  73526. 8036c3e: bb33 cbnz r3, 8036c8e <etharp_find_entry+0xd6>
  73527. 8036c40: 2f0a cmp r7, #10
  73528. 8036c42: d102 bne.n 8036c4a <etharp_find_entry+0x92>
  73529. /* or no empty entry found and not allowed to recycle? */
  73530. ((empty == ARP_TABLE_SIZE) && ((flags & ETHARP_FLAG_TRY_HARD) == 0))) {
  73531. 8036c44: 07d3 lsls r3, r2, #31
  73532. 8036c46: d402 bmi.n 8036c4e <etharp_find_entry+0x96>
  73533. 8036c48: e021 b.n 8036c8e <etharp_find_entry+0xd6>
  73534. * { ETHARP_FLAG_TRY_HARD is set at this point }
  73535. */
  73536. /* 1) empty entry available? */
  73537. if (empty < ARP_TABLE_SIZE) {
  73538. i = empty;
  73539. 8036c4a: b2fc uxtb r4, r7
  73540. 8036c4c: e011 b.n 8036c72 <etharp_find_entry+0xba>
  73541. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: selecting empty entry %"U16_F"\n", (u16_t)i));
  73542. } else {
  73543. /* 2) found recyclable stable entry? */
  73544. if (old_stable < ARP_TABLE_SIZE) {
  73545. 8036c4e: f1bc 0f0a cmp.w ip, #10
  73546. 8036c52: d002 beq.n 8036c5a <etharp_find_entry+0xa2>
  73547. /* recycle oldest stable*/
  73548. i = old_stable;
  73549. 8036c54: fa5f f48c uxtb.w r4, ip
  73550. 8036c58: e008 b.n 8036c6c <etharp_find_entry+0xb4>
  73551. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: selecting oldest stable entry %"U16_F"\n", (u16_t)i));
  73552. /* no queued packets should exist on stable entries */
  73553. LWIP_ASSERT("arp_table[i].q == NULL", arp_table[i].q == NULL);
  73554. /* 3) found recyclable pending entry without queued packets? */
  73555. } else if (old_pending < ARP_TABLE_SIZE) {
  73556. 8036c5a: f1bb 0f0a cmp.w fp, #10
  73557. 8036c5e: d002 beq.n 8036c66 <etharp_find_entry+0xae>
  73558. /* recycle oldest pending */
  73559. i = old_pending;
  73560. 8036c60: fa5f f48b uxtb.w r4, fp
  73561. 8036c64: e002 b.n 8036c6c <etharp_find_entry+0xb4>
  73562. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: selecting oldest pending entry %"U16_F" (without queue)\n", (u16_t)i));
  73563. /* 4) found recyclable pending entry with queued packets? */
  73564. } else if (old_queue < ARP_TABLE_SIZE) {
  73565. 8036c66: 2c0a cmp r4, #10
  73566. 8036c68: d011 beq.n 8036c8e <etharp_find_entry+0xd6>
  73567. /* recycle oldest pending (queued packets are free in etharp_free_entry) */
  73568. i = old_queue;
  73569. 8036c6a: b2e4 uxtb r4, r4
  73570. return (s8_t)ERR_MEM;
  73571. }
  73572. /* { empty or recyclable entry found } */
  73573. LWIP_ASSERT("i < ARP_TABLE_SIZE", i < ARP_TABLE_SIZE);
  73574. etharp_free_entry(i);
  73575. 8036c6c: 4620 mov r0, r4
  73576. 8036c6e: f7ff ff89 bl 8036b84 <etharp_free_entry>
  73577. 8036c72: 4b09 ldr r3, [pc, #36] ; (8036c98 <etharp_find_entry+0xe0>)
  73578. LWIP_ASSERT("i < ARP_TABLE_SIZE", i < ARP_TABLE_SIZE);
  73579. LWIP_ASSERT("arp_table[i].state == ETHARP_STATE_EMPTY",
  73580. arp_table[i].state == ETHARP_STATE_EMPTY);
  73581. /* IP address given? */
  73582. if (ipaddr != NULL) {
  73583. 8036c74: b126 cbz r6, 8036c80 <etharp_find_entry+0xc8>
  73584. /* set IP address */
  73585. ip_addr_copy(arp_table[i].ipaddr, *ipaddr);
  73586. 8036c76: 2214 movs r2, #20
  73587. 8036c78: 6831 ldr r1, [r6, #0]
  73588. 8036c7a: fb02 3204 mla r2, r2, r4, r3
  73589. 8036c7e: 6051 str r1, [r2, #4]
  73590. }
  73591. arp_table[i].ctime = 0;
  73592. 8036c80: 2214 movs r2, #20
  73593. 8036c82: fb02 3304 mla r3, r2, r4, r3
  73594. 8036c86: 2200 movs r2, #0
  73595. 8036c88: 74da strb r2, [r3, #19]
  73596. return (err_t)i;
  73597. 8036c8a: 4620 mov r0, r4
  73598. 8036c8c: e000 b.n 8036c90 <etharp_find_entry+0xd8>
  73599. /* don't create new entry, only search? */
  73600. if (((flags & ETHARP_FLAG_FIND_ONLY) != 0) ||
  73601. /* or no empty entry found and not allowed to recycle? */
  73602. ((empty == ARP_TABLE_SIZE) && ((flags & ETHARP_FLAG_TRY_HARD) == 0))) {
  73603. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: no empty entry found and not allowed to recycle\n"));
  73604. return (s8_t)ERR_MEM;
  73605. 8036c8e: 20ff movs r0, #255 ; 0xff
  73606. /* set IP address */
  73607. ip_addr_copy(arp_table[i].ipaddr, *ipaddr);
  73608. }
  73609. arp_table[i].ctime = 0;
  73610. return (err_t)i;
  73611. }
  73612. 8036c90: b240 sxtb r0, r0
  73613. 8036c92: e8bd 8ffe ldmia.w sp!, {r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, pc}
  73614. 8036c96: bf00 nop
  73615. 8036c98: 2000c754 .word 0x2000c754
  73616. 08036c9c <etharp_tmr>:
  73617. * This function should be called every ETHARP_TMR_INTERVAL milliseconds (5 seconds),
  73618. * in order to expire entries in the ARP table.
  73619. */
  73620. void
  73621. etharp_tmr(void)
  73622. {
  73623. 8036c9c: b570 push {r4, r5, r6, lr}
  73624. 8036c9e: 4c0d ldr r4, [pc, #52] ; (8036cd4 <etharp_tmr+0x38>)
  73625. 8036ca0: 2500 movs r5, #0
  73626. etharp_free_entry(i);
  73627. }
  73628. else if (arp_table[i].state == ETHARP_STATE_STABLE_REREQUESTING) {
  73629. /* Reset state to stable, so that the next transmitted packet will
  73630. re-send an ARP request. */
  73631. arp_table[i].state = ETHARP_STATE_STABLE;
  73632. 8036ca2: 2602 movs r6, #2
  73633. LWIP_DEBUGF(ETHARP_DEBUG, ("etharp_timer\n"));
  73634. /* remove expired entries from the ARP table */
  73635. for (i = 0; i < ARP_TABLE_SIZE; ++i) {
  73636. u8_t state = arp_table[i].state;
  73637. if (state != ETHARP_STATE_EMPTY
  73638. 8036ca4: 7ca3 ldrb r3, [r4, #18]
  73639. 8036ca6: b183 cbz r3, 8036cca <etharp_tmr+0x2e>
  73640. #if ETHARP_SUPPORT_STATIC_ENTRIES
  73641. && (state != ETHARP_STATE_STATIC)
  73642. #endif /* ETHARP_SUPPORT_STATIC_ENTRIES */
  73643. ) {
  73644. arp_table[i].ctime++;
  73645. 8036ca8: 7ce2 ldrb r2, [r4, #19]
  73646. 8036caa: 3201 adds r2, #1
  73647. 8036cac: b2d2 uxtb r2, r2
  73648. if ((arp_table[i].ctime >= ARP_MAXAGE) ||
  73649. 8036cae: 2aef cmp r2, #239 ; 0xef
  73650. if (state != ETHARP_STATE_EMPTY
  73651. #if ETHARP_SUPPORT_STATIC_ENTRIES
  73652. && (state != ETHARP_STATE_STATIC)
  73653. #endif /* ETHARP_SUPPORT_STATIC_ENTRIES */
  73654. ) {
  73655. arp_table[i].ctime++;
  73656. 8036cb0: 74e2 strb r2, [r4, #19]
  73657. if ((arp_table[i].ctime >= ARP_MAXAGE) ||
  73658. 8036cb2: d803 bhi.n 8036cbc <etharp_tmr+0x20>
  73659. 8036cb4: 2b01 cmp r3, #1
  73660. 8036cb6: d105 bne.n 8036cc4 <etharp_tmr+0x28>
  73661. ((arp_table[i].state == ETHARP_STATE_PENDING) &&
  73662. 8036cb8: 2a01 cmp r2, #1
  73663. 8036cba: d906 bls.n 8036cca <etharp_tmr+0x2e>
  73664. (arp_table[i].ctime >= ARP_MAXPENDING))) {
  73665. /* pending or stable entry has become old! */
  73666. LWIP_DEBUGF(ETHARP_DEBUG, ("etharp_timer: expired %s entry %"U16_F".\n",
  73667. arp_table[i].state >= ETHARP_STATE_STABLE ? "stable" : "pending", (u16_t)i));
  73668. /* clean up entries that have just been expired */
  73669. etharp_free_entry(i);
  73670. 8036cbc: 4628 mov r0, r5
  73671. 8036cbe: f7ff ff61 bl 8036b84 <etharp_free_entry>
  73672. 8036cc2: e002 b.n 8036cca <etharp_tmr+0x2e>
  73673. }
  73674. else if (arp_table[i].state == ETHARP_STATE_STABLE_REREQUESTING) {
  73675. 8036cc4: 2b03 cmp r3, #3
  73676. /* Reset state to stable, so that the next transmitted packet will
  73677. re-send an ARP request. */
  73678. arp_table[i].state = ETHARP_STATE_STABLE;
  73679. 8036cc6: bf08 it eq
  73680. 8036cc8: 74a6 strbeq r6, [r4, #18]
  73681. 8036cca: 3501 adds r5, #1
  73682. 8036ccc: 3414 adds r4, #20
  73683. {
  73684. u8_t i;
  73685. LWIP_DEBUGF(ETHARP_DEBUG, ("etharp_timer\n"));
  73686. /* remove expired entries from the ARP table */
  73687. for (i = 0; i < ARP_TABLE_SIZE; ++i) {
  73688. 8036cce: 2d0a cmp r5, #10
  73689. 8036cd0: d1e8 bne.n 8036ca4 <etharp_tmr+0x8>
  73690. /* resend an ARP query here? */
  73691. }
  73692. #endif /* ARP_QUEUEING */
  73693. }
  73694. }
  73695. }
  73696. 8036cd2: bd70 pop {r4, r5, r6, pc}
  73697. 8036cd4: 2000c754 .word 0x2000c754
  73698. 08036cd8 <etharp_cleanup_netif>:
  73699. * Remove all ARP table entries of the specified netif.
  73700. *
  73701. * @param netif points to a network interface
  73702. */
  73703. void etharp_cleanup_netif(struct netif *netif)
  73704. {
  73705. 8036cd8: b570 push {r4, r5, r6, lr}
  73706. 8036cda: 4d08 ldr r5, [pc, #32] ; (8036cfc <etharp_cleanup_netif+0x24>)
  73707. 8036cdc: 4606 mov r6, r0
  73708. 8036cde: 2400 movs r4, #0
  73709. u8_t i;
  73710. for (i = 0; i < ARP_TABLE_SIZE; ++i) {
  73711. u8_t state = arp_table[i].state;
  73712. if ((state != ETHARP_STATE_EMPTY) && (arp_table[i].netif == netif)) {
  73713. 8036ce0: 7cab ldrb r3, [r5, #18]
  73714. 8036ce2: b12b cbz r3, 8036cf0 <etharp_cleanup_netif+0x18>
  73715. 8036ce4: 68ab ldr r3, [r5, #8]
  73716. 8036ce6: 42b3 cmp r3, r6
  73717. 8036ce8: d102 bne.n 8036cf0 <etharp_cleanup_netif+0x18>
  73718. etharp_free_entry(i);
  73719. 8036cea: 4620 mov r0, r4
  73720. 8036cec: f7ff ff4a bl 8036b84 <etharp_free_entry>
  73721. 8036cf0: 3401 adds r4, #1
  73722. 8036cf2: 3514 adds r5, #20
  73723. */
  73724. void etharp_cleanup_netif(struct netif *netif)
  73725. {
  73726. u8_t i;
  73727. for (i = 0; i < ARP_TABLE_SIZE; ++i) {
  73728. 8036cf4: 2c0a cmp r4, #10
  73729. 8036cf6: d1f3 bne.n 8036ce0 <etharp_cleanup_netif+0x8>
  73730. u8_t state = arp_table[i].state;
  73731. if ((state != ETHARP_STATE_EMPTY) && (arp_table[i].netif == netif)) {
  73732. etharp_free_entry(i);
  73733. }
  73734. }
  73735. }
  73736. 8036cf8: bd70 pop {r4, r5, r6, pc}
  73737. 8036cfa: bf00 nop
  73738. 8036cfc: 2000c754 .word 0x2000c754
  73739. 08036d00 <etharp_find_addr>:
  73740. * @return table index if found, -1 otherwise
  73741. */
  73742. s8_t
  73743. etharp_find_addr(struct netif *netif, ip_addr_t *ipaddr,
  73744. struct eth_addr **eth_ret, ip_addr_t **ip_ret)
  73745. {
  73746. 8036d00: b5f8 push {r3, r4, r5, r6, r7, lr}
  73747. LWIP_ASSERT("eth_ret != NULL && ip_ret != NULL",
  73748. eth_ret != NULL && ip_ret != NULL);
  73749. LWIP_UNUSED_ARG(netif);
  73750. i = etharp_find_entry(ipaddr, ETHARP_FLAG_FIND_ONLY);
  73751. 8036d02: 4608 mov r0, r1
  73752. 8036d04: 2102 movs r1, #2
  73753. * @return table index if found, -1 otherwise
  73754. */
  73755. s8_t
  73756. etharp_find_addr(struct netif *netif, ip_addr_t *ipaddr,
  73757. struct eth_addr **eth_ret, ip_addr_t **ip_ret)
  73758. {
  73759. 8036d06: 4616 mov r6, r2
  73760. 8036d08: 461f mov r7, r3
  73761. LWIP_ASSERT("eth_ret != NULL && ip_ret != NULL",
  73762. eth_ret != NULL && ip_ret != NULL);
  73763. LWIP_UNUSED_ARG(netif);
  73764. i = etharp_find_entry(ipaddr, ETHARP_FLAG_FIND_ONLY);
  73765. 8036d0a: f7ff ff55 bl 8036bb8 <etharp_find_entry>
  73766. if((i >= 0) && (arp_table[i].state >= ETHARP_STATE_STABLE)) {
  73767. 8036d0e: 2800 cmp r0, #0
  73768. 8036d10: db0c blt.n 8036d2c <etharp_find_addr+0x2c>
  73769. 8036d12: 2414 movs r4, #20
  73770. 8036d14: 4d07 ldr r5, [pc, #28] ; (8036d34 <etharp_find_addr+0x34>)
  73771. 8036d16: 4344 muls r4, r0
  73772. 8036d18: 1929 adds r1, r5, r4
  73773. 8036d1a: 7c8b ldrb r3, [r1, #18]
  73774. 8036d1c: 2b01 cmp r3, #1
  73775. 8036d1e: d905 bls.n 8036d2c <etharp_find_addr+0x2c>
  73776. *eth_ret = &arp_table[i].ethaddr;
  73777. 8036d20: 460c mov r4, r1
  73778. 8036d22: 340c adds r4, #12
  73779. *ip_ret = &arp_table[i].ipaddr;
  73780. 8036d24: 3104 adds r1, #4
  73781. LWIP_UNUSED_ARG(netif);
  73782. i = etharp_find_entry(ipaddr, ETHARP_FLAG_FIND_ONLY);
  73783. if((i >= 0) && (arp_table[i].state >= ETHARP_STATE_STABLE)) {
  73784. *eth_ret = &arp_table[i].ethaddr;
  73785. 8036d26: 6034 str r4, [r6, #0]
  73786. *ip_ret = &arp_table[i].ipaddr;
  73787. 8036d28: 6039 str r1, [r7, #0]
  73788. return i;
  73789. 8036d2a: e000 b.n 8036d2e <etharp_find_addr+0x2e>
  73790. }
  73791. return -1;
  73792. 8036d2c: 20ff movs r0, #255 ; 0xff
  73793. }
  73794. 8036d2e: b240 sxtb r0, r0
  73795. 8036d30: bdf8 pop {r3, r4, r5, r6, r7, pc}
  73796. 8036d32: bf00 nop
  73797. 8036d34: 2000c754 .word 0x2000c754
  73798. 08036d38 <etharp_request>:
  73799. * ERR_MEM if the ARP packet couldn't be allocated
  73800. * any other err_t on failure
  73801. */
  73802. err_t
  73803. etharp_request(struct netif *netif, ip_addr_t *ipaddr)
  73804. {
  73805. 8036d38: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr}
  73806. #endif /* LWIP_AUTOIP */
  73807. LWIP_ASSERT("netif != NULL", netif != NULL);
  73808. /* allocate a pbuf for the outgoing ARP request packet */
  73809. p = pbuf_alloc(PBUF_RAW, SIZEOF_ETHARP_PACKET, PBUF_RAM);
  73810. 8036d3c: 2200 movs r2, #0
  73811. * ERR_MEM if the ARP packet couldn't be allocated
  73812. * any other err_t on failure
  73813. */
  73814. err_t
  73815. etharp_request(struct netif *netif, ip_addr_t *ipaddr)
  73816. {
  73817. 8036d3e: 4606 mov r6, r0
  73818. 8036d40: 4688 mov r8, r1
  73819. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_request: sending ARP request.\n"));
  73820. return etharp_raw(netif, (struct eth_addr *)netif->hwaddr, &ethbroadcast,
  73821. (struct eth_addr *)netif->hwaddr, &netif->ip_addr, &ethzero,
  73822. 8036d42: f100 0727 add.w r7, r0, #39 ; 0x27
  73823. 8036d46: f100 0904 add.w r9, r0, #4
  73824. #endif /* LWIP_AUTOIP */
  73825. LWIP_ASSERT("netif != NULL", netif != NULL);
  73826. /* allocate a pbuf for the outgoing ARP request packet */
  73827. p = pbuf_alloc(PBUF_RAW, SIZEOF_ETHARP_PACKET, PBUF_RAM);
  73828. 8036d4a: 212a movs r1, #42 ; 0x2a
  73829. 8036d4c: 2003 movs r0, #3
  73830. 8036d4e: f7f8 ffe8 bl 802fd22 <pbuf_alloc>
  73831. /* could allocate a pbuf for an ARP request? */
  73832. if (p == NULL) {
  73833. 8036d52: 4605 mov r5, r0
  73834. 8036d54: 2800 cmp r0, #0
  73835. 8036d56: d03c beq.n 8036dd2 <etharp_request+0x9a>
  73836. return ERR_MEM;
  73837. }
  73838. LWIP_ASSERT("check that first pbuf can hold struct etharp_hdr",
  73839. (p->len >= SIZEOF_ETHARP_PACKET));
  73840. ethhdr = (struct eth_hdr *)p->payload;
  73841. 8036d58: 6844 ldr r4, [r0, #4]
  73842. hdr = (struct etharp_hdr *)((u8_t*)ethhdr + SIZEOF_ETH_HDR);
  73843. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_raw: sending raw ARP packet.\n"));
  73844. hdr->opcode = htons(opcode);
  73845. 8036d5a: 2001 movs r0, #1
  73846. 8036d5c: f7f7 fe56 bl 802ea0c <lwip_htons>
  73847. * 'sender IP address' MUST be sent using link-layer broadcast instead of
  73848. * link-layer unicast. (See RFC3927 Section 2.5, last paragraph) */
  73849. ethdst_hwaddr = ip_addr_islinklocal(ipsrc_addr) ? (u8_t*)(ethbroadcast.addr) : ethdst_addr->addr;
  73850. #endif /* LWIP_AUTOIP */
  73851. /* Write the ARP MAC-Addresses */
  73852. ETHADDR16_COPY(&hdr->shwaddr, hwsrc_addr);
  73853. 8036d60: 4639 mov r1, r7
  73854. (p->len >= SIZEOF_ETHARP_PACKET));
  73855. ethhdr = (struct eth_hdr *)p->payload;
  73856. hdr = (struct etharp_hdr *)((u8_t*)ethhdr + SIZEOF_ETH_HDR);
  73857. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_raw: sending raw ARP packet.\n"));
  73858. hdr->opcode = htons(opcode);
  73859. 8036d62: 82a0 strh r0, [r4, #20]
  73860. * 'sender IP address' MUST be sent using link-layer broadcast instead of
  73861. * link-layer unicast. (See RFC3927 Section 2.5, last paragraph) */
  73862. ethdst_hwaddr = ip_addr_islinklocal(ipsrc_addr) ? (u8_t*)(ethbroadcast.addr) : ethdst_addr->addr;
  73863. #endif /* LWIP_AUTOIP */
  73864. /* Write the ARP MAC-Addresses */
  73865. ETHADDR16_COPY(&hdr->shwaddr, hwsrc_addr);
  73866. 8036d64: 2206 movs r2, #6
  73867. 8036d66: f104 0016 add.w r0, r4, #22
  73868. 8036d6a: f7ea ff9b bl 8021ca4 <memcpy>
  73869. ETHADDR16_COPY(&hdr->dhwaddr, hwdst_addr);
  73870. 8036d6e: 2206 movs r2, #6
  73871. 8036d70: f104 0020 add.w r0, r4, #32
  73872. 8036d74: 4919 ldr r1, [pc, #100] ; (8036ddc <etharp_request+0xa4>)
  73873. 8036d76: f7ea ff95 bl 8021ca4 <memcpy>
  73874. /* Write the Ethernet MAC-Addresses */
  73875. #if LWIP_AUTOIP
  73876. ETHADDR16_COPY(&ethhdr->dest, ethdst_hwaddr);
  73877. #else /* LWIP_AUTOIP */
  73878. ETHADDR16_COPY(&ethhdr->dest, ethdst_addr);
  73879. 8036d7a: 2206 movs r2, #6
  73880. 8036d7c: 4620 mov r0, r4
  73881. 8036d7e: 4918 ldr r1, [pc, #96] ; (8036de0 <etharp_request+0xa8>)
  73882. 8036d80: f7ea ff90 bl 8021ca4 <memcpy>
  73883. #endif /* LWIP_AUTOIP */
  73884. ETHADDR16_COPY(&ethhdr->src, ethsrc_addr);
  73885. 8036d84: 1da0 adds r0, r4, #6
  73886. 8036d86: 4639 mov r1, r7
  73887. 8036d88: 2206 movs r2, #6
  73888. 8036d8a: f7ea ff8b bl 8021ca4 <memcpy>
  73889. /* Copy struct ip_addr2 to aligned ip_addr, to support compilers without
  73890. * structure packing. */
  73891. IPADDR2_COPY(&hdr->sipaddr, ipsrc_addr);
  73892. 8036d8e: 4649 mov r1, r9
  73893. 8036d90: 2204 movs r2, #4
  73894. 8036d92: f104 001c add.w r0, r4, #28
  73895. 8036d96: f7ea ff85 bl 8021ca4 <memcpy>
  73896. IPADDR2_COPY(&hdr->dipaddr, ipdst_addr);
  73897. 8036d9a: 4641 mov r1, r8
  73898. 8036d9c: 2204 movs r2, #4
  73899. 8036d9e: f104 0026 add.w r0, r4, #38 ; 0x26
  73900. 8036da2: f7ea ff7f bl 8021ca4 <memcpy>
  73901. hdr->hwtype = PP_HTONS(HWTYPE_ETHERNET);
  73902. 8036da6: 2300 movs r3, #0
  73903. 8036da8: 2201 movs r2, #1
  73904. 8036daa: 73a3 strb r3, [r4, #14]
  73905. 8036dac: 73e2 strb r2, [r4, #15]
  73906. hdr->proto = PP_HTONS(ETHTYPE_IP);
  73907. 8036dae: 7463 strb r3, [r4, #17]
  73908. 8036db0: 2208 movs r2, #8
  73909. /* set hwlen and protolen */
  73910. hdr->hwlen = ETHARP_HWADDR_LEN;
  73911. 8036db2: 2306 movs r3, #6
  73912. hdr->protolen = sizeof(ip_addr_t);
  73913. 8036db4: 2104 movs r1, #4
  73914. * structure packing. */
  73915. IPADDR2_COPY(&hdr->sipaddr, ipsrc_addr);
  73916. IPADDR2_COPY(&hdr->dipaddr, ipdst_addr);
  73917. hdr->hwtype = PP_HTONS(HWTYPE_ETHERNET);
  73918. hdr->proto = PP_HTONS(ETHTYPE_IP);
  73919. 8036db6: 7422 strb r2, [r4, #16]
  73920. /* set hwlen and protolen */
  73921. hdr->hwlen = ETHARP_HWADDR_LEN;
  73922. hdr->protolen = sizeof(ip_addr_t);
  73923. 8036db8: 74e1 strb r1, [r4, #19]
  73924. ethhdr->type = PP_HTONS(ETHTYPE_ARP);
  73925. 8036dba: 7322 strb r2, [r4, #12]
  73926. IPADDR2_COPY(&hdr->dipaddr, ipdst_addr);
  73927. hdr->hwtype = PP_HTONS(HWTYPE_ETHERNET);
  73928. hdr->proto = PP_HTONS(ETHTYPE_IP);
  73929. /* set hwlen and protolen */
  73930. hdr->hwlen = ETHARP_HWADDR_LEN;
  73931. 8036dbc: 74a3 strb r3, [r4, #18]
  73932. hdr->protolen = sizeof(ip_addr_t);
  73933. ethhdr->type = PP_HTONS(ETHTYPE_ARP);
  73934. 8036dbe: 7363 strb r3, [r4, #13]
  73935. /* send ARP query */
  73936. result = netif->linkoutput(netif, p);
  73937. 8036dc0: 69b3 ldr r3, [r6, #24]
  73938. 8036dc2: 4630 mov r0, r6
  73939. 8036dc4: 4629 mov r1, r5
  73940. 8036dc6: 4798 blx r3
  73941. 8036dc8: 4604 mov r4, r0
  73942. ETHARP_STATS_INC(etharp.xmit);
  73943. /* free ARP query packet */
  73944. pbuf_free(p);
  73945. 8036dca: 4628 mov r0, r5
  73946. 8036dcc: f7f8 ff5c bl 802fc88 <pbuf_free>
  73947. 8036dd0: e000 b.n 8036dd4 <etharp_request+0x9c>
  73948. /* could allocate a pbuf for an ARP request? */
  73949. if (p == NULL) {
  73950. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS,
  73951. ("etharp_raw: could not allocate pbuf for ARP request.\n"));
  73952. ETHARP_STATS_INC(etharp.memerr);
  73953. return ERR_MEM;
  73954. 8036dd2: 24ff movs r4, #255 ; 0xff
  73955. {
  73956. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_request: sending ARP request.\n"));
  73957. return etharp_raw(netif, (struct eth_addr *)netif->hwaddr, &ethbroadcast,
  73958. (struct eth_addr *)netif->hwaddr, &netif->ip_addr, &ethzero,
  73959. ipaddr, ARP_REQUEST);
  73960. }
  73961. 8036dd4: b260 sxtb r0, r4
  73962. 8036dd6: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc}
  73963. 8036dda: bf00 nop
  73964. 8036ddc: 08045079 .word 0x08045079
  73965. 8036de0: 08045073 .word 0x08045073
  73966. 08036de4 <etharp_query>:
  73967. * - ERR_ARG Non-unicast address given, those will not appear in ARP cache.
  73968. *
  73969. */
  73970. err_t
  73971. etharp_query(struct netif *netif, ip_addr_t *ipaddr, struct pbuf *q)
  73972. {
  73973. 8036de4: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  73974. 8036de8: 4607 mov r7, r0
  73975. 8036dea: 460e mov r6, r1
  73976. struct eth_addr * srcaddr = (struct eth_addr *)netif->hwaddr;
  73977. err_t result = ERR_MEM;
  73978. s8_t i; /* ARP entry index */
  73979. /* non-unicast address? */
  73980. if (ip_addr_isbroadcast(ipaddr, netif) ||
  73981. 8036dec: 6808 ldr r0, [r1, #0]
  73982. 8036dee: 4639 mov r1, r7
  73983. * - ERR_ARG Non-unicast address given, those will not appear in ARP cache.
  73984. *
  73985. */
  73986. err_t
  73987. etharp_query(struct netif *netif, ip_addr_t *ipaddr, struct pbuf *q)
  73988. {
  73989. 8036df0: 4615 mov r5, r2
  73990. struct eth_addr * srcaddr = (struct eth_addr *)netif->hwaddr;
  73991. err_t result = ERR_MEM;
  73992. s8_t i; /* ARP entry index */
  73993. /* non-unicast address? */
  73994. if (ip_addr_isbroadcast(ipaddr, netif) ||
  73995. 8036df2: f7fb fde3 bl 80329bc <ip4_addr_isbroadcast>
  73996. 8036df6: 2800 cmp r0, #0
  73997. 8036df8: d157 bne.n 8036eaa <etharp_query+0xc6>
  73998. ip_addr_ismulticast(ipaddr) ||
  73999. 8036dfa: 6833 ldr r3, [r6, #0]
  74000. 8036dfc: f003 02f0 and.w r2, r3, #240 ; 0xf0
  74001. struct eth_addr * srcaddr = (struct eth_addr *)netif->hwaddr;
  74002. err_t result = ERR_MEM;
  74003. s8_t i; /* ARP entry index */
  74004. /* non-unicast address? */
  74005. if (ip_addr_isbroadcast(ipaddr, netif) ||
  74006. 8036e00: 2ae0 cmp r2, #224 ; 0xe0
  74007. 8036e02: d052 beq.n 8036eaa <etharp_query+0xc6>
  74008. ip_addr_ismulticast(ipaddr) ||
  74009. ip_addr_isany(ipaddr)) {
  74010. 8036e04: 2b00 cmp r3, #0
  74011. 8036e06: d050 beq.n 8036eaa <etharp_query+0xc6>
  74012. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: will not add non-unicast IP address to ARP cache\n"));
  74013. return ERR_ARG;
  74014. }
  74015. /* find entry in ARP cache, ask to create entry if queueing packet */
  74016. i = etharp_find_entry(ipaddr, ETHARP_FLAG_TRY_HARD);
  74017. 8036e08: 2101 movs r1, #1
  74018. 8036e0a: 4630 mov r0, r6
  74019. 8036e0c: f7ff fed4 bl 8036bb8 <etharp_find_entry>
  74020. /* could not find or create entry? */
  74021. if (i < 0) {
  74022. 8036e10: 1e04 subs r4, r0, #0
  74023. 8036e12: db4f blt.n 8036eb4 <etharp_query+0xd0>
  74024. }
  74025. return (err_t)i;
  74026. }
  74027. /* mark a fresh entry as pending (we just sent a request) */
  74028. if (arp_table[i].state == ETHARP_STATE_EMPTY) {
  74029. 8036e14: 4931 ldr r1, [pc, #196] ; (8036edc <etharp_query+0xf8>)
  74030. 8036e16: 2214 movs r2, #20
  74031. 8036e18: fb02 1304 mla r3, r2, r4, r1
  74032. 8036e1c: 3310 adds r3, #16
  74033. 8036e1e: 7898 ldrb r0, [r3, #2]
  74034. 8036e20: b908 cbnz r0, 8036e26 <etharp_query+0x42>
  74035. arp_table[i].state = ETHARP_STATE_PENDING;
  74036. 8036e22: 2001 movs r0, #1
  74037. 8036e24: 7098 strb r0, [r3, #2]
  74038. LWIP_ASSERT("arp_table[i].state == PENDING or STABLE",
  74039. ((arp_table[i].state == ETHARP_STATE_PENDING) ||
  74040. (arp_table[i].state >= ETHARP_STATE_STABLE)));
  74041. /* do we have a pending entry? or an implicit query request? */
  74042. if ((arp_table[i].state == ETHARP_STATE_PENDING) || (q == NULL)) {
  74043. 8036e26: fb02 1204 mla r2, r2, r4, r1
  74044. 8036e2a: 7c93 ldrb r3, [r2, #18]
  74045. 8036e2c: 2b01 cmp r3, #1
  74046. 8036e2e: d000 beq.n 8036e32 <etharp_query+0x4e>
  74047. 8036e30: b935 cbnz r5, 8036e40 <etharp_query+0x5c>
  74048. /* try to resolve it; send out ARP request */
  74049. result = etharp_request(netif, ipaddr);
  74050. 8036e32: 4638 mov r0, r7
  74051. 8036e34: 4631 mov r1, r6
  74052. 8036e36: f7ff ff7f bl 8036d38 <etharp_request>
  74053. 8036e3a: 4602 mov r2, r0
  74054. /* ARP request couldn't be sent */
  74055. /* We don't re-send arp request in etharp_tmr, but we still queue packets,
  74056. since this failure could be temporary, and the next packet calling
  74057. etharp_query again could lead to sending the queued packets. */
  74058. }
  74059. if (q == NULL) {
  74060. 8036e3c: b90d cbnz r5, 8036e42 <etharp_query+0x5e>
  74061. 8036e3e: e036 b.n 8036eae <etharp_query+0xca>
  74062. */
  74063. err_t
  74064. etharp_query(struct netif *netif, ip_addr_t *ipaddr, struct pbuf *q)
  74065. {
  74066. struct eth_addr * srcaddr = (struct eth_addr *)netif->hwaddr;
  74067. err_t result = ERR_MEM;
  74068. 8036e40: 22ff movs r2, #255 ; 0xff
  74069. }
  74070. /* packet given? */
  74071. LWIP_ASSERT("q != NULL", q != NULL);
  74072. /* stable entry? */
  74073. if (arp_table[i].state >= ETHARP_STATE_STABLE) {
  74074. 8036e42: 2314 movs r3, #20
  74075. 8036e44: 4925 ldr r1, [pc, #148] ; (8036edc <etharp_query+0xf8>)
  74076. 8036e46: 4363 muls r3, r4
  74077. 8036e48: 18c8 adds r0, r1, r3
  74078. 8036e4a: 7c80 ldrb r0, [r0, #18]
  74079. 8036e4c: 2801 cmp r0, #1
  74080. 8036e4e: d90b bls.n 8036e68 <etharp_query+0x84>
  74081. /* we have a valid IP->Ethernet address mapping */
  74082. ETHARP_SET_HINT(netif, i);
  74083. 8036e50: 4a23 ldr r2, [pc, #140] ; (8036ee0 <etharp_query+0xfc>)
  74084. /* send the packet */
  74085. result = etharp_send_ip(netif, q, srcaddr, &(arp_table[i].ethaddr));
  74086. 8036e52: 18cb adds r3, r1, r3
  74087. /* packet given? */
  74088. LWIP_ASSERT("q != NULL", q != NULL);
  74089. /* stable entry? */
  74090. if (arp_table[i].state >= ETHARP_STATE_STABLE) {
  74091. /* we have a valid IP->Ethernet address mapping */
  74092. ETHARP_SET_HINT(netif, i);
  74093. 8036e54: 7014 strb r4, [r2, #0]
  74094. /* send the packet */
  74095. result = etharp_send_ip(netif, q, srcaddr, &(arp_table[i].ethaddr));
  74096. 8036e56: 4638 mov r0, r7
  74097. 8036e58: 4629 mov r1, r5
  74098. 8036e5a: f107 0227 add.w r2, r7, #39 ; 0x27
  74099. 8036e5e: 330c adds r3, #12
  74100. 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));
  74101. result = ERR_MEM;
  74102. }
  74103. }
  74104. return result;
  74105. }
  74106. 8036e60: e8bd 41f0 ldmia.w sp!, {r4, r5, r6, r7, r8, lr}
  74107. /* stable entry? */
  74108. if (arp_table[i].state >= ETHARP_STATE_STABLE) {
  74109. /* we have a valid IP->Ethernet address mapping */
  74110. ETHARP_SET_HINT(netif, i);
  74111. /* send the packet */
  74112. result = etharp_send_ip(netif, q, srcaddr, &(arp_table[i].ethaddr));
  74113. 8036e64: f7ff be76 b.w 8036b54 <etharp_send_ip>
  74114. /* pending entry? (either just created or already pending */
  74115. } else if (arp_table[i].state == ETHARP_STATE_PENDING) {
  74116. 8036e68: d123 bne.n 8036eb2 <etharp_query+0xce>
  74117. 8036e6a: 462b mov r3, r5
  74118. 8036e6c: e003 b.n 8036e76 <etharp_query+0x92>
  74119. * to copy the whole queue into a new PBUF_RAM (see bug #11400)
  74120. * PBUF_ROMs can be left as they are, since ROM must not get changed. */
  74121. p = q;
  74122. while (p) {
  74123. LWIP_ASSERT("no packet queues allowed!", (p->len != p->tot_len) || (p->next == 0));
  74124. if(p->type != PBUF_ROM) {
  74125. 8036e6e: 7b1a ldrb r2, [r3, #12]
  74126. 8036e70: 2a01 cmp r2, #1
  74127. 8036e72: d128 bne.n 8036ec6 <etharp_query+0xe2>
  74128. copy_needed = 1;
  74129. break;
  74130. }
  74131. p = p->next;
  74132. 8036e74: 681b ldr r3, [r3, #0]
  74133. int copy_needed = 0;
  74134. /* IF q includes a PBUF_REF, PBUF_POOL or PBUF_RAM, we have no choice but
  74135. * to copy the whole queue into a new PBUF_RAM (see bug #11400)
  74136. * PBUF_ROMs can be left as they are, since ROM must not get changed. */
  74137. p = q;
  74138. while (p) {
  74139. 8036e76: 2b00 cmp r3, #0
  74140. 8036e78: d1f9 bne.n 8036e6e <etharp_query+0x8a>
  74141. 8036e7a: e01e b.n 8036eba <etharp_query+0xd6>
  74142. }
  74143. if(copy_needed) {
  74144. /* copy the whole packet into new pbufs */
  74145. p = pbuf_alloc(PBUF_RAW, p->tot_len, PBUF_RAM);
  74146. if(p != NULL) {
  74147. if (pbuf_copy(p, q) != ERR_OK) {
  74148. 8036e7c: 4629 mov r1, r5
  74149. 8036e7e: f7f9 f807 bl 802fe90 <pbuf_copy>
  74150. 8036e82: b120 cbz r0, 8036e8e <etharp_query+0xaa>
  74151. pbuf_free(p);
  74152. 8036e84: 4630 mov r0, r6
  74153. 8036e86: f7f8 feff bl 802fc88 <pbuf_free>
  74154. 8036e8a: e024 b.n 8036ed6 <etharp_query+0xf2>
  74155. /* referencing the old pbuf is enough */
  74156. p = q;
  74157. pbuf_ref(p);
  74158. }
  74159. /* packet could be taken over? */
  74160. if (p != NULL) {
  74161. 8036e8c: 462e mov r6, r5
  74162. 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));
  74163. result = ERR_MEM;
  74164. }
  74165. #else /* ARP_QUEUEING */
  74166. /* always queue one packet per ARP request only, freeing a previously queued packet */
  74167. if (arp_table[i].q != NULL) {
  74168. 8036e8e: 2314 movs r3, #20
  74169. 8036e90: 4a12 ldr r2, [pc, #72] ; (8036edc <etharp_query+0xf8>)
  74170. 8036e92: fb03 f104 mul.w r1, r3, r4
  74171. 8036e96: 4615 mov r5, r2
  74172. 8036e98: 5850 ldr r0, [r2, r1]
  74173. 8036e9a: 461f mov r7, r3
  74174. 8036e9c: b108 cbz r0, 8036ea2 <etharp_query+0xbe>
  74175. 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));
  74176. pbuf_free(arp_table[i].q);
  74177. 8036e9e: f7f8 fef3 bl 802fc88 <pbuf_free>
  74178. }
  74179. arp_table[i].q = p;
  74180. 8036ea2: 437c muls r4, r7
  74181. 8036ea4: 512e str r6, [r5, r4]
  74182. result = ERR_OK;
  74183. 8036ea6: 2400 movs r4, #0
  74184. 8036ea8: e004 b.n 8036eb4 <etharp_query+0xd0>
  74185. /* non-unicast address? */
  74186. if (ip_addr_isbroadcast(ipaddr, netif) ||
  74187. ip_addr_ismulticast(ipaddr) ||
  74188. ip_addr_isany(ipaddr)) {
  74189. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: will not add non-unicast IP address to ARP cache\n"));
  74190. return ERR_ARG;
  74191. 8036eaa: 24f2 movs r4, #242 ; 0xf2
  74192. 8036eac: e002 b.n 8036eb4 <etharp_query+0xd0>
  74193. /* We don't re-send arp request in etharp_tmr, but we still queue packets,
  74194. since this failure could be temporary, and the next packet calling
  74195. etharp_query again could lead to sending the queued packets. */
  74196. }
  74197. if (q == NULL) {
  74198. return result;
  74199. 8036eae: 4604 mov r4, r0
  74200. 8036eb0: e000 b.n 8036eb4 <etharp_query+0xd0>
  74201. /* we have a valid IP->Ethernet address mapping */
  74202. ETHARP_SET_HINT(netif, i);
  74203. /* send the packet */
  74204. result = etharp_send_ip(netif, q, srcaddr, &(arp_table[i].ethaddr));
  74205. /* pending entry? (either just created or already pending */
  74206. } else if (arp_table[i].state == ETHARP_STATE_PENDING) {
  74207. 8036eb2: 4614 mov r4, r2
  74208. 8036eb4: b260 sxtb r0, r4
  74209. 8036eb6: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  74210. }
  74211. }
  74212. } else {
  74213. /* referencing the old pbuf is enough */
  74214. p = q;
  74215. pbuf_ref(p);
  74216. 8036eba: 4628 mov r0, r5
  74217. 8036ebc: f7f8 ffc1 bl 802fe42 <pbuf_ref>
  74218. }
  74219. /* packet could be taken over? */
  74220. if (p != NULL) {
  74221. 8036ec0: 2d00 cmp r5, #0
  74222. 8036ec2: d1e3 bne.n 8036e8c <etharp_query+0xa8>
  74223. 8036ec4: e007 b.n 8036ed6 <etharp_query+0xf2>
  74224. }
  74225. p = p->next;
  74226. }
  74227. if(copy_needed) {
  74228. /* copy the whole packet into new pbufs */
  74229. p = pbuf_alloc(PBUF_RAW, p->tot_len, PBUF_RAM);
  74230. 8036ec6: 2003 movs r0, #3
  74231. 8036ec8: 8919 ldrh r1, [r3, #8]
  74232. 8036eca: 2200 movs r2, #0
  74233. 8036ecc: f7f8 ff29 bl 802fd22 <pbuf_alloc>
  74234. if(p != NULL) {
  74235. 8036ed0: 4606 mov r6, r0
  74236. 8036ed2: 2800 cmp r0, #0
  74237. 8036ed4: d1d2 bne.n 8036e7c <etharp_query+0x98>
  74238. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: queued packet %p on ARP entry %"S16_F"\n", (void *)q, (s16_t)i));
  74239. #endif /* ARP_QUEUEING */
  74240. } else {
  74241. ETHARP_STATS_INC(etharp.memerr);
  74242. 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));
  74243. result = ERR_MEM;
  74244. 8036ed6: 24ff movs r4, #255 ; 0xff
  74245. 8036ed8: e7ec b.n 8036eb4 <etharp_query+0xd0>
  74246. 8036eda: bf00 nop
  74247. 8036edc: 2000c754 .word 0x2000c754
  74248. 8036ee0: 2000c750 .word 0x2000c750
  74249. 08036ee4 <etharp_output_to_arp_index>:
  74250. /** Just a small helper function that sends a pbuf to an ethernet address
  74251. * in the arp_table specified by the index 'arp_idx'.
  74252. */
  74253. static err_t
  74254. etharp_output_to_arp_index(struct netif *netif, struct pbuf *q, u8_t arp_idx)
  74255. {
  74256. 8036ee4: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  74257. LWIP_ASSERT("arp_table[arp_idx].state >= ETHARP_STATE_STABLE",
  74258. arp_table[arp_idx].state >= ETHARP_STATE_STABLE);
  74259. /* if arp table entry is about to expire: re-request it,
  74260. but only if its state is ETHARP_STATE_STABLE to prevent flooding the
  74261. network with ARP requests if this address is used frequently. */
  74262. if ((arp_table[arp_idx].state == ETHARP_STATE_STABLE) &&
  74263. 8036ee8: 4b10 ldr r3, [pc, #64] ; (8036f2c <etharp_output_to_arp_index+0x48>)
  74264. /** Just a small helper function that sends a pbuf to an ethernet address
  74265. * in the arp_table specified by the index 'arp_idx'.
  74266. */
  74267. static err_t
  74268. etharp_output_to_arp_index(struct netif *netif, struct pbuf *q, u8_t arp_idx)
  74269. {
  74270. 8036eea: 4615 mov r5, r2
  74271. LWIP_ASSERT("arp_table[arp_idx].state >= ETHARP_STATE_STABLE",
  74272. arp_table[arp_idx].state >= ETHARP_STATE_STABLE);
  74273. /* if arp table entry is about to expire: re-request it,
  74274. but only if its state is ETHARP_STATE_STABLE to prevent flooding the
  74275. network with ARP requests if this address is used frequently. */
  74276. if ((arp_table[arp_idx].state == ETHARP_STATE_STABLE) &&
  74277. 8036eec: 2214 movs r2, #20
  74278. /** Just a small helper function that sends a pbuf to an ethernet address
  74279. * in the arp_table specified by the index 'arp_idx'.
  74280. */
  74281. static err_t
  74282. etharp_output_to_arp_index(struct netif *netif, struct pbuf *q, u8_t arp_idx)
  74283. {
  74284. 8036eee: 460e mov r6, r1
  74285. LWIP_ASSERT("arp_table[arp_idx].state >= ETHARP_STATE_STABLE",
  74286. arp_table[arp_idx].state >= ETHARP_STATE_STABLE);
  74287. /* if arp table entry is about to expire: re-request it,
  74288. but only if its state is ETHARP_STATE_STABLE to prevent flooding the
  74289. network with ARP requests if this address is used frequently. */
  74290. if ((arp_table[arp_idx].state == ETHARP_STATE_STABLE) &&
  74291. 8036ef0: fb02 3105 mla r1, r2, r5, r3
  74292. /** Just a small helper function that sends a pbuf to an ethernet address
  74293. * in the arp_table specified by the index 'arp_idx'.
  74294. */
  74295. static err_t
  74296. etharp_output_to_arp_index(struct netif *netif, struct pbuf *q, u8_t arp_idx)
  74297. {
  74298. 8036ef4: 4607 mov r7, r0
  74299. LWIP_ASSERT("arp_table[arp_idx].state >= ETHARP_STATE_STABLE",
  74300. arp_table[arp_idx].state >= ETHARP_STATE_STABLE);
  74301. /* if arp table entry is about to expire: re-request it,
  74302. but only if its state is ETHARP_STATE_STABLE to prevent flooding the
  74303. network with ARP requests if this address is used frequently. */
  74304. if ((arp_table[arp_idx].state == ETHARP_STATE_STABLE) &&
  74305. 8036ef6: 7c8a ldrb r2, [r1, #18]
  74306. 8036ef8: 2a02 cmp r2, #2
  74307. 8036efa: f101 0410 add.w r4, r1, #16
  74308. 8036efe: d108 bne.n 8036f12 <etharp_output_to_arp_index+0x2e>
  74309. 8036f00: 7cca ldrb r2, [r1, #19]
  74310. 8036f02: 2ae3 cmp r2, #227 ; 0xe3
  74311. 8036f04: d905 bls.n 8036f12 <etharp_output_to_arp_index+0x2e>
  74312. (arp_table[arp_idx].ctime >= ARP_AGE_REREQUEST_USED)) {
  74313. if (etharp_request(netif, &arp_table[arp_idx].ipaddr) == ERR_OK) {
  74314. 8036f06: 3104 adds r1, #4
  74315. 8036f08: f7ff ff16 bl 8036d38 <etharp_request>
  74316. 8036f0c: b908 cbnz r0, 8036f12 <etharp_output_to_arp_index+0x2e>
  74317. arp_table[arp_idx].state = ETHARP_STATE_STABLE_REREQUESTING;
  74318. 8036f0e: 2303 movs r3, #3
  74319. 8036f10: 70a3 strb r3, [r4, #2]
  74320. }
  74321. }
  74322. return etharp_send_ip(netif, q, (struct eth_addr*)(netif->hwaddr),
  74323. 8036f12: 4b06 ldr r3, [pc, #24] ; (8036f2c <etharp_output_to_arp_index+0x48>)
  74324. 8036f14: 2214 movs r2, #20
  74325. 8036f16: fb02 3305 mla r3, r2, r5, r3
  74326. 8036f1a: 4638 mov r0, r7
  74327. 8036f1c: 4631 mov r1, r6
  74328. 8036f1e: f107 0227 add.w r2, r7, #39 ; 0x27
  74329. 8036f22: 330c adds r3, #12
  74330. &arp_table[arp_idx].ethaddr);
  74331. }
  74332. 8036f24: e8bd 41f0 ldmia.w sp!, {r4, r5, r6, r7, r8, lr}
  74333. if (etharp_request(netif, &arp_table[arp_idx].ipaddr) == ERR_OK) {
  74334. arp_table[arp_idx].state = ETHARP_STATE_STABLE_REREQUESTING;
  74335. }
  74336. }
  74337. return etharp_send_ip(netif, q, (struct eth_addr*)(netif->hwaddr),
  74338. 8036f28: f7ff be14 b.w 8036b54 <etharp_send_ip>
  74339. 8036f2c: 2000c754 .word 0x2000c754
  74340. 08036f30 <etharp_output>:
  74341. * - ERR_RTE No route to destination (no gateway to external networks),
  74342. * or the return type of either etharp_query() or etharp_send_ip().
  74343. */
  74344. err_t
  74345. etharp_output(struct netif *netif, struct pbuf *q, ip_addr_t *ipaddr)
  74346. {
  74347. 8036f30: b5f7 push {r0, r1, r2, r4, r5, r6, r7, lr}
  74348. 8036f32: 4604 mov r4, r0
  74349. 8036f34: 460e mov r6, r1
  74350. LWIP_ASSERT("netif != NULL", netif != NULL);
  74351. LWIP_ASSERT("q != NULL", q != NULL);
  74352. LWIP_ASSERT("ipaddr != NULL", ipaddr != NULL);
  74353. /* make room for Ethernet header - should not fail */
  74354. if (pbuf_header(q, sizeof(struct eth_hdr)) != 0) {
  74355. 8036f36: 4608 mov r0, r1
  74356. 8036f38: 210e movs r1, #14
  74357. * - ERR_RTE No route to destination (no gateway to external networks),
  74358. * or the return type of either etharp_query() or etharp_send_ip().
  74359. */
  74360. err_t
  74361. etharp_output(struct netif *netif, struct pbuf *q, ip_addr_t *ipaddr)
  74362. {
  74363. 8036f3a: 4615 mov r5, r2
  74364. LWIP_ASSERT("netif != NULL", netif != NULL);
  74365. LWIP_ASSERT("q != NULL", q != NULL);
  74366. LWIP_ASSERT("ipaddr != NULL", ipaddr != NULL);
  74367. /* make room for Ethernet header - should not fail */
  74368. if (pbuf_header(q, sizeof(struct eth_hdr)) != 0) {
  74369. 8036f3c: f7f8 fe79 bl 802fc32 <pbuf_header>
  74370. 8036f40: 2800 cmp r0, #0
  74371. 8036f42: d163 bne.n 803700c <etharp_output+0xdc>
  74372. /* Determine on destination hardware address. Broadcasts and multicasts
  74373. * are special, other IP addresses are looked up in the ARP table. */
  74374. /* broadcast destination IP address? */
  74375. if (ip_addr_isbroadcast(ipaddr, netif)) {
  74376. 8036f44: 6828 ldr r0, [r5, #0]
  74377. 8036f46: 4621 mov r1, r4
  74378. 8036f48: f7fb fd38 bl 80329bc <ip4_addr_isbroadcast>
  74379. 8036f4c: 2800 cmp r0, #0
  74380. 8036f4e: d155 bne.n 8036ffc <etharp_output+0xcc>
  74381. /* broadcast on Ethernet also */
  74382. dest = (struct eth_addr *)&ethbroadcast;
  74383. /* multicast destination IP address? */
  74384. } else if (ip_addr_ismulticast(ipaddr)) {
  74385. 8036f50: 682b ldr r3, [r5, #0]
  74386. 8036f52: f003 02f0 and.w r2, r3, #240 ; 0xf0
  74387. 8036f56: 2ae0 cmp r2, #224 ; 0xe0
  74388. 8036f58: d114 bne.n 8036f84 <etharp_output+0x54>
  74389. /* Hash IP multicast address to MAC address.*/
  74390. mcastaddr.addr[0] = LL_MULTICAST_ADDR_0;
  74391. 8036f5a: 2301 movs r3, #1
  74392. 8036f5c: f88d 3000 strb.w r3, [sp]
  74393. mcastaddr.addr[1] = LL_MULTICAST_ADDR_1;
  74394. mcastaddr.addr[2] = LL_MULTICAST_ADDR_2;
  74395. 8036f60: 235e movs r3, #94 ; 0x5e
  74396. 8036f62: f88d 3002 strb.w r3, [sp, #2]
  74397. mcastaddr.addr[3] = ip4_addr2(ipaddr) & 0x7f;
  74398. 8036f66: 786b ldrb r3, [r5, #1]
  74399. dest = (struct eth_addr *)&ethbroadcast;
  74400. /* multicast destination IP address? */
  74401. } else if (ip_addr_ismulticast(ipaddr)) {
  74402. /* Hash IP multicast address to MAC address.*/
  74403. mcastaddr.addr[0] = LL_MULTICAST_ADDR_0;
  74404. mcastaddr.addr[1] = LL_MULTICAST_ADDR_1;
  74405. 8036f68: f88d 0001 strb.w r0, [sp, #1]
  74406. mcastaddr.addr[2] = LL_MULTICAST_ADDR_2;
  74407. mcastaddr.addr[3] = ip4_addr2(ipaddr) & 0x7f;
  74408. 8036f6c: f003 037f and.w r3, r3, #127 ; 0x7f
  74409. 8036f70: f88d 3003 strb.w r3, [sp, #3]
  74410. mcastaddr.addr[4] = ip4_addr3(ipaddr);
  74411. 8036f74: 78ab ldrb r3, [r5, #2]
  74412. 8036f76: f88d 3004 strb.w r3, [sp, #4]
  74413. mcastaddr.addr[5] = ip4_addr4(ipaddr);
  74414. 8036f7a: 78eb ldrb r3, [r5, #3]
  74415. 8036f7c: f88d 3005 strb.w r3, [sp, #5]
  74416. /* destination Ethernet address is multicast */
  74417. dest = &mcastaddr;
  74418. 8036f80: 466b mov r3, sp
  74419. 8036f82: e03c b.n 8036ffe <etharp_output+0xce>
  74420. /* unicast destination IP address? */
  74421. } else {
  74422. s8_t i;
  74423. /* outside local network? if so, this can neither be a global broadcast nor
  74424. a subnet broadcast. */
  74425. if (!ip_addr_netcmp(ipaddr, &(netif->ip_addr), &(netif->netmask)) &&
  74426. 8036f84: 6862 ldr r2, [r4, #4]
  74427. 8036f86: ea83 0102 eor.w r1, r3, r2
  74428. 8036f8a: 68a2 ldr r2, [r4, #8]
  74429. 8036f8c: 4211 tst r1, r2
  74430. 8036f8e: d009 beq.n 8036fa4 <etharp_output+0x74>
  74431. !ip_addr_islinklocal(ipaddr)) {
  74432. 8036f90: b29b uxth r3, r3
  74433. /* unicast destination IP address? */
  74434. } else {
  74435. s8_t i;
  74436. /* outside local network? if so, this can neither be a global broadcast nor
  74437. a subnet broadcast. */
  74438. if (!ip_addr_netcmp(ipaddr, &(netif->ip_addr), &(netif->netmask)) &&
  74439. 8036f92: f64f 62a9 movw r2, #65193 ; 0xfea9
  74440. 8036f96: 4293 cmp r3, r2
  74441. 8036f98: d004 beq.n 8036fa4 <etharp_output+0x74>
  74442. router for forwarding". */
  74443. if (!ip_addr_islinklocal(&iphdr->src))
  74444. #endif /* LWIP_AUTOIP */
  74445. {
  74446. /* interface has default gateway? */
  74447. if (!ip_addr_isany(&netif->gw)) {
  74448. 8036f9a: 68e3 ldr r3, [r4, #12]
  74449. 8036f9c: f104 010c add.w r1, r4, #12
  74450. 8036fa0: b90b cbnz r3, 8036fa6 <etharp_output+0x76>
  74451. 8036fa2: e035 b.n 8037010 <etharp_output+0xe0>
  74452. /* unicast destination IP address? */
  74453. } else {
  74454. s8_t i;
  74455. /* outside local network? if so, this can neither be a global broadcast nor
  74456. a subnet broadcast. */
  74457. if (!ip_addr_netcmp(ipaddr, &(netif->ip_addr), &(netif->netmask)) &&
  74458. 8036fa4: 4629 mov r1, r5
  74459. if (netif->addr_hint != NULL) {
  74460. /* per-pcb cached entry was given */
  74461. u8_t etharp_cached_entry = *(netif->addr_hint);
  74462. if (etharp_cached_entry < ARP_TABLE_SIZE) {
  74463. #endif /* LWIP_NETIF_HWADDRHINT */
  74464. if ((arp_table[etharp_cached_entry].state >= ETHARP_STATE_STABLE) &&
  74465. 8036fa6: 4b1c ldr r3, [pc, #112] ; (8037018 <etharp_output+0xe8>)
  74466. 8036fa8: 781a ldrb r2, [r3, #0]
  74467. 8036faa: 4b1c ldr r3, [pc, #112] ; (803701c <etharp_output+0xec>)
  74468. 8036fac: 2014 movs r0, #20
  74469. 8036fae: fb00 3302 mla r3, r0, r2, r3
  74470. 8036fb2: 7c98 ldrb r0, [r3, #18]
  74471. 8036fb4: 2801 cmp r0, #1
  74472. 8036fb6: d904 bls.n 8036fc2 <etharp_output+0x92>
  74473. 8036fb8: 6808 ldr r0, [r1, #0]
  74474. 8036fba: 685b ldr r3, [r3, #4]
  74475. 8036fbc: 4298 cmp r0, r3
  74476. 8036fbe: d100 bne.n 8036fc2 <etharp_output+0x92>
  74477. 8036fc0: e00d b.n 8036fde <etharp_output+0xae>
  74478. 8036fc2: 2300 movs r3, #0
  74479. * @return
  74480. * - ERR_RTE No route to destination (no gateway to external networks),
  74481. * or the return type of either etharp_query() or etharp_send_ip().
  74482. */
  74483. err_t
  74484. etharp_output(struct netif *netif, struct pbuf *q, ip_addr_t *ipaddr)
  74485. 8036fc4: 4f15 ldr r7, [pc, #84] ; (803701c <etharp_output+0xec>)
  74486. if (netif->addr_hint != NULL) {
  74487. /* per-pcb cached entry was given */
  74488. u8_t etharp_cached_entry = *(netif->addr_hint);
  74489. if (etharp_cached_entry < ARP_TABLE_SIZE) {
  74490. #endif /* LWIP_NETIF_HWADDRHINT */
  74491. if ((arp_table[etharp_cached_entry].state >= ETHARP_STATE_STABLE) &&
  74492. 8036fc6: 461a mov r2, r3
  74493. * @return
  74494. * - ERR_RTE No route to destination (no gateway to external networks),
  74495. * or the return type of either etharp_query() or etharp_send_ip().
  74496. */
  74497. err_t
  74498. etharp_output(struct netif *netif, struct pbuf *q, ip_addr_t *ipaddr)
  74499. 8036fc8: 18f8 adds r0, r7, r3
  74500. #endif /* LWIP_NETIF_HWADDRHINT */
  74501. /* find stable entry: do this here since this is a critical path for
  74502. throughput and etharp_find_entry() is kind of slow */
  74503. for (i = 0; i < ARP_TABLE_SIZE; i++) {
  74504. if ((arp_table[i].state >= ETHARP_STATE_STABLE) &&
  74505. 8036fca: 7c85 ldrb r5, [r0, #18]
  74506. 8036fcc: 2d01 cmp r5, #1
  74507. 8036fce: d90b bls.n 8036fe8 <etharp_output+0xb8>
  74508. 8036fd0: 680d ldr r5, [r1, #0]
  74509. 8036fd2: 6840 ldr r0, [r0, #4]
  74510. 8036fd4: 4285 cmp r5, r0
  74511. 8036fd6: d107 bne.n 8036fe8 <etharp_output+0xb8>
  74512. (ip_addr_cmp(dst_addr, &arp_table[i].ipaddr))) {
  74513. /* found an existing, stable entry */
  74514. ETHARP_SET_HINT(netif, i);
  74515. 8036fd8: 4b0f ldr r3, [pc, #60] ; (8037018 <etharp_output+0xe8>)
  74516. 8036fda: b2d2 uxtb r2, r2
  74517. 8036fdc: 701a strb r2, [r3, #0]
  74518. return etharp_output_to_arp_index(netif, q, i);
  74519. 8036fde: 4620 mov r0, r4
  74520. 8036fe0: 4631 mov r1, r6
  74521. 8036fe2: f7ff ff7f bl 8036ee4 <etharp_output_to_arp_index>
  74522. 8036fe6: e014 b.n 8037012 <etharp_output+0xe2>
  74523. 8036fe8: 3314 adds r3, #20
  74524. }
  74525. #endif /* LWIP_NETIF_HWADDRHINT */
  74526. /* find stable entry: do this here since this is a critical path for
  74527. throughput and etharp_find_entry() is kind of slow */
  74528. for (i = 0; i < ARP_TABLE_SIZE; i++) {
  74529. 8036fea: 3201 adds r2, #1
  74530. 8036fec: 2bc8 cmp r3, #200 ; 0xc8
  74531. 8036fee: b2d2 uxtb r2, r2
  74532. 8036ff0: d1ea bne.n 8036fc8 <etharp_output+0x98>
  74533. return etharp_output_to_arp_index(netif, q, i);
  74534. }
  74535. }
  74536. /* no stable entry found, use the (slower) query function:
  74537. queue on destination Ethernet address belonging to ipaddr */
  74538. return etharp_query(netif, dst_addr, q);
  74539. 8036ff2: 4620 mov r0, r4
  74540. 8036ff4: 4632 mov r2, r6
  74541. 8036ff6: f7ff fef5 bl 8036de4 <etharp_query>
  74542. 8036ffa: e00a b.n 8037012 <etharp_output+0xe2>
  74543. * are special, other IP addresses are looked up in the ARP table. */
  74544. /* broadcast destination IP address? */
  74545. if (ip_addr_isbroadcast(ipaddr, netif)) {
  74546. /* broadcast on Ethernet also */
  74547. dest = (struct eth_addr *)&ethbroadcast;
  74548. 8036ffc: 4b08 ldr r3, [pc, #32] ; (8037020 <etharp_output+0xf0>)
  74549. }
  74550. /* continuation for multicast/broadcast destinations */
  74551. /* obtain source Ethernet address of the given interface */
  74552. /* send packet directly on the link */
  74553. return etharp_send_ip(netif, q, (struct eth_addr*)(netif->hwaddr), dest);
  74554. 8036ffe: 4620 mov r0, r4
  74555. 8037000: 4631 mov r1, r6
  74556. 8037002: f104 0227 add.w r2, r4, #39 ; 0x27
  74557. 8037006: f7ff fda5 bl 8036b54 <etharp_send_ip>
  74558. 803700a: e002 b.n 8037012 <etharp_output+0xe2>
  74559. if (pbuf_header(q, sizeof(struct eth_hdr)) != 0) {
  74560. /* bail out */
  74561. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS,
  74562. ("etharp_output: could not allocate room for header.\n"));
  74563. LINK_STATS_INC(link.lenerr);
  74564. return ERR_BUF;
  74565. 803700c: 20fe movs r0, #254 ; 0xfe
  74566. 803700e: e000 b.n 8037012 <etharp_output+0xe2>
  74567. /* send to hardware address of default gateway IP address */
  74568. dst_addr = &(netif->gw);
  74569. /* no default gateway available */
  74570. } else {
  74571. /* no route to destination error (default gateway missing) */
  74572. return ERR_RTE;
  74573. 8037010: 20fc movs r0, #252 ; 0xfc
  74574. /* continuation for multicast/broadcast destinations */
  74575. /* obtain source Ethernet address of the given interface */
  74576. /* send packet directly on the link */
  74577. return etharp_send_ip(netif, q, (struct eth_addr*)(netif->hwaddr), dest);
  74578. }
  74579. 8037012: b240 sxtb r0, r0
  74580. 8037014: bdfe pop {r1, r2, r3, r4, r5, r6, r7, pc}
  74581. 8037016: bf00 nop
  74582. 8037018: 2000c750 .word 0x2000c750
  74583. 803701c: 2000c754 .word 0x2000c754
  74584. 8037020: 08045073 .word 0x08045073
  74585. 08037024 <ethernet_input>:
  74586. * @param p the recevied packet, p->payload pointing to the ethernet header
  74587. * @param netif the network interface on which the packet was received
  74588. */
  74589. err_t
  74590. ethernet_input(struct pbuf *p, struct netif *netif)
  74591. {
  74592. 8037024: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  74593. u16_t type;
  74594. #if LWIP_ARP || ETHARP_SUPPORT_VLAN
  74595. s16_t ip_hdr_offset = SIZEOF_ETH_HDR;
  74596. #endif /* LWIP_ARP || ETHARP_SUPPORT_VLAN */
  74597. if (p->len <= SIZEOF_ETH_HDR) {
  74598. 8037028: 8943 ldrh r3, [r0, #10]
  74599. 803702a: 2b0e cmp r3, #14
  74600. * @param p the recevied packet, p->payload pointing to the ethernet header
  74601. * @param netif the network interface on which the packet was received
  74602. */
  74603. err_t
  74604. ethernet_input(struct pbuf *p, struct netif *netif)
  74605. {
  74606. 803702c: b087 sub sp, #28
  74607. 803702e: 4604 mov r4, r0
  74608. 8037030: 460d mov r5, r1
  74609. u16_t type;
  74610. #if LWIP_ARP || ETHARP_SUPPORT_VLAN
  74611. s16_t ip_hdr_offset = SIZEOF_ETH_HDR;
  74612. #endif /* LWIP_ARP || ETHARP_SUPPORT_VLAN */
  74613. if (p->len <= SIZEOF_ETH_HDR) {
  74614. 8037032: f240 80ed bls.w 8037210 <ethernet_input+0x1ec>
  74615. ETHARP_STATS_INC(etharp.drop);
  74616. goto free_and_return;
  74617. }
  74618. /* points to packet payload, which starts with an Ethernet header */
  74619. ethhdr = (struct eth_hdr *)p->payload;
  74620. 8037036: 6840 ldr r0, [r0, #4]
  74621. #if LWIP_ARP_FILTER_NETIF
  74622. netif = LWIP_ARP_FILTER_NETIF_FN(p, netif, htons(type));
  74623. #endif /* LWIP_ARP_FILTER_NETIF*/
  74624. if (ethhdr->dest.addr[0] & 1) {
  74625. 8037038: 7803 ldrb r3, [r0, #0]
  74626. (unsigned)ethhdr->dest.addr[3], (unsigned)ethhdr->dest.addr[4], (unsigned)ethhdr->dest.addr[5],
  74627. (unsigned)ethhdr->src.addr[0], (unsigned)ethhdr->src.addr[1], (unsigned)ethhdr->src.addr[2],
  74628. (unsigned)ethhdr->src.addr[3], (unsigned)ethhdr->src.addr[4], (unsigned)ethhdr->src.addr[5],
  74629. (unsigned)htons(ethhdr->type)));
  74630. type = ethhdr->type;
  74631. 803703a: 8986 ldrh r6, [r0, #12]
  74632. #if LWIP_ARP_FILTER_NETIF
  74633. netif = LWIP_ARP_FILTER_NETIF_FN(p, netif, htons(type));
  74634. #endif /* LWIP_ARP_FILTER_NETIF*/
  74635. if (ethhdr->dest.addr[0] & 1) {
  74636. 803703c: 07da lsls r2, r3, #31
  74637. 803703e: d513 bpl.n 8037068 <ethernet_input+0x44>
  74638. /* this might be a multicast or broadcast packet */
  74639. if (ethhdr->dest.addr[0] == LL_MULTICAST_ADDR_0) {
  74640. 8037040: 2b01 cmp r3, #1
  74641. 8037042: d108 bne.n 8037056 <ethernet_input+0x32>
  74642. if ((ethhdr->dest.addr[1] == LL_MULTICAST_ADDR_1) &&
  74643. 8037044: 7843 ldrb r3, [r0, #1]
  74644. 8037046: b97b cbnz r3, 8037068 <ethernet_input+0x44>
  74645. 8037048: 7883 ldrb r3, [r0, #2]
  74646. 803704a: 2b5e cmp r3, #94 ; 0x5e
  74647. 803704c: d10c bne.n 8037068 <ethernet_input+0x44>
  74648. (ethhdr->dest.addr[2] == LL_MULTICAST_ADDR_2)) {
  74649. /* mark the pbuf as link-layer multicast */
  74650. p->flags |= PBUF_FLAG_LLMCAST;
  74651. 803704e: 7b63 ldrb r3, [r4, #13]
  74652. 8037050: f043 0310 orr.w r3, r3, #16
  74653. 8037054: e007 b.n 8037066 <ethernet_input+0x42>
  74654. }
  74655. } else if (eth_addr_cmp(&ethhdr->dest, &ethbroadcast)) {
  74656. 8037056: 4972 ldr r1, [pc, #456] ; (8037220 <ethernet_input+0x1fc>)
  74657. 8037058: 2206 movs r2, #6
  74658. 803705a: f7ea fdf1 bl 8021c40 <memcmp>
  74659. 803705e: b918 cbnz r0, 8037068 <ethernet_input+0x44>
  74660. /* mark the pbuf as link-layer broadcast */
  74661. p->flags |= PBUF_FLAG_LLBCAST;
  74662. 8037060: 7b63 ldrb r3, [r4, #13]
  74663. 8037062: f043 0308 orr.w r3, r3, #8
  74664. 8037066: 7363 strb r3, [r4, #13]
  74665. }
  74666. }
  74667. switch (type) {
  74668. 8037068: 2e08 cmp r6, #8
  74669. 803706a: d004 beq.n 8037076 <ethernet_input+0x52>
  74670. 803706c: f5b6 6fc1 cmp.w r6, #1544 ; 0x608
  74671. 8037070: f040 80ce bne.w 8037210 <ethernet_input+0x1ec>
  74672. 8037074: e014 b.n 80370a0 <ethernet_input+0x7c>
  74673. #if LWIP_ARP
  74674. /* IP packet? */
  74675. case PP_HTONS(ETHTYPE_IP):
  74676. if (!(netif->flags & NETIF_FLAG_ETHARP)) {
  74677. 8037076: f895 302d ldrb.w r3, [r5, #45] ; 0x2d
  74678. 803707a: f003 0320 and.w r3, r3, #32
  74679. 803707e: b2db uxtb r3, r3
  74680. 8037080: 2b00 cmp r3, #0
  74681. 8037082: f000 80c5 beq.w 8037210 <ethernet_input+0x1ec>
  74682. #if ETHARP_TRUST_IP_MAC
  74683. /* update ARP table */
  74684. etharp_ip_input(netif, p);
  74685. #endif /* ETHARP_TRUST_IP_MAC */
  74686. /* skip Ethernet header */
  74687. if(pbuf_header(p, -ip_hdr_offset)) {
  74688. 8037086: 4620 mov r0, r4
  74689. 8037088: f06f 010d mvn.w r1, #13
  74690. 803708c: f7f8 fdd1 bl 802fc32 <pbuf_header>
  74691. 8037090: 2800 cmp r0, #0
  74692. 8037092: f040 80bd bne.w 8037210 <ethernet_input+0x1ec>
  74693. LWIP_ASSERT("Can't move over header in packet", 0);
  74694. goto free_and_return;
  74695. } else {
  74696. /* pass to IP layer */
  74697. ip_input(p, netif);
  74698. 8037096: 4620 mov r0, r4
  74699. 8037098: 4629 mov r1, r5
  74700. 803709a: f7fb fda3 bl 8032be4 <ip_input>
  74701. }
  74702. break;
  74703. 803709e: e0ba b.n 8037216 <ethernet_input+0x1f2>
  74704. case PP_HTONS(ETHTYPE_ARP):
  74705. if (!(netif->flags & NETIF_FLAG_ETHARP)) {
  74706. 80370a0: f895 302d ldrb.w r3, [r5, #45] ; 0x2d
  74707. 80370a4: f003 0320 and.w r3, r3, #32
  74708. 80370a8: b2db uxtb r3, r3
  74709. 80370aa: 2b00 cmp r3, #0
  74710. 80370ac: f000 80b0 beq.w 8037210 <ethernet_input+0x1ec>
  74711. LWIP_ERROR("netif != NULL", (netif != NULL), return;);
  74712. /* drop short ARP packets: we have to check for p->len instead of p->tot_len here
  74713. since a struct etharp_hdr is pointed to p->payload, so it musn't be chained! */
  74714. if (p->len < SIZEOF_ETHARP_PACKET) {
  74715. 80370b0: 8963 ldrh r3, [r4, #10]
  74716. 80370b2: 2b29 cmp r3, #41 ; 0x29
  74717. 80370b4: d800 bhi.n 80370b8 <ethernet_input+0x94>
  74718. 80370b6: e0ab b.n 8037210 <ethernet_input+0x1ec>
  74719. ETHARP_STATS_INC(etharp.drop);
  74720. pbuf_free(p);
  74721. return;
  74722. }
  74723. ethhdr = (struct eth_hdr *)p->payload;
  74724. 80370b8: 6866 ldr r6, [r4, #4]
  74725. hdr = (struct etharp_hdr *)(((u8_t*)ethhdr) + SIZEOF_ETH_HDR + SIZEOF_VLAN_HDR);
  74726. }
  74727. #endif /* ETHARP_SUPPORT_VLAN */
  74728. /* RFC 826 "Packet Reception": */
  74729. if ((hdr->hwtype != PP_HTONS(HWTYPE_ETHERNET)) ||
  74730. 80370ba: 89f3 ldrh r3, [r6, #14]
  74731. 80370bc: f5b3 7f80 cmp.w r3, #256 ; 0x100
  74732. 80370c0: f040 80a6 bne.w 8037210 <ethernet_input+0x1ec>
  74733. 80370c4: 7cb3 ldrb r3, [r6, #18]
  74734. 80370c6: 2b06 cmp r3, #6
  74735. 80370c8: f040 80a2 bne.w 8037210 <ethernet_input+0x1ec>
  74736. (hdr->hwlen != ETHARP_HWADDR_LEN) ||
  74737. 80370cc: 7cf7 ldrb r7, [r6, #19]
  74738. 80370ce: 2f04 cmp r7, #4
  74739. 80370d0: f040 809e bne.w 8037210 <ethernet_input+0x1ec>
  74740. (hdr->protolen != sizeof(ip_addr_t)) ||
  74741. 80370d4: 8a33 ldrh r3, [r6, #16]
  74742. 80370d6: 2b08 cmp r3, #8
  74743. 80370d8: f040 809a bne.w 8037210 <ethernet_input+0x1ec>
  74744. autoip_arp_reply(netif, hdr);
  74745. #endif /* LWIP_AUTOIP */
  74746. /* Copy struct ip_addr2 to aligned ip_addr, to support compilers without
  74747. * structure packing (not using structure copy which breaks strict-aliasing rules). */
  74748. IPADDR2_COPY(&sipaddr, &hdr->sipaddr);
  74749. 80370dc: f106 0a1c add.w sl, r6, #28
  74750. 80370e0: 4651 mov r1, sl
  74751. 80370e2: 463a mov r2, r7
  74752. 80370e4: a804 add r0, sp, #16
  74753. 80370e6: f7ea fddd bl 8021ca4 <memcpy>
  74754. IPADDR2_COPY(&dipaddr, &hdr->dipaddr);
  74755. 80370ea: f106 0226 add.w r2, r6, #38 ; 0x26
  74756. 80370ee: 9203 str r2, [sp, #12]
  74757. 80370f0: 4611 mov r1, r2
  74758. 80370f2: a805 add r0, sp, #20
  74759. 80370f4: 463a mov r2, r7
  74760. 80370f6: f7ea fdd5 bl 8021ca4 <memcpy>
  74761. /* this interface is not configured? */
  74762. if (ip_addr_isany(&netif->ip_addr)) {
  74763. 80370fa: 686b ldr r3, [r5, #4]
  74764. 80370fc: b12b cbz r3, 803710a <ethernet_input+0xe6>
  74765. for_us = 0;
  74766. } else {
  74767. /* ARP packet directed to us? */
  74768. for_us = (u8_t)ip_addr_cmp(&dipaddr, &(netif->ip_addr));
  74769. 80370fe: 9a05 ldr r2, [sp, #20]
  74770. 8037100: 1ad1 subs r1, r2, r3
  74771. 8037102: 424a negs r2, r1
  74772. 8037104: 414a adcs r2, r1
  74773. 8037106: 9201 str r2, [sp, #4]
  74774. 8037108: e000 b.n 803710c <ethernet_input+0xe8>
  74775. IPADDR2_COPY(&sipaddr, &hdr->sipaddr);
  74776. IPADDR2_COPY(&dipaddr, &hdr->dipaddr);
  74777. /* this interface is not configured? */
  74778. if (ip_addr_isany(&netif->ip_addr)) {
  74779. for_us = 0;
  74780. 803710a: 9301 str r3, [sp, #4]
  74781. /* ARP message directed to us?
  74782. -> add IP address in ARP cache; assume requester wants to talk to us,
  74783. can result in directly sending the queued packets for this host.
  74784. ARP message not directed to us?
  74785. -> update the source IP address in the cache, if present */
  74786. etharp_update_arp_entry(netif, &sipaddr, &(hdr->shwaddr),
  74787. 803710c: 9b01 ldr r3, [sp, #4]
  74788. 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",
  74789. ip4_addr1_16(ipaddr), ip4_addr2_16(ipaddr), ip4_addr3_16(ipaddr), ip4_addr4_16(ipaddr),
  74790. ethaddr->addr[0], ethaddr->addr[1], ethaddr->addr[2],
  74791. ethaddr->addr[3], ethaddr->addr[4], ethaddr->addr[5]));
  74792. /* non-unicast address? */
  74793. if (ip_addr_isany(ipaddr) ||
  74794. 803710e: 9804 ldr r0, [sp, #16]
  74795. /* ARP message directed to us?
  74796. -> add IP address in ARP cache; assume requester wants to talk to us,
  74797. can result in directly sending the queued packets for this host.
  74798. ARP message not directed to us?
  74799. -> update the source IP address in the cache, if present */
  74800. etharp_update_arp_entry(netif, &sipaddr, &(hdr->shwaddr),
  74801. 8037110: f106 0716 add.w r7, r6, #22
  74802. 8037114: 2b00 cmp r3, #0
  74803. 8037116: bf0c ite eq
  74804. 8037118: f04f 0802 moveq.w r8, #2
  74805. 803711c: f04f 0801 movne.w r8, #1
  74806. case PP_HTONS(ETHTYPE_ARP):
  74807. if (!(netif->flags & NETIF_FLAG_ETHARP)) {
  74808. goto free_and_return;
  74809. }
  74810. /* pass p to ARP module */
  74811. etharp_arp_input(netif, (struct eth_addr*)(netif->hwaddr), p);
  74812. 8037120: f105 0927 add.w r9, r5, #39 ; 0x27
  74813. 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",
  74814. ip4_addr1_16(ipaddr), ip4_addr2_16(ipaddr), ip4_addr3_16(ipaddr), ip4_addr4_16(ipaddr),
  74815. ethaddr->addr[0], ethaddr->addr[1], ethaddr->addr[2],
  74816. ethaddr->addr[3], ethaddr->addr[4], ethaddr->addr[5]));
  74817. /* non-unicast address? */
  74818. if (ip_addr_isany(ipaddr) ||
  74819. 8037124: 2800 cmp r0, #0
  74820. 8037126: d03d beq.n 80371a4 <ethernet_input+0x180>
  74821. ip_addr_isbroadcast(ipaddr, netif) ||
  74822. 8037128: 4629 mov r1, r5
  74823. 803712a: f7fb fc47 bl 80329bc <ip4_addr_isbroadcast>
  74824. 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",
  74825. ip4_addr1_16(ipaddr), ip4_addr2_16(ipaddr), ip4_addr3_16(ipaddr), ip4_addr4_16(ipaddr),
  74826. ethaddr->addr[0], ethaddr->addr[1], ethaddr->addr[2],
  74827. ethaddr->addr[3], ethaddr->addr[4], ethaddr->addr[5]));
  74828. /* non-unicast address? */
  74829. if (ip_addr_isany(ipaddr) ||
  74830. 803712e: 9002 str r0, [sp, #8]
  74831. 8037130: 2800 cmp r0, #0
  74832. 8037132: d137 bne.n 80371a4 <ethernet_input+0x180>
  74833. ip_addr_isbroadcast(ipaddr, netif) ||
  74834. ip_addr_ismulticast(ipaddr)) {
  74835. 8037134: 9a04 ldr r2, [sp, #16]
  74836. 8037136: f002 02f0 and.w r2, r2, #240 ; 0xf0
  74837. ip4_addr1_16(ipaddr), ip4_addr2_16(ipaddr), ip4_addr3_16(ipaddr), ip4_addr4_16(ipaddr),
  74838. ethaddr->addr[0], ethaddr->addr[1], ethaddr->addr[2],
  74839. ethaddr->addr[3], ethaddr->addr[4], ethaddr->addr[5]));
  74840. /* non-unicast address? */
  74841. if (ip_addr_isany(ipaddr) ||
  74842. ip_addr_isbroadcast(ipaddr, netif) ||
  74843. 803713a: 2ae0 cmp r2, #224 ; 0xe0
  74844. 803713c: d032 beq.n 80371a4 <ethernet_input+0x180>
  74845. ip_addr_ismulticast(ipaddr)) {
  74846. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_update_arp_entry: will not add non-unicast IP address to ARP cache\n"));
  74847. return ERR_ARG;
  74848. }
  74849. /* find or create ARP entry */
  74850. i = etharp_find_entry(ipaddr, flags);
  74851. 803713e: a804 add r0, sp, #16
  74852. 8037140: 4641 mov r1, r8
  74853. 8037142: f7ff fd39 bl 8036bb8 <etharp_find_entry>
  74854. /* bail out if no entry could be found */
  74855. if (i < 0) {
  74856. 8037146: 2800 cmp r0, #0
  74857. 8037148: db2c blt.n 80371a4 <ethernet_input+0x180>
  74858. arp_table[i].state = ETHARP_STATE_STATIC;
  74859. } else
  74860. #endif /* ETHARP_SUPPORT_STATIC_ENTRIES */
  74861. {
  74862. /* mark it stable */
  74863. arp_table[i].state = ETHARP_STATE_STABLE;
  74864. 803714a: 4b36 ldr r3, [pc, #216] ; (8037224 <ethernet_input+0x200>)
  74865. 803714c: f04f 0814 mov.w r8, #20
  74866. 8037150: fb08 f800 mul.w r8, r8, r0
  74867. 8037154: eb03 0108 add.w r1, r3, r8
  74868. 8037158: 2202 movs r2, #2
  74869. 803715a: 748a strb r2, [r1, #18]
  74870. }
  74871. /* record network interface */
  74872. arp_table[i].netif = netif;
  74873. 803715c: 608d str r5, [r1, #8]
  74874. arp_table[i].state = ETHARP_STATE_STATIC;
  74875. } else
  74876. #endif /* ETHARP_SUPPORT_STATIC_ENTRIES */
  74877. {
  74878. /* mark it stable */
  74879. arp_table[i].state = ETHARP_STATE_STABLE;
  74880. 803715e: f101 0b10 add.w fp, r1, #16
  74881. }
  74882. /* record network interface */
  74883. arp_table[i].netif = netif;
  74884. /* insert in SNMP ARP index tree */
  74885. snmp_insert_arpidx_tree(netif, &arp_table[i].ipaddr);
  74886. 8037162: 4628 mov r0, r5
  74887. 8037164: 3104 adds r1, #4
  74888. 8037166: 9300 str r3, [sp, #0]
  74889. 8037168: f7fd f90a bl 8034380 <snmp_insert_arpidx_tree>
  74890. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_update_arp_entry: updating stable entry %"S16_F"\n", (s16_t)i));
  74891. /* update address */
  74892. ETHADDR32_COPY(&arp_table[i].ethaddr, ethaddr);
  74893. 803716c: 9b00 ldr r3, [sp, #0]
  74894. 803716e: eb03 0008 add.w r0, r3, r8
  74895. 8037172: 2206 movs r2, #6
  74896. 8037174: 300c adds r0, #12
  74897. 8037176: 4639 mov r1, r7
  74898. 8037178: f7ea fd94 bl 8021ca4 <memcpy>
  74899. /* reset time stamp */
  74900. arp_table[i].ctime = 0;
  74901. 803717c: 9a02 ldr r2, [sp, #8]
  74902. 803717e: f88b 2003 strb.w r2, [fp, #3]
  74903. /* get the packet pointer */
  74904. p = q->p;
  74905. /* now queue entry can be freed */
  74906. memp_free(MEMP_ARP_QUEUE, q);
  74907. #else /* ARP_QUEUEING */
  74908. if (arp_table[i].q != NULL) {
  74909. 8037182: 9b00 ldr r3, [sp, #0]
  74910. 8037184: f853 b008 ldr.w fp, [r3, r8]
  74911. 8037188: f1bb 0f00 cmp.w fp, #0
  74912. 803718c: d00a beq.n 80371a4 <ethernet_input+0x180>
  74913. struct pbuf *p = arp_table[i].q;
  74914. arp_table[i].q = NULL;
  74915. 803718e: f843 2008 str.w r2, [r3, r8]
  74916. #endif /* ARP_QUEUEING */
  74917. /* send the queued IP packet */
  74918. etharp_send_ip(netif, p, (struct eth_addr*)(netif->hwaddr), ethaddr);
  74919. 8037192: 4628 mov r0, r5
  74920. 8037194: 4659 mov r1, fp
  74921. 8037196: 464a mov r2, r9
  74922. 8037198: 463b mov r3, r7
  74923. 803719a: f7ff fcdb bl 8036b54 <etharp_send_ip>
  74924. /* free the queued IP packet */
  74925. pbuf_free(p);
  74926. 803719e: 4658 mov r0, fp
  74927. 80371a0: f7f8 fd72 bl 802fc88 <pbuf_free>
  74928. -> update the source IP address in the cache, if present */
  74929. etharp_update_arp_entry(netif, &sipaddr, &(hdr->shwaddr),
  74930. for_us ? ETHARP_FLAG_TRY_HARD : ETHARP_FLAG_FIND_ONLY);
  74931. /* now act on the message itself */
  74932. switch (hdr->opcode) {
  74933. 80371a4: 8ab3 ldrh r3, [r6, #20]
  74934. 80371a6: f5b3 7f80 cmp.w r3, #256 ; 0x100
  74935. 80371aa: d003 beq.n 80371b4 <ethernet_input+0x190>
  74936. 80371ac: f5b3 7f00 cmp.w r3, #512 ; 0x200
  74937. 80371b0: d12e bne.n 8037210 <ethernet_input+0x1ec>
  74938. 80371b2: e029 b.n 8037208 <ethernet_input+0x1e4>
  74939. * reply. In any case, we time-stamp any existing ARP entry,
  74940. * and possiby send out an IP packet that was queued on it. */
  74941. LWIP_DEBUGF (ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_arp_input: incoming ARP request\n"));
  74942. /* ARP request for our address? */
  74943. if (for_us) {
  74944. 80371b4: 9b01 ldr r3, [sp, #4]
  74945. 80371b6: b35b cbz r3, 8037210 <ethernet_input+0x1ec>
  74946. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_arp_input: replying to ARP request for our IP address\n"));
  74947. /* Re-use pbuf to send ARP reply.
  74948. Since we are re-using an existing pbuf, we can't call etharp_raw since
  74949. that would allocate a new pbuf. */
  74950. hdr->opcode = htons(ARP_REPLY);
  74951. 80371b8: 2002 movs r0, #2
  74952. 80371ba: f7f7 fc27 bl 802ea0c <lwip_htons>
  74953. 80371be: 82b0 strh r0, [r6, #20]
  74954. IPADDR2_COPY(&hdr->dipaddr, &hdr->sipaddr);
  74955. 80371c0: 4651 mov r1, sl
  74956. 80371c2: 2204 movs r2, #4
  74957. 80371c4: 9803 ldr r0, [sp, #12]
  74958. 80371c6: f7ea fd6d bl 8021ca4 <memcpy>
  74959. IPADDR2_COPY(&hdr->sipaddr, &netif->ip_addr);
  74960. 80371ca: 1d29 adds r1, r5, #4
  74961. 80371cc: 2204 movs r2, #4
  74962. 80371ce: 4650 mov r0, sl
  74963. 80371d0: f7ea fd68 bl 8021ca4 <memcpy>
  74964. * 'sender IP address' MUST be sent using link-layer broadcast instead of
  74965. * link-layer unicast. (See RFC3927 Section 2.5, last paragraph) */
  74966. ethdst_hwaddr = ip_addr_islinklocal(&netif->ip_addr) ? (u8_t*)(ethbroadcast.addr) : hdr->shwaddr.addr;
  74967. #endif /* LWIP_AUTOIP */
  74968. ETHADDR16_COPY(&hdr->dhwaddr, &hdr->shwaddr);
  74969. 80371d4: 4639 mov r1, r7
  74970. 80371d6: 2206 movs r2, #6
  74971. 80371d8: f106 0020 add.w r0, r6, #32
  74972. 80371dc: f7ea fd62 bl 8021ca4 <memcpy>
  74973. #if LWIP_AUTOIP
  74974. ETHADDR16_COPY(&ethhdr->dest, ethdst_hwaddr);
  74975. #else /* LWIP_AUTOIP */
  74976. ETHADDR16_COPY(&ethhdr->dest, &hdr->shwaddr);
  74977. 80371e0: 4639 mov r1, r7
  74978. 80371e2: 2206 movs r2, #6
  74979. 80371e4: 4630 mov r0, r6
  74980. 80371e6: f7ea fd5d bl 8021ca4 <memcpy>
  74981. #endif /* LWIP_AUTOIP */
  74982. ETHADDR16_COPY(&hdr->shwaddr, ethaddr);
  74983. 80371ea: 4649 mov r1, r9
  74984. 80371ec: 2206 movs r2, #6
  74985. 80371ee: 4638 mov r0, r7
  74986. 80371f0: f7ea fd58 bl 8021ca4 <memcpy>
  74987. ETHADDR16_COPY(&ethhdr->src, ethaddr);
  74988. 80371f4: 4649 mov r1, r9
  74989. 80371f6: 1db0 adds r0, r6, #6
  74990. 80371f8: 2206 movs r2, #6
  74991. 80371fa: f7ea fd53 bl 8021ca4 <memcpy>
  74992. /* hwtype, hwaddr_len, proto, protolen and the type in the ethernet header
  74993. are already correct, we tested that before */
  74994. /* return ARP reply */
  74995. netif->linkoutput(netif, p);
  74996. 80371fe: 69ab ldr r3, [r5, #24]
  74997. 8037200: 4628 mov r0, r5
  74998. 8037202: 4621 mov r1, r4
  74999. 8037204: 4798 blx r3
  75000. 8037206: e003 b.n 8037210 <ethernet_input+0x1ec>
  75001. #if (LWIP_DHCP && DHCP_DOES_ARP_CHECK)
  75002. /* DHCP wants to know about ARP replies from any host with an
  75003. * IP address also offered to us by the DHCP server. We do not
  75004. * want to take a duplicate IP address on a single network.
  75005. * @todo How should we handle redundant (fail-over) interfaces? */
  75006. dhcp_arp_reply(netif, &sipaddr);
  75007. 8037208: 4628 mov r0, r5
  75008. 803720a: a904 add r1, sp, #16
  75009. 803720c: f7f8 f8d4 bl 802f3b8 <dhcp_arp_reply>
  75010. /* This means the pbuf is freed or consumed,
  75011. so the caller doesn't have to free it again */
  75012. return ERR_OK;
  75013. free_and_return:
  75014. pbuf_free(p);
  75015. 8037210: 4620 mov r0, r4
  75016. 8037212: f7f8 fd39 bl 802fc88 <pbuf_free>
  75017. return ERR_OK;
  75018. }
  75019. 8037216: 2000 movs r0, #0
  75020. 8037218: b007 add sp, #28
  75021. 803721a: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  75022. 803721e: bf00 nop
  75023. 8037220: 08045073 .word 0x08045073
  75024. 8037224: 2000c754 .word 0x2000c754
  75025. 08037228 <arp_timer>:
  75026. return ERR_OK;
  75027. }
  75028. static void arp_timer(void *arg)
  75029. {
  75030. 8037228: b508 push {r3, lr}
  75031. etharp_tmr();
  75032. 803722a: f7ff fd37 bl 8036c9c <etharp_tmr>
  75033. sys_timeout(ARP_TMR_INTERVAL, arp_timer, NULL);
  75034. 803722e: 4904 ldr r1, [pc, #16] ; (8037240 <arp_timer+0x18>)
  75035. 8037230: f241 3088 movw r0, #5000 ; 0x1388
  75036. 8037234: 2200 movs r2, #0
  75037. }
  75038. 8037236: e8bd 4008 ldmia.w sp!, {r3, lr}
  75039. static void arp_timer(void *arg)
  75040. {
  75041. etharp_tmr();
  75042. sys_timeout(ARP_TMR_INTERVAL, arp_timer, NULL);
  75043. 803723a: f7fa bfab b.w 8032194 <sys_timeout>
  75044. 803723e: bf00 nop
  75045. 8037240: 08037229 .word 0x08037229
  75046. 08037244 <ethernetif_input>:
  75047. }
  75048. }
  75049. */
  75050. void ethernetif_input(void * pvParameters)
  75051. {
  75052. 8037244: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  75053. struct pbuf *p;
  75054. for( ;; )
  75055. {
  75056. if(xSemaphoreTake(s_xSemaphore, emacBLOCK_TIME_WAITING_FOR_INPUT)==pdTRUE)
  75057. 8037248: f8df 80c4 ldr.w r8, [pc, #196] ; 8037310 <ethernetif_input+0xcc>
  75058. }
  75059. }
  75060. */
  75061. void ethernetif_input(void * pvParameters)
  75062. {
  75063. 803724c: b085 sub sp, #20
  75064. struct pbuf *p;
  75065. for( ;; )
  75066. {
  75067. if(xSemaphoreTake(s_xSemaphore, emacBLOCK_TIME_WAITING_FOR_INPUT)==pdTRUE)
  75068. 803724e: 2100 movs r1, #0
  75069. 8037250: 2264 movs r2, #100 ; 0x64
  75070. 8037252: f8d8 0000 ldr.w r0, [r8]
  75071. 8037256: 460b mov r3, r1
  75072. 8037258: f7f4 f886 bl 802b368 <xQueueGenericReceive>
  75073. 803725c: 2801 cmp r0, #1
  75074. 803725e: d1f6 bne.n 803724e <ethernetif_input+0xa>
  75075. }
  75076. }
  75077. /* Release descriptors to DMA */
  75078. /* Check if received frame with multiple DMA buffer segments */
  75079. if (DMA_RX_FRAME_infos->Seg_Count > 1)
  75080. 8037260: f8df a0b0 ldr.w sl, [pc, #176] ; 8037314 <ethernetif_input+0xd0>
  75081. /* Clear Segment_Count */
  75082. DMA_RX_FRAME_infos->Seg_Count =0;
  75083. /* When Rx Buffer unavailable flag is set: clear it and resume reception */
  75084. if ((ETH->DMASR & ETH_DMASR_RBUS) != (u32)RESET)
  75085. 8037264: f8df 90b0 ldr.w r9, [pc, #176] ; 8037318 <ethernetif_input+0xd4>
  75086. __IO ETH_DMADESCTypeDef *DMARxNextDesc;
  75087. p = NULL;
  75088. /* Get received frame */
  75089. frame = ETH_Get_Received_Frame_interrupt();
  75090. 8037268: a801 add r0, sp, #4
  75091. 803726a: f001 fa25 bl 80386b8 <ETH_Get_Received_Frame_interrupt>
  75092. 803726e: 9e03 ldr r6, [sp, #12]
  75093. /* check that frame has no error */
  75094. if ((frame.descriptor->Status & ETH_DMARxDesc_ES) == (uint32_t)RESET)
  75095. 8037270: 6837 ldr r7, [r6, #0]
  75096. 8037272: f417 4700 ands.w r7, r7, #32768 ; 0x8000
  75097. 8037276: d001 beq.n 803727c <ethernetif_input+0x38>
  75098. uint32_t l=0,i =0;
  75099. FrameTypeDef frame;
  75100. u8 *buffer;
  75101. __IO ETH_DMADESCTypeDef *DMARxNextDesc;
  75102. p = NULL;
  75103. 8037278: 2400 movs r4, #0
  75104. 803727a: e016 b.n 80372aa <ethernetif_input+0x66>
  75105. /* Obtain the size of the packet and put it into the "len" variable. */
  75106. len = frame.length;
  75107. buffer = (u8 *)frame.buffer;
  75108. /* We allocate a pbuf chain of pbufs from the pool. */
  75109. p = pbuf_alloc(PBUF_RAW, len, PBUF_POOL);
  75110. 803727c: 2003 movs r0, #3
  75111. 803727e: f8bd 1004 ldrh.w r1, [sp, #4]
  75112. if ((frame.descriptor->Status & ETH_DMARxDesc_ES) == (uint32_t)RESET)
  75113. {
  75114. /* Obtain the size of the packet and put it into the "len" variable. */
  75115. len = frame.length;
  75116. buffer = (u8 *)frame.buffer;
  75117. 8037282: f8dd b008 ldr.w fp, [sp, #8]
  75118. /* We allocate a pbuf chain of pbufs from the pool. */
  75119. p = pbuf_alloc(PBUF_RAW, len, PBUF_POOL);
  75120. 8037286: 4602 mov r2, r0
  75121. 8037288: f7f8 fd4b bl 802fd22 <pbuf_alloc>
  75122. /* Copy received frame from ethernet driver buffer to stack buffer */
  75123. if (p != NULL)
  75124. 803728c: 4604 mov r4, r0
  75125. 803728e: 2800 cmp r0, #0
  75126. 8037290: d0f2 beq.n 8037278 <ethernetif_input+0x34>
  75127. 8037292: 4605 mov r5, r0
  75128. {
  75129. for (q = p; q != NULL; q = q->next)
  75130. {
  75131. memcpy((u8_t*)q->payload, (u8_t*)&buffer[l], q->len);
  75132. 8037294: 6868 ldr r0, [r5, #4]
  75133. 8037296: 896a ldrh r2, [r5, #10]
  75134. 8037298: eb0b 0107 add.w r1, fp, r7
  75135. 803729c: f7ea fd02 bl 8021ca4 <memcpy>
  75136. l = l + q->len;
  75137. 80372a0: 896b ldrh r3, [r5, #10]
  75138. p = pbuf_alloc(PBUF_RAW, len, PBUF_POOL);
  75139. /* Copy received frame from ethernet driver buffer to stack buffer */
  75140. if (p != NULL)
  75141. {
  75142. for (q = p; q != NULL; q = q->next)
  75143. 80372a2: 682d ldr r5, [r5, #0]
  75144. {
  75145. memcpy((u8_t*)q->payload, (u8_t*)&buffer[l], q->len);
  75146. l = l + q->len;
  75147. 80372a4: 18ff adds r7, r7, r3
  75148. p = pbuf_alloc(PBUF_RAW, len, PBUF_POOL);
  75149. /* Copy received frame from ethernet driver buffer to stack buffer */
  75150. if (p != NULL)
  75151. {
  75152. for (q = p; q != NULL; q = q->next)
  75153. 80372a6: 2d00 cmp r5, #0
  75154. 80372a8: d1f4 bne.n 8037294 <ethernetif_input+0x50>
  75155. }
  75156. }
  75157. /* Release descriptors to DMA */
  75158. /* Check if received frame with multiple DMA buffer segments */
  75159. if (DMA_RX_FRAME_infos->Seg_Count > 1)
  75160. 80372aa: f8da 3000 ldr.w r3, [sl]
  75161. 80372ae: 689a ldr r2, [r3, #8]
  75162. 80372b0: 2a01 cmp r2, #1
  75163. {
  75164. DMARxNextDesc = DMA_RX_FRAME_infos->FS_Rx_Desc;
  75165. 80372b2: bf88 it hi
  75166. 80372b4: 681e ldrhi r6, [r3, #0]
  75167. }
  75168. /* Set Own bit in Rx descriptors: gives the buffers back to DMA */
  75169. for (i=0; i<DMA_RX_FRAME_infos->Seg_Count; i++)
  75170. {
  75171. DMARxNextDesc->Status = ETH_DMARxDesc_OWN;
  75172. 80372b6: f04f 4000 mov.w r0, #2147483648 ; 0x80000000
  75173. uint32_t l=0,i =0;
  75174. FrameTypeDef frame;
  75175. u8 *buffer;
  75176. __IO ETH_DMADESCTypeDef *DMARxNextDesc;
  75177. p = NULL;
  75178. 80372ba: 2200 movs r2, #0
  75179. 80372bc: e002 b.n 80372c4 <ethernetif_input+0x80>
  75180. }
  75181. /* Set Own bit in Rx descriptors: gives the buffers back to DMA */
  75182. for (i=0; i<DMA_RX_FRAME_infos->Seg_Count; i++)
  75183. {
  75184. DMARxNextDesc->Status = ETH_DMARxDesc_OWN;
  75185. 80372be: 6030 str r0, [r6, #0]
  75186. DMARxNextDesc = (ETH_DMADESCTypeDef *)(DMARxNextDesc->Buffer2NextDescAddr);
  75187. 80372c0: 68f6 ldr r6, [r6, #12]
  75188. {
  75189. DMARxNextDesc = frame.descriptor;
  75190. }
  75191. /* Set Own bit in Rx descriptors: gives the buffers back to DMA */
  75192. for (i=0; i<DMA_RX_FRAME_infos->Seg_Count; i++)
  75193. 80372c2: 3201 adds r2, #1
  75194. 80372c4: 6899 ldr r1, [r3, #8]
  75195. 80372c6: 428a cmp r2, r1
  75196. 80372c8: d3f9 bcc.n 80372be <ethernetif_input+0x7a>
  75197. DMARxNextDesc->Status = ETH_DMARxDesc_OWN;
  75198. DMARxNextDesc = (ETH_DMADESCTypeDef *)(DMARxNextDesc->Buffer2NextDescAddr);
  75199. }
  75200. /* Clear Segment_Count */
  75201. DMA_RX_FRAME_infos->Seg_Count =0;
  75202. 80372ca: 2200 movs r2, #0
  75203. 80372cc: 609a str r2, [r3, #8]
  75204. /* When Rx Buffer unavailable flag is set: clear it and resume reception */
  75205. if ((ETH->DMASR & ETH_DMASR_RBUS) != (u32)RESET)
  75206. 80372ce: f8d9 3000 ldr.w r3, [r9]
  75207. 80372d2: 061b lsls r3, r3, #24
  75208. 80372d4: d504 bpl.n 80372e0 <ethernetif_input+0x9c>
  75209. {
  75210. /* Clear RBUS ETHERNET DMA flag */
  75211. ETH->DMASR = ETH_DMASR_RBUS;
  75212. 80372d6: 2380 movs r3, #128 ; 0x80
  75213. 80372d8: f8c9 3000 str.w r3, [r9]
  75214. /* Resume DMA reception */
  75215. ETH->DMARPDR = 0;
  75216. 80372dc: 4b0a ldr r3, [pc, #40] ; (8037308 <ethernetif_input+0xc4>)
  75217. 80372de: 601a str r2, [r3, #0]
  75218. {
  75219. if(xSemaphoreTake(s_xSemaphore, emacBLOCK_TIME_WAITING_FOR_INPUT)==pdTRUE)
  75220. {
  75221. GET_NEXT_FRAGMENT:
  75222. p = low_level_input( s_pxNetIf );
  75223. if (p != NULL)
  75224. 80372e0: 2c00 cmp r4, #0
  75225. 80372e2: d0b4 beq.n 803724e <ethernetif_input+0xa>
  75226. {
  75227. if (ERR_OK != s_pxNetIf->input( p, s_pxNetIf))
  75228. 80372e4: 4b09 ldr r3, [pc, #36] ; (803730c <ethernetif_input+0xc8>)
  75229. 80372e6: 6819 ldr r1, [r3, #0]
  75230. 80372e8: 4620 mov r0, r4
  75231. 80372ea: 690b ldr r3, [r1, #16]
  75232. 80372ec: 4798 blx r3
  75233. 80372ee: 4601 mov r1, r0
  75234. 80372f0: b118 cbz r0, 80372fa <ethernetif_input+0xb6>
  75235. {
  75236. pbuf_free(p);
  75237. 80372f2: 4620 mov r0, r4
  75238. 80372f4: f7f8 fcc8 bl 802fc88 <pbuf_free>
  75239. 80372f8: e7a9 b.n 803724e <ethernetif_input+0xa>
  75240. p=NULL;
  75241. }
  75242. else
  75243. {
  75244. xSemaphoreTake(s_xSemaphore, 0);
  75245. 80372fa: f8d8 0000 ldr.w r0, [r8]
  75246. 80372fe: 460a mov r2, r1
  75247. 8037300: 460b mov r3, r1
  75248. 8037302: f7f4 f831 bl 802b368 <xQueueGenericReceive>
  75249. goto GET_NEXT_FRAGMENT;
  75250. 8037306: e7af b.n 8037268 <ethernetif_input+0x24>
  75251. 8037308: 40029008 .word 0x40029008
  75252. 803730c: 2000c81c .word 0x2000c81c
  75253. 8037310: 2000c820 .word 0x2000c820
  75254. 8037314: 20012244 .word 0x20012244
  75255. 8037318: 40029014 .word 0x40029014
  75256. 0803731c <low_level_output>:
  75257. * to become availale since the stack doesn't retry to send a packet
  75258. * dropped because of memory failure (except for the TCP timers).
  75259. */
  75260. static err_t low_level_output(struct netif *netif, struct pbuf *p)
  75261. {
  75262. 803731c: b570 push {r4, r5, r6, lr}
  75263. static SemaphoreHandle_t xTxSemaphore = NULL;
  75264. struct pbuf *q;
  75265. uint32_t l = 0;
  75266. u8 *buffer ;
  75267. if (xTxSemaphore == NULL)
  75268. 803731e: 4e19 ldr r6, [pc, #100] ; (8037384 <low_level_output+0x68>)
  75269. 8037320: 6835 ldr r5, [r6, #0]
  75270. * to become availale since the stack doesn't retry to send a packet
  75271. * dropped because of memory failure (except for the TCP timers).
  75272. */
  75273. static err_t low_level_output(struct netif *netif, struct pbuf *p)
  75274. {
  75275. 8037322: 460c mov r4, r1
  75276. static SemaphoreHandle_t xTxSemaphore = NULL;
  75277. struct pbuf *q;
  75278. uint32_t l = 0;
  75279. u8 *buffer ;
  75280. if (xTxSemaphore == NULL)
  75281. 8037324: b95d cbnz r5, 803733e <low_level_output+0x22>
  75282. {
  75283. vSemaphoreCreateBinary (xTxSemaphore);
  75284. 8037326: 2001 movs r0, #1
  75285. 8037328: 4629 mov r1, r5
  75286. 803732a: 2203 movs r2, #3
  75287. 803732c: f7f3 fe9f bl 802b06e <xQueueGenericCreate>
  75288. 8037330: 6030 str r0, [r6, #0]
  75289. 8037332: b120 cbz r0, 803733e <low_level_output+0x22>
  75290. 8037334: 4629 mov r1, r5
  75291. 8037336: 462a mov r2, r5
  75292. 8037338: 462b mov r3, r5
  75293. 803733a: f7f3 fed5 bl 802b0e8 <xQueueGenericSend>
  75294. }
  75295. if (xSemaphoreTake(xTxSemaphore, netifGUARD_BLOCK_TIME))
  75296. 803733e: 4b11 ldr r3, [pc, #68] ; (8037384 <low_level_output+0x68>)
  75297. 8037340: 2100 movs r1, #0
  75298. 8037342: 6818 ldr r0, [r3, #0]
  75299. 8037344: 22fa movs r2, #250 ; 0xfa
  75300. 8037346: 460b mov r3, r1
  75301. 8037348: f7f4 f80e bl 802b368 <xQueueGenericReceive>
  75302. 803734c: b1c0 cbz r0, 8037380 <low_level_output+0x64>
  75303. {
  75304. buffer = (u8 *)(DMATxDescToSet->Buffer1Addr);
  75305. 803734e: 4b0e ldr r3, [pc, #56] ; (8037388 <low_level_output+0x6c>)
  75306. 8037350: 681b ldr r3, [r3, #0]
  75307. static err_t low_level_output(struct netif *netif, struct pbuf *p)
  75308. {
  75309. static SemaphoreHandle_t xTxSemaphore = NULL;
  75310. struct pbuf *q;
  75311. uint32_t l = 0;
  75312. 8037352: 2500 movs r5, #0
  75313. vSemaphoreCreateBinary (xTxSemaphore);
  75314. }
  75315. if (xSemaphoreTake(xTxSemaphore, netifGUARD_BLOCK_TIME))
  75316. {
  75317. buffer = (u8 *)(DMATxDescToSet->Buffer1Addr);
  75318. 8037354: 689e ldr r6, [r3, #8]
  75319. 8037356: e007 b.n 8037368 <low_level_output+0x4c>
  75320. for(q = p; q != NULL; q = q->next)
  75321. {
  75322. memcpy((u8_t*)&buffer[l], q->payload, q->len);
  75323. 8037358: 1970 adds r0, r6, r5
  75324. 803735a: 6861 ldr r1, [r4, #4]
  75325. 803735c: 8962 ldrh r2, [r4, #10]
  75326. 803735e: f7ea fca1 bl 8021ca4 <memcpy>
  75327. l = l + q->len;
  75328. 8037362: 8963 ldrh r3, [r4, #10]
  75329. }
  75330. if (xSemaphoreTake(xTxSemaphore, netifGUARD_BLOCK_TIME))
  75331. {
  75332. buffer = (u8 *)(DMATxDescToSet->Buffer1Addr);
  75333. for(q = p; q != NULL; q = q->next)
  75334. 8037364: 6824 ldr r4, [r4, #0]
  75335. {
  75336. memcpy((u8_t*)&buffer[l], q->payload, q->len);
  75337. l = l + q->len;
  75338. 8037366: 18ed adds r5, r5, r3
  75339. }
  75340. if (xSemaphoreTake(xTxSemaphore, netifGUARD_BLOCK_TIME))
  75341. {
  75342. buffer = (u8 *)(DMATxDescToSet->Buffer1Addr);
  75343. for(q = p; q != NULL; q = q->next)
  75344. 8037368: 2c00 cmp r4, #0
  75345. 803736a: d1f5 bne.n 8037358 <low_level_output+0x3c>
  75346. {
  75347. memcpy((u8_t*)&buffer[l], q->payload, q->len);
  75348. l = l + q->len;
  75349. }
  75350. ETH_Prepare_Transmit_Descriptors(l);
  75351. 803736c: b2a8 uxth r0, r5
  75352. 803736e: f001 f9f3 bl 8038758 <ETH_Prepare_Transmit_Descriptors>
  75353. xSemaphoreGive(xTxSemaphore);
  75354. 8037372: 4b04 ldr r3, [pc, #16] ; (8037384 <low_level_output+0x68>)
  75355. 8037374: 4621 mov r1, r4
  75356. 8037376: 6818 ldr r0, [r3, #0]
  75357. 8037378: 4622 mov r2, r4
  75358. 803737a: 4623 mov r3, r4
  75359. 803737c: f7f3 feb4 bl 802b0e8 <xQueueGenericSend>
  75360. }
  75361. return ERR_OK;
  75362. }
  75363. 8037380: 2000 movs r0, #0
  75364. 8037382: bd70 pop {r4, r5, r6, pc}
  75365. 8037384: 2000c824 .word 0x2000c824
  75366. 8037388: 200103d8 .word 0x200103d8
  75367. 0803738c <ethernetif_init>:
  75368. #if LWIP_NETIF_HOSTNAME
  75369. /* Initialize interface hostname */
  75370. netif->hostname = "lwip";
  75371. #endif /* LWIP_NETIF_HOSTNAME */
  75372. netif->name[0] = IFNAME0;
  75373. 803738c: 2373 movs r3, #115 ; 0x73
  75374. * @return ERR_OK if the loopif is initialized
  75375. * ERR_MEM if private data couldn't be allocated
  75376. * any other err_t on error
  75377. */
  75378. err_t ethernetif_init(struct netif *netif)
  75379. {
  75380. 803738e: b530 push {r4, r5, lr}
  75381. #if LWIP_NETIF_HOSTNAME
  75382. /* Initialize interface hostname */
  75383. netif->hostname = "lwip";
  75384. #endif /* LWIP_NETIF_HOSTNAME */
  75385. netif->name[0] = IFNAME0;
  75386. 8037390: f880 302e strb.w r3, [r0, #46] ; 0x2e
  75387. netif->name[1] = IFNAME1;
  75388. 8037394: 2374 movs r3, #116 ; 0x74
  75389. 8037396: f880 302f strb.w r3, [r0, #47] ; 0x2f
  75390. netif->output = etharp_output;
  75391. 803739a: 4b37 ldr r3, [pc, #220] ; (8037478 <ethernetif_init+0xec>)
  75392. netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP;
  75393. s_pxNetIf =netif;
  75394. /* create binary semaphore used for informing ethernetif of frame reception */
  75395. if (s_xSemaphore == NULL)
  75396. 803739c: 4d37 ldr r5, [pc, #220] ; (803747c <ethernetif_init+0xf0>)
  75397. #endif /* LWIP_NETIF_HOSTNAME */
  75398. netif->name[0] = IFNAME0;
  75399. netif->name[1] = IFNAME1;
  75400. netif->output = etharp_output;
  75401. 803739e: 6143 str r3, [r0, #20]
  75402. netif->linkoutput = low_level_output;
  75403. 80373a0: 4b37 ldr r3, [pc, #220] ; (8037480 <ethernetif_init+0xf4>)
  75404. * @return ERR_OK if the loopif is initialized
  75405. * ERR_MEM if private data couldn't be allocated
  75406. * any other err_t on error
  75407. */
  75408. err_t ethernetif_init(struct netif *netif)
  75409. {
  75410. 80373a2: b087 sub sp, #28
  75411. netif->name[0] = IFNAME0;
  75412. netif->name[1] = IFNAME1;
  75413. netif->output = etharp_output;
  75414. netif->linkoutput = low_level_output;
  75415. 80373a4: 6183 str r3, [r0, #24]
  75416. {
  75417. uint8_t mac[6];
  75418. uint32_t i;
  75419. /* set netif MAC hardware address length */
  75420. netif->hwaddr_len = ETHARP_HWADDR_LEN;
  75421. 80373a6: 2306 movs r3, #6
  75422. * @return ERR_OK if the loopif is initialized
  75423. * ERR_MEM if private data couldn't be allocated
  75424. * any other err_t on error
  75425. */
  75426. err_t ethernetif_init(struct netif *netif)
  75427. {
  75428. 80373a8: 4604 mov r4, r0
  75429. {
  75430. uint8_t mac[6];
  75431. uint32_t i;
  75432. /* set netif MAC hardware address length */
  75433. netif->hwaddr_len = ETHARP_HWADDR_LEN;
  75434. 80373aa: f880 3026 strb.w r3, [r0, #38] ; 0x26
  75435. /* set netif MAC hardware address */
  75436. SETTINGS_GetMac(mac);
  75437. 80373ae: a804 add r0, sp, #16
  75438. 80373b0: f7f1 fd58 bl 8028e64 <SETTINGS_GetMac>
  75439. netif->hwaddr[0] = mac[0];
  75440. 80373b4: f89d 3010 ldrb.w r3, [sp, #16]
  75441. netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP;
  75442. s_pxNetIf =netif;
  75443. /* create binary semaphore used for informing ethernetif of frame reception */
  75444. if (s_xSemaphore == NULL)
  75445. 80373b8: 6829 ldr r1, [r5, #0]
  75446. /* set netif MAC hardware address */
  75447. SETTINGS_GetMac(mac);
  75448. netif->hwaddr[0] = mac[0];
  75449. 80373ba: f884 3027 strb.w r3, [r4, #39] ; 0x27
  75450. netif->hwaddr[1] = mac[1];
  75451. 80373be: f89d 3011 ldrb.w r3, [sp, #17]
  75452. 80373c2: f884 3028 strb.w r3, [r4, #40] ; 0x28
  75453. netif->hwaddr[2] = mac[2];
  75454. 80373c6: f89d 3012 ldrb.w r3, [sp, #18]
  75455. 80373ca: f884 3029 strb.w r3, [r4, #41] ; 0x29
  75456. netif->hwaddr[3] = mac[3];
  75457. 80373ce: f89d 3013 ldrb.w r3, [sp, #19]
  75458. 80373d2: f884 302a strb.w r3, [r4, #42] ; 0x2a
  75459. netif->hwaddr[4] = mac[4];
  75460. 80373d6: f89d 3014 ldrb.w r3, [sp, #20]
  75461. 80373da: f884 302b strb.w r3, [r4, #43] ; 0x2b
  75462. netif->hwaddr[5] = mac[5];
  75463. 80373de: f89d 3015 ldrb.w r3, [sp, #21]
  75464. 80373e2: f884 302c strb.w r3, [r4, #44] ; 0x2c
  75465. /* set netif maximum transfer unit */
  75466. netif->mtu = 1500;
  75467. 80373e6: f240 53dc movw r3, #1500 ; 0x5dc
  75468. 80373ea: 84a3 strh r3, [r4, #36] ; 0x24
  75469. /* Accept broadcast address and ARP traffic */
  75470. netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP;
  75471. 80373ec: 2322 movs r3, #34 ; 0x22
  75472. 80373ee: f884 302d strb.w r3, [r4, #45] ; 0x2d
  75473. s_pxNetIf =netif;
  75474. 80373f2: 4b24 ldr r3, [pc, #144] ; (8037484 <ethernetif_init+0xf8>)
  75475. 80373f4: 601c str r4, [r3, #0]
  75476. /* create binary semaphore used for informing ethernetif of frame reception */
  75477. if (s_xSemaphore == NULL)
  75478. 80373f6: b919 cbnz r1, 8037400 <ethernetif_init+0x74>
  75479. {
  75480. s_xSemaphore= xSemaphoreCreateCounting(20,0);
  75481. 80373f8: 2014 movs r0, #20
  75482. 80373fa: f7f3 fe5f bl 802b0bc <xQueueCreateCountingSemaphore>
  75483. 80373fe: 6028 str r0, [r5, #0]
  75484. }
  75485. /* initialize MAC address in ethernet MAC */
  75486. ETH_MACAddressConfig(ETH_MAC_Address0, netif->hwaddr);
  75487. 8037400: f104 0127 add.w r1, r4, #39 ; 0x27
  75488. 8037404: 2000 movs r0, #0
  75489. 8037406: f001 f93f bl 8038688 <ETH_MACAddressConfig>
  75490. /* Initialize Tx Descriptors list: Chain Mode */
  75491. ETH_DMATxDescChainInit(DMATxDscrTab, &Tx_Buff[0][0], ETH_TXBUFNB);
  75492. 803740a: 481f ldr r0, [pc, #124] ; (8037488 <ethernetif_init+0xfc>)
  75493. 803740c: 491f ldr r1, [pc, #124] ; (803748c <ethernetif_init+0x100>)
  75494. /* Enable Ethernet Rx interrrupt */
  75495. {
  75496. for(i=0; i<ETH_RXBUFNB; i++)
  75497. {
  75498. ETH_DMARxDescReceiveITConfig(&DMARxDscrTab[i], ENABLE);
  75499. 803740e: 4d20 ldr r5, [pc, #128] ; (8037490 <ethernetif_init+0x104>)
  75500. /* initialize MAC address in ethernet MAC */
  75501. ETH_MACAddressConfig(ETH_MAC_Address0, netif->hwaddr);
  75502. /* Initialize Tx Descriptors list: Chain Mode */
  75503. ETH_DMATxDescChainInit(DMATxDscrTab, &Tx_Buff[0][0], ETH_TXBUFNB);
  75504. 8037410: 2205 movs r2, #5
  75505. 8037412: f001 fa27 bl 8038864 <ETH_DMATxDescChainInit>
  75506. /* Initialize Rx Descriptors list: Chain Mode */
  75507. ETH_DMARxDescChainInit(DMARxDscrTab, &Rx_Buff[0][0], ETH_RXBUFNB);
  75508. 8037416: 481e ldr r0, [pc, #120] ; (8037490 <ethernetif_init+0x104>)
  75509. 8037418: 491e ldr r1, [pc, #120] ; (8037494 <ethernetif_init+0x108>)
  75510. 803741a: 2205 movs r2, #5
  75511. 803741c: f001 f9f6 bl 803880c <ETH_DMARxDescChainInit>
  75512. /* Enable Ethernet Rx interrrupt */
  75513. {
  75514. for(i=0; i<ETH_RXBUFNB; i++)
  75515. 8037420: 2400 movs r4, #0
  75516. {
  75517. ETH_DMARxDescReceiveITConfig(&DMARxDscrTab[i], ENABLE);
  75518. 8037422: eb05 1044 add.w r0, r5, r4, lsl #5
  75519. 8037426: 2101 movs r1, #1
  75520. /* Initialize Rx Descriptors list: Chain Mode */
  75521. ETH_DMARxDescChainInit(DMARxDscrTab, &Rx_Buff[0][0], ETH_RXBUFNB);
  75522. /* Enable Ethernet Rx interrrupt */
  75523. {
  75524. for(i=0; i<ETH_RXBUFNB; i++)
  75525. 8037428: 3401 adds r4, #1
  75526. {
  75527. ETH_DMARxDescReceiveITConfig(&DMARxDscrTab[i], ENABLE);
  75528. 803742a: f001 fa41 bl 80388b0 <ETH_DMARxDescReceiveITConfig>
  75529. /* Initialize Rx Descriptors list: Chain Mode */
  75530. ETH_DMARxDescChainInit(DMARxDscrTab, &Rx_Buff[0][0], ETH_RXBUFNB);
  75531. /* Enable Ethernet Rx interrrupt */
  75532. {
  75533. for(i=0; i<ETH_RXBUFNB; i++)
  75534. 803742e: 2c05 cmp r4, #5
  75535. 8037430: d1f7 bne.n 8037422 <ethernetif_init+0x96>
  75536. #ifdef CHECKSUM_BY_HARDWARE
  75537. /* Enable the checksum insertion for the Tx frames */
  75538. {
  75539. for(i=0; i<ETH_TXBUFNB; i++)
  75540. {
  75541. ETH_DMATxDescChecksumInsertionConfig(&DMATxDscrTab[i], ETH_DMATxDesc_ChecksumTCPUDPICMPFull);
  75542. 8037432: 4d15 ldr r5, [pc, #84] ; (8037488 <ethernetif_init+0xfc>)
  75543. /* Initialize Rx Descriptors list: Chain Mode */
  75544. ETH_DMARxDescChainInit(DMARxDscrTab, &Rx_Buff[0][0], ETH_RXBUFNB);
  75545. /* Enable Ethernet Rx interrrupt */
  75546. {
  75547. for(i=0; i<ETH_RXBUFNB; i++)
  75548. 8037434: 2400 movs r4, #0
  75549. #ifdef CHECKSUM_BY_HARDWARE
  75550. /* Enable the checksum insertion for the Tx frames */
  75551. {
  75552. for(i=0; i<ETH_TXBUFNB; i++)
  75553. {
  75554. ETH_DMATxDescChecksumInsertionConfig(&DMATxDscrTab[i], ETH_DMATxDesc_ChecksumTCPUDPICMPFull);
  75555. 8037436: eb05 1044 add.w r0, r5, r4, lsl #5
  75556. 803743a: f44f 0140 mov.w r1, #12582912 ; 0xc00000
  75557. }
  75558. #ifdef CHECKSUM_BY_HARDWARE
  75559. /* Enable the checksum insertion for the Tx frames */
  75560. {
  75561. for(i=0; i<ETH_TXBUFNB; i++)
  75562. 803743e: 3401 adds r4, #1
  75563. {
  75564. ETH_DMATxDescChecksumInsertionConfig(&DMATxDscrTab[i], ETH_DMATxDesc_ChecksumTCPUDPICMPFull);
  75565. 8037440: f001 fa32 bl 80388a8 <ETH_DMATxDescChecksumInsertionConfig>
  75566. }
  75567. #ifdef CHECKSUM_BY_HARDWARE
  75568. /* Enable the checksum insertion for the Tx frames */
  75569. {
  75570. for(i=0; i<ETH_TXBUFNB; i++)
  75571. 8037444: 2c05 cmp r4, #5
  75572. 8037446: d1f6 bne.n 8037436 <ethernetif_init+0xaa>
  75573. }
  75574. }
  75575. #endif
  75576. /* create the task that handles the ETH_MAC */
  75577. xTaskCreate(ethernetif_input, "Eth_if", netifINTERFACE_TASK_STACK_SIZE, NULL,
  75578. 8037448: 2400 movs r4, #0
  75579. 803744a: 2304 movs r3, #4
  75580. 803744c: 2296 movs r2, #150 ; 0x96
  75581. 803744e: e88d 0018 stmia.w sp, {r3, r4}
  75582. 8037452: 4911 ldr r1, [pc, #68] ; (8037498 <ethernetif_init+0x10c>)
  75583. 8037454: 9402 str r4, [sp, #8]
  75584. 8037456: 4623 mov r3, r4
  75585. 8037458: 9403 str r4, [sp, #12]
  75586. 803745a: 4810 ldr r0, [pc, #64] ; (803749c <ethernetif_init+0x110>)
  75587. 803745c: f7f4 f88e bl 802b57c <xTaskGenericCreate>
  75588. netifINTERFACE_TASK_PRIORITY,NULL);
  75589. /* Enable MAC and DMA transmission and reception */
  75590. ETH_Start();
  75591. 8037460: f001 fa7c bl 803895c <ETH_Start>
  75592. /* initialize the hardware */
  75593. low_level_init(netif);
  75594. etharp_init();
  75595. sys_timeout(ARP_TMR_INTERVAL, arp_timer, NULL);
  75596. 8037464: f241 3088 movw r0, #5000 ; 0x1388
  75597. 8037468: 490d ldr r1, [pc, #52] ; (80374a0 <ethernetif_init+0x114>)
  75598. 803746a: 4622 mov r2, r4
  75599. 803746c: f7fa fe92 bl 8032194 <sys_timeout>
  75600. return ERR_OK;
  75601. }
  75602. 8037470: 4620 mov r0, r4
  75603. 8037472: b007 add sp, #28
  75604. 8037474: bd30 pop {r4, r5, pc}
  75605. 8037476: bf00 nop
  75606. 8037478: 08036f31 .word 0x08036f31
  75607. 803747c: 2000c820 .word 0x2000c820
  75608. 8037480: 0803731d .word 0x0803731d
  75609. 8037484: 2000c81c .word 0x2000c81c
  75610. 8037488: 200103dc .word 0x200103dc
  75611. 803748c: 200122e8 .word 0x200122e8
  75612. 8037490: 20012248 .word 0x20012248
  75613. 8037494: 2001047c .word 0x2001047c
  75614. 8037498: 0804507f .word 0x0804507f
  75615. 803749c: 08037245 .word 0x08037245
  75616. 80374a0: 08037229 .word 0x08037229
  75617. 080374a4 <sys_mbox_new>:
  75618. * int size -- Size of elements in the mailbox
  75619. * Outputs:
  75620. * sys_mbox_t -- Handle to new mailbox
  75621. *---------------------------------------------------------------------------*/
  75622. err_t sys_mbox_new( sys_mbox_t *pxMailBox, int iSize )
  75623. {
  75624. 80374a4: b510 push {r4, lr}
  75625. err_t xReturn = ERR_MEM;
  75626. *pxMailBox = xQueueCreate( iSize, sizeof( void * ) );
  75627. 80374a6: 2200 movs r2, #0
  75628. * int size -- Size of elements in the mailbox
  75629. * Outputs:
  75630. * sys_mbox_t -- Handle to new mailbox
  75631. *---------------------------------------------------------------------------*/
  75632. err_t sys_mbox_new( sys_mbox_t *pxMailBox, int iSize )
  75633. {
  75634. 80374a8: 4604 mov r4, r0
  75635. err_t xReturn = ERR_MEM;
  75636. *pxMailBox = xQueueCreate( iSize, sizeof( void * ) );
  75637. 80374aa: 4608 mov r0, r1
  75638. 80374ac: 2104 movs r1, #4
  75639. 80374ae: f7f3 fdde bl 802b06e <xQueueGenericCreate>
  75640. 80374b2: 6020 str r0, [r4, #0]
  75641. xReturn = ERR_OK;
  75642. SYS_STATS_INC_USED( mbox );
  75643. }
  75644. return xReturn;
  75645. }
  75646. 80374b4: 2800 cmp r0, #0
  75647. 80374b6: bf14 ite ne
  75648. 80374b8: 2000 movne r0, #0
  75649. 80374ba: f06f 0000 mvneq.w r0, #0
  75650. 80374be: bd10 pop {r4, pc}
  75651. 080374c0 <sys_mbox_trypost>:
  75652. * Outputs:
  75653. * err_t -- ERR_OK if message posted, else ERR_MEM
  75654. * if not.
  75655. *---------------------------------------------------------------------------*/
  75656. err_t sys_mbox_trypost( sys_mbox_t *pxMailBox, void *pxMessageToPost )
  75657. {
  75658. 80374c0: b51f push {r0, r1, r2, r3, r4, lr}
  75659. err_t xReturn;
  75660. portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
  75661. if( xInsideISR != pdFALSE )
  75662. 80374c2: 4a0b ldr r2, [pc, #44] ; (80374f0 <sys_mbox_trypost+0x30>)
  75663. * Outputs:
  75664. * err_t -- ERR_OK if message posted, else ERR_MEM
  75665. * if not.
  75666. *---------------------------------------------------------------------------*/
  75667. err_t sys_mbox_trypost( sys_mbox_t *pxMailBox, void *pxMessageToPost )
  75668. {
  75669. 80374c4: 9101 str r1, [sp, #4]
  75670. err_t xReturn;
  75671. portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
  75672. if( xInsideISR != pdFALSE )
  75673. 80374c6: 6812 ldr r2, [r2, #0]
  75674. {
  75675. xReturn = xQueueSendFromISR( *pxMailBox, &pxMessageToPost, &xHigherPriorityTaskWoken );
  75676. 80374c8: 6800 ldr r0, [r0, #0]
  75677. * if not.
  75678. *---------------------------------------------------------------------------*/
  75679. err_t sys_mbox_trypost( sys_mbox_t *pxMailBox, void *pxMessageToPost )
  75680. {
  75681. err_t xReturn;
  75682. portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
  75683. 80374ca: 2300 movs r3, #0
  75684. 80374cc: 9303 str r3, [sp, #12]
  75685. if( xInsideISR != pdFALSE )
  75686. {
  75687. xReturn = xQueueSendFromISR( *pxMailBox, &pxMessageToPost, &xHigherPriorityTaskWoken );
  75688. 80374ce: a901 add r1, sp, #4
  75689. err_t sys_mbox_trypost( sys_mbox_t *pxMailBox, void *pxMessageToPost )
  75690. {
  75691. err_t xReturn;
  75692. portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
  75693. if( xInsideISR != pdFALSE )
  75694. 80374d0: b11a cbz r2, 80374da <sys_mbox_trypost+0x1a>
  75695. {
  75696. xReturn = xQueueSendFromISR( *pxMailBox, &pxMessageToPost, &xHigherPriorityTaskWoken );
  75697. 80374d2: aa03 add r2, sp, #12
  75698. 80374d4: f7f3 fecc bl 802b270 <xQueueGenericSendFromISR>
  75699. 80374d8: e002 b.n 80374e0 <sys_mbox_trypost+0x20>
  75700. }
  75701. else
  75702. {
  75703. xReturn = xQueueSend( *pxMailBox, &pxMessageToPost, ( TickType_t ) 0 );
  75704. 80374da: 4613 mov r3, r2
  75705. 80374dc: f7f3 fe04 bl 802b0e8 <xQueueGenericSend>
  75706. 80374e0: b2c0 uxtb r0, r0
  75707. xReturn = ERR_MEM;
  75708. SYS_STATS_INC( mbox.err );
  75709. }
  75710. return xReturn;
  75711. }
  75712. 80374e2: 3801 subs r0, #1
  75713. 80374e4: bf18 it ne
  75714. 80374e6: f06f 0000 mvnne.w r0, #0
  75715. 80374ea: b005 add sp, #20
  75716. 80374ec: bd00 pop {pc}
  75717. 80374ee: bf00 nop
  75718. 80374f0: 2000c828 .word 0x2000c828
  75719. 080374f4 <sys_arch_mbox_fetch>:
  75720. * Outputs:
  75721. * u32_t -- SYS_ARCH_TIMEOUT if timeout, else number
  75722. * of milliseconds until received.
  75723. *---------------------------------------------------------------------------*/
  75724. u32_t sys_arch_mbox_fetch( sys_mbox_t *pxMailBox, void **ppvBuffer, u32_t ulTimeOut )
  75725. {
  75726. 80374f4: e92d 41f3 stmdb sp!, {r0, r1, r4, r5, r6, r7, r8, lr}
  75727. 80374f8: 4607 mov r7, r0
  75728. 80374fa: 460c mov r4, r1
  75729. 80374fc: 4690 mov r8, r2
  75730. void *pvDummy;
  75731. TickType_t xStartTime, xEndTime, xElapsed;
  75732. unsigned long ulReturn;
  75733. xStartTime = xTaskGetTickCount();
  75734. 80374fe: f7f4 f9a5 bl 802b84c <xTaskGetTickCount>
  75735. 8037502: 4605 mov r5, r0
  75736. if( NULL == ppvBuffer )
  75737. 8037504: b904 cbnz r4, 8037508 <sys_arch_mbox_fetch+0x14>
  75738. {
  75739. ppvBuffer = &pvDummy;
  75740. 8037506: ac01 add r4, sp, #4
  75741. }
  75742. if( ulTimeOut != 0UL )
  75743. 8037508: f1b8 0f00 cmp.w r8, #0
  75744. 803750c: d015 beq.n 803753a <sys_arch_mbox_fetch+0x46>
  75745. {
  75746. configASSERT( xInsideISR == ( portBASE_TYPE ) 0 );
  75747. 803750e: 4b13 ldr r3, [pc, #76] ; (803755c <sys_arch_mbox_fetch+0x68>)
  75748. 8037510: 681e ldr r6, [r3, #0]
  75749. 8037512: b116 cbz r6, 803751a <sys_arch_mbox_fetch+0x26>
  75750. 8037514: f7f4 fd38 bl 802bf88 <ulPortSetInterruptMask>
  75751. 8037518: e7fe b.n 8037518 <sys_arch_mbox_fetch+0x24>
  75752. if( pdTRUE == xQueueReceive( *pxMailBox, &( *ppvBuffer ), ulTimeOut/ portTICK_PERIOD_MS ) )
  75753. 803751a: 6838 ldr r0, [r7, #0]
  75754. 803751c: 4621 mov r1, r4
  75755. 803751e: 4642 mov r2, r8
  75756. 8037520: 4633 mov r3, r6
  75757. 8037522: f7f3 ff21 bl 802b368 <xQueueGenericReceive>
  75758. 8037526: 2801 cmp r0, #1
  75759. 8037528: d103 bne.n 8037532 <sys_arch_mbox_fetch+0x3e>
  75760. {
  75761. xEndTime = xTaskGetTickCount();
  75762. 803752a: f7f4 f98f bl 802b84c <xTaskGetTickCount>
  75763. xElapsed = ( xEndTime - xStartTime ) * portTICK_PERIOD_MS;
  75764. 803752e: 1b40 subs r0, r0, r5
  75765. 8037530: e011 b.n 8037556 <sys_arch_mbox_fetch+0x62>
  75766. ulReturn = xElapsed;
  75767. }
  75768. else
  75769. {
  75770. /* Timed out. */
  75771. *ppvBuffer = NULL;
  75772. 8037532: 6026 str r6, [r4, #0]
  75773. ulReturn = SYS_ARCH_TIMEOUT;
  75774. 8037534: f04f 30ff mov.w r0, #4294967295
  75775. 8037538: e00d b.n 8037556 <sys_arch_mbox_fetch+0x62>
  75776. }
  75777. }
  75778. else
  75779. {
  75780. while( pdTRUE != xQueueReceive( *pxMailBox, &( *ppvBuffer ), portMAX_DELAY ) );
  75781. 803753a: 2300 movs r3, #0
  75782. 803753c: 6838 ldr r0, [r7, #0]
  75783. 803753e: 4621 mov r1, r4
  75784. 8037540: f04f 32ff mov.w r2, #4294967295
  75785. 8037544: f7f3 ff10 bl 802b368 <xQueueGenericReceive>
  75786. 8037548: 2801 cmp r0, #1
  75787. 803754a: d1f6 bne.n 803753a <sys_arch_mbox_fetch+0x46>
  75788. xEndTime = xTaskGetTickCount();
  75789. 803754c: f7f4 f97e bl 802b84c <xTaskGetTickCount>
  75790. xElapsed = ( xEndTime - xStartTime ) * portTICK_PERIOD_MS;
  75791. if( xElapsed == 0UL )
  75792. 8037550: 1b40 subs r0, r0, r5
  75793. 8037552: bf08 it eq
  75794. 8037554: 2001 moveq r0, #1
  75795. ulReturn = xElapsed;
  75796. }
  75797. return ulReturn;
  75798. }
  75799. 8037556: e8bd 81fc ldmia.w sp!, {r2, r3, r4, r5, r6, r7, r8, pc}
  75800. 803755a: bf00 nop
  75801. 803755c: 2000c828 .word 0x2000c828
  75802. 08037560 <sys_mutex_new>:
  75803. /** Create a new mutex
  75804. * @param mutex pointer to the mutex to create
  75805. * @return a new mutex */
  75806. err_t sys_mutex_new( sys_mutex_t *pxMutex )
  75807. {
  75808. 8037560: b510 push {r4, lr}
  75809. 8037562: 4604 mov r4, r0
  75810. err_t xReturn = ERR_MEM;
  75811. *pxMutex = xSemaphoreCreateMutex();
  75812. 8037564: 2001 movs r0, #1
  75813. 8037566: f7f3 fe59 bl 802b21c <xQueueCreateMutex>
  75814. 803756a: 6020 str r0, [r4, #0]
  75815. {
  75816. SYS_STATS_INC( mutex.err );
  75817. }
  75818. return xReturn;
  75819. }
  75820. 803756c: 2800 cmp r0, #0
  75821. 803756e: bf14 ite ne
  75822. 8037570: 2000 movne r0, #0
  75823. 8037572: f06f 0000 mvneq.w r0, #0
  75824. 8037576: bd10 pop {r4, pc}
  75825. 08037578 <sys_mutex_lock>:
  75826. /** Lock a mutex
  75827. * @param mutex the mutex to lock */
  75828. void sys_mutex_lock( sys_mutex_t *pxMutex )
  75829. {
  75830. 8037578: b510 push {r4, lr}
  75831. 803757a: 4604 mov r4, r0
  75832. while( xSemaphoreTake( *pxMutex, portMAX_DELAY ) != pdPASS );
  75833. 803757c: 2100 movs r1, #0
  75834. 803757e: 6820 ldr r0, [r4, #0]
  75835. 8037580: f04f 32ff mov.w r2, #4294967295
  75836. 8037584: 460b mov r3, r1
  75837. 8037586: f7f3 feef bl 802b368 <xQueueGenericReceive>
  75838. 803758a: 2801 cmp r0, #1
  75839. 803758c: d1f6 bne.n 803757c <sys_mutex_lock+0x4>
  75840. }
  75841. 803758e: bd10 pop {r4, pc}
  75842. 08037590 <sys_mutex_unlock>:
  75843. /** Unlock a mutex
  75844. * @param mutex the mutex to unlock */
  75845. void sys_mutex_unlock(sys_mutex_t *pxMutex )
  75846. {
  75847. xSemaphoreGive( *pxMutex );
  75848. 8037590: 2100 movs r1, #0
  75849. 8037592: 6800 ldr r0, [r0, #0]
  75850. 8037594: 460a mov r2, r1
  75851. 8037596: 460b mov r3, r1
  75852. 8037598: f7f3 bda6 b.w 802b0e8 <xQueueGenericSend>
  75853. 0803759c <sys_init>:
  75854. *---------------------------------------------------------------------------*
  75855. * Description:
  75856. * Initialize sys arch
  75857. *---------------------------------------------------------------------------*/
  75858. void sys_init(void)
  75859. {
  75860. 803759c: 4770 bx lr
  75861. 0803759e <sys_now>:
  75862. }
  75863. u32_t sys_now(void)
  75864. {
  75865. return xTaskGetTickCount();
  75866. 803759e: f7f4 b955 b.w 802b84c <xTaskGetTickCount>
  75867. 080375a2 <sys_thread_new>:
  75868. * int prio -- Thread priority
  75869. * Outputs:
  75870. * sys_thread_t -- Pointer to per-thread timeouts.
  75871. *---------------------------------------------------------------------------*/
  75872. sys_thread_t sys_thread_new( const char *pcName, void( *pxThread )( void *pvParameters ), void *pvArg, int iStackSize, int iPriority )
  75873. {
  75874. 80375a2: b570 push {r4, r5, r6, lr}
  75875. 80375a4: b086 sub sp, #24
  75876. 80375a6: 4606 mov r6, r0
  75877. TaskHandle_t xCreatedTask;
  75878. portBASE_TYPE xResult;
  75879. sys_thread_t xReturn;
  75880. xResult = xTaskCreate( pxThread, pcName, iStackSize, pvArg, iPriority, &xCreatedTask );
  75881. 80375a8: 9c0a ldr r4, [sp, #40] ; 0x28
  75882. * int prio -- Thread priority
  75883. * Outputs:
  75884. * sys_thread_t -- Pointer to per-thread timeouts.
  75885. *---------------------------------------------------------------------------*/
  75886. sys_thread_t sys_thread_new( const char *pcName, void( *pxThread )( void *pvParameters ), void *pvArg, int iStackSize, int iPriority )
  75887. {
  75888. 80375aa: 4615 mov r5, r2
  75889. TaskHandle_t xCreatedTask;
  75890. portBASE_TYPE xResult;
  75891. sys_thread_t xReturn;
  75892. xResult = xTaskCreate( pxThread, pcName, iStackSize, pvArg, iPriority, &xCreatedTask );
  75893. 80375ac: 9400 str r4, [sp, #0]
  75894. 80375ae: aa05 add r2, sp, #20
  75895. 80375b0: 2400 movs r4, #0
  75896. 80375b2: 9201 str r2, [sp, #4]
  75897. 80375b4: 9402 str r4, [sp, #8]
  75898. 80375b6: b29a uxth r2, r3
  75899. 80375b8: 9403 str r4, [sp, #12]
  75900. 80375ba: 4608 mov r0, r1
  75901. 80375bc: 462b mov r3, r5
  75902. 80375be: 4631 mov r1, r6
  75903. 80375c0: f7f3 ffdc bl 802b57c <xTaskGenericCreate>
  75904. if( xResult == pdPASS )
  75905. 80375c4: 2801 cmp r0, #1
  75906. {
  75907. xReturn = xCreatedTask;
  75908. 80375c6: bf0c ite eq
  75909. 80375c8: 9805 ldreq r0, [sp, #20]
  75910. }
  75911. else
  75912. {
  75913. xReturn = NULL;
  75914. 80375ca: 4620 movne r0, r4
  75915. }
  75916. return xReturn;
  75917. }
  75918. 80375cc: b006 add sp, #24
  75919. 80375ce: bd70 pop {r4, r5, r6, pc}
  75920. 080375d0 <sys_arch_protect>:
  75921. * operating system.
  75922. * Outputs:
  75923. * sys_prot_t -- Previous protection level (not used here)
  75924. *---------------------------------------------------------------------------*/
  75925. sys_prot_t sys_arch_protect( void )
  75926. {
  75927. 80375d0: b508 push {r3, lr}
  75928. if( xInsideISR == pdFALSE )
  75929. 80375d2: 4b03 ldr r3, [pc, #12] ; (80375e0 <sys_arch_protect+0x10>)
  75930. 80375d4: 681b ldr r3, [r3, #0]
  75931. 80375d6: b90b cbnz r3, 80375dc <sys_arch_protect+0xc>
  75932. {
  75933. taskENTER_CRITICAL();
  75934. 80375d8: f7f4 fcde bl 802bf98 <vPortEnterCritical>
  75935. }
  75936. return ( sys_prot_t ) 1;
  75937. }
  75938. 80375dc: 2001 movs r0, #1
  75939. 80375de: bd08 pop {r3, pc}
  75940. 80375e0: 2000c828 .word 0x2000c828
  75941. 080375e4 <sys_arch_unprotect>:
  75942. * sys_prot_t -- Previous protection level (not used here)
  75943. *---------------------------------------------------------------------------*/
  75944. void sys_arch_unprotect( sys_prot_t xValue )
  75945. {
  75946. (void) xValue;
  75947. if( xInsideISR == pdFALSE )
  75948. 80375e4: 4b02 ldr r3, [pc, #8] ; (80375f0 <sys_arch_unprotect+0xc>)
  75949. 80375e6: 681b ldr r3, [r3, #0]
  75950. 80375e8: b90b cbnz r3, 80375ee <sys_arch_unprotect+0xa>
  75951. {
  75952. taskEXIT_CRITICAL();
  75953. 80375ea: f7f4 bd01 b.w 802bff0 <vPortExitCritical>
  75954. 80375ee: 4770 bx lr
  75955. 80375f0: 2000c828 .word 0x2000c828
  75956. 080375f4 <vTaskWebReinit>:
  75957. * Если флаг не устанавливается в положенное время, то сбрасывается
  75958. * флаг sSettings.sFlags.netsettingsChanged, сохраняется вся структура
  75959. * настроек в памяти и контроллер перезагружается.
  75960. */
  75961. void vTaskWebReinit(void * pvParameters)
  75962. {
  75963. 80375f4: b538 push {r3, r4, r5, lr}
  75964. static uint16_t timeCounter = 0;
  75965. for (;;)
  75966. {
  75967. /* Контроль времени работы задачи */
  75968. if (timeCounter++ > TIME_COUNTER_10_MIN)
  75969. 80375f6: 4c1b ldr r4, [pc, #108] ; (8037664 <vTaskWebReinit+0x70>)
  75970. if (fConfirmWebParams)
  75971. {
  75972. fConfirmWebParams = false;
  75973. /* Сохраняем временные сетевые настройки в постоянные */
  75974. sSettings.sWebParams.dhcpEnable = sSettings.sWebTempParams.dhcpEnable;
  75975. 80375f8: 4d1b ldr r5, [pc, #108] ; (8037668 <vTaskWebReinit+0x74>)
  75976. static uint16_t timeCounter = 0;
  75977. for (;;)
  75978. {
  75979. /* Контроль времени работы задачи */
  75980. if (timeCounter++ > TIME_COUNTER_10_MIN)
  75981. 80375fa: 8823 ldrh r3, [r4, #0]
  75982. 80375fc: 1c5a adds r2, r3, #1
  75983. 80375fe: f5b3 7f16 cmp.w r3, #600 ; 0x258
  75984. 8037602: 8022 strh r2, [r4, #0]
  75985. 8037604: d90a bls.n 803761c <vTaskWebReinit+0x28>
  75986. {
  75987. SetWebReinitFlag(false);
  75988. 8037606: 2000 movs r0, #0
  75989. 8037608: f7f0 ffda bl 80285c0 <SetWebReinitFlag>
  75990. HTTP_SaveSettings();
  75991. 803760c: f7f7 f92c bl 802e868 <HTTP_SaveSettings>
  75992. vTaskDelay(1010);
  75993. 8037610: f240 30f2 movw r0, #1010 ; 0x3f2
  75994. 8037614: f7f4 fa4c bl 802bab0 <vTaskDelay>
  75995. Reboot();
  75996. 8037618: f7f2 f92a bl 8029870 <Reboot>
  75997. }
  75998. if (fConfirmWebParams)
  75999. 803761c: 4b13 ldr r3, [pc, #76] ; (803766c <vTaskWebReinit+0x78>)
  76000. 803761e: 781a ldrb r2, [r3, #0]
  76001. 8037620: b1d2 cbz r2, 8037658 <vTaskWebReinit+0x64>
  76002. {
  76003. fConfirmWebParams = false;
  76004. 8037622: 2200 movs r2, #0
  76005. /* Сохраняем временные сетевые настройки в постоянные */
  76006. sSettings.sWebParams.dhcpEnable = sSettings.sWebTempParams.dhcpEnable;
  76007. strcpy(sSettings.sWebParams.ip, sSettings.sWebTempParams.ip);
  76008. 8037624: 4812 ldr r0, [pc, #72] ; (8037670 <vTaskWebReinit+0x7c>)
  76009. Reboot();
  76010. }
  76011. if (fConfirmWebParams)
  76012. {
  76013. fConfirmWebParams = false;
  76014. 8037626: 701a strb r2, [r3, #0]
  76015. /* Сохраняем временные сетевые настройки в постоянные */
  76016. sSettings.sWebParams.dhcpEnable = sSettings.sWebTempParams.dhcpEnable;
  76017. 8037628: f895 3063 ldrb.w r3, [r5, #99] ; 0x63
  76018. strcpy(sSettings.sWebParams.ip, sSettings.sWebTempParams.ip);
  76019. 803762c: f100 0131 add.w r1, r0, #49 ; 0x31
  76020. if (fConfirmWebParams)
  76021. {
  76022. fConfirmWebParams = false;
  76023. /* Сохраняем временные сетевые настройки в постоянные */
  76024. sSettings.sWebParams.dhcpEnable = sSettings.sWebTempParams.dhcpEnable;
  76025. 8037630: f885 3032 strb.w r3, [r5, #50] ; 0x32
  76026. strcpy(sSettings.sWebParams.ip, sSettings.sWebTempParams.ip);
  76027. 8037634: f7ea fd6a bl 802210c <strcpy>
  76028. strcpy(sSettings.sWebParams.gate, sSettings.sWebTempParams.gate);
  76029. 8037638: 480e ldr r0, [pc, #56] ; (8037674 <vTaskWebReinit+0x80>)
  76030. 803763a: f100 0131 add.w r1, r0, #49 ; 0x31
  76031. 803763e: f7ea fd65 bl 802210c <strcpy>
  76032. strcpy(sSettings.sWebParams.mask, sSettings.sWebTempParams.mask);
  76033. 8037642: 480d ldr r0, [pc, #52] ; (8037678 <vTaskWebReinit+0x84>)
  76034. 8037644: f100 0131 add.w r1, r0, #49 ; 0x31
  76035. 8037648: f7ea fd60 bl 802210c <strcpy>
  76036. HTTP_SaveSettings();
  76037. 803764c: f7f7 f90c bl 802e868 <HTTP_SaveSettings>
  76038. vTaskDelete(xHandleWebReinit);
  76039. 8037650: 4b0a ldr r3, [pc, #40] ; (803767c <vTaskWebReinit+0x88>)
  76040. 8037652: 6818 ldr r0, [r3, #0]
  76041. 8037654: f7f4 f86a bl 802b72c <vTaskDelete>
  76042. }
  76043. vTaskDelay(1000);
  76044. 8037658: f44f 707a mov.w r0, #1000 ; 0x3e8
  76045. 803765c: f7f4 fa28 bl 802bab0 <vTaskDelay>
  76046. }
  76047. 8037660: e7cb b.n 80375fa <vTaskWebReinit+0x6>
  76048. 8037662: bf00 nop
  76049. 8037664: 2000c838 .word 0x2000c838
  76050. 8037668: 2000d414 .word 0x2000d414
  76051. 803766c: 20000b2c .word 0x20000b2c
  76052. 8037670: 2000d416 .word 0x2000d416
  76053. 8037674: 2000d426 .word 0x2000d426
  76054. 8037678: 2000d436 .word 0x2000d436
  76055. 803767c: 2000c830 .word 0x2000c830
  76056. 08037680 <LwIP_DHCP_task>:
  76057. * @brief LwIP_DHCP_Process_Handle
  76058. * @param None
  76059. * @retval None
  76060. */
  76061. void LwIP_DHCP_task(void * pvParameters)
  76062. {
  76063. 8037680: b530 push {r4, r5, lr}
  76064. DHCP_state = DHCP_TIMEOUT;
  76065. /* Stop DHCP */
  76066. dhcp_stop(&xnetif);
  76067. if (sSettings.sFlags.netsettingsChanged == true)
  76068. 8037682: 4d48 ldr r5, [pc, #288] ; (80377a4 <LwIP_DHCP_task+0x124>)
  76069. * @brief LwIP_DHCP_Process_Handle
  76070. * @param None
  76071. * @retval None
  76072. */
  76073. void LwIP_DHCP_task(void * pvParameters)
  76074. {
  76075. 8037684: b085 sub sp, #20
  76076. struct ip_addr ipaddr;
  76077. struct ip_addr netmask;
  76078. struct ip_addr gw;
  76079. uint8_t DHCP_state;
  76080. DHCP_state = DHCP_START;
  76081. 8037686: 2400 movs r4, #0
  76082. for (;;)
  76083. {
  76084. switch (DHCP_state)
  76085. 8037688: b11c cbz r4, 8037692 <LwIP_DHCP_task+0x12>
  76086. 803768a: 2c01 cmp r4, #1
  76087. 803768c: f040 8085 bne.w 803779a <LwIP_DHCP_task+0x11a>
  76088. 8037690: e004 b.n 803769c <LwIP_DHCP_task+0x1c>
  76089. {
  76090. case DHCP_START:
  76091. {
  76092. dhcp_start(&xnetif);
  76093. 8037692: 4845 ldr r0, [pc, #276] ; (80377a8 <LwIP_DHCP_task+0x128>)
  76094. 8037694: f7f7 fffc bl 802f690 <dhcp_start>
  76095. DHCP_state = DHCP_WAIT_ADDRESS;
  76096. 8037698: 2401 movs r4, #1
  76097. //PRINT_USART("\n\rLooking for DHCP server please wait...\n\r");
  76098. }
  76099. break;
  76100. 803769a: e07e b.n 803779a <LwIP_DHCP_task+0x11a>
  76101. case DHCP_WAIT_ADDRESS:
  76102. {
  76103. /* Read the new IP address */
  76104. ipaddr = xnetif.ip_addr;
  76105. 803769c: 4842 ldr r0, [pc, #264] ; (80377a8 <LwIP_DHCP_task+0x128>)
  76106. netmask = xnetif.netmask;
  76107. 803769e: 6882 ldr r2, [r0, #8]
  76108. break;
  76109. case DHCP_WAIT_ADDRESS:
  76110. {
  76111. /* Read the new IP address */
  76112. ipaddr = xnetif.ip_addr;
  76113. 80376a0: 6843 ldr r3, [r0, #4]
  76114. netmask = xnetif.netmask;
  76115. 80376a2: 9202 str r2, [sp, #8]
  76116. gw = xnetif.gw;
  76117. 80376a4: 68c2 ldr r2, [r0, #12]
  76118. break;
  76119. case DHCP_WAIT_ADDRESS:
  76120. {
  76121. /* Read the new IP address */
  76122. ipaddr = xnetif.ip_addr;
  76123. 80376a6: 9301 str r3, [sp, #4]
  76124. netmask = xnetif.netmask;
  76125. gw = xnetif.gw;
  76126. 80376a8: 9203 str r2, [sp, #12]
  76127. if (ipaddr.addr != 0)
  76128. 80376aa: 2b00 cmp r3, #0
  76129. 80376ac: d045 beq.n 803773a <LwIP_DHCP_task+0xba>
  76130. {
  76131. DHCP_state = DHCP_ADDRESS_ASSIGNED;
  76132. dhcp_stop(&xnetif);
  76133. 80376ae: f7f7 ffd7 bl 802f660 <dhcp_stop>
  76134. /* Сохранение полученных сетевый параметров */
  76135. /* Если настройки изменили, то сохраняем во временные настройки */
  76136. if (sSettings.sFlags.netsettingsChanged == true)
  76137. 80376b2: f895 3120 ldrb.w r3, [r5, #288] ; 0x120
  76138. {
  76139. sprintf(sSettings.sWebTempParams.ip, "%s", ipaddr_ntoa(&ipaddr));
  76140. 80376b6: a801 add r0, sp, #4
  76141. DHCP_state = DHCP_ADDRESS_ASSIGNED;
  76142. dhcp_stop(&xnetif);
  76143. /* Сохранение полученных сетевый параметров */
  76144. /* Если настройки изменили, то сохраняем во временные настройки */
  76145. if (sSettings.sFlags.netsettingsChanged == true)
  76146. 80376b8: b103 cbz r3, 80376bc <LwIP_DHCP_task+0x3c>
  76147. 80376ba: e01b b.n 80376f4 <LwIP_DHCP_task+0x74>
  76148. sprintf(sSettings.sWebTempParams.mask, "%s", ipaddr_ntoa(&netmask));
  76149. sprintf(sSettings.sWebTempParams.gate, "%s", ipaddr_ntoa(&gw));
  76150. }
  76151. else
  76152. {
  76153. sprintf(sSettings.sWebParams.ip, "%s", ipaddr_ntoa(&ipaddr));
  76154. 80376bc: f7fb fa68 bl 8032b90 <ipaddr_ntoa>
  76155. 80376c0: 493a ldr r1, [pc, #232] ; (80377ac <LwIP_DHCP_task+0x12c>)
  76156. 80376c2: 4602 mov r2, r0
  76157. 80376c4: 483a ldr r0, [pc, #232] ; (80377b0 <LwIP_DHCP_task+0x130>)
  76158. 80376c6: f7f0 fb0f bl 8027ce8 <tfp_sprintf>
  76159. sprintf(sSettings.sWebParams.mask, "%s", ipaddr_ntoa(&netmask));
  76160. 80376ca: a802 add r0, sp, #8
  76161. 80376cc: f7fb fa60 bl 8032b90 <ipaddr_ntoa>
  76162. 80376d0: 4936 ldr r1, [pc, #216] ; (80377ac <LwIP_DHCP_task+0x12c>)
  76163. 80376d2: 4602 mov r2, r0
  76164. 80376d4: 4837 ldr r0, [pc, #220] ; (80377b4 <LwIP_DHCP_task+0x134>)
  76165. 80376d6: f7f0 fb07 bl 8027ce8 <tfp_sprintf>
  76166. sprintf(sSettings.sWebParams.gate, "%s", ipaddr_ntoa(&gw));
  76167. 80376da: a803 add r0, sp, #12
  76168. 80376dc: f7fb fa58 bl 8032b90 <ipaddr_ntoa>
  76169. 80376e0: 4932 ldr r1, [pc, #200] ; (80377ac <LwIP_DHCP_task+0x12c>)
  76170. 80376e2: 4602 mov r2, r0
  76171. 80376e4: 4834 ldr r0, [pc, #208] ; (80377b8 <LwIP_DHCP_task+0x138>)
  76172. 80376e6: f7f0 faff bl 8027ce8 <tfp_sprintf>
  76173. /* Обновляем временные настройки */
  76174. sSettings.sWebTempParams.dhcpEnable = sSettings.sWebParams.dhcpEnable;
  76175. 80376ea: f895 3032 ldrb.w r3, [r5, #50] ; 0x32
  76176. sprintf(sSettings.sWebTempParams.ip, "%s", ipaddr_ntoa(&ipaddr));
  76177. 80376ee: a801 add r0, sp, #4
  76178. sprintf(sSettings.sWebParams.ip, "%s", ipaddr_ntoa(&ipaddr));
  76179. sprintf(sSettings.sWebParams.mask, "%s", ipaddr_ntoa(&netmask));
  76180. sprintf(sSettings.sWebParams.gate, "%s", ipaddr_ntoa(&gw));
  76181. /* Обновляем временные настройки */
  76182. sSettings.sWebTempParams.dhcpEnable = sSettings.sWebParams.dhcpEnable;
  76183. 80376f0: f885 3063 strb.w r3, [r5, #99] ; 0x63
  76184. sprintf(sSettings.sWebTempParams.ip, "%s", ipaddr_ntoa(&ipaddr));
  76185. 80376f4: f7fb fa4c bl 8032b90 <ipaddr_ntoa>
  76186. 80376f8: 492c ldr r1, [pc, #176] ; (80377ac <LwIP_DHCP_task+0x12c>)
  76187. 80376fa: 4602 mov r2, r0
  76188. 80376fc: 482f ldr r0, [pc, #188] ; (80377bc <LwIP_DHCP_task+0x13c>)
  76189. 80376fe: f7f0 faf3 bl 8027ce8 <tfp_sprintf>
  76190. sprintf(sSettings.sWebTempParams.mask, "%s", ipaddr_ntoa(&netmask));
  76191. 8037702: a802 add r0, sp, #8
  76192. 8037704: f7fb fa44 bl 8032b90 <ipaddr_ntoa>
  76193. 8037708: 4928 ldr r1, [pc, #160] ; (80377ac <LwIP_DHCP_task+0x12c>)
  76194. 803770a: 4602 mov r2, r0
  76195. 803770c: 482c ldr r0, [pc, #176] ; (80377c0 <LwIP_DHCP_task+0x140>)
  76196. 803770e: f7f0 faeb bl 8027ce8 <tfp_sprintf>
  76197. sprintf(sSettings.sWebTempParams.gate, "%s", ipaddr_ntoa(&gw));
  76198. 8037712: a803 add r0, sp, #12
  76199. 8037714: f7fb fa3c bl 8032b90 <ipaddr_ntoa>
  76200. 8037718: 4924 ldr r1, [pc, #144] ; (80377ac <LwIP_DHCP_task+0x12c>)
  76201. 803771a: 4602 mov r2, r0
  76202. 803771c: 4829 ldr r0, [pc, #164] ; (80377c4 <LwIP_DHCP_task+0x144>)
  76203. 803771e: f7f0 fae3 bl 8027ce8 <tfp_sprintf>
  76204. PRINT_USART("Gateway: ");
  76205. PRINT_USART(ipaddr_ntoa(&gw));
  76206. PRINT_USART("\n\r");
  76207. vTaskDelay(50);
  76208. 8037722: 2032 movs r0, #50 ; 0x32
  76209. 8037724: f7f4 f9c4 bl 802bab0 <vTaskDelay>
  76210. /* Установлен динамический IP, можно отправить трап о перезагрузке устройства */
  76211. SNMP_SendUserTrap(DEVICE_REBOOTED);
  76212. 8037728: 2004 movs r0, #4
  76213. 803772a: f000 fad9 bl 8037ce0 <SNMP_SendUserTrap>
  76214. vTaskDelete(xHandleDHCP);
  76215. 803772e: 4b26 ldr r3, [pc, #152] ; (80377c8 <LwIP_DHCP_task+0x148>)
  76216. 8037730: 6818 ldr r0, [r3, #0]
  76217. 8037732: f7f3 fffb bl 802b72c <vTaskDelete>
  76218. netmask = xnetif.netmask;
  76219. gw = xnetif.gw;
  76220. if (ipaddr.addr != 0)
  76221. {
  76222. DHCP_state = DHCP_ADDRESS_ASSIGNED;
  76223. 8037736: 2402 movs r4, #2
  76224. 8037738: e02f b.n 803779a <LwIP_DHCP_task+0x11a>
  76225. vTaskDelete(xHandleDHCP);
  76226. }
  76227. else
  76228. {
  76229. /* DHCP timeout */
  76230. if (xnetif.dhcp->tries > MAX_DHCP_TRIES)
  76231. 803773a: 6a03 ldr r3, [r0, #32]
  76232. 803773c: 7b5b ldrb r3, [r3, #13]
  76233. 803773e: 2b03 cmp r3, #3
  76234. 8037740: d92b bls.n 803779a <LwIP_DHCP_task+0x11a>
  76235. {
  76236. DHCP_state = DHCP_TIMEOUT;
  76237. /* Stop DHCP */
  76238. dhcp_stop(&xnetif);
  76239. 8037742: f7f7 ff8d bl 802f660 <dhcp_stop>
  76240. if (sSettings.sFlags.netsettingsChanged == true)
  76241. 8037746: f895 3120 ldrb.w r3, [r5, #288] ; 0x120
  76242. 803774a: b14b cbz r3, 8037760 <LwIP_DHCP_task+0xe0>
  76243. {
  76244. ipaddr.addr = ipaddr_addr(sSettings.sWebTempParams.ip);
  76245. 803774c: 481b ldr r0, [pc, #108] ; (80377bc <LwIP_DHCP_task+0x13c>)
  76246. 803774e: f7fb f9cc bl 8032aea <ipaddr_addr>
  76247. 8037752: 9001 str r0, [sp, #4]
  76248. netmask.addr = ipaddr_addr(sSettings.sWebTempParams.mask);
  76249. 8037754: 481a ldr r0, [pc, #104] ; (80377c0 <LwIP_DHCP_task+0x140>)
  76250. 8037756: f7fb f9c8 bl 8032aea <ipaddr_addr>
  76251. 803775a: 9002 str r0, [sp, #8]
  76252. gw.addr = ipaddr_addr(sSettings.sWebTempParams.gate);
  76253. 803775c: 4819 ldr r0, [pc, #100] ; (80377c4 <LwIP_DHCP_task+0x144>)
  76254. 803775e: e008 b.n 8037772 <LwIP_DHCP_task+0xf2>
  76255. }
  76256. else
  76257. {
  76258. ipaddr.addr = ipaddr_addr(sSettings.sWebParams.ip);
  76259. 8037760: 4813 ldr r0, [pc, #76] ; (80377b0 <LwIP_DHCP_task+0x130>)
  76260. 8037762: f7fb f9c2 bl 8032aea <ipaddr_addr>
  76261. 8037766: 9001 str r0, [sp, #4]
  76262. netmask.addr = ipaddr_addr(sSettings.sWebParams.mask);
  76263. 8037768: 4812 ldr r0, [pc, #72] ; (80377b4 <LwIP_DHCP_task+0x134>)
  76264. 803776a: f7fb f9be bl 8032aea <ipaddr_addr>
  76265. 803776e: 9002 str r0, [sp, #8]
  76266. gw.addr = ipaddr_addr(sSettings.sWebParams.gate);
  76267. 8037770: 4811 ldr r0, [pc, #68] ; (80377b8 <LwIP_DHCP_task+0x138>)
  76268. 8037772: f7fb f9ba bl 8032aea <ipaddr_addr>
  76269. }
  76270. /* Static address used */
  76271. netif_set_addr(&xnetif, &ipaddr , &netmask, &gw);
  76272. 8037776: a901 add r1, sp, #4
  76273. 8037778: aa02 add r2, sp, #8
  76274. 803777a: ab03 add r3, sp, #12
  76275. }
  76276. else
  76277. {
  76278. ipaddr.addr = ipaddr_addr(sSettings.sWebParams.ip);
  76279. netmask.addr = ipaddr_addr(sSettings.sWebParams.mask);
  76280. gw.addr = ipaddr_addr(sSettings.sWebParams.gate);
  76281. 803777c: 9003 str r0, [sp, #12]
  76282. }
  76283. /* Static address used */
  76284. netif_set_addr(&xnetif, &ipaddr , &netmask, &gw);
  76285. 803777e: 480a ldr r0, [pc, #40] ; (80377a8 <LwIP_DHCP_task+0x128>)
  76286. 8037780: f7f8 f9de bl 802fb40 <netif_set_addr>
  76287. PRINT_USART("DHCP timeout\n\r");
  76288. PRINT_USART("\n\rStatic IP address\n\r");
  76289. PRINT_USART(ipaddr_ntoa(&ipaddr));
  76290. PRINT_USART("\n\r");
  76291. vTaskDelay(50);
  76292. 8037784: 2032 movs r0, #50 ; 0x32
  76293. 8037786: f7f4 f993 bl 802bab0 <vTaskDelay>
  76294. /* Установлен статический IP, можно отправить трап о перезагрузке устройства */
  76295. SNMP_SendUserTrap(DEVICE_REBOOTED);
  76296. 803778a: 2004 movs r0, #4
  76297. 803778c: f000 faa8 bl 8037ce0 <SNMP_SendUserTrap>
  76298. vTaskDelete(xHandleDHCP);
  76299. 8037790: 4b0d ldr r3, [pc, #52] ; (80377c8 <LwIP_DHCP_task+0x148>)
  76300. 8037792: 6818 ldr r0, [r3, #0]
  76301. 8037794: f7f3 ffca bl 802b72c <vTaskDelete>
  76302. else
  76303. {
  76304. /* DHCP timeout */
  76305. if (xnetif.dhcp->tries > MAX_DHCP_TRIES)
  76306. {
  76307. DHCP_state = DHCP_TIMEOUT;
  76308. 8037798: 2403 movs r4, #3
  76309. break;
  76310. default: break;
  76311. }
  76312. vTaskDelay(250);
  76313. 803779a: 20fa movs r0, #250 ; 0xfa
  76314. 803779c: f7f4 f988 bl 802bab0 <vTaskDelay>
  76315. }
  76316. 80377a0: e772 b.n 8037688 <LwIP_DHCP_task+0x8>
  76317. 80377a2: bf00 nop
  76318. 80377a4: 2000d414 .word 0x2000d414
  76319. 80377a8: 200100d0 .word 0x200100d0
  76320. 80377ac: 080402f4 .word 0x080402f4
  76321. 80377b0: 2000d416 .word 0x2000d416
  76322. 80377b4: 2000d436 .word 0x2000d436
  76323. 80377b8: 2000d426 .word 0x2000d426
  76324. 80377bc: 2000d447 .word 0x2000d447
  76325. 80377c0: 2000d467 .word 0x2000d467
  76326. 80377c4: 2000d457 .word 0x2000d457
  76327. 80377c8: 2000c834 .word 0x2000c834
  76328. 080377cc <LwIP_Init>:
  76329. TaskHandle_t xHandleWebReinit = NULL;
  76330. bool dhcp = false;
  76331. void LwIP_Init(void)
  76332. {
  76333. 80377cc: b530 push {r4, r5, lr}
  76334. struct ip_addr ipaddr;
  76335. struct ip_addr netmask;
  76336. struct ip_addr gw;
  76337. char str[20];
  76338. tcpip_init( NULL, NULL );
  76339. 80377ce: 2000 movs r0, #0
  76340. /* Если настройки изменили, то используем временные параметры */
  76341. if (sSettings.sFlags.netsettingsChanged == true)
  76342. 80377d0: 4c50 ldr r4, [pc, #320] ; (8037914 <LwIP_Init+0x148>)
  76343. TaskHandle_t xHandleWebReinit = NULL;
  76344. bool dhcp = false;
  76345. void LwIP_Init(void)
  76346. {
  76347. 80377d2: b08d sub sp, #52 ; 0x34
  76348. struct ip_addr ipaddr;
  76349. struct ip_addr netmask;
  76350. struct ip_addr gw;
  76351. char str[20];
  76352. tcpip_init( NULL, NULL );
  76353. 80377d4: 4601 mov r1, r0
  76354. 80377d6: f7f7 f8f7 bl 802e9c8 <tcpip_init>
  76355. /* Если настройки изменили, то используем временные параметры */
  76356. if (sSettings.sFlags.netsettingsChanged == true)
  76357. 80377da: f894 3120 ldrb.w r3, [r4, #288] ; 0x120
  76358. 80377de: 2b00 cmp r3, #0
  76359. 80377e0: d032 beq.n 8037848 <LwIP_Init+0x7c>
  76360. {
  76361. if (sSettings.sWebTempParams.dhcpEnable)
  76362. 80377e2: f894 5063 ldrb.w r5, [r4, #99] ; 0x63
  76363. 80377e6: b12d cbz r5, 80377f4 <LwIP_Init+0x28>
  76364. {
  76365. ipaddr.addr = 0;
  76366. 80377e8: 2300 movs r3, #0
  76367. 80377ea: 9304 str r3, [sp, #16]
  76368. netmask.addr = 0;
  76369. 80377ec: 9305 str r3, [sp, #20]
  76370. gw.addr = 0;
  76371. 80377ee: 9306 str r3, [sp, #24]
  76372. netif_add(&xnetif, &ipaddr, &netmask, &gw, NULL, &ethernetif_init, &tcpip_input);
  76373. 80377f0: 9300 str r3, [sp, #0]
  76374. 80377f2: e015 b.n 8037820 <LwIP_Init+0x54>
  76375. netif_set_default(&xnetif);
  76376. netif_set_up(&xnetif);
  76377. }
  76378. else
  76379. {
  76380. ipaddr.addr = ipaddr_addr(sSettings.sWebTempParams.ip);
  76381. 80377f4: f104 0033 add.w r0, r4, #51 ; 0x33
  76382. 80377f8: f7fb f977 bl 8032aea <ipaddr_addr>
  76383. 80377fc: 9004 str r0, [sp, #16]
  76384. netmask.addr = ipaddr_addr(sSettings.sWebTempParams.mask);
  76385. 80377fe: f104 0053 add.w r0, r4, #83 ; 0x53
  76386. 8037802: f7fb f972 bl 8032aea <ipaddr_addr>
  76387. 8037806: 9005 str r0, [sp, #20]
  76388. gw.addr = ipaddr_addr(sSettings.sWebTempParams.gate);
  76389. 8037808: f104 0043 add.w r0, r4, #67 ; 0x43
  76390. 803780c: f7fb f96d bl 8032aea <ipaddr_addr>
  76391. sprintf(str, " %s\n\r", sSettings.sWebTempParams.ip);
  76392. 8037810: 4941 ldr r1, [pc, #260] ; (8037918 <LwIP_Init+0x14c>)
  76393. }
  76394. else
  76395. {
  76396. ipaddr.addr = ipaddr_addr(sSettings.sWebTempParams.ip);
  76397. netmask.addr = ipaddr_addr(sSettings.sWebTempParams.mask);
  76398. gw.addr = ipaddr_addr(sSettings.sWebTempParams.gate);
  76399. 8037812: 9006 str r0, [sp, #24]
  76400. sprintf(str, " %s\n\r", sSettings.sWebTempParams.ip);
  76401. 8037814: f104 0233 add.w r2, r4, #51 ; 0x33
  76402. 8037818: a807 add r0, sp, #28
  76403. 803781a: f7f0 fa65 bl 8027ce8 <tfp_sprintf>
  76404. PRINT_USART("\n\rStatic IP address \n\r");
  76405. PRINT_USART(str);
  76406. netif_add(&xnetif, &ipaddr, &netmask, &gw, NULL, &ethernetif_init, &tcpip_input);
  76407. 803781e: 9500 str r5, [sp, #0]
  76408. 8037820: 4b3e ldr r3, [pc, #248] ; (803791c <LwIP_Init+0x150>)
  76409. 8037822: 483f ldr r0, [pc, #252] ; (8037920 <LwIP_Init+0x154>)
  76410. 8037824: 9301 str r3, [sp, #4]
  76411. 8037826: 4b3f ldr r3, [pc, #252] ; (8037924 <LwIP_Init+0x158>)
  76412. 8037828: a904 add r1, sp, #16
  76413. 803782a: aa05 add r2, sp, #20
  76414. 803782c: 9302 str r3, [sp, #8]
  76415. 803782e: ab06 add r3, sp, #24
  76416. 8037830: f7f8 f994 bl 802fb5c <netif_add>
  76417. netif_set_default(&xnetif);
  76418. 8037834: 483a ldr r0, [pc, #232] ; (8037920 <LwIP_Init+0x154>)
  76419. 8037836: f7f8 f9b9 bl 802fbac <netif_set_default>
  76420. netif_set_up(&xnetif);
  76421. 803783a: 4839 ldr r0, [pc, #228] ; (8037920 <LwIP_Init+0x154>)
  76422. 803783c: f7f8 f9c6 bl 802fbcc <netif_set_up>
  76423. }
  76424. if (sSettings.sWebTempParams.dhcpEnable) {
  76425. 8037840: 4b34 ldr r3, [pc, #208] ; (8037914 <LwIP_Init+0x148>)
  76426. 8037842: f893 3063 ldrb.w r3, [r3, #99] ; 0x63
  76427. 8037846: e043 b.n 80378d0 <LwIP_Init+0x104>
  76428. }
  76429. }
  76430. /* Настройки не менялись, используем обычне настройки из флеш памяти */
  76431. else
  76432. {
  76433. if (sSettings.sWebParams.dhcpEnable)
  76434. 8037848: f894 5032 ldrb.w r5, [r4, #50] ; 0x32
  76435. 803784c: b125 cbz r5, 8037858 <LwIP_Init+0x8c>
  76436. {
  76437. ipaddr.addr = 0;
  76438. 803784e: 9304 str r3, [sp, #16]
  76439. netmask.addr = 0;
  76440. 8037850: 9305 str r3, [sp, #20]
  76441. gw.addr = 0;
  76442. 8037852: 9306 str r3, [sp, #24]
  76443. netif_add(&xnetif, &ipaddr, &netmask, &gw, NULL, &ethernetif_init, &tcpip_input);
  76444. 8037854: 9300 str r3, [sp, #0]
  76445. 8037856: e028 b.n 80378aa <LwIP_Init+0xde>
  76446. netif_set_default(&xnetif);
  76447. netif_set_up(&xnetif);
  76448. }
  76449. else
  76450. {
  76451. ipaddr.addr = ipaddr_addr(sSettings.sWebParams.ip);
  76452. 8037858: 1ca0 adds r0, r4, #2
  76453. 803785a: f7fb f946 bl 8032aea <ipaddr_addr>
  76454. 803785e: 9004 str r0, [sp, #16]
  76455. netmask.addr = ipaddr_addr(sSettings.sWebParams.mask);
  76456. 8037860: f104 0022 add.w r0, r4, #34 ; 0x22
  76457. 8037864: f7fb f941 bl 8032aea <ipaddr_addr>
  76458. 8037868: 9005 str r0, [sp, #20]
  76459. gw.addr = ipaddr_addr(sSettings.sWebParams.gate);
  76460. 803786a: f104 0012 add.w r0, r4, #18
  76461. 803786e: f7fb f93c bl 8032aea <ipaddr_addr>
  76462. /* Обновляем временные настройки */
  76463. sSettings.sWebTempParams.dhcpEnable = sSettings.sWebParams.dhcpEnable;
  76464. 8037872: f894 3032 ldrb.w r3, [r4, #50] ; 0x32
  76465. }
  76466. else
  76467. {
  76468. ipaddr.addr = ipaddr_addr(sSettings.sWebParams.ip);
  76469. netmask.addr = ipaddr_addr(sSettings.sWebParams.mask);
  76470. gw.addr = ipaddr_addr(sSettings.sWebParams.gate);
  76471. 8037876: 9006 str r0, [sp, #24]
  76472. /* Обновляем временные настройки */
  76473. sSettings.sWebTempParams.dhcpEnable = sSettings.sWebParams.dhcpEnable;
  76474. strcpy(sSettings.sWebTempParams.ip, sSettings.sWebParams.ip);
  76475. 8037878: 1ca1 adds r1, r4, #2
  76476. 803787a: f104 0033 add.w r0, r4, #51 ; 0x33
  76477. ipaddr.addr = ipaddr_addr(sSettings.sWebParams.ip);
  76478. netmask.addr = ipaddr_addr(sSettings.sWebParams.mask);
  76479. gw.addr = ipaddr_addr(sSettings.sWebParams.gate);
  76480. /* Обновляем временные настройки */
  76481. sSettings.sWebTempParams.dhcpEnable = sSettings.sWebParams.dhcpEnable;
  76482. 803787e: f884 3063 strb.w r3, [r4, #99] ; 0x63
  76483. strcpy(sSettings.sWebTempParams.ip, sSettings.sWebParams.ip);
  76484. 8037882: f7ea fc43 bl 802210c <strcpy>
  76485. strcpy(sSettings.sWebTempParams.mask, sSettings.sWebParams.mask);
  76486. 8037886: f104 0122 add.w r1, r4, #34 ; 0x22
  76487. 803788a: f104 0053 add.w r0, r4, #83 ; 0x53
  76488. 803788e: f7ea fc3d bl 802210c <strcpy>
  76489. strcpy(sSettings.sWebTempParams.gate, sSettings.sWebParams.gate);
  76490. 8037892: f104 0112 add.w r1, r4, #18
  76491. 8037896: f104 0043 add.w r0, r4, #67 ; 0x43
  76492. 803789a: f7ea fc37 bl 802210c <strcpy>
  76493. sprintf(str, " %s\n\r", sSettings.sWebParams.ip);
  76494. 803789e: a807 add r0, sp, #28
  76495. 80378a0: 491d ldr r1, [pc, #116] ; (8037918 <LwIP_Init+0x14c>)
  76496. 80378a2: 1ca2 adds r2, r4, #2
  76497. 80378a4: f7f0 fa20 bl 8027ce8 <tfp_sprintf>
  76498. PRINT_USART("\n\rStatic IP address \n\r");
  76499. PRINT_USART(str);
  76500. netif_add(&xnetif, &ipaddr, &netmask, &gw, NULL, &ethernetif_init, &tcpip_input);
  76501. 80378a8: 9500 str r5, [sp, #0]
  76502. 80378aa: 4b1c ldr r3, [pc, #112] ; (803791c <LwIP_Init+0x150>)
  76503. 80378ac: 481c ldr r0, [pc, #112] ; (8037920 <LwIP_Init+0x154>)
  76504. 80378ae: 9301 str r3, [sp, #4]
  76505. 80378b0: 4b1c ldr r3, [pc, #112] ; (8037924 <LwIP_Init+0x158>)
  76506. 80378b2: a904 add r1, sp, #16
  76507. 80378b4: aa05 add r2, sp, #20
  76508. 80378b6: 9302 str r3, [sp, #8]
  76509. 80378b8: ab06 add r3, sp, #24
  76510. 80378ba: f7f8 f94f bl 802fb5c <netif_add>
  76511. netif_set_default(&xnetif);
  76512. 80378be: 4818 ldr r0, [pc, #96] ; (8037920 <LwIP_Init+0x154>)
  76513. 80378c0: f7f8 f974 bl 802fbac <netif_set_default>
  76514. netif_set_up(&xnetif);
  76515. 80378c4: 4816 ldr r0, [pc, #88] ; (8037920 <LwIP_Init+0x154>)
  76516. 80378c6: f7f8 f981 bl 802fbcc <netif_set_up>
  76517. }
  76518. if (sSettings.sWebParams.dhcpEnable) {
  76519. 80378ca: 4b12 ldr r3, [pc, #72] ; (8037914 <LwIP_Init+0x148>)
  76520. 80378cc: f893 3032 ldrb.w r3, [r3, #50] ; 0x32
  76521. 80378d0: b17b cbz r3, 80378f2 <LwIP_Init+0x126>
  76522. xTaskCreate(LwIP_DHCP_task, "DHCPClient", configMINIMAL_STACK_SIZE * 2, NULL,
  76523. 80378d2: 2302 movs r3, #2
  76524. 80378d4: 9300 str r3, [sp, #0]
  76525. 80378d6: 4b14 ldr r3, [pc, #80] ; (8037928 <LwIP_Init+0x15c>)
  76526. 80378d8: 4814 ldr r0, [pc, #80] ; (803792c <LwIP_Init+0x160>)
  76527. 80378da: 9301 str r3, [sp, #4]
  76528. 80378dc: 2300 movs r3, #0
  76529. 80378de: 9302 str r3, [sp, #8]
  76530. 80378e0: 9303 str r3, [sp, #12]
  76531. 80378e2: f44f 7280 mov.w r2, #256 ; 0x100
  76532. 80378e6: 4912 ldr r1, [pc, #72] ; (8037930 <LwIP_Init+0x164>)
  76533. 80378e8: f7f3 fe48 bl 802b57c <xTaskGenericCreate>
  76534. tskIDLE_PRIORITY + 2, &xHandleDHCP);
  76535. dhcp = true;
  76536. 80378ec: 4b11 ldr r3, [pc, #68] ; (8037934 <LwIP_Init+0x168>)
  76537. 80378ee: 2201 movs r2, #1
  76538. 80378f0: 701a strb r2, [r3, #0]
  76539. }
  76540. }
  76541. /* Если настройки изменились, запускаем задачу по отсчету времени реакции пользователя*/
  76542. if (sSettings.sFlags.netsettingsChanged == true)
  76543. 80378f2: 4b08 ldr r3, [pc, #32] ; (8037914 <LwIP_Init+0x148>)
  76544. 80378f4: f893 3120 ldrb.w r3, [r3, #288] ; 0x120
  76545. 80378f8: b153 cbz r3, 8037910 <LwIP_Init+0x144>
  76546. xTaskCreate(vTaskWebReinit, "webReinit", configMINIMAL_STACK_SIZE, NULL,
  76547. 80378fa: 4a0f ldr r2, [pc, #60] ; (8037938 <LwIP_Init+0x16c>)
  76548. 80378fc: 480f ldr r0, [pc, #60] ; (803793c <LwIP_Init+0x170>)
  76549. 80378fe: 9201 str r2, [sp, #4]
  76550. 8037900: 2300 movs r3, #0
  76551. 8037902: 9300 str r3, [sp, #0]
  76552. 8037904: 9302 str r3, [sp, #8]
  76553. 8037906: 9303 str r3, [sp, #12]
  76554. 8037908: 490d ldr r1, [pc, #52] ; (8037940 <LwIP_Init+0x174>)
  76555. 803790a: 2280 movs r2, #128 ; 0x80
  76556. 803790c: f7f3 fe36 bl 802b57c <xTaskGenericCreate>
  76557. tskIDLE_PRIORITY, &xHandleWebReinit);
  76558. }
  76559. 8037910: b00d add sp, #52 ; 0x34
  76560. 8037912: bd30 pop {r4, r5, pc}
  76561. 8037914: 2000d414 .word 0x2000d414
  76562. 8037918: 08045086 .word 0x08045086
  76563. 803791c: 0803738d .word 0x0803738d
  76564. 8037920: 200100d0 .word 0x200100d0
  76565. 8037924: 0802e989 .word 0x0802e989
  76566. 8037928: 2000c834 .word 0x2000c834
  76567. 803792c: 08037681 .word 0x08037681
  76568. 8037930: 0804508c .word 0x0804508c
  76569. 8037934: 2000c82c .word 0x2000c82c
  76570. 8037938: 2000c830 .word 0x2000c830
  76571. 803793c: 080375f5 .word 0x080375f5
  76572. 8037940: 08045097 .word 0x08045097
  76573. 08037944 <GetStateWebReinit>:
  76574. /**
  76575. * @brief Возвращает true если сетевые параметры изменились
  76576. */
  76577. bool GetStateWebReinit(void)
  76578. {
  76579. 8037944: b510 push {r4, lr}
  76580. /* Статус dhcp изменился? */
  76581. if (sSettings.sWebParams.dhcpEnable != sSettings.sWebTempParams.dhcpEnable)
  76582. 8037946: 4c12 ldr r4, [pc, #72] ; (8037990 <GetStateWebReinit+0x4c>)
  76583. 8037948: f894 2032 ldrb.w r2, [r4, #50] ; 0x32
  76584. 803794c: f894 3063 ldrb.w r3, [r4, #99] ; 0x63
  76585. 8037950: 429a cmp r2, r3
  76586. 8037952: d004 beq.n 803795e <GetStateWebReinit+0x1a>
  76587. {
  76588. /* Включили dhcp */
  76589. if (sSettings.sWebTempParams.dhcpEnable == 1)
  76590. {
  76591. /* Устанавилваем флаг */
  76592. SetWebReinitFlag(true);
  76593. 8037954: 2001 movs r0, #1
  76594. 8037956: f7f0 fe33 bl 80285c0 <SetWebReinitFlag>
  76595. return true;
  76596. 803795a: 2001 movs r0, #1
  76597. 803795c: bd10 pop {r4, pc}
  76598. return true;
  76599. }
  76600. }
  76601. /* Изменился IP? */
  76602. if (strstr(sSettings.sWebParams.ip, sSettings.sWebTempParams.ip) == 0)
  76603. 803795e: 1ca0 adds r0, r4, #2
  76604. 8037960: f104 0133 add.w r1, r4, #51 ; 0x33
  76605. 8037964: f7ea feb0 bl 80226c8 <strstr>
  76606. 8037968: 2800 cmp r0, #0
  76607. 803796a: d0f3 beq.n 8037954 <GetStateWebReinit+0x10>
  76608. SetWebReinitFlag(true);
  76609. return true;
  76610. }
  76611. /* Изменился шлюз? */
  76612. if (strstr(sSettings.sWebParams.gate, sSettings.sWebTempParams.gate) == 0)
  76613. 803796c: f104 0012 add.w r0, r4, #18
  76614. 8037970: f104 0143 add.w r1, r4, #67 ; 0x43
  76615. 8037974: f7ea fea8 bl 80226c8 <strstr>
  76616. 8037978: 2800 cmp r0, #0
  76617. 803797a: d0eb beq.n 8037954 <GetStateWebReinit+0x10>
  76618. SetWebReinitFlag(true);
  76619. return true;
  76620. }
  76621. /* Изменилась маска? */
  76622. if (strstr(sSettings.sWebParams.mask, sSettings.sWebTempParams.mask) == 0)
  76623. 803797c: f104 0022 add.w r0, r4, #34 ; 0x22
  76624. 8037980: f104 0153 add.w r1, r4, #83 ; 0x53
  76625. 8037984: f7ea fea0 bl 80226c8 <strstr>
  76626. 8037988: 2800 cmp r0, #0
  76627. 803798a: d0e3 beq.n 8037954 <GetStateWebReinit+0x10>
  76628. /* Устанавилваем флаг */
  76629. SetWebReinitFlag(true);
  76630. return true;
  76631. }
  76632. return false;
  76633. 803798c: 2000 movs r0, #0
  76634. }
  76635. 803798e: bd10 pop {r4, pc}
  76636. 8037990: 2000d414 .word 0x2000d414
  76637. 08037994 <signals_set_value>:
  76638. \param len - длина переменной в байтах
  76639. \param value - указатель на значение переменной
  76640. \return нет
  76641. ------------------------------------------------------------------------------*/
  76642. static void signals_set_value (struct obj_def *od, u16_t len, void *value)
  76643. {
  76644. 8037994: b530 push {r4, r5, lr}
  76645. 8037996: 4605 mov r5, r0
  76646. 8037998: b087 sub sp, #28
  76647. 803799a: 4614 mov r4, r2
  76648. uint32_t val;
  76649. char *val_string;
  76650. char str[20];
  76651. int8_t res = 0;
  76652. memset(str, 0, 20);
  76653. 803799c: a801 add r0, sp, #4
  76654. 803799e: 2100 movs r1, #0
  76655. 80379a0: 2214 movs r2, #20
  76656. 80379a2: f7ea fa39 bl 8021e18 <memset>
  76657. id = od->id_inst_ptr[0];
  76658. 80379a6: 68ab ldr r3, [r5, #8]
  76659. switch (id)
  76660. 80379a8: 781b ldrb r3, [r3, #0]
  76661. 80379aa: 3b02 subs r3, #2
  76662. 80379ac: 2b06 cmp r3, #6
  76663. 80379ae: f200 8081 bhi.w 8037ab4 <signals_set_value+0x120>
  76664. 80379b2: e8df f003 tbb [pc, r3]
  76665. 80379b6: 0a04 .short 0x0a04
  76666. 80379b8: 3e27117f .word 0x3e27117f
  76667. 80379bc: 60 .byte 0x60
  76668. 80379bd: 00 .byte 0x00
  76669. {
  76670. case 2: /* RestoreSignal */
  76671. val = *((s32_t*)value);
  76672. if (val == 1) {
  76673. 80379be: 6823 ldr r3, [r4, #0]
  76674. 80379c0: 2b01 cmp r3, #1
  76675. 80379c2: d177 bne.n 8037ab4 <signals_set_value+0x120>
  76676. HTTP_ResetSettings();
  76677. 80379c4: f7f6 ff3c bl 802e840 <HTTP_ResetSettings>
  76678. 80379c8: e074 b.n 8037ab4 <signals_set_value+0x120>
  76679. }
  76680. break;
  76681. case 3: /* RebootSignal */
  76682. val = *((s32_t*)value);
  76683. if (val == 1)
  76684. 80379ca: 6823 ldr r3, [r4, #0]
  76685. 80379cc: 2b01 cmp r3, #1
  76686. 80379ce: d171 bne.n 8037ab4 <signals_set_value+0x120>
  76687. HTTP_StartResetTask(false);
  76688. 80379d0: 2000 movs r0, #0
  76689. 80379d2: f7f6 ff7f bl 802e8d4 <HTTP_StartResetTask>
  76690. 80379d6: e06d b.n 8037ab4 <signals_set_value+0x120>
  76691. break;
  76692. case 5: /* DO1 */
  76693. if(sSettings.sInOuts.ro_type_source[0] == SNMP_SET){
  76694. 80379d8: 4b37 ldr r3, [pc, #220] ; (8037ab8 <signals_set_value+0x124>)
  76695. 80379da: f893 3374 ldrb.w r3, [r3, #884] ; 0x374
  76696. 80379de: 2b03 cmp r3, #3
  76697. 80379e0: d168 bne.n 8037ab4 <signals_set_value+0x120>
  76698. val_string = (char*)value;
  76699. SetROStr(val_string, 0);
  76700. 80379e2: 2100 movs r1, #0
  76701. 80379e4: 4620 mov r0, r4
  76702. 80379e6: f7f0 ffc5 bl 8028974 <SetROStr>
  76703. if(val_string[0] == 0x31)
  76704. 80379ea: 7823 ldrb r3, [r4, #0]
  76705. 80379ec: 2b31 cmp r3, #49 ; 0x31
  76706. strcat(str, "Замкнуто");
  76707. 80379ee: bf0c ite eq
  76708. 80379f0: 4932 ldreq r1, [pc, #200] ; (8037abc <signals_set_value+0x128>)
  76709. else
  76710. strcat(str, "Разомкнуто");
  76711. 80379f2: 4933 ldrne r1, [pc, #204] ; (8037ac0 <signals_set_value+0x12c>)
  76712. case 5: /* DO1 */
  76713. if(sSettings.sInOuts.ro_type_source[0] == SNMP_SET){
  76714. val_string = (char*)value;
  76715. SetROStr(val_string, 0);
  76716. if(val_string[0] == 0x31)
  76717. strcat(str, "Замкнуто");
  76718. 80379f4: a801 add r0, sp, #4
  76719. else
  76720. strcat(str, "Разомкнуто");
  76721. 80379f6: f7ea fa75 bl 8021ee4 <strcat>
  76722. SNMP_SendUserTrap(DO0_TOGGLED);
  76723. 80379fa: 2007 movs r0, #7
  76724. 80379fc: f000 f970 bl 8037ce0 <SNMP_SendUserTrap>
  76725. log_event_data(LOG_DO0_STATE, str);
  76726. 8037a00: 2009 movs r0, #9
  76727. 8037a02: e014 b.n 8037a2e <signals_set_value+0x9a>
  76728. }
  76729. break;
  76730. case 6: /* DO2 */
  76731. if(sSettings.sInOuts.ro_type_source[1] == SNMP_SET){
  76732. 8037a04: 4b2c ldr r3, [pc, #176] ; (8037ab8 <signals_set_value+0x124>)
  76733. 8037a06: f893 3375 ldrb.w r3, [r3, #885] ; 0x375
  76734. 8037a0a: 2b03 cmp r3, #3
  76735. 8037a0c: d152 bne.n 8037ab4 <signals_set_value+0x120>
  76736. val_string = (char*)value;
  76737. SetROStr(val_string, 1);
  76738. 8037a0e: 2101 movs r1, #1
  76739. 8037a10: 4620 mov r0, r4
  76740. 8037a12: f7f0 ffaf bl 8028974 <SetROStr>
  76741. if(val_string[0] == 0x31)
  76742. 8037a16: 7823 ldrb r3, [r4, #0]
  76743. 8037a18: 2b31 cmp r3, #49 ; 0x31
  76744. strcat(str, "Замкнуто");
  76745. 8037a1a: bf0c ite eq
  76746. 8037a1c: 4927 ldreq r1, [pc, #156] ; (8037abc <signals_set_value+0x128>)
  76747. else
  76748. strcat(str, "Разомкнуто");
  76749. 8037a1e: 4928 ldrne r1, [pc, #160] ; (8037ac0 <signals_set_value+0x12c>)
  76750. case 6: /* DO2 */
  76751. if(sSettings.sInOuts.ro_type_source[1] == SNMP_SET){
  76752. val_string = (char*)value;
  76753. SetROStr(val_string, 1);
  76754. if(val_string[0] == 0x31)
  76755. strcat(str, "Замкнуто");
  76756. 8037a20: a801 add r0, sp, #4
  76757. else
  76758. strcat(str, "Разомкнуто");
  76759. 8037a22: f7ea fa5f bl 8021ee4 <strcat>
  76760. SNMP_SendUserTrap(DO1_TOGGLED);
  76761. 8037a26: 2008 movs r0, #8
  76762. 8037a28: f000 f95a bl 8037ce0 <SNMP_SendUserTrap>
  76763. log_event_data(LOG_DO1_STATE, str);
  76764. 8037a2c: 200a movs r0, #10
  76765. 8037a2e: a901 add r1, sp, #4
  76766. 8037a30: e03e b.n 8037ab0 <signals_set_value+0x11c>
  76767. }
  76768. break;
  76769. case 7: /* BatTest */
  76770. val =*((s32_t*)value);
  76771. 8037a32: 6823 ldr r3, [r4, #0]
  76772. if(val == 0){
  76773. 8037a34: b93b cbnz r3, 8037a46 <signals_set_value+0xb2>
  76774. res = ups_metac_service_pdu(ups_cancel_test);
  76775. 8037a36: 2008 movs r0, #8
  76776. 8037a38: f7f1 fecc bl 80297d4 <ups_metac_service_pdu>
  76777. if(res == 1){
  76778. 8037a3c: b240 sxtb r0, r0
  76779. 8037a3e: 2801 cmp r0, #1
  76780. 8037a40: d138 bne.n 8037ab4 <signals_set_value+0x120>
  76781. log_event_data(LOG_TEST_UPS, "Администратор(Останов)");
  76782. 8037a42: 2006 movs r0, #6
  76783. 8037a44: e028 b.n 8037a98 <signals_set_value+0x104>
  76784. }
  76785. }
  76786. else if(val > 0 && val < 100){
  76787. 8037a46: 1e5a subs r2, r3, #1
  76788. 8037a48: 2a62 cmp r2, #98 ; 0x62
  76789. 8037a4a: d80a bhi.n 8037a62 <signals_set_value+0xce>
  76790. TimeParam = val;
  76791. 8037a4c: 4a1d ldr r2, [pc, #116] ; (8037ac4 <signals_set_value+0x130>)
  76792. res = ups_metac_service_pdu(ups_test_time);
  76793. 8037a4e: 2003 movs r0, #3
  76794. if(res == 1){
  76795. log_event_data(LOG_TEST_UPS, "Администратор(Останов)");
  76796. }
  76797. }
  76798. else if(val > 0 && val < 100){
  76799. TimeParam = val;
  76800. 8037a50: 8013 strh r3, [r2, #0]
  76801. res = ups_metac_service_pdu(ups_test_time);
  76802. 8037a52: f7f1 febf bl 80297d4 <ups_metac_service_pdu>
  76803. if(res == 1){
  76804. 8037a56: b240 sxtb r0, r0
  76805. 8037a58: 2801 cmp r0, #1
  76806. 8037a5a: d12b bne.n 8037ab4 <signals_set_value+0x120>
  76807. log_event_data(LOG_TEST_UPS, "Администратор (Запущен)");
  76808. 8037a5c: 2006 movs r0, #6
  76809. 8037a5e: 491a ldr r1, [pc, #104] ; (8037ac8 <signals_set_value+0x134>)
  76810. 8037a60: e026 b.n 8037ab0 <signals_set_value+0x11c>
  76811. }
  76812. }
  76813. else if(val == 100){
  76814. 8037a62: 2b64 cmp r3, #100 ; 0x64
  76815. 8037a64: d101 bne.n 8037a6a <signals_set_value+0xd6>
  76816. res = ups_metac_service_pdu(ups_test_10sec);
  76817. 8037a66: 2001 movs r0, #1
  76818. 8037a68: e7f3 b.n 8037a52 <signals_set_value+0xbe>
  76819. if(res == 1){
  76820. log_event_data(LOG_TEST_UPS, "Администратор (Запущен)");
  76821. }
  76822. }
  76823. else if(val == 999){
  76824. 8037a6a: f240 32e7 movw r2, #999 ; 0x3e7
  76825. 8037a6e: 4293 cmp r3, r2
  76826. 8037a70: d120 bne.n 8037ab4 <signals_set_value+0x120>
  76827. res = ups_metac_service_pdu(ups_test_low_bat);
  76828. 8037a72: 2002 movs r0, #2
  76829. 8037a74: e7ed b.n 8037a52 <signals_set_value+0xbe>
  76830. }
  76831. }
  76832. break;
  76833. case 8: /* Shutdown UPS */
  76834. val_string = (char*)value;
  76835. float shtdn_val = atof(val_string);
  76836. 8037a76: 4620 mov r0, r4
  76837. 8037a78: f7ea f8aa bl 8021bd0 <atof>
  76838. 8037a7c: f7e9 f8be bl 8020bfc <__aeabi_d2f>
  76839. if(shtdn_val == 0){
  76840. 8037a80: 2100 movs r1, #0
  76841. }
  76842. }
  76843. break;
  76844. case 8: /* Shutdown UPS */
  76845. val_string = (char*)value;
  76846. float shtdn_val = atof(val_string);
  76847. 8037a82: 4604 mov r4, r0
  76848. if(shtdn_val == 0){
  76849. 8037a84: f7e9 fbac bl 80211e0 <__aeabi_fcmpeq>
  76850. 8037a88: b140 cbz r0, 8037a9c <signals_set_value+0x108>
  76851. res = ups_metac_service_pdu(ups_cancel_shut_down);
  76852. 8037a8a: 2007 movs r0, #7
  76853. 8037a8c: f7f1 fea2 bl 80297d4 <ups_metac_service_pdu>
  76854. if(res == 1)
  76855. 8037a90: b240 sxtb r0, r0
  76856. 8037a92: 2801 cmp r0, #1
  76857. 8037a94: d10e bne.n 8037ab4 <signals_set_value+0x120>
  76858. log_event_data(LOG_SHUTDOWN_UPS, "Администратор(Останов)");
  76859. 8037a96: 2007 movs r0, #7
  76860. 8037a98: 490c ldr r1, [pc, #48] ; (8037acc <signals_set_value+0x138>)
  76861. 8037a9a: e009 b.n 8037ab0 <signals_set_value+0x11c>
  76862. }
  76863. else{
  76864. TimeParamFloat = shtdn_val;
  76865. 8037a9c: 4b0c ldr r3, [pc, #48] ; (8037ad0 <signals_set_value+0x13c>)
  76866. res = ups_metac_service_pdu(ups_shutdown);
  76867. 8037a9e: 2005 movs r0, #5
  76868. res = ups_metac_service_pdu(ups_cancel_shut_down);
  76869. if(res == 1)
  76870. log_event_data(LOG_SHUTDOWN_UPS, "Администратор(Останов)");
  76871. }
  76872. else{
  76873. TimeParamFloat = shtdn_val;
  76874. 8037aa0: 601c str r4, [r3, #0]
  76875. res = ups_metac_service_pdu(ups_shutdown);
  76876. 8037aa2: f7f1 fe97 bl 80297d4 <ups_metac_service_pdu>
  76877. if(res == 1)
  76878. 8037aa6: b240 sxtb r0, r0
  76879. 8037aa8: 2801 cmp r0, #1
  76880. 8037aaa: d103 bne.n 8037ab4 <signals_set_value+0x120>
  76881. log_event_data(LOG_SHUTDOWN_UPS, "Администратор");
  76882. 8037aac: 4909 ldr r1, [pc, #36] ; (8037ad4 <signals_set_value+0x140>)
  76883. 8037aae: 2007 movs r0, #7
  76884. 8037ab0: f7f2 fbd8 bl 802a264 <log_event_data>
  76885. break;
  76886. default :
  76887. break;
  76888. };
  76889. }
  76890. 8037ab4: b007 add sp, #28
  76891. 8037ab6: bd30 pop {r4, r5, pc}
  76892. 8037ab8: 2000d414 .word 0x2000d414
  76893. 8037abc: 08039322 .word 0x08039322
  76894. 8037ac0: 08039333 .word 0x08039333
  76895. 8037ac4: 20000b8c .word 0x20000b8c
  76896. 8037ac8: 08040130 .word 0x08040130
  76897. 8037acc: 0803ff7e .word 0x0803ff7e
  76898. 8037ad0: 20000b88 .word 0x20000b88
  76899. 8037ad4: 0803928f .word 0x0803928f
  76900. 08037ad8 <signals_set_test>:
  76901. char *val_string;
  76902. int32_t val;
  76903. LWIP_UNUSED_ARG(value);
  76904. set_ok = 0;
  76905. id = od->id_inst_ptr[0];
  76906. 8037ad8: 6883 ldr r3, [r0, #8]
  76907. switch (id)
  76908. 8037ada: 781b ldrb r3, [r3, #0]
  76909. 8037adc: 3b02 subs r3, #2
  76910. \param value - указатель на значение переменной
  76911. \return 0 - некорректное значение
  76912. 1 - корректное значение
  76913. ------------------------------------------------------------------------------*/
  76914. static u8_t signals_set_test (struct obj_def *od, u16_t len, void *value)
  76915. {
  76916. 8037ade: b510 push {r4, lr}
  76917. LWIP_UNUSED_ARG(value);
  76918. set_ok = 0;
  76919. id = od->id_inst_ptr[0];
  76920. switch (id)
  76921. 8037ae0: 2b06 cmp r3, #6
  76922. 8037ae2: d838 bhi.n 8037b56 <signals_set_test+0x7e>
  76923. 8037ae4: e8df f003 tbb [pc, r3]
  76924. 8037ae8: 06370404 .word 0x06370404
  76925. 8037aec: 2112 .short 0x2112
  76926. 8037aee: 29 .byte 0x29
  76927. 8037aef: 00 .byte 0x00
  76928. u8_t id, set_ok;
  76929. char *val_string;
  76930. int32_t val;
  76931. LWIP_UNUSED_ARG(value);
  76932. set_ok = 0;
  76933. 8037af0: 2904 cmp r1, #4
  76934. 8037af2: e016 b.n 8037b22 <signals_set_test+0x4a>
  76935. {
  76936. set_ok = 1;
  76937. }
  76938. break;
  76939. case 5: /* DO1 */
  76940. if ( len <= 1 )
  76941. 8037af4: 2901 cmp r1, #1
  76942. 8037af6: d900 bls.n 8037afa <signals_set_test+0x22>
  76943. 8037af8: e02d b.n 8037b56 <signals_set_test+0x7e>
  76944. {
  76945. val_string = (char*)value;
  76946. if(atoi(val_string) <= 1){
  76947. 8037afa: 4610 mov r0, r2
  76948. 8037afc: f7ea f86c bl 8021bd8 <atoi>
  76949. 8037b00: 2801 cmp r0, #1
  76950. 8037b02: dc28 bgt.n 8037b56 <signals_set_test+0x7e>
  76951. if(sSettings.sInOuts.ro_type_source[0] == SNMP_SET)
  76952. 8037b04: 4b16 ldr r3, [pc, #88] ; (8037b60 <signals_set_test+0x88>)
  76953. 8037b06: f893 0374 ldrb.w r0, [r3, #884] ; 0x374
  76954. 8037b0a: e009 b.n 8037b20 <signals_set_test+0x48>
  76955. set_ok = 1;
  76956. }
  76957. }
  76958. break;
  76959. case 6: /* DO2 */
  76960. if ( len <= 1 )
  76961. 8037b0c: 2901 cmp r1, #1
  76962. 8037b0e: d822 bhi.n 8037b56 <signals_set_test+0x7e>
  76963. {
  76964. val_string = (char*)value;
  76965. if(atoi(val_string) <= 1){
  76966. 8037b10: 4610 mov r0, r2
  76967. 8037b12: f7ea f861 bl 8021bd8 <atoi>
  76968. 8037b16: 2801 cmp r0, #1
  76969. 8037b18: dc1d bgt.n 8037b56 <signals_set_test+0x7e>
  76970. if(sSettings.sInOuts.ro_type_source[1] == SNMP_SET)
  76971. 8037b1a: 4b11 ldr r3, [pc, #68] ; (8037b60 <signals_set_test+0x88>)
  76972. 8037b1c: f893 0375 ldrb.w r0, [r3, #885] ; 0x375
  76973. u8_t id, set_ok;
  76974. char *val_string;
  76975. int32_t val;
  76976. LWIP_UNUSED_ARG(value);
  76977. set_ok = 0;
  76978. 8037b20: 2803 cmp r0, #3
  76979. 8037b22: bf14 ite ne
  76980. 8037b24: 2000 movne r0, #0
  76981. 8037b26: 2001 moveq r0, #1
  76982. 8037b28: bd10 pop {r4, pc}
  76983. set_ok = 1;
  76984. }
  76985. }
  76986. break;
  76987. case 7: /* BatTest */
  76988. val = *((s32_t*)value);
  76989. 8037b2a: 6813 ldr r3, [r2, #0]
  76990. if((val >= 0 && val <= 100) || val == 999){
  76991. 8037b2c: 2b64 cmp r3, #100 ; 0x64
  76992. 8037b2e: d914 bls.n 8037b5a <signals_set_test+0x82>
  76993. 8037b30: f240 32e7 movw r2, #999 ; 0x3e7
  76994. 8037b34: 4293 cmp r3, r2
  76995. 8037b36: d10e bne.n 8037b56 <signals_set_test+0x7e>
  76996. 8037b38: e00f b.n 8037b5a <signals_set_test+0x82>
  76997. set_ok = 1;
  76998. }
  76999. break;
  77000. case 8: /* Shutdown UPS */
  77001. if ( len <= 3 )
  77002. 8037b3a: 2903 cmp r1, #3
  77003. 8037b3c: d80b bhi.n 8037b56 <signals_set_test+0x7e>
  77004. {
  77005. val_string = (char*)value;
  77006. if(atof(val_string) <= 10){
  77007. 8037b3e: 4610 mov r0, r2
  77008. 8037b40: f7ea f846 bl 8021bd0 <atof>
  77009. 8037b44: 2200 movs r2, #0
  77010. 8037b46: 4b07 ldr r3, [pc, #28] ; (8037b64 <signals_set_test+0x8c>)
  77011. 8037b48: 2401 movs r4, #1
  77012. 8037b4a: f7e8 fff1 bl 8020b30 <__aeabi_dcmple>
  77013. 8037b4e: b900 cbnz r0, 8037b52 <signals_set_test+0x7a>
  77014. 8037b50: 4604 mov r4, r0
  77015. u8_t id, set_ok;
  77016. char *val_string;
  77017. int32_t val;
  77018. LWIP_UNUSED_ARG(value);
  77019. set_ok = 0;
  77020. 8037b52: b2e0 uxtb r0, r4
  77021. 8037b54: bd10 pop {r4, pc}
  77022. 8037b56: 2000 movs r0, #0
  77023. 8037b58: bd10 pop {r4, pc}
  77024. }
  77025. break;
  77026. case 7: /* BatTest */
  77027. val = *((s32_t*)value);
  77028. if((val >= 0 && val <= 100) || val == 999){
  77029. set_ok = 1;
  77030. 8037b5a: 2001 movs r0, #1
  77031. }
  77032. break;
  77033. };
  77034. return set_ok;
  77035. }
  77036. 8037b5c: bd10 pop {r4, pc}
  77037. 8037b5e: bf00 nop
  77038. 8037b60: 2000d414 .word 0x2000d414
  77039. 8037b64: 40240000 .word 0x40240000
  77040. 08037b68 <signals_get_value>:
  77041. \param len - длина переменной в байтах
  77042. \param value - указатель на значение переменной
  77043. \return нет
  77044. ------------------------------------------------------------------------------*/
  77045. static void signals_get_value (struct obj_def *od, u16_t len, void *value)
  77046. {
  77047. 8037b68: 4613 mov r3, r2
  77048. u8_t id;
  77049. id = od->id_inst_ptr[0];
  77050. 8037b6a: 6882 ldr r2, [r0, #8]
  77051. switch (id)
  77052. 8037b6c: 7812 ldrb r2, [r2, #0]
  77053. 8037b6e: 3a01 subs r2, #1
  77054. \param len - длина переменной в байтах
  77055. \param value - указатель на значение переменной
  77056. \return нет
  77057. ------------------------------------------------------------------------------*/
  77058. static void signals_get_value (struct obj_def *od, u16_t len, void *value)
  77059. {
  77060. 8037b70: b510 push {r4, lr}
  77061. 8037b72: 460c mov r4, r1
  77062. u8_t id;
  77063. id = od->id_inst_ptr[0];
  77064. switch (id)
  77065. 8037b74: 2a11 cmp r2, #17
  77066. 8037b76: d814 bhi.n 8037ba2 <signals_get_value+0x3a>
  77067. 8037b78: e8df f002 tbb [pc, r2]
  77068. 8037b7c: 0c09090c .word 0x0c09090c
  77069. 8037b80: 09090c0c .word 0x09090c0c
  77070. 8037b84: 0c0c0c0c .word 0x0c0c0c0c
  77071. 8037b88: 0c0c0c0c .word 0x0c0c0c0c
  77072. 8037b8c: 0c0c .short 0x0c0c
  77073. break;
  77074. case 7: /* BatTest */
  77075. *((s32_t*)value) = 0;
  77076. break;
  77077. case 8: /* Shutdown UPS */
  77078. *((s32_t*)value) = 0;
  77079. 8037b8e: 2200 movs r2, #0
  77080. 8037b90: 601a str r2, [r3, #0]
  77081. break;
  77082. 8037b92: bd10 pop {r4, pc}
  77083. break;
  77084. case 17: /* ConnectMonitor */
  77085. ocstrncpy((u8_t*)value, (u8_t*)paramStr, len);
  77086. break;
  77087. case 18: /* Alarms */
  77088. ocstrncpy((u8_t*)value, (u8_t*)paramStr, len);
  77089. 8037b94: 4903 ldr r1, [pc, #12] ; (8037ba4 <signals_get_value+0x3c>)
  77090. 8037b96: 4618 mov r0, r3
  77091. 8037b98: 4622 mov r2, r4
  77092. break;
  77093. default :
  77094. break;
  77095. };
  77096. }
  77097. 8037b9a: e8bd 4010 ldmia.w sp!, {r4, lr}
  77098. break;
  77099. case 17: /* ConnectMonitor */
  77100. ocstrncpy((u8_t*)value, (u8_t*)paramStr, len);
  77101. break;
  77102. case 18: /* Alarms */
  77103. ocstrncpy((u8_t*)value, (u8_t*)paramStr, len);
  77104. 8037b9e: f7fc ba51 b.w 8034044 <ocstrncpy>
  77105. 8037ba2: bd10 pop {r4, pc}
  77106. 8037ba4: 2001021c .word 0x2001021c
  77107. 08037ba8 <signals_get_object_def>:
  77108. u8_t id;
  77109. /* return to object name, adding index depth (1) */
  77110. ident_len += 1;
  77111. ident -= 1;
  77112. if (ident_len == 2)
  77113. 8037ba8: 2801 cmp r0, #1
  77114. \param ident - points to objectname.0 (object id trailer)
  77115. \param od - points to object definition. указатель на описание переменной
  77116. \return нет
  77117. ------------------------------------------------------------------------------*/
  77118. static void signals_get_object_def (u8_t ident_len, s32_t *ident, struct obj_def *od)
  77119. {
  77120. 8037baa: b538 push {r3, r4, r5, lr}
  77121. 8037bac: 4614 mov r4, r2
  77122. u8_t id;
  77123. /* return to object name, adding index depth (1) */
  77124. ident_len += 1;
  77125. ident -= 1;
  77126. if (ident_len == 2)
  77127. 8037bae: f040 8081 bne.w 8037cb4 <signals_get_object_def+0x10c>
  77128. {
  77129. od->id_inst_len = ident_len;
  77130. 8037bb2: 2302 movs r3, #2
  77131. 8037bb4: 7193 strb r3, [r2, #6]
  77132. {
  77133. u8_t id;
  77134. /* return to object name, adding index depth (1) */
  77135. ident_len += 1;
  77136. ident -= 1;
  77137. 8037bb6: 1f0a subs r2, r1, #4
  77138. if (ident_len == 2)
  77139. {
  77140. od->id_inst_len = ident_len;
  77141. od->id_inst_ptr = ident;
  77142. 8037bb8: 60a2 str r2, [r4, #8]
  77143. id = ident[0];
  77144. switch (id)
  77145. 8037bba: f811 2c04 ldrb.w r2, [r1, #-4]
  77146. 8037bbe: 3a01 subs r2, #1
  77147. 8037bc0: 2a11 cmp r2, #17
  77148. 8037bc2: d877 bhi.n 8037cb4 <signals_get_object_def+0x10c>
  77149. 8037bc4: e8df f002 tbb [pc, r2]
  77150. 8037bc8: 0f242409 .word 0x0f242409
  77151. 8037bcc: 2a241a15 .word 0x2a241a15
  77152. 8037bd0: 453f3932 .word 0x453f3932
  77153. 8037bd4: 5d57514b .word 0x5d57514b
  77154. 8037bd8: 6963 .short 0x6963
  77155. {
  77156. case 1: /* FWVersion */
  77157. GetVersionStr(paramStr, &paramLength);
  77158. 8037bda: 4d38 ldr r5, [pc, #224] ; (8037cbc <signals_get_object_def+0x114>)
  77159. 8037bdc: 4838 ldr r0, [pc, #224] ; (8037cc0 <signals_get_object_def+0x118>)
  77160. 8037bde: 4629 mov r1, r5
  77161. 8037be0: f7f0 fadc bl 802819c <GetVersionStr>
  77162. 8037be4: e05e b.n 8037ca4 <signals_get_object_def+0xfc>
  77163. od->access = MIB_OBJECT_WRITE_ONLY;
  77164. od->asn_type = SNMP_ASN1_INTEG;
  77165. od->v_len = sizeof(s32_t);
  77166. break;
  77167. case 4: /* UPSModel*/
  77168. GetUPSModelStr(paramStr, &paramLength);
  77169. 8037be6: 4d35 ldr r5, [pc, #212] ; (8037cbc <signals_get_object_def+0x114>)
  77170. 8037be8: 4835 ldr r0, [pc, #212] ; (8037cc0 <signals_get_object_def+0x118>)
  77171. 8037bea: 4629 mov r1, r5
  77172. 8037bec: f7f0 fb42 bl 8028274 <GetUPSModelStr>
  77173. 8037bf0: e058 b.n 8037ca4 <signals_get_object_def+0xfc>
  77174. od->access = MIB_OBJECT_READ_ONLY;
  77175. od->asn_type = SNMP_ASN1_OC_STR;
  77176. od->v_len = paramLength;
  77177. break;
  77178. case 5: /* DO1*/
  77179. GetDOUTStatusStr(paramStr, &paramLength, 0);
  77180. 8037bf2: 4d32 ldr r5, [pc, #200] ; (8037cbc <signals_get_object_def+0x114>)
  77181. 8037bf4: 4832 ldr r0, [pc, #200] ; (8037cc0 <signals_get_object_def+0x118>)
  77182. 8037bf6: 4629 mov r1, r5
  77183. 8037bf8: 2200 movs r2, #0
  77184. 8037bfa: e003 b.n 8037c04 <signals_get_object_def+0x5c>
  77185. od->access = MIB_OBJECT_READ_WRITE;
  77186. od->asn_type = SNMP_ASN1_OC_STR;
  77187. od->v_len = paramLength;
  77188. break;
  77189. case 6: /* DO2*/
  77190. GetDOUTStatusStr(paramStr, &paramLength, 1);
  77191. 8037bfc: 4d2f ldr r5, [pc, #188] ; (8037cbc <signals_get_object_def+0x114>)
  77192. 8037bfe: 4830 ldr r0, [pc, #192] ; (8037cc0 <signals_get_object_def+0x118>)
  77193. 8037c00: 4629 mov r1, r5
  77194. 8037c02: 2201 movs r2, #1
  77195. 8037c04: f7f0 fa48 bl 8028098 <GetDOUTStatusStr>
  77196. od->instance = MIB_OBJECT_SCALAR;
  77197. 8037c08: 2301 movs r3, #1
  77198. 8037c0a: 7023 strb r3, [r4, #0]
  77199. od->access = MIB_OBJECT_READ_WRITE;
  77200. 8037c0c: 2303 movs r3, #3
  77201. 8037c0e: e04b b.n 8037ca8 <signals_get_object_def+0x100>
  77202. od->asn_type = SNMP_ASN1_OC_STR;
  77203. od->v_len = paramLength;
  77204. break;
  77205. case 7: /* BatTest*/
  77206. od->instance = MIB_OBJECT_SCALAR;
  77207. 8037c10: 2201 movs r2, #1
  77208. od->access = MIB_OBJECT_WRITE_ONLY;
  77209. 8037c12: 7063 strb r3, [r4, #1]
  77210. od->asn_type = SNMP_ASN1_INTEG;
  77211. 8037c14: 70a3 strb r3, [r4, #2]
  77212. od->asn_type = SNMP_ASN1_OC_STR;
  77213. od->v_len = paramLength;
  77214. break;
  77215. case 7: /* BatTest*/
  77216. od->instance = MIB_OBJECT_SCALAR;
  77217. 8037c16: 7022 strb r2, [r4, #0]
  77218. od->access = MIB_OBJECT_WRITE_ONLY;
  77219. od->asn_type = SNMP_ASN1_INTEG;
  77220. od->v_len = sizeof(s32_t);
  77221. 8037c18: 2304 movs r3, #4
  77222. 8037c1a: e049 b.n 8037cb0 <signals_get_object_def+0x108>
  77223. break;
  77224. case 8: /* Shutdown UPS*/
  77225. od->instance = MIB_OBJECT_SCALAR;
  77226. od->access = MIB_OBJECT_WRITE_ONLY;
  77227. 8037c1c: 7063 strb r3, [r4, #1]
  77228. od->asn_type = SNMP_ASN1_OC_STR;
  77229. 8037c1e: 2304 movs r3, #4
  77230. od->asn_type = SNMP_ASN1_INTEG;
  77231. od->v_len = sizeof(s32_t);
  77232. break;
  77233. case 8: /* Shutdown UPS*/
  77234. od->instance = MIB_OBJECT_SCALAR;
  77235. 8037c20: 2201 movs r2, #1
  77236. od->access = MIB_OBJECT_WRITE_ONLY;
  77237. od->asn_type = SNMP_ASN1_OC_STR;
  77238. 8037c22: 70a3 strb r3, [r4, #2]
  77239. od->v_len = paramLength;
  77240. 8037c24: 4b25 ldr r3, [pc, #148] ; (8037cbc <signals_get_object_def+0x114>)
  77241. od->asn_type = SNMP_ASN1_INTEG;
  77242. od->v_len = sizeof(s32_t);
  77243. break;
  77244. case 8: /* Shutdown UPS*/
  77245. od->instance = MIB_OBJECT_SCALAR;
  77246. 8037c26: 7022 strb r2, [r4, #0]
  77247. od->access = MIB_OBJECT_WRITE_ONLY;
  77248. od->asn_type = SNMP_ASN1_OC_STR;
  77249. od->v_len = paramLength;
  77250. 8037c28: 781b ldrb r3, [r3, #0]
  77251. 8037c2a: e041 b.n 8037cb0 <signals_get_object_def+0x108>
  77252. break;
  77253. case 9: /* DIO*/
  77254. GetDINStatusStr(paramStr, &paramLength, 0);
  77255. 8037c2c: 4d23 ldr r5, [pc, #140] ; (8037cbc <signals_get_object_def+0x114>)
  77256. 8037c2e: 4824 ldr r0, [pc, #144] ; (8037cc0 <signals_get_object_def+0x118>)
  77257. 8037c30: 4629 mov r1, r5
  77258. 8037c32: 2200 movs r2, #0
  77259. 8037c34: f7f0 f9f6 bl 8028024 <GetDINStatusStr>
  77260. 8037c38: e034 b.n 8037ca4 <signals_get_object_def+0xfc>
  77261. od->access = MIB_OBJECT_READ_ONLY;
  77262. od->asn_type = SNMP_ASN1_OC_STR;
  77263. od->v_len = paramLength;
  77264. break;
  77265. case 10: /* IntTemp */
  77266. GetInternalTempStr(paramStr, &paramLength);
  77267. 8037c3a: 4d20 ldr r5, [pc, #128] ; (8037cbc <signals_get_object_def+0x114>)
  77268. 8037c3c: 4820 ldr r0, [pc, #128] ; (8037cc0 <signals_get_object_def+0x118>)
  77269. 8037c3e: 4629 mov r1, r5
  77270. 8037c40: f7f0 f8ec bl 8027e1c <GetInternalTempStr>
  77271. 8037c44: e02e b.n 8037ca4 <signals_get_object_def+0xfc>
  77272. od->access = MIB_OBJECT_READ_ONLY;
  77273. od->asn_type = SNMP_ASN1_OC_STR;
  77274. od->v_len = paramLength;
  77275. break;
  77276. case 11: /* InFreq */
  77277. GetInputFreqStr(paramStr, &paramLength);
  77278. 8037c46: 4d1d ldr r5, [pc, #116] ; (8037cbc <signals_get_object_def+0x114>)
  77279. 8037c48: 481d ldr r0, [pc, #116] ; (8037cc0 <signals_get_object_def+0x118>)
  77280. 8037c4a: 4629 mov r1, r5
  77281. 8037c4c: f7f0 f858 bl 8027d00 <GetInputFreqStr>
  77282. 8037c50: e028 b.n 8037ca4 <signals_get_object_def+0xfc>
  77283. od->access = MIB_OBJECT_READ_ONLY;
  77284. od->asn_type = SNMP_ASN1_OC_STR;
  77285. od->v_len = paramLength;
  77286. break;
  77287. case 12: /* InVoltVAC */
  77288. GetInputVoltageStr(paramStr, &paramLength);
  77289. 8037c52: 4d1a ldr r5, [pc, #104] ; (8037cbc <signals_get_object_def+0x114>)
  77290. 8037c54: 481a ldr r0, [pc, #104] ; (8037cc0 <signals_get_object_def+0x118>)
  77291. 8037c56: 4629 mov r1, r5
  77292. 8037c58: f7f0 f87e bl 8027d58 <GetInputVoltageStr>
  77293. 8037c5c: e022 b.n 8037ca4 <signals_get_object_def+0xfc>
  77294. od->access = MIB_OBJECT_READ_ONLY;
  77295. od->asn_type = SNMP_ASN1_OC_STR;
  77296. od->v_len = paramLength;
  77297. break;
  77298. case 13: /* OutVoltVAC */
  77299. GetOutputVoltageStr(paramStr, &paramLength);
  77300. 8037c5e: 4d17 ldr r5, [pc, #92] ; (8037cbc <signals_get_object_def+0x114>)
  77301. 8037c60: 4817 ldr r0, [pc, #92] ; (8037cc0 <signals_get_object_def+0x118>)
  77302. 8037c62: 4629 mov r1, r5
  77303. 8037c64: f7f0 f88e bl 8027d84 <GetOutputVoltageStr>
  77304. 8037c68: e01c b.n 8037ca4 <signals_get_object_def+0xfc>
  77305. od->access = MIB_OBJECT_READ_ONLY;
  77306. od->asn_type = SNMP_ASN1_OC_STR;
  77307. od->v_len = paramLength;
  77308. break;
  77309. case 14: /* Power */
  77310. GetPowerStr(paramStr, &paramLength);
  77311. 8037c6a: 4d14 ldr r5, [pc, #80] ; (8037cbc <signals_get_object_def+0x114>)
  77312. 8037c6c: 4814 ldr r0, [pc, #80] ; (8037cc0 <signals_get_object_def+0x118>)
  77313. 8037c6e: 4629 mov r1, r5
  77314. 8037c70: f7f0 f89e bl 8027db0 <GetPowerStr>
  77315. 8037c74: e016 b.n 8037ca4 <signals_get_object_def+0xfc>
  77316. od->access = MIB_OBJECT_READ_ONLY;
  77317. od->asn_type = SNMP_ASN1_OC_STR;
  77318. od->v_len = paramLength;
  77319. break;
  77320. case 15: /* BatCap */
  77321. GetBatCapacityStr(paramStr, &paramLength);
  77322. 8037c76: 4d11 ldr r5, [pc, #68] ; (8037cbc <signals_get_object_def+0x114>)
  77323. 8037c78: 4811 ldr r0, [pc, #68] ; (8037cc0 <signals_get_object_def+0x118>)
  77324. 8037c7a: 4629 mov r1, r5
  77325. 8037c7c: f7f0 f8aa bl 8027dd4 <GetBatCapacityStr>
  77326. 8037c80: e010 b.n 8037ca4 <signals_get_object_def+0xfc>
  77327. od->access = MIB_OBJECT_READ_ONLY;
  77328. od->asn_type = SNMP_ASN1_OC_STR;
  77329. od->v_len = paramLength;
  77330. break;
  77331. case 16: /* BatTime */
  77332. GetRuntimeStr(paramStr, &paramLength);
  77333. 8037c82: 4d0e ldr r5, [pc, #56] ; (8037cbc <signals_get_object_def+0x114>)
  77334. 8037c84: 480e ldr r0, [pc, #56] ; (8037cc0 <signals_get_object_def+0x118>)
  77335. 8037c86: 4629 mov r1, r5
  77336. 8037c88: f7f0 f8b6 bl 8027df8 <GetRuntimeStr>
  77337. 8037c8c: e00a b.n 8037ca4 <signals_get_object_def+0xfc>
  77338. od->access = MIB_OBJECT_READ_ONLY;
  77339. od->asn_type = SNMP_ASN1_OC_STR;
  77340. od->v_len = paramLength;
  77341. break;
  77342. case 17: /* ConnectMonitor */
  77343. GetConnectMonitorStr(paramStr, &paramLength);
  77344. 8037c8e: 4d0b ldr r5, [pc, #44] ; (8037cbc <signals_get_object_def+0x114>)
  77345. 8037c90: 480b ldr r0, [pc, #44] ; (8037cc0 <signals_get_object_def+0x118>)
  77346. 8037c92: 4629 mov r1, r5
  77347. 8037c94: f7f0 f8ea bl 8027e6c <GetConnectMonitorStr>
  77348. 8037c98: e004 b.n 8037ca4 <signals_get_object_def+0xfc>
  77349. od->access = MIB_OBJECT_READ_ONLY;
  77350. od->asn_type = SNMP_ASN1_OC_STR;
  77351. od->v_len = paramLength;
  77352. break;
  77353. case 18: /* Alarms */
  77354. GetAlarmStr(paramStr, &paramLength);
  77355. 8037c9a: 4d08 ldr r5, [pc, #32] ; (8037cbc <signals_get_object_def+0x114>)
  77356. 8037c9c: 4808 ldr r0, [pc, #32] ; (8037cc0 <signals_get_object_def+0x118>)
  77357. 8037c9e: 4629 mov r1, r5
  77358. 8037ca0: f7f0 f8fc bl 8027e9c <GetAlarmStr>
  77359. od->instance = MIB_OBJECT_SCALAR;
  77360. 8037ca4: 2301 movs r3, #1
  77361. 8037ca6: 7023 strb r3, [r4, #0]
  77362. od->access = MIB_OBJECT_READ_ONLY;
  77363. 8037ca8: 7063 strb r3, [r4, #1]
  77364. od->asn_type = SNMP_ASN1_OC_STR;
  77365. 8037caa: 2304 movs r3, #4
  77366. 8037cac: 70a3 strb r3, [r4, #2]
  77367. od->v_len = paramLength;
  77368. 8037cae: 782b ldrb r3, [r5, #0]
  77369. 8037cb0: 80a3 strh r3, [r4, #4]
  77370. break;
  77371. 8037cb2: bd38 pop {r3, r4, r5, pc}
  77372. };
  77373. }
  77374. else
  77375. {
  77376. LWIP_DEBUGF(SNMP_MIB_DEBUG,("planar_get_object_def: no scalar\n"));
  77377. od->instance = MIB_OBJECT_NONE;
  77378. 8037cb4: 2300 movs r3, #0
  77379. 8037cb6: 7023 strb r3, [r4, #0]
  77380. 8037cb8: bd38 pop {r3, r4, r5, pc}
  77381. 8037cba: bf00 nop
  77382. 8037cbc: 2000c83a .word 0x2000c83a
  77383. 8037cc0: 2001021c .word 0x2001021c
  77384. 08037cc4 <SNMP_SysUpTimeTask>:
  77385. /**
  77386. * @brief Системный тик SNMP. Таск должен вызываться с частотой 100Гц.
  77387. * @retval
  77388. */
  77389. void SNMP_SysUpTimeTask(void *arg)
  77390. {
  77391. 8037cc4: b513 push {r0, r1, r4, lr}
  77392. TickType_t xLastWakeTime;
  77393. const TickType_t xFrequency = 10;
  77394. xLastWakeTime = xTaskGetTickCount();
  77395. 8037cc6: f7f3 fdc1 bl 802b84c <xTaskGetTickCount>
  77396. 8037cca: ac02 add r4, sp, #8
  77397. 8037ccc: f844 0d04 str.w r0, [r4, #-4]!
  77398. while(1)
  77399. {
  77400. vTaskDelayUntil( &xLastWakeTime, xFrequency );
  77401. 8037cd0: 4620 mov r0, r4
  77402. 8037cd2: 210a movs r1, #10
  77403. 8037cd4: f7f3 ff1e bl 802bb14 <vTaskDelayUntil>
  77404. snmp_inc_sysuptime();
  77405. 8037cd8: f7fc fad2 bl 8034280 <snmp_inc_sysuptime>
  77406. 8037cdc: e7f8 b.n 8037cd0 <SNMP_SysUpTimeTask+0xc>
  77407. 8037cde: 0000 movs r0, r0
  77408. 08037ce0 <SNMP_SendUserTrap>:
  77409. * FIFO буфера.
  77410. * Если в настройках трапа отправка отключена, то трап игнорируется.
  77411. * @retval
  77412. */
  77413. void SNMP_SendUserTrap(uint8_t trapName)
  77414. {
  77415. 8037ce0: b51f push {r0, r1, r2, r3, r4, lr}
  77416. uint16_t availableSpace;
  77417. uint8_t dummyTrap;
  77418. if (traps[trapName].trapEnable)
  77419. 8037ce2: 4b0d ldr r3, [pc, #52] ; (8037d18 <SNMP_SendUserTrap+0x38>)
  77420. * FIFO буфера.
  77421. * Если в настройках трапа отправка отключена, то трап игнорируется.
  77422. * @retval
  77423. */
  77424. void SNMP_SendUserTrap(uint8_t trapName)
  77425. {
  77426. 8037ce4: f88d 0007 strb.w r0, [sp, #7]
  77427. uint16_t availableSpace;
  77428. uint8_t dummyTrap;
  77429. if (traps[trapName].trapEnable)
  77430. 8037ce8: eb03 00c0 add.w r0, r3, r0, lsl #3
  77431. 8037cec: 78c3 ldrb r3, [r0, #3]
  77432. 8037cee: b193 cbz r3, 8037d16 <SNMP_SendUserTrap+0x36>
  77433. {
  77434. availableSpace = uxQueueSpacesAvailable(SNMP_TrapQueue);
  77435. 8037cf0: 4c0a ldr r4, [pc, #40] ; (8037d1c <SNMP_SendUserTrap+0x3c>)
  77436. 8037cf2: 6820 ldr r0, [r4, #0]
  77437. 8037cf4: f7f3 fbdb bl 802b4ae <uxQueueSpacesAvailable>
  77438. if (availableSpace == 0)
  77439. 8037cf8: b282 uxth r2, r0
  77440. 8037cfa: b92a cbnz r2, 8037d08 <SNMP_SendUserTrap+0x28>
  77441. xQueueReceive(SNMP_TrapQueue, &dummyTrap, 0);
  77442. 8037cfc: 6820 ldr r0, [r4, #0]
  77443. 8037cfe: f10d 010f add.w r1, sp, #15
  77444. 8037d02: 4613 mov r3, r2
  77445. 8037d04: f7f3 fb30 bl 802b368 <xQueueGenericReceive>
  77446. xQueueSend(SNMP_TrapQueue, &trapName, 0);
  77447. 8037d08: 2200 movs r2, #0
  77448. 8037d0a: 6820 ldr r0, [r4, #0]
  77449. 8037d0c: f10d 0107 add.w r1, sp, #7
  77450. 8037d10: 4613 mov r3, r2
  77451. 8037d12: f7f3 f9e9 bl 802b0e8 <xQueueGenericSend>
  77452. }
  77453. }
  77454. 8037d16: bd1f pop {r0, r1, r2, r3, r4, pc}
  77455. 8037d18: 20010320 .word 0x20010320
  77456. 8037d1c: 2001031c .word 0x2001031c
  77457. 08037d20 <SNMP_SetObjDescr>:
  77458. * @brief Установить SNMP Descriptor
  77459. * @retval
  77460. */
  77461. // TODO
  77462. void SNMP_SetObjDescr(void)
  77463. {
  77464. 8037d20: b538 push {r3, r4, r5, lr}
  77465. static uint8_t len;
  77466. strcpy(sSettings.sSnmp.sysDescr, sSettings.sSnmp.sysName);
  77467. 8037d22: 4c19 ldr r4, [pc, #100] ; (8037d88 <SNMP_SetObjDescr+0x68>)
  77468. strcat(sSettings.sSnmp.sysDescr, " ");
  77469. 8037d24: 4d19 ldr r5, [pc, #100] ; (8037d8c <SNMP_SetObjDescr+0x6c>)
  77470. // TODO
  77471. void SNMP_SetObjDescr(void)
  77472. {
  77473. static uint8_t len;
  77474. strcpy(sSettings.sSnmp.sysDescr, sSettings.sSnmp.sysName);
  77475. 8037d26: f104 01fa add.w r1, r4, #250 ; 0xfa
  77476. 8037d2a: 4620 mov r0, r4
  77477. 8037d2c: f7ea f9ee bl 802210c <strcpy>
  77478. strcat(sSettings.sSnmp.sysDescr, " ");
  77479. 8037d30: 4629 mov r1, r5
  77480. 8037d32: 4620 mov r0, r4
  77481. 8037d34: f7ea f8d6 bl 8021ee4 <strcat>
  77482. strcat(sSettings.sSnmp.sysDescr, VERSION);
  77483. 8037d38: 4620 mov r0, r4
  77484. 8037d3a: 4915 ldr r1, [pc, #84] ; (8037d90 <SNMP_SetObjDescr+0x70>)
  77485. 8037d3c: f7ea f8d2 bl 8021ee4 <strcat>
  77486. strcat(sSettings.sSnmp.sysDescr, " ");
  77487. 8037d40: 4629 mov r1, r5
  77488. 8037d42: 4620 mov r0, r4
  77489. 8037d44: f7ea f8ce bl 8021ee4 <strcat>
  77490. strcat(sSettings.sSnmp.sysDescr, sSettings.sSnmp.sysContact);
  77491. 8037d48: f104 01c8 add.w r1, r4, #200 ; 0xc8
  77492. 8037d4c: 4620 mov r0, r4
  77493. 8037d4e: f7ea f8c9 bl 8021ee4 <strcat>
  77494. strcat(sSettings.sSnmp.sysDescr, " ");
  77495. 8037d52: 4629 mov r1, r5
  77496. 8037d54: 4620 mov r0, r4
  77497. 8037d56: f7ea f8c5 bl 8021ee4 <strcat>
  77498. strcat(sSettings.sSnmp.sysDescr, sSettings.sInfo.serialNumber);
  77499. 8037d5a: f1a4 0193 sub.w r1, r4, #147 ; 0x93
  77500. 8037d5e: 4620 mov r0, r4
  77501. 8037d60: f7ea f8c0 bl 8021ee4 <strcat>
  77502. strcat(sSettings.sSnmp.sysDescr, " ");
  77503. 8037d64: 4629 mov r1, r5
  77504. 8037d66: 4620 mov r0, r4
  77505. 8037d68: f7ea f8bc bl 8021ee4 <strcat>
  77506. strcat(sSettings.sSnmp.sysDescr, UPS.model);
  77507. 8037d6c: 4909 ldr r1, [pc, #36] ; (8037d94 <SNMP_SetObjDescr+0x74>)
  77508. 8037d6e: 4620 mov r0, r4
  77509. 8037d70: f7ea f8b8 bl 8021ee4 <strcat>
  77510. len = strlen(sSettings.sSnmp.sysDescr);
  77511. 8037d74: 4620 mov r0, r4
  77512. 8037d76: f7ea fa27 bl 80221c8 <strlen>
  77513. 8037d7a: 4907 ldr r1, [pc, #28] ; (8037d98 <SNMP_SetObjDescr+0x78>)
  77514. 8037d7c: 7008 strb r0, [r1, #0]
  77515. snmp_set_sysdesr((u8_t*)sSettings.sSnmp.sysDescr, &len);
  77516. 8037d7e: 4620 mov r0, r4
  77517. }
  77518. 8037d80: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr}
  77519. strcat(sSettings.sSnmp.sysDescr, sSettings.sInfo.serialNumber);
  77520. strcat(sSettings.sSnmp.sysDescr, " ");
  77521. strcat(sSettings.sSnmp.sysDescr, UPS.model);
  77522. len = strlen(sSettings.sSnmp.sysDescr);
  77523. snmp_set_sysdesr((u8_t*)sSettings.sSnmp.sysDescr, &len);
  77524. 8037d84: f7fc ba68 b.w 8034258 <snmp_set_sysdesr>
  77525. 8037d88: 2000d545 .word 0x2000d545
  77526. 8037d8c: 080392c9 .word 0x080392c9
  77527. 8037d90: 0803919c .word 0x0803919c
  77528. 8037d94: 2000d7ed .word 0x2000d7ed
  77529. 8037d98: 2000c83b .word 0x2000c83b
  77530. 08037d9c <SNMP_SetReadCommunity>:
  77531. /**
  77532. * @brief Установить SNMP Community для чтения
  77533. */
  77534. void SNMP_SetReadCommunity(char *comm)
  77535. {
  77536. 8037d9c: 4601 mov r1, r0
  77537. strcpy(sSettings.sSnmp.readCommunity, comm);
  77538. 8037d9e: 4801 ldr r0, [pc, #4] ; (8037da4 <SNMP_SetReadCommunity+0x8>)
  77539. 8037da0: f7ea b9b4 b.w 802210c <strcpy>
  77540. 8037da4: 2000d5e5 .word 0x2000d5e5
  77541. 08037da8 <SNMP_SetWriteCommunity>:
  77542. /**
  77543. * @brief Установить SNMP Community для записи
  77544. */
  77545. void SNMP_SetWriteCommunity(char *comm)
  77546. {
  77547. 8037da8: 4601 mov r1, r0
  77548. strcpy(sSettings.sSnmp.writeCommunity, comm);
  77549. 8037daa: 4801 ldr r0, [pc, #4] ; (8037db0 <SNMP_SetWriteCommunity+0x8>)
  77550. 8037dac: f7ea b9ae b.w 802210c <strcpy>
  77551. 8037db0: 2000d5f9 .word 0x2000d5f9
  77552. 08037db4 <SNMP_SetSysContact>:
  77553. /**
  77554. * @brief Установить SNMP SysContact
  77555. * @retval
  77556. */
  77557. void SNMP_SetSysContact(char *con)
  77558. {
  77559. 8037db4: b510 push {r4, lr}
  77560. 8037db6: 4604 mov r4, r0
  77561. static uint8_t len;
  77562. len = strlen(con);
  77563. 8037db8: f7ea fa06 bl 80221c8 <strlen>
  77564. 8037dbc: 4903 ldr r1, [pc, #12] ; (8037dcc <SNMP_SetSysContact+0x18>)
  77565. 8037dbe: 7008 strb r0, [r1, #0]
  77566. snmp_set_syscontact((u8_t*)con, &len);
  77567. 8037dc0: 4620 mov r0, r4
  77568. }
  77569. 8037dc2: e8bd 4010 ldmia.w sp!, {r4, lr}
  77570. void SNMP_SetSysContact(char *con)
  77571. {
  77572. static uint8_t len;
  77573. len = strlen(con);
  77574. snmp_set_syscontact((u8_t*)con, &len);
  77575. 8037dc6: f7fc baab b.w 8034320 <snmp_set_syscontact>
  77576. 8037dca: bf00 nop
  77577. 8037dcc: 2000c83d .word 0x2000c83d
  77578. 08037dd0 <SNMP_SetSysName>:
  77579. /**
  77580. * @brief Установить SNMP SysName
  77581. * @retval
  77582. */
  77583. void SNMP_SetSysName(char *name)
  77584. {
  77585. 8037dd0: b510 push {r4, lr}
  77586. 8037dd2: 4604 mov r4, r0
  77587. static uint8_t len;
  77588. len = strlen(name);
  77589. 8037dd4: f7ea f9f8 bl 80221c8 <strlen>
  77590. 8037dd8: 4903 ldr r1, [pc, #12] ; (8037de8 <SNMP_SetSysName+0x18>)
  77591. 8037dda: 7008 strb r0, [r1, #0]
  77592. snmp_set_sysname((u8_t*)name, &len);
  77593. 8037ddc: 4620 mov r0, r4
  77594. }
  77595. 8037dde: e8bd 4010 ldmia.w sp!, {r4, lr}
  77596. void SNMP_SetSysName(char *name)
  77597. {
  77598. static uint8_t len;
  77599. len = strlen(name);
  77600. snmp_set_sysname((u8_t*)name, &len);
  77601. 8037de2: f7fc baa7 b.w 8034334 <snmp_set_sysname>
  77602. 8037de6: bf00 nop
  77603. 8037de8: 2000c83c .word 0x2000c83c
  77604. 08037dec <SNMP_SetSysLocation>:
  77605. /**
  77606. * @brief Установить SNMP SysLocation
  77607. * @retval
  77608. */
  77609. void SNMP_SetSysLocation(char *loc)
  77610. {
  77611. 8037dec: b510 push {r4, lr}
  77612. 8037dee: 4604 mov r4, r0
  77613. static uint8_t len;
  77614. len = strlen(loc);
  77615. 8037df0: f7ea f9ea bl 80221c8 <strlen>
  77616. 8037df4: 4903 ldr r1, [pc, #12] ; (8037e04 <SNMP_SetSysLocation+0x18>)
  77617. 8037df6: 7008 strb r0, [r1, #0]
  77618. snmp_set_syslocation((u8_t*)loc, &len);
  77619. 8037df8: 4620 mov r0, r4
  77620. }
  77621. 8037dfa: e8bd 4010 ldmia.w sp!, {r4, lr}
  77622. void SNMP_SetSysLocation(char *loc)
  77623. {
  77624. static uint8_t len;
  77625. len = strlen(loc);
  77626. snmp_set_syslocation((u8_t*)loc, &len);
  77627. 8037dfe: f7fc baa3 b.w 8034348 <snmp_set_syslocation>
  77628. 8037e02: bf00 nop
  77629. 8037e04: 2000c83e .word 0x2000c83e
  77630. 08037e08 <SNMP_SetManagerIP>:
  77631. /**
  77632. * @brief Установить SNMP SysManagerIP
  77633. * @retval
  77634. */
  77635. void SNMP_SetManagerIP(char *ip)
  77636. {
  77637. 8037e08: b510 push {r4, lr}
  77638. static ip_addr_t trap_addr;
  77639. ipaddr_aton(ip, &trap_addr);
  77640. 8037e0a: 4c05 ldr r4, [pc, #20] ; (8037e20 <SNMP_SetManagerIP+0x18>)
  77641. 8037e0c: 4621 mov r1, r4
  77642. 8037e0e: f7fa fdee bl 80329ee <ipaddr_aton>
  77643. snmp_trap_dst_ip_set(0, &trap_addr);
  77644. 8037e12: 2000 movs r0, #0
  77645. 8037e14: 4621 mov r1, r4
  77646. }
  77647. 8037e16: e8bd 4010 ldmia.w sp!, {r4, lr}
  77648. void SNMP_SetManagerIP(char *ip)
  77649. {
  77650. static ip_addr_t trap_addr;
  77651. ipaddr_aton(ip, &trap_addr);
  77652. snmp_trap_dst_ip_set(0, &trap_addr);
  77653. 8037e1a: f7fe bba5 b.w 8036568 <snmp_trap_dst_ip_set>
  77654. 8037e1e: bf00 nop
  77655. 8037e20: 2000c840 .word 0x2000c840
  77656. 08037e24 <snmp_trap_tread>:
  77657. /**
  77658. * @brief Тестовый таск для проверки отправки трапов
  77659. * @retval
  77660. */
  77661. void snmp_trap_tread(void *arg)
  77662. {
  77663. 8037e24: b537 push {r0, r1, r2, r4, r5, lr}
  77664. uint8_t trapName;
  77665. while(1)
  77666. {
  77667. if (xQueueReceive(SNMP_TrapQueue, &trapName, 0) == pdTRUE)
  77668. 8037e26: 4d1c ldr r5, [pc, #112] ; (8037e98 <snmp_trap_tread+0x74>)
  77669. {
  77670. SNMP_SetManagerIP(sSettings.sSnmp.managerIP);
  77671. SNMP_SendVarbindTrap(&traps[trapName]);
  77672. 8037e28: 4c1c ldr r4, [pc, #112] ; (8037e9c <snmp_trap_tread+0x78>)
  77673. {
  77674. uint8_t trapName;
  77675. while(1)
  77676. {
  77677. if (xQueueReceive(SNMP_TrapQueue, &trapName, 0) == pdTRUE)
  77678. 8037e2a: 2200 movs r2, #0
  77679. 8037e2c: 6828 ldr r0, [r5, #0]
  77680. 8037e2e: f10d 0107 add.w r1, sp, #7
  77681. 8037e32: 4613 mov r3, r2
  77682. 8037e34: f7f3 fa98 bl 802b368 <xQueueGenericReceive>
  77683. 8037e38: 2801 cmp r0, #1
  77684. 8037e3a: d1f6 bne.n 8037e2a <snmp_trap_tread+0x6>
  77685. {
  77686. SNMP_SetManagerIP(sSettings.sSnmp.managerIP);
  77687. 8037e3c: 4818 ldr r0, [pc, #96] ; (8037ea0 <snmp_trap_tread+0x7c>)
  77688. 8037e3e: f7ff ffe3 bl 8037e08 <SNMP_SetManagerIP>
  77689. SNMP_SendVarbindTrap(&traps[trapName]);
  77690. 8037e42: f89d 0007 ldrb.w r0, [sp, #7]
  77691. 8037e46: eb04 00c0 add.w r0, r4, r0, lsl #3
  77692. 8037e4a: f000 fa41 bl 80382d0 <SNMP_SendVarbindTrap>
  77693. SNMP_SetManagerIP(sSettings.sSnmp.managerIP2);
  77694. 8037e4e: 4815 ldr r0, [pc, #84] ; (8037ea4 <snmp_trap_tread+0x80>)
  77695. 8037e50: f7ff ffda bl 8037e08 <SNMP_SetManagerIP>
  77696. SNMP_SendVarbindTrap(&traps[trapName]);
  77697. 8037e54: f89d 0007 ldrb.w r0, [sp, #7]
  77698. 8037e58: eb04 00c0 add.w r0, r4, r0, lsl #3
  77699. 8037e5c: f000 fa38 bl 80382d0 <SNMP_SendVarbindTrap>
  77700. SNMP_SetManagerIP(sSettings.sSnmp.managerIP3);
  77701. 8037e60: 4811 ldr r0, [pc, #68] ; (8037ea8 <snmp_trap_tread+0x84>)
  77702. 8037e62: f7ff ffd1 bl 8037e08 <SNMP_SetManagerIP>
  77703. SNMP_SendVarbindTrap(&traps[trapName]);
  77704. 8037e66: f89d 0007 ldrb.w r0, [sp, #7]
  77705. 8037e6a: eb04 00c0 add.w r0, r4, r0, lsl #3
  77706. 8037e6e: f000 fa2f bl 80382d0 <SNMP_SendVarbindTrap>
  77707. SNMP_SetManagerIP(sSettings.sSnmp.managerIP4);
  77708. 8037e72: 480e ldr r0, [pc, #56] ; (8037eac <snmp_trap_tread+0x88>)
  77709. 8037e74: f7ff ffc8 bl 8037e08 <SNMP_SetManagerIP>
  77710. SNMP_SendVarbindTrap(&traps[trapName]);
  77711. 8037e78: f89d 0007 ldrb.w r0, [sp, #7]
  77712. 8037e7c: eb04 00c0 add.w r0, r4, r0, lsl #3
  77713. 8037e80: f000 fa26 bl 80382d0 <SNMP_SendVarbindTrap>
  77714. SNMP_SetManagerIP(sSettings.sSnmp.managerIP5);
  77715. 8037e84: 480a ldr r0, [pc, #40] ; (8037eb0 <snmp_trap_tread+0x8c>)
  77716. 8037e86: f7ff ffbf bl 8037e08 <SNMP_SetManagerIP>
  77717. SNMP_SendVarbindTrap(&traps[trapName]);
  77718. 8037e8a: f89d 0007 ldrb.w r0, [sp, #7]
  77719. 8037e8e: eb04 00c0 add.w r0, r4, r0, lsl #3
  77720. 8037e92: f000 fa1d bl 80382d0 <SNMP_SendVarbindTrap>
  77721. 8037e96: e7c8 b.n 8037e2a <snmp_trap_tread+0x6>
  77722. 8037e98: 2001031c .word 0x2001031c
  77723. 8037e9c: 20010320 .word 0x20010320
  77724. 8037ea0: 2000d6c1 .word 0x2000d6c1
  77725. 8037ea4: 2000d6d5 .word 0x2000d6d5
  77726. 8037ea8: 2000d6e9 .word 0x2000d6e9
  77727. 8037eac: 2000d6fd .word 0x2000d6fd
  77728. 8037eb0: 2000d711 .word 0x2000d711
  77729. 08037eb4 <SNMP_SetObjID>:
  77730. */
  77731. void SNMP_SetObjID(void)
  77732. {
  77733. static struct snmp_obj_id my_object_id = {9, {1, 3, 6, 1, 4, 1, 41752, 911, 3}};
  77734. snmp_set_sysobjid(&my_object_id);
  77735. 8037eb4: 4801 ldr r0, [pc, #4] ; (8037ebc <SNMP_SetObjID+0x8>)
  77736. 8037eb6: f7fc b9d9 b.w 803426c <snmp_set_sysobjid>
  77737. 8037eba: bf00 nop
  77738. 8037ebc: 20000a40 .word 0x20000a40
  77739. 08037ec0 <SNMP_SetTrapOnOff>:
  77740. /**
  77741. * @brief Вкл/выкл трапы
  77742. * @retval
  77743. */
  77744. void SNMP_SetTrapOnOff(uint8_t state)
  77745. {
  77746. 8037ec0: 4601 mov r1, r0
  77747. snmp_trap_dst_enable(0, (u8_t)state);
  77748. 8037ec2: 2000 movs r0, #0
  77749. 8037ec4: f7fe bb4a b.w 803655c <snmp_trap_dst_enable>
  77750. 08037ec8 <SNMP_AgentInit>:
  77751. /**
  77752. * @brief Инициализация SNMP агента
  77753. * @retval
  77754. */
  77755. void SNMP_AgentInit(void)
  77756. {
  77757. 8037ec8: b510 push {r4, lr}
  77758. SNMP_SetObjDescr();
  77759. SNMP_SetReadCommunity(sSettings.sSnmp.readCommunity);
  77760. 8037eca: 4c16 ldr r4, [pc, #88] ; (8037f24 <SNMP_AgentInit+0x5c>)
  77761. * @brief Инициализация SNMP агента
  77762. * @retval
  77763. */
  77764. void SNMP_AgentInit(void)
  77765. {
  77766. SNMP_SetObjDescr();
  77767. 8037ecc: f7ff ff28 bl 8037d20 <SNMP_SetObjDescr>
  77768. SNMP_SetReadCommunity(sSettings.sSnmp.readCommunity);
  77769. 8037ed0: 4620 mov r0, r4
  77770. 8037ed2: f7ff ff63 bl 8037d9c <SNMP_SetReadCommunity>
  77771. SNMP_SetWriteCommunity(sSettings.sSnmp.writeCommunity);
  77772. 8037ed6: f104 0014 add.w r0, r4, #20
  77773. 8037eda: f7ff ff65 bl 8037da8 <SNMP_SetWriteCommunity>
  77774. SNMP_SetSysContact(sSettings.sSnmp.sysContact);
  77775. 8037ede: f104 0028 add.w r0, r4, #40 ; 0x28
  77776. 8037ee2: f7ff ff67 bl 8037db4 <SNMP_SetSysContact>
  77777. SNMP_SetSysName(sSettings.sSnmp.sysName);
  77778. 8037ee6: f104 005a add.w r0, r4, #90 ; 0x5a
  77779. 8037eea: f7ff ff71 bl 8037dd0 <SNMP_SetSysName>
  77780. SNMP_SetSysLocation(sSettings.sSnmp.sysLocation);
  77781. 8037eee: f104 006e add.w r0, r4, #110 ; 0x6e
  77782. 8037ef2: f7ff ff7b bl 8037dec <SNMP_SetSysLocation>
  77783. SNMP_SetManagerIP(sSettings.sSnmp.managerIP);
  77784. 8037ef6: f104 00dc add.w r0, r4, #220 ; 0xdc
  77785. 8037efa: f7ff ff85 bl 8037e08 <SNMP_SetManagerIP>
  77786. SNMP_SetObjID();
  77787. 8037efe: f7ff ffd9 bl 8037eb4 <SNMP_SetObjID>
  77788. SNMP_SetTrapOnOff(1);
  77789. 8037f02: 2001 movs r0, #1
  77790. 8037f04: f7ff ffdc bl 8037ec0 <SNMP_SetTrapOnOff>
  77791. SNMP_InitTrapsBase();
  77792. 8037f08: f000 f926 bl 8038158 <SNMP_InitTrapsBase>
  77793. snmp_init();
  77794. 8037f0c: f7fd fa04 bl 8035318 <snmp_init>
  77795. udp_init();
  77796. 8037f10: f7fa fa44 bl 803239c <udp_init>
  77797. SNMP_TrapQueue = xQueueCreate(SNMP_TRAP_QUEUE_SIZE, sizeof(uint8_t));
  77798. 8037f14: 2064 movs r0, #100 ; 0x64
  77799. 8037f16: 2101 movs r1, #1
  77800. 8037f18: 2200 movs r2, #0
  77801. 8037f1a: f7f3 f8a8 bl 802b06e <xQueueGenericCreate>
  77802. 8037f1e: 4b02 ldr r3, [pc, #8] ; (8037f28 <SNMP_AgentInit+0x60>)
  77803. 8037f20: 6018 str r0, [r3, #0]
  77804. 8037f22: bd10 pop {r4, pc}
  77805. 8037f24: 2000d5e5 .word 0x2000d5e5
  77806. 8037f28: 2001031c .word 0x2001031c
  77807. 08037f2c <SNMP_Init>:
  77808. * @retval
  77809. */
  77810. void SNMP_Init(void)
  77811. {
  77812. //SETTINGS_SetSnmpDef();
  77813. SNMP_AgentInit();
  77814. 8037f2c: f7ff bfcc b.w 8037ec8 <SNMP_AgentInit>
  77815. 08037f30 <recv>:
  77816. SNTP_Enable(sSettings.sSNTP.sntpEnable);
  77817. }
  77818. static void recv(void *arg, struct udp_pcb *upcb, struct pbuf *p,
  77819. struct ip_addr *addr, u16_t port)
  77820. {
  77821. 8037f30: b570 push {r4, r5, r6, lr}
  77822. 8037f32: 4616 mov r6, r2
  77823. time_t t;
  77824. int utcSec = 0;
  77825. TM_RTC_t data;
  77826. if (p->len == sizeof(struct sntp_packet))
  77827. 8037f34: 8952 ldrh r2, [r2, #10]
  77828. 8037f36: 2a30 cmp r2, #48 ; 0x30
  77829. SNTP_Enable(sSettings.sSNTP.sntpEnable);
  77830. }
  77831. static void recv(void *arg, struct udp_pcb *upcb, struct pbuf *p,
  77832. struct ip_addr *addr, u16_t port)
  77833. {
  77834. 8037f38: b094 sub sp, #80 ; 0x50
  77835. time_t t;
  77836. int utcSec = 0;
  77837. TM_RTC_t data;
  77838. if (p->len == sizeof(struct sntp_packet))
  77839. 8037f3a: d149 bne.n 8037fd0 <recv+0xa0>
  77840. {
  77841. int i;
  77842. struct sntp_packet aligned;
  77843. //myassert(p->len == p->tot_len); /* don't accept chained pbuf */
  77844. memcpy(&aligned, p->payload, sizeof(aligned));
  77845. 8037f3c: a808 add r0, sp, #32
  77846. 8037f3e: 6871 ldr r1, [r6, #4]
  77847. 8037f40: f7e9 feb0 bl 8021ca4 <memcpy>
  77848. i = (aligned.status >> 3) & 7;
  77849. 8037f44: f89d 3020 ldrb.w r3, [sp, #32]
  77850. if ((i < 1) || (i > 4)) /* SNTP version 1..4 */
  77851. 8037f48: f3c3 02c2 ubfx r2, r3, #3, #3
  77852. 8037f4c: 3a01 subs r2, #1
  77853. 8037f4e: 2a03 cmp r2, #3
  77854. 8037f50: d83e bhi.n 8037fd0 <recv+0xa0>
  77855. goto out;
  77856. i = aligned.status & 7;
  77857. if ((i != 4) && (i != 5)) /* mode 4 or 5: server or broadcast */
  77858. 8037f52: f003 0307 and.w r3, r3, #7
  77859. 8037f56: 3b04 subs r3, #4
  77860. 8037f58: 2b01 cmp r3, #1
  77861. 8037f5a: d839 bhi.n 8037fd0 <recv+0xa0>
  77862. goto out;
  77863. if (aligned.xmt == 0)
  77864. 8037f5c: e9dd 4512 ldrd r4, r5, [sp, #72] ; 0x48
  77865. 8037f60: ea54 0305 orrs.w r3, r4, r5
  77866. 8037f64: d034 beq.n 8037fd0 <recv+0xa0>
  77867. goto out;
  77868. utcSec = (int)(3600.0*sSettings.sSNTP.timeZone);
  77869. 8037f66: 4b20 ldr r3, [pc, #128] ; (8037fe8 <recv+0xb8>)
  77870. 8037f68: f8d3 0370 ldr.w r0, [r3, #880] ; 0x370
  77871. 8037f6c: f7e8 fb10 bl 8020590 <__aeabi_f2d>
  77872. 8037f70: a31b add r3, pc, #108 ; (adr r3, 8037fe0 <recv+0xb0>)
  77873. 8037f72: e9d3 2300 ldrd r2, r3, [r3]
  77874. 8037f76: f7e8 fb5f bl 8020638 <__aeabi_dmul>
  77875. 8037f7a: f7e8 fdf7 bl 8020b6c <__aeabi_d2iz>
  77876. 8037f7e: 4605 mov r5, r0
  77877. t = (ntohl(aligned.xmt) - 2208988800 + utcSec );
  77878. 8037f80: 4620 mov r0, r4
  77879. 8037f82: f7f6 fd4f bl 802ea24 <lwip_ntohl>
  77880. 8037f86: 4b19 ldr r3, [pc, #100] ; (8037fec <recv+0xbc>)
  77881. 8037f88: 18eb adds r3, r5, r3
  77882. TM_RTC_SetDataTimeUnix((uint32_t)t);
  77883. 8037f8a: 1818 adds r0, r3, r0
  77884. 8037f8c: f7ee fd78 bl 8026a80 <TM_RTC_SetDataTimeUnix>
  77885. /* Сохраним время последней синхронизации */
  77886. TM_RTC_GetDateTime(&data, TM_RTC_Format_BIN);
  77887. 8037f90: a804 add r0, sp, #16
  77888. 8037f92: 2100 movs r1, #0
  77889. 8037f94: f7ee fc56 bl 8026844 <TM_RTC_GetDateTime>
  77890. memset(sSettings.sSNTP.data, 0, sizeof(sSettings.sSNTP.data));
  77891. 8037f98: 2100 movs r1, #0
  77892. 8037f9a: 221e movs r2, #30
  77893. 8037f9c: 4814 ldr r0, [pc, #80] ; (8037ff0 <recv+0xc0>)
  77894. 8037f9e: f7e9 ff3b bl 8021e18 <memset>
  77895. sprintf(sSettings.sSNTP.data, "%02d.%02d.%02d %02d:%02d:%02d",
  77896. 8037fa2: f89d 1019 ldrb.w r1, [sp, #25]
  77897. 8037fa6: f89d 2017 ldrb.w r2, [sp, #23]
  77898. 8037faa: 9100 str r1, [sp, #0]
  77899. 8037fac: f89d 1015 ldrb.w r1, [sp, #21]
  77900. 8037fb0: f89d 3018 ldrb.w r3, [sp, #24]
  77901. 8037fb4: 9101 str r1, [sp, #4]
  77902. 8037fb6: f89d 1014 ldrb.w r1, [sp, #20]
  77903. 8037fba: 480d ldr r0, [pc, #52] ; (8037ff0 <recv+0xc0>)
  77904. 8037fbc: 9102 str r1, [sp, #8]
  77905. 8037fbe: f89d 1010 ldrb.w r1, [sp, #16]
  77906. 8037fc2: 9103 str r1, [sp, #12]
  77907. 8037fc4: 490b ldr r1, [pc, #44] ; (8037ff4 <recv+0xc4>)
  77908. 8037fc6: f7ef fe8f bl 8027ce8 <tfp_sprintf>
  77909. data.date, data.month, data.year,
  77910. data.hours, data.minutes, data.seconds);
  77911. timeout = VALID_TIMEOUT;
  77912. 8037fca: 4a0b ldr r2, [pc, #44] ; (8037ff8 <recv+0xc8>)
  77913. 8037fcc: 4b0b ldr r3, [pc, #44] ; (8037ffc <recv+0xcc>)
  77914. 8037fce: 601a str r2, [r3, #0]
  77915. }
  77916. out:
  77917. pbuf_free(p);
  77918. 8037fd0: 4630 mov r0, r6
  77919. 8037fd2: f7f7 fe59 bl 802fc88 <pbuf_free>
  77920. }
  77921. 8037fd6: b014 add sp, #80 ; 0x50
  77922. 8037fd8: bd70 pop {r4, r5, r6, pc}
  77923. 8037fda: bf00 nop
  77924. 8037fdc: f3af 8000 nop.w
  77925. 8037fe0: 00000000 .word 0x00000000
  77926. 8037fe4: 40ac2000 .word 0x40ac2000
  77927. 8037fe8: 2000d414 .word 0x2000d414
  77928. 8037fec: 7c558180 .word 0x7c558180
  77929. 8037ff0: 2000d765 .word 0x2000d765
  77930. 8037ff4: 08045220 .word 0x08045220
  77931. 8037ff8: 01b77400 .word 0x01b77400
  77932. 8037ffc: 2000c850 .word 0x2000c850
  77933. 08038000 <SNTP_Enable>:
  77934. void SNTP_Enable(bool enable)
  77935. {
  77936. 8038000: b538 push {r3, r4, r5, lr}
  77937. if (enable)
  77938. 8038002: 4605 mov r5, r0
  77939. 8038004: 4c0f ldr r4, [pc, #60] ; (8038044 <SNTP_Enable+0x44>)
  77940. 8038006: b1b8 cbz r0, 8038038 <SNTP_Enable+0x38>
  77941. {
  77942. if (upcb == 0)
  77943. 8038008: 6825 ldr r5, [r4, #0]
  77944. 803800a: b9d5 cbnz r5, 8038042 <SNTP_Enable+0x42>
  77945. {
  77946. err_t ret;
  77947. upcb = udp_new();
  77948. 803800c: f7fa fba4 bl 8032758 <udp_new>
  77949. 8038010: 6020 str r0, [r4, #0]
  77950. if (upcb != 0)
  77951. 8038012: b1b0 cbz r0, 8038042 <SNTP_Enable+0x42>
  77952. {
  77953. ret = udp_bind(upcb, IP_ADDR_ANY, port);
  77954. 8038014: 227b movs r2, #123 ; 0x7b
  77955. 8038016: 490c ldr r1, [pc, #48] ; (8038048 <SNTP_Enable+0x48>)
  77956. 8038018: f7fa fa86 bl 8032528 <udp_bind>
  77957. if (ret != ERR_OK)
  77958. 803801c: 4602 mov r2, r0
  77959. {
  77960. udp_remove(upcb);
  77961. 803801e: 6820 ldr r0, [r4, #0]
  77962. upcb = udp_new();
  77963. if (upcb != 0)
  77964. {
  77965. ret = udp_bind(upcb, IP_ADDR_ANY, port);
  77966. if (ret != ERR_OK)
  77967. 8038020: b11a cbz r2, 803802a <SNTP_Enable+0x2a>
  77968. {
  77969. udp_remove(upcb);
  77970. 8038022: f7fa fb7d bl 8032720 <udp_remove>
  77971. upcb = 0;
  77972. 8038026: 6025 str r5, [r4, #0]
  77973. 8038028: e002 b.n 8038030 <SNTP_Enable+0x30>
  77974. }
  77975. else
  77976. {
  77977. udp_recv(upcb, recv, 0);
  77978. 803802a: 4908 ldr r1, [pc, #32] ; (803804c <SNTP_Enable+0x4c>)
  77979. 803802c: f7fa fb74 bl 8032718 <udp_recv>
  77980. }
  77981. timeout = 0;
  77982. 8038030: 4b07 ldr r3, [pc, #28] ; (8038050 <SNTP_Enable+0x50>)
  77983. 8038032: 2200 movs r2, #0
  77984. 8038034: 601a str r2, [r3, #0]
  77985. 8038036: bd38 pop {r3, r4, r5, pc}
  77986. }
  77987. }
  77988. }
  77989. else if (upcb != 0)
  77990. 8038038: 6820 ldr r0, [r4, #0]
  77991. 803803a: b110 cbz r0, 8038042 <SNTP_Enable+0x42>
  77992. {
  77993. udp_remove(upcb);
  77994. 803803c: f7fa fb70 bl 8032720 <udp_remove>
  77995. upcb = 0;
  77996. 8038040: 6025 str r5, [r4, #0]
  77997. 8038042: bd38 pop {r3, r4, r5, pc}
  77998. 8038044: 2000c84c .word 0x2000c84c
  77999. 8038048: 08044744 .word 0x08044744
  78000. 803804c: 08037f31 .word 0x08037f31
  78001. 8038050: 2000c850 .word 0x2000c850
  78002. 08038054 <SNTP_SetServerAddr>:
  78003. {
  78004. return upcb != 0;
  78005. }
  78006. void SNTP_SetServerAddr(char *addr)
  78007. {
  78008. 8038054: b508 push {r3, lr}
  78009. server.addr = ipaddr_addr(addr);
  78010. 8038056: f7fa fd48 bl 8032aea <ipaddr_addr>
  78011. 803805a: 4b01 ldr r3, [pc, #4] ; (8038060 <SNTP_SetServerAddr+0xc>)
  78012. 803805c: 6018 str r0, [r3, #0]
  78013. 803805e: bd08 pop {r3, pc}
  78014. 8038060: 2000c844 .word 0x2000c844
  78015. 08038064 <SNTP_Init>:
  78016. /**
  78017. * @brief Инициализация SNTP.
  78018. * @retval
  78019. */
  78020. void SNTP_Init(void)
  78021. {
  78022. 8038064: b508 push {r3, lr}
  78023. SNTP_SetServerAddr(sSettings.sSNTP.ip);
  78024. 8038066: 4805 ldr r0, [pc, #20] ; (803807c <SNTP_Init+0x18>)
  78025. 8038068: f7ff fff4 bl 8038054 <SNTP_SetServerAddr>
  78026. SNTP_Enable(sSettings.sSNTP.sntpEnable);
  78027. 803806c: 4b04 ldr r3, [pc, #16] ; (8038080 <SNTP_Init+0x1c>)
  78028. 803806e: f893 0340 ldrb.w r0, [r3, #832] ; 0x340
  78029. }
  78030. 8038072: e8bd 4008 ldmia.w sp!, {r3, lr}
  78031. void SNTP_Init(void)
  78032. {
  78033. SNTP_SetServerAddr(sSettings.sSNTP.ip);
  78034. SNTP_Enable(sSettings.sSNTP.sntpEnable);
  78035. 8038076: f7ff bfc3 b.w 8038000 <SNTP_Enable>
  78036. 803807a: bf00 nop
  78037. 803807c: 2000d755 .word 0x2000d755
  78038. 8038080: 2000d414 .word 0x2000d414
  78039. 08038084 <SNTP_Poll>:
  78040. pbuf_free(psend);
  78041. }
  78042. }
  78043. void SNTP_Poll(void)
  78044. {
  78045. 8038084: b530 push {r4, r5, lr}
  78046. if (upcb)
  78047. 8038086: 4d15 ldr r5, [pc, #84] ; (80380dc <SNTP_Poll+0x58>)
  78048. 8038088: 682b ldr r3, [r5, #0]
  78049. pbuf_free(psend);
  78050. }
  78051. }
  78052. void SNTP_Poll(void)
  78053. {
  78054. 803808a: b08d sub sp, #52 ; 0x34
  78055. if (upcb)
  78056. 803808c: b31b cbz r3, 80380d6 <SNTP_Poll+0x52>
  78057. static void send_request(void)
  78058. {
  78059. struct sntp_packet packet;
  78060. struct pbuf* psend;
  78061. memset(&packet, 0, sizeof(packet));
  78062. 803808e: 2100 movs r1, #0
  78063. 8038090: 2230 movs r2, #48 ; 0x30
  78064. 8038092: 4668 mov r0, sp
  78065. 8038094: f7e9 fec0 bl 8021e18 <memset>
  78066. packet.status = (3 << 3) /* SNTP vesion 3 */ | (3 << 0); /* Mode: client */
  78067. 8038098: 231b movs r3, #27
  78068. psend = pbuf_alloc(PBUF_RAW, sizeof(packet), PBUF_REF);
  78069. 803809a: 2003 movs r0, #3
  78070. 803809c: 2130 movs r1, #48 ; 0x30
  78071. 803809e: 2202 movs r2, #2
  78072. static void send_request(void)
  78073. {
  78074. struct sntp_packet packet;
  78075. struct pbuf* psend;
  78076. memset(&packet, 0, sizeof(packet));
  78077. packet.status = (3 << 3) /* SNTP vesion 3 */ | (3 << 0); /* Mode: client */
  78078. 80380a0: f88d 3000 strb.w r3, [sp]
  78079. psend = pbuf_alloc(PBUF_RAW, sizeof(packet), PBUF_REF);
  78080. 80380a4: f7f7 fe3d bl 802fd22 <pbuf_alloc>
  78081. if (psend != 0)
  78082. 80380a8: 4604 mov r4, r0
  78083. 80380aa: b1a0 cbz r0, 80380d6 <SNTP_Poll+0x52>
  78084. {
  78085. psend->payload = &packet;
  78086. 80380ac: ab00 add r3, sp, #0
  78087. 80380ae: 6043 str r3, [r0, #4]
  78088. timeout = (udp_sendto(upcb, psend, &server, port) == ERR_OK) ? SENT_TIMEOUT : SENDFAIL_TIMEOUT;
  78089. 80380b0: 4621 mov r1, r4
  78090. 80380b2: 4a0b ldr r2, [pc, #44] ; (80380e0 <SNTP_Poll+0x5c>)
  78091. 80380b4: 6828 ldr r0, [r5, #0]
  78092. 80380b6: 237b movs r3, #123 ; 0x7b
  78093. 80380b8: f7fa fae7 bl 803268a <udp_sendto>
  78094. 80380bc: f64e 2360 movw r3, #60000 ; 0xea60
  78095. 80380c0: f241 3288 movw r2, #5000 ; 0x1388
  78096. 80380c4: 4907 ldr r1, [pc, #28] ; (80380e4 <SNTP_Poll+0x60>)
  78097. 80380c6: 2800 cmp r0, #0
  78098. 80380c8: bf14 ite ne
  78099. 80380ca: 4610 movne r0, r2
  78100. 80380cc: 4618 moveq r0, r3
  78101. 80380ce: 6008 str r0, [r1, #0]
  78102. pbuf_free(psend);
  78103. 80380d0: 4620 mov r0, r4
  78104. 80380d2: f7f7 fdd9 bl 802fc88 <pbuf_free>
  78105. void SNTP_Poll(void)
  78106. {
  78107. if (upcb)
  78108. send_request();
  78109. }
  78110. 80380d6: b00d add sp, #52 ; 0x34
  78111. 80380d8: bd30 pop {r4, r5, pc}
  78112. 80380da: bf00 nop
  78113. 80380dc: 2000c84c .word 0x2000c84c
  78114. 80380e0: 2000c844 .word 0x2000c844
  78115. 80380e4: 2000c850 .word 0x2000c850
  78116. 080380e8 <vTaskPeriodicSynchro>:
  78117. * @brief Периодическая синхронизация времени.
  78118. * Выполняется раз в сутки с 0 часов.
  78119. * @retval
  78120. */
  78121. void vTaskPeriodicSynchro(void *arg)
  78122. {
  78123. 80380e8: b530 push {r4, r5, lr}
  78124. static uint8_t fSinhro = 0;
  78125. for (;;)
  78126. {
  78127. vTaskDelay(10000);
  78128. if (sSettings.sSNTP.sntpEnable)
  78129. 80380ea: 4d0f ldr r5, [pc, #60] ; (8038128 <vTaskPeriodicSynchro+0x40>)
  78130. fSinhro = 1;
  78131. //printf("Periodic time sinhro\n\r");
  78132. }
  78133. if (data.hours > 1)
  78134. fSinhro = 0;
  78135. 80380ec: 4c0f ldr r4, [pc, #60] ; (803812c <vTaskPeriodicSynchro+0x44>)
  78136. * @brief Периодическая синхронизация времени.
  78137. * Выполняется раз в сутки с 0 часов.
  78138. * @retval
  78139. */
  78140. void vTaskPeriodicSynchro(void *arg)
  78141. {
  78142. 80380ee: b085 sub sp, #20
  78143. static uint8_t fSinhro = 0;
  78144. for (;;)
  78145. {
  78146. vTaskDelay(10000);
  78147. 80380f0: f242 7010 movw r0, #10000 ; 0x2710
  78148. 80380f4: f7f3 fcdc bl 802bab0 <vTaskDelay>
  78149. if (sSettings.sSNTP.sntpEnable)
  78150. 80380f8: f895 3340 ldrb.w r3, [r5, #832] ; 0x340
  78151. 80380fc: 2b00 cmp r3, #0
  78152. 80380fe: d0f7 beq.n 80380f0 <vTaskPeriodicSynchro+0x8>
  78153. {
  78154. TM_RTC_GetDateTime(&data, TM_RTC_Format_BIN);
  78155. 8038100: 4668 mov r0, sp
  78156. 8038102: 2100 movs r1, #0
  78157. 8038104: f7ee fb9e bl 8026844 <TM_RTC_GetDateTime>
  78158. /* Если пришло время синхронизации */
  78159. if ((data.hours == 0) && (fSinhro == 0))
  78160. 8038108: f89d 3005 ldrb.w r3, [sp, #5]
  78161. 803810c: b92b cbnz r3, 803811a <vTaskPeriodicSynchro+0x32>
  78162. 803810e: 7823 ldrb r3, [r4, #0]
  78163. 8038110: b91b cbnz r3, 803811a <vTaskPeriodicSynchro+0x32>
  78164. {
  78165. SNTP_Poll();
  78166. 8038112: f7ff ffb7 bl 8038084 <SNTP_Poll>
  78167. fSinhro = 1;
  78168. 8038116: 2301 movs r3, #1
  78169. 8038118: 7023 strb r3, [r4, #0]
  78170. //printf("Periodic time sinhro\n\r");
  78171. }
  78172. if (data.hours > 1)
  78173. 803811a: f89d 3005 ldrb.w r3, [sp, #5]
  78174. 803811e: 2b01 cmp r3, #1
  78175. 8038120: d9e6 bls.n 80380f0 <vTaskPeriodicSynchro+0x8>
  78176. fSinhro = 0;
  78177. 8038122: 2300 movs r3, #0
  78178. 8038124: 7023 strb r3, [r4, #0]
  78179. 8038126: e7e3 b.n 80380f0 <vTaskPeriodicSynchro+0x8>
  78180. 8038128: 2000d414 .word 0x2000d414
  78181. 803812c: 2000c848 .word 0x2000c848
  78182. 08038130 <vTaskOnceSynchro>:
  78183. /**
  78184. * @brief Синхронизация времени единоразово при включении контроллера
  78185. * @retval
  78186. */
  78187. void vTaskOnceSynchro(void *arg)
  78188. {
  78189. 8038130: b538 push {r3, r4, r5, lr}
  78190. for (;;)
  78191. {
  78192. if (sSettings.sSNTP.sntpEnable)
  78193. 8038132: 4d07 ldr r5, [pc, #28] ; (8038150 <vTaskOnceSynchro+0x20>)
  78194. 8038134: 4c07 ldr r4, [pc, #28] ; (8038154 <vTaskOnceSynchro+0x24>)
  78195. 8038136: f895 3340 ldrb.w r3, [r5, #832] ; 0x340
  78196. 803813a: b12b cbz r3, 8038148 <vTaskOnceSynchro+0x18>
  78197. {
  78198. vTaskDelay(7000);
  78199. 803813c: f641 3058 movw r0, #7000 ; 0x1b58
  78200. 8038140: f7f3 fcb6 bl 802bab0 <vTaskDelay>
  78201. SNTP_Poll();
  78202. 8038144: f7ff ff9e bl 8038084 <SNTP_Poll>
  78203. //printf("Once time sinhro\n\r");
  78204. vTaskDelete(xHandleSntpOnceSinhro);
  78205. }
  78206. else
  78207. vTaskDelete(xHandleSntpOnceSinhro);
  78208. 8038148: 6820 ldr r0, [r4, #0]
  78209. 803814a: f7f3 faef bl 802b72c <vTaskDelete>
  78210. 803814e: e7f2 b.n 8038136 <vTaskOnceSynchro+0x6>
  78211. 8038150: 2000d414 .word 0x2000d414
  78212. 8038154: 20000b20 .word 0x20000b20
  78213. 08038158 <SNMP_InitTrapsBase>:
  78214. * @retval
  78215. */
  78216. void SNMP_InitTrapsBase(void)
  78217. {
  78218. /* 1. FWVersionUpdate */ // +
  78219. traps[FW_VERSION_UPDATE].trapId = FW_VERSION_UPDATE;
  78220. 8038158: 4b53 ldr r3, [pc, #332] ; (80382a8 <SNMP_InitTrapsBase+0x150>)
  78221. traps[FW_VERSION_UPDATE].varbindId = 1;
  78222. traps[FW_VERSION_UPDATE].trapEnable = true;
  78223. traps[FW_VERSION_UPDATE].handle = GetVersionStr; /* FWVersion */
  78224. 803815a: 4954 ldr r1, [pc, #336] ; (80382ac <SNMP_InitTrapsBase+0x154>)
  78225. /* 2. FWVersionUpdated */ // +
  78226. traps[FW_VERSION_UPDATED].trapId = FW_VERSION_UPDATED;
  78227. 803815c: 2002 movs r0, #2
  78228. /**
  78229. * @brief Инициализация базы трапов
  78230. * @retval
  78231. */
  78232. void SNMP_InitTrapsBase(void)
  78233. {
  78234. 803815e: b570 push {r4, r5, r6, lr}
  78235. traps[FW_VERSION_UPDATE].varbindId = 1;
  78236. traps[FW_VERSION_UPDATE].trapEnable = true;
  78237. traps[FW_VERSION_UPDATE].handle = GetVersionStr; /* FWVersion */
  78238. /* 2. FWVersionUpdated */ // +
  78239. traps[FW_VERSION_UPDATED].trapId = FW_VERSION_UPDATED;
  78240. 8038160: 7458 strb r0, [r3, #17]
  78241. traps[FW_VERSION_UPDATED].varbindId = 1;
  78242. traps[FW_VERSION_UPDATED].trapEnable = true;
  78243. traps[FW_VERSION_UPDATED].handle = GetVersionStr; /* FWVersion */
  78244. /* 3. DeviceRestored */ // +
  78245. traps[DEVICE_RESTORED].trapId = DEVICE_RESTORED;
  78246. 8038162: 2003 movs r0, #3
  78247. 8038164: 7658 strb r0, [r3, #25]
  78248. traps[DEVICE_RESTORED].varbindId = 1;
  78249. traps[DEVICE_RESTORED].trapEnable = true;
  78250. traps[DEVICE_RESTORED].handle = GetVersionStr;//GetRestore; /* RestoreSignal */
  78251. /* 4. DeviceRebooted */ // +
  78252. traps[DEVICE_REBOOTED].trapId = DEVICE_REBOOTED;
  78253. 8038166: 2004 movs r0, #4
  78254. traps[DEVICE_REBOOTED].varbindId = 1;
  78255. traps[DEVICE_REBOOTED].trapEnable = true;
  78256. traps[DEVICE_REBOOTED].handle = GetVersionStr;//GetReboot; /* RebootSignal */
  78257. /* 5. DI0Norm */ // +
  78258. traps[DI0_NORM].trapId = DI0_NORM;
  78259. 8038168: 2405 movs r4, #5
  78260. traps[DEVICE_RESTORED].varbindId = 1;
  78261. traps[DEVICE_RESTORED].trapEnable = true;
  78262. traps[DEVICE_RESTORED].handle = GetVersionStr;//GetRestore; /* RestoreSignal */
  78263. /* 4. DeviceRebooted */ // +
  78264. traps[DEVICE_REBOOTED].trapId = DEVICE_REBOOTED;
  78265. 803816a: f883 0021 strb.w r0, [r3, #33] ; 0x21
  78266. traps[DI0_NORM].varbindId = 9;
  78267. traps[DI0_NORM].trapEnable = true;
  78268. traps[DI0_NORM].handle = GetDIN0StatusStr; /* State DIN */
  78269. /* 6. DI0Alarm */ // +
  78270. traps[DI0_ALARM].trapId = DI0_ALARM;
  78271. 803816e: 2006 movs r0, #6
  78272. /* 5. DI0Norm */ // +
  78273. traps[DI0_NORM].trapId = DI0_NORM;
  78274. traps[DI0_NORM].varbindId = 9;
  78275. traps[DI0_NORM].trapEnable = true;
  78276. traps[DI0_NORM].handle = GetDIN0StatusStr; /* State DIN */
  78277. 8038170: 4d4f ldr r5, [pc, #316] ; (80382b0 <SNMP_InitTrapsBase+0x158>)
  78278. traps[DEVICE_REBOOTED].varbindId = 1;
  78279. traps[DEVICE_REBOOTED].trapEnable = true;
  78280. traps[DEVICE_REBOOTED].handle = GetVersionStr;//GetReboot; /* RebootSignal */
  78281. /* 5. DI0Norm */ // +
  78282. traps[DI0_NORM].trapId = DI0_NORM;
  78283. 8038172: f883 4029 strb.w r4, [r3, #41] ; 0x29
  78284. traps[DI0_NORM].varbindId = 9;
  78285. traps[DI0_NORM].trapEnable = true;
  78286. traps[DI0_NORM].handle = GetDIN0StatusStr; /* State DIN */
  78287. /* 6. DI0Alarm */ // +
  78288. traps[DI0_ALARM].trapId = DI0_ALARM;
  78289. 8038176: f883 0031 strb.w r0, [r3, #49] ; 0x31
  78290. traps[DI0_ALARM].trapEnable = true;
  78291. traps[DI0_ALARM].handle = GetDIN0StatusStr; /* State DIN */
  78292. /* 7. DO0Toggle */ // +
  78293. traps[DO0_TOGGLED].trapId = DO0_TOGGLED;
  78294. traps[DO0_TOGGLED].varbindId = 5;
  78295. 803817a: f883 403a strb.w r4, [r3, #58] ; 0x3a
  78296. traps[DO0_TOGGLED].trapEnable = true;
  78297. traps[DO0_TOGGLED].handle = GetDOUT0StatusStr; /* State DO0 */
  78298. /* 8. DO1Toggle */ // +
  78299. traps[DO1_TOGGLED].trapId = DO1_TOGGLED;
  78300. traps[DO1_TOGGLED].varbindId = 6;
  78301. 803817e: f883 0042 strb.w r0, [r3, #66] ; 0x42
  78302. /* 7. DO0Toggle */ // +
  78303. traps[DO0_TOGGLED].trapId = DO0_TOGGLED;
  78304. traps[DO0_TOGGLED].varbindId = 5;
  78305. traps[DO0_TOGGLED].trapEnable = true;
  78306. traps[DO0_TOGGLED].handle = GetDOUT0StatusStr; /* State DO0 */
  78307. 8038182: 4c4c ldr r4, [pc, #304] ; (80382b4 <SNMP_InitTrapsBase+0x15c>)
  78308. /* 8. DO1Toggle */ // +
  78309. traps[DO1_TOGGLED].trapId = DO1_TOGGLED;
  78310. traps[DO1_TOGGLED].varbindId = 6;
  78311. traps[DO1_TOGGLED].trapEnable = true;
  78312. traps[DO1_TOGGLED].handle = GetDOUT1StatusStr; /* State DO1 */
  78313. 8038184: 484c ldr r0, [pc, #304] ; (80382b8 <SNMP_InitTrapsBase+0x160>)
  78314. {
  78315. /* 1. FWVersionUpdate */ // +
  78316. traps[FW_VERSION_UPDATE].trapId = FW_VERSION_UPDATE;
  78317. traps[FW_VERSION_UPDATE].varbindId = 1;
  78318. traps[FW_VERSION_UPDATE].trapEnable = true;
  78319. traps[FW_VERSION_UPDATE].handle = GetVersionStr; /* FWVersion */
  78320. 8038186: 60d9 str r1, [r3, #12]
  78321. * @retval
  78322. */
  78323. void SNMP_InitTrapsBase(void)
  78324. {
  78325. /* 1. FWVersionUpdate */ // +
  78326. traps[FW_VERSION_UPDATE].trapId = FW_VERSION_UPDATE;
  78327. 8038188: 2201 movs r2, #1
  78328. /* 2. FWVersionUpdated */ // +
  78329. traps[FW_VERSION_UPDATED].trapId = FW_VERSION_UPDATED;
  78330. traps[FW_VERSION_UPDATED].varbindId = 1;
  78331. traps[FW_VERSION_UPDATED].trapEnable = true;
  78332. traps[FW_VERSION_UPDATED].handle = GetVersionStr; /* FWVersion */
  78333. 803818a: 6159 str r1, [r3, #20]
  78334. /* 3. DeviceRestored */ // +
  78335. traps[DEVICE_RESTORED].trapId = DEVICE_RESTORED;
  78336. traps[DEVICE_RESTORED].varbindId = 1;
  78337. traps[DEVICE_RESTORED].trapEnable = true;
  78338. traps[DEVICE_RESTORED].handle = GetVersionStr;//GetRestore; /* RestoreSignal */
  78339. 803818c: 61d9 str r1, [r3, #28]
  78340. /* 4. DeviceRebooted */ // +
  78341. traps[DEVICE_REBOOTED].trapId = DEVICE_REBOOTED;
  78342. traps[DEVICE_REBOOTED].varbindId = 1;
  78343. traps[DEVICE_REBOOTED].trapEnable = true;
  78344. traps[DEVICE_REBOOTED].handle = GetVersionStr;//GetReboot; /* RebootSignal */
  78345. 803818e: 6259 str r1, [r3, #36] ; 0x24
  78346. /* 5. DI0Norm */ // +
  78347. traps[DI0_NORM].trapId = DI0_NORM;
  78348. traps[DI0_NORM].varbindId = 9;
  78349. traps[DI0_NORM].trapEnable = true;
  78350. traps[DI0_NORM].handle = GetDIN0StatusStr; /* State DIN */
  78351. 8038190: 62dd str r5, [r3, #44] ; 0x2c
  78352. traps[DEVICE_REBOOTED].trapEnable = true;
  78353. traps[DEVICE_REBOOTED].handle = GetVersionStr;//GetReboot; /* RebootSignal */
  78354. /* 5. DI0Norm */ // +
  78355. traps[DI0_NORM].trapId = DI0_NORM;
  78356. traps[DI0_NORM].varbindId = 9;
  78357. 8038192: 2109 movs r1, #9
  78358. /* 6. DI0Alarm */ // +
  78359. traps[DI0_ALARM].trapId = DI0_ALARM;
  78360. traps[DI0_ALARM].varbindId = 9;
  78361. traps[DI0_ALARM].trapEnable = true;
  78362. traps[DI0_ALARM].handle = GetDIN0StatusStr; /* State DIN */
  78363. 8038194: 635d str r5, [r3, #52] ; 0x34
  78364. /* 7. DO0Toggle */ // +
  78365. traps[DO0_TOGGLED].trapId = DO0_TOGGLED;
  78366. traps[DO0_TOGGLED].varbindId = 5;
  78367. traps[DO0_TOGGLED].trapEnable = true;
  78368. traps[DO0_TOGGLED].handle = GetDOUT0StatusStr; /* State DO0 */
  78369. 8038196: 63dc str r4, [r3, #60] ; 0x3c
  78370. traps[DI0_ALARM].varbindId = 9;
  78371. traps[DI0_ALARM].trapEnable = true;
  78372. traps[DI0_ALARM].handle = GetDIN0StatusStr; /* State DIN */
  78373. /* 7. DO0Toggle */ // +
  78374. traps[DO0_TOGGLED].trapId = DO0_TOGGLED;
  78375. 8038198: 2507 movs r5, #7
  78376. traps[DO0_TOGGLED].varbindId = 5;
  78377. traps[DO0_TOGGLED].trapEnable = true;
  78378. traps[DO0_TOGGLED].handle = GetDOUT0StatusStr; /* State DO0 */
  78379. /* 8. DO1Toggle */ // +
  78380. traps[DO1_TOGGLED].trapId = DO1_TOGGLED;
  78381. 803819a: 2408 movs r4, #8
  78382. traps[DO1_TOGGLED].varbindId = 6;
  78383. traps[DO1_TOGGLED].trapEnable = true;
  78384. traps[DO1_TOGGLED].handle = GetDOUT1StatusStr; /* State DO1 */
  78385. 803819c: 6458 str r0, [r3, #68] ; 0x44
  78386. /* 9. BatteryTemperatureNorm */ // +
  78387. traps[BATTERY_TEMPERATURE_NORM].trapId = BATTERY_TEMPERATURE_NORM;
  78388. traps[BATTERY_TEMPERATURE_NORM].varbindId = 10;
  78389. traps[BATTERY_TEMPERATURE_NORM].trapEnable = true;
  78390. traps[BATTERY_TEMPERATURE_NORM].handle = GetInternalTempStr; /* BatteryTemperature */
  78391. 803819e: 4847 ldr r0, [pc, #284] ; (80382bc <SNMP_InitTrapsBase+0x164>)
  78392. traps[DEVICE_REBOOTED].trapEnable = true;
  78393. traps[DEVICE_REBOOTED].handle = GetVersionStr;//GetReboot; /* RebootSignal */
  78394. /* 5. DI0Norm */ // +
  78395. traps[DI0_NORM].trapId = DI0_NORM;
  78396. traps[DI0_NORM].varbindId = 9;
  78397. 80381a0: f883 102a strb.w r1, [r3, #42] ; 0x2a
  78398. traps[DI0_NORM].trapEnable = true;
  78399. traps[DI0_NORM].handle = GetDIN0StatusStr; /* State DIN */
  78400. /* 6. DI0Alarm */ // +
  78401. traps[DI0_ALARM].trapId = DI0_ALARM;
  78402. traps[DI0_ALARM].varbindId = 9;
  78403. 80381a4: f883 1032 strb.w r1, [r3, #50] ; 0x32
  78404. traps[DI0_ALARM].trapEnable = true;
  78405. traps[DI0_ALARM].handle = GetDIN0StatusStr; /* State DIN */
  78406. /* 7. DO0Toggle */ // +
  78407. traps[DO0_TOGGLED].trapId = DO0_TOGGLED;
  78408. 80381a8: f883 5039 strb.w r5, [r3, #57] ; 0x39
  78409. traps[DO0_TOGGLED].varbindId = 5;
  78410. traps[DO0_TOGGLED].trapEnable = true;
  78411. traps[DO0_TOGGLED].handle = GetDOUT0StatusStr; /* State DO0 */
  78412. /* 8. DO1Toggle */ // +
  78413. traps[DO1_TOGGLED].trapId = DO1_TOGGLED;
  78414. 80381ac: f883 4041 strb.w r4, [r3, #65] ; 0x41
  78415. * @retval
  78416. */
  78417. void SNMP_InitTrapsBase(void)
  78418. {
  78419. /* 1. FWVersionUpdate */ // +
  78420. traps[FW_VERSION_UPDATE].trapId = FW_VERSION_UPDATE;
  78421. 80381b0: 725a strb r2, [r3, #9]
  78422. traps[FW_VERSION_UPDATE].varbindId = 1;
  78423. 80381b2: 729a strb r2, [r3, #10]
  78424. traps[FW_VERSION_UPDATE].trapEnable = true;
  78425. 80381b4: 72da strb r2, [r3, #11]
  78426. traps[FW_VERSION_UPDATE].handle = GetVersionStr; /* FWVersion */
  78427. /* 2. FWVersionUpdated */ // +
  78428. traps[FW_VERSION_UPDATED].trapId = FW_VERSION_UPDATED;
  78429. traps[FW_VERSION_UPDATED].varbindId = 1;
  78430. 80381b6: 749a strb r2, [r3, #18]
  78431. traps[FW_VERSION_UPDATED].trapEnable = true;
  78432. 80381b8: 74da strb r2, [r3, #19]
  78433. traps[FW_VERSION_UPDATED].handle = GetVersionStr; /* FWVersion */
  78434. /* 3. DeviceRestored */ // +
  78435. traps[DEVICE_RESTORED].trapId = DEVICE_RESTORED;
  78436. traps[DEVICE_RESTORED].varbindId = 1;
  78437. 80381ba: 769a strb r2, [r3, #26]
  78438. traps[DEVICE_RESTORED].trapEnable = true;
  78439. 80381bc: 76da strb r2, [r3, #27]
  78440. traps[DEVICE_RESTORED].handle = GetVersionStr;//GetRestore; /* RestoreSignal */
  78441. /* 4. DeviceRebooted */ // +
  78442. traps[DEVICE_REBOOTED].trapId = DEVICE_REBOOTED;
  78443. traps[DEVICE_REBOOTED].varbindId = 1;
  78444. 80381be: f883 2022 strb.w r2, [r3, #34] ; 0x22
  78445. traps[DEVICE_REBOOTED].trapEnable = true;
  78446. 80381c2: f883 2023 strb.w r2, [r3, #35] ; 0x23
  78447. traps[DEVICE_REBOOTED].handle = GetVersionStr;//GetReboot; /* RebootSignal */
  78448. /* 5. DI0Norm */ // +
  78449. traps[DI0_NORM].trapId = DI0_NORM;
  78450. traps[DI0_NORM].varbindId = 9;
  78451. traps[DI0_NORM].trapEnable = true;
  78452. 80381c6: f883 202b strb.w r2, [r3, #43] ; 0x2b
  78453. traps[DI0_NORM].handle = GetDIN0StatusStr; /* State DIN */
  78454. /* 6. DI0Alarm */ // +
  78455. traps[DI0_ALARM].trapId = DI0_ALARM;
  78456. traps[DI0_ALARM].varbindId = 9;
  78457. traps[DI0_ALARM].trapEnable = true;
  78458. 80381ca: f883 2033 strb.w r2, [r3, #51] ; 0x33
  78459. traps[DI0_ALARM].handle = GetDIN0StatusStr; /* State DIN */
  78460. /* 7. DO0Toggle */ // +
  78461. traps[DO0_TOGGLED].trapId = DO0_TOGGLED;
  78462. traps[DO0_TOGGLED].varbindId = 5;
  78463. traps[DO0_TOGGLED].trapEnable = true;
  78464. 80381ce: f883 203b strb.w r2, [r3, #59] ; 0x3b
  78465. traps[DO0_TOGGLED].handle = GetDOUT0StatusStr; /* State DO0 */
  78466. /* 8. DO1Toggle */ // +
  78467. traps[DO1_TOGGLED].trapId = DO1_TOGGLED;
  78468. traps[DO1_TOGGLED].varbindId = 6;
  78469. traps[DO1_TOGGLED].trapEnable = true;
  78470. 80381d2: f883 2043 strb.w r2, [r3, #67] ; 0x43
  78471. traps[DO1_TOGGLED].handle = GetDOUT1StatusStr; /* State DO1 */
  78472. /* 9. BatteryTemperatureNorm */ // +
  78473. traps[BATTERY_TEMPERATURE_NORM].trapId = BATTERY_TEMPERATURE_NORM;
  78474. 80381d6: f883 1049 strb.w r1, [r3, #73] ; 0x49
  78475. traps[BATTERY_TEMPERATURE_NORM].varbindId = 10;
  78476. 80381da: 210a movs r1, #10
  78477. 80381dc: f883 104a strb.w r1, [r3, #74] ; 0x4a
  78478. traps[BATTERY_TEMPERATURE_NORM].trapEnable = true;
  78479. traps[BATTERY_TEMPERATURE_NORM].handle = GetInternalTempStr; /* BatteryTemperature */
  78480. 80381e0: 64d8 str r0, [r3, #76] ; 0x4c
  78481. /* 10. BatteryTemperatureAlarm */ // +
  78482. traps[BATTERY_TEMPERATURE_ALARM].trapId = BATTERY_TEMPERATURE_ALARM;
  78483. 80381e2: f883 1051 strb.w r1, [r3, #81] ; 0x51
  78484. traps[BATTERY_TEMPERATURE_ALARM].varbindId = 10;
  78485. 80381e6: f883 1052 strb.w r1, [r3, #82] ; 0x52
  78486. traps[BATTERY_TEMPERATURE_ALARM].trapEnable = true;
  78487. traps[BATTERY_TEMPERATURE_ALARM].handle = GetInternalTempStr; /* BatteryTemperature */
  78488. 80381ea: 6558 str r0, [r3, #84] ; 0x54
  78489. /* 11. LineAlarm */ // +
  78490. traps[LINE_ALARM].trapId = LINE_ALARM;
  78491. 80381ec: 210b movs r1, #11
  78492. traps[LINE_ALARM].varbindId = 12;
  78493. traps[LINE_ALARM].trapEnable = true;
  78494. traps[LINE_ALARM].handle = GetInputVoltageStr; /* LineAlarm */
  78495. 80381ee: 4834 ldr r0, [pc, #208] ; (80382c0 <SNMP_InitTrapsBase+0x168>)
  78496. traps[BATTERY_TEMPERATURE_ALARM].varbindId = 10;
  78497. traps[BATTERY_TEMPERATURE_ALARM].trapEnable = true;
  78498. traps[BATTERY_TEMPERATURE_ALARM].handle = GetInternalTempStr; /* BatteryTemperature */
  78499. /* 11. LineAlarm */ // +
  78500. traps[LINE_ALARM].trapId = LINE_ALARM;
  78501. 80381f0: f883 1059 strb.w r1, [r3, #89] ; 0x59
  78502. traps[LINE_ALARM].varbindId = 12;
  78503. 80381f4: 210c movs r1, #12
  78504. traps[LOW_BAT_ALARM].varbindId = 15;
  78505. traps[LOW_BAT_ALARM].trapEnable = true;
  78506. traps[LOW_BAT_ALARM].handle = GetBatCapacityStr; /* LowBatAlarm */
  78507. /* 14. LowBatNorm */ // +
  78508. traps[LOW_BAT_NORM].trapId = LOW_BAT_NORM;
  78509. 80381f6: 240e movs r4, #14
  78510. /* 15. PowerAlarm */ // +
  78511. traps[POWER_ALARM].trapId = POWER_ALARM;
  78512. traps[POWER_ALARM].varbindId = 14;
  78513. traps[POWER_ALARM].trapEnable = true;
  78514. traps[POWER_ALARM].handle = GetPowerStr; /* PowerAlarm */
  78515. 80381f8: 4d32 ldr r5, [pc, #200] ; (80382c4 <SNMP_InitTrapsBase+0x16c>)
  78516. traps[BATTERY_TEMPERATURE_ALARM].trapEnable = true;
  78517. traps[BATTERY_TEMPERATURE_ALARM].handle = GetInternalTempStr; /* BatteryTemperature */
  78518. /* 11. LineAlarm */ // +
  78519. traps[LINE_ALARM].trapId = LINE_ALARM;
  78520. traps[LINE_ALARM].varbindId = 12;
  78521. 80381fa: f883 105a strb.w r1, [r3, #90] ; 0x5a
  78522. traps[LINE_ALARM].trapEnable = true;
  78523. traps[LINE_ALARM].handle = GetInputVoltageStr; /* LineAlarm */
  78524. 80381fe: 65d8 str r0, [r3, #92] ; 0x5c
  78525. /* 12. LineNorm */ // +
  78526. traps[LINE_NORM].trapId = LINE_NORM;
  78527. 8038200: f883 1061 strb.w r1, [r3, #97] ; 0x61
  78528. traps[LINE_NORM].varbindId = 12;
  78529. 8038204: f883 1062 strb.w r1, [r3, #98] ; 0x62
  78530. traps[LINE_NORM].trapEnable = true;
  78531. traps[LINE_NORM].handle = GetInputVoltageStr; /* LineNorm */
  78532. 8038208: 6658 str r0, [r3, #100] ; 0x64
  78533. /* 13. LowBatAlarm */ // +
  78534. traps[LOW_BAT_ALARM].trapId = LOW_BAT_ALARM;
  78535. 803820a: 210d movs r1, #13
  78536. traps[LOW_BAT_ALARM].varbindId = 15;
  78537. traps[LOW_BAT_ALARM].trapEnable = true;
  78538. traps[LOW_BAT_ALARM].handle = GetBatCapacityStr; /* LowBatAlarm */
  78539. 803820c: 482e ldr r0, [pc, #184] ; (80382c8 <SNMP_InitTrapsBase+0x170>)
  78540. traps[LINE_NORM].varbindId = 12;
  78541. traps[LINE_NORM].trapEnable = true;
  78542. traps[LINE_NORM].handle = GetInputVoltageStr; /* LineNorm */
  78543. /* 13. LowBatAlarm */ // +
  78544. traps[LOW_BAT_ALARM].trapId = LOW_BAT_ALARM;
  78545. 803820e: f883 1069 strb.w r1, [r3, #105] ; 0x69
  78546. traps[LOW_BAT_ALARM].varbindId = 15;
  78547. traps[LOW_BAT_ALARM].trapEnable = true;
  78548. traps[LOW_BAT_ALARM].handle = GetBatCapacityStr; /* LowBatAlarm */
  78549. /* 14. LowBatNorm */ // +
  78550. traps[LOW_BAT_NORM].trapId = LOW_BAT_NORM;
  78551. 8038212: f883 4071 strb.w r4, [r3, #113] ; 0x71
  78552. traps[LINE_NORM].trapEnable = true;
  78553. traps[LINE_NORM].handle = GetInputVoltageStr; /* LineNorm */
  78554. /* 13. LowBatAlarm */ // +
  78555. traps[LOW_BAT_ALARM].trapId = LOW_BAT_ALARM;
  78556. traps[LOW_BAT_ALARM].varbindId = 15;
  78557. 8038216: 210f movs r1, #15
  78558. traps[LOW_BAT_NORM].trapEnable = true;
  78559. traps[LOW_BAT_NORM].handle = GetBatCapacityStr; /* LowBatNorm */
  78560. /* 15. PowerAlarm */ // +
  78561. traps[POWER_ALARM].trapId = POWER_ALARM;
  78562. traps[POWER_ALARM].varbindId = 14;
  78563. 8038218: f883 407a strb.w r4, [r3, #122] ; 0x7a
  78564. traps[POWER_ALARM].trapEnable = true;
  78565. traps[POWER_ALARM].handle = GetPowerStr; /* PowerAlarm */
  78566. /* 16. PowerNorm */ // +
  78567. traps[POWER_NORM].trapId = POWER_NORM;
  78568. 803821c: 2610 movs r6, #16
  78569. traps[POWER_NORM].varbindId = 14;
  78570. 803821e: f883 4082 strb.w r4, [r3, #130] ; 0x82
  78571. traps[POWER_NORM].trapEnable = true;
  78572. traps[POWER_NORM].handle = GetPowerStr; /* PowerNorm */
  78573. /* 17. ConnectMonitorAlarm */ //
  78574. traps[CONNECT_MONITOR_ALARM].trapId = CONNECT_MONITOR_ALARM;
  78575. 8038222: 2411 movs r4, #17
  78576. /* 15. PowerAlarm */ // +
  78577. traps[POWER_ALARM].trapId = POWER_ALARM;
  78578. traps[POWER_ALARM].varbindId = 14;
  78579. traps[POWER_ALARM].trapEnable = true;
  78580. traps[POWER_ALARM].handle = GetPowerStr; /* PowerAlarm */
  78581. 8038224: 67dd str r5, [r3, #124] ; 0x7c
  78582. /* 16. PowerNorm */ // +
  78583. traps[POWER_NORM].trapId = POWER_NORM;
  78584. 8038226: f883 6081 strb.w r6, [r3, #129] ; 0x81
  78585. traps[POWER_NORM].varbindId = 14;
  78586. traps[POWER_NORM].trapEnable = true;
  78587. traps[POWER_NORM].handle = GetPowerStr; /* PowerNorm */
  78588. 803822a: f8c3 5084 str.w r5, [r3, #132] ; 0x84
  78589. /* 17. ConnectMonitorAlarm */ //
  78590. traps[CONNECT_MONITOR_ALARM].trapId = CONNECT_MONITOR_ALARM;
  78591. 803822e: f883 4089 strb.w r4, [r3, #137] ; 0x89
  78592. traps[CONNECT_MONITOR_ALARM].varbindId = 17;
  78593. 8038232: f883 408a strb.w r4, [r3, #138] ; 0x8a
  78594. traps[CONNECT_MONITOR_ALARM].trapEnable = true;
  78595. traps[CONNECT_MONITOR_ALARM].handle = GetConnectMonitorStr;//GetConnectMonitorStr; /* ConnectMonitor */
  78596. 8038236: 4d25 ldr r5, [pc, #148] ; (80382cc <SNMP_InitTrapsBase+0x174>)
  78597. traps[DO1_TOGGLED].handle = GetDOUT1StatusStr; /* State DO1 */
  78598. /* 9. BatteryTemperatureNorm */ // +
  78599. traps[BATTERY_TEMPERATURE_NORM].trapId = BATTERY_TEMPERATURE_NORM;
  78600. traps[BATTERY_TEMPERATURE_NORM].varbindId = 10;
  78601. traps[BATTERY_TEMPERATURE_NORM].trapEnable = true;
  78602. 8038238: f883 204b strb.w r2, [r3, #75] ; 0x4b
  78603. traps[BATTERY_TEMPERATURE_NORM].handle = GetInternalTempStr; /* BatteryTemperature */
  78604. /* 10. BatteryTemperatureAlarm */ // +
  78605. traps[BATTERY_TEMPERATURE_ALARM].trapId = BATTERY_TEMPERATURE_ALARM;
  78606. traps[BATTERY_TEMPERATURE_ALARM].varbindId = 10;
  78607. traps[BATTERY_TEMPERATURE_ALARM].trapEnable = true;
  78608. 803823c: f883 2053 strb.w r2, [r3, #83] ; 0x53
  78609. traps[BATTERY_TEMPERATURE_ALARM].handle = GetInternalTempStr; /* BatteryTemperature */
  78610. /* 11. LineAlarm */ // +
  78611. traps[LINE_ALARM].trapId = LINE_ALARM;
  78612. traps[LINE_ALARM].varbindId = 12;
  78613. traps[LINE_ALARM].trapEnable = true;
  78614. 8038240: f883 205b strb.w r2, [r3, #91] ; 0x5b
  78615. traps[LINE_ALARM].handle = GetInputVoltageStr; /* LineAlarm */
  78616. /* 12. LineNorm */ // +
  78617. traps[LINE_NORM].trapId = LINE_NORM;
  78618. traps[LINE_NORM].varbindId = 12;
  78619. traps[LINE_NORM].trapEnable = true;
  78620. 8038244: f883 2063 strb.w r2, [r3, #99] ; 0x63
  78621. traps[LINE_NORM].handle = GetInputVoltageStr; /* LineNorm */
  78622. /* 13. LowBatAlarm */ // +
  78623. traps[LOW_BAT_ALARM].trapId = LOW_BAT_ALARM;
  78624. traps[LOW_BAT_ALARM].varbindId = 15;
  78625. 8038248: f883 106a strb.w r1, [r3, #106] ; 0x6a
  78626. traps[LOW_BAT_ALARM].trapEnable = true;
  78627. 803824c: f883 206b strb.w r2, [r3, #107] ; 0x6b
  78628. traps[LOW_BAT_ALARM].handle = GetBatCapacityStr; /* LowBatAlarm */
  78629. 8038250: 66d8 str r0, [r3, #108] ; 0x6c
  78630. /* 14. LowBatNorm */ // +
  78631. traps[LOW_BAT_NORM].trapId = LOW_BAT_NORM;
  78632. traps[LOW_BAT_NORM].varbindId = 15;
  78633. 8038252: f883 1072 strb.w r1, [r3, #114] ; 0x72
  78634. traps[LOW_BAT_NORM].trapEnable = true;
  78635. 8038256: f883 2073 strb.w r2, [r3, #115] ; 0x73
  78636. traps[LOW_BAT_NORM].handle = GetBatCapacityStr; /* LowBatNorm */
  78637. 803825a: 6758 str r0, [r3, #116] ; 0x74
  78638. /* 15. PowerAlarm */ // +
  78639. traps[POWER_ALARM].trapId = POWER_ALARM;
  78640. 803825c: f883 1079 strb.w r1, [r3, #121] ; 0x79
  78641. traps[POWER_ALARM].varbindId = 14;
  78642. traps[POWER_ALARM].trapEnable = true;
  78643. 8038260: f883 207b strb.w r2, [r3, #123] ; 0x7b
  78644. traps[POWER_ALARM].handle = GetPowerStr; /* PowerAlarm */
  78645. /* 16. PowerNorm */ // +
  78646. traps[POWER_NORM].trapId = POWER_NORM;
  78647. traps[POWER_NORM].varbindId = 14;
  78648. traps[POWER_NORM].trapEnable = true;
  78649. 8038264: f883 2083 strb.w r2, [r3, #131] ; 0x83
  78650. traps[POWER_NORM].handle = GetPowerStr; /* PowerNorm */
  78651. /* 17. ConnectMonitorAlarm */ //
  78652. traps[CONNECT_MONITOR_ALARM].trapId = CONNECT_MONITOR_ALARM;
  78653. traps[CONNECT_MONITOR_ALARM].varbindId = 17;
  78654. traps[CONNECT_MONITOR_ALARM].trapEnable = true;
  78655. 8038268: f883 208b strb.w r2, [r3, #139] ; 0x8b
  78656. traps[CONNECT_MONITOR_ALARM].handle = GetConnectMonitorStr;//GetConnectMonitorStr; /* ConnectMonitor */
  78657. /* 18. ConnectMonitorNorm */ //
  78658. traps[CONNECT_MONITOR_NORM].trapId = CONNECT_MONITOR_NORM;
  78659. traps[CONNECT_MONITOR_NORM].varbindId = 17;
  78660. 803826c: f883 4092 strb.w r4, [r3, #146] ; 0x92
  78661. traps[CONNECT_MONITOR_NORM].trapEnable = true;
  78662. traps[CONNECT_MONITOR_NORM].handle = GetConnectMonitorStr;//GetConnectMonitorStr; /* ConnectMonitor */
  78663. /* 19. BatteryConnectAlarm */ // +
  78664. traps[BATTERY_CONNECT_ALARM].trapId = BATTERY_CONNECT_ALARM;
  78665. 8038270: 2413 movs r4, #19
  78666. traps[CONNECT_MONITOR_ALARM].varbindId = 17;
  78667. traps[CONNECT_MONITOR_ALARM].trapEnable = true;
  78668. traps[CONNECT_MONITOR_ALARM].handle = GetConnectMonitorStr;//GetConnectMonitorStr; /* ConnectMonitor */
  78669. /* 18. ConnectMonitorNorm */ //
  78670. traps[CONNECT_MONITOR_NORM].trapId = CONNECT_MONITOR_NORM;
  78671. 8038272: 2612 movs r6, #18
  78672. traps[CONNECT_MONITOR_NORM].varbindId = 17;
  78673. traps[CONNECT_MONITOR_NORM].trapEnable = true;
  78674. traps[CONNECT_MONITOR_NORM].handle = GetConnectMonitorStr;//GetConnectMonitorStr; /* ConnectMonitor */
  78675. /* 19. BatteryConnectAlarm */ // +
  78676. traps[BATTERY_CONNECT_ALARM].trapId = BATTERY_CONNECT_ALARM;
  78677. 8038274: f883 4099 strb.w r4, [r3, #153] ; 0x99
  78678. traps[BATTERY_CONNECT_ALARM].varbindId = 15;
  78679. traps[BATTERY_CONNECT_ALARM].trapEnable = true;
  78680. traps[BATTERY_CONNECT_ALARM].handle = GetBatCapacityStr; /* LowBatAlarm */
  78681. /* 20. BatteryConnectNorm */ // +
  78682. traps[BATTERY_CONNECT_NORM].trapId = BATTERY_CONNECT_NORM;
  78683. 8038278: 2414 movs r4, #20
  78684. /* 17. ConnectMonitorAlarm */ //
  78685. traps[CONNECT_MONITOR_ALARM].trapId = CONNECT_MONITOR_ALARM;
  78686. traps[CONNECT_MONITOR_ALARM].varbindId = 17;
  78687. traps[CONNECT_MONITOR_ALARM].trapEnable = true;
  78688. traps[CONNECT_MONITOR_ALARM].handle = GetConnectMonitorStr;//GetConnectMonitorStr; /* ConnectMonitor */
  78689. 803827a: f8c3 508c str.w r5, [r3, #140] ; 0x8c
  78690. /* 18. ConnectMonitorNorm */ //
  78691. traps[CONNECT_MONITOR_NORM].trapId = CONNECT_MONITOR_NORM;
  78692. 803827e: f883 6091 strb.w r6, [r3, #145] ; 0x91
  78693. traps[CONNECT_MONITOR_NORM].varbindId = 17;
  78694. traps[CONNECT_MONITOR_NORM].trapEnable = true;
  78695. 8038282: f883 2093 strb.w r2, [r3, #147] ; 0x93
  78696. traps[CONNECT_MONITOR_NORM].handle = GetConnectMonitorStr;//GetConnectMonitorStr; /* ConnectMonitor */
  78697. 8038286: f8c3 5094 str.w r5, [r3, #148] ; 0x94
  78698. /* 19. BatteryConnectAlarm */ // +
  78699. traps[BATTERY_CONNECT_ALARM].trapId = BATTERY_CONNECT_ALARM;
  78700. traps[BATTERY_CONNECT_ALARM].varbindId = 15;
  78701. 803828a: f883 109a strb.w r1, [r3, #154] ; 0x9a
  78702. traps[BATTERY_CONNECT_ALARM].trapEnable = true;
  78703. 803828e: f883 209b strb.w r2, [r3, #155] ; 0x9b
  78704. traps[BATTERY_CONNECT_ALARM].handle = GetBatCapacityStr; /* LowBatAlarm */
  78705. 8038292: f8c3 009c str.w r0, [r3, #156] ; 0x9c
  78706. /* 20. BatteryConnectNorm */ // +
  78707. traps[BATTERY_CONNECT_NORM].trapId = BATTERY_CONNECT_NORM;
  78708. 8038296: f883 40a1 strb.w r4, [r3, #161] ; 0xa1
  78709. traps[BATTERY_CONNECT_NORM].varbindId = 15;
  78710. 803829a: f883 10a2 strb.w r1, [r3, #162] ; 0xa2
  78711. traps[BATTERY_CONNECT_NORM].trapEnable = true;
  78712. 803829e: f883 20a3 strb.w r2, [r3, #163] ; 0xa3
  78713. traps[BATTERY_CONNECT_NORM].handle = GetBatCapacityStr; /* LowBatNorm */
  78714. 80382a2: f8c3 00a4 str.w r0, [r3, #164] ; 0xa4
  78715. 80382a6: bd70 pop {r4, r5, r6, pc}
  78716. 80382a8: 20010320 .word 0x20010320
  78717. 80382ac: 0802819d .word 0x0802819d
  78718. 80382b0: 0802804d .word 0x0802804d
  78719. 80382b4: 080280c1 .word 0x080280c1
  78720. 80382b8: 080280e5 .word 0x080280e5
  78721. 80382bc: 08027e1d .word 0x08027e1d
  78722. 80382c0: 08027d59 .word 0x08027d59
  78723. 80382c4: 08027db1 .word 0x08027db1
  78724. 80382c8: 08027dd5 .word 0x08027dd5
  78725. 80382cc: 08027e6d .word 0x08027e6d
  78726. 080382d0 <SNMP_SendVarbindTrap>:
  78727. /**
  78728. * @brief Отправка трапа с переменной, зарегистрированного в базе.
  78729. * @retval
  78730. */
  78731. bool SNMP_SendVarbindTrap(TRAP_t *trap)
  78732. {
  78733. 80382d0: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  78734. char msg[255];
  78735. uint8_t len = 0;
  78736. 80382d4: 2500 movs r5, #0
  78737. /**
  78738. * @brief Отправка трапа с переменной, зарегистрированного в базе.
  78739. * @retval
  78740. */
  78741. bool SNMP_SendVarbindTrap(TRAP_t *trap)
  78742. {
  78743. 80382d6: f5ad 7d07 sub.w sp, sp, #540 ; 0x21c
  78744. 80382da: 4681 mov r9, r0
  78745. char msg[255];
  78746. uint8_t len = 0;
  78747. struct snmp_varbind *vb;
  78748. struct snmp_obj_id trapObjId = {11, {1, 3, 6, 1, 4, 1, 41752, 911, 3, 2, 1}};
  78749. 80382dc: 4629 mov r1, r5
  78750. 80382de: 2284 movs r2, #132 ; 0x84
  78751. 80382e0: a804 add r0, sp, #16
  78752. * @retval
  78753. */
  78754. bool SNMP_SendVarbindTrap(TRAP_t *trap)
  78755. {
  78756. char msg[255];
  78757. uint8_t len = 0;
  78758. 80382e2: f88d 500f strb.w r5, [sp, #15]
  78759. struct snmp_varbind *vb;
  78760. struct snmp_obj_id trapObjId = {11, {1, 3, 6, 1, 4, 1, 41752, 911, 3, 2, 1}};
  78761. 80382e6: f7e9 fd97 bl 8021e18 <memset>
  78762. 80382ea: 2202 movs r2, #2
  78763. 80382ec: 2401 movs r4, #1
  78764. 80382ee: 2603 movs r6, #3
  78765. 80382f0: 230b movs r3, #11
  78766. 80382f2: f04f 0804 mov.w r8, #4
  78767. 80382f6: 2706 movs r7, #6
  78768. 80382f8: f24a 3b18 movw fp, #41752 ; 0xa318
  78769. 80382fc: f240 3a8f movw sl, #911 ; 0x38f
  78770. 8038300: 920e str r2, [sp, #56] ; 0x38
  78771. struct snmp_obj_id varObjId = {11, {1, 3, 6, 1, 4, 1, 41752, 911, 3, 1, 1}};
  78772. 8038302: 4629 mov r1, r5
  78773. 8038304: 2284 movs r2, #132 ; 0x84
  78774. 8038306: a825 add r0, sp, #148 ; 0x94
  78775. bool SNMP_SendVarbindTrap(TRAP_t *trap)
  78776. {
  78777. char msg[255];
  78778. uint8_t len = 0;
  78779. struct snmp_varbind *vb;
  78780. struct snmp_obj_id trapObjId = {11, {1, 3, 6, 1, 4, 1, 41752, 911, 3, 2, 1}};
  78781. 8038308: f88d 3010 strb.w r3, [sp, #16]
  78782. 803830c: 9606 str r6, [sp, #24]
  78783. 803830e: 960d str r6, [sp, #52] ; 0x34
  78784. struct snmp_obj_id varObjId = {11, {1, 3, 6, 1, 4, 1, 41752, 911, 3, 1, 1}};
  78785. 8038310: 9301 str r3, [sp, #4]
  78786. bool SNMP_SendVarbindTrap(TRAP_t *trap)
  78787. {
  78788. char msg[255];
  78789. uint8_t len = 0;
  78790. struct snmp_varbind *vb;
  78791. struct snmp_obj_id trapObjId = {11, {1, 3, 6, 1, 4, 1, 41752, 911, 3, 2, 1}};
  78792. 8038312: 9405 str r4, [sp, #20]
  78793. 8038314: 9707 str r7, [sp, #28]
  78794. 8038316: 9408 str r4, [sp, #32]
  78795. 8038318: f8cd 8024 str.w r8, [sp, #36] ; 0x24
  78796. 803831c: 940a str r4, [sp, #40] ; 0x28
  78797. 803831e: f8cd b02c str.w fp, [sp, #44] ; 0x2c
  78798. 8038322: f8cd a030 str.w sl, [sp, #48] ; 0x30
  78799. struct snmp_obj_id varObjId = {11, {1, 3, 6, 1, 4, 1, 41752, 911, 3, 1, 1}};
  78800. 8038326: f7e9 fd77 bl 8021e18 <memset>
  78801. 803832a: 9b01 ldr r3, [sp, #4]
  78802. 803832c: 9627 str r6, [sp, #156] ; 0x9c
  78803. 803832e: f88d 3094 strb.w r3, [sp, #148] ; 0x94
  78804. trapObjId.id[trapObjId.len - 1] = trap->trapId;
  78805. 8038332: f899 3001 ldrb.w r3, [r9, #1]
  78806. {
  78807. char msg[255];
  78808. uint8_t len = 0;
  78809. struct snmp_varbind *vb;
  78810. struct snmp_obj_id trapObjId = {11, {1, 3, 6, 1, 4, 1, 41752, 911, 3, 2, 1}};
  78811. struct snmp_obj_id varObjId = {11, {1, 3, 6, 1, 4, 1, 41752, 911, 3, 1, 1}};
  78812. 8038336: 962e str r6, [sp, #184] ; 0xb8
  78813. trapObjId.id[trapObjId.len - 1] = trap->trapId;
  78814. 8038338: 930f str r3, [sp, #60] ; 0x3c
  78815. varObjId.id[varObjId.len - 1] = trap->varbindId;
  78816. 803833a: f899 3002 ldrb.w r3, [r9, #2]
  78817. {
  78818. char msg[255];
  78819. uint8_t len = 0;
  78820. struct snmp_varbind *vb;
  78821. struct snmp_obj_id trapObjId = {11, {1, 3, 6, 1, 4, 1, 41752, 911, 3, 2, 1}};
  78822. struct snmp_obj_id varObjId = {11, {1, 3, 6, 1, 4, 1, 41752, 911, 3, 1, 1}};
  78823. 803833e: 9426 str r4, [sp, #152] ; 0x98
  78824. trapObjId.id[trapObjId.len - 1] = trap->trapId;
  78825. varObjId.id[varObjId.len - 1] = trap->varbindId;
  78826. 8038340: 9330 str r3, [sp, #192] ; 0xc0
  78827. trap->handle(msg, &len);
  78828. 8038342: a846 add r0, sp, #280 ; 0x118
  78829. 8038344: f8d9 3004 ldr.w r3, [r9, #4]
  78830. {
  78831. char msg[255];
  78832. uint8_t len = 0;
  78833. struct snmp_varbind *vb;
  78834. struct snmp_obj_id trapObjId = {11, {1, 3, 6, 1, 4, 1, 41752, 911, 3, 2, 1}};
  78835. struct snmp_obj_id varObjId = {11, {1, 3, 6, 1, 4, 1, 41752, 911, 3, 1, 1}};
  78836. 8038348: 9728 str r7, [sp, #160] ; 0xa0
  78837. trapObjId.id[trapObjId.len - 1] = trap->trapId;
  78838. varObjId.id[varObjId.len - 1] = trap->varbindId;
  78839. trap->handle(msg, &len);
  78840. 803834a: f10d 010f add.w r1, sp, #15
  78841. {
  78842. char msg[255];
  78843. uint8_t len = 0;
  78844. struct snmp_varbind *vb;
  78845. struct snmp_obj_id trapObjId = {11, {1, 3, 6, 1, 4, 1, 41752, 911, 3, 2, 1}};
  78846. struct snmp_obj_id varObjId = {11, {1, 3, 6, 1, 4, 1, 41752, 911, 3, 1, 1}};
  78847. 803834e: 9429 str r4, [sp, #164] ; 0xa4
  78848. 8038350: f8cd 80a8 str.w r8, [sp, #168] ; 0xa8
  78849. 8038354: 942b str r4, [sp, #172] ; 0xac
  78850. 8038356: f8cd b0b0 str.w fp, [sp, #176] ; 0xb0
  78851. 803835a: f8cd a0b4 str.w sl, [sp, #180] ; 0xb4
  78852. 803835e: 942f str r4, [sp, #188] ; 0xbc
  78853. trapObjId.id[trapObjId.len - 1] = trap->trapId;
  78854. varObjId.id[varObjId.len - 1] = trap->varbindId;
  78855. trap->handle(msg, &len);
  78856. 8038360: 4798 blx r3
  78857. vb = snmp_varbind_alloc(&varObjId, SNMP_ASN1_OC_STR, len);
  78858. 8038362: a825 add r0, sp, #148 ; 0x94
  78859. 8038364: 4641 mov r1, r8
  78860. 8038366: f89d 200f ldrb.w r2, [sp, #15]
  78861. 803836a: f7fc fff9 bl 8035360 <snmp_varbind_alloc>
  78862. if(vb != NULL ) {
  78863. 803836e: 4606 mov r6, r0
  78864. 8038370: b198 cbz r0, 803839a <SNMP_SendVarbindTrap+0xca>
  78865. memcpy(vb->value, msg, len);
  78866. 8038372: f89d 200f ldrb.w r2, [sp, #15]
  78867. 8038376: 6940 ldr r0, [r0, #20]
  78868. 8038378: a946 add r1, sp, #280 ; 0x118
  78869. 803837a: f7e9 fc93 bl 8021ca4 <memcpy>
  78870. snmp_varbind_tail_add(&trap_msg.outvb, vb);
  78871. 803837e: 4809 ldr r0, [pc, #36] ; (80383a4 <SNMP_SendVarbindTrap+0xd4>)
  78872. 8038380: 4631 mov r1, r6
  78873. 8038382: f7fd f899 bl 80354b8 <snmp_varbind_tail_add>
  78874. snmp_send_trap(SNMP_GENTRAP_ENTERPRISESPC, &trapObjId, 0);
  78875. 8038386: a904 add r1, sp, #16
  78876. 8038388: 462a mov r2, r5
  78877. 803838a: 4638 mov r0, r7
  78878. 803838c: f7fe fa02 bl 8036794 <snmp_send_trap>
  78879. snmp_varbind_list_free(&trap_msg.outvb);
  78880. 8038390: 4804 ldr r0, [pc, #16] ; (80383a4 <SNMP_SendVarbindTrap+0xd4>)
  78881. 8038392: f7fd f838 bl 8035406 <snmp_varbind_list_free>
  78882. return true;
  78883. 8038396: 4620 mov r0, r4
  78884. 8038398: e7ff b.n 803839a <SNMP_SendVarbindTrap+0xca>
  78885. }
  78886. else {
  78887. return false;
  78888. }
  78889. }
  78890. 803839a: f50d 7d07 add.w sp, sp, #540 ; 0x21c
  78891. 803839e: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  78892. 80383a2: bf00 nop
  78893. 80383a4: 200100a8 .word 0x200100a8
  78894. 080383a8 <ETH_BSP_Config>:
  78895. * @brief ETH_BSP_Config
  78896. * @param None
  78897. * @retval None
  78898. */
  78899. void ETH_BSP_Config(void)
  78900. {
  78901. 80383a8: b570 push {r4, r5, r6, lr}
  78902. {
  78903. volatile uint32_t i;
  78904. GPIO_InitTypeDef GPIO_InitStructure;
  78905. /* Enable GPIOs clocks */
  78906. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB
  78907. 80383aa: 2007 movs r0, #7
  78908. * @brief ETH_BSP_Config
  78909. * @param None
  78910. * @retval None
  78911. */
  78912. void ETH_BSP_Config(void)
  78913. {
  78914. 80383ac: b0b4 sub sp, #208 ; 0xd0
  78915. {
  78916. volatile uint32_t i;
  78917. GPIO_InitTypeDef GPIO_InitStructure;
  78918. /* Enable GPIOs clocks */
  78919. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB
  78920. 80383ae: 2101 movs r1, #1
  78921. 80383b0: f7ed fb58 bl 8025a64 <RCC_AHB1PeriphClockCmd>
  78922. | RCC_AHB1Periph_GPIOC, ENABLE);
  78923. /* Enable SYSCFG clock */
  78924. RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
  78925. 80383b4: 2101 movs r1, #1
  78926. 80383b6: f44f 4080 mov.w r0, #16384 ; 0x4000
  78927. 80383ba: f7ed fb77 bl 8025aac <RCC_APB2PeriphClockCmd>
  78928. /* MII/RMII Media interface selection --------------------------------------*/
  78929. SYSCFG_ETH_MediaInterfaceConfig(SYSCFG_ETH_MediaInterface_RMII);
  78930. 80383be: 2001 movs r0, #1
  78931. 80383c0: f7ed fd68 bl 8025e94 <SYSCFG_ETH_MediaInterfaceConfig>
  78932. ETH_RST_PIN -------> PE2 - замена на PE13
  78933. */
  78934. /* Configure PA1,PA2 and PA7 */
  78935. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_7;
  78936. 80383c4: 2386 movs r3, #134 ; 0x86
  78937. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  78938. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  78939. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  78940. 80383c6: 2400 movs r4, #0
  78941. */
  78942. /* Configure PA1,PA2 and PA7 */
  78943. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_7;
  78944. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  78945. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  78946. 80383c8: 2502 movs r5, #2
  78947. ETH_RST_PIN -------> PE2 - замена на PE13
  78948. */
  78949. /* Configure PA1,PA2 and PA7 */
  78950. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_7;
  78951. 80383ca: 9303 str r3, [sp, #12]
  78952. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  78953. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  78954. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  78955. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
  78956. GPIO_Init(GPIOA, &GPIO_InitStructure);
  78957. 80383cc: 4864 ldr r0, [pc, #400] ; (8038560 <ETH_BSP_Config+0x1b8>)
  78958. */
  78959. /* Configure PA1,PA2 and PA7 */
  78960. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_7;
  78961. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  78962. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  78963. 80383ce: f88d 5010 strb.w r5, [sp, #16]
  78964. */
  78965. /* Configure PA1,PA2 and PA7 */
  78966. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_7;
  78967. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  78968. 80383d2: 2303 movs r3, #3
  78969. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  78970. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  78971. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
  78972. GPIO_Init(GPIOA, &GPIO_InitStructure);
  78973. 80383d4: a903 add r1, sp, #12
  78974. */
  78975. /* Configure PA1,PA2 and PA7 */
  78976. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_7;
  78977. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  78978. 80383d6: f88d 3011 strb.w r3, [sp, #17]
  78979. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  78980. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  78981. 80383da: f88d 4012 strb.w r4, [sp, #18]
  78982. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
  78983. 80383de: f88d 4013 strb.w r4, [sp, #19]
  78984. GPIO_Init(GPIOA, &GPIO_InitStructure);
  78985. 80383e2: f7ed fa5f bl 80258a4 <GPIO_Init>
  78986. GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_ETH);
  78987. 80383e6: 2101 movs r1, #1
  78988. 80383e8: 220b movs r2, #11
  78989. 80383ea: 485d ldr r0, [pc, #372] ; (8038560 <ETH_BSP_Config+0x1b8>)
  78990. 80383ec: f7ed faa3 bl 8025936 <GPIO_PinAFConfig>
  78991. GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_ETH);
  78992. 80383f0: 220b movs r2, #11
  78993. 80383f2: 485b ldr r0, [pc, #364] ; (8038560 <ETH_BSP_Config+0x1b8>)
  78994. 80383f4: 4629 mov r1, r5
  78995. 80383f6: f7ed fa9e bl 8025936 <GPIO_PinAFConfig>
  78996. GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_ETH);
  78997. 80383fa: 220b movs r2, #11
  78998. 80383fc: 2107 movs r1, #7
  78999. 80383fe: 4858 ldr r0, [pc, #352] ; (8038560 <ETH_BSP_Config+0x1b8>)
  79000. 8038400: f7ed fa99 bl 8025936 <GPIO_PinAFConfig>
  79001. /* Configure PB10,PB11,PB12 and PB13 */
  79002. GPIO_InitStructure.GPIO_Pin = /* GPIO_Pin_10 | */ GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13;
  79003. 8038404: f44f 5360 mov.w r3, #14336 ; 0x3800
  79004. GPIO_Init(GPIOB, &GPIO_InitStructure);
  79005. 8038408: 4856 ldr r0, [pc, #344] ; (8038564 <ETH_BSP_Config+0x1bc>)
  79006. GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_ETH);
  79007. GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_ETH);
  79008. GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_ETH);
  79009. /* Configure PB10,PB11,PB12 and PB13 */
  79010. GPIO_InitStructure.GPIO_Pin = /* GPIO_Pin_10 | */ GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13;
  79011. 803840a: 9303 str r3, [sp, #12]
  79012. GPIO_Init(GPIOB, &GPIO_InitStructure);
  79013. 803840c: a903 add r1, sp, #12
  79014. 803840e: f7ed fa49 bl 80258a4 <GPIO_Init>
  79015. //GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_ETH);
  79016. GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_ETH);
  79017. 8038412: 210b movs r1, #11
  79018. 8038414: 460a mov r2, r1
  79019. 8038416: 4853 ldr r0, [pc, #332] ; (8038564 <ETH_BSP_Config+0x1bc>)
  79020. 8038418: f7ed fa8d bl 8025936 <GPIO_PinAFConfig>
  79021. GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_ETH);
  79022. 803841c: 210c movs r1, #12
  79023. 803841e: 220b movs r2, #11
  79024. 8038420: 4850 ldr r0, [pc, #320] ; (8038564 <ETH_BSP_Config+0x1bc>)
  79025. 8038422: f7ed fa88 bl 8025936 <GPIO_PinAFConfig>
  79026. GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_ETH);
  79027. 8038426: 220b movs r2, #11
  79028. 8038428: 210d movs r1, #13
  79029. 803842a: 484e ldr r0, [pc, #312] ; (8038564 <ETH_BSP_Config+0x1bc>)
  79030. 803842c: f7ed fa83 bl 8025936 <GPIO_PinAFConfig>
  79031. /* Configure PC1, PC4 and PC5 */
  79032. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5;
  79033. 8038430: 2332 movs r3, #50 ; 0x32
  79034. GPIO_Init(GPIOC, &GPIO_InitStructure);
  79035. 8038432: 484d ldr r0, [pc, #308] ; (8038568 <ETH_BSP_Config+0x1c0>)
  79036. GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_ETH);
  79037. GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_ETH);
  79038. GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_ETH);
  79039. /* Configure PC1, PC4 and PC5 */
  79040. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5;
  79041. 8038434: 9303 str r3, [sp, #12]
  79042. GPIO_Init(GPIOC, &GPIO_InitStructure);
  79043. 8038436: a903 add r1, sp, #12
  79044. 8038438: f7ed fa34 bl 80258a4 <GPIO_Init>
  79045. GPIO_PinAFConfig(GPIOC, GPIO_PinSource1, GPIO_AF_ETH);
  79046. 803843c: 484a ldr r0, [pc, #296] ; (8038568 <ETH_BSP_Config+0x1c0>)
  79047. 803843e: 2101 movs r1, #1
  79048. 8038440: 220b movs r2, #11
  79049. 8038442: f7ed fa78 bl 8025936 <GPIO_PinAFConfig>
  79050. GPIO_PinAFConfig(GPIOC, GPIO_PinSource4, GPIO_AF_ETH);
  79051. 8038446: 4848 ldr r0, [pc, #288] ; (8038568 <ETH_BSP_Config+0x1c0>)
  79052. 8038448: 2104 movs r1, #4
  79053. 803844a: 220b movs r2, #11
  79054. 803844c: f7ed fa73 bl 8025936 <GPIO_PinAFConfig>
  79055. GPIO_PinAFConfig(GPIOC, GPIO_PinSource5, GPIO_AF_ETH);
  79056. 8038450: 220b movs r2, #11
  79057. 8038452: 4845 ldr r0, [pc, #276] ; (8038568 <ETH_BSP_Config+0x1c0>)
  79058. 8038454: 2105 movs r1, #5
  79059. 8038456: f7ed fa6e bl 8025936 <GPIO_PinAFConfig>
  79060. /* Configure the PHY RST pin */
  79061. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
  79062. 803845a: f44f 5600 mov.w r6, #8192 ; 0x2000
  79063. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  79064. 803845e: 2301 movs r3, #1
  79065. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  79066. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  79067. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  79068. GPIO_Init(GPIOE, &GPIO_InitStructure);
  79069. 8038460: 4842 ldr r0, [pc, #264] ; (803856c <ETH_BSP_Config+0x1c4>)
  79070. GPIO_PinAFConfig(GPIOC, GPIO_PinSource4, GPIO_AF_ETH);
  79071. GPIO_PinAFConfig(GPIOC, GPIO_PinSource5, GPIO_AF_ETH);
  79072. /* Configure the PHY RST pin */
  79073. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
  79074. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  79075. 8038462: f88d 3010 strb.w r3, [sp, #16]
  79076. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  79077. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  79078. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  79079. GPIO_Init(GPIOE, &GPIO_InitStructure);
  79080. 8038466: a903 add r1, sp, #12
  79081. /* Configure the PHY RST pin */
  79082. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
  79083. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  79084. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  79085. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  79086. 8038468: f88d 3013 strb.w r3, [sp, #19]
  79087. GPIO_PinAFConfig(GPIOC, GPIO_PinSource1, GPIO_AF_ETH);
  79088. GPIO_PinAFConfig(GPIOC, GPIO_PinSource4, GPIO_AF_ETH);
  79089. GPIO_PinAFConfig(GPIOC, GPIO_PinSource5, GPIO_AF_ETH);
  79090. /* Configure the PHY RST pin */
  79091. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
  79092. 803846c: 9603 str r6, [sp, #12]
  79093. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  79094. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  79095. 803846e: f88d 4012 strb.w r4, [sp, #18]
  79096. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  79097. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  79098. 8038472: f88d 5011 strb.w r5, [sp, #17]
  79099. GPIO_Init(GPIOE, &GPIO_InitStructure);
  79100. 8038476: f7ed fa15 bl 80258a4 <GPIO_Init>
  79101. GPIO_ResetBits(GPIOE, GPIO_Pin_13);
  79102. 803847a: 483c ldr r0, [pc, #240] ; (803856c <ETH_BSP_Config+0x1c4>)
  79103. 803847c: 4631 mov r1, r6
  79104. 803847e: f7ed fa58 bl 8025932 <GPIO_ResetBits>
  79105. for (i = 0; i < 20000; i++);
  79106. 8038482: 9401 str r4, [sp, #4]
  79107. 8038484: f644 631f movw r3, #19999 ; 0x4e1f
  79108. 8038488: e002 b.n 8038490 <ETH_BSP_Config+0xe8>
  79109. 803848a: 9a01 ldr r2, [sp, #4]
  79110. 803848c: 3201 adds r2, #1
  79111. 803848e: 9201 str r2, [sp, #4]
  79112. 8038490: 9a01 ldr r2, [sp, #4]
  79113. 8038492: 429a cmp r2, r3
  79114. 8038494: d9f9 bls.n 803848a <ETH_BSP_Config+0xe2>
  79115. GPIO_SetBits(GPIOE, GPIO_Pin_13);
  79116. 8038496: 4835 ldr r0, [pc, #212] ; (803856c <ETH_BSP_Config+0x1c4>)
  79117. 8038498: f44f 5100 mov.w r1, #8192 ; 0x2000
  79118. 803849c: f7ed fa47 bl 802592e <GPIO_SetBits>
  79119. for (i = 0; i < 20000; i++);
  79120. 80384a0: 2300 movs r3, #0
  79121. 80384a2: 9301 str r3, [sp, #4]
  79122. 80384a4: f644 631f movw r3, #19999 ; 0x4e1f
  79123. 80384a8: e002 b.n 80384b0 <ETH_BSP_Config+0x108>
  79124. 80384aa: 9a01 ldr r2, [sp, #4]
  79125. 80384ac: 3201 adds r2, #1
  79126. 80384ae: 9201 str r2, [sp, #4]
  79127. 80384b0: 9a01 ldr r2, [sp, #4]
  79128. 80384b2: 429a cmp r2, r3
  79129. 80384b4: d9f9 bls.n 80384aa <ETH_BSP_Config+0x102>
  79130. static void ETH_MACDMA_Config(void)
  79131. {
  79132. ETH_InitTypeDef ETH_InitStructure;
  79133. /* Enable ETHERNET clock */
  79134. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_ETH_MAC | RCC_AHB1Periph_ETH_MAC_Tx |
  79135. 80384b6: f04f 6060 mov.w r0, #234881024 ; 0xe000000
  79136. 80384ba: 2101 movs r1, #1
  79137. 80384bc: f7ed fad2 bl 8025a64 <RCC_AHB1PeriphClockCmd>
  79138. RCC_AHB1Periph_ETH_MAC_Rx, ENABLE);
  79139. /* Reset ETHERNET on AHB Bus */
  79140. ETH_DeInit();
  79141. 80384c0: f000 f868 bl 8038594 <ETH_DeInit>
  79142. /* Software reset */
  79143. ETH_SoftwareReset();
  79144. 80384c4: f000 f9fe bl 80388c4 <ETH_SoftwareReset>
  79145. /* Wait for software reset */
  79146. while (ETH_GetSoftwareResetStatus() == SET);
  79147. 80384c8: f000 fa04 bl 80388d4 <ETH_GetSoftwareResetStatus>
  79148. 80384cc: 2801 cmp r0, #1
  79149. 80384ce: d0fb beq.n 80384c8 <ETH_BSP_Config+0x120>
  79150. /* ETHERNET Configuration --------------------------------------------------*/
  79151. /* Call ETH_StructInit if you don't like to configure all ETH_InitStructure parameter */
  79152. ETH_StructInit(&ETH_InitStructure);
  79153. 80384d0: a805 add r0, sp, #20
  79154. 80384d2: f000 f86c bl 80385ae <ETH_StructInit>
  79155. //ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Disable;
  79156. // ETH_InitStructure.ETH_Speed = ETH_Speed_10M;
  79157. // ETH_InitStructure.ETH_Mode = ETH_Mode_FullDuplex;
  79158. ETH_InitStructure.ETH_LoopbackMode = ETH_LoopbackMode_Disable;
  79159. ETH_InitStructure.ETH_RetryTransmission = ETH_RetryTransmission_Disable;
  79160. 80384d6: f44f 7300 mov.w r3, #512 ; 0x200
  79161. 80384da: 930f str r3, [sp, #60] ; 0x3c
  79162. /* When we use the Checksum offload feature, we need to enable the Store and Forward mode:
  79163. the store and forward guarantee that a whole frame is stored in the FIFO, so the MAC can insert/verify the checksum,
  79164. if the checksum is OK the DMA can handle the frame otherwise the frame is dropped */
  79165. ETH_InitStructure.ETH_DropTCPIPChecksumErrorFrame = ETH_DropTCPIPChecksumErrorFrame_Enable;
  79166. ETH_InitStructure.ETH_ReceiveStoreForward = ETH_ReceiveStoreForward_Enable;
  79167. 80384dc: f04f 7300 mov.w r3, #33554432 ; 0x2000000
  79168. 80384e0: 9326 str r3, [sp, #152] ; 0x98
  79169. ETH_InitStructure.ETH_TransmitStoreForward = ETH_TransmitStoreForward_Enable;
  79170. ETH_InitStructure.ETH_ForwardErrorFrames = ETH_ForwardErrorFrames_Disable;
  79171. ETH_InitStructure.ETH_ForwardUndersizedGoodFrames = ETH_ForwardUndersizedGoodFrames_Disable;
  79172. ETH_InitStructure.ETH_SecondFrameOperate = ETH_SecondFrameOperate_Enable;
  79173. ETH_InitStructure.ETH_AddressAlignedBeats = ETH_AddressAlignedBeats_Enable;
  79174. 80384e2: 932e str r3, [sp, #184] ; 0xb8
  79175. ETH_InitStructure.ETH_FixedBurst = ETH_FixedBurst_Enable;
  79176. 80384e4: f44f 3380 mov.w r3, #65536 ; 0x10000
  79177. 80384e8: 932f str r3, [sp, #188] ; 0xbc
  79178. ETH_InitStructure.ETH_RxDMABurstLength = ETH_RxDMABurstLength_32Beat;
  79179. 80384ea: f44f 0380 mov.w r3, #4194304 ; 0x400000
  79180. /* Call ETH_StructInit if you don't like to configure all ETH_InitStructure parameter */
  79181. ETH_StructInit(&ETH_InitStructure);
  79182. /* Fill ETH_InitStructure parametrs */
  79183. /*------------------------ MAC -----------------------------------*/
  79184. ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Enable;
  79185. 80384ee: 2501 movs r5, #1
  79186. /* When we use the Checksum offload feature, we need to enable the Store and Forward mode:
  79187. the store and forward guarantee that a whole frame is stored in the FIFO, so the MAC can insert/verify the checksum,
  79188. if the checksum is OK the DMA can handle the frame otherwise the frame is dropped */
  79189. ETH_InitStructure.ETH_DropTCPIPChecksumErrorFrame = ETH_DropTCPIPChecksumErrorFrame_Enable;
  79190. ETH_InitStructure.ETH_ReceiveStoreForward = ETH_ReceiveStoreForward_Enable;
  79191. ETH_InitStructure.ETH_TransmitStoreForward = ETH_TransmitStoreForward_Enable;
  79192. 80384f0: f44f 1200 mov.w r2, #2097152 ; 0x200000
  79193. ETH_InitStructure.ETH_ForwardErrorFrames = ETH_ForwardErrorFrames_Disable;
  79194. ETH_InitStructure.ETH_ForwardUndersizedGoodFrames = ETH_ForwardUndersizedGoodFrames_Disable;
  79195. ETH_InitStructure.ETH_SecondFrameOperate = ETH_SecondFrameOperate_Enable;
  79196. ETH_InitStructure.ETH_AddressAlignedBeats = ETH_AddressAlignedBeats_Enable;
  79197. ETH_InitStructure.ETH_FixedBurst = ETH_FixedBurst_Enable;
  79198. ETH_InitStructure.ETH_RxDMABurstLength = ETH_RxDMABurstLength_32Beat;
  79199. 80384f4: 9330 str r3, [sp, #192] ; 0xc0
  79200. ETH_InitStructure.ETH_TxDMABurstLength = ETH_TxDMABurstLength_32Beat;
  79201. 80384f6: f44f 5300 mov.w r3, #8192 ; 0x2000
  79202. ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Enable;
  79203. //ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Disable;
  79204. // ETH_InitStructure.ETH_Speed = ETH_Speed_10M;
  79205. // ETH_InitStructure.ETH_Mode = ETH_Mode_FullDuplex;
  79206. ETH_InitStructure.ETH_LoopbackMode = ETH_LoopbackMode_Disable;
  79207. 80384fa: 2400 movs r4, #0
  79208. /* When we use the Checksum offload feature, we need to enable the Store and Forward mode:
  79209. the store and forward guarantee that a whole frame is stored in the FIFO, so the MAC can insert/verify the checksum,
  79210. if the checksum is OK the DMA can handle the frame otherwise the frame is dropped */
  79211. ETH_InitStructure.ETH_DropTCPIPChecksumErrorFrame = ETH_DropTCPIPChecksumErrorFrame_Enable;
  79212. ETH_InitStructure.ETH_ReceiveStoreForward = ETH_ReceiveStoreForward_Enable;
  79213. ETH_InitStructure.ETH_TransmitStoreForward = ETH_TransmitStoreForward_Enable;
  79214. 80384fc: 9228 str r2, [sp, #160] ; 0xa0
  79215. ETH_InitStructure.ETH_ForwardUndersizedGoodFrames = ETH_ForwardUndersizedGoodFrames_Disable;
  79216. ETH_InitStructure.ETH_SecondFrameOperate = ETH_SecondFrameOperate_Enable;
  79217. ETH_InitStructure.ETH_AddressAlignedBeats = ETH_AddressAlignedBeats_Enable;
  79218. ETH_InitStructure.ETH_FixedBurst = ETH_FixedBurst_Enable;
  79219. ETH_InitStructure.ETH_RxDMABurstLength = ETH_RxDMABurstLength_32Beat;
  79220. ETH_InitStructure.ETH_TxDMABurstLength = ETH_TxDMABurstLength_32Beat;
  79221. 80384fe: 9331 str r3, [sp, #196] ; 0xc4
  79222. ETH_InitStructure.ETH_ReceiveStoreForward = ETH_ReceiveStoreForward_Enable;
  79223. ETH_InitStructure.ETH_TransmitStoreForward = ETH_TransmitStoreForward_Enable;
  79224. ETH_InitStructure.ETH_ForwardErrorFrames = ETH_ForwardErrorFrames_Disable;
  79225. ETH_InitStructure.ETH_ForwardUndersizedGoodFrames = ETH_ForwardUndersizedGoodFrames_Disable;
  79226. ETH_InitStructure.ETH_SecondFrameOperate = ETH_SecondFrameOperate_Enable;
  79227. 8038500: 2204 movs r2, #4
  79228. ETH_InitStructure.ETH_AddressAlignedBeats = ETH_AddressAlignedBeats_Enable;
  79229. ETH_InitStructure.ETH_FixedBurst = ETH_FixedBurst_Enable;
  79230. ETH_InitStructure.ETH_RxDMABurstLength = ETH_RxDMABurstLength_32Beat;
  79231. ETH_InitStructure.ETH_TxDMABurstLength = ETH_TxDMABurstLength_32Beat;
  79232. ETH_InitStructure.ETH_DMAArbitration = ETH_DMAArbitration_RoundRobin_RxTx_2_1;
  79233. 8038502: f44f 4380 mov.w r3, #16384 ; 0x4000
  79234. /* Configure Ethernet */
  79235. EthInitStatus = ETH_Init(&ETH_InitStructure, LAN8720_PHY_ADDRESS);
  79236. 8038506: 4629 mov r1, r5
  79237. 8038508: a805 add r0, sp, #20
  79238. ETH_InitStructure.ETH_ReceiveStoreForward = ETH_ReceiveStoreForward_Enable;
  79239. ETH_InitStructure.ETH_TransmitStoreForward = ETH_TransmitStoreForward_Enable;
  79240. ETH_InitStructure.ETH_ForwardErrorFrames = ETH_ForwardErrorFrames_Disable;
  79241. ETH_InitStructure.ETH_ForwardUndersizedGoodFrames = ETH_ForwardUndersizedGoodFrames_Disable;
  79242. ETH_InitStructure.ETH_SecondFrameOperate = ETH_SecondFrameOperate_Enable;
  79243. 803850a: 922d str r2, [sp, #180] ; 0xb4
  79244. ETH_InitStructure.ETH_AddressAlignedBeats = ETH_AddressAlignedBeats_Enable;
  79245. ETH_InitStructure.ETH_FixedBurst = ETH_FixedBurst_Enable;
  79246. ETH_InitStructure.ETH_RxDMABurstLength = ETH_RxDMABurstLength_32Beat;
  79247. ETH_InitStructure.ETH_TxDMABurstLength = ETH_TxDMABurstLength_32Beat;
  79248. ETH_InitStructure.ETH_DMAArbitration = ETH_DMAArbitration_RoundRobin_RxTx_2_1;
  79249. 803850c: 9333 str r3, [sp, #204] ; 0xcc
  79250. /* Call ETH_StructInit if you don't like to configure all ETH_InitStructure parameter */
  79251. ETH_StructInit(&ETH_InitStructure);
  79252. /* Fill ETH_InitStructure parametrs */
  79253. /*------------------------ MAC -----------------------------------*/
  79254. ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Enable;
  79255. 803850e: 9505 str r5, [sp, #20]
  79256. //ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Disable;
  79257. // ETH_InitStructure.ETH_Speed = ETH_Speed_10M;
  79258. // ETH_InitStructure.ETH_Mode = ETH_Mode_FullDuplex;
  79259. ETH_InitStructure.ETH_LoopbackMode = ETH_LoopbackMode_Disable;
  79260. 8038510: 940c str r4, [sp, #48] ; 0x30
  79261. ETH_InitStructure.ETH_RetryTransmission = ETH_RetryTransmission_Disable;
  79262. ETH_InitStructure.ETH_AutomaticPadCRCStrip = ETH_AutomaticPadCRCStrip_Disable;
  79263. 8038512: 9410 str r4, [sp, #64] ; 0x40
  79264. ETH_InitStructure.ETH_ReceiveAll = ETH_ReceiveAll_Disable;
  79265. 8038514: 9413 str r4, [sp, #76] ; 0x4c
  79266. ETH_InitStructure.ETH_BroadcastFramesReception = ETH_BroadcastFramesReception_Enable;
  79267. 8038516: 9416 str r4, [sp, #88] ; 0x58
  79268. ETH_InitStructure.ETH_PromiscuousMode = ETH_PromiscuousMode_Disable;
  79269. 8038518: 9418 str r4, [sp, #96] ; 0x60
  79270. ETH_InitStructure.ETH_MulticastFramesFilter = ETH_MulticastFramesFilter_Perfect;
  79271. 803851a: 9419 str r4, [sp, #100] ; 0x64
  79272. ETH_InitStructure.ETH_UnicastFramesFilter = ETH_UnicastFramesFilter_Perfect;
  79273. 803851c: 941a str r4, [sp, #104] ; 0x68
  79274. /*------------------------ DMA -----------------------------------*/
  79275. /* When we use the Checksum offload feature, we need to enable the Store and Forward mode:
  79276. the store and forward guarantee that a whole frame is stored in the FIFO, so the MAC can insert/verify the checksum,
  79277. if the checksum is OK the DMA can handle the frame otherwise the frame is dropped */
  79278. ETH_InitStructure.ETH_DropTCPIPChecksumErrorFrame = ETH_DropTCPIPChecksumErrorFrame_Enable;
  79279. 803851e: 9425 str r4, [sp, #148] ; 0x94
  79280. ETH_InitStructure.ETH_ReceiveStoreForward = ETH_ReceiveStoreForward_Enable;
  79281. ETH_InitStructure.ETH_TransmitStoreForward = ETH_TransmitStoreForward_Enable;
  79282. ETH_InitStructure.ETH_ForwardErrorFrames = ETH_ForwardErrorFrames_Disable;
  79283. 8038520: 942a str r4, [sp, #168] ; 0xa8
  79284. ETH_InitStructure.ETH_ForwardUndersizedGoodFrames = ETH_ForwardUndersizedGoodFrames_Disable;
  79285. 8038522: 942b str r4, [sp, #172] ; 0xac
  79286. ETH_InitStructure.ETH_RxDMABurstLength = ETH_RxDMABurstLength_32Beat;
  79287. ETH_InitStructure.ETH_TxDMABurstLength = ETH_TxDMABurstLength_32Beat;
  79288. ETH_InitStructure.ETH_DMAArbitration = ETH_DMAArbitration_RoundRobin_RxTx_2_1;
  79289. /* Configure Ethernet */
  79290. EthInitStatus = ETH_Init(&ETH_InitStructure, LAN8720_PHY_ADDRESS);
  79291. 8038524: f000 fa80 bl 8038a28 <ETH_Init>
  79292. 8038528: 4e11 ldr r6, [pc, #68] ; (8038570 <ETH_BSP_Config+0x1c8>)
  79293. /* Enable the Ethernet Rx Interrupt */
  79294. ETH_DMAITConfig(ETH_DMA_IT_NIS | ETH_DMA_IT_R, ENABLE);
  79295. 803852a: 4629 mov r1, r5
  79296. ETH_InitStructure.ETH_RxDMABurstLength = ETH_RxDMABurstLength_32Beat;
  79297. ETH_InitStructure.ETH_TxDMABurstLength = ETH_TxDMABurstLength_32Beat;
  79298. ETH_InitStructure.ETH_DMAArbitration = ETH_DMAArbitration_RoundRobin_RxTx_2_1;
  79299. /* Configure Ethernet */
  79300. EthInitStatus = ETH_Init(&ETH_InitStructure, LAN8720_PHY_ADDRESS);
  79301. 803852c: 6030 str r0, [r6, #0]
  79302. /* Enable the Ethernet Rx Interrupt */
  79303. ETH_DMAITConfig(ETH_DMA_IT_NIS | ETH_DMA_IT_R, ENABLE);
  79304. 803852e: 4811 ldr r0, [pc, #68] ; (8038574 <ETH_BSP_Config+0x1cc>)
  79305. 8038530: f000 f9e2 bl 80388f8 <ETH_DMAITConfig>
  79306. void ETH_NVIC_Config(void)
  79307. {
  79308. NVIC_InitTypeDef NVIC_InitStructure;
  79309. /* 2 bit for pre-emption priority, 2 bits for subpriority */
  79310. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
  79311. 8038534: f44f 7040 mov.w r0, #768 ; 0x300
  79312. 8038538: f7ed f834 bl 80255a4 <NVIC_PriorityGroupConfig>
  79313. /* Enable the Ethernet global Interrupt */
  79314. NVIC_InitStructure.NVIC_IRQChannel = ETH_IRQn;
  79315. 803853c: 233d movs r3, #61 ; 0x3d
  79316. 803853e: f88d 3008 strb.w r3, [sp, #8]
  79317. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 5;
  79318. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  79319. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  79320. NVIC_Init(&NVIC_InitStructure);
  79321. 8038542: a802 add r0, sp, #8
  79322. /* 2 bit for pre-emption priority, 2 bits for subpriority */
  79323. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
  79324. /* Enable the Ethernet global Interrupt */
  79325. NVIC_InitStructure.NVIC_IRQChannel = ETH_IRQn;
  79326. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 5;
  79327. 8038544: 2305 movs r3, #5
  79328. 8038546: f88d 3009 strb.w r3, [sp, #9]
  79329. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  79330. 803854a: f88d 400a strb.w r4, [sp, #10]
  79331. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  79332. 803854e: f88d 500b strb.w r5, [sp, #11]
  79333. NVIC_Init(&NVIC_InitStructure);
  79334. 8038552: f7ed f831 bl 80255b8 <NVIC_Init>
  79335. /* Configure the Ethernet MAC/DMA */
  79336. ETH_MACDMA_Config();
  79337. ETH_NVIC_Config();
  79338. if (EthInitStatus == 0) {
  79339. 8038556: 6833 ldr r3, [r6, #0]
  79340. 8038558: b903 cbnz r3, 803855c <ETH_BSP_Config+0x1b4>
  79341. 803855a: e7fe b.n 803855a <ETH_BSP_Config+0x1b2>
  79342. // LCD_DisplayStringLine(Line5, (uint8_t*)" Ethernet Init ");
  79343. // LCD_DisplayStringLine(Line6, (uint8_t*)" failed ");
  79344. // STM_EVAL_LEDOn(LED5);
  79345. while(1);
  79346. }
  79347. }
  79348. 803855c: b034 add sp, #208 ; 0xd0
  79349. 803855e: bd70 pop {r4, r5, r6, pc}
  79350. 8038560: 40020000 .word 0x40020000
  79351. 8038564: 40020400 .word 0x40020400
  79352. 8038568: 40020800 .word 0x40020800
  79353. 803856c: 40021000 .word 0x40021000
  79354. 8038570: 2000c854 .word 0x2000c854
  79355. 8038574: 00010040 .word 0x00010040
  79356. 08038578 <ETH_Delay>:
  79357. * @brief Inserts a delay time.
  79358. * @param nCount: specifies the delay time length.
  79359. * @retval None
  79360. */
  79361. static void ETH_Delay(__IO uint32_t nCount)
  79362. {
  79363. 8038578: b084 sub sp, #16
  79364. __IO uint32_t index = 0;
  79365. 803857a: 2300 movs r3, #0
  79366. * @brief Inserts a delay time.
  79367. * @param nCount: specifies the delay time length.
  79368. * @retval None
  79369. */
  79370. static void ETH_Delay(__IO uint32_t nCount)
  79371. {
  79372. 803857c: 9001 str r0, [sp, #4]
  79373. __IO uint32_t index = 0;
  79374. 803857e: 9303 str r3, [sp, #12]
  79375. for(index = nCount; index != 0; index--)
  79376. 8038580: 9b01 ldr r3, [sp, #4]
  79377. 8038582: e001 b.n 8038588 <ETH_Delay+0x10>
  79378. 8038584: 9b03 ldr r3, [sp, #12]
  79379. 8038586: 3b01 subs r3, #1
  79380. 8038588: 9303 str r3, [sp, #12]
  79381. 803858a: 9b03 ldr r3, [sp, #12]
  79382. 803858c: 2b00 cmp r3, #0
  79383. 803858e: d1f9 bne.n 8038584 <ETH_Delay+0xc>
  79384. {
  79385. }
  79386. }
  79387. 8038590: b004 add sp, #16
  79388. 8038592: 4770 bx lr
  79389. 08038594 <ETH_DeInit>:
  79390. * @brief Deinitializes the ETHERNET peripheral registers to their default reset values.
  79391. * @param None
  79392. * @retval None
  79393. */
  79394. void ETH_DeInit(void)
  79395. {
  79396. 8038594: b508 push {r3, lr}
  79397. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_ETH_MAC, ENABLE);
  79398. 8038596: 2101 movs r1, #1
  79399. 8038598: f04f 7000 mov.w r0, #33554432 ; 0x2000000
  79400. 803859c: f7ed fa92 bl 8025ac4 <RCC_AHB1PeriphResetCmd>
  79401. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_ETH_MAC, DISABLE);
  79402. 80385a0: f04f 7000 mov.w r0, #33554432 ; 0x2000000
  79403. 80385a4: 2100 movs r1, #0
  79404. }
  79405. 80385a6: e8bd 4008 ldmia.w sp!, {r3, lr}
  79406. * @retval None
  79407. */
  79408. void ETH_DeInit(void)
  79409. {
  79410. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_ETH_MAC, ENABLE);
  79411. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_ETH_MAC, DISABLE);
  79412. 80385aa: f7ed ba8b b.w 8025ac4 <RCC_AHB1PeriphResetCmd>
  79413. 080385ae <ETH_StructInit>:
  79414. /* Ethernet interframe gap set to 96 bits */
  79415. ETH_InitStruct->ETH_InterFrameGap = ETH_InterFrameGap_96Bit;
  79416. /* Carrier Sense Enabled in Half-Duplex mode */
  79417. ETH_InitStruct->ETH_CarrierSense = ETH_CarrierSense_Enable;
  79418. /* PHY speed configured to 100Mbit/s */
  79419. ETH_InitStruct->ETH_Speed = ETH_Speed_100M;
  79420. 80385ae: f44f 4280 mov.w r2, #16384 ; 0x4000
  79421. 80385b2: 6142 str r2, [r0, #20]
  79422. /* Receive own Frames in Half-Duplex mode enabled */
  79423. ETH_InitStruct->ETH_ReceiveOwn = ETH_ReceiveOwn_Enable;
  79424. /* MAC MII loopback disabled */
  79425. ETH_InitStruct->ETH_LoopbackMode = ETH_LoopbackMode_Disable;
  79426. /* Full-Duplex mode selected */
  79427. ETH_InitStruct->ETH_Mode = ETH_Mode_FullDuplex;
  79428. 80385b4: f44f 6200 mov.w r2, #2048 ; 0x800
  79429. 80385b8: 6202 str r2, [r0, #32]
  79430. /* Receive all frames disabled */
  79431. ETH_InitStruct->ETH_ReceiveAll = ETH_ReceiveAll_Disable;
  79432. /* Source address filtering (on the optional MAC addresses) disabled */
  79433. ETH_InitStruct->ETH_SourceAddrFilter = ETH_SourceAddrFilter_Disable;
  79434. /* Do not forward control frames that do not pass the address filtering */
  79435. ETH_InitStruct->ETH_PassControlFrames = ETH_PassControlFrames_BlockAll;
  79436. 80385ba: 2240 movs r2, #64 ; 0x40
  79437. 80385bc: 6402 str r2, [r0, #64] ; 0x40
  79438. /* Disable reception of Broadcast frames */
  79439. ETH_InitStruct->ETH_BroadcastFramesReception = ETH_BroadcastFramesReception_Disable;
  79440. 80385be: 2220 movs r2, #32
  79441. 80385c0: 6442 str r2, [r0, #68] ; 0x44
  79442. /* Initialize hash table high and low regs */
  79443. ETH_InitStruct->ETH_HashTableHigh = 0x0;
  79444. ETH_InitStruct->ETH_HashTableLow = 0x0;
  79445. /* Flow control config (flow control disabled)*/
  79446. ETH_InitStruct->ETH_PauseTime = 0x0;
  79447. ETH_InitStruct->ETH_ZeroQuantaPause = ETH_ZeroQuantaPause_Disable;
  79448. 80385c2: 2280 movs r2, #128 ; 0x80
  79449. {
  79450. /* ETH_InitStruct members default value */
  79451. /*------------------------ MAC Configuration ---------------------------*/
  79452. /* PHY Auto-negotiation enabled */
  79453. ETH_InitStruct->ETH_AutoNegotiation = ETH_AutoNegotiation_Enable;
  79454. 80385c4: 2301 movs r3, #1
  79455. /* Initialize hash table high and low regs */
  79456. ETH_InitStruct->ETH_HashTableHigh = 0x0;
  79457. ETH_InitStruct->ETH_HashTableLow = 0x0;
  79458. /* Flow control config (flow control disabled)*/
  79459. ETH_InitStruct->ETH_PauseTime = 0x0;
  79460. ETH_InitStruct->ETH_ZeroQuantaPause = ETH_ZeroQuantaPause_Disable;
  79461. 80385c6: 6642 str r2, [r0, #100] ; 0x64
  79462. ETH_InitStruct->ETH_VLANTagIdentifier = 0x0;
  79463. /*---------------------- DMA Configuration -------------------------------*/
  79464. /* Drops frames with with TCP/IP checksum errors */
  79465. ETH_InitStruct->ETH_DropTCPIPChecksumErrorFrame = ETH_DropTCPIPChecksumErrorFrame_Disable;
  79466. 80385c8: f04f 6280 mov.w r2, #67108864 ; 0x4000000
  79467. {
  79468. /* ETH_InitStruct members default value */
  79469. /*------------------------ MAC Configuration ---------------------------*/
  79470. /* PHY Auto-negotiation enabled */
  79471. ETH_InitStruct->ETH_AutoNegotiation = ETH_AutoNegotiation_Enable;
  79472. 80385cc: 6003 str r3, [r0, #0]
  79473. ETH_InitStruct->ETH_VLANTagIdentifier = 0x0;
  79474. /*---------------------- DMA Configuration -------------------------------*/
  79475. /* Drops frames with with TCP/IP checksum errors */
  79476. ETH_InitStruct->ETH_DropTCPIPChecksumErrorFrame = ETH_DropTCPIPChecksumErrorFrame_Disable;
  79477. 80385ce: f8c0 2080 str.w r2, [r0, #128] ; 0x80
  79478. /*------------------------ MAC Configuration ---------------------------*/
  79479. /* PHY Auto-negotiation enabled */
  79480. ETH_InitStruct->ETH_AutoNegotiation = ETH_AutoNegotiation_Enable;
  79481. /* MAC watchdog enabled: cuts-off long frame */
  79482. ETH_InitStruct->ETH_Watchdog = ETH_Watchdog_Enable;
  79483. 80385d2: 2300 movs r3, #0
  79484. /*---------------------- DMA Configuration -------------------------------*/
  79485. /* Drops frames with with TCP/IP checksum errors */
  79486. ETH_InitStruct->ETH_DropTCPIPChecksumErrorFrame = ETH_DropTCPIPChecksumErrorFrame_Disable;
  79487. /* Store and forward mode enabled for receive */
  79488. ETH_InitStruct->ETH_ReceiveStoreForward = ETH_ReceiveStoreForward_Enable;
  79489. 80385d4: f04f 7200 mov.w r2, #33554432 ; 0x2000000
  79490. /*------------------------ MAC Configuration ---------------------------*/
  79491. /* PHY Auto-negotiation enabled */
  79492. ETH_InitStruct->ETH_AutoNegotiation = ETH_AutoNegotiation_Enable;
  79493. /* MAC watchdog enabled: cuts-off long frame */
  79494. ETH_InitStruct->ETH_Watchdog = ETH_Watchdog_Enable;
  79495. 80385d8: 6043 str r3, [r0, #4]
  79496. /* MAC Jabber enabled in Half-duplex mode */
  79497. ETH_InitStruct->ETH_Jabber = ETH_Jabber_Enable;
  79498. 80385da: 6083 str r3, [r0, #8]
  79499. /* Ethernet interframe gap set to 96 bits */
  79500. ETH_InitStruct->ETH_InterFrameGap = ETH_InterFrameGap_96Bit;
  79501. 80385dc: 60c3 str r3, [r0, #12]
  79502. /* Carrier Sense Enabled in Half-Duplex mode */
  79503. ETH_InitStruct->ETH_CarrierSense = ETH_CarrierSense_Enable;
  79504. 80385de: 6103 str r3, [r0, #16]
  79505. /* PHY speed configured to 100Mbit/s */
  79506. ETH_InitStruct->ETH_Speed = ETH_Speed_100M;
  79507. /* Receive own Frames in Half-Duplex mode enabled */
  79508. ETH_InitStruct->ETH_ReceiveOwn = ETH_ReceiveOwn_Enable;
  79509. 80385e0: 6183 str r3, [r0, #24]
  79510. /* MAC MII loopback disabled */
  79511. ETH_InitStruct->ETH_LoopbackMode = ETH_LoopbackMode_Disable;
  79512. 80385e2: 61c3 str r3, [r0, #28]
  79513. /* Full-Duplex mode selected */
  79514. ETH_InitStruct->ETH_Mode = ETH_Mode_FullDuplex;
  79515. /* IPv4 and TCP/UDP/ICMP frame Checksum Offload disabled */
  79516. ETH_InitStruct->ETH_ChecksumOffload = ETH_ChecksumOffload_Disable;
  79517. 80385e4: 6243 str r3, [r0, #36] ; 0x24
  79518. /* Retry Transmission enabled for half-duplex mode */
  79519. ETH_InitStruct->ETH_RetryTransmission = ETH_RetryTransmission_Enable;
  79520. 80385e6: 6283 str r3, [r0, #40] ; 0x28
  79521. /* Automatic PAD/CRC strip disabled*/
  79522. ETH_InitStruct->ETH_AutomaticPadCRCStrip = ETH_AutomaticPadCRCStrip_Disable;
  79523. 80385e8: 62c3 str r3, [r0, #44] ; 0x2c
  79524. /* half-duplex mode retransmission Backoff time_limit = 10 slot times*/
  79525. ETH_InitStruct->ETH_BackOffLimit = ETH_BackOffLimit_10;
  79526. 80385ea: 6303 str r3, [r0, #48] ; 0x30
  79527. /* half-duplex mode Deferral check disabled */
  79528. ETH_InitStruct->ETH_DeferralCheck = ETH_DeferralCheck_Disable;
  79529. 80385ec: 6343 str r3, [r0, #52] ; 0x34
  79530. /* Receive all frames disabled */
  79531. ETH_InitStruct->ETH_ReceiveAll = ETH_ReceiveAll_Disable;
  79532. 80385ee: 6383 str r3, [r0, #56] ; 0x38
  79533. /* Source address filtering (on the optional MAC addresses) disabled */
  79534. ETH_InitStruct->ETH_SourceAddrFilter = ETH_SourceAddrFilter_Disable;
  79535. 80385f0: 63c3 str r3, [r0, #60] ; 0x3c
  79536. /* Do not forward control frames that do not pass the address filtering */
  79537. ETH_InitStruct->ETH_PassControlFrames = ETH_PassControlFrames_BlockAll;
  79538. /* Disable reception of Broadcast frames */
  79539. ETH_InitStruct->ETH_BroadcastFramesReception = ETH_BroadcastFramesReception_Disable;
  79540. /* Normal Destination address filtering (not reverse addressing) */
  79541. ETH_InitStruct->ETH_DestinationAddrFilter = ETH_DestinationAddrFilter_Normal;
  79542. 80385f2: 6483 str r3, [r0, #72] ; 0x48
  79543. /* Promiscuous address filtering mode disabled */
  79544. ETH_InitStruct->ETH_PromiscuousMode = ETH_PromiscuousMode_Disable;
  79545. 80385f4: 64c3 str r3, [r0, #76] ; 0x4c
  79546. /* Perfect address filtering for multicast addresses */
  79547. ETH_InitStruct->ETH_MulticastFramesFilter = ETH_MulticastFramesFilter_Perfect;
  79548. 80385f6: 6503 str r3, [r0, #80] ; 0x50
  79549. /* Perfect address filtering for unicast addresses */
  79550. ETH_InitStruct->ETH_UnicastFramesFilter = ETH_UnicastFramesFilter_Perfect;
  79551. 80385f8: 6543 str r3, [r0, #84] ; 0x54
  79552. /* Initialize hash table high and low regs */
  79553. ETH_InitStruct->ETH_HashTableHigh = 0x0;
  79554. 80385fa: 6583 str r3, [r0, #88] ; 0x58
  79555. ETH_InitStruct->ETH_HashTableLow = 0x0;
  79556. 80385fc: 65c3 str r3, [r0, #92] ; 0x5c
  79557. /* Flow control config (flow control disabled)*/
  79558. ETH_InitStruct->ETH_PauseTime = 0x0;
  79559. 80385fe: 6603 str r3, [r0, #96] ; 0x60
  79560. ETH_InitStruct->ETH_ZeroQuantaPause = ETH_ZeroQuantaPause_Disable;
  79561. ETH_InitStruct->ETH_PauseLowThreshold = ETH_PauseLowThreshold_Minus4;
  79562. 8038600: 6683 str r3, [r0, #104] ; 0x68
  79563. ETH_InitStruct->ETH_UnicastPauseFrameDetect = ETH_UnicastPauseFrameDetect_Disable;
  79564. 8038602: 66c3 str r3, [r0, #108] ; 0x6c
  79565. ETH_InitStruct->ETH_ReceiveFlowControl = ETH_ReceiveFlowControl_Disable;
  79566. 8038604: 6703 str r3, [r0, #112] ; 0x70
  79567. ETH_InitStruct->ETH_TransmitFlowControl = ETH_TransmitFlowControl_Disable;
  79568. 8038606: 6743 str r3, [r0, #116] ; 0x74
  79569. /* VLANtag config (VLAN field not checked) */
  79570. ETH_InitStruct->ETH_VLANTagComparison = ETH_VLANTagComparison_16Bit;
  79571. 8038608: 6783 str r3, [r0, #120] ; 0x78
  79572. ETH_InitStruct->ETH_VLANTagIdentifier = 0x0;
  79573. 803860a: 67c3 str r3, [r0, #124] ; 0x7c
  79574. /*---------------------- DMA Configuration -------------------------------*/
  79575. /* Drops frames with with TCP/IP checksum errors */
  79576. ETH_InitStruct->ETH_DropTCPIPChecksumErrorFrame = ETH_DropTCPIPChecksumErrorFrame_Disable;
  79577. /* Store and forward mode enabled for receive */
  79578. ETH_InitStruct->ETH_ReceiveStoreForward = ETH_ReceiveStoreForward_Enable;
  79579. 803860c: f8c0 2084 str.w r2, [r0, #132] ; 0x84
  79580. ETH_InitStruct->ETH_ReceiveThresholdControl = ETH_ReceiveThresholdControl_64Bytes;
  79581. /* Disable Operate on second frame (transmit a second frame to FIFO without
  79582. waiting status of previous frame*/
  79583. ETH_InitStruct->ETH_SecondFrameOperate = ETH_SecondFrameOperate_Disable;
  79584. /* DMA works on 32-bit aligned start source and destinations addresses */
  79585. ETH_InitStruct->ETH_AddressAlignedBeats = ETH_AddressAlignedBeats_Enable;
  79586. 8038610: f8c0 20a4 str.w r2, [r0, #164] ; 0xa4
  79587. /* Enabled Fixed Burst Mode (mix of INC4, INC8, INC16 and SINGLE DMA transactions */
  79588. ETH_InitStruct->ETH_FixedBurst = ETH_FixedBurst_Enable;
  79589. 8038614: f44f 3280 mov.w r2, #65536 ; 0x10000
  79590. 8038618: f8c0 20a8 str.w r2, [r0, #168] ; 0xa8
  79591. /* DMA transfer max burst length = 32 beats = 32 x 32bits */
  79592. ETH_InitStruct->ETH_RxDMABurstLength = ETH_RxDMABurstLength_32Beat;
  79593. 803861c: f44f 0280 mov.w r2, #4194304 ; 0x400000
  79594. /* Store and forward mode enabled for receive */
  79595. ETH_InitStruct->ETH_ReceiveStoreForward = ETH_ReceiveStoreForward_Enable;
  79596. /* Flush received frame that created FIFO overflow */
  79597. ETH_InitStruct->ETH_FlushReceivedFrame = ETH_FlushReceivedFrame_Enable;
  79598. /* Store and forward mode enabled for transmit */
  79599. ETH_InitStruct->ETH_TransmitStoreForward = ETH_TransmitStoreForward_Enable;
  79600. 8038620: f44f 1100 mov.w r1, #2097152 ; 0x200000
  79601. /* DMA works on 32-bit aligned start source and destinations addresses */
  79602. ETH_InitStruct->ETH_AddressAlignedBeats = ETH_AddressAlignedBeats_Enable;
  79603. /* Enabled Fixed Burst Mode (mix of INC4, INC8, INC16 and SINGLE DMA transactions */
  79604. ETH_InitStruct->ETH_FixedBurst = ETH_FixedBurst_Enable;
  79605. /* DMA transfer max burst length = 32 beats = 32 x 32bits */
  79606. ETH_InitStruct->ETH_RxDMABurstLength = ETH_RxDMABurstLength_32Beat;
  79607. 8038624: f8c0 20ac str.w r2, [r0, #172] ; 0xac
  79608. ETH_InitStruct->ETH_TxDMABurstLength = ETH_TxDMABurstLength_32Beat;
  79609. 8038628: f44f 5200 mov.w r2, #8192 ; 0x2000
  79610. /* Drops frames with with TCP/IP checksum errors */
  79611. ETH_InitStruct->ETH_DropTCPIPChecksumErrorFrame = ETH_DropTCPIPChecksumErrorFrame_Disable;
  79612. /* Store and forward mode enabled for receive */
  79613. ETH_InitStruct->ETH_ReceiveStoreForward = ETH_ReceiveStoreForward_Enable;
  79614. /* Flush received frame that created FIFO overflow */
  79615. ETH_InitStruct->ETH_FlushReceivedFrame = ETH_FlushReceivedFrame_Enable;
  79616. 803862c: f8c0 3088 str.w r3, [r0, #136] ; 0x88
  79617. /* Store and forward mode enabled for transmit */
  79618. ETH_InitStruct->ETH_TransmitStoreForward = ETH_TransmitStoreForward_Enable;
  79619. 8038630: f8c0 108c str.w r1, [r0, #140] ; 0x8c
  79620. /* Threshold TXFIFO level set to 64 bytes (used when threshold mode is enabled) */
  79621. ETH_InitStruct->ETH_TransmitThresholdControl = ETH_TransmitThresholdControl_64Bytes;
  79622. 8038634: f8c0 3090 str.w r3, [r0, #144] ; 0x90
  79623. /* Disable forwarding frames with errors (short frames, CRC,...)*/
  79624. ETH_InitStruct->ETH_ForwardErrorFrames = ETH_ForwardErrorFrames_Disable;
  79625. 8038638: f8c0 3094 str.w r3, [r0, #148] ; 0x94
  79626. /* Disable undersized good frames */
  79627. ETH_InitStruct->ETH_ForwardUndersizedGoodFrames = ETH_ForwardUndersizedGoodFrames_Disable;
  79628. 803863c: f8c0 3098 str.w r3, [r0, #152] ; 0x98
  79629. /* Threshold RXFIFO level set to 64 bytes (used when Cut-through mode is enabled) */
  79630. ETH_InitStruct->ETH_ReceiveThresholdControl = ETH_ReceiveThresholdControl_64Bytes;
  79631. 8038640: f8c0 309c str.w r3, [r0, #156] ; 0x9c
  79632. /* Disable Operate on second frame (transmit a second frame to FIFO without
  79633. waiting status of previous frame*/
  79634. ETH_InitStruct->ETH_SecondFrameOperate = ETH_SecondFrameOperate_Disable;
  79635. 8038644: f8c0 30a0 str.w r3, [r0, #160] ; 0xa0
  79636. ETH_InitStruct->ETH_AddressAlignedBeats = ETH_AddressAlignedBeats_Enable;
  79637. /* Enabled Fixed Burst Mode (mix of INC4, INC8, INC16 and SINGLE DMA transactions */
  79638. ETH_InitStruct->ETH_FixedBurst = ETH_FixedBurst_Enable;
  79639. /* DMA transfer max burst length = 32 beats = 32 x 32bits */
  79640. ETH_InitStruct->ETH_RxDMABurstLength = ETH_RxDMABurstLength_32Beat;
  79641. ETH_InitStruct->ETH_TxDMABurstLength = ETH_TxDMABurstLength_32Beat;
  79642. 8038648: f8c0 20b0 str.w r2, [r0, #176] ; 0xb0
  79643. /* DMA Ring mode skip length = 0 */
  79644. ETH_InitStruct->ETH_DescriptorSkipLength = 0x0;
  79645. 803864c: f8c0 30b4 str.w r3, [r0, #180] ; 0xb4
  79646. /* Equal priority (round-robin) between transmit and receive DMA engines */
  79647. ETH_InitStruct->ETH_DMAArbitration = ETH_DMAArbitration_RoundRobin_RxTx_1_1;
  79648. 8038650: f8c0 30b8 str.w r3, [r0, #184] ; 0xb8
  79649. 8038654: 4770 bx lr
  79650. 8038656: 0000 movs r0, r0
  79651. 08038658 <ETH_MACTransmissionCmd>:
  79652. * @param NewState: new state of the MAC transmission.
  79653. * This parameter can be: ENABLE or DISABLE.
  79654. * @retval None
  79655. */
  79656. void ETH_MACTransmissionCmd(FunctionalState NewState)
  79657. {
  79658. 8038658: 4b04 ldr r3, [pc, #16] ; (803866c <ETH_MACTransmissionCmd+0x14>)
  79659. assert_param(IS_FUNCTIONAL_STATE(NewState));
  79660. if (NewState != DISABLE)
  79661. {
  79662. /* Enable the MAC transmission */
  79663. ETH->MACCR |= ETH_MACCR_TE;
  79664. 803865a: 681a ldr r2, [r3, #0]
  79665. void ETH_MACTransmissionCmd(FunctionalState NewState)
  79666. {
  79667. /* Check the parameters */
  79668. assert_param(IS_FUNCTIONAL_STATE(NewState));
  79669. if (NewState != DISABLE)
  79670. 803865c: b110 cbz r0, 8038664 <ETH_MACTransmissionCmd+0xc>
  79671. {
  79672. /* Enable the MAC transmission */
  79673. ETH->MACCR |= ETH_MACCR_TE;
  79674. 803865e: f042 0208 orr.w r2, r2, #8
  79675. 8038662: e001 b.n 8038668 <ETH_MACTransmissionCmd+0x10>
  79676. }
  79677. else
  79678. {
  79679. /* Disable the MAC transmission */
  79680. ETH->MACCR &= ~ETH_MACCR_TE;
  79681. 8038664: f022 0208 bic.w r2, r2, #8
  79682. 8038668: 601a str r2, [r3, #0]
  79683. 803866a: 4770 bx lr
  79684. 803866c: 40028000 .word 0x40028000
  79685. 08038670 <ETH_MACReceptionCmd>:
  79686. * @param NewState: new state of the MAC reception.
  79687. * This parameter can be: ENABLE or DISABLE.
  79688. * @retval None
  79689. */
  79690. void ETH_MACReceptionCmd(FunctionalState NewState)
  79691. {
  79692. 8038670: 4b04 ldr r3, [pc, #16] ; (8038684 <ETH_MACReceptionCmd+0x14>)
  79693. assert_param(IS_FUNCTIONAL_STATE(NewState));
  79694. if (NewState != DISABLE)
  79695. {
  79696. /* Enable the MAC reception */
  79697. ETH->MACCR |= ETH_MACCR_RE;
  79698. 8038672: 681a ldr r2, [r3, #0]
  79699. void ETH_MACReceptionCmd(FunctionalState NewState)
  79700. {
  79701. /* Check the parameters */
  79702. assert_param(IS_FUNCTIONAL_STATE(NewState));
  79703. if (NewState != DISABLE)
  79704. 8038674: b110 cbz r0, 803867c <ETH_MACReceptionCmd+0xc>
  79705. {
  79706. /* Enable the MAC reception */
  79707. ETH->MACCR |= ETH_MACCR_RE;
  79708. 8038676: f042 0204 orr.w r2, r2, #4
  79709. 803867a: e001 b.n 8038680 <ETH_MACReceptionCmd+0x10>
  79710. }
  79711. else
  79712. {
  79713. /* Disable the MAC reception */
  79714. ETH->MACCR &= ~ETH_MACCR_RE;
  79715. 803867c: f022 0204 bic.w r2, r2, #4
  79716. 8038680: 601a str r2, [r3, #0]
  79717. 8038682: 4770 bx lr
  79718. 8038684: 40028000 .word 0x40028000
  79719. 08038688 <ETH_MACAddressConfig>:
  79720. uint32_t tmpreg;
  79721. /* Check the parameters */
  79722. assert_param(IS_ETH_MAC_ADDRESS0123(MacAddr));
  79723. /* Calculate the selected MAC address high register */
  79724. tmpreg = ((uint32_t)Addr[5] << 8) | (uint32_t)Addr[4];
  79725. 8038688: 790b ldrb r3, [r1, #4]
  79726. 803868a: 794a ldrb r2, [r1, #5]
  79727. 803868c: ea43 2202 orr.w r2, r3, r2, lsl #8
  79728. /* Load the selected MAC address high register */
  79729. (*(__IO uint32_t *) (ETH_MAC_ADDR_HBASE + MacAddr)) = tmpreg;
  79730. 8038690: 4b07 ldr r3, [pc, #28] ; (80386b0 <ETH_MACAddressConfig+0x28>)
  79731. 8038692: 50c2 str r2, [r0, r3]
  79732. /* Calculate the selected MAC address low register */
  79733. tmpreg = ((uint32_t)Addr[3] << 24) | ((uint32_t)Addr[2] << 16) | ((uint32_t)Addr[1] << 8) | Addr[0];
  79734. 8038694: 788a ldrb r2, [r1, #2]
  79735. 8038696: 78cb ldrb r3, [r1, #3]
  79736. 8038698: 0412 lsls r2, r2, #16
  79737. 803869a: ea42 6203 orr.w r2, r2, r3, lsl #24
  79738. 803869e: 780b ldrb r3, [r1, #0]
  79739. 80386a0: 431a orrs r2, r3
  79740. 80386a2: 784b ldrb r3, [r1, #1]
  79741. 80386a4: ea42 2203 orr.w r2, r2, r3, lsl #8
  79742. /* Load the selected MAC address low register */
  79743. (*(__IO uint32_t *) (ETH_MAC_ADDR_LBASE + MacAddr)) = tmpreg;
  79744. 80386a8: 4b02 ldr r3, [pc, #8] ; (80386b4 <ETH_MACAddressConfig+0x2c>)
  79745. 80386aa: 50c2 str r2, [r0, r3]
  79746. 80386ac: 4770 bx lr
  79747. 80386ae: bf00 nop
  79748. 80386b0: 40028040 .word 0x40028040
  79749. 80386b4: 40028044 .word 0x40028044
  79750. 080386b8 <ETH_Get_Received_Frame_interrupt>:
  79751. * the receive frame (should be used with interrupt mode only)
  79752. * @param None
  79753. * @retval Structure of type FrameTypeDef
  79754. */
  79755. FrameTypeDef ETH_Get_Received_Frame_interrupt(void)
  79756. {
  79757. 80386b8: b537 push {r0, r1, r2, r4, r5, lr}
  79758. FrameTypeDef frame={0,0,0};
  79759. __IO uint32_t descriptor_scan_counter = 0;
  79760. 80386ba: 2300 movs r3, #0
  79761. 80386bc: 9301 str r3, [sp, #4]
  79762. /* check if first segment in frame */
  79763. if(((DMARxDescToGet->Status & ETH_DMARxDesc_FS) != (uint32_t)RESET)&&
  79764. ((DMARxDescToGet->Status & ETH_DMARxDesc_LS) == (uint32_t)RESET))
  79765. {
  79766. DMA_RX_FRAME_infos->FS_Rx_Desc = DMARxDescToGet;
  79767. 80386be: 4b24 ldr r3, [pc, #144] ; (8038750 <ETH_Get_Received_Frame_interrupt+0x98>)
  79768. 80386c0: 681a ldr r2, [r3, #0]
  79769. 80386c2: 4b24 ldr r3, [pc, #144] ; (8038754 <ETH_Get_Received_Frame_interrupt+0x9c>)
  79770. DMA_RX_FRAME_infos->Seg_Count = 1;
  79771. 80386c4: 2401 movs r4, #1
  79772. 80386c6: 681b ldr r3, [r3, #0]
  79773. {
  79774. FrameTypeDef frame={0,0,0};
  79775. __IO uint32_t descriptor_scan_counter = 0;
  79776. /* scan descriptors owned by CPU */
  79777. while (((DMARxDescToGet->Status & ETH_DMARxDesc_OWN) == (uint32_t)RESET)&&
  79778. 80386c8: e033 b.n 8038732 <ETH_Get_Received_Frame_interrupt+0x7a>
  79779. (descriptor_scan_counter<ETH_RXBUFNB))
  79780. {
  79781. /* Just by security */
  79782. descriptor_scan_counter++;
  79783. 80386ca: 9901 ldr r1, [sp, #4]
  79784. 80386cc: 3101 adds r1, #1
  79785. 80386ce: 9101 str r1, [sp, #4]
  79786. /* check if first segment in frame */
  79787. if(((DMARxDescToGet->Status & ETH_DMARxDesc_FS) != (uint32_t)RESET)&&
  79788. 80386d0: 6819 ldr r1, [r3, #0]
  79789. 80386d2: 0589 lsls r1, r1, #22
  79790. 80386d4: d505 bpl.n 80386e2 <ETH_Get_Received_Frame_interrupt+0x2a>
  79791. ((DMARxDescToGet->Status & ETH_DMARxDesc_LS) == (uint32_t)RESET))
  79792. 80386d6: 6819 ldr r1, [r3, #0]
  79793. /* Just by security */
  79794. descriptor_scan_counter++;
  79795. /* check if first segment in frame */
  79796. if(((DMARxDescToGet->Status & ETH_DMARxDesc_FS) != (uint32_t)RESET)&&
  79797. 80386d8: 05c9 lsls r1, r1, #23
  79798. 80386da: d402 bmi.n 80386e2 <ETH_Get_Received_Frame_interrupt+0x2a>
  79799. ((DMARxDescToGet->Status & ETH_DMARxDesc_LS) == (uint32_t)RESET))
  79800. {
  79801. DMA_RX_FRAME_infos->FS_Rx_Desc = DMARxDescToGet;
  79802. 80386dc: 6013 str r3, [r2, #0]
  79803. DMA_RX_FRAME_infos->Seg_Count = 1;
  79804. 80386de: 6094 str r4, [r2, #8]
  79805. 80386e0: e009 b.n 80386f6 <ETH_Get_Received_Frame_interrupt+0x3e>
  79806. DMARxDescToGet = (ETH_DMADESCTypeDef*) (DMARxDescToGet->Buffer2NextDescAddr);
  79807. }
  79808. /* check if intermediate segment */
  79809. else if (((DMARxDescToGet->Status & ETH_DMARxDesc_LS) == (uint32_t)RESET)&&
  79810. 80386e2: 6819 ldr r1, [r3, #0]
  79811. 80386e4: 05c9 lsls r1, r1, #23
  79812. 80386e6: d408 bmi.n 80386fa <ETH_Get_Received_Frame_interrupt+0x42>
  79813. ((DMARxDescToGet->Status & ETH_DMARxDesc_FS) == (uint32_t)RESET))
  79814. 80386e8: 6819 ldr r1, [r3, #0]
  79815. DMA_RX_FRAME_infos->Seg_Count = 1;
  79816. DMARxDescToGet = (ETH_DMADESCTypeDef*) (DMARxDescToGet->Buffer2NextDescAddr);
  79817. }
  79818. /* check if intermediate segment */
  79819. else if (((DMARxDescToGet->Status & ETH_DMARxDesc_LS) == (uint32_t)RESET)&&
  79820. 80386ea: 0589 lsls r1, r1, #22
  79821. 80386ec: d500 bpl.n 80386f0 <ETH_Get_Received_Frame_interrupt+0x38>
  79822. 80386ee: e004 b.n 80386fa <ETH_Get_Received_Frame_interrupt+0x42>
  79823. ((DMARxDescToGet->Status & ETH_DMARxDesc_FS) == (uint32_t)RESET))
  79824. {
  79825. (DMA_RX_FRAME_infos->Seg_Count) ++;
  79826. 80386f0: 6891 ldr r1, [r2, #8]
  79827. 80386f2: 3101 adds r1, #1
  79828. 80386f4: 6091 str r1, [r2, #8]
  79829. DMARxDescToGet = (ETH_DMADESCTypeDef*) (DMARxDescToGet->Buffer2NextDescAddr);
  79830. 80386f6: 68db ldr r3, [r3, #12]
  79831. 80386f8: e01b b.n 8038732 <ETH_Get_Received_Frame_interrupt+0x7a>
  79832. 80386fa: 4a16 ldr r2, [pc, #88] ; (8038754 <ETH_Get_Received_Frame_interrupt+0x9c>)
  79833. 80386fc: 6013 str r3, [r2, #0]
  79834. /* should be last segment */
  79835. else
  79836. {
  79837. /* last segment */
  79838. DMA_RX_FRAME_infos->LS_Rx_Desc = DMARxDescToGet;
  79839. 80386fe: 4a14 ldr r2, [pc, #80] ; (8038750 <ETH_Get_Received_Frame_interrupt+0x98>)
  79840. 8038700: 6812 ldr r2, [r2, #0]
  79841. 8038702: 6053 str r3, [r2, #4]
  79842. (DMA_RX_FRAME_infos->Seg_Count)++;
  79843. 8038704: 6891 ldr r1, [r2, #8]
  79844. 8038706: 3101 adds r1, #1
  79845. 8038708: 6091 str r1, [r2, #8]
  79846. /* first segment is last segment */
  79847. if ((DMA_RX_FRAME_infos->Seg_Count)==1)
  79848. 803870a: 6891 ldr r1, [r2, #8]
  79849. 803870c: 2901 cmp r1, #1
  79850. DMA_RX_FRAME_infos->FS_Rx_Desc = DMARxDescToGet;
  79851. 803870e: bf08 it eq
  79852. 8038710: 6013 streq r3, [r2, #0]
  79853. /* Get the Frame Length of the received packet: substruct 4 bytes of the CRC */
  79854. frame.length = ((DMARxDescToGet->Status & ETH_DMARxDesc_FL) >> ETH_DMARxDesc_FrameLengthShift) - 4;
  79855. 8038712: 6819 ldr r1, [r3, #0]
  79856. /* Get the address of the buffer start address */
  79857. /* Check if more than one segment in the frame */
  79858. if (DMA_RX_FRAME_infos->Seg_Count >1)
  79859. 8038714: 6894 ldr r4, [r2, #8]
  79860. /* first segment is last segment */
  79861. if ((DMA_RX_FRAME_infos->Seg_Count)==1)
  79862. DMA_RX_FRAME_infos->FS_Rx_Desc = DMARxDescToGet;
  79863. /* Get the Frame Length of the received packet: substruct 4 bytes of the CRC */
  79864. frame.length = ((DMARxDescToGet->Status & ETH_DMARxDesc_FL) >> ETH_DMARxDesc_FrameLengthShift) - 4;
  79865. 8038716: f3c1 410d ubfx r1, r1, #16, #14
  79866. 803871a: 3904 subs r1, #4
  79867. /* Get the address of the buffer start address */
  79868. /* Check if more than one segment in the frame */
  79869. if (DMA_RX_FRAME_infos->Seg_Count >1)
  79870. 803871c: 2c01 cmp r4, #1
  79871. {
  79872. frame.buffer =(DMA_RX_FRAME_infos->FS_Rx_Desc)->Buffer1Addr;
  79873. 803871e: bf8a itet hi
  79874. 8038720: 6812 ldrhi r2, [r2, #0]
  79875. }
  79876. else
  79877. {
  79878. frame.buffer = DMARxDescToGet->Buffer1Addr;
  79879. 8038722: 689a ldrls r2, [r3, #8]
  79880. /* Get the address of the buffer start address */
  79881. /* Check if more than one segment in the frame */
  79882. if (DMA_RX_FRAME_infos->Seg_Count >1)
  79883. {
  79884. frame.buffer =(DMA_RX_FRAME_infos->FS_Rx_Desc)->Buffer1Addr;
  79885. 8038724: 6892 ldrhi r2, [r2, #8]
  79886. }
  79887. frame.descriptor = DMARxDescToGet;
  79888. /* Update the ETHERNET DMA global Rx descriptor with next Rx descriptor */
  79889. DMARxDescToGet = (ETH_DMADESCTypeDef*) (DMARxDescToGet->Buffer2NextDescAddr);
  79890. 8038726: 4c0b ldr r4, [pc, #44] ; (8038754 <ETH_Get_Received_Frame_interrupt+0x9c>)
  79891. 8038728: 68dd ldr r5, [r3, #12]
  79892. /* Return Frame */
  79893. return (frame);
  79894. 803872a: e880 0006 stmia.w r0, {r1, r2}
  79895. }
  79896. frame.descriptor = DMARxDescToGet;
  79897. /* Update the ETHERNET DMA global Rx descriptor with next Rx descriptor */
  79898. DMARxDescToGet = (ETH_DMADESCTypeDef*) (DMARxDescToGet->Buffer2NextDescAddr);
  79899. 803872e: 6025 str r5, [r4, #0]
  79900. 8038730: e007 b.n 8038742 <ETH_Get_Received_Frame_interrupt+0x8a>
  79901. {
  79902. FrameTypeDef frame={0,0,0};
  79903. __IO uint32_t descriptor_scan_counter = 0;
  79904. /* scan descriptors owned by CPU */
  79905. while (((DMARxDescToGet->Status & ETH_DMARxDesc_OWN) == (uint32_t)RESET)&&
  79906. 8038732: 6819 ldr r1, [r3, #0]
  79907. 8038734: 2900 cmp r1, #0
  79908. 8038736: da06 bge.n 8038746 <ETH_Get_Received_Frame_interrupt+0x8e>
  79909. 8038738: 4a06 ldr r2, [pc, #24] ; (8038754 <ETH_Get_Received_Frame_interrupt+0x9c>)
  79910. 803873a: 6013 str r3, [r2, #0]
  79911. /* Return Frame */
  79912. return (frame);
  79913. }
  79914. }
  79915. return (frame);
  79916. 803873c: 2300 movs r3, #0
  79917. 803873e: 6003 str r3, [r0, #0]
  79918. 8038740: 6043 str r3, [r0, #4]
  79919. 8038742: 6083 str r3, [r0, #8]
  79920. 8038744: e003 b.n 803874e <ETH_Get_Received_Frame_interrupt+0x96>
  79921. FrameTypeDef frame={0,0,0};
  79922. __IO uint32_t descriptor_scan_counter = 0;
  79923. /* scan descriptors owned by CPU */
  79924. while (((DMARxDescToGet->Status & ETH_DMARxDesc_OWN) == (uint32_t)RESET)&&
  79925. (descriptor_scan_counter<ETH_RXBUFNB))
  79926. 8038746: 9901 ldr r1, [sp, #4]
  79927. {
  79928. FrameTypeDef frame={0,0,0};
  79929. __IO uint32_t descriptor_scan_counter = 0;
  79930. /* scan descriptors owned by CPU */
  79931. while (((DMARxDescToGet->Status & ETH_DMARxDesc_OWN) == (uint32_t)RESET)&&
  79932. 8038748: 2904 cmp r1, #4
  79933. 803874a: d9be bls.n 80386ca <ETH_Get_Received_Frame_interrupt+0x12>
  79934. 803874c: e7f4 b.n 8038738 <ETH_Get_Received_Frame_interrupt+0x80>
  79935. /* Return Frame */
  79936. return (frame);
  79937. }
  79938. }
  79939. return (frame);
  79940. }
  79941. 803874e: bd3e pop {r1, r2, r3, r4, r5, pc}
  79942. 8038750: 20012244 .word 0x20012244
  79943. 8038754: 200103d4 .word 0x200103d4
  79944. 08038758 <ETH_Prepare_Transmit_Descriptors>:
  79945. {
  79946. uint32_t buf_count =0, size=0,i=0;
  79947. __IO ETH_DMADESCTypeDef *DMATxNextDesc;
  79948. /* Check if the descriptor is owned by the ETHERNET DMA (when set) or CPU (when reset) */
  79949. if((DMATxDescToSet->Status & ETH_DMATxDesc_OWN) != (u32)RESET)
  79950. 8038758: 4b29 ldr r3, [pc, #164] ; (8038800 <ETH_Prepare_Transmit_Descriptors+0xa8>)
  79951. 803875a: 681b ldr r3, [r3, #0]
  79952. 803875c: 681a ldr r2, [r3, #0]
  79953. 803875e: 2a00 cmp r2, #0
  79954. * @brief Prepares DMA Tx descriptors to transmit an ethernet frame
  79955. * @param FrameLength : length of the frame to send
  79956. * @retval error status
  79957. */
  79958. uint32_t ETH_Prepare_Transmit_Descriptors(u16 FrameLength)
  79959. {
  79960. 8038760: b5f0 push {r4, r5, r6, r7, lr}
  79961. uint32_t buf_count =0, size=0,i=0;
  79962. __IO ETH_DMADESCTypeDef *DMATxNextDesc;
  79963. /* Check if the descriptor is owned by the ETHERNET DMA (when set) or CPU (when reset) */
  79964. if((DMATxDescToSet->Status & ETH_DMATxDesc_OWN) != (u32)RESET)
  79965. 8038762: db48 blt.n 80387f6 <ETH_Prepare_Transmit_Descriptors+0x9e>
  79966. return ETH_ERROR;
  79967. }
  79968. DMATxNextDesc = DMATxDescToSet;
  79969. if (FrameLength > ETH_TX_BUF_SIZE)
  79970. 8038764: f240 52f4 movw r2, #1524 ; 0x5f4
  79971. 8038768: 4290 cmp r0, r2
  79972. 803876a: d917 bls.n 803879c <ETH_Prepare_Transmit_Descriptors+0x44>
  79973. {
  79974. buf_count = FrameLength/ETH_TX_BUF_SIZE;
  79975. 803876c: fbb0 f4f2 udiv r4, r0, r2
  79976. if (FrameLength%ETH_TX_BUF_SIZE) buf_count++;
  79977. 8038770: fb02 0214 mls r2, r2, r4, r0
  79978. 8038774: b292 uxth r2, r2
  79979. DMATxNextDesc = DMATxDescToSet;
  79980. if (FrameLength > ETH_TX_BUF_SIZE)
  79981. {
  79982. buf_count = FrameLength/ETH_TX_BUF_SIZE;
  79983. 8038776: b2a1 uxth r1, r4
  79984. if (FrameLength%ETH_TX_BUF_SIZE) buf_count++;
  79985. 8038778: b10a cbz r2, 803877e <ETH_Prepare_Transmit_Descriptors+0x26>
  79986. 803877a: 3101 adds r1, #1
  79987. 803877c: e001 b.n 8038782 <ETH_Prepare_Transmit_Descriptors+0x2a>
  79988. }
  79989. else buf_count =1;
  79990. if (buf_count ==1)
  79991. 803877e: 2901 cmp r1, #1
  79992. 8038780: d00c beq.n 803879c <ETH_Prepare_Transmit_Descriptors+0x44>
  79993. if (i== (buf_count-1))
  79994. {
  79995. /* Setting the last segment bit */
  79996. DMATxNextDesc->Status |= ETH_DMATxDesc_LS;
  79997. size = FrameLength - (buf_count-1)*ETH_TX_BUF_SIZE;
  79998. 8038782: 4d20 ldr r5, [pc, #128] ; (8038804 <ETH_Prepare_Transmit_Descriptors+0xac>)
  79999. 8038784: f200 50f4 addw r0, r0, #1524 ; 0x5f4
  80000. 8038788: fb05 0501 mla r5, r5, r1, r0
  80001. DMATxNextDesc->ControlBufferSize = (size & ETH_DMATxDesc_TBS1);
  80002. 803878c: 04ed lsls r5, r5, #19
  80003. 803878e: 0ced lsrs r5, r5, #19
  80004. 8038790: 461a mov r2, r3
  80005. 8038792: 2000 movs r0, #0
  80006. /* Setting the first segment bit */
  80007. DMATxDescToSet->Status |= ETH_DMATxDesc_FS;
  80008. }
  80009. /* Program size */
  80010. DMATxNextDesc->ControlBufferSize = (ETH_TX_BUF_SIZE & ETH_DMATxDesc_TBS1);
  80011. 8038794: f240 56f4 movw r6, #1524 ; 0x5f4
  80012. if (i== (buf_count-1))
  80013. 8038798: 1e4f subs r7, r1, #1
  80014. 803879a: e00c b.n 80387b6 <ETH_Prepare_Transmit_Descriptors+0x5e>
  80015. else buf_count =1;
  80016. if (buf_count ==1)
  80017. {
  80018. /*set LAST and FIRST segment */
  80019. DMATxDescToSet->Status |=ETH_DMATxDesc_FS|ETH_DMATxDesc_LS;
  80020. 803879c: 681a ldr r2, [r3, #0]
  80021. /* Set frame size */
  80022. DMATxDescToSet->ControlBufferSize = (FrameLength& ETH_DMATxDesc_TBS1);
  80023. 803879e: 04c0 lsls r0, r0, #19
  80024. else buf_count =1;
  80025. if (buf_count ==1)
  80026. {
  80027. /*set LAST and FIRST segment */
  80028. DMATxDescToSet->Status |=ETH_DMATxDesc_FS|ETH_DMATxDesc_LS;
  80029. 80387a0: f042 5240 orr.w r2, r2, #805306368 ; 0x30000000
  80030. /* Set frame size */
  80031. DMATxDescToSet->ControlBufferSize = (FrameLength& ETH_DMATxDesc_TBS1);
  80032. 80387a4: 0cc0 lsrs r0, r0, #19
  80033. else buf_count =1;
  80034. if (buf_count ==1)
  80035. {
  80036. /*set LAST and FIRST segment */
  80037. DMATxDescToSet->Status |=ETH_DMATxDesc_FS|ETH_DMATxDesc_LS;
  80038. 80387a6: 601a str r2, [r3, #0]
  80039. /* Set frame size */
  80040. DMATxDescToSet->ControlBufferSize = (FrameLength& ETH_DMATxDesc_TBS1);
  80041. 80387a8: 6058 str r0, [r3, #4]
  80042. /* Set Own bit of the Tx descriptor Status: gives the buffer back to ETHERNET DMA */
  80043. DMATxDescToSet->Status |= ETH_DMATxDesc_OWN;
  80044. 80387aa: 681a ldr r2, [r3, #0]
  80045. 80387ac: f042 4200 orr.w r2, r2, #2147483648 ; 0x80000000
  80046. 80387b0: 601a str r2, [r3, #0]
  80047. DMATxDescToSet= (ETH_DMADESCTypeDef *)(DMATxDescToSet->Buffer2NextDescAddr);
  80048. 80387b2: 68da ldr r2, [r3, #12]
  80049. 80387b4: e014 b.n 80387e0 <ETH_Prepare_Transmit_Descriptors+0x88>
  80050. }
  80051. else
  80052. {
  80053. for (i=0; i< buf_count; i++)
  80054. {
  80055. if (i==0)
  80056. 80387b6: b918 cbnz r0, 80387c0 <ETH_Prepare_Transmit_Descriptors+0x68>
  80057. {
  80058. /* Setting the first segment bit */
  80059. DMATxDescToSet->Status |= ETH_DMATxDesc_FS;
  80060. 80387b8: 681c ldr r4, [r3, #0]
  80061. 80387ba: f044 5480 orr.w r4, r4, #268435456 ; 0x10000000
  80062. 80387be: 601c str r4, [r3, #0]
  80063. }
  80064. /* Program size */
  80065. DMATxNextDesc->ControlBufferSize = (ETH_TX_BUF_SIZE & ETH_DMATxDesc_TBS1);
  80066. if (i== (buf_count-1))
  80067. 80387c0: 42b8 cmp r0, r7
  80068. /* Setting the first segment bit */
  80069. DMATxDescToSet->Status |= ETH_DMATxDesc_FS;
  80070. }
  80071. /* Program size */
  80072. DMATxNextDesc->ControlBufferSize = (ETH_TX_BUF_SIZE & ETH_DMATxDesc_TBS1);
  80073. 80387c2: 6056 str r6, [r2, #4]
  80074. if (i== (buf_count-1))
  80075. 80387c4: d104 bne.n 80387d0 <ETH_Prepare_Transmit_Descriptors+0x78>
  80076. {
  80077. /* Setting the last segment bit */
  80078. DMATxNextDesc->Status |= ETH_DMATxDesc_LS;
  80079. 80387c6: 6814 ldr r4, [r2, #0]
  80080. 80387c8: f044 5400 orr.w r4, r4, #536870912 ; 0x20000000
  80081. 80387cc: 6014 str r4, [r2, #0]
  80082. size = FrameLength - (buf_count-1)*ETH_TX_BUF_SIZE;
  80083. DMATxNextDesc->ControlBufferSize = (size & ETH_DMATxDesc_TBS1);
  80084. 80387ce: 6055 str r5, [r2, #4]
  80085. }
  80086. /*give back descriptor to DMA */
  80087. DMATxNextDesc->Status |= ETH_DMATxDesc_OWN;
  80088. 80387d0: 6814 ldr r4, [r2, #0]
  80089. DMATxDescToSet->Status |= ETH_DMATxDesc_OWN;
  80090. DMATxDescToSet= (ETH_DMADESCTypeDef *)(DMATxDescToSet->Buffer2NextDescAddr);
  80091. }
  80092. else
  80093. {
  80094. for (i=0; i< buf_count; i++)
  80095. 80387d2: 3001 adds r0, #1
  80096. size = FrameLength - (buf_count-1)*ETH_TX_BUF_SIZE;
  80097. DMATxNextDesc->ControlBufferSize = (size & ETH_DMATxDesc_TBS1);
  80098. }
  80099. /*give back descriptor to DMA */
  80100. DMATxNextDesc->Status |= ETH_DMATxDesc_OWN;
  80101. 80387d4: f044 4400 orr.w r4, r4, #2147483648 ; 0x80000000
  80102. 80387d8: 6014 str r4, [r2, #0]
  80103. DMATxDescToSet->Status |= ETH_DMATxDesc_OWN;
  80104. DMATxDescToSet= (ETH_DMADESCTypeDef *)(DMATxDescToSet->Buffer2NextDescAddr);
  80105. }
  80106. else
  80107. {
  80108. for (i=0; i< buf_count; i++)
  80109. 80387da: 4288 cmp r0, r1
  80110. }
  80111. /*give back descriptor to DMA */
  80112. DMATxNextDesc->Status |= ETH_DMATxDesc_OWN;
  80113. DMATxNextDesc = (ETH_DMADESCTypeDef *)(DMATxNextDesc->Buffer2NextDescAddr);
  80114. 80387dc: 68d2 ldr r2, [r2, #12]
  80115. DMATxDescToSet->Status |= ETH_DMATxDesc_OWN;
  80116. DMATxDescToSet= (ETH_DMADESCTypeDef *)(DMATxDescToSet->Buffer2NextDescAddr);
  80117. }
  80118. else
  80119. {
  80120. for (i=0; i< buf_count; i++)
  80121. 80387de: d3ea bcc.n 80387b6 <ETH_Prepare_Transmit_Descriptors+0x5e>
  80122. DMATxNextDesc->Status |= ETH_DMATxDesc_OWN;
  80123. DMATxNextDesc = (ETH_DMADESCTypeDef *)(DMATxNextDesc->Buffer2NextDescAddr);
  80124. /* Set Own bit of the Tx descriptor Status: gives the buffer back to ETHERNET DMA */
  80125. }
  80126. DMATxDescToSet = DMATxNextDesc ;
  80127. 80387e0: 4b07 ldr r3, [pc, #28] ; (8038800 <ETH_Prepare_Transmit_Descriptors+0xa8>)
  80128. 80387e2: 601a str r2, [r3, #0]
  80129. }
  80130. /* When Tx Buffer unavailable flag is set: clear it and resume transmission */
  80131. if ((ETH->DMASR & ETH_DMASR_TBUS) != (u32)RESET)
  80132. 80387e4: 4b08 ldr r3, [pc, #32] ; (8038808 <ETH_Prepare_Transmit_Descriptors+0xb0>)
  80133. 80387e6: 695a ldr r2, [r3, #20]
  80134. 80387e8: 0750 lsls r0, r2, #29
  80135. 80387ea: d506 bpl.n 80387fa <ETH_Prepare_Transmit_Descriptors+0xa2>
  80136. {
  80137. /* Clear TBUS ETHERNET DMA flag */
  80138. ETH->DMASR = ETH_DMASR_TBUS;
  80139. 80387ec: 2204 movs r2, #4
  80140. 80387ee: 615a str r2, [r3, #20]
  80141. /* Resume DMA transmission*/
  80142. ETH->DMATPDR = 0;
  80143. 80387f0: 2200 movs r2, #0
  80144. 80387f2: 605a str r2, [r3, #4]
  80145. 80387f4: e001 b.n 80387fa <ETH_Prepare_Transmit_Descriptors+0xa2>
  80146. /* Check if the descriptor is owned by the ETHERNET DMA (when set) or CPU (when reset) */
  80147. if((DMATxDescToSet->Status & ETH_DMATxDesc_OWN) != (u32)RESET)
  80148. {
  80149. /* Return ERROR: OWN bit set */
  80150. return ETH_ERROR;
  80151. 80387f6: 2000 movs r0, #0
  80152. 80387f8: bdf0 pop {r4, r5, r6, r7, pc}
  80153. /* Resume DMA transmission*/
  80154. ETH->DMATPDR = 0;
  80155. }
  80156. /* Return SUCCESS */
  80157. return ETH_SUCCESS;
  80158. 80387fa: 2001 movs r0, #1
  80159. }
  80160. 80387fc: bdf0 pop {r4, r5, r6, r7, pc}
  80161. 80387fe: bf00 nop
  80162. 8038800: 200103d8 .word 0x200103d8
  80163. 8038804: fffffa0c .word 0xfffffa0c
  80164. 8038808: 40029000 .word 0x40029000
  80165. 0803880c <ETH_DMARxDescChainInit>:
  80166. {
  80167. uint32_t i = 0;
  80168. ETH_DMADESCTypeDef *DMARxDesc;
  80169. /* Set the DMARxDescToGet pointer with the first one of the DMARxDescTab list */
  80170. DMARxDescToGet = DMARxDescTab;
  80171. 803880c: 4b11 ldr r3, [pc, #68] ; (8038854 <ETH_DMARxDescChainInit+0x48>)
  80172. * @param RxBuff: Pointer on the first RxBuffer list
  80173. * @param RxBuffCount: Number of the used Rx desc in the list
  80174. * @retval None
  80175. */
  80176. void ETH_DMARxDescChainInit(ETH_DMADESCTypeDef *DMARxDescTab, uint8_t *RxBuff, uint32_t RxBuffCount)
  80177. {
  80178. 803880e: b5f0 push {r4, r5, r6, r7, lr}
  80179. uint32_t i = 0;
  80180. ETH_DMADESCTypeDef *DMARxDesc;
  80181. /* Set the DMARxDescToGet pointer with the first one of the DMARxDescTab list */
  80182. DMARxDescToGet = DMARxDescTab;
  80183. 8038810: 6018 str r0, [r3, #0]
  80184. /* Fill each DMARxDesc descriptor with the right values */
  80185. for(i=0; i < RxBuffCount; i++)
  80186. 8038812: 2400 movs r4, #0
  80187. * @param DMARxDescTab: Pointer on the first Rx desc list
  80188. * @param RxBuff: Pointer on the first RxBuffer list
  80189. * @param RxBuffCount: Number of the used Rx desc in the list
  80190. * @retval None
  80191. */
  80192. void ETH_DMARxDescChainInit(ETH_DMADESCTypeDef *DMARxDescTab, uint8_t *RxBuff, uint32_t RxBuffCount)
  80193. 8038814: f100 0320 add.w r3, r0, #32
  80194. for(i=0; i < RxBuffCount; i++)
  80195. {
  80196. /* Get the pointer on the ith member of the Rx Desc list */
  80197. DMARxDesc = DMARxDescTab+i;
  80198. /* Set Own bit of the Rx descriptor Status */
  80199. DMARxDesc->Status = ETH_DMARxDesc_OWN;
  80200. 8038818: f04f 4500 mov.w r5, #2147483648 ; 0x80000000
  80201. /* Set Buffer1 size and Second Address Chained bit */
  80202. DMARxDesc->ControlBufferSize = ETH_DMARxDesc_RCH | (uint32_t)ETH_RX_BUF_SIZE;
  80203. 803881c: f244 56f4 movw r6, #17908 ; 0x45f4
  80204. /* Set Buffer1 address pointer */
  80205. DMARxDesc->Buffer1Addr = (uint32_t)(&RxBuff[i*ETH_RX_BUF_SIZE]);
  80206. /* Initialize the next descriptor with the Next Descriptor Polling Enable */
  80207. if(i < (RxBuffCount-1))
  80208. 8038820: 1e57 subs r7, r2, #1
  80209. ETH_DMADESCTypeDef *DMARxDesc;
  80210. /* Set the DMARxDescToGet pointer with the first one of the DMARxDescTab list */
  80211. DMARxDescToGet = DMARxDescTab;
  80212. /* Fill each DMARxDesc descriptor with the right values */
  80213. for(i=0; i < RxBuffCount; i++)
  80214. 8038822: e00f b.n 8038844 <ETH_DMARxDescChainInit+0x38>
  80215. /* Initialize the next descriptor with the Next Descriptor Polling Enable */
  80216. if(i < (RxBuffCount-1))
  80217. {
  80218. /* Set next descriptor address register with next descriptor base address */
  80219. DMARxDesc->Buffer2NextDescAddr = (uint32_t)(DMARxDescTab+i+1);
  80220. 8038824: 42bc cmp r4, r7
  80221. 8038826: bf2c ite cs
  80222. 8038828: 4684 movcs ip, r0
  80223. 803882a: 469c movcc ip, r3
  80224. DMARxDesc->Status = ETH_DMARxDesc_OWN;
  80225. /* Set Buffer1 size and Second Address Chained bit */
  80226. DMARxDesc->ControlBufferSize = ETH_DMARxDesc_RCH | (uint32_t)ETH_RX_BUF_SIZE;
  80227. /* Set Buffer1 address pointer */
  80228. DMARxDesc->Buffer1Addr = (uint32_t)(&RxBuff[i*ETH_RX_BUF_SIZE]);
  80229. 803882c: f843 1c18 str.w r1, [r3, #-24]
  80230. for(i=0; i < RxBuffCount; i++)
  80231. {
  80232. /* Get the pointer on the ith member of the Rx Desc list */
  80233. DMARxDesc = DMARxDescTab+i;
  80234. /* Set Own bit of the Rx descriptor Status */
  80235. DMARxDesc->Status = ETH_DMARxDesc_OWN;
  80236. 8038830: f843 5c20 str.w r5, [r3, #-32]
  80237. /* Set Buffer1 size and Second Address Chained bit */
  80238. DMARxDesc->ControlBufferSize = ETH_DMARxDesc_RCH | (uint32_t)ETH_RX_BUF_SIZE;
  80239. 8038834: f843 6c1c str.w r6, [r3, #-28]
  80240. /* Initialize the next descriptor with the Next Descriptor Polling Enable */
  80241. if(i < (RxBuffCount-1))
  80242. {
  80243. /* Set next descriptor address register with next descriptor base address */
  80244. DMARxDesc->Buffer2NextDescAddr = (uint32_t)(DMARxDescTab+i+1);
  80245. 8038838: f843 cc14 str.w ip, [r3, #-20]
  80246. ETH_DMADESCTypeDef *DMARxDesc;
  80247. /* Set the DMARxDescToGet pointer with the first one of the DMARxDescTab list */
  80248. DMARxDescToGet = DMARxDescTab;
  80249. /* Fill each DMARxDesc descriptor with the right values */
  80250. for(i=0; i < RxBuffCount; i++)
  80251. 803883c: 3401 adds r4, #1
  80252. 803883e: 3320 adds r3, #32
  80253. 8038840: f201 51f4 addw r1, r1, #1524 ; 0x5f4
  80254. 8038844: 4294 cmp r4, r2
  80255. 8038846: d1ed bne.n 8038824 <ETH_DMARxDescChainInit+0x18>
  80256. DMARxDesc->Buffer2NextDescAddr = (uint32_t)(DMARxDescTab);
  80257. }
  80258. }
  80259. /* Set Receive Descriptor List Address Register */
  80260. ETH->DMARDLAR = (uint32_t) DMARxDescTab;
  80261. 8038848: 4b03 ldr r3, [pc, #12] ; (8038858 <ETH_DMARxDescChainInit+0x4c>)
  80262. DMA_RX_FRAME_infos = &RX_Frame_Descriptor;
  80263. 803884a: 4a04 ldr r2, [pc, #16] ; (803885c <ETH_DMARxDescChainInit+0x50>)
  80264. DMARxDesc->Buffer2NextDescAddr = (uint32_t)(DMARxDescTab);
  80265. }
  80266. }
  80267. /* Set Receive Descriptor List Address Register */
  80268. ETH->DMARDLAR = (uint32_t) DMARxDescTab;
  80269. 803884c: 60d8 str r0, [r3, #12]
  80270. DMA_RX_FRAME_infos = &RX_Frame_Descriptor;
  80271. 803884e: 4b04 ldr r3, [pc, #16] ; (8038860 <ETH_DMARxDescChainInit+0x54>)
  80272. 8038850: 601a str r2, [r3, #0]
  80273. 8038852: bdf0 pop {r4, r5, r6, r7, pc}
  80274. 8038854: 200103d4 .word 0x200103d4
  80275. 8038858: 40029000 .word 0x40029000
  80276. 803885c: 200103c8 .word 0x200103c8
  80277. 8038860: 20012244 .word 0x20012244
  80278. 08038864 <ETH_DMATxDescChainInit>:
  80279. {
  80280. uint32_t i = 0;
  80281. ETH_DMADESCTypeDef *DMATxDesc;
  80282. /* Set the DMATxDescToSet pointer with the first one of the DMATxDescTab list */
  80283. DMATxDescToSet = DMATxDescTab;
  80284. 8038864: 4b0e ldr r3, [pc, #56] ; (80388a0 <ETH_DMATxDescChainInit+0x3c>)
  80285. * @param TxBuff: Pointer on the first TxBuffer list
  80286. * @param TxBuffCount: Number of the used Tx desc in the list
  80287. * @retval None
  80288. */
  80289. void ETH_DMATxDescChainInit(ETH_DMADESCTypeDef *DMATxDescTab, uint8_t* TxBuff, uint32_t TxBuffCount)
  80290. {
  80291. 8038866: b5f0 push {r4, r5, r6, r7, lr}
  80292. uint32_t i = 0;
  80293. ETH_DMADESCTypeDef *DMATxDesc;
  80294. /* Set the DMATxDescToSet pointer with the first one of the DMATxDescTab list */
  80295. DMATxDescToSet = DMATxDescTab;
  80296. 8038868: 6018 str r0, [r3, #0]
  80297. /* Fill each DMATxDesc descriptor with the right values */
  80298. for(i=0; i < TxBuffCount; i++)
  80299. 803886a: 2400 movs r4, #0
  80300. * @param DMATxDescTab: Pointer on the first Tx desc list
  80301. * @param TxBuff: Pointer on the first TxBuffer list
  80302. * @param TxBuffCount: Number of the used Tx desc in the list
  80303. * @retval None
  80304. */
  80305. void ETH_DMATxDescChainInit(ETH_DMADESCTypeDef *DMATxDescTab, uint8_t* TxBuff, uint32_t TxBuffCount)
  80306. 803886c: f100 0320 add.w r3, r0, #32
  80307. for(i=0; i < TxBuffCount; i++)
  80308. {
  80309. /* Get the pointer on the ith member of the Tx Desc list */
  80310. DMATxDesc = DMATxDescTab + i;
  80311. /* Set Second Address Chained bit */
  80312. DMATxDesc->Status = ETH_DMATxDesc_TCH;
  80313. 8038870: f44f 1580 mov.w r5, #1048576 ; 0x100000
  80314. /* Set Buffer1 address pointer */
  80315. DMATxDesc->Buffer1Addr = (uint32_t)(&TxBuff[i*ETH_TX_BUF_SIZE]);
  80316. /* Initialize the next descriptor with the Next Descriptor Polling Enable */
  80317. if(i < (TxBuffCount-1))
  80318. 8038874: 1e56 subs r6, r2, #1
  80319. ETH_DMADESCTypeDef *DMATxDesc;
  80320. /* Set the DMATxDescToSet pointer with the first one of the DMATxDescTab list */
  80321. DMATxDescToSet = DMATxDescTab;
  80322. /* Fill each DMATxDesc descriptor with the right values */
  80323. for(i=0; i < TxBuffCount; i++)
  80324. 8038876: e00d b.n 8038894 <ETH_DMATxDescChainInit+0x30>
  80325. /* Initialize the next descriptor with the Next Descriptor Polling Enable */
  80326. if(i < (TxBuffCount-1))
  80327. {
  80328. /* Set next descriptor address register with next descriptor base address */
  80329. DMATxDesc->Buffer2NextDescAddr = (uint32_t)(DMATxDescTab+i+1);
  80330. 8038878: 42b4 cmp r4, r6
  80331. 803887a: bf2c ite cs
  80332. 803887c: 4607 movcs r7, r0
  80333. 803887e: 461f movcc r7, r3
  80334. DMATxDesc = DMATxDescTab + i;
  80335. /* Set Second Address Chained bit */
  80336. DMATxDesc->Status = ETH_DMATxDesc_TCH;
  80337. /* Set Buffer1 address pointer */
  80338. DMATxDesc->Buffer1Addr = (uint32_t)(&TxBuff[i*ETH_TX_BUF_SIZE]);
  80339. 8038880: f843 1c18 str.w r1, [r3, #-24]
  80340. for(i=0; i < TxBuffCount; i++)
  80341. {
  80342. /* Get the pointer on the ith member of the Tx Desc list */
  80343. DMATxDesc = DMATxDescTab + i;
  80344. /* Set Second Address Chained bit */
  80345. DMATxDesc->Status = ETH_DMATxDesc_TCH;
  80346. 8038884: f843 5c20 str.w r5, [r3, #-32]
  80347. /* Initialize the next descriptor with the Next Descriptor Polling Enable */
  80348. if(i < (TxBuffCount-1))
  80349. {
  80350. /* Set next descriptor address register with next descriptor base address */
  80351. DMATxDesc->Buffer2NextDescAddr = (uint32_t)(DMATxDescTab+i+1);
  80352. 8038888: f843 7c14 str.w r7, [r3, #-20]
  80353. ETH_DMADESCTypeDef *DMATxDesc;
  80354. /* Set the DMATxDescToSet pointer with the first one of the DMATxDescTab list */
  80355. DMATxDescToSet = DMATxDescTab;
  80356. /* Fill each DMATxDesc descriptor with the right values */
  80357. for(i=0; i < TxBuffCount; i++)
  80358. 803888c: 3401 adds r4, #1
  80359. 803888e: 3320 adds r3, #32
  80360. 8038890: f201 51f4 addw r1, r1, #1524 ; 0x5f4
  80361. 8038894: 4294 cmp r4, r2
  80362. 8038896: d1ef bne.n 8038878 <ETH_DMATxDescChainInit+0x14>
  80363. DMATxDesc->Buffer2NextDescAddr = (uint32_t) DMATxDescTab;
  80364. }
  80365. }
  80366. /* Set Transmit Desciptor List Address Register */
  80367. ETH->DMATDLAR = (uint32_t) DMATxDescTab;
  80368. 8038898: 4b02 ldr r3, [pc, #8] ; (80388a4 <ETH_DMATxDescChainInit+0x40>)
  80369. 803889a: 6118 str r0, [r3, #16]
  80370. 803889c: bdf0 pop {r4, r5, r6, r7, pc}
  80371. 803889e: bf00 nop
  80372. 80388a0: 200103d8 .word 0x200103d8
  80373. 80388a4: 40029000 .word 0x40029000
  80374. 080388a8 <ETH_DMATxDescChecksumInsertionConfig>:
  80375. {
  80376. /* Check the parameters */
  80377. assert_param(IS_ETH_DMA_TXDESC_CHECKSUM(DMATxDesc_Checksum));
  80378. /* Set the selected DMA Tx desc checksum insertion control */
  80379. DMATxDesc->Status |= DMATxDesc_Checksum;
  80380. 80388a8: 6803 ldr r3, [r0, #0]
  80381. 80388aa: 4319 orrs r1, r3
  80382. 80388ac: 6001 str r1, [r0, #0]
  80383. 80388ae: 4770 bx lr
  80384. 080388b0 <ETH_DMARxDescReceiveITConfig>:
  80385. * @param NewState: new state of the specified DMA Rx Desc interrupt.
  80386. * This parameter can be: ENABLE or DISABLE.
  80387. * @retval None
  80388. */
  80389. void ETH_DMARxDescReceiveITConfig(ETH_DMADESCTypeDef *DMARxDesc, FunctionalState NewState)
  80390. {
  80391. 80388b0: 6843 ldr r3, [r0, #4]
  80392. /* Check the parameters */
  80393. assert_param(IS_FUNCTIONAL_STATE(NewState));
  80394. if (NewState != DISABLE)
  80395. 80388b2: b111 cbz r1, 80388ba <ETH_DMARxDescReceiveITConfig+0xa>
  80396. {
  80397. /* Enable the DMA Rx Desc receive interrupt */
  80398. DMARxDesc->ControlBufferSize &=(~(uint32_t)ETH_DMARxDesc_DIC);
  80399. 80388b4: f023 4300 bic.w r3, r3, #2147483648 ; 0x80000000
  80400. 80388b8: e001 b.n 80388be <ETH_DMARxDescReceiveITConfig+0xe>
  80401. }
  80402. else
  80403. {
  80404. /* Disable the DMA Rx Desc receive interrupt */
  80405. DMARxDesc->ControlBufferSize |= ETH_DMARxDesc_DIC;
  80406. 80388ba: f043 4300 orr.w r3, r3, #2147483648 ; 0x80000000
  80407. 80388be: 6043 str r3, [r0, #4]
  80408. 80388c0: 4770 bx lr
  80409. 80388c2: 0000 movs r0, r0
  80410. 080388c4 <ETH_SoftwareReset>:
  80411. */
  80412. void ETH_SoftwareReset(void)
  80413. {
  80414. /* Set the SWR bit: resets all MAC subsystem internal registers and logic */
  80415. /* After reset all the registers holds their respective reset values */
  80416. ETH->DMABMR |= ETH_DMABMR_SR;
  80417. 80388c4: 4b02 ldr r3, [pc, #8] ; (80388d0 <ETH_SoftwareReset+0xc>)
  80418. 80388c6: 681a ldr r2, [r3, #0]
  80419. 80388c8: f042 0201 orr.w r2, r2, #1
  80420. 80388cc: 601a str r2, [r3, #0]
  80421. 80388ce: 4770 bx lr
  80422. 80388d0: 40029000 .word 0x40029000
  80423. 080388d4 <ETH_GetSoftwareResetStatus>:
  80424. * @retval The new state of DMA Bus Mode register SR bit (SET or RESET).
  80425. */
  80426. FlagStatus ETH_GetSoftwareResetStatus(void)
  80427. {
  80428. FlagStatus bitstatus = RESET;
  80429. if((ETH->DMABMR & ETH_DMABMR_SR) != (uint32_t)RESET)
  80430. 80388d4: 4b02 ldr r3, [pc, #8] ; (80388e0 <ETH_GetSoftwareResetStatus+0xc>)
  80431. 80388d6: 6818 ldr r0, [r3, #0]
  80432. else
  80433. {
  80434. bitstatus = RESET;
  80435. }
  80436. return bitstatus;
  80437. }
  80438. 80388d8: f000 0001 and.w r0, r0, #1
  80439. 80388dc: 4770 bx lr
  80440. 80388de: bf00 nop
  80441. 80388e0: 40029000 .word 0x40029000
  80442. 080388e4 <ETH_GetDMAFlagStatus>:
  80443. FlagStatus ETH_GetDMAFlagStatus(uint32_t ETH_DMA_FLAG)
  80444. {
  80445. FlagStatus bitstatus = RESET;
  80446. /* Check the parameters */
  80447. assert_param(IS_ETH_DMA_GET_IT(ETH_DMA_FLAG));
  80448. if ((ETH->DMASR & ETH_DMA_FLAG) != (uint32_t)RESET)
  80449. 80388e4: 4b03 ldr r3, [pc, #12] ; (80388f4 <ETH_GetDMAFlagStatus+0x10>)
  80450. 80388e6: 695b ldr r3, [r3, #20]
  80451. 80388e8: 4218 tst r0, r3
  80452. else
  80453. {
  80454. bitstatus = RESET;
  80455. }
  80456. return bitstatus;
  80457. }
  80458. 80388ea: bf0c ite eq
  80459. 80388ec: 2000 moveq r0, #0
  80460. 80388ee: 2001 movne r0, #1
  80461. 80388f0: 4770 bx lr
  80462. 80388f2: bf00 nop
  80463. 80388f4: 40029000 .word 0x40029000
  80464. 080388f8 <ETH_DMAITConfig>:
  80465. * @param NewState: new state of the specified ETHERNET DMA interrupts.
  80466. * This parameter can be: ENABLE or DISABLE.
  80467. * @retval None
  80468. */
  80469. void ETH_DMAITConfig(uint32_t ETH_DMA_IT, FunctionalState NewState)
  80470. {
  80471. 80388f8: 4b04 ldr r3, [pc, #16] ; (803890c <ETH_DMAITConfig+0x14>)
  80472. assert_param(IS_FUNCTIONAL_STATE(NewState));
  80473. if (NewState != DISABLE)
  80474. {
  80475. /* Enable the selected ETHERNET DMA interrupts */
  80476. ETH->DMAIER |= ETH_DMA_IT;
  80477. 80388fa: 69da ldr r2, [r3, #28]
  80478. {
  80479. /* Check the parameters */
  80480. assert_param(IS_ETH_DMA_IT(ETH_DMA_IT));
  80481. assert_param(IS_FUNCTIONAL_STATE(NewState));
  80482. if (NewState != DISABLE)
  80483. 80388fc: b109 cbz r1, 8038902 <ETH_DMAITConfig+0xa>
  80484. {
  80485. /* Enable the selected ETHERNET DMA interrupts */
  80486. ETH->DMAIER |= ETH_DMA_IT;
  80487. 80388fe: 4310 orrs r0, r2
  80488. 8038900: e001 b.n 8038906 <ETH_DMAITConfig+0xe>
  80489. }
  80490. else
  80491. {
  80492. /* Disable the selected ETHERNET DMA interrupts */
  80493. ETH->DMAIER &=(~(uint32_t)ETH_DMA_IT);
  80494. 8038902: ea22 0000 bic.w r0, r2, r0
  80495. 8038906: 61d8 str r0, [r3, #28]
  80496. 8038908: 4770 bx lr
  80497. 803890a: bf00 nop
  80498. 803890c: 40029000 .word 0x40029000
  80499. 08038910 <ETH_DMAClearITPendingBit>:
  80500. {
  80501. /* Check the parameters */
  80502. assert_param(IS_ETH_DMA_IT(ETH_DMA_IT));
  80503. /* Clear the selected ETHERNET DMA IT */
  80504. ETH->DMASR = (uint32_t) ETH_DMA_IT;
  80505. 8038910: 4b01 ldr r3, [pc, #4] ; (8038918 <ETH_DMAClearITPendingBit+0x8>)
  80506. 8038912: 6158 str r0, [r3, #20]
  80507. 8038914: 4770 bx lr
  80508. 8038916: bf00 nop
  80509. 8038918: 40029000 .word 0x40029000
  80510. 0803891c <ETH_FlushTransmitFIFO>:
  80511. * @retval None
  80512. */
  80513. void ETH_FlushTransmitFIFO(void)
  80514. {
  80515. /* Set the Flush Transmit FIFO bit */
  80516. ETH->DMAOMR |= ETH_DMAOMR_FTF;
  80517. 803891c: 4b02 ldr r3, [pc, #8] ; (8038928 <ETH_FlushTransmitFIFO+0xc>)
  80518. 803891e: 699a ldr r2, [r3, #24]
  80519. 8038920: f442 1280 orr.w r2, r2, #1048576 ; 0x100000
  80520. 8038924: 619a str r2, [r3, #24]
  80521. 8038926: 4770 bx lr
  80522. 8038928: 40029000 .word 0x40029000
  80523. 0803892c <ETH_DMATransmissionCmd>:
  80524. * @param NewState: new state of the DMA transmission.
  80525. * This parameter can be: ENABLE or DISABLE.
  80526. * @retval None
  80527. */
  80528. void ETH_DMATransmissionCmd(FunctionalState NewState)
  80529. {
  80530. 803892c: 4b04 ldr r3, [pc, #16] ; (8038940 <ETH_DMATransmissionCmd+0x14>)
  80531. assert_param(IS_FUNCTIONAL_STATE(NewState));
  80532. if (NewState != DISABLE)
  80533. {
  80534. /* Enable the DMA transmission */
  80535. ETH->DMAOMR |= ETH_DMAOMR_ST;
  80536. 803892e: 699a ldr r2, [r3, #24]
  80537. void ETH_DMATransmissionCmd(FunctionalState NewState)
  80538. {
  80539. /* Check the parameters */
  80540. assert_param(IS_FUNCTIONAL_STATE(NewState));
  80541. if (NewState != DISABLE)
  80542. 8038930: b110 cbz r0, 8038938 <ETH_DMATransmissionCmd+0xc>
  80543. {
  80544. /* Enable the DMA transmission */
  80545. ETH->DMAOMR |= ETH_DMAOMR_ST;
  80546. 8038932: f442 5200 orr.w r2, r2, #8192 ; 0x2000
  80547. 8038936: e001 b.n 803893c <ETH_DMATransmissionCmd+0x10>
  80548. }
  80549. else
  80550. {
  80551. /* Disable the DMA transmission */
  80552. ETH->DMAOMR &= ~ETH_DMAOMR_ST;
  80553. 8038938: f422 5200 bic.w r2, r2, #8192 ; 0x2000
  80554. 803893c: 619a str r2, [r3, #24]
  80555. 803893e: 4770 bx lr
  80556. 8038940: 40029000 .word 0x40029000
  80557. 08038944 <ETH_DMAReceptionCmd>:
  80558. * @param NewState: new state of the DMA reception.
  80559. * This parameter can be: ENABLE or DISABLE.
  80560. * @retval None
  80561. */
  80562. void ETH_DMAReceptionCmd(FunctionalState NewState)
  80563. {
  80564. 8038944: 4b04 ldr r3, [pc, #16] ; (8038958 <ETH_DMAReceptionCmd+0x14>)
  80565. assert_param(IS_FUNCTIONAL_STATE(NewState));
  80566. if (NewState != DISABLE)
  80567. {
  80568. /* Enable the DMA reception */
  80569. ETH->DMAOMR |= ETH_DMAOMR_SR;
  80570. 8038946: 699a ldr r2, [r3, #24]
  80571. void ETH_DMAReceptionCmd(FunctionalState NewState)
  80572. {
  80573. /* Check the parameters */
  80574. assert_param(IS_FUNCTIONAL_STATE(NewState));
  80575. if (NewState != DISABLE)
  80576. 8038948: b110 cbz r0, 8038950 <ETH_DMAReceptionCmd+0xc>
  80577. {
  80578. /* Enable the DMA reception */
  80579. ETH->DMAOMR |= ETH_DMAOMR_SR;
  80580. 803894a: f042 0202 orr.w r2, r2, #2
  80581. 803894e: e001 b.n 8038954 <ETH_DMAReceptionCmd+0x10>
  80582. }
  80583. else
  80584. {
  80585. /* Disable the DMA reception */
  80586. ETH->DMAOMR &= ~ETH_DMAOMR_SR;
  80587. 8038950: f022 0202 bic.w r2, r2, #2
  80588. 8038954: 619a str r2, [r3, #24]
  80589. 8038956: 4770 bx lr
  80590. 8038958: 40029000 .word 0x40029000
  80591. 0803895c <ETH_Start>:
  80592. * @brief Enables ENET MAC and DMA reception/transmission
  80593. * @param None
  80594. * @retval None
  80595. */
  80596. void ETH_Start(void)
  80597. {
  80598. 803895c: b508 push {r3, lr}
  80599. /* Enable transmit state machine of the MAC for transmission on the MII */
  80600. ETH_MACTransmissionCmd(ENABLE);
  80601. 803895e: 2001 movs r0, #1
  80602. 8038960: f7ff fe7a bl 8038658 <ETH_MACTransmissionCmd>
  80603. /* Flush Transmit FIFO */
  80604. ETH_FlushTransmitFIFO();
  80605. 8038964: f7ff ffda bl 803891c <ETH_FlushTransmitFIFO>
  80606. /* Enable receive state machine of the MAC for reception from the MII */
  80607. ETH_MACReceptionCmd(ENABLE);
  80608. 8038968: 2001 movs r0, #1
  80609. 803896a: f7ff fe81 bl 8038670 <ETH_MACReceptionCmd>
  80610. /* Start DMA transmission */
  80611. ETH_DMATransmissionCmd(ENABLE);
  80612. 803896e: 2001 movs r0, #1
  80613. 8038970: f7ff ffdc bl 803892c <ETH_DMATransmissionCmd>
  80614. /* Start DMA reception */
  80615. ETH_DMAReceptionCmd(ENABLE);
  80616. 8038974: 2001 movs r0, #1
  80617. }
  80618. 8038976: e8bd 4008 ldmia.w sp!, {r3, lr}
  80619. ETH_MACReceptionCmd(ENABLE);
  80620. /* Start DMA transmission */
  80621. ETH_DMATransmissionCmd(ENABLE);
  80622. /* Start DMA reception */
  80623. ETH_DMAReceptionCmd(ENABLE);
  80624. 803897a: f7ff bfe3 b.w 8038944 <ETH_DMAReceptionCmd>
  80625. 803897e: 0000 movs r0, r0
  80626. 08038980 <ETH_ReadPHYRegister>:
  80627. * @arg More PHY register could be read depending on the used PHY
  80628. * @retval ETH_ERROR: in case of timeout
  80629. * MAC MIIDR register value: Data read from the selected PHY register (correct read )
  80630. */
  80631. uint16_t ETH_ReadPHYRegister(uint16_t PHYAddress, uint16_t PHYReg)
  80632. {
  80633. 8038980: b082 sub sp, #8
  80634. uint32_t tmpreg = 0;
  80635. __IO uint32_t timeout = 0;
  80636. 8038982: 2300 movs r3, #0
  80637. 8038984: 9301 str r3, [sp, #4]
  80638. /* Check the parameters */
  80639. assert_param(IS_ETH_PHY_ADDRESS(PHYAddress));
  80640. assert_param(IS_ETH_PHY_REG(PHYReg));
  80641. /* Get the ETHERNET MACMIIAR value */
  80642. tmpreg = ETH->MACMIIAR;
  80643. 8038986: 4b11 ldr r3, [pc, #68] ; (80389cc <ETH_ReadPHYRegister+0x4c>)
  80644. 8038988: 691a ldr r2, [r3, #16]
  80645. /* Keep only the CSR Clock Range CR[2:0] bits value */
  80646. tmpreg &= ~MACMIIAR_CR_MASK;
  80647. /* Prepare the MII address register value */
  80648. tmpreg |=(((uint32_t)PHYAddress<<11) & ETH_MACMIIAR_PA); /* Set the PHY device address */
  80649. 803898a: 06c0 lsls r0, r0, #27
  80650. assert_param(IS_ETH_PHY_REG(PHYReg));
  80651. /* Get the ETHERNET MACMIIAR value */
  80652. tmpreg = ETH->MACMIIAR;
  80653. /* Keep only the CSR Clock Range CR[2:0] bits value */
  80654. tmpreg &= ~MACMIIAR_CR_MASK;
  80655. 803898c: f002 021c and.w r2, r2, #28
  80656. /* Prepare the MII address register value */
  80657. tmpreg |=(((uint32_t)PHYAddress<<11) & ETH_MACMIIAR_PA); /* Set the PHY device address */
  80658. tmpreg |=(((uint32_t)PHYReg<<6) & ETH_MACMIIAR_MR); /* Set the PHY register address */
  80659. 8038990: 0189 lsls r1, r1, #6
  80660. /* Get the ETHERNET MACMIIAR value */
  80661. tmpreg = ETH->MACMIIAR;
  80662. /* Keep only the CSR Clock Range CR[2:0] bits value */
  80663. tmpreg &= ~MACMIIAR_CR_MASK;
  80664. /* Prepare the MII address register value */
  80665. tmpreg |=(((uint32_t)PHYAddress<<11) & ETH_MACMIIAR_PA); /* Set the PHY device address */
  80666. 8038992: ea42 4210 orr.w r2, r2, r0, lsr #16
  80667. tmpreg |=(((uint32_t)PHYReg<<6) & ETH_MACMIIAR_MR); /* Set the PHY register address */
  80668. 8038996: f401 61f8 and.w r1, r1, #1984 ; 0x7c0
  80669. tmpreg &= ~ETH_MACMIIAR_MW; /* Set the read mode */
  80670. 803899a: 430a orrs r2, r1
  80671. tmpreg |= ETH_MACMIIAR_MB; /* Set the MII Busy bit */
  80672. 803899c: f042 0201 orr.w r2, r2, #1
  80673. /* Write the result value into the MII Address register */
  80674. ETH->MACMIIAR = tmpreg;
  80675. 80389a0: 611a str r2, [r3, #16]
  80676. /* Check for the Busy flag */
  80677. do
  80678. {
  80679. timeout++;
  80680. tmpreg = ETH->MACMIIAR;
  80681. } while ((tmpreg & ETH_MACMIIAR_MB) && (timeout < (uint32_t)PHY_READ_TO));
  80682. 80389a2: 4a0b ldr r2, [pc, #44] ; (80389d0 <ETH_ReadPHYRegister+0x50>)
  80683. /* Write the result value into the MII Address register */
  80684. ETH->MACMIIAR = tmpreg;
  80685. /* Check for the Busy flag */
  80686. do
  80687. {
  80688. timeout++;
  80689. 80389a4: 9901 ldr r1, [sp, #4]
  80690. 80389a6: 3101 adds r1, #1
  80691. 80389a8: 9101 str r1, [sp, #4]
  80692. tmpreg = ETH->MACMIIAR;
  80693. 80389aa: 6919 ldr r1, [r3, #16]
  80694. } while ((tmpreg & ETH_MACMIIAR_MB) && (timeout < (uint32_t)PHY_READ_TO));
  80695. 80389ac: 07c9 lsls r1, r1, #31
  80696. 80389ae: d502 bpl.n 80389b6 <ETH_ReadPHYRegister+0x36>
  80697. 80389b0: 9901 ldr r1, [sp, #4]
  80698. 80389b2: 4291 cmp r1, r2
  80699. 80389b4: d9f6 bls.n 80389a4 <ETH_ReadPHYRegister+0x24>
  80700. /* Return ERROR in case of timeout */
  80701. if(timeout == PHY_READ_TO)
  80702. 80389b6: 4b07 ldr r3, [pc, #28] ; (80389d4 <ETH_ReadPHYRegister+0x54>)
  80703. 80389b8: 9a01 ldr r2, [sp, #4]
  80704. 80389ba: 429a cmp r2, r3
  80705. {
  80706. return (uint16_t)ETH_ERROR;
  80707. }
  80708. /* Return data register value */
  80709. return (uint16_t)(ETH->MACMIIDR);
  80710. 80389bc: bf1d ittte ne
  80711. 80389be: 4b03 ldrne r3, [pc, #12] ; (80389cc <ETH_ReadPHYRegister+0x4c>)
  80712. 80389c0: 6958 ldrne r0, [r3, #20]
  80713. 80389c2: b280 uxthne r0, r0
  80714. tmpreg = ETH->MACMIIAR;
  80715. } while ((tmpreg & ETH_MACMIIAR_MB) && (timeout < (uint32_t)PHY_READ_TO));
  80716. /* Return ERROR in case of timeout */
  80717. if(timeout == PHY_READ_TO)
  80718. {
  80719. return (uint16_t)ETH_ERROR;
  80720. 80389c4: 2000 moveq r0, #0
  80721. }
  80722. /* Return data register value */
  80723. return (uint16_t)(ETH->MACMIIDR);
  80724. }
  80725. 80389c6: b002 add sp, #8
  80726. 80389c8: 4770 bx lr
  80727. 80389ca: bf00 nop
  80728. 80389cc: 40028000 .word 0x40028000
  80729. 80389d0: 0004fffe .word 0x0004fffe
  80730. 80389d4: 0004ffff .word 0x0004ffff
  80731. 080389d8 <ETH_WritePHYRegister>:
  80732. * @param PHYValue: the value to write
  80733. * @retval ETH_ERROR: in case of timeout
  80734. * ETH_SUCCESS: for correct write
  80735. */
  80736. uint32_t ETH_WritePHYRegister(uint16_t PHYAddress, uint16_t PHYReg, uint16_t PHYValue)
  80737. {
  80738. 80389d8: b513 push {r0, r1, r4, lr}
  80739. uint32_t tmpreg = 0;
  80740. __IO uint32_t timeout = 0;
  80741. 80389da: 2300 movs r3, #0
  80742. 80389dc: 9301 str r3, [sp, #4]
  80743. /* Check the parameters */
  80744. assert_param(IS_ETH_PHY_ADDRESS(PHYAddress));
  80745. assert_param(IS_ETH_PHY_REG(PHYReg));
  80746. /* Get the ETHERNET MACMIIAR value */
  80747. tmpreg = ETH->MACMIIAR;
  80748. 80389de: 4b0f ldr r3, [pc, #60] ; (8038a1c <ETH_WritePHYRegister+0x44>)
  80749. 80389e0: 691c ldr r4, [r3, #16]
  80750. tmpreg |=(((uint32_t)PHYAddress<<11) & ETH_MACMIIAR_PA); /* Set the PHY device address */
  80751. tmpreg |=(((uint32_t)PHYReg<<6) & ETH_MACMIIAR_MR); /* Set the PHY register address */
  80752. tmpreg |= ETH_MACMIIAR_MW; /* Set the write mode */
  80753. tmpreg |= ETH_MACMIIAR_MB; /* Set the MII Busy bit */
  80754. /* Give the value to the MII data register */
  80755. ETH->MACMIIDR = PHYValue;
  80756. 80389e2: 615a str r2, [r3, #20]
  80757. assert_param(IS_ETH_PHY_REG(PHYReg));
  80758. /* Get the ETHERNET MACMIIAR value */
  80759. tmpreg = ETH->MACMIIAR;
  80760. /* Keep only the CSR Clock Range CR[2:0] bits value */
  80761. tmpreg &= ~MACMIIAR_CR_MASK;
  80762. 80389e4: f004 041c and.w r4, r4, #28
  80763. /* Prepare the MII register address value */
  80764. tmpreg |=(((uint32_t)PHYAddress<<11) & ETH_MACMIIAR_PA); /* Set the PHY device address */
  80765. 80389e8: f044 0403 orr.w r4, r4, #3
  80766. 80389ec: 06c0 lsls r0, r0, #27
  80767. tmpreg |=(((uint32_t)PHYReg<<6) & ETH_MACMIIAR_MR); /* Set the PHY register address */
  80768. 80389ee: 0189 lsls r1, r1, #6
  80769. 80389f0: ea44 4410 orr.w r4, r4, r0, lsr #16
  80770. 80389f4: f401 61f8 and.w r1, r1, #1984 ; 0x7c0
  80771. tmpreg |= ETH_MACMIIAR_MW; /* Set the write mode */
  80772. tmpreg |= ETH_MACMIIAR_MB; /* Set the MII Busy bit */
  80773. 80389f8: 430c orrs r4, r1
  80774. /* Check for the Busy flag */
  80775. do
  80776. {
  80777. timeout++;
  80778. tmpreg = ETH->MACMIIAR;
  80779. } while ((tmpreg & ETH_MACMIIAR_MB) && (timeout < (uint32_t)PHY_WRITE_TO));
  80780. 80389fa: 4a09 ldr r2, [pc, #36] ; (8038a20 <ETH_WritePHYRegister+0x48>)
  80781. tmpreg |= ETH_MACMIIAR_MW; /* Set the write mode */
  80782. tmpreg |= ETH_MACMIIAR_MB; /* Set the MII Busy bit */
  80783. /* Give the value to the MII data register */
  80784. ETH->MACMIIDR = PHYValue;
  80785. /* Write the result value into the MII Address register */
  80786. ETH->MACMIIAR = tmpreg;
  80787. 80389fc: 611c str r4, [r3, #16]
  80788. /* Check for the Busy flag */
  80789. do
  80790. {
  80791. timeout++;
  80792. 80389fe: 9901 ldr r1, [sp, #4]
  80793. 8038a00: 3101 adds r1, #1
  80794. 8038a02: 9101 str r1, [sp, #4]
  80795. tmpreg = ETH->MACMIIAR;
  80796. 8038a04: 6919 ldr r1, [r3, #16]
  80797. } while ((tmpreg & ETH_MACMIIAR_MB) && (timeout < (uint32_t)PHY_WRITE_TO));
  80798. 8038a06: 07c8 lsls r0, r1, #31
  80799. 8038a08: d502 bpl.n 8038a10 <ETH_WritePHYRegister+0x38>
  80800. 8038a0a: 9901 ldr r1, [sp, #4]
  80801. 8038a0c: 4291 cmp r1, r2
  80802. 8038a0e: d9f6 bls.n 80389fe <ETH_WritePHYRegister+0x26>
  80803. /* Return ERROR in case of timeout */
  80804. if(timeout == PHY_WRITE_TO)
  80805. 8038a10: 9801 ldr r0, [sp, #4]
  80806. return ETH_ERROR;
  80807. }
  80808. /* Return SUCCESS */
  80809. return ETH_SUCCESS;
  80810. }
  80811. 8038a12: 4b04 ldr r3, [pc, #16] ; (8038a24 <ETH_WritePHYRegister+0x4c>)
  80812. 8038a14: 1ac0 subs r0, r0, r3
  80813. 8038a16: bf18 it ne
  80814. 8038a18: 2001 movne r0, #1
  80815. 8038a1a: bd1c pop {r2, r3, r4, pc}
  80816. 8038a1c: 40028000 .word 0x40028000
  80817. 8038a20: 0004fffe .word 0x0004fffe
  80818. 8038a24: 0004ffff .word 0x0004ffff
  80819. 08038a28 <ETH_Init>:
  80820. * @param PHYAddress: external PHY address
  80821. * @retval ETH_ERROR: Ethernet initialization failed
  80822. * ETH_SUCCESS: Ethernet successfully initialized
  80823. */
  80824. uint32_t ETH_Init(ETH_InitTypeDef* ETH_InitStruct, uint16_t PHYAddress)
  80825. {
  80826. 8038a28: b5f0 push {r4, r5, r6, r7, lr}
  80827. 8038a2a: b087 sub sp, #28
  80828. uint32_t RegValue = 0, tmpreg = 0;
  80829. __IO uint32_t i = 0;
  80830. 8038a2c: 2300 movs r3, #0
  80831. assert_param(IS_ETH_DMA_DESC_SKIP_LENGTH(ETH_InitStruct->ETH_DescriptorSkipLength));
  80832. assert_param(IS_ETH_DMA_ARBITRATION_ROUNDROBIN_RXTX(ETH_InitStruct->ETH_DMAArbitration));
  80833. /*-------------------------------- MAC Config ------------------------------*/
  80834. /*---------------------- ETHERNET MACMIIAR Configuration -------------------*/
  80835. /* Get the ETHERNET MACMIIAR value */
  80836. tmpreg = ETH->MACMIIAR;
  80837. 8038a2e: 4f90 ldr r7, [pc, #576] ; (8038c70 <ETH_Init+0x248>)
  80838. * ETH_SUCCESS: Ethernet successfully initialized
  80839. */
  80840. uint32_t ETH_Init(ETH_InitTypeDef* ETH_InitStruct, uint16_t PHYAddress)
  80841. {
  80842. uint32_t RegValue = 0, tmpreg = 0;
  80843. __IO uint32_t i = 0;
  80844. 8038a30: 9300 str r3, [sp, #0]
  80845. * @param PHYAddress: external PHY address
  80846. * @retval ETH_ERROR: Ethernet initialization failed
  80847. * ETH_SUCCESS: Ethernet successfully initialized
  80848. */
  80849. uint32_t ETH_Init(ETH_InitTypeDef* ETH_InitStruct, uint16_t PHYAddress)
  80850. {
  80851. 8038a32: 4604 mov r4, r0
  80852. uint32_t RegValue = 0, tmpreg = 0;
  80853. __IO uint32_t i = 0;
  80854. RCC_ClocksTypeDef rcc_clocks;
  80855. uint32_t hclk = 60000000;
  80856. __IO uint32_t timeout = 0;
  80857. 8038a34: 9301 str r3, [sp, #4]
  80858. /* Get the ETHERNET MACMIIAR value */
  80859. tmpreg = ETH->MACMIIAR;
  80860. /* Clear CSR Clock Range CR[2:0] bits */
  80861. tmpreg &= MACMIIAR_CR_MASK;
  80862. /* Get hclk frequency value */
  80863. RCC_GetClocksFreq(&rcc_clocks);
  80864. 8038a36: a802 add r0, sp, #8
  80865. * @param PHYAddress: external PHY address
  80866. * @retval ETH_ERROR: Ethernet initialization failed
  80867. * ETH_SUCCESS: Ethernet successfully initialized
  80868. */
  80869. uint32_t ETH_Init(ETH_InitTypeDef* ETH_InitStruct, uint16_t PHYAddress)
  80870. {
  80871. 8038a38: 460e mov r6, r1
  80872. assert_param(IS_ETH_DMA_DESC_SKIP_LENGTH(ETH_InitStruct->ETH_DescriptorSkipLength));
  80873. assert_param(IS_ETH_DMA_ARBITRATION_ROUNDROBIN_RXTX(ETH_InitStruct->ETH_DMAArbitration));
  80874. /*-------------------------------- MAC Config ------------------------------*/
  80875. /*---------------------- ETHERNET MACMIIAR Configuration -------------------*/
  80876. /* Get the ETHERNET MACMIIAR value */
  80877. tmpreg = ETH->MACMIIAR;
  80878. 8038a3a: 693d ldr r5, [r7, #16]
  80879. /* Clear CSR Clock Range CR[2:0] bits */
  80880. tmpreg &= MACMIIAR_CR_MASK;
  80881. /* Get hclk frequency value */
  80882. RCC_GetClocksFreq(&rcc_clocks);
  80883. 8038a3c: f7ec ffae bl 802599c <RCC_GetClocksFreq>
  80884. hclk = rcc_clocks.HCLK_Frequency;
  80885. 8038a40: 9b03 ldr r3, [sp, #12]
  80886. /* Set CR bits depending on hclk value */
  80887. if((hclk >= 20000000)&&(hclk < 35000000))
  80888. 8038a42: 4a8c ldr r2, [pc, #560] ; (8038c74 <ETH_Init+0x24c>)
  80889. 8038a44: 498c ldr r1, [pc, #560] ; (8038c78 <ETH_Init+0x250>)
  80890. 8038a46: 189a adds r2, r3, r2
  80891. 8038a48: 428a cmp r2, r1
  80892. /*-------------------------------- MAC Config ------------------------------*/
  80893. /*---------------------- ETHERNET MACMIIAR Configuration -------------------*/
  80894. /* Get the ETHERNET MACMIIAR value */
  80895. tmpreg = ETH->MACMIIAR;
  80896. /* Clear CSR Clock Range CR[2:0] bits */
  80897. tmpreg &= MACMIIAR_CR_MASK;
  80898. 8038a4a: f025 051c bic.w r5, r5, #28
  80899. /* Get hclk frequency value */
  80900. RCC_GetClocksFreq(&rcc_clocks);
  80901. hclk = rcc_clocks.HCLK_Frequency;
  80902. /* Set CR bits depending on hclk value */
  80903. if((hclk >= 20000000)&&(hclk < 35000000))
  80904. 8038a4e: d802 bhi.n 8038a56 <ETH_Init+0x2e>
  80905. {
  80906. /* CSR Clock Range between 20-35 MHz */
  80907. tmpreg |= (uint32_t)ETH_MACMIIAR_CR_Div16;
  80908. 8038a50: f045 0508 orr.w r5, r5, #8
  80909. 8038a54: e015 b.n 8038a82 <ETH_Init+0x5a>
  80910. }
  80911. else if((hclk >= 35000000)&&(hclk < 60000000))
  80912. 8038a56: 4a89 ldr r2, [pc, #548] ; (8038c7c <ETH_Init+0x254>)
  80913. 8038a58: 4989 ldr r1, [pc, #548] ; (8038c80 <ETH_Init+0x258>)
  80914. 8038a5a: 189a adds r2, r3, r2
  80915. 8038a5c: 428a cmp r2, r1
  80916. 8038a5e: d802 bhi.n 8038a66 <ETH_Init+0x3e>
  80917. {
  80918. /* CSR Clock Range between 35-60 MHz */
  80919. tmpreg |= (uint32_t)ETH_MACMIIAR_CR_Div26;
  80920. 8038a60: f045 050c orr.w r5, r5, #12
  80921. 8038a64: e00d b.n 8038a82 <ETH_Init+0x5a>
  80922. }
  80923. else if((hclk >= 60000000)&&(hclk < 100000000))
  80924. 8038a66: 4a87 ldr r2, [pc, #540] ; (8038c84 <ETH_Init+0x25c>)
  80925. 8038a68: 4987 ldr r1, [pc, #540] ; (8038c88 <ETH_Init+0x260>)
  80926. 8038a6a: 189a adds r2, r3, r2
  80927. 8038a6c: 428a cmp r2, r1
  80928. 8038a6e: d908 bls.n 8038a82 <ETH_Init+0x5a>
  80929. {
  80930. /* CSR Clock Range between 60-100 MHz */
  80931. tmpreg |= (uint32_t)ETH_MACMIIAR_CR_Div42;
  80932. }
  80933. else if((hclk >= 100000000)&&(hclk < 150000000))
  80934. 8038a70: 4a86 ldr r2, [pc, #536] ; (8038c8c <ETH_Init+0x264>)
  80935. 8038a72: 189a adds r2, r3, r2
  80936. 8038a74: 4b86 ldr r3, [pc, #536] ; (8038c90 <ETH_Init+0x268>)
  80937. 8038a76: 429a cmp r2, r3
  80938. {
  80939. /* CSR Clock Range between 100-150 MHz */
  80940. tmpreg |= (uint32_t)ETH_MACMIIAR_CR_Div62;
  80941. 8038a78: bf94 ite ls
  80942. 8038a7a: f045 0504 orrls.w r5, r5, #4
  80943. }
  80944. else /* ((hclk >= 150000000)&&(hclk <= 168000000)) */
  80945. {
  80946. /* CSR Clock Range between 150-168 MHz */
  80947. tmpreg |= (uint32_t)ETH_MACMIIAR_CR_Div102;
  80948. 8038a7e: f045 0510 orrhi.w r5, r5, #16
  80949. }
  80950. /* Write to ETHERNET MAC MIIAR: Configure the ETHERNET CSR Clock Range */
  80951. ETH->MACMIIAR = (uint32_t)tmpreg;
  80952. 8038a82: 613d str r5, [r7, #16]
  80953. /*-------------------- PHY initialization and configuration ----------------*/
  80954. /* Put the PHY in reset mode */
  80955. if(!(ETH_WritePHYRegister(PHYAddress, PHY_BCR, PHY_Reset)))
  80956. 8038a84: 4630 mov r0, r6
  80957. 8038a86: 2100 movs r1, #0
  80958. 8038a88: f44f 4200 mov.w r2, #32768 ; 0x8000
  80959. 8038a8c: f7ff ffa4 bl 80389d8 <ETH_WritePHYRegister>
  80960. 8038a90: b908 cbnz r0, 8038a96 <ETH_Init+0x6e>
  80961. {
  80962. /* Return ERROR in case of write timeout */
  80963. return ETH_ERROR;
  80964. 8038a92: 2000 movs r0, #0
  80965. 8038a94: e0e9 b.n 8038c6a <ETH_Init+0x242>
  80966. }
  80967. /* Delay to assure PHY reset */
  80968. _eth_delay_(PHY_RESET_DELAY);
  80969. 8038a96: 487f ldr r0, [pc, #508] ; (8038c94 <ETH_Init+0x26c>)
  80970. 8038a98: f7ff fd6e bl 8038578 <ETH_Delay>
  80971. if(ETH_InitStruct->ETH_AutoNegotiation != ETH_AutoNegotiation_Disable)
  80972. 8038a9c: 6821 ldr r1, [r4, #0]
  80973. 8038a9e: 2900 cmp r1, #0
  80974. 8038aa0: d050 beq.n 8038b44 <ETH_Init+0x11c>
  80975. {
  80976. /* We wait for linked status... */
  80977. do
  80978. {
  80979. timeout++;
  80980. } while (!(ETH_ReadPHYRegister(PHYAddress, PHY_BSR) & PHY_Linked_Status) && (timeout < PHY_READ_TO));
  80981. 8038aa2: 4d7d ldr r5, [pc, #500] ; (8038c98 <ETH_Init+0x270>)
  80982. if(ETH_InitStruct->ETH_AutoNegotiation != ETH_AutoNegotiation_Disable)
  80983. {
  80984. /* We wait for linked status... */
  80985. do
  80986. {
  80987. timeout++;
  80988. 8038aa4: 9b01 ldr r3, [sp, #4]
  80989. } while (!(ETH_ReadPHYRegister(PHYAddress, PHY_BSR) & PHY_Linked_Status) && (timeout < PHY_READ_TO));
  80990. 8038aa6: 4630 mov r0, r6
  80991. if(ETH_InitStruct->ETH_AutoNegotiation != ETH_AutoNegotiation_Disable)
  80992. {
  80993. /* We wait for linked status... */
  80994. do
  80995. {
  80996. timeout++;
  80997. 8038aa8: 3301 adds r3, #1
  80998. } while (!(ETH_ReadPHYRegister(PHYAddress, PHY_BSR) & PHY_Linked_Status) && (timeout < PHY_READ_TO));
  80999. 8038aaa: 2101 movs r1, #1
  81000. if(ETH_InitStruct->ETH_AutoNegotiation != ETH_AutoNegotiation_Disable)
  81001. {
  81002. /* We wait for linked status... */
  81003. do
  81004. {
  81005. timeout++;
  81006. 8038aac: 9301 str r3, [sp, #4]
  81007. } while (!(ETH_ReadPHYRegister(PHYAddress, PHY_BSR) & PHY_Linked_Status) && (timeout < PHY_READ_TO));
  81008. 8038aae: f7ff ff67 bl 8038980 <ETH_ReadPHYRegister>
  81009. 8038ab2: f000 0004 and.w r0, r0, #4
  81010. 8038ab6: b280 uxth r0, r0
  81011. 8038ab8: b910 cbnz r0, 8038ac0 <ETH_Init+0x98>
  81012. 8038aba: 9b01 ldr r3, [sp, #4]
  81013. 8038abc: 42ab cmp r3, r5
  81014. 8038abe: d9f1 bls.n 8038aa4 <ETH_Init+0x7c>
  81015. /* Return ERROR in case of timeout */
  81016. if(timeout == PHY_READ_TO)
  81017. 8038ac0: 9a01 ldr r2, [sp, #4]
  81018. 8038ac2: 4b76 ldr r3, [pc, #472] ; (8038c9c <ETH_Init+0x274>)
  81019. 8038ac4: 429a cmp r2, r3
  81020. 8038ac6: d0e4 beq.n 8038a92 <ETH_Init+0x6a>
  81021. {
  81022. return ETH_ERROR;
  81023. }
  81024. /* Reset Timeout counter */
  81025. timeout = 0;
  81026. 8038ac8: 2100 movs r1, #0
  81027. /* Enable Auto-Negotiation */
  81028. if(!(ETH_WritePHYRegister(PHYAddress, PHY_BCR, PHY_AutoNegotiation)))
  81029. 8038aca: 4630 mov r0, r6
  81030. 8038acc: f44f 5280 mov.w r2, #4096 ; 0x1000
  81031. {
  81032. return ETH_ERROR;
  81033. }
  81034. /* Reset Timeout counter */
  81035. timeout = 0;
  81036. 8038ad0: 9101 str r1, [sp, #4]
  81037. /* Enable Auto-Negotiation */
  81038. if(!(ETH_WritePHYRegister(PHYAddress, PHY_BCR, PHY_AutoNegotiation)))
  81039. 8038ad2: f7ff ff81 bl 80389d8 <ETH_WritePHYRegister>
  81040. 8038ad6: 2800 cmp r0, #0
  81041. 8038ad8: d0db beq.n 8038a92 <ETH_Init+0x6a>
  81042. /* Wait until the auto-negotiation will be completed */
  81043. do
  81044. {
  81045. timeout++;
  81046. } while (!(ETH_ReadPHYRegister(PHYAddress, PHY_BSR) & PHY_AutoNego_Complete) && (timeout < (uint32_t)PHY_READ_TO));
  81047. 8038ada: 4d6f ldr r5, [pc, #444] ; (8038c98 <ETH_Init+0x270>)
  81048. }
  81049. /* Wait until the auto-negotiation will be completed */
  81050. do
  81051. {
  81052. timeout++;
  81053. 8038adc: 9b01 ldr r3, [sp, #4]
  81054. } while (!(ETH_ReadPHYRegister(PHYAddress, PHY_BSR) & PHY_AutoNego_Complete) && (timeout < (uint32_t)PHY_READ_TO));
  81055. 8038ade: 4630 mov r0, r6
  81056. }
  81057. /* Wait until the auto-negotiation will be completed */
  81058. do
  81059. {
  81060. timeout++;
  81061. 8038ae0: 3301 adds r3, #1
  81062. } while (!(ETH_ReadPHYRegister(PHYAddress, PHY_BSR) & PHY_AutoNego_Complete) && (timeout < (uint32_t)PHY_READ_TO));
  81063. 8038ae2: 2101 movs r1, #1
  81064. }
  81065. /* Wait until the auto-negotiation will be completed */
  81066. do
  81067. {
  81068. timeout++;
  81069. 8038ae4: 9301 str r3, [sp, #4]
  81070. } while (!(ETH_ReadPHYRegister(PHYAddress, PHY_BSR) & PHY_AutoNego_Complete) && (timeout < (uint32_t)PHY_READ_TO));
  81071. 8038ae6: f7ff ff4b bl 8038980 <ETH_ReadPHYRegister>
  81072. 8038aea: f000 0020 and.w r0, r0, #32
  81073. 8038aee: b280 uxth r0, r0
  81074. 8038af0: b910 cbnz r0, 8038af8 <ETH_Init+0xd0>
  81075. 8038af2: 9b01 ldr r3, [sp, #4]
  81076. 8038af4: 42ab cmp r3, r5
  81077. 8038af6: d9f1 bls.n 8038adc <ETH_Init+0xb4>
  81078. /* Return ERROR in case of timeout */
  81079. if(timeout == PHY_READ_TO)
  81080. 8038af8: 9a01 ldr r2, [sp, #4]
  81081. 8038afa: 4b68 ldr r3, [pc, #416] ; (8038c9c <ETH_Init+0x274>)
  81082. 8038afc: 429a cmp r2, r3
  81083. 8038afe: d0c8 beq.n 8038a92 <ETH_Init+0x6a>
  81084. {
  81085. return ETH_ERROR;
  81086. }
  81087. /* Reset Timeout counter */
  81088. timeout = 0;
  81089. 8038b00: 2500 movs r5, #0
  81090. /* Read the result of the auto-negotiation */
  81091. RegValue = ETH_ReadPHYRegister(PHYAddress, PHY_SR);
  81092. 8038b02: 211f movs r1, #31
  81093. 8038b04: 4630 mov r0, r6
  81094. {
  81095. return ETH_ERROR;
  81096. }
  81097. /* Reset Timeout counter */
  81098. timeout = 0;
  81099. 8038b06: 9501 str r5, [sp, #4]
  81100. /* Read the result of the auto-negotiation */
  81101. RegValue = ETH_ReadPHYRegister(PHYAddress, PHY_SR);
  81102. 8038b08: f7ff ff3a bl 8038980 <ETH_ReadPHYRegister>
  81103. switch (RegValue & PHY_DUPLEX_SPEED_STATUS_MASK)
  81104. 8038b0c: f000 001c and.w r0, r0, #28
  81105. 8038b10: 2808 cmp r0, #8
  81106. 8038b12: d00b beq.n 8038b2c <ETH_Init+0x104>
  81107. 8038b14: d802 bhi.n 8038b1c <ETH_Init+0xf4>
  81108. 8038b16: 2804 cmp r0, #4
  81109. 8038b18: d123 bne.n 8038b62 <ETH_Init+0x13a>
  81110. 8038b1a: e010 b.n 8038b3e <ETH_Init+0x116>
  81111. 8038b1c: 280e cmp r0, #14
  81112. 8038b1e: d00a beq.n 8038b36 <ETH_Init+0x10e>
  81113. 8038b20: 2812 cmp r0, #18
  81114. 8038b22: d11e bne.n 8038b62 <ETH_Init+0x13a>
  81115. {
  81116. case PHY_100BTX_FULL:
  81117. ETH_InitStruct->ETH_Mode = ETH_Mode_FullDuplex;
  81118. 8038b24: f44f 6300 mov.w r3, #2048 ; 0x800
  81119. 8038b28: 6223 str r3, [r4, #32]
  81120. 8038b2a: e000 b.n 8038b2e <ETH_Init+0x106>
  81121. ETH_InitStruct->ETH_Speed = ETH_Speed_100M;
  81122. break;
  81123. case PHY_100BTX_HALF:
  81124. ETH_InitStruct->ETH_Mode = ETH_Mode_HalfDuplex;
  81125. 8038b2c: 6225 str r5, [r4, #32]
  81126. ETH_InitStruct->ETH_Speed = ETH_Speed_100M;
  81127. 8038b2e: f44f 4380 mov.w r3, #16384 ; 0x4000
  81128. 8038b32: 6163 str r3, [r4, #20]
  81129. break;
  81130. 8038b34: e015 b.n 8038b62 <ETH_Init+0x13a>
  81131. case PHY_10M_FULL:
  81132. ETH_InitStruct->ETH_Mode = ETH_Mode_FullDuplex;
  81133. 8038b36: f44f 6300 mov.w r3, #2048 ; 0x800
  81134. 8038b3a: 6223 str r3, [r4, #32]
  81135. 8038b3c: e000 b.n 8038b40 <ETH_Init+0x118>
  81136. ETH_InitStruct->ETH_Speed = ETH_Speed_10M;
  81137. break;
  81138. case PHY_10M_HALF:
  81139. ETH_InitStruct->ETH_Mode = ETH_Mode_HalfDuplex;
  81140. 8038b3e: 6225 str r5, [r4, #32]
  81141. ETH_InitStruct->ETH_Speed = ETH_Speed_10M;
  81142. 8038b40: 6165 str r5, [r4, #20]
  81143. break;
  81144. 8038b42: e00e b.n 8038b62 <ETH_Init+0x13a>
  81145. break;
  81146. }
  81147. }
  81148. else
  81149. {
  81150. if(!ETH_WritePHYRegister(PHYAddress, PHY_BCR, ((uint16_t)(ETH_InitStruct->ETH_Mode >> 3) |
  81151. 8038b44: 6a22 ldr r2, [r4, #32]
  81152. (uint16_t)(ETH_InitStruct->ETH_Speed >> 1))))
  81153. 8038b46: 6963 ldr r3, [r4, #20]
  81154. break;
  81155. }
  81156. }
  81157. else
  81158. {
  81159. if(!ETH_WritePHYRegister(PHYAddress, PHY_BCR, ((uint16_t)(ETH_InitStruct->ETH_Mode >> 3) |
  81160. 8038b48: 08d2 lsrs r2, r2, #3
  81161. 8038b4a: ea42 0253 orr.w r2, r2, r3, lsr #1
  81162. 8038b4e: 4630 mov r0, r6
  81163. 8038b50: b292 uxth r2, r2
  81164. 8038b52: f7ff ff41 bl 80389d8 <ETH_WritePHYRegister>
  81165. 8038b56: 2800 cmp r0, #0
  81166. 8038b58: d09b beq.n 8038a92 <ETH_Init+0x6a>
  81167. {
  81168. /* Return ERROR in case of write timeout */
  81169. return ETH_ERROR;
  81170. }
  81171. /* Delay to assure PHY configuration */
  81172. _eth_delay_(PHY_CONFIG_DELAY);
  81173. 8038b5a: f06f 407f mvn.w r0, #4278190080 ; 0xff000000
  81174. 8038b5e: f7ff fd0b bl 8038578 <ETH_Delay>
  81175. }
  81176. /*------------------------ ETHERNET MACCR Configuration --------------------*/
  81177. /* Get the ETHERNET MACCR value */
  81178. tmpreg = ETH->MACCR;
  81179. 8038b62: 4b43 ldr r3, [pc, #268] ; (8038c70 <ETH_Init+0x248>)
  81180. /* Clear WD, PCE, PS, TE and RE bits */
  81181. tmpreg &= MACCR_CLEAR_MASK;
  81182. 8038b64: 4a4e ldr r2, [pc, #312] ; (8038ca0 <ETH_Init+0x278>)
  81183. _eth_delay_(PHY_CONFIG_DELAY);
  81184. }
  81185. /*------------------------ ETHERNET MACCR Configuration --------------------*/
  81186. /* Get the ETHERNET MACCR value */
  81187. tmpreg = ETH->MACCR;
  81188. 8038b66: 6819 ldr r1, [r3, #0]
  81189. /* Set the IPCO bit according to ETH_ChecksumOffload value */
  81190. /* Set the DR bit according to ETH_RetryTransmission value */
  81191. /* Set the ACS bit according to ETH_AutomaticPadCRCStrip value */
  81192. /* Set the BL bit according to ETH_BackOffLimit value */
  81193. /* Set the DC bit according to ETH_DeferralCheck value */
  81194. tmpreg |= (uint32_t)(ETH_InitStruct->ETH_Watchdog |
  81195. 8038b68: 68a0 ldr r0, [r4, #8]
  81196. }
  81197. /*------------------------ ETHERNET MACCR Configuration --------------------*/
  81198. /* Get the ETHERNET MACCR value */
  81199. tmpreg = ETH->MACCR;
  81200. /* Clear WD, PCE, PS, TE and RE bits */
  81201. tmpreg &= MACCR_CLEAR_MASK;
  81202. 8038b6a: 400a ands r2, r1
  81203. /* Set the IPCO bit according to ETH_ChecksumOffload value */
  81204. /* Set the DR bit according to ETH_RetryTransmission value */
  81205. /* Set the ACS bit according to ETH_AutomaticPadCRCStrip value */
  81206. /* Set the BL bit according to ETH_BackOffLimit value */
  81207. /* Set the DC bit according to ETH_DeferralCheck value */
  81208. tmpreg |= (uint32_t)(ETH_InitStruct->ETH_Watchdog |
  81209. 8038b6c: 6861 ldr r1, [r4, #4]
  81210. 8038b6e: 4308 orrs r0, r1
  81211. ETH_InitStruct->ETH_Jabber |
  81212. 8038b70: 68e1 ldr r1, [r4, #12]
  81213. 8038b72: 4308 orrs r0, r1
  81214. ETH_InitStruct->ETH_InterFrameGap |
  81215. 8038b74: 6921 ldr r1, [r4, #16]
  81216. 8038b76: 4308 orrs r0, r1
  81217. ETH_InitStruct->ETH_CarrierSense |
  81218. 8038b78: 6961 ldr r1, [r4, #20]
  81219. 8038b7a: 4308 orrs r0, r1
  81220. ETH_InitStruct->ETH_Speed |
  81221. 8038b7c: 69a1 ldr r1, [r4, #24]
  81222. 8038b7e: 4308 orrs r0, r1
  81223. ETH_InitStruct->ETH_ReceiveOwn |
  81224. 8038b80: 69e1 ldr r1, [r4, #28]
  81225. 8038b82: 4308 orrs r0, r1
  81226. ETH_InitStruct->ETH_LoopbackMode |
  81227. 8038b84: 6a21 ldr r1, [r4, #32]
  81228. 8038b86: 4308 orrs r0, r1
  81229. ETH_InitStruct->ETH_Mode |
  81230. 8038b88: 6a61 ldr r1, [r4, #36] ; 0x24
  81231. 8038b8a: 4308 orrs r0, r1
  81232. ETH_InitStruct->ETH_ChecksumOffload |
  81233. 8038b8c: 6aa1 ldr r1, [r4, #40] ; 0x28
  81234. 8038b8e: 4308 orrs r0, r1
  81235. ETH_InitStruct->ETH_RetryTransmission |
  81236. 8038b90: 6ae1 ldr r1, [r4, #44] ; 0x2c
  81237. 8038b92: 4308 orrs r0, r1
  81238. ETH_InitStruct->ETH_AutomaticPadCRCStrip |
  81239. 8038b94: 6b21 ldr r1, [r4, #48] ; 0x30
  81240. 8038b96: 4308 orrs r0, r1
  81241. /* Set the IPCO bit according to ETH_ChecksumOffload value */
  81242. /* Set the DR bit according to ETH_RetryTransmission value */
  81243. /* Set the ACS bit according to ETH_AutomaticPadCRCStrip value */
  81244. /* Set the BL bit according to ETH_BackOffLimit value */
  81245. /* Set the DC bit according to ETH_DeferralCheck value */
  81246. tmpreg |= (uint32_t)(ETH_InitStruct->ETH_Watchdog |
  81247. 8038b98: 6b61 ldr r1, [r4, #52] ; 0x34
  81248. 8038b9a: 4301 orrs r1, r0
  81249. 8038b9c: 430a orrs r2, r1
  81250. ETH_InitStruct->ETH_RetryTransmission |
  81251. ETH_InitStruct->ETH_AutomaticPadCRCStrip |
  81252. ETH_InitStruct->ETH_BackOffLimit |
  81253. ETH_InitStruct->ETH_DeferralCheck);
  81254. /* Write to ETHERNET MACCR */
  81255. ETH->MACCR = (uint32_t)tmpreg;
  81256. 8038b9e: 601a str r2, [r3, #0]
  81257. /* Set the DAIF bit according to ETH_DestinationAddrFilter value */
  81258. /* Set the PR bit according to ETH_PromiscuousMode value */
  81259. /* Set the PM, HMC and HPF bits according to ETH_MulticastFramesFilter value */
  81260. /* Set the HUC and HPF bits according to ETH_UnicastFramesFilter value */
  81261. /* Write to ETHERNET MACFFR */
  81262. ETH->MACFFR = (uint32_t)(ETH_InitStruct->ETH_ReceiveAll |
  81263. 8038ba0: 6ba2 ldr r2, [r4, #56] ; 0x38
  81264. 8038ba2: 6be1 ldr r1, [r4, #60] ; 0x3c
  81265. 8038ba4: 4311 orrs r1, r2
  81266. ETH_InitStruct->ETH_SourceAddrFilter |
  81267. 8038ba6: 6c22 ldr r2, [r4, #64] ; 0x40
  81268. 8038ba8: 4311 orrs r1, r2
  81269. ETH_InitStruct->ETH_PassControlFrames |
  81270. 8038baa: 6c62 ldr r2, [r4, #68] ; 0x44
  81271. 8038bac: 4311 orrs r1, r2
  81272. ETH_InitStruct->ETH_BroadcastFramesReception |
  81273. 8038bae: 6ca2 ldr r2, [r4, #72] ; 0x48
  81274. 8038bb0: 4311 orrs r1, r2
  81275. ETH_InitStruct->ETH_DestinationAddrFilter |
  81276. 8038bb2: 6ce2 ldr r2, [r4, #76] ; 0x4c
  81277. 8038bb4: 4311 orrs r1, r2
  81278. ETH_InitStruct->ETH_PromiscuousMode |
  81279. 8038bb6: 6d22 ldr r2, [r4, #80] ; 0x50
  81280. 8038bb8: 4311 orrs r1, r2
  81281. /* Set the DAIF bit according to ETH_DestinationAddrFilter value */
  81282. /* Set the PR bit according to ETH_PromiscuousMode value */
  81283. /* Set the PM, HMC and HPF bits according to ETH_MulticastFramesFilter value */
  81284. /* Set the HUC and HPF bits according to ETH_UnicastFramesFilter value */
  81285. /* Write to ETHERNET MACFFR */
  81286. ETH->MACFFR = (uint32_t)(ETH_InitStruct->ETH_ReceiveAll |
  81287. 8038bba: 6d62 ldr r2, [r4, #84] ; 0x54
  81288. 8038bbc: 430a orrs r2, r1
  81289. 8038bbe: 605a str r2, [r3, #4]
  81290. ETH_InitStruct->ETH_PromiscuousMode |
  81291. ETH_InitStruct->ETH_MulticastFramesFilter |
  81292. ETH_InitStruct->ETH_UnicastFramesFilter);
  81293. /*--------------- ETHERNET MACHTHR and MACHTLR Configuration ---------------*/
  81294. /* Write to ETHERNET MACHTHR */
  81295. ETH->MACHTHR = (uint32_t)ETH_InitStruct->ETH_HashTableHigh;
  81296. 8038bc0: 6da2 ldr r2, [r4, #88] ; 0x58
  81297. 8038bc2: 609a str r2, [r3, #8]
  81298. /* Write to ETHERNET MACHTLR */
  81299. ETH->MACHTLR = (uint32_t)ETH_InitStruct->ETH_HashTableLow;
  81300. 8038bc4: 6de2 ldr r2, [r4, #92] ; 0x5c
  81301. 8038bc6: 60da str r2, [r3, #12]
  81302. /* Set the DZPQ bit according to ETH_ZeroQuantaPause value */
  81303. /* Set the PLT bit according to ETH_PauseLowThreshold value */
  81304. /* Set the UP bit according to ETH_UnicastPauseFrameDetect value */
  81305. /* Set the RFE bit according to ETH_ReceiveFlowControl value */
  81306. /* Set the TFE bit according to ETH_TransmitFlowControl value */
  81307. tmpreg |= (uint32_t)((ETH_InitStruct->ETH_PauseTime << 16) |
  81308. 8038bc8: 6e62 ldr r2, [r4, #100] ; 0x64
  81309. 8038bca: 6ea1 ldr r1, [r4, #104] ; 0x68
  81310. ETH->MACHTHR = (uint32_t)ETH_InitStruct->ETH_HashTableHigh;
  81311. /* Write to ETHERNET MACHTLR */
  81312. ETH->MACHTLR = (uint32_t)ETH_InitStruct->ETH_HashTableLow;
  81313. /*----------------------- ETHERNET MACFCR Configuration --------------------*/
  81314. /* Get the ETHERNET MACFCR value */
  81315. tmpreg = ETH->MACFCR;
  81316. 8038bcc: 6998 ldr r0, [r3, #24]
  81317. /* Set the DZPQ bit according to ETH_ZeroQuantaPause value */
  81318. /* Set the PLT bit according to ETH_PauseLowThreshold value */
  81319. /* Set the UP bit according to ETH_UnicastPauseFrameDetect value */
  81320. /* Set the RFE bit according to ETH_ReceiveFlowControl value */
  81321. /* Set the TFE bit according to ETH_TransmitFlowControl value */
  81322. tmpreg |= (uint32_t)((ETH_InitStruct->ETH_PauseTime << 16) |
  81323. 8038bce: 4311 orrs r1, r2
  81324. ETH_InitStruct->ETH_ZeroQuantaPause |
  81325. 8038bd0: 6ee2 ldr r2, [r4, #108] ; 0x6c
  81326. 8038bd2: 4311 orrs r1, r2
  81327. ETH_InitStruct->ETH_PauseLowThreshold |
  81328. 8038bd4: 6f22 ldr r2, [r4, #112] ; 0x70
  81329. 8038bd6: 4311 orrs r1, r2
  81330. ETH_InitStruct->ETH_UnicastPauseFrameDetect |
  81331. 8038bd8: 6f62 ldr r2, [r4, #116] ; 0x74
  81332. 8038bda: 4311 orrs r1, r2
  81333. ETH->MACHTLR = (uint32_t)ETH_InitStruct->ETH_HashTableLow;
  81334. /*----------------------- ETHERNET MACFCR Configuration --------------------*/
  81335. /* Get the ETHERNET MACFCR value */
  81336. tmpreg = ETH->MACFCR;
  81337. /* Clear xx bits */
  81338. tmpreg &= MACFCR_CLEAR_MASK;
  81339. 8038bdc: f64f 7241 movw r2, #65345 ; 0xff41
  81340. 8038be0: 4002 ands r2, r0
  81341. /* Set the DZPQ bit according to ETH_ZeroQuantaPause value */
  81342. /* Set the PLT bit according to ETH_PauseLowThreshold value */
  81343. /* Set the UP bit according to ETH_UnicastPauseFrameDetect value */
  81344. /* Set the RFE bit according to ETH_ReceiveFlowControl value */
  81345. /* Set the TFE bit according to ETH_TransmitFlowControl value */
  81346. tmpreg |= (uint32_t)((ETH_InitStruct->ETH_PauseTime << 16) |
  81347. 8038be2: 430a orrs r2, r1
  81348. 8038be4: 6e21 ldr r1, [r4, #96] ; 0x60
  81349. 8038be6: ea42 4101 orr.w r1, r2, r1, lsl #16
  81350. ETH_InitStruct->ETH_PauseLowThreshold |
  81351. ETH_InitStruct->ETH_UnicastPauseFrameDetect |
  81352. ETH_InitStruct->ETH_ReceiveFlowControl |
  81353. ETH_InitStruct->ETH_TransmitFlowControl);
  81354. /* Write to ETHERNET MACFCR */
  81355. ETH->MACFCR = (uint32_t)tmpreg;
  81356. 8038bea: 6199 str r1, [r3, #24]
  81357. /*----------------------- ETHERNET MACVLANTR Configuration -----------------*/
  81358. /* Set the ETV bit according to ETH_VLANTagComparison value */
  81359. /* Set the VL bit according to ETH_VLANTagIdentifier value */
  81360. ETH->MACVLANTR = (uint32_t)(ETH_InitStruct->ETH_VLANTagComparison |
  81361. 8038bec: 6fe1 ldr r1, [r4, #124] ; 0x7c
  81362. 8038bee: 6fa2 ldr r2, [r4, #120] ; 0x78
  81363. 8038bf0: 430a orrs r2, r1
  81364. 8038bf2: 61da str r2, [r3, #28]
  81365. ETH_InitStruct->ETH_VLANTagIdentifier);
  81366. /*-------------------------------- DMA Config ------------------------------*/
  81367. /*----------------------- ETHERNET DMAOMR Configuration --------------------*/
  81368. /* Get the ETHERNET DMAOMR value */
  81369. tmpreg = ETH->DMAOMR;
  81370. 8038bf4: f503 5380 add.w r3, r3, #4096 ; 0x1000
  81371. /* Clear xx bits */
  81372. tmpreg &= DMAOMR_CLEAR_MASK;
  81373. 8038bf8: 4a2a ldr r2, [pc, #168] ; (8038ca4 <ETH_Init+0x27c>)
  81374. ETH_InitStruct->ETH_VLANTagIdentifier);
  81375. /*-------------------------------- DMA Config ------------------------------*/
  81376. /*----------------------- ETHERNET DMAOMR Configuration --------------------*/
  81377. /* Get the ETHERNET DMAOMR value */
  81378. tmpreg = ETH->DMAOMR;
  81379. 8038bfa: 6999 ldr r1, [r3, #24]
  81380. /* Set the TTC bit according to ETH_TransmitThresholdControl value */
  81381. /* Set the FEF bit according to ETH_ForwardErrorFrames value */
  81382. /* Set the FUF bit according to ETH_ForwardUndersizedGoodFrames value */
  81383. /* Set the RTC bit according to ETH_ReceiveThresholdControl value */
  81384. /* Set the OSF bit according to ETH_SecondFrameOperate value */
  81385. tmpreg |= (uint32_t)(ETH_InitStruct->ETH_DropTCPIPChecksumErrorFrame |
  81386. 8038bfc: f8d4 0084 ldr.w r0, [r4, #132] ; 0x84
  81387. /*-------------------------------- DMA Config ------------------------------*/
  81388. /*----------------------- ETHERNET DMAOMR Configuration --------------------*/
  81389. /* Get the ETHERNET DMAOMR value */
  81390. tmpreg = ETH->DMAOMR;
  81391. /* Clear xx bits */
  81392. tmpreg &= DMAOMR_CLEAR_MASK;
  81393. 8038c00: 400a ands r2, r1
  81394. /* Set the TTC bit according to ETH_TransmitThresholdControl value */
  81395. /* Set the FEF bit according to ETH_ForwardErrorFrames value */
  81396. /* Set the FUF bit according to ETH_ForwardUndersizedGoodFrames value */
  81397. /* Set the RTC bit according to ETH_ReceiveThresholdControl value */
  81398. /* Set the OSF bit according to ETH_SecondFrameOperate value */
  81399. tmpreg |= (uint32_t)(ETH_InitStruct->ETH_DropTCPIPChecksumErrorFrame |
  81400. 8038c02: f8d4 1080 ldr.w r1, [r4, #128] ; 0x80
  81401. 8038c06: 4308 orrs r0, r1
  81402. ETH_InitStruct->ETH_ReceiveStoreForward |
  81403. 8038c08: f8d4 1088 ldr.w r1, [r4, #136] ; 0x88
  81404. 8038c0c: 4308 orrs r0, r1
  81405. ETH_InitStruct->ETH_FlushReceivedFrame |
  81406. 8038c0e: f8d4 108c ldr.w r1, [r4, #140] ; 0x8c
  81407. 8038c12: 4308 orrs r0, r1
  81408. ETH_InitStruct->ETH_TransmitStoreForward |
  81409. 8038c14: f8d4 1090 ldr.w r1, [r4, #144] ; 0x90
  81410. 8038c18: 4308 orrs r0, r1
  81411. ETH_InitStruct->ETH_TransmitThresholdControl |
  81412. 8038c1a: f8d4 1094 ldr.w r1, [r4, #148] ; 0x94
  81413. 8038c1e: 4308 orrs r0, r1
  81414. ETH_InitStruct->ETH_ForwardErrorFrames |
  81415. 8038c20: f8d4 1098 ldr.w r1, [r4, #152] ; 0x98
  81416. 8038c24: 4308 orrs r0, r1
  81417. ETH_InitStruct->ETH_ForwardUndersizedGoodFrames |
  81418. 8038c26: f8d4 109c ldr.w r1, [r4, #156] ; 0x9c
  81419. 8038c2a: 4308 orrs r0, r1
  81420. /* Set the TTC bit according to ETH_TransmitThresholdControl value */
  81421. /* Set the FEF bit according to ETH_ForwardErrorFrames value */
  81422. /* Set the FUF bit according to ETH_ForwardUndersizedGoodFrames value */
  81423. /* Set the RTC bit according to ETH_ReceiveThresholdControl value */
  81424. /* Set the OSF bit according to ETH_SecondFrameOperate value */
  81425. tmpreg |= (uint32_t)(ETH_InitStruct->ETH_DropTCPIPChecksumErrorFrame |
  81426. 8038c2c: f8d4 10a0 ldr.w r1, [r4, #160] ; 0xa0
  81427. 8038c30: 4301 orrs r1, r0
  81428. 8038c32: 430a orrs r2, r1
  81429. ETH_InitStruct->ETH_ForwardErrorFrames |
  81430. ETH_InitStruct->ETH_ForwardUndersizedGoodFrames |
  81431. ETH_InitStruct->ETH_ReceiveThresholdControl |
  81432. ETH_InitStruct->ETH_SecondFrameOperate);
  81433. /* Write to ETHERNET DMAOMR */
  81434. ETH->DMAOMR = (uint32_t)tmpreg;
  81435. 8038c34: 619a str r2, [r3, #24]
  81436. /* Set the FB bit according to ETH_FixedBurst value */
  81437. /* Set the RPBL and 4*PBL bits according to ETH_RxDMABurstLength value */
  81438. /* Set the PBL and 4*PBL bits according to ETH_TxDMABurstLength value */
  81439. /* Set the DSL bit according to ETH_DesciptorSkipLength value */
  81440. /* Set the PR and DA bits according to ETH_DMAArbitration value */
  81441. ETH->DMABMR = (uint32_t)(ETH_InitStruct->ETH_AddressAlignedBeats |
  81442. 8038c36: f8d4 20a8 ldr.w r2, [r4, #168] ; 0xa8
  81443. 8038c3a: f8d4 10a4 ldr.w r1, [r4, #164] ; 0xa4
  81444. 8038c3e: 4311 orrs r1, r2
  81445. ETH_InitStruct->ETH_FixedBurst |
  81446. ETH_InitStruct->ETH_RxDMABurstLength | /* !! if 4xPBL is selected for Tx or Rx it is applied for the other */
  81447. 8038c40: f8d4 20ac ldr.w r2, [r4, #172] ; 0xac
  81448. /* Set the RPBL and 4*PBL bits according to ETH_RxDMABurstLength value */
  81449. /* Set the PBL and 4*PBL bits according to ETH_TxDMABurstLength value */
  81450. /* Set the DSL bit according to ETH_DesciptorSkipLength value */
  81451. /* Set the PR and DA bits according to ETH_DMAArbitration value */
  81452. ETH->DMABMR = (uint32_t)(ETH_InitStruct->ETH_AddressAlignedBeats |
  81453. ETH_InitStruct->ETH_FixedBurst |
  81454. 8038c44: f441 0100 orr.w r1, r1, #8388608 ; 0x800000
  81455. ETH_InitStruct->ETH_RxDMABurstLength | /* !! if 4xPBL is selected for Tx or Rx it is applied for the other */
  81456. 8038c48: 4311 orrs r1, r2
  81457. ETH_InitStruct->ETH_TxDMABurstLength |
  81458. 8038c4a: f8d4 20b0 ldr.w r2, [r4, #176] ; 0xb0
  81459. 8038c4e: 4311 orrs r1, r2
  81460. (ETH_InitStruct->ETH_DescriptorSkipLength << 2) |
  81461. 8038c50: f8d4 20b8 ldr.w r2, [r4, #184] ; 0xb8
  81462. 8038c54: 430a orrs r2, r1
  81463. 8038c56: f8d4 10b4 ldr.w r1, [r4, #180] ; 0xb4
  81464. /* Set the FB bit according to ETH_FixedBurst value */
  81465. /* Set the RPBL and 4*PBL bits according to ETH_RxDMABurstLength value */
  81466. /* Set the PBL and 4*PBL bits according to ETH_TxDMABurstLength value */
  81467. /* Set the DSL bit according to ETH_DesciptorSkipLength value */
  81468. /* Set the PR and DA bits according to ETH_DMAArbitration value */
  81469. ETH->DMABMR = (uint32_t)(ETH_InitStruct->ETH_AddressAlignedBeats |
  81470. 8038c5a: ea42 0281 orr.w r2, r2, r1, lsl #2
  81471. 8038c5e: 601a str r2, [r3, #0]
  81472. ETH_InitStruct->ETH_DMAArbitration |
  81473. ETH_DMABMR_USP); /* Enable use of separate PBL for Rx and Tx */
  81474. #ifdef USE_ENHANCED_DMA_DESCRIPTORS
  81475. /* Enable the Enhanced DMA descriptors */
  81476. ETH->DMABMR |= ETH_DMABMR_EDE;
  81477. 8038c60: 681a ldr r2, [r3, #0]
  81478. 8038c62: f042 0280 orr.w r2, r2, #128 ; 0x80
  81479. 8038c66: 601a str r2, [r3, #0]
  81480. #endif /* USE_ENHANCED_DMA_DESCRIPTORS */
  81481. /* Return Ethernet configuration success */
  81482. return ETH_SUCCESS;
  81483. 8038c68: 2001 movs r0, #1
  81484. }
  81485. 8038c6a: b007 add sp, #28
  81486. 8038c6c: bdf0 pop {r4, r5, r6, r7, pc}
  81487. 8038c6e: bf00 nop
  81488. 8038c70: 40028000 .word 0x40028000
  81489. 8038c74: feced300 .word 0xfeced300
  81490. 8038c78: 00e4e1bf .word 0x00e4e1bf
  81491. 8038c7c: fde9f140 .word 0xfde9f140
  81492. 8038c80: 017d783f .word 0x017d783f
  81493. 8038c84: fc6c7900 .word 0xfc6c7900
  81494. 8038c88: 026259ff .word 0x026259ff
  81495. 8038c8c: fa0a1f00 .word 0xfa0a1f00
  81496. 8038c90: 02faf07f .word 0x02faf07f
  81497. 8038c94: 000fffff .word 0x000fffff
  81498. 8038c98: 0004fffe .word 0x0004fffe
  81499. 8038c9c: 0004ffff .word 0x0004ffff
  81500. 8038ca0: ff20810f .word 0xff20810f
  81501. 8038ca4: f8de3f23 .word 0xf8de3f23
  81502. 08038ca8 <_write>:
  81503. Write a character to a file. `libc' subroutines will use this system routine for output to all files, including stdout
  81504. Returns -1 on error or number of bytes sent
  81505. */
  81506. int _write(int file, char *ptr, int len) {
  81507. int n;
  81508. switch (file) {
  81509. 8038ca8: 2801 cmp r0, #1
  81510. /*
  81511. write
  81512. Write a character to a file. `libc' subroutines will use this system routine for output to all files, including stdout
  81513. Returns -1 on error or number of bytes sent
  81514. */
  81515. int _write(int file, char *ptr, int len) {
  81516. 8038caa: b530 push {r4, r5, lr}
  81517. int n;
  81518. switch (file) {
  81519. 8038cac: d00c beq.n 8038cc8 <_write+0x20>
  81520. 8038cae: 2802 cmp r0, #2
  81521. 8038cb0: d120 bne.n 8038cf4 <_write+0x4c>
  81522. 8038cb2: e019 b.n 8038ce8 <_write+0x40>
  81523. case STDOUT_FILENO: /*stdout*/
  81524. for (n = 0; n < len; n++) {
  81525. #if STDOUT_USART == 1
  81526. while ((USART1->SR & USART_FLAG_TC) == (uint16_t)RESET) {}
  81527. 8038cb4: 8805 ldrh r5, [r0, #0]
  81528. 8038cb6: f005 0540 and.w r5, r5, #64 ; 0x40
  81529. 8038cba: b2ad uxth r5, r5
  81530. 8038cbc: 2d00 cmp r5, #0
  81531. 8038cbe: d0f9 beq.n 8038cb4 <_write+0xc>
  81532. USART1->DR = (*ptr++ & (uint16_t)0x01FF);
  81533. 8038cc0: 5ccd ldrb r5, [r1, r3]
  81534. */
  81535. int _write(int file, char *ptr, int len) {
  81536. int n;
  81537. switch (file) {
  81538. case STDOUT_FILENO: /*stdout*/
  81539. for (n = 0; n < len; n++) {
  81540. 8038cc2: 3301 adds r3, #1
  81541. #if STDOUT_USART == 1
  81542. while ((USART1->SR & USART_FLAG_TC) == (uint16_t)RESET) {}
  81543. USART1->DR = (*ptr++ & (uint16_t)0x01FF);
  81544. 8038cc4: 80a5 strh r5, [r4, #4]
  81545. 8038cc6: e002 b.n 8038cce <_write+0x26>
  81546. int n;
  81547. switch (file) {
  81548. case STDOUT_FILENO: /*stdout*/
  81549. for (n = 0; n < len; n++) {
  81550. #if STDOUT_USART == 1
  81551. while ((USART1->SR & USART_FLAG_TC) == (uint16_t)RESET) {}
  81552. 8038cc8: 480e ldr r0, [pc, #56] ; (8038d04 <_write+0x5c>)
  81553. Write a character to a file. `libc' subroutines will use this system routine for output to all files, including stdout
  81554. Returns -1 on error or number of bytes sent
  81555. */
  81556. int _write(int file, char *ptr, int len) {
  81557. int n;
  81558. switch (file) {
  81559. 8038cca: 2300 movs r3, #0
  81560. case STDOUT_FILENO: /*stdout*/
  81561. for (n = 0; n < len; n++) {
  81562. #if STDOUT_USART == 1
  81563. while ((USART1->SR & USART_FLAG_TC) == (uint16_t)RESET) {}
  81564. 8038ccc: 4604 mov r4, r0
  81565. */
  81566. int _write(int file, char *ptr, int len) {
  81567. int n;
  81568. switch (file) {
  81569. case STDOUT_FILENO: /*stdout*/
  81570. for (n = 0; n < len; n++) {
  81571. 8038cce: 4293 cmp r3, r2
  81572. 8038cd0: dbf0 blt.n 8038cb4 <_write+0xc>
  81573. 8038cd2: e014 b.n 8038cfe <_write+0x56>
  81574. }
  81575. break;
  81576. case STDERR_FILENO: /* stderr */
  81577. for (n = 0; n < len; n++) {
  81578. #if STDERR_USART == 1
  81579. while ((USART1->SR & USART_FLAG_TC) == (uint16_t)RESET) {}
  81580. 8038cd4: 8805 ldrh r5, [r0, #0]
  81581. 8038cd6: f005 0540 and.w r5, r5, #64 ; 0x40
  81582. 8038cda: b2ad uxth r5, r5
  81583. 8038cdc: 2d00 cmp r5, #0
  81584. 8038cde: d0f9 beq.n 8038cd4 <_write+0x2c>
  81585. USART1->DR = (*ptr++ & (uint16_t)0x01FF);
  81586. 8038ce0: 5ccd ldrb r5, [r1, r3]
  81587. ITM_SendChar(*ptr++ & (uint16_t)0x00FF);
  81588. #endif
  81589. }
  81590. break;
  81591. case STDERR_FILENO: /* stderr */
  81592. for (n = 0; n < len; n++) {
  81593. 8038ce2: 3301 adds r3, #1
  81594. #if STDERR_USART == 1
  81595. while ((USART1->SR & USART_FLAG_TC) == (uint16_t)RESET) {}
  81596. USART1->DR = (*ptr++ & (uint16_t)0x01FF);
  81597. 8038ce4: 80a5 strh r5, [r4, #4]
  81598. 8038ce6: e002 b.n 8038cee <_write+0x46>
  81599. }
  81600. break;
  81601. case STDERR_FILENO: /* stderr */
  81602. for (n = 0; n < len; n++) {
  81603. #if STDERR_USART == 1
  81604. while ((USART1->SR & USART_FLAG_TC) == (uint16_t)RESET) {}
  81605. 8038ce8: 4806 ldr r0, [pc, #24] ; (8038d04 <_write+0x5c>)
  81606. Write a character to a file. `libc' subroutines will use this system routine for output to all files, including stdout
  81607. Returns -1 on error or number of bytes sent
  81608. */
  81609. int _write(int file, char *ptr, int len) {
  81610. int n;
  81611. switch (file) {
  81612. 8038cea: 2300 movs r3, #0
  81613. }
  81614. break;
  81615. case STDERR_FILENO: /* stderr */
  81616. for (n = 0; n < len; n++) {
  81617. #if STDERR_USART == 1
  81618. while ((USART1->SR & USART_FLAG_TC) == (uint16_t)RESET) {}
  81619. 8038cec: 4604 mov r4, r0
  81620. ITM_SendChar(*ptr++ & (uint16_t)0x00FF);
  81621. #endif
  81622. }
  81623. break;
  81624. case STDERR_FILENO: /* stderr */
  81625. for (n = 0; n < len; n++) {
  81626. 8038cee: 4293 cmp r3, r2
  81627. 8038cf0: dbf0 blt.n 8038cd4 <_write+0x2c>
  81628. 8038cf2: e004 b.n 8038cfe <_write+0x56>
  81629. ITM_SendChar(*ptr++ & (uint16_t)0x00FF);
  81630. #endif
  81631. }
  81632. break;
  81633. default:
  81634. errno = EBADF;
  81635. 8038cf4: 4b04 ldr r3, [pc, #16] ; (8038d08 <_write+0x60>)
  81636. 8038cf6: 2209 movs r2, #9
  81637. 8038cf8: 601a str r2, [r3, #0]
  81638. return -1;
  81639. 8038cfa: f04f 32ff mov.w r2, #4294967295
  81640. }
  81641. return len;
  81642. }
  81643. 8038cfe: 4610 mov r0, r2
  81644. 8038d00: bd30 pop {r4, r5, pc}
  81645. 8038d02: bf00 nop
  81646. 8038d04: 40011000 .word 0x40011000
  81647. 8038d08: 200140ac .word 0x200140ac
  81648. 08038d0c <_sbrk>:
  81649. /*
  81650. sbrk
  81651. Increase program data space.
  81652. Malloc and related functions depend on this
  81653. */
  81654. caddr_t _sbrk(int incr) {
  81655. 8038d0c: b508 push {r3, lr}
  81656. extern char _ebss; // Defined by the linker
  81657. extern char __bss_end__;
  81658. static char *heap_end;
  81659. char *prev_heap_end;
  81660. if (heap_end == 0) {
  81661. 8038d0e: 4b0d ldr r3, [pc, #52] ; (8038d44 <_sbrk+0x38>)
  81662. 8038d10: 681a ldr r2, [r3, #0]
  81663. 8038d12: b90a cbnz r2, 8038d18 <_sbrk+0xc>
  81664. //heap_end = &_ebss;
  81665. heap_end = &__bss_end__;
  81666. 8038d14: 4a0c ldr r2, [pc, #48] ; (8038d48 <_sbrk+0x3c>)
  81667. 8038d16: 601a str r2, [r3, #0]
  81668. }
  81669. prev_heap_end = heap_end;
  81670. 8038d18: 681b ldr r3, [r3, #0]
  81671. */
  81672. __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_MSP(void)
  81673. {
  81674. register uint32_t result;
  81675. __ASM volatile ("MRS %0, msp\n" : "=r" (result) );
  81676. 8038d1a: f3ef 8208 mrs r2, MSP
  81677. char * stack = (char*) __get_MSP();
  81678. if (heap_end + incr > stack)
  81679. 8038d1e: 1818 adds r0, r3, r0
  81680. 8038d20: 4290 cmp r0, r2
  81681. 8038d22: d90a bls.n 8038d3a <_sbrk+0x2e>
  81682. {
  81683. _write (STDERR_FILENO, "Heap and stack collision\n", 25);
  81684. 8038d24: 2219 movs r2, #25
  81685. 8038d26: 2002 movs r0, #2
  81686. 8038d28: 4908 ldr r1, [pc, #32] ; (8038d4c <_sbrk+0x40>)
  81687. 8038d2a: f7ff ffbd bl 8038ca8 <_write>
  81688. errno = ENOMEM;
  81689. 8038d2e: 4b08 ldr r3, [pc, #32] ; (8038d50 <_sbrk+0x44>)
  81690. 8038d30: 220c movs r2, #12
  81691. 8038d32: 601a str r2, [r3, #0]
  81692. return (caddr_t) -1;
  81693. 8038d34: f04f 33ff mov.w r3, #4294967295
  81694. 8038d38: e001 b.n 8038d3e <_sbrk+0x32>
  81695. //abort ();
  81696. }
  81697. heap_end += incr;
  81698. 8038d3a: 4a02 ldr r2, [pc, #8] ; (8038d44 <_sbrk+0x38>)
  81699. 8038d3c: 6010 str r0, [r2, #0]
  81700. return (caddr_t) prev_heap_end;
  81701. }
  81702. 8038d3e: 4618 mov r0, r3
  81703. 8038d40: bd08 pop {r3, pc}
  81704. 8038d42: bf00 nop
  81705. 8038d44: 2000c858 .word 0x2000c858
  81706. 8038d48: 200141b0 .word 0x200141b0
  81707. 8038d4c: 08045253 .word 0x08045253
  81708. 8038d50: 200140ac .word 0x200140ac
  81709. 08038d54 <Reset_Handler>:
  81710. .weak Reset_Handler
  81711. .type Reset_Handler, %function
  81712. Reset_Handler:
  81713. /* Copy the data segment initializers from flash to SRAM */
  81714. movs r1, #0
  81715. 8038d54: 2100 movs r1, #0
  81716. b LoopCopyDataInit
  81717. 8038d56: f000 b804 b.w 8038d62 <LoopCopyDataInit>
  81718. 08038d5a <CopyDataInit>:
  81719. CopyDataInit:
  81720. ldr r3, =_sidata
  81721. 8038d5a: 4b0d ldr r3, [pc, #52] ; (8038d90 <LoopFillZerobss+0x16>)
  81722. ldr r3, [r3, r1]
  81723. 8038d5c: 585b ldr r3, [r3, r1]
  81724. str r3, [r0, r1]
  81725. 8038d5e: 5043 str r3, [r0, r1]
  81726. adds r1, r1, #4
  81727. 8038d60: 3104 adds r1, #4
  81728. 08038d62 <LoopCopyDataInit>:
  81729. LoopCopyDataInit:
  81730. ldr r0, =_sdata
  81731. 8038d62: 480c ldr r0, [pc, #48] ; (8038d94 <LoopFillZerobss+0x1a>)
  81732. ldr r3, =_edata
  81733. 8038d64: 4b0c ldr r3, [pc, #48] ; (8038d98 <LoopFillZerobss+0x1e>)
  81734. adds r2, r0, r1
  81735. 8038d66: 1842 adds r2, r0, r1
  81736. cmp r2, r3
  81737. 8038d68: 429a cmp r2, r3
  81738. bcc CopyDataInit
  81739. 8038d6a: f4ff aff6 bcc.w 8038d5a <CopyDataInit>
  81740. ldr r2, =_sbss
  81741. 8038d6e: 4a0b ldr r2, [pc, #44] ; (8038d9c <LoopFillZerobss+0x22>)
  81742. b LoopFillZerobss
  81743. 8038d70: f000 b803 b.w 8038d7a <LoopFillZerobss>
  81744. 08038d74 <FillZerobss>:
  81745. /* Zero fill the bss segment. */
  81746. FillZerobss:
  81747. movs r3, #0
  81748. 8038d74: 2300 movs r3, #0
  81749. str r3, [r2], #4
  81750. 8038d76: f842 3b04 str.w r3, [r2], #4
  81751. 08038d7a <LoopFillZerobss>:
  81752. LoopFillZerobss:
  81753. ldr r3, = _ebss
  81754. 8038d7a: 4b09 ldr r3, [pc, #36] ; (8038da0 <LoopFillZerobss+0x26>)
  81755. cmp r2, r3
  81756. 8038d7c: 429a cmp r2, r3
  81757. bcc FillZerobss
  81758. 8038d7e: f4ff aff9 bcc.w 8038d74 <FillZerobss>
  81759. /* Call the clock system intitialization function.*/
  81760. bl SystemInit
  81761. 8038d82: f7ed f9dd bl 8026140 <SystemInit>
  81762. /* Call static constructors */
  81763. bl __libc_init_array
  81764. 8038d86: f7e8 ff2f bl 8021be8 <__libc_init_array>
  81765. /* Call the application's entry point.*/
  81766. bl main
  81767. 8038d8a: f7ee fb35 bl 80273f8 <main>
  81768. bx lr
  81769. 8038d8e: 4770 bx lr
  81770. /* Copy the data segment initializers from flash to SRAM */
  81771. movs r1, #0
  81772. b LoopCopyDataInit
  81773. CopyDataInit:
  81774. ldr r3, =_sidata
  81775. 8038d90: 080452dc .word 0x080452dc
  81776. ldr r3, [r3, r1]
  81777. str r3, [r0, r1]
  81778. adds r1, r1, #4
  81779. LoopCopyDataInit:
  81780. ldr r0, =_sdata
  81781. 8038d94: 20000000 .word 0x20000000
  81782. ldr r3, =_edata
  81783. 8038d98: 20000ac4 .word 0x20000ac4
  81784. adds r2, r0, r1
  81785. cmp r2, r3
  81786. bcc CopyDataInit
  81787. ldr r2, =_sbss
  81788. 8038d9c: 20000ac4 .word 0x20000ac4
  81789. FillZerobss:
  81790. movs r3, #0
  81791. str r3, [r2], #4
  81792. LoopFillZerobss:
  81793. ldr r3, = _ebss
  81794. 8038da0: 200141b0 .word 0x200141b0
  81795. 08038da4 <ADC_IRQHandler>:
  81796. * @retval None
  81797. */
  81798. .section .text.Default_Handler,"ax",%progbits
  81799. Default_Handler:
  81800. Infinite_Loop:
  81801. b Infinite_Loop
  81802. 8038da4: f7ff bffe b.w 8038da4 <ADC_IRQHandler>
  81803. 08038da8 <_ctype_>:
  81804. 8038da8: 2000 2020 2020 2020 2020 2828 2828 2028 . (((((
  81805. 8038db8: 2020 2020 2020 2020 2020 2020 2020 2020
  81806. 8038dc8: 8820 1010 1010 1010 1010 1010 1010 1010 ...............
  81807. 8038dd8: 0410 0404 0404 0404 0404 1004 1010 1010 ................
  81808. 8038de8: 1010 4141 4141 4141 0101 0101 0101 0101 ..AAAAAA........
  81809. 8038df8: 0101 0101 0101 0101 0101 0101 1010 1010 ................
  81810. 8038e08: 1010 4242 4242 4242 0202 0202 0202 0202 ..BBBBBB........
  81811. 8038e18: 0202 0202 0202 0202 0202 0202 1010 1010 ................
  81812. 8038e28: 0020 0000 0000 0000 0000 0000 0000 0000 ...............
  81813. 8038e38: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  81814. 8038e48: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  81815. 8038e58: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  81816. 8038e68: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  81817. 8038e78: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  81818. 8038e88: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  81819. 8038e98: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  81820. 8038ea8: 0000 0000 0000 0000 ........
  81821. 08038eb0 <tinytens>:
  81822. 8038eb0: 89bc 97d8 d2b2 3c9c a733 d5a8 f623 3949 .......<3...#.I9
  81823. 8038ec0: a73d 44f4 0ffd 32a5 979d cf8c ba08 255b =..D...2......[%
  81824. 8038ed0: 6f43 64ac 0628 0e18 Co.d(...
  81825. 08038ed8 <p05.5261>:
  81826. 8038ed8: 0005 0000 0019 0000 007d 0000 0000 0000 ........}.......
  81827. 08038ee8 <__mprec_tens>:
  81828. 8038ee8: 0000 0000 0000 3ff0 0000 0000 0000 4024 .......?......$@
  81829. 8038ef8: 0000 0000 0000 4059 0000 0000 4000 408f ......Y@.....@.@
  81830. 8038f08: 0000 0000 8800 40c3 0000 0000 6a00 40f8 .......@.....j.@
  81831. 8038f18: 0000 0000 8480 412e 0000 0000 12d0 4163 .......A......cA
  81832. 8038f28: 0000 0000 d784 4197 0000 0000 cd65 41cd .......A....e..A
  81833. 8038f38: 0000 2000 a05f 4202 0000 e800 4876 4237 ... _..B....vH7B
  81834. 8038f48: 0000 a200 1a94 426d 0000 e540 309c 42a2 ......mB..@..0.B
  81835. 8038f58: 0000 1e90 bcc4 42d6 0000 2634 6bf5 430c .......B..4&.k.C
  81836. 8038f68: 8000 37e0 c379 4341 a000 85d8 3457 4376 ...7y.AC....W4vC
  81837. 8038f78: c800 674e c16d 43ab 3d00 6091 58e4 43e1 ..Ngm..C.=.`.X.C
  81838. 8038f88: 8c40 78b5 af1d 4415 ef50 d6e2 1ae4 444b @..x...DP.....KD
  81839. 8038f98: d592 064d f0cf 4480 4af6 c7e1 2d02 44b5 ..M....D.J...-.D
  81840. 8038fa8: 9db4 79d9 7843 44ea ...yCx.D
  81841. 08038fb0 <__mprec_tinytens>:
  81842. 8038fb0: 89bc 97d8 d2b2 3c9c a733 d5a8 f623 3949 .......<3...#.I9
  81843. 8038fc0: a73d 44f4 0ffd 32a5 979d cf8c ba08 255b =..D...2......[%
  81844. 8038fd0: 6f43 64ac 0628 0ac8 Co.d(...
  81845. 08038fd8 <__mprec_bigtens>:
  81846. 8038fd8: 8000 37e0 c379 4341 6e17 b505 b8b5 4693 ...7y.AC.n.....F
  81847. 8038fe8: f9f5 e93f 4f03 4d38 1d32 f930 7748 5a82 ..?..O8M2.0.Hw.Z
  81848. 8038ff8: bf3c 7f73 4fdd 7515 a1d0 b1d0 80d1 bed0 <.s..O.u........
  81849. 8039008: 81d1 d020 20ba b7d0 b0d0 b2d0 bed0 b4d0 .. .. ..........
  81850. 8039018: 81d1 bad0 bed0 bcd0 83d1 4c00 4445 425f ...........LED_B
  81851. 8039028: 696c 6b6e 4200 7475 6f74 736e 5500 5350 link.Buttons.UPS
  81852. 8039038: 4d5f 6e6f 7469 726f 7300 6d6e 5370 7379 _Monitor.snmpSys
  81853. 8039048: 7055 6954 656d 7300 6d6e 5470 6172 5470 UpTime.snmpTrapT
  81854. 8039058: 7365 0074 6e73 7074 6e4f 6563 6953 686e est.sntpOnceSinh
  81855. 8039068: 6f72 7300 746e 5070 7265 6f69 6964 5363 ro.sntpPeriodicS
  81856. 8039078: 6e69 7268 006f 6e49 7469 6154 6b73 4800 inhro.InitTask.H
  81857. 8039088: 7261 4664 7561 746c 0a3a 000d 0d0a 6552 ardFault:.....Re
  81858. 8039098: 6967 7473 7265 3a73 0d0a 5300 2050 2020 gisters:...SP
  81859. 80390a8: 2020 2020 2020 3020 2578 3830 786c 0d0a 0x%08lx..
  81860. 80390b8: 5200 2030 2020 2020 2020 2020 3020 2578 .R0 0x%
  81861. 80390c8: 3830 786c 0d0a 5200 2031 2020 2020 2020 08lx...R1
  81862. 80390d8: 2020 3020 2578 3830 786c 0d0a 5200 2032 0x%08lx...R2
  81863. 80390e8: 2020 2020 2020 2020 3020 2578 3830 786c 0x%08lx
  81864. 80390f8: 0d0a 5200 2033 2020 2020 2020 2020 3020 ...R3 0
  81865. 8039108: 2578 3830 786c 0d0a 5200 3231 2020 2020 x%08lx...R12
  81866. 8039118: 2020 2020 3020 2578 3830 786c 0d0a 4c00 0x%08lx...L
  81867. 8039128: 2052 2020 2020 2020 2020 3020 2578 3830 R 0x%08
  81868. 8039138: 786c 0d0a 5000 2043 2020 2020 2020 2020 lx...PC
  81869. 8039148: 3020 2578 3830 786c 0d0a 5000 5253 2020 0x%08lx...PSR
  81870. 8039158: 2020 2020 2020 3020 2578 3830 786c 0d0a 0x%08lx..
  81871. 8039168: 2500 2e30 6631 2500 0064 3025 6934 252d .%0.1f.%d.%04i-%
  81872. 8039178: 3230 2d69 3025 6932 2500 2064 b4d0 bdd0 02i-%02i.%d ....
  81873. 8039188: 202e 6425 d120 2e87 2520 2064 bcd0 b8d0 . %d ... %d ....
  81874. 8039198: bdd0 002e 2e31 0030 6146 736c 0065 7274 ....1.0.False.tr
  81875. 80391a8: 6575 6600 6c61 6573 6f00 006e 302d 2d31 ue.false.on.-01-
  81876. 80391b8: 3025 6932 253a 3230 0069 3025 6932 252d %02i:%02i.%02i-%
  81877. 80391c8: 3230 2d69 3025 6932 302d 2d31 3100 3239 02i-%02i-01-.192
  81878. 80391d8: 312e 3836 312e 382e 3100 3239 312e 3836 .168.1.8.192.168
  81879. 80391e8: 312e 312e 3200 3535 322e 3535 322e 3535 .1.1.255.255.255
  81880. 80391f8: 302e 3100 3239 312e 3836 312e 322e 7000 .0.192.168.1.2.p
  81881. 8039208: 6275 696c 0063 5442 3736 3230 3000 302e ublic.BT6702.0.0
  81882. 8039218: 302e 302e 3000 2e39 3730 322e 3130 0037 .0.0.09.07.2017.
  81883. 8039228: 4345 342d 2d43 4434 302d 2d30 3030 302d EC-4C-4D-00-00-0
  81884. 8039238: 0041 3037 3032 3030 0030 6461 696d 006e A.7020000.admin.
  81885. 8039248: 3231 3433 0035 7375 7265 3100 3332 0034 12345.user.1234.
  81886. 8039258: 3838 312e 3734 322e 3435 322e 3533 6e00 88.147.254.235.n
  81887. 8039268: 6e6f 0065 a3d0 81d1 bfd0 b5d0 88d1 bdd0 one.............
  81888. 8039278: bed0 5400 4f32 004b 6f52 6574 006b 3030 ...T2OK.Rotek.00
  81889. 8039288: 302e 2e30 3030 d000 d090 d0b4 d0bc d0b8 .00.00..........
  81890. 8039298: d0bd d1b8 d181 d182 d080 d1b0 d082 d1be ................
  81891. 80392a8: 0080 7325 2530 0d66 2500 2e73 6625 000d ..%s0%f..%s.%f..
  81892. 80392b8: 7325 6625 000d 7325 252e 2564 2573 0d64 %s%f..%s.%d%s%d.
  81893. 80392c8: 2000 5200 4d54 2050 4949 4100 4b43 4e00 . .RTMP II.ACK.N
  81894. 80392d8: 4b43 7200 7165 6575 7473 745f 7361 006b CK.request_task.
  81895. 80392e8: 3151 000d 4c54 000d 0054 0d51 5300 5200 Q1..TL..T.Q..S.R
  81896. 80392f8: 4300 000d 5443 000d 0d49 4600 000d 3251 .C..CT..I..F..Q2
  81897. 8039308: 000d 90d0 b2d0 b0d0 80d1 b8d0 8fd1 d000 ................
  81898. 8039318: d09d d1be d080 d0bc 00b0 97d0 b0d0 bcd0 ................
  81899. 8039328: bad0 bdd0 83d1 82d1 bed0 d000 d0a0 d0b0 ................
  81900. 8039338: d0b7 d0be d0bc d0ba d1bd d183 d082 00be ................
  81901. 8039348: 6f6c 5f67 6174 6b73 2500 3230 2e69 3025 log_task.%02i.%0
  81902. 8039358: 6932 252e 3230 2069 3025 6932 253a 3230 2i.%02i %02i:%02
  81903. 8039368: 3a69 3025 6932 2200 002c 003b 9fd0 b5d0 i:%02i.",.;.....
  81904. 8039378: 80d1 b5d0 b7d0 b0d0 b3d0 80d1 83d1 b7d0 ................
  81905. 8039388: bad0 b0d0 d020 d0ba d0be d1bd d182 d080 .... ...........
  81906. 8039398: d0be d0bb d0bb d1b5 d080 00b0 a1d0 b1d0 ................
  81907. 80393a8: 80d1 bed0 81d1 d020 d0bd d1b0 d181 d182 ...... .........
  81908. 80393b8: d080 d0be d0b5 00ba 9ed0 b1d0 bdd0 bed0 ................
  81909. 80393c8: b2d0 bbd0 b5d0 bdd0 b8d0 b5d0 d020 d09f ............ ...
  81910. 80393d8: 009e a1d0 bcd0 b5d0 bdd0 b0d0 d020 d0bf ............ ...
  81911. 80393e8: d1b0 d080 d0be d1bb 008f a1d0 bed0 85d1 ................
  81912. 80393f8: 80d1 b0d0 bdd0 b5d0 bdd0 b8d0 b5d0 d020 .............. .
  81913. 8039408: d0bd d1b0 d181 d182 d080 d0be d0b5 00ba ................
  81914. 8039418: 90d0 b2d0 82d1 bed0 80d1 b8d0 b7d0 b0d0 ................
  81915. 8039428: 86d1 b8d0 8fd1 d000 d0a2 d1b5 d181 2082 ...............
  81916. 8039438: 98d0 91d0 9fd0 d000 d19e d082 d0ba 2ebb ................
  81917. 8039448: d020 d0bd d0b0 d1b3 d180 d083 d0b7 d0ba ...............
  81918. 8039458: 20b8 98d0 91d0 9fd0 d000 d090 d0b2 d1b0 . ..............
  81919. 8039468: d080 d1b8 208f b4d0 b8d0 81d1 bad0 80d1 ..... ..........
  81920. 8039478: 202e b2d0 85d1 bed0 b4d0 b0d0 3120 d000 . .......... 1..
  81921. 8039488: d0a1 d1be d181 d082 d1be d08f d0bd d0b8 ................
  81922. 8039498: 20b5 b2d0 8bd1 85d1 bed0 b4d0 b0d0 3120 . ............ 1
  81923. 80394a8: d000 d0a1 d1be d181 d082 d1be d08f d0bd ................
  81924. 80394b8: d0b8 20b5 b2d0 8bd1 85d1 bed0 b4d0 b0d0 ... ............
  81925. 80394c8: 3220 d000 d090 d0b2 d1b0 d080 d1b8 208f 2.............
  81926. 80394d8: 82d1 b5d0 bcd0 bfd0 b5d0 80d1 b0d0 82d1 ................
  81927. 80394e8: 83d1 80d1 8bd1 d000 d090 d0b2 d1b0 d080 ................
  81928. 80394f8: d1b8 208f b2d0 85d1 202e bdd0 b0d0 bfd0 ... ..... ......
  81929. 8039508: 80d1 8fd1 b6d0 b5d0 bdd0 b8d0 8fd1 d000 ................
  81930. 8039518: d09d d0b8 d0b7 d0ba d0b8 20b9 b7d0 b0d0 ........... ....
  81931. 8039528: 80d1 8fd1 b4d0 d020 d090 d09a 0091 90d0 ...... .........
  81932. 8039538: b2d0 b0d0 80d1 b8d0 8fd1 d020 d0bd d0b0 .......... .....
  81933. 8039548: d1b3 d180 d083 d0b7 d0ba 00b8 90d0 b2d0 ................
  81934. 8039558: b0d0 80d1 b8d0 8fd1 d120 d081 d1b2 d08f ........ .......
  81935. 8039568: d0b7 20b8 81d1 d020 d098 d091 009f 90d0 ... .. .........
  81936. 8039578: b2d0 b0d0 80d1 b8d0 8fd1 d020 d1be d082 .......... .....
  81937. 8039588: d0ba d1bb d18e d087 d0b5 d0bd d1b8 208f ...............
  81938. 8039598: 90d0 9ad0 91d0 7200 6e69 6667 5f73 7061 .......ringfs_ap
  81939. 80395a8: 6570 646e 203a 6f63 7272 7075 6574 2064 pend: corrupted
  81940. 80395b8: 6966 656c 7973 7473 6d65 0a0d 5400 726d filesystem...Tmr
  81941. 80395c8: 5320 6376 4900 4c44 0045 2509 0963 7525 Svc.IDLE..%c.%u
  81942. 80395d8: 2509 0975 7525 0a0d 2f00 .%u.%u...
  81943. 080395e1 <data__rotek_png>:
  81944. 80395e1: 722f 746f 6b65 702e 676e 0000 5448 5054 /rotek.png..HTTP
  81945. 80395f1: 312f 312e 3220 3030 4f20 0d4b 530a 7265 /1.1 200 OK..Ser
  81946. 8039601: 6576 3a72 6c20 4977 2f50 2e31 2e33 2031 ver: lwIP/1.3.1
  81947. 8039611: 6828 7474 3a70 2f2f 6173 6176 6e6e 6861 (http://savannah
  81948. 8039621: 6e2e 6e6f 6e67 2e75 726f 2f67 7270 6a6f .nongnu.org/proj
  81949. 8039631: 6365 7374 6c2f 6977 2970 0a0d 6f43 746e ects/lwip)..Cont
  81950. 8039641: 6e65 2d74 654c 676e 6874 203a 3935 3935 ent-Length: 5959
  81951. 8039651: 0a0d 6f43 6e6e 6365 6974 6e6f 203a 6c43 ..Connection: Cl
  81952. 8039661: 736f 0d65 430a 6e6f 6574 746e 742d 7079 ose..Content-typ
  81953. 8039671: 3a65 6920 616d 6567 702f 676e 0a0d 6143 e: image/png..Ca
  81954. 8039681: 6863 2d65 6f43 746e 6f72 3a6c 7020 6972 che-Control: pri
  81955. 8039691: 6176 6574 202c 616d 2d78 6761 3d65 3638 vate, max-age=86
  81956. 80396a1: 3034 0d30 0d0a 890a 4e50 0d47 1a0a 000a 400.....PNG.....
  81957. 80396b1: 0000 490d 4448 0052 0100 0057 0000 08ae ...IHDR...W.....
  81958. 80396c1: 0006 0000 db82 7d4e 0000 0e17 4449 5441 ......N}....IDAT
  81959. 80396d1: da78 9ded ac7d 672c c059 a1cf 7a80 3285 x...}.,gY....z.2
  81960. 80396e1: 4b45 1014 4db6 a62d ae0a b68a 52d8 45c7 EK...M-......R.E
  81961. 80396f1: 4131 1b2d 1045 0b7a 7a53 bc69 6060 634d 1A-.E.z.Szi.``Mc
  81962. 8039701: d894 c326 6c55 d2ac c6c5 285e 2c91 951f ..&.Ul....^(.,..
  81963. 8039711: 4a92 885d 4ad5 dd02 6a3f 9352 1ba2 36ac .J]..J..?jR....6
  81964. 8039721: a246 011b 6d69 e76b 72d2 71fb 7729 df7d F...imk..r.q)w}.
  81965. 8039731: 7793 9c75 cece 9fbc b333 7e7b fc7f 6f72 .wu.....3.{~..ro
  81966. 8039741: 39ce fb3b bf39 e67d 9e79 79f7 9677 e5cb .9;.9.}.y..yw...
  81967. 8039751: 000e f800 1785 0001 b900 0002 5720 0000 ............ W..
  81968. 8039761: 0ae4 0000 15c8 0000 02b9 2000 0057 4000 ........... W..@
  81969. 8039771: 00ae c800 0015 b900 0002 7200 0005 ae40 ...........r..@.
  81970. 8039781: 0000 15c8 0000 2b90 0000 0572 4000 00ae .......+..r..@..
  81971. 8039791: 8000 015c 9000 002b 7200 0005 e400 000a ..\...+..r......
  81972. 80397a1: 5c80 0001 2b90 0000 5720 0000 0ae4 8000 .\...+.. W......
  81973. 80397b1: 015c 0000 02b9 2000 0057 e400 000a c800 \...... W.......
  81974. 80397c1: 0015 b900 0002 5720 0000 eae4 c19f 5f6b ...... W......k_
  81975. 80397d1: 96b7 8fdd bede 440d 3882 9a47 ff23 def3 .......D.8G.#...
  81976. 80397e1: 3c96 d6df ed38 377d 7e56 009e c824 3375 .<..8.}7V~..$.u3
  81977. 80397f1: dae5 8c17 1304 5cc1 b4b0 de40 aa6e 138e .......\..@.n...
  81978. 8039801: 4d23 0ae4 75c8 ca3f 4655 89a5 6192 2966 #M...u?.UF...af)
  81979. 8039811: 3ad3 7532 44fc 1fdd 4522 80ae b75c ae56 .:2u.D.."E..\.V.
  81980. 8039821: 8ab1 974e 202d 3b45 a644 15c8 eb90 c936 ..N.- E;D.....6.
  81981. 8039831: 4655 8b8f a496 645a 3441 5c8b b901 ba6e UF....ZdA4.\..n.
  81982. 8039841: bb5c d524 b4b2 08c1 22b9 4057 9bae d724 \.$......"W@..$.
  81983. 8039851: a1d8 5530 2cc5 2450 231b e457 c801 cbb5 ..0U.,P$.#W.....
  81984. 8039861: 9572 da97 0763 cdd1 edd5 1557 48ff 5db3 r...c.....W..H.]
  81985. 8039871: 512b 9bb7 e63b 2364 0ae4 5c80 26bb bed7 +Q..;.d#...\.&..
  81986. 8039881: 0a45 5320 ae05 47a1 45b1 78ea 8b13 844e E. S...G.E.x..N.
  81987. 8039891: 3f6c bd16 2b90 d720 caee 6475 7971 54df l?...+ ...udqy.T
  81988. 80398a1: 2951 48b1 8c27 2b91 7200 5b6d 13ae a943 Q).H'..+.rm[..C.
  81989. 80398b1: 95b6 ecdf 3c59 08d6 02b9 d720 e5a6 191a ....Y<.... .....
  81990. 80398c1: 38e4 1d67 1a2a 0cf5 d922 7ef9 2c10 0572 .8g.*..."..~.,r.
  81991. 80398d1: dae4 b91d 8aea b5d5 a9dd 9857 1023 9c7b ..........W.#.{.
  81992. 80398e1: 302b ccd4 cec9 7db7 017e 0572 dae4 b90d +0.....}~.r.....
  81993. 80398f1: 8aea 6675 a521 caa1 ce77 722c 63b8 c28b ..uf!...w.,r.c..
  81994. 8039901: a458 04ba 75f6 8b04 015c b6b9 572f b15d X....u..\.../W].
  81995. 8039911: 86a6 9d42 faee ea5f 189a bd16 adf6 9160 ..B..._.......`.
  81996. 8039921: 202b 4d57 06b9 ec14 53d4 532b d2a4 a105 + WM.....S+S....
  81997. 8039931: 6f57 4a65 3af4 ec52 a46b e609 15c8 2b90 WoeJ.:R.k......+
  81998. 8039941: f572 58cd 6443 8efd 892e 34cd 69a3 c11d r..XCd.....4.i..
  81999. 8039951: 904e 202b e457 8bea 07a1 f6b1 2d03 f55f N.+ W........-_.
  82000. 8039961: d4bd 4755 09b0 0572 8ae4 7d5c 59e4 4733 ..UG..r...\}.Y3G
  82001. 8039971: 8eb1 bb76 b435 7525 6c14 4db6 041d 15c8 ..v.5.%u.l.M....
  82002. 8039981: ab90 5c81 0a3d 2eb6 1acf 88d7 6279 9059 ...\=.......ybY.
  82003. 8039991: 6b4a 0be6 e6ac 8c0a 872c d76e 122d 13a8 Jk......,.n.-...
  82004. 80399a1: 0cec 02b9 4572 a1ae 01d2 4f23 0c8b 4bf2 ....rE....#O...K
  82005. 80399b1: 5d62 af1f e749 5d41 4007 f0e2 91fc 202b b]..I.A].@....+
  82006. 80399c1: e457 56ba 8b8e e89a 87d2 2758 2e01 4db1 W..V......X'...M
  82007. 80399d1: ba96 09d6 5c76 1e93 9088 202b 7dd7 5726 ....v\....+ .}&W
  82008. 80399e1: c147 35a6 a185 51c8 f3ac 9606 eac4 752e G..5...Q.......u
  82009. 80399f1: 13ad 7cec bb9b 9007 202b e6d7 5ae4 c457 ...|....+ ...ZW.
  82010. 8039a01: 1d8a b472 8ba6 9a0c da9a af35 bfc9 dd56 ..r.......5...V.
  82011. 8039a11: 87b6 015c eeb9 b933 0a5a b536 074c 01a4 ..\...3.Z.6.L...
  82012. 8039a21: a5e6 9e46 0ae6 f6b8 8eb0 35b7 457a 80ae ..F........5zE..
  82013. 8039a31: 9b5c 6b91 d45d abda dad8 c7c5 8322 2155 \..k].......".U!
  82014. 8039a41: 6749 b5d8 f6e9 3ad9 1d82 7e7a 905d 202b Ig.....:..z~].+
  82015. 8039a51: 6dd7 ab95 60a1 8b13 f9cb e2ba 8e97 2358 .m...`........X#
  82016. 8039a61: fc75 376c 52ec 9d57 d61e 22c8 f732 ea91 u.l7.RW...."2...
  82017. 8039a71: 0d58 f1ad 58c5 ae3d 2ab4 afda 6b91 8824 X....X=..*...k$.
  82018. 8039a81: a905 2c60 8198 9277 6bc2 323e bdbc 07ae ..`,..w..k>2....
  82019. 8039a91: de5c 1ebf 7572 ec17 22c2 ab3a 074b 1ac4 \...ru...":.K...
  82020. 8039aa1: 542d 52b6 19b5 5873 d827 4589 baf4 20f0 -T.R..sX'..E...
  82021. 8039ab1: a6d7 a956 f38d 65ef 5c89 7523 cf82 4b05 ..V....e.\#u...K
  82022. 8039ac1: ce08 f0a8 cffa 6e0c 2bab 89d7 63e5 04cb .......n.+...c..
  82023. 8039ad1: 227d 7757 f6b9 842d 73d3 85ec 049d 4892 }"Ww..-..s.....H
  82024. 8039ae1: 22dd c481 48b2 5a95 14a4 5f5c 50fb d7c8 ."...H.Z..\_.P..
  82025. 8039af1: ca3e b5c9 70e7 8212 713d 5ce1 0ccd 3b6e >....p..=q.\..n;
  82026. 8039b01: 280e c5d6 ac4a d5c8 b05d 4555 be9b 36c5 .(..J...].UE...6
  82027. 8039b11: 332f 8b8f 6c0c 9377 2c8d 1b3b be6c 5c4c /3...lw..,;.l.L\
  82028. 8039b21: 5b0a ddc3 e696 082d c6b9 24ea 7445 90ed .[....-....$Et..
  82029. 8039b31: 473f 8e7b 6f51 0af1 f6c4 63ea 6eae ce4f ?G{.Qo.....c.nO.
  82030. 8039b41: 93d5 1760 6d86 914a fae5 26fb aac4 5823 ..`..mJ....&..#X
  82031. 8039b51: 22db b4d5 39e2 e887 0e2b 77ca e07c cb33 ."...9..+..w|.3.
  82032. 8039b61: 5f0b 3177 6b92 4587 fce1 1d8c 5ea3 621f ._w1.k.E.....^.b
  82033. 8039b71: 169d 8ac5 dd5c dae4 b8b3 1fb4 1659 7478 ....\.......Y.xt
  82034. 8039b81: a897 3aae 7a01 8f25 6875 0ab8 a6cb 7607 ...:.z%.uh.....v
  82035. 8039b91: 916c b052 185d dd31 716d cd98 bf99 07fd l.R.].1.mq......
  82036. 8039ba1: ae88 8a1d d339 f0d4 91f6 b167 e84e 7016 ....9.....g.N..p
  82037. 8039bb1: ab6c 9430 cf4c d230 aaad 8fb8 fd76 892e l.0.L.0.....v...
  82038. 8039bc1: 348d cd66 6dd6 bd97 8c30 a344 5d00 8b03 .4f..m..0.D..]..
  82039. 8039bd1: e536 8cfa bd3f d10d 43b5 90ea 5d1f 9c94 6...?....C...]..
  82040. 8039be1: 7ddb 9cc3 6ead 018a 3ab9 7608 5862 ef05 .}...n...:.vbX..
  82041. 8039bf1: 885b a7ac 06d1 5b65 8a14 3a35 fa0e 8b1e [.....e[..5:....
  82042. 8039c01: 3354 d3cf 5ab2 c51f a3f8 de87 ec85 679a T3...Z.........g
  82043. 8039c11: 3858 e72f 510e 8baf 1358 5cfa ca3d 20b5 X8/..Q..X..\=..
  82044. 8039c21: 45d8 915d f0a6 a9f7 a445 f13b c8b4 f7c0 .E].....E.;.....
  82045. 8039c31: c098 a2c8 5548 fcf5 be6d 9018 feeb 5fa4 ....HU..m......_
  82046. 8039c41: 2738 a36d d8de ac52 c959 4063 beae 7ae4 8'm...R.Y.c@...z
  82047. 8039c51: fae0 4ee9 d4dd 57fd e9bc 45ad cf21 f2ea ...N...W...E!...
  82048. 8039c61: 059b d719 6cb5 1af9 52e2 d827 61be 73ce .....l...R'..a.s
  82049. 8039c71: 2161 d344 892f a2c4 accd 508a cd72 9537 a!D./......Pr.7.
  82050. 8039c81: 102f f7a3 814e 65be 99b4 68f8 42b5 feae /...N..e...h.B..
  82051. 8039c91: dae5 7213 891d 9c76 a4a5 144c eff2 72f2 ...r..v...L....r
  82052. 8039ca1: 2715 4ee1 ce5d dcf1 2e4b 8937 7d74 720f .'.N]...K.7.t}.r
  82053. 8039cb1: 5919 a244 8255 0c8b dda3 7038 80a7 61af .YD.U.....8p...a
  82054. 8039cc1: 3a35 cd72 8454 5654 8938 241d 6b1b 5a92 5:r.T.TV8..$.k.Z
  82055. 8039cd1: 0de4 0363 ab4c b1e8 f267 e7af 22d0 b5ea ..c.L...g...."..
  82056. 8039ce1: eb15 cd7c 8a7b 2b5c 845e 87fc 5532 881f ..|.{.\+^...2U..
  82057. 8039cf1: b455 9b61 598f b90a ab66 88e3 7093 ab26 U.a..Y..f....p&.
  82058. 8039d01: dfcb d577 f7fb 2c84 795b 62f2 8f91 2563 ..w....,[y.b..c%
  82059. 8039d11: 9cd7 8d60 5f8a f43f dff6 79da afe5 dc1c ..`.._?....y....
  82060. 8039d21: c9f9 5e37 23ba 6bee 95e7 bfaf ef64 1e98 ..7^.#.k....d...
  82061. 8039d31: 440a 4599 c4b7 593a 9e66 2cbe 8666 6b51 .D.E..:Yf..,f.Qk
  82062. 8039d41: e388 7f2e cde2 56bf 0276 6af6 ba4e 52c8 .......Vv..jN..R
  82063. 8039d51: b1b0 49e6 3a9d 8244 1a3b dd8f f8a5 9be4 ...I.:D.;.......
  82064. 8039d61: e2d4 78f1 b56b ae42 27ff 9ed7 d6fa bb1a ...xk.B..'......
  82065. 8039d71: d38a f217 14e4 9412 258f 2215 564c 1c97 .........%."LV..
  82066. 8039d81: e235 8b4a 7d42 a5f9 bebf ae56 1fa2 e773 5.J.B}....V...s.
  82067. 8039d91: 5ffc f64d e67e a970 f7dd cb24 2799 9ab9 ._M.~.p...$..'..
  82068. 8039da1: fd2c 849d ab92 6443 fb13 4cae 98e7 563a ,.....Cd...L..:V
  82069. 8039db1: 7dcf ee3e b038 675c 9c0d 13a7 b706 cbd4 .}>.8.\g........
  82070. 8039dc1: dd35 bc94 9092 5ce4 ba46 5fa7 e1fd 96bd 5......\F.._....
  82071. 8039dd1: b29f 97e2 a894 5ca9 166b 4444 7d16 a6bb .......\k.DD.}..
  82072. 8039de1: 9cb2 8c5a 3465 9c79 e2ae 6ed6 92ef 8def ..Z.e4y....n....
  82073. 8039df1: 914d b2c3 6dca 0512 0c2e b223 9190 1462 M....m....#...b.
  82074. 8039e01: ae58 f3a1 c9d8 a980 db58 d725 08b2 ecf7 X.......X.%.....
  82075. 8039e11: 8e2b 9dec 52d0 e72e 3c1d 2d64 9ad7 7608 +....R...<d-...v
  82076. 8039e21: 49ee 3396 5cc3 2ce9 a760 1c40 b8e2 bce7 .I.3.\.,`.@.....
  82077. 8039e31: 4af3 a89b f5d2 5692 b8e7 2f21 27db f281 .J.....V..!/.'..
  82078. 8039e41: 55c4 9e44 ab9e 4769 3240 e460 b6a0 475c .UD...iG@2`...\G
  82079. 8039e51: 52db 1531 9d72 890b 42a6 7da8 b91b dfca .R1.r....B.}....
  82080. 8039e61: b619 f97e a592 b90f 169a 7c9e adcd 5ffd ..~........|..._
  82081. 8039e71: 7d9e cddd 972e b6d6 98c5 c034 fb65 83b0 .}........4.e...
  82082. 8039e81: e197 7a45 531e 3e2b bb87 d720 5c9c b9fb ..Ez.S+>.. ..\..
  82083. 8039e91: d542 5738 4ac0 bf2d f351 9fb7 28f8 5982 B.8W.J-.Q....(.Y
  82084. 8039ea1: 10a6 4216 e3ae 6895 e575 26ba 9045 806e ...B...hu..&E.n.
  82085. 8039eb1: 275c 9116 3aeb 3646 68cb 850b 91ac c9e5 \'...:F6.h......
  82086. 8039ec1: 0717 ab90 2569 34dc d195 eb76 7155 6b86 ....i%.4..v.Uq.k
  82087. 8039ed1: c8c8 4235 0dae 62b7 d019 2753 fc90 a7c0 ..5B...b..S'....
  82088. 8039ee1: 70aa 0f35 5a2d d119 810a b6f6 ae58 36b3 .p5.-Z......X..6
  82089. 8039ef1: 0e17 d214 4b01 ee8d 2680 3ae5 841e 14eb .....K...&.:....
  82090. 8039f01: b7e8 d620 c799 bae7 341c e9dc 5c80 621b .. ......4...\.b
  82091. 8039f11: b425 07dc 1135 dbd2 5ceb 3108 4961 5cca %...5....\.1aI.\
  82092. 8039f21: 2076 c954 44b5 33b0 82c3 1b53 ed72 5892 v T..D.3..S.r..X
  82093. 8039f31: 0ee7 099f 28d3 e473 b2f9 167d 8d38 fa11 .....(s...}.8...
  82094. 8039f41: 3cf2 8a74 39c2 457a edae 75c8 290f f93d .<t..9zE...u.)=.
  82095. 8039f51: 14af ae60 79c1 b3e2 2a0a 9d8e 8949 68cb ..`..y...*..I..h
  82096. 8039f61: 4cb6 9aae 7a4b 5b4d a6ab f386 756f dae5 .L..KzM[....ou..
  82097. 8039f71: 436b 32aa 5ac7 d3d2 9aea 4b9b fe07 9adb kC.2.Z.....K....
  82098. 8039f81: 524c 9352 8fc0 c437 038e cfb6 95b5 2bdc LRR...7........+
  82099. 8039f91: 7572 e4bb 3a77 414e 65ae b1f7 5b27 4829 ru..w:NA.e..'[)H
  82100. 8039fa1: 3d5f 427b f1ae b91a ebf6 f496 e87a 982e _={B........z...
  82101. 8039fb1: f639 36a2 203a b65b 95c1 ab44 f23e 36ad 9..6: [...D.>..6
  82102. 8039fc1: 5791 145d ba15 7fc1 82da e35c f38a edaf .W].......\.....
  82103. 8039fd1: 1a82 0d72 d724 62b4 b91d a8f7 1577 cad9 ..r.$..b....w...
  82104. 8039fe1: aa7c bc8f caad c6ff b905 2d8e cb06 ee84 |..........-....
  82105. 8039ff1: 6d8b 407d 5cb6 b74d 6a26 6d75 3792 c2f9 .m}@.\M.&jum.7..
  82106. 803a001: 0c5c 6fda 6ff0 3663 d442 a742 8b00 5a08 \..o.oc6B.B....Z
  82107. 803a011: 6b96 586c 8824 7894 b927 84ee 50c8 7bae .klX$..x'....P.{
  82108. 803a021: 009d d2ea f7be 8b8a 1b2f 4929 16ba 620c ......../.)I...b
  82109. 803a031: 8dcb 6304 de8b 9b52 c37d 1f5a 2d90 d823 ...c..R.}.Z..-#.
  82110. 803a041: 8235 95b5 30eb 09c0 ba1e bfc1 1ded da07 5....0..........
  82111. 803a051: 514c 90f4 736b ed72 445b d904 0f9a f690 LQ..ksr.[D......
  82112. 803a061: 59e5 ae4e 423b 7bae d3b9 6895 225d 1fda .YN.;B.{...h]"..
  82113. 803a071: cb7f 4ce1 15e6 c50d 3a67 b042 a1e7 7fd1 ...L....g:B.....
  82114. 803a081: 56de ab31 dbd0 2aea d357 fc66 e7a1 6663 .V1....*W.f...cf
  82115. 803a091: 3b81 4c1b c187 d194 b00f e081 32dc 9f02 .;.L.........2..
  82116. 803a0a1: d720 0b66 a65a b879 a7a9 fa0f 391e eeb9 .f.Z.y......9..
  82117. 803a0b1: 3ffd 8b97 6d4a e12f 7e64 30b1 a654 09aa .?..Jm/.d~.0T...
  82118. 803a0c1: 6e7f 9c58 1c4a fd1b 1f5b 2d90 dcbe 2c7c .nX.J...[..-..|,
  82119. 803a0d1: 348f 17cd 0166 b872 e9a6 d0ab b3fd cca6 .4..f.r.........
  82120. 803a0e1: c52d 391a c54c 21ea e6d7 3ae4 5c33 9daf -..9L..!...:3\..
  82121. 803a0f1: 4458 2326 bc75 d551 9b9b eb93 bbff bcf4 XD&#u.Q.........
  82122. 803a101: f5e0 b66f 422a b9c8 6a06 c1a6 3578 a620 ..o.*B...j..x5 .
  82123. 803a111: 55d0 b7d0 cb58 363f 3b4c 2eb8 1d7b 1c56 .U..X.?6L;..{.V.
  82124. 803a121: 3527 fe1c c7b2 0ecb a6ff 6a8f 34f2 d450 '5.........j.4P.
  82125. 803a131: b214 1e0a 7fb2 67d6 a360 1afb 1236 22bd .......g`...6.."
  82126. 803a141: 7b57 86c6 4691 1964 2c49 690a b184 646e W{...Fd.I,.i..nd
  82127. 803a151: e420 8f9a 8d66 0e3a 9464 2226 54d9 faae ...f.:.d.&".T..
  82128. 803a161: 912a c4eb 8262 c2d6 6871 e98b ec80 c6be *...b...qh......
  82129. 803a171: 5792 4dd7 b309 11c0 6ea0 64c4 343b a77a .W.M.....n.d;4z.
  82130. 803a181: 5103 cfb1 9c94 14ae 26d3 57a2 6ae4 d0cf .Q.......&.W.j..
  82131. 803a191: ef22 b53a e378 15fa ff09 d14a b92a 4f16 ".:.x.....J.*..O
  82132. 803a1a1: a36e 6d6f a139 2e4b cdad b5c9 772a f0ba n.om9.K.....*w..
  82133. 803a1b1: 53b8 136e b203 8ea7 3572 6969 d9b2 69af .Sn.....r5ii...i
  82134. 803a1c1: 0832 2053 cd33 6715 0683 ebaa 9e81 7f6b 2.S 3..g......k.
  82135. 803a1d1: a04d 8593 5e8e ab91 913d 65c5 6257 8df9 M....^..=..eWb..
  82136. 803a1e1: 175f acf1 630a df5a a2ac 3580 8934 d446 _....cZ....54.F.
  82137. 803a1f1: b20a e554 2746 b79e ef14 b6ed 2037 48db ..T.F'......7 .H
  82138. 803a201: 15d8 badb 45d4 a382 91c0 9752 6406 7977 .....E....R..dwy
  82139. 803a211: 185b cb1f 6367 dae4 0acc 99ad 1145 6162 [...gc......E.ba
  82140. 803a221: 1559 189e 965c 3525 cd72 8157 0667 ec51 Y...\.%5r.W.g.Q.
  82141. 803a231: a2a2 a0ab 7b6a 85f0 be63 d435 ec80 d778 ....j{..c.5...x.
  82142. 803a241: 9edf 9359 89c2 b7d7 52b9 6cb0 eff2 80d2 ..Y......R.l....
  82143. 803a251: 2eec f731 5858 4e34 207b 3757 1646 ad79 ..1.XX4N{ W7F.y.
  82144. 803a261: 61c4 b33d 8449 a992 e76f 855e ad5c 2b24 .a=.I...o.^.\.$+
  82145. 803a271: abb7 2831 c564 5b16 bb8a 0a76 21a4 1ae4 ..1(d..[..v..!..
  82146. 803a281: 0662 8584 5c14 e7ab 07a1 7764 ba89 3ae7 b....\....dw...:
  82147. 803a291: 1909 22bd 70d7 81a9 6599 3af4 c8d5 6539 ...".p...e.:..9e
  82148. 803a2a1: 1f16 58b2 4a33 8ad1 64b4 9714 25db 2aa1 ...X3J...d...%.*
  82149. 803a2b1: 9d6a faec f5d9 c435 6c80 e5a3 0db4 2109 j.....5..l.....!
  82150. 803a2c1: 68b3 09fb ecb9 9375 9ae5 fc0e c716 a28c .h....u.........
  82151. 803a2d1: e457 ceea e2d4 ae1b 292e d63f fa90 32c4 W........)?....2
  82152. 803a2e1: d222 14a9 3a27 9702 9c91 01da b477 1ada "...':......w...
  82153. 803a2f1: a07c 3dbf dcf8 df70 df2c b203 728d f2ae |..=..p.,....r..
  82154. 803a301: a48b b121 03f6 b65f 0e9b 4ec8 5836 f1ae ..!..._....N6X..
  82155. 803a311: 6fc0 8427 b1d1 6b91 a5d8 33b0 3c87 8e99 .o'....k...3.<..
  82156. 803a321: 7b04 b24a 91a6 42ec 1073 5688 22d4 6ea7 .{J....Bs..V.".n
  82157. 803a331: 96c9 12ad 4eb9 862c b8c1 ceae 42ca d16c .....N,......Bl.
  82158. 803a341: bf2d 3a44 d628 1a26 7bfc 2c1b 5ed7 9cc0 -.D:(.&..{.,.^..
  82159. 803a351: 0cf2 36b9 7233 6170 0df1 d3a7 620e 0972 ...63rpa.....br.
  82160. 803a361: 1c37 dfac 36d9 edcb 30c0 5c34 de57 f9d3 7....6...04\W...
  82161. 803a371: 9776 5b2d e3ab f46a 6691 6286 e935 3573 v.-[..j..f.b5.s5
  82162. 803a381: 0d99 ed3b 5c88 0e17 9aab 7642 b40a bdb9 ..;..\....Bv....
  82163. 803a391: c84b 014e 435f 6269 1ae4 ae5e 6589 5675 K.N._Cib..^..euV
  82164. 803a3a1: 5be7 3273 bf08 a68b bcae bab3 b1d9 1252 .[s2..........R.
  82165. 803a3b1: be2f daf2 d6ba d4a9 ae42 edba e358 00dd /.......B...X...
  82166. 803a3c1: 1abb 9404 d4eb fdf1 a26d dfc1 47a6 6db7 ........m....G.m
  82167. 803a3d1: 0d66 3ea4 c866 99b5 d961 cb0b 3408 ccd1 f..>f...a....4..
  82168. 803a3e1: f695 203b 48d8 3fa3 1330 9d72 44d6 91ad ..; .H.?0.r..D..
  82169. 803a3f1: 5ca5 8d23 3368 2109 35d7 5b83 a35c a1d5 .\#.h3.!.5.[\...
  82170. 803a401: f787 a9a4 ff06 4b7e 0763 1a9b 9d74 8ef9 ......~Kc...t...
  82171. 803a411: 915e 336b d7b9 5cba 6e97 7343 301a cd8a ^.k3...\.nCs.0..
  82172. 803a421: 58e7 35a7 aaf9 aeda ef82 723d 75d4 5645 .X.5......=r.uEV
  82173. 803a431: 0b5d 64d5 1e4d de36 b40d 971f e8a7 316d ]..dM.6.......m1
  82174. 803a441: b0f0 736d 9d43 6502 919f 8a91 bad8 da2e ..msC..e........
  82175. 803a451: a0d1 ae99 0588 6d72 b226 399b 9114 ab74 ......rm&..9..t.
  82176. 803a461: 99ff c967 1546 07b3 eeaa 36a7 3d8a 8afb ..g.F......6.=..
  82177. 803a471: ae23 021d 229d 9727 c5b9 3809 b1f6 057b #...."'....8..{.
  82178. 803a481: 0e6c d5c8 f6ff 992f 0f43 c8eb 5f22 5897 l...../.C..."_.X
  82179. 803a491: 768a d9a8 5069 f977 995a 958b 0c63 a32d .v..iPw.Z...c.-.
  82180. 803a4a1: 2eca b5ca e5f8 ab12 2cf7 435d 91dc 397c .........,]C..|9
  82181. 803a4b1: d720 d8ad 30a0 cc75 0d7b 2f2d e73f 9db9 ....0u.{.-/?...
  82182. 803a4c1: 860e c325 d387 375c cd81 4fe5 26bf 9dfa ..%...\7...O.&..
  82183. 803a4d1: 08d5 3c76 df28 7671 e553 800a 5b5c fdd8 ..v<(.qvS...\[..
  82184. 803a4e1: 4eb5 8960 0446 ef3c ee48 a4ca b698 8bf6 .N`.F.<.H.......
  82185. 803a4f1: bce5 8783 ad8a c85a 9015 722b cab5 6663 ......Z...+r..cf
  82186. 803a501: f703 0245 a0e9 16dd 9b18 4802 f15c f798 ..E........H\...
  82187. 803a511: 8b04 015c 22b9 90d7 03dd f2ba 39ea 980c ..\..".......9..
  82188. 803a521: d970 b2f1 f9a7 8cd8 6f22 d8b9 a1c0 0b15 p......."o......
  82189. 803a531: 02b9 4572 daae ac3d bdba 3d87 3395 150d ..rE..=....=.3..
  82190. 803a541: 66c9 5206 77cd ac37 e45b 3550 c0ff dfa8 .f.R.w7.[.P5....
  82191. 803a551: b912 7202 ae45 fdb6 7373 49c3 8948 14ea ...rE...ss.IH...
  82192. 803a561: 21f0 d35a 838e e2b2 5555 365e 16dd 22c1 .!Z.....UU^6..."
  82193. 803a571: 400c ddae ab92 0f6e 666b f8d1 5abc 3339 .@....n.kf...Z93
  82194. 803a581: f752 d551 bddc 2f9a c930 09b5 5cf9 9b02 R.Q..../0....\..
  82195. 803a591: cc59 ddb0 c128 0c22 ae40 93dd e9ab 024e Y...(.".@.....N.
  82196. 803a5a1: 8ebd 507d 037a 69fd 89f7 fae1 64f4 0453 ..}Pz..i.....dS.
  82197. 803a5b1: 308b b900 5376 a6ae 2203 1dc6 4068 0c8f .0..vS..."..h@..
  82198. 803a5c1: 163b 1ac6 7651 3ae6 1463 02b9 4572 d6ae ;...Qv.:c...rE..
  82199. 803a5d1: a883 3507 b55b 1034 9aa9 81b6 0625 9ec7 ...5[.4.....%...
  82200. 803a5e1: 98fb 8a65 015c 22b9 b2d7 ce08 9174 d4c0 ..e.\.."....t...
  82201. 803a5f1: c0f3 aa8f b125 67a1 4691 cf25 617f a913 ....%..g.F%..a..
  82202. 803a601: 5723 ae40 d5c8 7c66 badf 7668 da25 87be #W@...f|..hv%...
  82203. 803a611: 3508 d819 66ed 3ae0 b48b b04c f3b6 9146 .5...f.:..L...F.
  82204. 803a621: 202b e457 bf6a 6029 174d b8c0 ae62 ac40 + W.j.)`M...b.@.
  82205. 803a631: 9e7e 2f9f d2e0 e5c6 166b 9969 c760 c72e ~../....k.i.`...
  82206. 803a641: ae44 5c80 6b91 96d7 b6ba ee31 9d70 8760 D..\.k....1.p.`.
  82207. 803a651: 5e21 e463 c80a 7f75 d5ca 3aa6 c5df b125 !^c...u....:..%.
  82208. 803a661: 043e 859b 94e8 ae40 5c80 aff7 8b5c 5d92 >.....@..\..\..]
  82209. 803a671: 2474 6d52 5ba2 df21 35a6 7221 e405 5c8a t$Rm.[!..5!r...\
  82210. 803a681: 3343 6834 f7e0 69b9 d25e 73c2 bbed 5ce6 C34h...i^..s...\
  82211. 803a691: 2b91 5720 6ae4 cd13 5aae 7ca5 b447 750b .+ W.j...Z.|G..u
  82212. 803a6a1: 64dc c5b0 f393 2b91 5720 aae4 db2b 0ed5 .d.....+ W..+...
  82213. 803a6b1: 7503 0573 12f2 a99d 74c8 59d5 dbd0 1f2f .us......t.Y../.
  82214. 803a6c1: e476 c80a 0015 9000 002b 7200 0005 ae40 v.......+..r..@.
  82215. 803a6d1: 0000 5c80 0001 2b90 0000 0572 0000 0ae4 ...\...+..r.....
  82216. 803a6e1: 8000 015c 9000 002b 2000 0057 e400 000a ..\...+.. W.....
  82217. 803a6f1: 5c80 0001 b900 0002 5720 0000 0ae4 0000 .\...... W......
  82218. 803a701: 15c8 0000 02b9 2000 0057 4000 00ae c800 ....... W..@....
  82219. 803a711: 0015 b900 0002 7200 0005 ae40 0000 15c8 .......r..@.....
  82220. 803a721: 0000 2b90 0000 0572 4000 00ae fb00 ae5c ...+..r..@....\.
  82221. 803a731: f63f 6685 ca79 1883 db0e 3781 001f 6b90 ?..fy......7...k
  82222. 803a741: b940 75b6 9aff 3f92 cb76 ad45 89c3 d002 @..u...?v.E.....
  82223. 803a751: b96d 761e eb90 0433 0917 283e 82f8 41e0 m..v..3...>(...A
  82224. 803a761: 49c1 23c1 7f82 dc13 7822 e087 0d79 f5cb .I.#...."x..y...
  82225. 803a771: 824d 3af3 d72c 0b97 412e 00ae 2bdb 8bd7 M..:,....A...+..
  82226. 803a781: 9905 5c85 2e9f 4cb8 9ff0 a582 2706 d704 ...\...L.....'..
  82227. 803a791: be0b 01bb 1eb9 7c10 7045 60a7 83b7 dd72 .......|Ep.`..r.
  82228. 803a7a1: dc15 f821 e09a c859 6015 e4fb 103a 213c ..!...Y..`..:.<!
  82229. 803a7b1: d478 ae50 2c3f 27f8 a94d 7916 7058 6079 x.P.?,.'M..yXpy`
  82230. 803a7c1: beb9 7727 077f 283b 37d7 9608 f78a 5722 ..'w..;(.7...."W
  82231. 803a7d1: ed80 eb92 054b 04c7 854b 5cae 417f 8df0 ....K...K..\.A..
  82232. 803a7e1: 3082 25bf bcf8 dde0 5f82 5c14 7820 e0b5 .0.%....._.\ x..
  82233. 803a7f1: e0b0 2a13 5045 ec94 089f 169e ae40 122f ...*EP......@./.
  82234. 803a801: cf1c cfdd 5557 db24 b915 101e 47fc ae4e ....WU$......GN.
  82235. 803a811: 098f 40ce 00ae 21db d3d7 5f05 89ca 5755 ...@...!..._..UW
  82236. 803a821: 03ae 13c1 4905 2ade a738 5446 11cf 255c .....I.*8.FT..\%
  82237. 803a831: b478 db70 01a3 7ae4 8953 8fc8 4874 57ae x.p....zS...tH.W
  82238. 803a841: c4e5 e2ba e466 b00a 72f9 76fd dfc1 c415 ....f....r.v....
  82239. 803a851: 2dfa b90d 88ca bff0 390b 43d4 b206 a17a .-.......9.C..z.
  82240. 803a861: cbe0 e225 d4bb 5ca3 57cf b4c5 7de2 571c ..%....\.W...}.W
  82241. 803a871: bf8f b96d 40be bc70 ae44 0b92 2b91 e6c0 ..m..@p.D....+..
  82242. 803a881: 75ca 7057 4163 92ac 35fb 7ae4 4e6b 3256 .uWpcA...5.zkNV2
  82243. 803a891: fd7a 0359 9d51 f82e 35d7 d839 0baf ef9e z.Y.Q....59.....
  82244. 803a8a1: ae41 c532 5770 ae45 93f7 901d c7eb 88d7 A.2.pWE.........
  82245. 803a8b1: 3255 3c17 b90d 6c02 5ca6 b77f ac44 a0b2 U2.<...l.\..D...
  82246. 803a8c1: 73f5 7235 141d f544 061b 9292 8129 162f .s5r..D.....)./.
  82247. 803a8d1: ff6e 42a1 f6de 1e03 fae4 dc96 bef1 7829 n..B..........)x
  82248. 803a8e1: b148 648a aa4f 705c 725b 4f3d 5270 5489 H..dO.\p[r=OpR.T
  82249. 803a8f1: fbfe e290 399b 1ec1 ae42 9b00 5727 72d9 .....9..B...'W.r
  82250. 803a901: b275 d620 ea93 75e7 088b 32fe ae27 5fbf u. ....u...2'.._
  82251. 803a911: 885b 6f2a ba89 20b3 ebd6 efd4 277e 33f7 [.*o... ....~'.3
  82252. 803a921: 8b99 cd3d ae41 12cf 2d7c bc77 723b 3bbf ..=.A...|-w.;r.;
  82253. 803a931: fb96 5df9 8f06 a7dd 655c d5eb 399d 1e89 ...]....\e...9..
  82254. 803a941: fdcb 8eee cfdc 13ef 8a9c 015c 4736 17ae ..........\.6G..
  82255. 803a951: 08a8 18b5 1eb5 58d6 f5a1 155c ae09 f504 .......X..\.....
  82256. 803a961: 9acb 7a72 e0a6 0573 7eb1 d724 1a77 ba15 ..rz..s..~$.w...
  82257. 803a971: 2e08 9073 7beb f70b 4eb3 92ae 05a4 1eb9 ..s..{...N......
  82258. 803a981: a42c d600 55c9 0d72 0572 0cd8 9eb9 72a5 ,....Ur.r......r
  82259. 803a991: 45aa beb1 7347 ebf9 152f a3f2 d4cf d310 .E..Gs../.......
  82260. 803a9a1: 8229 174f 76a4 fa8b fe79 feef f72c 4ffb ).O..v..y...,..O
  82261. 803a9b1: ca58 0cf5 63c1 7206 57bd ba45 c94d 3bf5 X....c.r.WE.M..;
  82262. 803a9c1: 5f05 9035 e3eb b382 2b90 3340 bd72 7f30 ._5......+@3r.0.
  82263. 803a9d1: 6ef9 73c0 f704 8894 a8f5 6cc1 7c81 fe43 .n.s.......l.|C.
  82264. 803a9e1: 68df 4948 a646 1637 f684 35d9 7e52 ee5b .hHIF.7....5R~[.
  82265. 803a9f1: fe6f 52d9 7fae 525e aabc ab92 f7e4 941b o..R..^R........
  82266. 803aa01: 91eb e292 9555 255c e453 100a ae56 26df ....U.\%S...V..&
  82267. 803aa11: 46b8 4ab5 171d 639c d620 0453 2f9f eb11 .F.J...c .S../..
  82268. 803aa21: d467 74ef fae5 92e1 697c 4715 220b dbfb g..t....|i.G."..
  82269. 803aa31: 268a 0bfe 510b a9b1 7f5c 4d6a 4067 5c9d .&...Q..\.jMg@.\
  82270. 803aa41: 531f 6f11 b968 48be a8f0 5c85 0325 0ae4 .S.oh..H...\%...
  82271. 803aa51: 4e10 b7ae c417 45f8 5c25 b91d 2d1e ab11 .N.....E%\...-..
  82272. 803aa61: 6fec 603d 1538 7f2b 7ee9 8d75 ae90 482e .o=`8.+..~u....H
  82273. 803aa71: 1fec b754 bac0 7fbf e169 4def 2ae4 530b ..T.....i..M.*.S
  82274. 803aa81: 4b73 4ab9 d53e 5c80 b93f 9c46 723a 5bbd sK.J>..\?.F.:r.[
  82275. 803aa91: 0a70 0572 2308 a4d7 9044 ac7f d621 9577 p.r..#..D...!.w.
  82276. 803aaa1: eedc 6a4b 9665 c8e9 7cc1 7ae4 8543 de8c ..Kje....|.zC...
  82277. 803aab1: 905d 3dd7 bfaa 4ab5 7160 e661 8980 0f5c ]..=...J`qa...\.
  82278. 803aac1: f455 eab4 75c8 eea9 943f 2f5c b5c8 d95e U....u..?.\/..^.
  82279. 803aad1: 55c8 1872 02b9 9184 6cab fffa 495c d4fb .Ur......l..\I..
  82280. 803aae1: 2a6b 7924 e091 92c9 0245 5967 73ce e7cd k*$y....E.gY.s..
  82281. 803aaf1: 6f5c 235b b7a2 a417 eff5 456a 9d56 df20 \o[#......jEV. .
  82282. 803ab01: 996a 3d73 7055 079f ceb9 8a4b 3e6c 2ae4 j.s=Up....K.l>.*
  82283. 803ab11: 0317 55dc 4d21 b95d 2fde 9088 402b 8298 ...U!M]../..+@..
  82284. 803ab21: 19d6 8782 b20b 4fbc 3df0 c31a 9658 572a .......O.=..X.*W
  82285. 803ab31: ae7b b0c3 7cec c0b7 3531 35bf a12f 8583 {....|..15.5/...
  82286. 803ab41: a725 0472 59e1 c59a 8fa8 6ee5 9377 5c81 %.r..Y.....nw..\
  82287. 803ab51: a9af bc99 2ba5 65d7 12e5 7b5e 26b9 c215 .....+.e..^{.&..
  82288. 803ab61: 9134 e4ab e45a 100a 5bae 6de0 9725 b7f9 4...Z....[.m%...
  82289. 803ab71: c8a9 f576 cf37 7c13 f0a5 4f37 48aa 65d6 ..v.7..|..7O.H.e
  82290. 803ab81: 8227 3eaa d7d7 9e0a fdcc 01ee 4795 6dd5 '..>.........G.m
  82291. 803ab91: fffc 45ba eb9f 0bf7 f71e d728 52ff b091 ...E......(..R..
  82292. 803aba1: b92f 5b3e af70 b947 109e 04bc 02b9 9184 /.>[p.G.........
  82293. 803abb1: 94ab 5fe8 0897 a476 7f7e 64a0 cb18 1653 ..._..v.~..d..S.
  82294. 803abc1: 3809 f36c b652 eb42 8555 5909 6252 1ae7 .8l.R.B.U..YRb..
  82295. 803abd1: fe34 5717 3d68 5357 53ae 998d 26b1 9572 4..Wh=WS.S...&r.
  82296. 803abe1: a1fc b947 5d5e 4b23 b953 6e4a ae45 e100 ..G.^]#KS.JnE...
  82297. 803abf1: 1116 5f3c 50f0 9e41 0b8f 447e 5370 5889 ..<_.PA...~DpS.X
  82298. 803ac01: f3af 87b8 a0d6 3664 f1c0 d4c2 9fa9 1036 ......d6......6.
  82299. 803ac11: 4beb ab0a 74b3 0b67 4abc 2073 a9b7 1f5c .K...tg..Js ..\.
  82300. 803ac21: 1157 abb1 cf5c f350 7d59 55cb 6af2 0ae4 W...\.P.Y}.U.j..
  82301. 803ac31: 6e10 d685 4b1b fa24 4988 ab2f 06c3 7f85 .n...K$..I/.....
  82302. 803ac41: 46b5 324c fd7a 0379 cab1 b4bd a5fe dfd0 .FL2z.y.........
  82303. 803ac51: 02fa b90d c2ca ddd3 729a e995 9b89 2715 .........r.....'
  82304. 803ac61: 6f34 69f3 720f 94fd 28a6 a84f ae19 0792 4o.i.r...(O.....
  82305. 803ac71: 6f34 8f73 e9e0 15c8 dc20 d7f2 28b2 cf35 4os..... ....(5.
  82306. 803ac81: aabc d597 ae41 2e2f 73cc ed5d f040 0306 ....A./..s].@...
  82307. 803ac91: feb1 daa0 70b4 9a59 ad6b eb96 cb61 656d .....pY.k...a.me
  82308. 803aca1: f84c 0719 c6b9 929a e174 c89d 2015 5c9c L.......t.... .\
  82309. 803acb1: 134f 797c 588d 4165 85eb b701 2ed6 89db O.|y.XeA........
  82310. 803acc1: e640 cf40 28d6 fd5e c39e 044e c872 fdcb @.@..(^...N.r...
  82311. 803acd1: 9206 57bc e4f5 50de 78f2 b8ab 6d5b 68bc ...W...P.x..[m.h
  82312. 803ace1: d72a d453 563c 495d 213e 41b8 af71 edc1 *.S.<V]I>!.Aq...
  82313. 803acf1: 141e 177c 0572 3708 65b8 3250 f03e d511 ..|.r..7.eP2>...
  82314. 803ad01: b58a 5013 abae b43d 978e b044 0bb7 54ae ...P..=...D....T
  82315. 803ad11: 3fbf ed5f 25a5 cda3 af8f 7bc9 6f5e 87b0 .?_..%.....{^o..
  82316. 803ad21: b5d6 1186 69a8 35ce 61cf b90b 321e 408c .....i.5.a...2.@
  82317. 803ad31: 726d 2bae 43ae 00ae a761 bd62 b6cf cae5 mr.+.C..a.b.....
  82318. 803ad41: ae51 be92 eec3 8faf ee18 fafe 0603 d379 Q.............y.
  82319. 803ad51: dcfc 33d6 0f15 de1b 01f6 2915 caeb 54f5 ...3.......)...T
  82320. 803ad61: ecd5 226f 87c8 6705 ee2a bc32 1cad 7dae ..o"...g*.2....}
  82321. 803ad71: 720e 0805 5727 6339 1fe0 5c95 f0af 9e31 .r..'W9c...\..1.
  82322. 803ad81: 40d0 3bae f2ea f2f9 90c2 2aea a84e f568 .@.;.......*N.h.
  82323. 803ad91: ed74 fd35 dd4f a65e c629 7206 a3fd 7206 t.5.O.^.)..r...r
  82324. 803ada1: 45ad 8b3e 015c cec2 7d73 bad9 81f1 c80d .E>.\...s}......
  82325. 803adb1: 3f35 fb14 9522 94df 5a83 541e fa82 5a86 5?.."....Z.T...Z
  82326. 803adc1: fb06 8217 a877 012e 21b3 76d5 bfbb c3fa ....w....!.v....
  82327. 803add1: b0df 60ec a270 9800 3ff3 637f aecb 24e6 ...`p....?.c...$
  82328. 803ade1: 24ed 0000 0000 4549 444e 42ae 8260 .$....IEND.B`.
  82329. 0803adef <data__role_js>:
  82330. 803adef: 722f 6c6f 2e65 736a 0000 0000 5448 5054 /role.js....HTTP
  82331. 803adff: 312f 312e 3220 3030 4f20 0d4b 530a 7265 /1.1 200 OK..Ser
  82332. 803ae0f: 6576 3a72 6c20 4977 2f50 2e31 2e33 2031 ver: lwIP/1.3.1
  82333. 803ae1f: 6828 7474 3a70 2f2f 6173 6176 6e6e 6861 (http://savannah
  82334. 803ae2f: 6e2e 6e6f 6e67 2e75 726f 2f67 7270 6a6f .nongnu.org/proj
  82335. 803ae3f: 6365 7374 6c2f 6977 2970 0a0d 6f43 746e ects/lwip)..Cont
  82336. 803ae4f: 6e65 2d74 654c 676e 6874 203a 3332 3934 ent-Length: 2349
  82337. 803ae5f: 0a0d 6f43 6e6e 6365 6974 6e6f 203a 6c43 ..Connection: Cl
  82338. 803ae6f: 736f 0d65 430a 6e6f 6574 746e 742d 7079 ose..Content-typ
  82339. 803ae7f: 3a65 6120 7070 696c 6163 6974 6e6f 782f e: application/x
  82340. 803ae8f: 6a2d 7661 7361 7263 7069 0d74 430a 6e6f -javascript..Con
  82341. 803ae9f: 6574 746e 452d 636e 646f 6e69 3a67 6720 tent-Encoding: g
  82342. 803aeaf: 697a 0d70 430a 6361 6568 432d 6e6f 7274 zip..Cache-Contr
  82343. 803aebf: 6c6f 203a 7270 7669 7461 2c65 6d20 7861 ol: private, max
  82344. 803aecf: 612d 6567 383d 3436 3030 0a0d 0a0d 8b1f -age=86400......
  82345. 803aedf: 0008 0000 0000 0a04 58b5 8eef c6db 7f11 .........X......
  82346. 803aeef: de15 b8c6 2d23 2d1e a939 8b0b 13c7 677c ....#-.-9.....|g
  82347. 803aeff: 7637 b3e0 9c83 a68a 1838 72c6 2577 47d1 7v......8..rw%.G
  82348. 803af0f: 5971 a972 7ab3 a027 d035 2d4f b410 8a9f qYr..z'.5.O-....
  82349. 803af1f: 687e 37d0 8b48 0818 26d0 a0cf a37b 76fe ~h.7H....&..{..v
  82350. 803af2f: 8a49 ce94 8db2 8502 44ed 9ddc 9d99 3f9d I........D.....?
  82351. 803af3f: 99bf 51d9 3091 c915 62c4 a099 9c4a e116 ...Q.0...b..J...
  82352. 803af4f: 3a33 c68b af54 ced9 8ce5 1666 b80d c564 3:..T.....f...d.
  82353. 803af5f: 2454 2bca 1e89 42c5 d97f 4784 e233 d4f8 T$.+...B...G3...
  82354. 803af6f: 3163 f3cd 7467 022a 1792 4261 c467 8cd7 c1..gt*...aBg...
  82355. 803af7f: 56e1 22c6 5f06 e6d8 9303 7f85 cd21 35f6 .V."._......!..5
  82356. 803af8f: 4bbf 9a3d 22a6 c7e1 2893 76e6 18e8 2c81 .K=.."...(.v...,
  82357. 803af9f: db38 4aa6 111c 7dc7 e6df 9f0b 759d 785f 8..J...}.....u_x
  82358. 803afaf: 9251 ec88 f0f1 69e4 77b0 ad40 2649 0146 Q......i.w@.I&F.
  82359. 803afbf: 4499 92b9 dcd9 a89b 4c69 970e 58ff b4fe .D......iL...X..
  82360. 803afcf: e7fc 1ff5 dfaf 7f2c feb8 5ac6 0dfe 3f9f ......,....Z...?
  82361. 803afdf: bf5e feb9 fe1d 6fff 79fc 5f8b 1ddf a1dc ^......o.y._....
  82362. 803afef: 7b87 3b2e bdeb 625b e691 6f2f bd4a 3dfe .{.;..[b../oJ..=
  82363. 803afff: fe64 fd74 f2cd e5c7 cb0f d6b7 aff2 3fcb d.t............?
  82364. 803b00f: bf2f 252d 3b91 e46b 7041 2511 5e5c b178 /.-%.;k.Ap.%\^x.
  82365. 803b01f: c664 5e15 d54a 8124 0785 16e6 832d b853 d..^J.$.....-.S.
  82366. 803b02f: 266f 9f48 b9dc e871 2976 bbbb d1b6 a6fd o&H...q.v)......
  82367. 803b03f: c71c d70d af2c bb8f d6b9 dac3 bb2d f672 ....,.......-.r.
  82368. 803b04f: 3888 2c6b 59d4 ea8c baa8 5365 32e7 aa13 .8k,.Y....eS.2..
  82369. 803b05f: 12c8 e56b b19d 5550 1d08 9fcd 5070 f434 ..k...PU....pP4.
  82370. 803b06f: 170c 8f3e 4892 3e69 0b16 3d9a 9449 66c8 ..>..Hi>...=I..f
  82371. 803b07f: b634 3455 b215 8e50 0acb 6bb8 ac7a 4129 4.U4..P....kz.)A
  82372. 803b08f: 56e5 41eb d42e b68a e245 c4f6 ada7 6203 .V.A....E......b
  82373. 803b09f: 7e39 285e 7644 54a5 292c faff e9e4 c943 9~^(Dv.T,)....C.
  82374. 803b0af: 826c 1c3d b1e0 3471 9d20 1813 cbdc bc28 l.=...q4 .....(.
  82375. 803b0bf: b530 971d fe7c 4868 fadc 605a 22e7 4a16 0...|.hH..Z`.".J
  82376. 803b0cf: 4b1c 1e79 9b09 3264 3a16 d6fe 2316 a58e .Ky...d2.:...#..
  82377. 803b0df: 3f4d 1196 0777 4547 1949 0b70 ddc7 35e9 M?..w.GEI.p....5
  82378. 803b0ef: 6816 4429 d0dd 2e65 b32f f850 0ea2 e80a .h)D..e./.P.....
  82379. 803b0ff: 58fb f4a9 f12b 429b 6ae4 8890 6b0b a97d .X..+..B.j...k}.
  82380. 803b10f: 97af 93aa 981f f8f8 79fa 4af8 a430 49ec .........y.J0..I
  82381. 803b11f: 32c4 cb99 f291 cb34 f870 7425 9e14 aa44 .2....4.p.%t..D.
  82382. 803b12f: a1d9 dd4b ae9d 84fe 2b29 8fe1 e505 b322 ..K.....)+....".
  82383. 803b13f: b1c9 1b84 b512 9c3f 82a7 04b8 19b9 6547 ......?.......Ge
  82384. 803b14f: de64 9579 04cb acd9 7e13 43e4 0254 e120 d.y......~.CT. .
  82385. 803b15f: 5cf3 4d01 84d8 6326 b411 f6cc 1059 cf08 .\.M..&c....Y...
  82386. 803b16f: 9c10 026a e1c4 0b08 b89a ddc8 ddbb 106e ..j...........n.
  82387. 803b17f: 068c 7a76 9fc1 c7e4 cb32 b1a0 cf21 9953 ..vz....2...!.S.
  82388. 803b18f: 62e4 5e28 972b c2d4 1048 2828 4723 db16 .b(^+...H.((#G..
  82389. 803b19f: 65dd 003a b9e3 1c2d cfa7 0b40 2077 c675 .e:...-...@.w u.
  82390. 803b1af: 7936 6594 2332 b38e b730 b84a 5bcd 40b1 6y.e2#..0.J..[.@
  82391. 803b1bf: 3f39 9995 b509 cc91 0dec 6ac8 34a2 9a3f 9?.........j.4?.
  82392. 803b1cf: d71f 8708 07a0 0d0b bf8d d059 d9f5 e841 ..........Y...A.
  82393. 803b1df: 22c5 ab19 cf89 1d3a 3c27 2f63 083c 347e ."....:.'<c/<.~4
  82394. 803b1ef: b983 029e 0458 c6f0 0c26 3ae6 0b5f f2a0 ....X...&..:_...
  82395. 803b1ff: 8534 f7b4 d270 a503 28b2 142c 4962 87cb 4...p....(,.bI..
  82396. 803b20f: 5853 8ef0 1e3d 9b69 9a00 f061 22fc 6c52 SX..=.i...a.."Rl
  82397. 803b21f: f262 e684 d082 6698 9cd3 b5f4 1e5c 70ac b......f....\..p
  82398. 803b22f: 4263 89f3 c397 f05b 27fd 01c4 f960 38fa cB....[..'..`..8
  82399. 803b23f: 6c43 1d73 0060 3862 dce4 5a67 cf0a 51e6 Cls.`.b8..gZ...Q
  82400. 803b24f: 1692 820a f640 9b30 313f 885f 758d 4cba ....@.0.?1_..u.L
  82401. 803b25f: 34c4 892a 32be 0d3f a2c5 0417 606c 46f4 .4*..2?.....l`.F
  82402. 803b26f: b508 d4ee ede8 fd92 711e 1ffa 01a0 a2c9 .........q......
  82403. 803b27f: 28e5 52a8 1a65 c150 ce18 7e65 babb 3498 .(.Re.P...e~...4
  82404. 803b28f: c984 fac2 beaa 0b05 4ed5 70e5 3f13 b560 .........N.p.?`.
  82405. 803b29f: 389b 64dc 88a4 9d80 17f1 4b35 8e00 6468 .8.d......5K..hd
  82406. 803b2af: 000b 105e a750 87c2 1122 a339 c0a9 403a ..^.P...".9...:@
  82407. 803b2bf: 516f 12ae e4d2 2e2b eb5a ac66 2469 80f3 oQ....+.Z.f.i$..
  82408. 803b2cf: 4876 3a40 6f15 2468 c3b3 7d6e ceae 87cf vH@:.oh$..n}....
  82409. 803b2df: 7f88 0be4 87f8 3640 e85b 3030 9cbf a7ce ......@6[.00....
  82410. 803b2ef: baf7 dbdd b6ec 2e46 0797 43bc 4b7c 4ebc ......F....C|K.N
  82411. 803b2ff: fbe1 cb5c 94f4 fcfc 7864 808a c649 b3b6 ..\.....dx..I...
  82412. 803b30f: c158 332a 0856 a378 1adb c11e 9b74 5aa4 X.*3V.x.....t..Z
  82413. 803b31f: 46c9 70f4 b852 b756 7d67 1341 77ab e7ff .F.pR.V.g}A..w..
  82414. 803b32f: ab5d eddb bfeb 0b3d f9c7 2bad d143 4e2f ].....=....+C./N
  82415. 803b33f: 3f9f 0db3 953e e257 ff3e a13f 0193 3416 .?..>.W.>.?....4
  82416. 803b34f: 4016 a465 ad3c e5bd e8a1 32a4 9db5 2e01 .@e.<......2....
  82417. 803b35f: 2031 fc7d 9777 bcf8 b244 ad12 8745 84bc 1 }.w...D...E...
  82418. 803b36f: ecbd d8da 634e 8361 2073 2f7e e956 a340 ....Nca.s ~/V.@.
  82419. 803b37f: f0ae 5981 1d7c d0b3 ad11 1661 d81d d022 ...Y|.....a...".
  82420. 803b38f: 4126 ce99 6172 f26b b306 3e50 604b ae42 &A..rak...P>K`B.
  82421. 803b39f: 8802 8ac0 06be ab8e cc91 1362 cec1 499f ..........b....I
  82422. 803b3af: 8d15 a8e6 442c 8565 55c0 a09b 8927 0850 ....,De..U..'.P.
  82423. 803b3bf: 0513 e77f 4b2f 454c 1969 c818 597b a06f ..../KLEi...{Yo.
  82424. 803b3cf: 41b3 3b8e 8dfd 1455 2854 0284 5bd6 c917 .A.;..U.T(...[..
  82425. 803b3df: 2cc5 6262 945f 38f8 3f28 9a5f 5acf dad2 .,bb_..8(?_..Z..
  82426. 803b3ef: 255a 51a7 ea1a 497d 3a33 51d5 5ce0 6056 Z%.Q..}I3:.Q.\V`
  82427. 803b3ff: 5f84 461a 6eac 4abf ea94 da2e c96f 3534 ._.F.n.J....o.45
  82428. 803b40f: 6318 def5 39b1 cbcd bbbd f737 94c4 f146 .c...9....7...F.
  82429. 803b41f: 39a2 0b98 4d16 3c69 4794 4251 b9b3 c006 .9...Mi<.GQB....
  82430. 803b42f: 30f2 1e9b 221e 90c5 551e dc6e d96d 3438 .0..."...Un.m.84
  82431. 803b43f: 43c4 b0f9 6ee4 2cb8 32e3 0e74 48b8 819b .C...n.,.2t..H..
  82432. 803b44f: fa85 bd04 4b8a 50e9 8160 666e e33c c12c .....K.P`.nf<.,.
  82433. 803b45f: bd07 d77e 30af 1d82 841c 7e8d cb34 dce8 ..~..0.....~4...
  82434. 803b46f: 9ef0 5cd0 2877 3b86 6a0c 8481 5d85 a1d2 ...\w(.;.j...]..
  82435. 803b47f: 2a2e 6b2d f62f 62f4 a9cf 6e85 bc2a ed79 .*-k/..b...n*.y.
  82436. 803b48f: 8af0 9a21 3156 c264 2aa7 47c9 75f2 b6a9 ..!.V1d..*.G.u..
  82437. 803b49f: d941 6008 9ae4 325f a5d5 0f23 41c2 bfd8 A..`.._2..#..A..
  82438. 803b4af: b85c 2a64 9cf2 058e 1289 bdab 757f b765 \.d*.........ue.
  82439. 803b4bf: bd3f 2c8a 1b20 f467 c7ad 8e22 f5a5 992b ?.., .g..."...+.
  82440. 803b4cf: 7cc5 2507 848b 2663 d463 0fdb ac08 02c8 .|.%..c&c.......
  82441. 803b4df: 49f2 7bb7 feff 7bbd 559a b8a1 147f 8af3 .I.{...{.U......
  82442. 803b4ef: ec10 11a3 4f7a e497 7913 a1f1 3533 a04d ....zO...y..35M.
  82443. 803b4ff: 1bbb 6452 87f1 4188 ec12 9cf4 2b45 cb05 ..Rd...A....E+..
  82444. 803b50f: ef0e aaea a4b5 bbfb 2bab eed2 b6e5 dc77 .........+....w.
  82445. 803b51f: ea30 5b87 c741 a07d c783 334b a4a9 6eee 0..[A.}...K3...n
  82446. 803b52f: 8a90 bc5c 3e7e f702 9d96 8ea0 d280 61e3 ..\.~>.........a
  82447. 803b53f: 5e10 755d 9557 6aaf ea22 e4fe f430 4b9d .^]uW..j"...0..K
  82448. 803b54f: 38d4 deed 10b3 ae65 73a9 dfa1 84e9 7955 .8....e..s....Uy
  82449. 803b55f: efdb ca2d ae7e ad6a 1ddb 7377 739e 1f59 ..-.~.j...ws.sY.
  82450. 803b56f: d16d 9d26 5eec 90f7 480e 0317 7109 b43a m.&..^...H...q:.
  82451. 803b57f: d009 4310 dd5c 5374 d43b ac58 a02b 38ed ...C\.tS;.X.+..8
  82452. 803b58f: e21d f421 a5cb f413 1399 e9db caf4 4355 ..!...........UC
  82453. 803b59f: 8bf6 8e22 8d7f 0049 c4cb 515a 963e 9645 .."...I...ZQ>.E.
  82454. 803b5af: ee1b 6afe 24ed d04a 6d42 9eae b40a 5c84 ...j.$J.Bm.....\
  82455. 803b5bf: 2eaf 1e4c 19d7 ab56 a75f 7728 5045 0ad7 ..L...V._.(wEP..
  82456. 803b5cf: a29f 5d35 4b95 dae8 581e cdd0 f661 e508 ..5].K...X..a...
  82457. 803b5df: d46b 5ca0 d1cd ca6b b294 cd48 a003 0a2c k..\..k...H...,.
  82458. 803b5ef: 2d76 a804 d06f 2cbe a8eb b7e6 ac1b 3a71 v-..o..,......q:
  82459. 803b5ff: c4f7 b767 5d79 7e92 132b 7cf1 0234 4398 ..g.y].~+..|4..C
  82460. 803b60f: e04d d882 68e7 5bc4 f692 6b59 ddbc cfae M....h.[..Yk....
  82461. 803b61f: 6a47 4cdd a6c1 2d34 b616 57e3 29e1 3d13 Gj.L..4-...W.).=
  82462. 803b62f: b481 8cdd 5980 f20b ed9d be51 0bbb 63cf .....Y....Q....c
  82463. 803b63f: 95bf b425 1350 e034 0406 2f5b 9b09 d057 ..%.P.4...[/..W.
  82464. 803b64f: 3f43 e50a 17d6 3303 b3df dbad cd14 f31b C?.....3........
  82465. 803b65f: e1ca 15ea d19d 659c aa51 33fa 7119 ebbb .......eQ..3.q..
  82466. 803b66f: c4f8 ad65 9fc9 ff2c f182 0ffe e798 b7bf ..e...,.........
  82467. 803b67f: d26c 2969 e85b 1b11 4b71 cd1c 1321 b6d3 l.i)[...qK..!...
  82468. 803b68f: 99a3 33d6 0623 4063 3569 1224 b57c e786 ...3#.c@i5$.|...
  82469. 803b69f: 7272 8bd4 bf28 57ab b80b f36c 6319 70b1 rr..(..W..l..c.p
  82470. 803b6af: 5037 2d74 23d9 61b5 9df8 255b 4716 d9dc 7Pt-.#.a..[%.G..
  82471. 803b6bf: 5ddd 6543 680d ac37 e5ba 067d 1b7a 88de .]Ce.h7...}.z...
  82472. 803b6cf: a143 da96 e989 f639 2475 a363 e50c b290 C.....9.u$c.....
  82473. 803b6df: 71f3 0b26 bd3c 2c68 192f caab 55e1 bdc8 .q&.<.h,/....U..
  82474. 803b6ef: 3622 bd88 b24e 67c2 b8d3 776d 5a68 dbb6 "6..N..g..mwhZ..
  82475. 803b6ff: a7a1 aa19 72f1 525d 7755 d86e ad70 7998 .....r]RUwn.p..y
  82476. 803b70f: eac0 3eba f2af c375 980c 94ab 9919 fb58 ...>..u.......X.
  82477. 803b71f: a1f2 2c4a dbfc 7ae7 cd46 a3f6 2664 2532 ..J,...zF...d&2%
  82478. 803b72f: 76b8 5b7c b225 56fc 0a07 6e5e 65fe 7e9e .v|[%..V..^n.e.~
  82479. 803b73f: c7be d0ab eb9b 693f 6432 6b6b a9c6 05a2 ......?i2dkk....
  82480. 803b74f: 71d3 846b 23df 359d 41af 0edb 73d9 f0f7 .qk..#.5.A...s..
  82481. 803b75f: b09c 5ae7 ca45 8101 6a29 83b0 5fe0 158f ...ZE...)j..._..
  82482. 803b76f: 2ce6 a42a ba06 ba98 31ed 309a 1f11 db99 .,*......1.0....
  82483. 803b77f: 7794 70c6 e5b0 6e69 6775 aefe 5f3b 2cd0 .w.p..inug..;_.,
  82484. 803b78f: 3741 bad9 6eb4 3568 4d92 8669 8997 62a7 A7...nh5.Mi....b
  82485. 803b79f: 02a4 b3f2 7114 37c1 f1ac 5877 3fe2 b7cb .....q.7..wX.?..
  82486. 803b7af: c378 4efa fe6f 360f af28 cbf1 b68f 4604 x..No..6(......F
  82487. 803b7bf: d5f6 432d e7c9 e4c8 ae1c 123a ef98 ca04 ..-C......:.....
  82488. 803b7cf: fade d326 860f 24cf b917 b979 e11a e2fd ..&....$..y.....
  82489. 803b7df: 6249 6937 bce4 0537 9b4d 91bb 2d83 0ade Ib7i..7.M....-..
  82490. 803b7ef: 9ac5 7f15 f0fd 4c4c 4ce5 6f94 7896 5ad6 ......LL.L.o.x.Z
  82491. 803b7ff: fff8 8b05 d809 5f38 0015 0000 a800 ......8_.....
  82492. 0803b80c <file__main_js>:
  82493. 803b80c: 13a8 0804 cad2 0803 cade 0803 2925 0000 ............%)..
  82494. 803b81c: 0001 0000 ....
  82495. 0803b820 <Content_Length>:
  82496. 803b820: 6f43 746e 6e65 2d74 654c 676e 6874 203a Content-Length:
  82497. 803b830: 0000 0000 ....
  82498. 0803b834 <file__rotek_png>:
  82499. 803b834: 4388 0804 95e1 0803 95ed 0803 1802 0000 .C..............
  82500. 803b844: 0001 0000 ....
  82501. 0803b848 <file__index_html>:
  82502. 803b848: 4374 0804 f403 0803 f40f 0803 04e3 0000 tC..............
  82503. 803b858: 0001 0000 ....
  82504. 0803b85c <UTF8_BOM>:
  82505. 803b85c: bbef 00bf ....
  82506. 0803b860 <data__settings_html>:
  82507. 803b860: 732f 7465 6974 676e 2e73 7468 6c6d 0000 /settings.html..
  82508. 803b870: 5448 5054 312f 312e 3220 3030 4f20 0d4b HTTP/1.1 200 OK.
  82509. 803b880: 530a 7265 6576 3a72 6c20 4977 2f50 2e31 .Server: lwIP/1.
  82510. 803b890: 2e33 2031 6828 7474 3a70 2f2f 6173 6176 3.1 (http://sava
  82511. 803b8a0: 6e6e 6861 6e2e 6e6f 6e67 2e75 726f 2f67 nnah.nongnu.org/
  82512. 803b8b0: 7270 6a6f 6365 7374 6c2f 6977 2970 0a0d projects/lwip)..
  82513. 803b8c0: 6f43 746e 6e65 2d74 654c 676e 6874 203a Content-Length:
  82514. 803b8d0: 3534 3433 0a0d 6f43 6e6e 6365 6974 6e6f 4534..Connection
  82515. 803b8e0: 203a 6c43 736f 0d65 430a 6e6f 6574 746e : Close..Content
  82516. 803b8f0: 742d 7079 3a65 7420 7865 2f74 7468 6c6d -type: text/html
  82517. 803b900: 0a0d 6f43 746e 6e65 2d74 6e45 6f63 6964 ..Content-Encodi
  82518. 803b910: 676e 203a 7a67 7069 0a0d 0a0d 8b1f 0008 ng: gzip........
  82519. 803b920: 0000 0000 0a04 5bdd 736b d51b fe19 cb2b .......[ks....+.
  82520. 803b930: 3286 d8f2 2d92 205f 9638 343a 9949 14cc .2...-_ 8.:4I...
  82521. 803b940: 10f0 e053 6793 ad2d 25ad aed2 5dd8 49d9 ..S..g-..%...].I
  82522. 803b950: 6619 8172 8742 4214 9680 10a1 bd08 a17e .fr.B..B......~.
  82523. 803b960: 2435 e701 fe66 eac2 f51f de79 f673 6926 5$..f.....y.s.&i
  82524. 803b970: 2565 fa71 1fa1 ef64 9ced 9cf3 fef7 e7be e%q...d.........
  82525. 803b980: 959c 4e27 74bc ed7c d5f5 4693 ec2b ebb4 ..'N.t|....F+...
  82526. 803b990: fc2b b46b 772d 66ab b89a adb3 7d66 63a5 +.k.-w.f....f}.c
  82527. 803b9a0: 9687 68d1 7e59 8760 b335 6e17 8f96 9de2 ...hY~`.5..n....
  82528. 803b9b0: 6d3c 6185 6cb7 d9bf b673 e66b e56b 9e57 <m.a.l..s.k.k.W.
  82529. 803b9c0: 1f2b 3af7 2b5d 3674 b6da 3469 373c 5db4 +..:]+t6..i4<7.]
  82530. 803b9d0: 3934 b275 3766 ecb7 91b8 756b 9aec edb9 49u.f7....ku....
  82531. 803b9e0: 3bd8 cf5d 330f eddf cd38 55b0 da6b 4edb .;]..3..8..Uk..N
  82532. 803b9f0: 2ec3 cdcb e38c a13a b563 41cb 6ac3 b5db ......:.c..A.j..
  82533. 803ba00: 4cea 3ac7 74eb 9d7a bee4 d817 dcbe 1858 .L.:.tz.......X.
  82534. 803ba10: 36b2 2187 2742 db6c e8f5 68ab 7fb7 7fa1 .6.!B'l....h....
  82535. 803ba20: 7fb1 da3e 6e8f 7747 bda2 5995 66f5 eda5 ..>..nGw...Y.f..
  82536. 803ba30: 67b8 968c 6f6f ccd6 e58e 95b8 1046 8698 .g..oo......F...
  82537. 803ba40: b76f 666b 9e10 db6b cb41 43b6 13f4 7c34 o.kf..k.A..C..4|
  82538. 803ba50: 1ba7 e11a 2eb9 86c0 d9f6 f670 6b0d 52db ..........p..k.R
  82539. 803ba60: 4d4f f023 351b f7d3 76da 8de5 1f00 aacf OM#..5...v......
  82540. 803ba70: b8e7 2450 f0db e79a 2bea 674d 70db 359a ..P$.....+Mg.p.5
  82541. 803ba80: e1b3 dcf5 bcb0 5be3 7c5d 7b9a f4d8 5c76 .......[]|.{..v\
  82542. 803ba90: eb3c a3d6 802f bef3 7bc6 ba37 dd1b 9fea <.../....{7.....
  82543. 803baa0: a237 fbef a297 b89b 68bc 3f44 49f3 2b74 7........hD?.It+
  82544. 803bab0: 29fa 8dda f46e e3cf 8fc5 bbb8 f46f 8bdf .)..n.......o...
  82545. 803bac0: 185f 412b 72d7 0333 bdba 86ce 9bed 25f5 _.+A.r3........%
  82546. 803bad0: c3c0 ba9b bfd1 2680 d077 7ef4 b374 32b2 .......&w..~t..2
  82547. 803bae0: 05db a05c 40c9 816a f6f1 15aa 3b04 df9e ..\..@j......;..
  82548. 803baf0: ae04 cf4d 18ef 2356 3c74 f217 8060 2de5 ..M...V#t<..`..-
  82549. 803bb00: f30f 7ae9 2901 d404 a3d7 447b ed11 e012 ...z.)....{D....
  82550. 803bb10: 10ae 6efb 23ff 3d43 a1f9 2eff 7526 88d3 ...n.#C=....&u..
  82551. 803bb20: e07e 7bc8 0764 be3e bfd7 6064 f852 596c ~..{d.>...d`R.lY
  82552. 803bb30: 0420 db76 846e 1286 b68a e5b7 ebb8 36bc .v.n..........6
  82553. 803bb40: 44d5 8872 015e 21b3 6d2e ac00 c499 a656 .Dr.^..!.m....V.
  82554. 803bb50: 8188 000b 75e3 d289 b6d8 3dda cbf0 47ac .....u.....=...G
  82555. 803bb60: fb57 441f 0bdf f66d 2e38 ee01 d463 a0cb W..D..m.8...c...
  82556. 803bb70: 7ee0 03f4 12c0 500c ccac a6aa 5d83 b250 .~.....P.....]P.
  82557. 803bb80: 3acc 16ff 617d 3b35 b80e ff27 6fd2 d566 .:..}a5;..'..of.
  82558. 803bb90: ea84 1b2b fabe 6e39 17b7 6cca 76bc bbb3 ..+...9n...l.v..
  82559. 803bba0: 34d3 4cb5 6375 8f3a 919c 6dd1 0d5b 85bb .4.Luc:....m[...
  82560. 803bbb0: b626 335f 6fa3 e715 7ffa f688 dba2 6259 &._3.o........Yb
  82561. 803bbc0: 4e5f 2208 83b4 3a64 03bf e601 c0e7 eb2e _N."..d:........
  82562. 803bbd0: db6c b776 52a0 f566 5369 9853 3018 2830 l.v..Rf.iSS..00(
  82563. 803bbe0: 8c36 85cf 3e46 be24 48af 5054 91fc 71b0 6...F>$..HTP...q
  82564. 803bbf0: f1fc 7cd8 6bbb 305b 4a19 1f2b 8288 0b5f ...|.k[0.J+..._.
  82565. 803bc00: 8bc2 3ed1 14a4 d112 4cbf 3d29 d03c 2b2f ...>.....L)=<./+
  82566. 803bc10: 8364 5564 3740 617a b9e8 a45a 5edb 9760 d.dU@7za..Z..^`.
  82567. 803bc20: bd09 9b0c 7d0a 184b 11b8 06ba e57e 9f26 .....}K.....~.&.
  82568. 803bc30: 65fa ddc7 fdb6 86d0 68bc 8ea1 41ae b566 .e.......h...Af.
  82569. 803bc40: 99be 6375 0945 1a96 e821 746d da1c a552 ..ucE...!.mt..R.
  82570. 803bc50: 711c 4157 d1af 31b0 da52 e797 da36 e34e .qWA...1R...6.N.
  82571. 803bc60: 8c0c 1d97 7cf6 7617 6edd 399c d4ae d5ec .....|.v.n.9....
  82572. 803bc70: a513 99a9 aa27 01f9 067f 76bd 30a1 3342 ....'......v.0B3
  82573. 803bc80: cd88 152c b62f a91c d0fd bb03 f6d6 e586 ..,./...........
  82574. 803bc90: d643 aff8 b4dc ad37 9b5e 2dca 9bb7 59ce C.....7.^..-...Y
  82575. 803bca0: 59bb bd0e 0cd8 dae6 6994 a939 b472 f590 .Y.......i9.r...
  82576. 803bcb0: 4b15 689b 6dc7 67da 742b c94b 20e4 1ee8 .K.h.m.g+tK.. ..
  82577. 803bcc0: 5881 1479 8b71 8a23 1dce eddb 1d95 0818 .Xy.q.#.........
  82578. 803bcd0: 69fd 1daf 0713 6268 b844 5f54 a2f3 d70e .i....hbD.T_....
  82579. 803bce0: 7230 7ae0 b5f4 b718 525d 369f ffba 1a81 0r.z....]R.6....
  82580. 803bcf0: df9d db67 41c0 8e86 15bb f1e4 80d2 c36e ..g..A........n.
  82581. 803bd00: 8dfb 49f2 c39c 2f60 bb8e a9e9 ea1e e7d1 ...I..`/........
  82582. 803bd10: 0a70 88ef decc 8403 83df 300b a358 b51a p..........0X...
  82583. 803bd20: 209c fcf4 7173 3fbb 2ff5 6f81 cc30 ddd1 . ..sq.?./.o0...
  82584. 803bd30: fbf4 1ed9 fc3c cb10 97e8 34ba caac 8955 ....<......4..U.
  82585. 803bd40: 06cf 5a2d 91d5 f180 0578 e4a4 10b7 a74b ..-Z....x.....K.
  82586. 803bd50: 6709 b9ef 0de5 2cef ccc9 c5fe f067 2f35 .g.....,....g.5/
  82587. 803bd60: 4b20 fbb1 6848 d8d3 5272 b257 d2fa 35e9 K..Hh..rRW....5
  82588. 803bd70: 8cb4 629d 6d68 3be0 d2b4 a1a2 d5ee 3207 ...bhm.;.......2
  82589. 803bd80: fa6e 1c1c 15a3 92cb 48ff 76e0 a9ba 2812 n........H.v...(
  82590. 803bd90: afba 1b59 fd66 8bf4 ac2f 74a6 b5c8 5c71 ..Y.f.../..t..q\
  82591. 803bda0: 07af 166f 075d dec5 7585 a785 03b8 00bb ..o.]....u......
  82592. 803bdb0: 0c5f dde2 b701 780b c47d c3b5 b61d 48a3 _......x}......H
  82593. 803bdc0: 3ac0 fad3 9789 1ba1 503c 8e52 afc0 cc30 .:......<PR...0.
  82594. 803bdd0: 1dd1 179c bb05 0050 b7d1 3d9a 9307 ae8d ......P....=....
  82595. 803bde0: 1460 c16d 0818 938c 2387 086e d052 320d `.m......#n.R..2
  82596. 803bdf0: b86a 1597 019b 2031 f2af 0384 11d5 d82f j.....1 ....../.
  82597. 803be00: bac2 c46d 2e03 3743 48b2 9f53 db2f afa2 ..m...C7.HS./...
  82598. 803be10: f610 b898 2449 fb91 8188 1190 c1c0 39d3 ....I$.........9
  82599. 803be20: f96f 6f5e f740 5e1b 60db b270 5d5e 36f7 o.^o@..^.`p.^].6
  82600. 803be30: e7d7 50c9 c36b 1b6e 1e10 6786 05ae 784b ...Pk.n....g..Kx
  82601. 803be40: 356a 8791 cfa1 fc85 1ea4 a5e3 742a ad89 j5..........*t..
  82602. 803be50: 6073 9a87 ece4 0326 a4bb 4a77 126c 8852 s`....&...wJl.R.
  82603. 803be60: 6788 a810 2500 107d d26b bc28 49f3 4397 .g...%}.k.(..I.C
  82604. 803be70: e7a3 cf00 3e3f 80c0 8030 c498 ca55 0a3f ....?>..0...U.?.
  82605. 803be80: c2f2 9084 1e17 641f 1840 bc80 1630 e2f2 .......d@...0...
  82606. 803be90: 9084 1f17 641f 1840 bc80 1638 d2f2 9084 .....d@...8.....
  82607. 803bea0: b211 2e3f 0649 0184 4bc8 e409 df21 2430 ..?.I....K..!.0$
  82608. 803beb0: 59be f4f5 b0e1 1bd7 a75e 43d3 7692 78ae .Y......^..C.v.x
  82609. 803bec0: 2f66 3be3 8903 faa1 d0ee 3667 4308 6ecd f/.;......g6.C.n
  82610. 803bed0: 69f0 1836 274e d19c 1d84 09df 49ed f3a6 .i6.N'.......I..
  82611. 803bee0: 3f2a 8c7c 19f3 a202 3426 78f4 8cf4 0b14 *?|.....&4.x....
  82612. 803bef0: 7fb3 df63 1caa 6c5d b5c3 078d 8beb fb0d ..c...]l........
  82613. 803bf00: 9f58 5878 bef6 18b5 4a43 6d84 fb5e e882 X.xX....CJ.m^...
  82614. 803bf10: 6653 708d 70c2 f061 f77b 8795 69d5 fd25 Sf.p.pa.{....i%.
  82615. 803bf20: 6b72 f911 333e b8ff b90b 9cc1 9542 8786 rk..>3......B...
  82616. 803bf30: c148 56c2 5c92 872b 428e 4b40 463d 82d2 H..V.\+..B@K=F..
  82617. 803bf40: 11ae 4958 c85e e06c 3316 7dd5 54c9 fbf7 ..XI^.l..3.}.T..
  82618. 803bf50: 211f 427e a03c 9fbe 5f65 2968 9115 e550 .!~B<...e_h)..P.
  82619. 803bf60: d2f7 b37d b70e a213 c24c 2e5f 6d99 083a ..}.....L._..m:.
  82620. 803bf70: e864 e55d bb42 9cc5 198f 39cc bf51 be88 d.].B......9Q...
  82621. 803bf80: 1c01 a8a6 10f7 dc86 4c47 3172 2d4d 39f3 ........GLr1M-.9
  82622. 803bf90: 156e ff1f 2259 a18d 930f 541c 6980 0ae8 n...Y".....T.i..
  82623. 803bfa0: acf3 2890 04f6 de19 d427 3c4f 38f1 7cce ...(....'.O<.8.|
  82624. 803bfb0: e4c3 bf19 29db 3e57 e950 21fe e5f0 cd73 .....)W>P..!..s.
  82625. 803bfc0: f780 0184 1e77 019a a7be 2019 9317 8030 ....w...... ..0.
  82626. 803bfd0: fd34 3202 92c1 9ec1 5694 7e20 b408 d250 4..2.....V ~..P.
  82627. 803bfe0: 0e60 d0c4 224e d1f0 0325 5878 f8c4 b12c `...N"..%.xX..,.
  82628. 803bff0: 6c3c 700f 0c78 8d55 27d3 52d7 8fb6 a6e0 <l.px.U..'.R....
  82629. 803c000: 3c96 0fc4 2523 f7cf fee0 7929 f172 34ff .<..#%....)yr..4
  82630. 803c010: 59f1 7aad 3179 651e 24ee cf3c 05d8 ad06 .Y.zy1.e.$<.....
  82631. 803c020: 5807 03bb f923 b2c3 5979 63b5 8dfe 09f4 .X..#...yY.c....
  82632. 803c030: 52d5 091d d6c7 b94f 7ada 5c2e 6c95 c99d .R....O..z.\.l..
  82633. 803c040: f696 cde1 a356 6dab 5c8c bb21 5497 361e ....V..m.\!..T.6
  82634. 803c050: f707 43a7 b42b 534b 15a8 8120 f165 12eb ...C+.KS.. .e...
  82635. 803c060: 5a44 3ed5 ad4e 2196 37d1 a821 fab7 4417 DZ.>N..!.7!....D
  82636. 803c070: 99b8 d058 e616 1f24 5355 871d 1228 fc67 ..X...$.US..(.g.
  82637. 803c080: d3a5 9ab5 644d 5a8d 12ba b1f8 c8f9 808f ....Md.Z........
  82638. 803c090: 93a1 ac6a 3768 2994 3be9 8e4b 0a98 3771 ..j.h7.).;K...q7
  82639. 803c0a0: e9b9 101f c7ad 9490 d4c3 b177 cba9 df40 ..........w...@.
  82640. 803c0b0: 99da f618 a0fb 87da b5cc 1d0e 412c a028 ............,A(.
  82641. 803c0c0: 1ab8 b201 0563 8a67 4661 825f 6253 549b ....c.g.aF_.Sb.T
  82642. 803c0d0: f361 6e26 23e8 8653 161d 1551 850e ae54 a.&n.#S...Q...T.
  82643. 803c0e0: ac63 a559 d753 521c 49b2 db9d b2c6 5931 c.Y.S..R.I....1Y
  82644. 803c0f0: 01ac 49fc 8c1a 469e 2604 960f 324c 1879 ...I...F.&..L2y.
  82645. 803c100: c2e7 c0ae b3b2 8e18 3482 c0eb 7f94 d000 .........4......
  82646. 803c110: c641 a2f7 b408 b7f7 5348 1a06 88aa 4ba7 A.......HS.....K
  82647. 803c120: 718f 4f45 7f4b 6f5c 05d3 d32f ca48 1b6c .qEOK.\o../.H.l.
  82648. 803c130: b856 0766 e961 cdad db9e 7e58 cdea 179e V.f.a.....X~....
  82649. 803c140: 431e a6a5 aeab 86de a272 c7ac f8ca 2aae .C......r......*
  82650. 803c150: d247 18dd 85b8 f25a cae1 1aac e509 c3be G.....Z.........
  82651. 803c160: bf1b 04e9 ce5c b2d9 2033 4918 4cfc 8d2d ....\...3 .I.L-.
  82652. 803c170: 64ee 6786 7ea5 00df 1015 a093 f5ec 6e11 .d.g.~.........n
  82653. 803c180: 0f1f d0a4 68e9 3334 5cbc b27e b0a4 a085 .....h43.\~.....
  82654. 803c190: 7add 72fa 22aa 50b5 db21 c468 c109 99b2 .z.r.".P!.h.....
  82655. 803c1a0: 18ca 4a3d 23ea 59d9 6097 f708 fba2 8753 ..=J.#.Y.`....S.
  82656. 803c1b0: f4aa 8aba cd5b e657 9851 caa7 f324 4c4c ....[.W.Q...$.LL
  82657. 803c1c0: aa41 2352 ec2d d241 623d e93d c421 d098 A.R#-.A.=b=.!...
  82658. 803c1d0: 4794 5759 f995 f468 4f8a f542 1407 f653 .GYW..h..OB...S.
  82659. 803c1e0: f58f b2be 6f6f 1e78 55cb 8b5f c815 732e ....oox..U_....s
  82660. 803c1f0: 44fd 788d fed4 5d7b 2a14 6c59 86bb 2135 .D.x..{].*Yl..5!
  82661. 803c200: fb29 f44b f12a 9d3d b5e3 8064 fae1 de68 ).K.*.=...d...h.
  82662. 803c210: 1db3 7744 3bac f5ea 0d39 e1fc c74d ab2b ..Dw.;..9...M.+.
  82663. 803c220: 57a7 1dbd 7fdb 7369 6733 143e 32b1 9bba .W....is3g>..2..
  82664. 803c230: 1759 6030 2ec4 6282 5af0 5f0c 4019 f4b3 Y.0`...b.Z._.@..
  82665. 803c240: 88f7 a446 8908 b9b7 60a9 58cc a19b 27ed ..F......`.X...'
  82666. 803c250: db5a 06eb 6f5d 9e5d f7a9 bd59 da25 a018 Z...]o]...Y.%...
  82667. 803c260: 2304 bc09 5509 7756 c950 7dae effe 3635 .#...UVwP..}..56
  82668. 803c270: c733 9d01 3acd d8c6 ea25 ee12 7903 91c4 3....:..%....y..
  82669. 803c280: ded5 eb31 8798 34e1 2459 e31c 5f34 ee7e ..1....4Y$..4_~.
  82670. 803c290: a9c4 4e57 42cb 38b2 b86b 656c 3855 d8cf ..WN.B.8k.leU8..
  82671. 803c2a0: 3d4e 4452 07eb b6eb 94cb eb1e b45e d90e N=RD........^...
  82672. 803c2b0: 34fb 05ba 9d39 905e 6f89 0eaf 548a d851 .4..9.^..o...TQ.
  82673. 803c2c0: fe8a 7a58 2ccf e724 9bf5 1c39 fa4b a6ba ..Xz.,$...9.K...
  82674. 803c2d0: a87c 401e 27cf 5f1e 54c5 a029 b038 44ca |..@.'._.T).8..D
  82675. 803c2e0: 78aa f7a9 a848 bd75 ac61 ec08 98e1 2451 .x..H.u.a.....Q$
  82676. 803c2f0: 13d0 32ce 51e2 e962 e464 a504 9202 3aa9 ...2.Qb.d......:
  82677. 803c300: 2c8d b1a3 d71d 6390 1861 a0c4 d297 2964 .,.....ca.....d)
  82678. 803c310: c1fe 1f41 e2b0 09ab 002c dc52 3380 b49a ..A.....,.R..3..
  82679. 803c320: ec67 5531 d94b 7191 6b13 5c20 7d40 485c g.1UK..q.k \@}\H
  82680. 803c330: 4105 9482 3177 03d2 ffdc 7a01 6a3a c93b .A..w1.....z:j;.
  82681. 803c340: 2b21 b06a f563 96c2 d252 3af8 5055 2bbe !+j.c...R..:UP.+
  82682. 803c350: cf56 e124 9a84 25ed 592b 261f ce54 d05a V.$....%+Y.&T.Z.
  82683. 803c360: 75ec 4d6c 6d65 162b 89b1 8bb2 0ebf d8c5 .ulMem+.........
  82684. 803c370: 650c bab9 4467 067b d596 e818 b5ab 8475 .e..gD{.......u.
  82685. 803c380: 87fb 4965 9a33 0bdc 631b e294 929f 71cd ..eI3....c.....q
  82686. 803c390: 0a5f 2b76 8989 4247 e582 49c0 5a94 1cd7 _.v+..GB...I.Z..
  82687. 803c3a0: c2b5 eae5 3a8b 94c1 a9b1 bc1b ac18 9639 .....:........9.
  82688. 803c3b0: f3ab d415 4b1d bfcf 66b0 7ae0 6e79 ca6e .....K...f.zynn.
  82689. 803c3c0: be88 ca93 571b 58d5 b815 6333 a040 b190 .....W.X..3c@...
  82690. 803c3d0: 6683 e23f 2eaf a5fc aa15 617c 5cb2 66ad .f?.......|a.\.f
  82691. 803c3e0: ac7a 1eaa c925 9501 4731 c903 1eeb 0f6a z...%...1G....j.
  82692. 803c3f0: fa97 8c7f a36e ebeb f2e8 5e1e ca20 5d1b ....n......^ ..]
  82693. 803c400: 2b57 e757 1d32 a9ce 3f0e 2b41 ba42 fccd W+W.2....?A+B...
  82694. 803c410: a0ac b3dd b369 5567 2bab ea92 e249 d85c ....i.gU.+..I.\.
  82695. 803c420: 68ea eada 6aa8 2df5 28a2 65ee 2902 2620 .h...j.-.(.e.) &
  82696. 803c430: d4c8 2698 0ee1 bdeb 725a 2150 612c ff22 ...&....ZrP!,a".
  82697. 803c440: ae8a 3c88 c17d f08f 8c83 8921 4028 4cf7 ...<}.....!.(@.L
  82698. 803c450: ce3a f133 249c 7d05 9ee4 4e9f 7e7b f55a :.3..$.}...N{~Z.
  82699. 803c460: 0ffc 82c6 badc 5000 04dc 8aa5 13dd 07a0 .......P........
  82700. 803c470: be7f 1884 6570 331c 9c2e 52cb e23a 1a92 ....pe.3...R:...
  82701. 803c480: 6af1 4752 1967 4277 615a 8fb4 edf1 890d .jRGg.wBZa......
  82702. 803c490: 7762 f771 8c17 a28b e154 8bb8 b8e9 6a8b bwq.....T......j
  82703. 803c4a0: 2bdc d910 c2bb 6ca3 7709 fc68 872c 0e30 .+.....l.wh.,.0.
  82704. 803c4b0: 856e c836 fa35 6417 dddc b8b2 282a 0161 n.6.5..d....*(a.
  82705. 803c4c0: 16fb 702a 4a80 166d 1796 35a8 f55f 232f ..*p.Jm....5_./#
  82706. 803c4d0: 7eec 5d07 16c8 9d3b dc62 d31c a243 0b78 .~.]..;.b...C.x.
  82707. 803c4e0: fc0a 02c7 27e2 fa4c 032e 9277 d443 0404 .....'L...w.C...
  82708. 803c4f0: 5fec 6328 fffd 3e36 6940 2f00 853e 522a ._(c..6>@i./>.*R
  82709. 803c500: a05a 9892 0cb1 3859 4650 b5c3 5f82 3f67 Z.....Y8PF..._g?
  82710. 803c510: 8b68 972c 41dc 05d7 0364 0a2b cdbb b9aa h.,..A..d.+.....
  82711. 803c520: 3e26 2e97 8f10 3d50 2b64 6005 d48b b4d1 &>....P=d+.`....
  82712. 803c530: 9f91 7bb9 eb03 6a17 8119 8202 2091 fd6b ...{...j..... k.
  82713. 803c540: d00f 90b8 89df 001d 25b5 17ff 831d b1a6 .........%......
  82714. 803c550: ff42 8899 3ef3 2277 070a 89b1 3303 5fc4 B....>w".....3._
  82715. 803c560: e3b9 43fe 8cf4 4ffc 213d d5c7 48bd 000b ...C...O=!...H..
  82716. 803c570: 8e17 ce9a 5a73 335b 09f0 669c dc87 7843 ....sZ[3...f..Cx
  82717. 803c580: 0319 df30 1ec6 0c4d 0379 dc83 15e0 a29e ..0...M.y.......
  82718. 803c590: 274a 5645 3b98 a9dc 445d d17b 458f 4d14 J'EV.;..]D{..E.M
  82719. 803c5a0: 34f9 f9ad 05f4 18c9 20fd d003 92f0 fc5f .4....... ...._.
  82720. 803c5b0: 0b61 bb28 f3c6 437f 340e ae01 dff4 63c1 a.(....C.4.....c
  82721. 803c5c0: 6a2a 54e1 1216 997d 22d6 25f7 8279 8a26 *j.T..}..".%y.&.
  82722. 803c5d0: b43f f7c5 edb9 d285 eb4f 48cf db18 f150 ?.......O..H..P.
  82723. 803c5e0: 06f7 fb06 e658 ab06 4326 d77f 5f3f be8e ....X...&C..?_..
  82724. 803c5f0: a0a1 8546 9e42 096a 1406 e12d 4656 07d0 ..F.B.j...-.VF..
  82725. 803c600: 623d 22a8 a44a 3d7a 18bd 168b 9460 f621 =b."J.z=....`.!.
  82726. 803c610: e164 b01e a97c 55aa e360 dc45 867d 40fe d...|..U`.E.}..@
  82727. 803c620: f628 71a9 b6a2 ab87 f96f 68b5 b613 16a0 (..q....o..h....
  82728. 803c630: 168f 32ab 1346 9090 d90e 8b7d 53dd d5a3 ...2F.....}..S..
  82729. 803c640: 353f d378 e0da 467d 6bba 918a 2945 b0d5 ?5x...}F.k..E)..
  82730. 803c650: 059e 7404 c472 68ae 0187 0148 e416 e505 ...tr..h..H.....
  82731. 803c660: ff6e b47d 2317 3c5d 8264 4972 a4a1 bcad n.}..#]<d.rI....
  82732. 803c670: 2e87 0eb1 4e87 9988 1db6 8713 c1ce e026 .....N........&.
  82733. 803c680: 2c59 ca80 89aa 2281 a90d 8575 58d4 3caa Y,....."..u..X.<
  82734. 803c690: 1993 7168 ba09 b446 7bdc e148 e380 422e ..hq..F..{H....B
  82735. 803c6a0: fa98 699d 77ed 6fe0 8cd9 1681 90d0 2879 ...i.w.o......y(
  82736. 803c6b0: 46ba 04b7 722d 8d00 d0bf a4c4 722e bb5a .F..-r.......rZ.
  82737. 803c6c0: 4a48 7520 ee8c 7197 dfc9 1ee5 9351 cf74 HJ u...q....Q.t.
  82738. 803c6d0: 84e8 405c 5446 03ac 7fa9 d69f 1dfe 8ea2 ..\@FT..........
  82739. 803c6e0: 6066 3a1a 0a91 8894 75d4 69a5 92e8 d185 f`.:.....u.i....
  82740. 803c6f0: 78f3 09f7 8506 c876 1bdf 4445 8348 698e .x....v...EDH..i
  82741. 803c700: 741d 47fc 04b3 866a be4e 7225 bd74 6b8f .t.G..j.N.%rt..k
  82742. 803c710: 9a66 3ea8 eae3 641a b044 53cb c90c cafd f..>...dD..S....
  82743. 803c720: 9090 d242 9b3c 1fb8 230c 7b32 d605 8c8e ..B.<....#2{....
  82744. 803c730: 45dd 50e7 7451 7a04 0ba3 ddec 562c 4cb4 .E.PQt.z....,V.L
  82745. 803c740: 3568 d55d d5a1 e955 ce84 f101 04a8 8ace h5]...U.........
  82746. 803c750: 79d6 2e97 9736 0a35 e165 3ac5 cb89 04fa .y..6.5.e..:....
  82747. 803c760: 8253 17b0 27d1 1d13 574e 3db5 98a5 c0de S....'..NW.=....
  82748. 803c770: b00f 0985 41d7 2523 241c ecb8 1dd2 1df0 .....A#%.$......
  82749. 803c780: dd98 7c57 1981 f4c2 e88b f263 ee62 c955 ..W|......c.b.U.
  82750. 803c790: b46b 66da dd82 38e9 bdd8 7606 a430 6885 k..f...8...v0..h
  82751. 803c7a0: d7a3 42ab 6543 6f69 8c40 b794 9bf8 f4d0 ...BCeio@.......
  82752. 803c7b0: 5147 0e56 0f76 4b8a 8095 a5b0 4cf3 6a17 GQV.v..K.....L.j
  82753. 803c7c0: 8125 44c8 48ff c658 ff44 60df 7448 924d %..D.HX.D..`HtM.
  82754. 803c7d0: 4e1d 2fc0 31c3 97e0 348b 632b 1d21 2bfb .N./.1...4+c!..+
  82755. 803c7e0: 70d7 a1a6 6214 28c7 1f56 3606 cbce 040e .p...b.(V..6....
  82756. 803c7f0: bb48 d98a a76e 5373 8ce4 22b7 9d73 975c H...n.sS..."s.\.
  82757. 803c800: 94a7 837a 3ce6 a088 7efc 59a6 4931 20a4 ..z..<...~.Y1I.
  82758. 803c810: 252b 5e1e a7ad 7bdb 6b87 141c d163 49e7 +%.^...{.k..c..I
  82759. 803c820: 93a8 15dd c6ad 9318 e519 2441 77c9 7386 ..........A$.w.s
  82760. 803c830: 9924 d12e 6ae3 cc2c 2964 3261 6636 aa81 $....j,.d)a26f..
  82761. 803c840: 4651 cd02 039d b568 3b96 789d 30dd 6d0f QF....h..;.x.0.m
  82762. 803c850: 7814 5fb0 99f6 35ea e4e2 ec76 1e34 fab8 .x._...5..v.4...
  82763. 803c860: 7075 9a02 ac0c 9928 4db9 5365 b696 c25f up....(..MeS.._.
  82764. 803c870: 1b06 40bf 9f34 56ad e7e6 ae9f 1754 67e4 ...@4..V....T..g
  82765. 803c880: d1d6 b54b 8412 15be 3af6 15f3 57bf ab24 ..K......:...W$.
  82766. 803c890: 8f47 aa56 cf8b e654 1697 f32b a80b a09b G.V...T...+.....
  82767. 803c8a0: fcdd b703 4383 bb44 4985 79da 039c e3f4 .....CD..I.y....
  82768. 803c8b0: 7853 4ba1 6ab0 4df0 b429 7d62 8140 0c2f Sx.K.j.M).b}@./.
  82769. 803c8c0: b9ce 29d8 0b1b f65c 58c9 b18e c806 8308 ...)..\..X......
  82770. 803c8d0: eff6 0a3e 1f07 40b1 9b0b 7fdf 0e97 7604 ..>....@.......v
  82771. 803c8e0: ad2d 60b1 e02d 9541 80e8 f745 4a2c c0d3 -..`-.A...E.,J..
  82772. 803c8f0: a2d2 6f14 e9b9 5d49 7225 2d99 64e4 bbaf ...o..I]%r.-.d..
  82773. 803c900: 9c86 aabb 7299 6be2 3ab9 f737 b40b 6499 .....r.k.:7....d
  82774. 803c910: b3b5 3beb cb1d 373f 74e6 3a83 f116 ec6b ...;..?7.t.:..k.
  82775. 803c920: 0deb d1d4 ac06 8130 cc26 6929 f3ef 0fcb ......0.&.)i....
  82776. 803c930: ae13 0d5d ce9e 9da0 6b55 3058 52ad fe3d ..].....UkX0.R=.
  82777. 803c940: 649e f967 2f46 a8bb 56a3 ccac 75d4 696d .dg.F/...V...umi
  82778. 803c950: 6d56 9ac6 8ce0 1c99 cb51 319f db1b 7eaa Vm......Q..1...~
  82779. 803c960: f5e2 d717 3d5f abf9 1aca d2b6 8057 d7a8 ...._=......W...
  82780. 803c970: bd2d 34e5 4d97 c994 6b64 0cfd 348e f71d -..4.M..dk...4..
  82781. 803c980: 33bc 1d8e 3f2c f731 d4f6 6db1 d79e 0d88 .3..,?1....m....
  82782. 803c990: 6fc5 7e79 18ea 943e 0c73 9fcf 035c 9ed9 .oy~..>.s...\...
  82783. 803c9a0: c92c f4fc da1a 0554 2b3a 4847 a2b8 7dcd ,.....T.:+GH...}
  82784. 803c9b0: a5dd b7a9 cc70 d362 3bf1 5325 4f85 2e20 ....p.b..;%S.O .
  82785. 803c9c0: 476b c15c 7146 e24d 9d25 2605 db47 2670 kG\.FqM.%..&G.p&
  82786. 803c9d0: 018c b8bb b83d 0476 e2b1 b5e7 4623 214a ....=.v.....#FJ!
  82787. 803c9e0: 72cb 34bf 9ea7 aa7a f6d4 e6ac 2f6b e6fc .r.4..z.....k/..
  82788. 803c9f0: d784 9928 3b9b 0aeb 8548 08e7 4c66 3440 ..(..;..H...fL@4
  82789. 803ca00: 66a7 78c4 f2ac cafc dbd4 9bc4 b35d 091c .f.x........]...
  82790. 803ca10: df98 a7a4 a6f2 d7a0 fa38 8157 c2cc 9edc ........8.W.....
  82791. 803ca20: 99ab 6d1b 71af 4cc6 5a7b cf8d 156a a97c ...m.q.L{Z..j.|.
  82792. 803ca30: 1d06 d93a 3853 f0f4 36b1 42bd a386 1c6b ..:.S8...6.B..k.
  82793. 803ca40: 9f55 cb14 d43f b3c7 3d46 e7d4 f2a2 c6af U...?...F=......
  82794. 803ca50: d04d b0f5 6a1b f992 87c9 bd32 c654 4e47 M....j....2.T.GN
  82795. 803ca60: 962b 0306 8e3b dade b1c1 6f1d 02a7 ca2a +...;......o..*.
  82796. 803ca70: 90f9 3a8a 096e 97e3 1f3d 76f3 56b5 b2db ...:n...=..v.V..
  82797. 803ca80: e3c3 9fcf e12a 1234 09de c14b 5c70 c1ae ....*.4...K.p\..
  82798. 803ca90: e20a 465c 9ec9 daa9 8a0b 99a7 e275 0091 ..\F........u...
  82799. 803caa0: c728 f938 56a6 a547 63ab 00e9 e536 7268 (.8..VG..c..6.hr
  82800. 803cab0: 53a6 e434 666c bf01 8467 fcb6 f4a2 1cc4 .S4.lf..g.......
  82801. 803cac0: ee64 f658 2804 d20f 17fe 6770 e11c 3b58 d.X..(....pg..X;
  82802. 803cad0: 0000 ..
  82803. 0803cad2 <data__main_js>:
  82804. 803cad2: 6d2f 6961 2e6e 736a 0000 0000 5448 5054 /main.js....HTTP
  82805. 803cae2: 312f 312e 3220 3030 4f20 0d4b 530a 7265 /1.1 200 OK..Ser
  82806. 803caf2: 6576 3a72 6c20 4977 2f50 2e31 2e33 2031 ver: lwIP/1.3.1
  82807. 803cb02: 6828 7474 3a70 2f2f 6173 6176 6e6e 6861 (http://savannah
  82808. 803cb12: 6e2e 6e6f 6e67 2e75 726f 2f67 7270 6a6f .nongnu.org/proj
  82809. 803cb22: 6365 7374 6c2f 6977 2970 0a0d 6f43 746e ects/lwip)..Cont
  82810. 803cb32: 6e65 2d74 654c 676e 6874 203a 3031 3033 ent-Length: 1030
  82811. 803cb42: 0d36 430a 6e6f 656e 7463 6f69 3a6e 4320 6..Connection: C
  82812. 803cb52: 6f6c 6573 0a0d 6f43 746e 6e65 2d74 7974 lose..Content-ty
  82813. 803cb62: 6570 203a 7061 6c70 6369 7461 6f69 2f6e pe: application/
  82814. 803cb72: 2d78 616a 6176 6373 6972 7470 0a0d 6f43 x-javascript..Co
  82815. 803cb82: 746e 6e65 2d74 6e45 6f63 6964 676e 203a ntent-Encoding:
  82816. 803cb92: 7a67 7069 0a0d 6143 6863 2d65 6f43 746e gzip..Cache-Cont
  82817. 803cba2: 6f72 3a6c 7020 6972 6176 6574 202c 616d rol: private, ma
  82818. 803cbb2: 2d78 6761 3d65 3638 3034 0d30 0d0a 1f0a x-age=86400.....
  82819. 803cbc2: 088b 0000 0000 0400 ed0a 097d 1b73 7649 ..........}.s.Iv
  82820. 803cbd2: 5fe6 9629 297b 59a0 7100 02f1 4258 eae8 ._).{).Y.q..XB..
  82821. 803cbe2: 396e 5974 4f52 4bdb 1871 0175 1128 82a8 n9tYRO.Kq.u.(...
  82822. 803cbf2: 0aaa 28a4 1192 3d3d 7b1e a622 bdc3 bb31 ...(..==.{"...1.
  82823. 803cc02: bbb1 b1b1 3de3 417e dc8f c8f2 687d fc22 .....=~A....}h".
  82824. 803cc12: c00b e47f bdef accc 0003 6a29 a7ba 09ed ..........)j....
  82825. 803cc22: 423b 2b22 5f33 2f5e be5f 577c 7b26 c093 ;B"+3_^/_.|W&{..
  82826. 803cc32: fc49 d030 2bde e559 c8e3 264b a051 a1b9 I.0..+Y...K&Q...
  82827. 803cc42: 1933 4179 ed52 c97b a1ad 9f47 8fd7 bb6e 3.yAR.{...G...n.
  82828. 803cc52: 3880 29ed 9ef8 7ae5 83b7 6a98 d559 3938 .8.)...z...jY.89
  82829. 803cc62: 7a1a 70d5 396c 727e d664 148c 2eca 8f95 .z.pl9~rd.......
  82830. 803cc72: ac0f 7348 b1cc c515 07de d0c3 4a4a f033 ..Hs........JJ3.
  82831. 803cc82: 8ee5 2bdf 9c95 b315 6b5a af96 97d6 a5cc ...+....Zk......
  82832. 803cc92: 7cda 4e9b 9a87 cd71 3f43 c370 6ac3 3de4 .|.N..q.C?p..j.=
  82833. 803cca2: 789b f271 6441 bc8d 2e92 7a53 e3b9 ec96 .xq.Ad....Sz....
  82834. 803ccb2: e9f2 2969 4e37 4ad7 0fac ac78 4a18 8c2f ..i)7N.J..x..J/.
  82835. 803ccc2: d44a 658e 58ee e18e 863a ec1f 50f5 08db J..e.X..:....P..
  82836. 803ccd2: 8927 18f8 461f 6d86 7b25 358e 6146 45e0 '....F.m%{.5Fa.E
  82837. 803cce2: 897b 1a37 5653 8fe2 a1bc 4bd7 f88c 7841 {.7.SV.....K..Ax
  82838. 803ccf2: 45e8 7c46 791d 745e 6bb4 66d8 63ad 5b6f .EF|.y^t.k.f.co[
  82839. 803cd02: a1d5 f417 4193 5ec7 2959 d8a7 b1d9 7377 .....A.^Y)....ws
  82840. 803cd12: f983 f1e8 3bdd e44e 8959 7847 91a3 66d8 .....;N.Y.Gx...f
  82841. 803cd22: 6c8a 7051 e253 531e 13eb 4be2 c365 8599 .lQpS..S...Ke...
  82842. 803cd32: 6b91 d252 ff5d 9300 59a6 5539 2d1e 6075 .kR.]....Y9U.-u`
  82843. 803cd42: 1d5a daa7 a3f3 b938 f031 6e87 6ca7 ad57 Z.....8.1..n.lW.
  82844. 803cd52: d8f1 5c0b 024e 2b32 772b 8ae4 b3db 5b0b ...\N.2++w.....[
  82845. 803cd62: 0cb2 7e7b 6a15 5a86 d73b c78f eb43 b4c8 ..{~.j.Z;...C...
  82846. 803cd72: 4e4f 7b74 3a18 7afb e8b6 5c8e fb74 8bad ONt{.:.z...\t...
  82847. 803cd82: d36e afa2 bb9d f6e8 1765 99dd 7459 6460 n.......e...Yt`d
  82848. 803cd92: 13f4 e86b f163 db41 3872 9198 4581 3c37 ..k.c.A.r8...E7<
  82849. 803cda2: 67a3 8df4 e181 4f1b 7d8d 6863 3a8c f996 .g.....O.}ch.:..
  82850. 803cdb2: 111e e591 39ee 68e1 0934 c440 197a 8acb .....9.h4.@.z...
  82851. 803cdc2: c3dc 4fc8 42bc 43b6 23d9 b02b 5efa fb74 ...O.B.C.#+..^t.
  82852. 803cdd2: e001 42dc 0346 5e39 a721 9c89 215e 85a7 ...BF.9^!...^!..
  82853. 803cde2: 7e9c 6721 390d ca03 c7f1 eb96 4846 94f9 .~!g.9......FH..
  82854. 803cdf2: 1fea ebe2 80a9 f78c bdf1 df4f bc51 7b17 ..........O.Q..{
  82855. 803ce02: 81d1 6047 9943 0e31 04a3 91c9 ee4c 987b ..G`C.1.....L.{.
  82856. 803ce12: 6301 c02f 5276 8cab eeba 19c0 e5eb 33aa .c/.vR.........3
  82857. 803ce22: 9cf0 cf7d 393d 4929 7934 1fb7 c750 1c5e ..}.=9)I4y..P.^.
  82858. 803ce32: 0697 ae86 7edd 9950 397e eafd d3ec abe9 .....~P.~9......
  82859. 803ce42: 9fb3 6769 3f3f d9fb 67d9 bc48 fe99 7d13 ..ig??...gH....}
  82860. 803ce52: 5f4d bf4e cbd4 8ca8 ebc6 6365 09be be7f M_N.......ec....
  82861. 803ce62: 5f89 bf4e fb39 e9bb deef f152 a1a9 bf4f ._N.9.....R...O.
  82862. 803ce72: a6d4 7bff e5fa cfd9 5fa6 e7d3 d1ef 57e9 ...{....._.....W
  82863. 803ce82: bc48 b742 b3af cb4e 4086 1784 f658 73d0 H.B...N..@..X..s
  82864. 803ce92: 29b3 2f2d 982f fed2 78dc 5e1e 79bb e3fb .)-//....x.^.y..
  82865. 803cea2: 1a47 fc37 e629 0af3 5bb3 a734 937b ed91 G.7.)....[4.{...
  82866. 803ceb2: a545 1a21 fe98 e99f b39b cf4f d33e 5b2e E.!.......O.>..[
  82867. 803cec2: daf7 3c70 02b0 d270 77c8 234a e16a d17f ..p<..p..wJ#j...
  82868. 803ced2: 3464 8e4c f990 fa7a 205b 33f6 d24c 1c72 d4L...z.[ .3L.r.
  82869. 803cee2: fe20 ed6d 422e 43b4 fead 1e3f cf3d 7b41 .m..B.C..?.=.A{
  82870. 803cef2: ef74 03ee 9ead 29e1 9c5d 60c2 432c 087f t......)]..`,C..
  82871. 803cf02: d772 646e 3ee4 9ab7 0a85 a1b6 427f e13b r.nd.>.......B;.
  82872. 803cf12: 1ac2 0919 0bb9 8587 31ad 4bd7 c756 585b .........1.KV.[X
  82873. 803cf22: 9b07 82e7 bd3a 7585 bdb0 a82e 5fd3 0758 ....:..u....._X.
  82874. 803cf32: 301b 13ad cc64 9e70 99b4 8a2f 6d23 7386 .0..d.p.../.#m.s
  82875. 803cf42: 5ca7 e879 ef63 c649 e79a facb 37f4 57d3 .\y.c.I......7.W
  82876. 803cf52: dfd3 a513 e281 635e 7c43 fd3e fa6e a346 ......^cC|>.n.F.
  82877. 803cf62: 315d 0afd bfff 57d3 15ec 497d 5637 5a7f ]1.....W..}I7V.Z
  82878. 803cf72: ac6a d4ed 6b2a 27bb fc0d ed6a c7e2 eed6 j...*k.'..j.....
  82879. 803cf82: 4ec9 bead e5db fe4f 2dd1 a93f ebfe bdc0 .N....O..-?.....
  82880. 803cf92: 5ab7 704d e2fc 3f24 86b0 af13 5ddc b5aa .ZMp..$?.....]..
  82881. 803cfa2: d84b 4890 9e49 b15b e7c3 94d8 8385 6ca7 K..HI.[........l
  82882. 803cfb2: 5b80 e3cc 6e56 1fb1 b109 ee95 13ce bab7 .[..Vn..........
  82883. 803cfc2: 52bb b6ea 4abd 89f7 52bb feee b3a0 6c29 .R...J...R....)l
  82884. 803cfd2: 4b9b 09ce c847 4fea 4969 caad 6b8b ff95 .K..G..OiI...k..
  82885. 803cfe2: bbbc def2 62ea 01fa 9a07 337e a57d 9d31 .....b....~3}.1.
  82886. 803cff2: d368 916f 47fc 8ce2 c7c4 59c0 0f98 23fc h.o..G.....Y...#
  82887. 803d002: 97b3 35cf 1670 8300 bec4 1226 86fb 4172 ...5p.....&...rA
  82888. 803d012: df73 f201 fc6b a57e f711 e7c1 b3cb 695f s...k.~......._i
  82889. 803d022: d7d3 d9da 4cdf 9f5f 35fd dbd8 74af fdc3 .....L_..5...t..
  82890. 803d032: 1601 9e37 23d8 f93f e700 8c70 d7e3 0309 ..7..#?...p.....
  82891. 803d042: 1d08 92a3 fd3e ba35 bf43 e182 c2be 9070 ....>.5.C.....p.
  82892. 803d052: 5bfc aa1a f676 b00b 0c57 ff11 3831 25da .[..v...W...18.%
  82893. 803d062: 31af 8041 d650 e7d9 3e1a 2870 63a8 2688 .1A.P....>p(.c.&
  82894. 803d072: d5d1 e0cb 20f6 20bb 5719 00fc 5ae7 a49a ..... . .W...Z..
  82895. 803d082: d1f3 83a7 1c2e 0493 ef10 7734 a905 f9d2 ..........4w....
  82896. 803d092: 8298 ea4b 6635 85c5 802e 0f28 b47c 262a ..K.5f....(.|.*&
  82897. 803d0a2: 2a52 17b7 b791 7b90 2c95 0524 1ca1 f389 R*.....{.,$.....
  82898. 803d0b2: fb31 93e0 409b aa01 e13b 4824 872a 4591 1....@..;.$H*..E
  82899. 803d0c2: 5b03 9558 350e 8286 1b8c 0b9c 4294 e5e4 .[X..5.......B..
  82900. 803d0d2: ee5c 06ea 9bce 27be 143a 2e72 2835 ad32 \......':.r.5(2.
  82901. 803d0e2: 3e38 230c 63f7 06a0 f32d 15be 4e22 7438 8>.#.c..-..."N8t
  82902. 803d0f2: 87c7 8274 3c8a 6f96 ef02 9f30 22c7 c88e ..t..<.o..0.."..
  82903. 803d102: bc8b e431 14d7 9bda dca7 699a b69a 8614 ..1........i....
  82904. 803d112: 4e4f e528 5214 4cae ad75 17a1 a025 a609 ON(..R.Lu...%...
  82905. 803d122: b3ea 682f b185 c4f2 e90c ffd0 9286 2044 ../h..........D
  82906. 803d132: 7a4b edb9 992c dba6 cd2d 80d6 026c 37a8 Kz..,...-...l..7
  82907. 803d142: c444 6fd3 5649 12f8 c364 845b d492 6f1c D..oIV..d.[....o
  82908. 803d152: 978c 4254 f61c efec 3ece 7343 e684 ace2 ..TB.....>Cs....
  82909. 803d162: 5d4d cca7 b4e2 990b 79c5 a8a3 d6dc cc75 M].......y....u.
  82910. 803d172: 4acd 01a7 aee6 48f1 cb7e fe1c 213b d0bb .J.....H~...;!..
  82911. 803d182: fc0e 0d1d 3791 2be0 91da 861a 0df2 17cd .....7.+........
  82912. 803d192: 933b 9f48 fcc7 b40f 694b 6fc6 31b0 15b1 ;.H.....Ki.o.1..
  82913. 803d1a2: 4300 8ff4 f17d e2b3 4836 7927 39f6 c661 .C..}...6H'y.9a.
  82914. 803d1b2: 9b13 06d5 cbed 274f 74fb 5dcb 5c68 5fee ......O'.t.]h\._
  82915. 803d1c2: bdde b503 5142 1602 eab6 fdf4 04ee 1094 ....BQ..........
  82916. 803d1d2: 7f40 f532 6b15 5f45 8426 4680 c290 b419 @.2..kE_&..F....
  82917. 803d1e2: 984c 2910 1888 de1f 9c7a f789 65a0 0cb1 L..)....z....e..
  82918. 803d1f2: c0c9 a18f c588 ec63 ef2f f7b1 293c 521b ......c./...<).R
  82919. 803d202: 833b c03e 3782 a94a 907b b969 5b9d b93b ;.>..7J.{.i..[;.
  82920. 803d212: 8448 f488 13e4 9f73 1b3b a87f cab5 1d4e H.....s.;.....N.
  82921. 803d222: e352 2f62 7c79 6634 8c1d 13c8 0d3a 3b34 R.b/y|4f....:.4;
  82922. 803d232: f127 dbdc eb81 ef3d 964a 7822 dec8 b410 '.....=.J."x....
  82923. 803d242: 0cee 8b81 c07b 8ad5 6ba9 df03 bd75 d040 ....{....k..u.@.
  82924. 803d252: 324b 394e 65cd d060 b5f1 8924 7b7c 0d02 K2N9.e`...$.|{..
  82925. 803d262: da10 2c5b 5784 fb23 da64 194c ca54 04cf ..[,.W#.d.L.T...
  82926. 803d272: bb7b 1c68 e212 3d12 1770 5098 1f12 ee91 {.h....=p..P....
  82927. 803d282: f23f 9c2e 1e62 02f0 404c 9ad3 c769 2704 ?...b...L@..i..'
  82928. 803d292: 6a1b d8f1 f60a 7bea 6f61 c1af 2318 7cb8 .j.....{ao...#.|
  82929. 803d2a2: 2633 da33 0e0a 2488 870a 320c a43f 4dc5 3&3....$...2?..M
  82930. 803d2b2: dc11 9a5b bd92 de45 3c28 16f0 9e61 2171 ..[...E.(<..a.q!
  82931. 803d2c2: ba1b 0a00 4be4 41dc 76ad 6111 478b 0297 .....K.A.v.a.G..
  82932. 803d2d2: 65bf 7988 0bb8 c046 69dc 98ee 259b 058b .e.y..F..i...%..
  82933. 803d2e2: 4cd8 0969 f19b 2c5c 85bc 1624 f0cf ca3c .Li...\,..$...<.
  82934. 803d2f2: 3058 7988 98ea 48d9 64b3 5331 4f3c 0b12 X0.y...H.d1S<O..
  82935. 803d302: f200 9e88 9629 5fcd 7362 9e10 3d25 025c ....).._bs..%=\.
  82936. 803d312: 7f3a d3d4 4ee1 76c7 d966 eb59 89a0 01db :....N.vf.Y.....
  82937. 803d322: 448c 5938 ca4b 0626 29fe 8375 ce3a e5c9 .D8YK.&..)u.:...
  82938. 803d332: 0b65 681c 06a9 5d3e 99e4 8230 25b5 ce00 e..h..>]..0..%..
  82939. 803d342: a5be 581a 2cc1 1d77 5e44 d4cf c157 ed23 ...X.,w.D^..W.#.
  82940. 803d352: 28ab 2bb7 1a15 90bd a032 4276 056f 324a .(.+....2.vBo.J2
  82941. 803d362: 90b3 d86d 46a7 6bdd 06e6 d64d 4780 9909 ..m..F.k..M..G..
  82942. 803d372: 58a3 2940 071a 0f98 7b2a 5804 a5e4 1758 .X@)....*{.X..X.
  82943. 803d382: 2c59 0b2e b23b a6c8 1971 b168 d2ff 5cb1 Y,..;...q.h....\
  82944. 803d392: c940 0184 c31e 605b df64 4017 d0e5 5914 @.....[`d..@...Y
  82945. 803d3a2: 3fae 7389 8288 6605 f0ce e8c0 99ca 2e66 .?.s...f......f.
  82946. 803d3b2: 6fda 4a34 0a80 cda3 0065 3e59 60bb b2b0 .o4J....e.Y>.`..
  82947. 803d3c2: 3641 5cfb 9ed4 6440 947e 5c97 6cd7 efb4 A6.\..@d~..\.l..
  82948. 803d3d2: 8150 7d47 7879 fa31 c04b 96e7 9ac6 8324 P.G}yx1.K.....$.
  82949. 803d3e2: c2dc 87c4 4194 409c b818 a2d4 ab64 76f5 .....A.@....d..v
  82950. 803d3f2: 6624 b2b0 3211 f348 0001 6424 9785 a718 $f...2H...$d....
  82951. 803d402: 955c 4eac 20da 66ac a205 e4ca 3f13 85e8 \..N. .f.....?..
  82952. 803d412: 493f 68d5 4bec e396 74c9 cc29 e094 b330 ?I.h.K...t)...0.
  82953. 803d422: bc02 1d62 7698 844e 5327 ec26 2ac7 9a53 ..b..vN.'S&..*S.
  82954. 803d432: 3352 a063 c4ec 2bcb 0dac 7d98 a3a1 b691 R3c....+...}....
  82955. 803d442: da48 e924 679a c37f 1196 60b7 2be9 81d6 H.$..g.....`.+..
  82956. 803d452: 0871 3b16 0a18 9849 b295 2b3b 90a6 a167 q..;..I...;+..g.
  82957. 803d462: be69 3eb5 4c24 8cb6 2b7d 5d04 42b4 e212 i..>$L..}+.].B..
  82958. 803d472: 696b 13ee bb3d 8619 1bce ec38 6fd5 cbb7 ki..=.....8..o..
  82959. 803d482: a8cc 4fda 5234 47b6 16ff 6db4 9fd8 ac96 ...O4R.G...m....
  82960. 803d492: c83f 2290 d454 20db 901c 0fcb 6aa2 86bf ?.."T.. .....j..
  82961. 803d4a2: 2e60 6f74 7fa1 217f ed54 da59 3d24 0c99 `.to...!T.Y.$=..
  82962. 803d4b2: 948e 8c4f 759c 3ffe 5550 ab86 cfe9 dd1f ..O..u.?PU......
  82963. 803d4c2: 47bf 077e 11c3 e92b 5276 0f7f 9834 928f .G~...+.vR..4...
  82964. 803d4d2: fc64 b850 ba7d 4ed0 62b4 9b56 e4b2 7901 d.P.}..N.bV....y
  82965. 803d4e2: 520d 81ed 97f7 edf7 10a7 4bea 5dfa 89df .R.........K.]..
  82966. 803d4f2: 38c2 25ec aa55 f8f2 03f1 981c 0c2e 5e03 .8.%U..........^
  82967. 803d502: 1250 8d9a 6065 5383 4056 803e 98a3 440e P...e`.SV@>....D
  82968. 803d512: 34a1 b99b 5b43 43ec d3af 2682 160a 400b .4..C[.C...&...@
  82969. 803d522: 3be6 9738 642d a550 6c49 6a34 2850 6eac .;8.-dP.Il4jP(.n
  82970. 803d532: 33c9 3269 7655 957a 3c08 25af 25d9 0caf .3i2Uvz..<.%.%..
  82971. 803d542: 1695 4282 14f9 c6dd cd70 35e4 c9f9 c498 ...B....p..5....
  82972. 803d552: 3195 0bfc f76a 6a9b a387 64c1 3a40 355b .1..j..j...d@:[5
  82973. 803d562: fa1e 578e 1baa b595 2772 f43e 6713 7240 ...W....r'>..g@r
  82974. 803d572: 6387 9ec5 c60e f894 3f41 dbd6 7af8 210c .c......A?...z.!
  82975. 803d582: ce19 92ad 84ca c72a 4032 c6c7 f614 5c3b ......*.2@....;\
  82976. 803d592: 7a01 125c 4746 1b7a f06b ba80 2925 1262 .z\.FGz.k...%)b.
  82977. 803d5a2: e045 341e c50a e041 5163 d0e8 7900 c3e3 E..4..A.cQ...y..
  82978. 803d5b2: a9db 03a8 24e6 1a64 5178 13d0 97a9 8dd0 .....$d.xQ......
  82979. 803d5c2: e02d 31c6 99df a120 92f0 fd06 bf06 cb33 -..1.. .......3.
  82980. 803d5d2: 508f 5f15 5e92 7c8c c169 645a 2a11 181b .P._.^.|i.Zd.*..
  82981. 803d5e2: 1d83 df86 1073 6360 12e4 c578 ea1a c03f ....s.`c..x...?.
  82982. 803d5f2: f62e 7c73 e189 f02c bc86 fec1 c740 e562 ..s|..,.....@.b.
  82983. 803d602: dfbe 49ec 17ff 0d36 7b35 8a52 9cdf 12fd ...I..6.5{R.....
  82984. 803d612: f10c f4e5 b3eb 2f9f c6f4 ff70 b74e 2b64 ......./..p.N.d+
  82985. 803d622: 6907 7771 ff7c 630d 6fcf 5b18 2e52 9eed .iqw|..c.o.[R...
  82986. 803d632: 41f6 bbe8 2d5a 9023 436b f60b 9cbe b3fd .A..Z-#.kC......
  82987. 803d642: 2d64 b7d7 edb7 d5f2 76ab 6dca 7033 cd10 d-.......v.m3p..
  82988. 803d652: 106d dc0a e4c9 2476 745f 704e 75d5 7176 m.....v$_tNp.uvq
  82989. 803d662: e60a c7ae 9fd0 3e83 2bc8 0a81 f61f bb34 .......>.+....4.
  82990. 803d672: 1f0b db6b 6306 75af 6ddc 6a65 b8ea c2f0 ..k..c.u.mej....
  82991. 803d682: 79f2 9de0 3deb 3325 97bd 87eb b047 ece3 .y...=%3....G...
  82992. 803d692: bbb8 55bb 09df ec0c f632 936b 0e4b de5d ...U....2.k.K.].
  82993. 803d6a2: f381 d4d7 b5eb 73f1 451d 9f89 3d0c 5f33 .......s.E...=3_
  82994. 803d6b2: 7385 e470 ec63 b379 97b7 37df 0860 28d6 .sp.c.y....7`..(
  82995. 803d6c2: e87e e9c1 0f1c bdb0 d715 e9d3 0e23 3603 ~...........#..6
  82996. 803d6d2: e8cc 772b cdb1 91ab 5705 08f7 5ffe ebb5 ..+w.....W..._..
  82997. 803d6e2: edd2 ae66 d558 9ec9 2845 7386 8918 4c91 ..f.X...E(.s...L
  82998. 803d6f2: e6b8 2ece 8fbc d1f8 c533 d80a 1ac6 1af9 ........3.......
  82999. 803d702: a255 5385 7d46 906f 51cb 9a25 71e4 0954 U..SF}o..Q%..qT.
  83000. 803d712: 2748 d34f 3ac4 1d79 4955 dca3 7301 76b8 H'O..:y.UI...s.v
  83001. 803d722: 3c03 5321 0a2c fdae 376b 2bca 49f0 9afd .<!S,...k7.+.I..
  83002. 803d732: 7955 1406 8448 2031 d28c 3676 ddca 776b Uy..H.1 ..v6..kw
  83003. 803d742: 3dae bbbc f0f7 cdd6 f8b6 f0fa ade1 f75b .=............[.
  83004. 803d752: 6248 79ba eb41 f337 33ad bbe0 2eb6 fe3d Hb.yA.7..3....=.
  83005. 803d762: 4fe7 0240 2cf0 2bfe 1fa4 521a e956 bb5d .O@..,.+...RV.].
  83006. 803d772: 8153 e705 a7f7 0a20 aa1d 544c d77b 111e S..... ...LT{...
  83007. 803d782: 70c1 677e a428 fe7e cf13 404a b7ce 18ef .p~g(.~...J@....
  83008. 803d792: 0bb5 6796 0a3c 3a5d b213 eff5 f575 47eb ...g<.]:....u..G
  83009. 803d7a2: 2d64 dbd4 f5fa 8c30 2d13 b48c 13eb 098a d-....0..-......
  83010. 803d7b2: 77e8 eadd 0278 d752 e7bd 9030 fc8d 0d80 .w..x.R...0.....
  83011. 803d7c2: b083 aa5b 00fc 7676 360b 6336 8290 383a ..[...vv.66c..:8
  83012. 803d7d2: a0ee b618 c983 6870 69f8 3c76 b098 ad82 ......ph.iv<....
  83013. 803d7e2: 044a 3a4d 1346 fd34 4bb4 30c0 8a86 d2ce J.M:F.4..K.0....
  83014. 803d7f2: 3346 ae98 9b2a 081d f2f7 2d34 48a6 440f F3..*.....4-.H.D
  83015. 803d802: dc75 a109 8ac8 ec11 cbe7 c31e a5ed 520a u..............R
  83016. 803d812: a5a6 598f d866 89f3 c185 527f b236 bb22 ...Yf......R6.".
  83017. 803d822: e450 a5b1 0645 1498 5890 44d8 2012 aa5b P...E....X.D. [.
  83018. 803d832: 46ac b97e 9e9e 89bf 7578 7638 fce5 325e .F~.....xu8v..^2
  83019. 803d842: ea18 9fe8 bcbf 6921 455d a0bd be66 8537 ......!i]E..f.7.
  83020. 803d852: facb c405 e341 c614 301a f3cb 2e7b 3180 ....A....0..{..1
  83021. 803d862: 7fe1 e38b 3bed bfee 3650 8433 260b faec .....;..P63..&..
  83022. 803d872: ade4 88c9 5c12 5911 7d5d 7ffa cba1 0190 .....\.Y]}......
  83023. 803d882: 5bfe 0d48 91df 1dc3 3a54 1ffd ccc8 6832 .[H.....T:....2h
  83024. 803d892: 8b8b 8bfa dbe6 60ba 51be d738 b22b 6bd0 .......`.Q8.+..k
  83025. 803d8a2: 03b1 38f4 0c3f 55ea cfd4 8af7 5371 e70b ...8?..U....qS..
  83026. 803d8b2: c772 8428 bd1b 4f38 bd64 8f4b 7f54 c7ae r.(...8Od.K.T...
  83027. 803d8c2: 39c6 4a3d 1a91 7cf4 0c23 7df7 ad58 2f03 .9=J...|#..}X../
  83028. 803d8d2: 8a41 cc25 213d bb25 c23a 1682 a764 80fe A.%.=!%.:...d...
  83029. 803d8e2: 6d5c 3bd7 e080 f15a 28a2 748c 9143 0354 \m.;..Z..(.tC.T.
  83030. 803d8f2: 13d2 c6eb c2f7 efc4 e11d 43cc 2515 16ba ...........C.%..
  83031. 803d902: 4cce c061 1c2a 3589 c7d8 d448 ce54 f221 .La.*..5..H.T.!.
  83032. 803d912: 40c3 235c fa87 2437 9245 819f 4a1d fc58 .@\#..7$E....JX.
  83033. 803d922: 55bf 1542 dbbb bbc9 7d34 0555 39f3 bbbf .UB.....4}U..9..
  83034. 803d932: 1835 e0cc c8bf 1544 2425 dc43 4f4e 296f 5.....D.%$C.NOo)
  83035. 803d942: f341 4de9 3322 54b9 31b2 44b2 4ba3 3d98 A..M"3.T.1.D.K.=
  83036. 803d952: f708 5616 8120 e4c3 ac06 10de e1b2 ea4c ...V .........L.
  83037. 803d962: e108 86c6 df80 e8f7 5d88 7f20 169b 0c51 .........] ...Q.
  83038. 803d972: 0c01 f87d 0b56 2054 c62a 9ca9 6ae4 a07e ..}.V.T *....j~.
  83039. 803d982: 8d41 1782 0393 cede 8217 9c12 9016 6a16 A..............j
  83040. 803d992: de9d 93b6 c344 f83d 2751 ac49 d962 4a7a ....D.=.Q'I.b.zJ
  83041. 803d9a2: ea8a 2b9f 2545 1d70 fa76 8a39 0124 8aaa ...+E%p.v.9.$...
  83042. 803d9b2: 30e8 ba1f 4757 ef2f 76f4 140d 66bb 79ae .0..WG/..v...f.y
  83043. 803d9c2: ade4 1020 20ab f527 a7cb de98 960c 0466 .. .. '.......f.
  83044. 803d9d2: 4ba9 a352 98bd 8b1a e614 3d0c 522b 8634 .KR........=+R4.
  83045. 803d9e2: 0983 2bee 69fa 48e6 3f21 d818 0d5a 85a2 ...+.i.H!?..Z...
  83046. 803d9f2: 6cd3 d95d 9a66 0b90 6b07 3a91 8381 f030 .l].f....k.:..0.
  83047. 803da02: 9198 30e1 d5a0 ac2d 95d3 41ed eafd bff4 ...0..-....A....
  83048. 803da12: 1283 853f 0f90 1502 ca0e 9edf 0afd 8f56 ..?...........V.
  83049. 803da22: d3d7 da7f 455e 36f9 fac2 7634 9927 ee58 ....^E.6..4v'.X.
  83050. 803da32: 1bc0 fc6a e2b3 3d7a 326b f44c 8079 00ca ..j...z=k2L.y...
  83051. 803da42: 28fa c549 a757 cf7f c29a c16f beec 5edc .(I.W.....o....^
  83052. 803da52: 4345 b757 1ac7 76ef 2753 ab92 b4c0 0fd4 ECW....vS'......
  83053. 803da62: 9ada 9183 5179 1507 1bfe f186 d89d 1a09 ....yQ..........
  83054. 803da72: cbb6 d867 6030 6c92 79cc 2f89 4c78 dbab ..g.0`.l.y./xL..
  83055. 803da82: e3ab a2ab 2bb1 9df9 8330 549e e55b 0ca3 .....+..0..T[...
  83056. 803da92: ef76 f4f3 cec8 f725 1a4d 6922 6d89 88a1 v.....%.M."i.m..
  83057. 803daa2: 21d9 c6e2 52a6 2969 cff9 2f53 00e9 95ef .!...Ri)..S/....
  83058. 803dab2: 74f2 eee7 38ae ee79 ef69 0538 755a 6977 .t...8y.i.8.Zuwi
  83059. 803dac2: 2df3 63de 1462 e9f1 4a1f 3938 121e 2560 .-.cb....J89..`%
  83060. 803dad2: 601e 5f23 651e 76d6 ab1e 01f9 18e6 c509 .`#_.e.v........
  83061. 803dae2: 583f 662b c8dd 5478 d3ae e471 bc1d a75b ?X+f..xT..q...[.
  83062. 803daf2: c588 c665 395a 49af f3f4 83f1 dc47 9e68 ..e.Z9.I....G.h.
  83063. 803db02: 4e1d f1c6 249e 3f8e 9671 3348 fef9 511c .N...$.?q.H3...Q
  83064. 803db12: 51ef 33dc 0b45 ed64 0581 f30a 3750 f927 .Q.3E.d.....P7'.
  83065. 803db22: b3cd f2ce b14a 050a b6a7 c1e7 4016 a609 ....J........@..
  83066. 803db32: ac5b bbed 0a7f 976c 3cc6 5bc3 83fe 5ef5 [.....l..<.[...^
  83067. 803db42: b02d 05de ba28 2f3c d949 ae6f 7395 e9f6 -...(.</I.o..s..
  83068. 803db52: b1bb 8ce0 94d8 20fc 7038 4f96 01a2 b088 ....... 8p.O....
  83069. 803db62: 83c0 ee17 c00e bef1 efc8 798e 5d66 1dd8 ...........yf]..
  83070. 803db72: c2a8 63bb 2c1e 3bbf d424 c20f 73e6 63f8 ...c.,.;$....s.c
  83071. 803db82: 2eb1 1195 5c72 5897 e2bd d291 2399 e2c2 ....r\.X.....#..
  83072. 803db92: 3a2f df20 db99 1eab a4c8 ccac 1a45 7c31 /: .........E.1|
  83073. 803dba2: 7055 aee9 7867 aabe 685f 9278 36f4 5cf7 Up..gx.._hx..6.\
  83074. 803dbb2: 81cf 8021 526c 1cea 29b6 ca60 f5c1 710f ..!.lR...)`....q
  83075. 803dbc2: a720 2217 0888 441c 40d9 885b a06e b5ce .."...D.@[.n...
  83076. 803dbd2: 04a4 d915 5ab9 6c6f f174 d6b3 e168 c2dc .....Zolt...h...
  83077. 803dbe2: 35af 8a44 1d75 5eb3 afab ebb7 1af5 d925 .5D.u..^......%.
  83078. 803dbf2: 5c82 35af f01b af71 8f98 f4d8 ed57 e145 .\.5..q.....W.E.
  83079. 803dc02: 86e8 ab6c 54e4 5b36 309b a3a7 f458 adc0 ..l..T6[.0..X...
  83080. 803dc12: 132b ee63 c35e f628 c43d c7cc 0bb9 ca01 +.c.^.(.=.......
  83081. 803dc22: 1a58 0758 df7e 0d82 4abc 5131 fad7 8d90 X.X.~....J1Q....
  83082. 803dc32: 1a10 4167 45a6 d038 1efd 085c 6e8f d2df ..gA.E8...\..n..
  83083. 803dc42: a0d2 0ade 8470 0f7b 6a0b 4755 5916 57e2 ....p.{..jUG.Y.W
  83084. 803dc52: 471f 423e 9284 fbea c1d1 4c13 49e5 9575 .G>B.......L.Iu.
  83085. 803dc62: 6443 ea97 e2d9 d2e0 7d84 8287 a4a3 c3c3 Cd.......}......
  83086. 803dc72: ef8f b686 5b8f fe34 47fd 1c25 99e4 8336 .....[4..G%...6.
  83087. 803dc82: 7820 ada9 1690 c8bb 2bfc dcc2 7ece a101 x.......+...~..
  83088. 803dc92: 6492 f639 50d9 1a30 a93e e92e 9f40 2341 .d9..P0.>...@.A#
  83089. 803dca2: 3dfa de32 db40 6561 e203 6237 b121 1d11 .=2.@.ae..7b!...
  83090. 803dcb2: 24ba 5b02 4eff 376d 94af 2740 a7d0 cf7f .$.[.Nm7..@'....
  83091. 803dcc2: f896 612f a691 3540 9488 e8b0 a598 dc9e ../a..@5........
  83092. 803dcd2: 06dd 5cf9 c26e 8157 377b ea66 a876 c142 ...\n.W.{7f.v.B.
  83093. 803dce2: a3a1 eece edda dd3e 2220 1288 fc94 7d3d ......>. "....=}
  83094. 803dcf2: d385 2177 c317 99f6 7c65 4e14 4422 ca89 ..w!....e|.N"D..
  83095. 803dd02: 3f52 7040 2514 82a9 01b8 3032 1de7 303e R?@p.%....20..>0
  83096. 803dd12: ea57 cdd2 94a0 4c0d 3aad c70e 72a5 f117 W......L.:...r..
  83097. 803dd22: 5d6c 4dbd 6d51 677a b790 fb5c 1568 59ca l].MQmzg..\.h..Y
  83098. 803dd32: 1d29 0d39 9490 1280 5034 5c98 9f95 a606 ).9.....4P.\....
  83099. 803dd42: 9365 39c2 926d 81e4 2824 8b05 87c2 810a e..9m...$(......
  83100. 803dd52: 835b ec2a b7c4 b00e 77ee 50e0 60f1 2945 [.*......w.P.`E)
  83101. 803dd62: 14e9 56fe 9d08 a22b 0ebc 93e1 cc4d be87 ...V..+.....M...
  83102. 803dd72: 0c9b 73b0 c58a 15c5 3d31 7c51 0781 94fb ...s....1=Q|....
  83103. 803dd82: 1126 d406 a9ab 00d8 05ce afdc c762 c994 &...........b...
  83104. 803dd92: 7b21 55c2 1825 2d82 d4b2 e9bc 5626 9f61 !{.U%..-....&Va.
  83105. 803dda2: 9194 9521 8cae 47dc 23f1 c0eb 1fbb 87dd ..!....G.#......
  83106. 803ddb2: ed0b 703a 7e54 442b e609 d879 87da 77b1 ..:pT~+D..y....w
  83107. 803ddc2: 612c fdd9 fb86 9c64 9427 8fdf de1f 8aa9 ,a....d.'.......
  83108. 803ddd2: 503b 73c2 3487 736e 4c81 d01d 79e2 f6b1 ;P.s.4ns.L...y..
  83109. 803dde2: a550 bd3b 472a e0c2 8f5e a6c0 1fa9 b1f8 P.;.*G..^.......
  83110. 803ddf2: cd8f 7b84 6d3c ad15 abd7 7052 630e 35c6 ...{<m....Rp.c.5
  83111. 803de02: d6d2 d0ec 2a3d a168 283d 08c3 f3b3 7d9d ....=*h.=(.....}
  83112. 803de12: 2118 608a ef02 12e2 0f55 fd46 c653 38f5 .!.`....U.F.S..8
  83113. 803de22: fb0a 5f40 e19c 1c1b c2f1 4c65 7905 4830 ..@_......eL.y0H
  83114. 803de32: 942c aee7 d55a 4c24 e1ac f5fb 0d5a cf64 ,...Z.$L....Z.d.
  83115. 803de42: d9c6 c6fc a19c b792 a7d7 cd91 157a f959 ............z.Y.
  83116. 803de52: 9fbd 400c 1895 9620 39b5 f817 48a8 9d22 ...@.. ..9...H".
  83117. 803de62: 58b6 f48d 035e c20b b7c0 255d 8bd7 27d0 .X..^.....]%...'
  83118. 803de72: c375 a2ce 6712 bf23 526c d3fb 6b70 7240 u....g#.lR..pk@r
  83119. 803de82: 8278 8699 c1bc 3f93 90f1 f62d c8c0 fa8a x......?..-.....
  83120. 803de92: f07e 1c38 272b 290b e45c bc84 3387 bc03 ~.8.+'.)\....3..
  83121. 803dea2: ac18 b939 e1ee f1b0 4e40 7064 9e7a f23c ..9.....@Ndpz.<.
  83122. 803deb2: 21ed 5ed4 4641 261a e505 0d2d 1378 11d3 .!.^AF.&..-.x...
  83123. 803dec2: cce1 722a 53ae 3368 a2bf 8574 6d4c 0d19 ..*r.Sh3..t.Lm..
  83124. 803ded2: 9ddb 5c0d 96f0 fb62 f2a4 ca92 6126 b729 ...\..b.....&a).
  83125. 803dee2: 05ab d13e ee75 9856 2a9c 335c a6ea 1918 ..>.u.V..*\3....
  83126. 803def2: c86f 9c6d 4cbf 4296 0b15 7408 e2ee 0a59 o.m..L.B...t..Y.
  83127. 803df02: 533b c042 2769 db64 4813 f5ce 28dc e080 ;SB.i'd..H...(..
  83128. 803df12: cd46 483c 00b3 5ad2 d204 802a bee0 7ccc F.<H...Z..*....|
  83129. 803df22: 6b2b 2204 a90c 1062 08c2 b94b d0c2 e699 +k."..b...K.....
  83130. 803df32: 2922 b372 b301 93e1 9a87 79c6 99a9 0c88 ")r........y....
  83131. 803df42: c0aa 5da1 bb2a 487f 3259 4b92 5265 b292 ...]*..HY2.KeR..
  83132. 803df52: b18b 386c 29cc fb83 6ecc a5cf 4833 a203 ..l8.)...n..3H..
  83133. 803df62: 8024 cc0c 6d52 e0ca 5527 0598 a3cb 2a59 $...Rm..'U....Y*
  83134. 803df72: 743b 9165 6088 55ca 8643 9a2c 020f bae2 ;te..`.UC.,.....
  83135. 803df82: 9b32 6680 9763 b8d0 22c8 5762 a7a1 f24b 2..fc...."bW..K.
  83136. 803df92: 4302 761a 2eac e038 e0ac 217e 5c39 1a02 .C.v..8...~!9\..
  83137. 803dfa2: e52c a01d 121b 8ffa 20cf e1ce c004 8a4e ,........ ....N.
  83138. 803dfb2: 1001 9a9e 2e33 a875 6dc8 3f92 0c44 db37 ....3.u..m.?D.7.
  83139. 803dfc2: cede 5681 932b 1316 d3de 5a04 9f3e cce1 ...V+......Z>...
  83140. 803dfd2: e600 8fb9 7b0a 1b4f 09fa 35f1 5f2c 919a .....{O....5,_..
  83141. 803dfe2: 3eb2 5275 e5aa 4864 043e f055 5a4a be67 .>uR..dH>.U.JZg.
  83142. 803dff2: 9991 8821 2cc9 916c 9bb4 e249 f6e4 5228 ..!..,l...I...(R
  83143. 803e002: 5734 66c8 3c69 ed07 2409 9b29 365c 6039 4W.fi<...$).\69`
  83144. 803e012: 524a 4cf6 af84 10e8 56a7 762e 225c 5730 JR.L.....V.v\"0W
  83145. 803e022: 1319 6830 3daf 7112 c5a5 3738 1723 67af ..0h.=.q..87#..g
  83146. 803e032: 3750 6d64 50a5 f47c 8a86 4514 2721 8284 P7dm.P|....E!'..
  83147. 803e042: c43f 50e3 f1b0 6c16 99b5 fd40 eece bc81 ?..P...l..@.....
  83148. 803e052: 13d1 29ee 01f2 43ca 0594 492a 748e a415 ...)...C..*I.t..
  83149. 803e062: 7c7d e46a 10f3 3026 96f2 7597 8e19 a4bb }|j...&0...u....
  83150. 803e072: 1682 c016 65cc dd5d 2ada 48cb 3561 9cf6 .....e]..*.Ha5..
  83151. 803e082: 3771 7777 c482 29fa 1fdf 0979 e00d 8c95 q7ww...)..y.....
  83152. 803e092: c2dc 5965 f416 2b49 fd4b 6c02 b53a 50ca ..eY..I+K..l:..P
  83153. 803e0a2: 9c96 9d15 14bc 7fb0 94b2 e36c 8eca 2988 ..........l....)
  83154. 803e0b2: 19aa ba95 1154 0220 3f93 d30f 13e5 43af ....T. ..?.....C
  83155. 803e0c2: 0ae2 4b02 e26e 892e 124b 0af6 ff22 ef66 ...Kn...K...".f.
  83156. 803e0d2: f086 9434 493c 42b7 fde4 b998 e17c cd5d ..4.<I.B....|.].
  83157. 803e0e2: 96a3 4d74 5aba bf7f bbd7 bd00 e317 ead2 ..tM.Z..........
  83158. 803e0f2: acc1 bcbd 405c e726 9b01 13df 6c9f 871d ....\@&......l..
  83159. 803e102: 8412 cc7b 23f0 c0c9 1fb8 c902 4664 d318 ..{..#......dF..
  83160. 803e112: 7fc4 2c14 b053 87de de1e c815 1ae4 9aca ...,S...........
  83161. 803e122: 6997 25b0 b827 c73d 219c abf3 f222 3384 .i.%'.=..!.."..3
  83162. 803e132: e369 2453 5d00 c98f 7297 151e 3042 dc96 i.S$.]...r..B0..
  83163. 803e142: 5f26 732c a009 2877 f1d5 1699 7cd2 c2ee &_,s..w(.....|..
  83164. 803e152: c472 f885 2762 9722 7000 0610 7c14 ef98 r...b'"..p...|..
  83165. 803e162: f384 b0a8 2c10 7e0b 69c7 502a 7501 be39 .....,.~.i*P.u9.
  83166. 803e172: 1f15 77c5 0c64 413e 84cc a2cf ccb2 42a1 ...wd.>A.......B
  83167. 803e182: b15a 9874 9d33 ca17 f014 4c22 a011 d6c0 Z.t.3....."L....
  83168. 803e192: 4dbf a796 0546 c02d aa0b a1ac 6f6e 6fac .M..F.-.....no.o
  83169. 803e1a2: 24c1 0c03 1b40 bcc4 71c5 745d 717d 0384 .$..@....q]t}q..
  83170. 803e1b2: 8f22 1527 870a 5000 b018 953e 4829 37ec ".'....P..>.)H.7
  83171. 803e1c2: bf3b 9301 9c45 f6f9 f2bb 657e 675b db17 ;...E.....~e[g..
  83172. 803e1d2: 7329 8b37 7be5 338a 73c2 541e 8291 d482 )s7..{.3.s.T....
  83173. 803e1e2: 1eb3 4e94 7743 37d2 283e 8b37 31af 0510 ...NCw.7>(7..1..
  83174. 803e1f2: 3943 0c1c 9ea3 a0fe 620c 787d 8405 535b C9.......b}x..[S
  83175. 803e202: 1111 41a2 4295 8011 8768 bbd0 aa20 a50e ...A.B..h... ...
  83176. 803e212: 28f7 c503 a9e2 2a10 5f11 7594 045d 7098 .(.....*._.u]..p
  83177. 803e222: fca6 0d96 a1e1 1b91 6270 10dd eba1 1a46 ........pb....F.
  83178. 803e232: 6002 7fea ebd6 d5ad 6ad6 9870 d073 5fd4 .`.......jp.s.._
  83179. 803e242: badd e773 27fe 5d94 dcb3 bc16 228d 239b ..s..'.].....".#
  83180. 803e252: 90a8 6cdb 4e3a c00d cee4 7234 2fde 4773 ...l:N....4r./sG
  83181. 803e262: ec1f c241 46b1 ba7b 4f81 c398 4482 d27c ..A..F{..O...D|.
  83182. 803e272: e54e eb81 06bb a5d1 79f0 3b98 bec7 06db N........y.;....
  83183. 803e282: 2724 000f 06ca 1156 c5de 686a 1a5b 4f6f $'....V...jh[.oO
  83184. 803e292: 3c8d ef64 a052 0358 9ab8 01df 49d4 0007 .<d.R.X......I..
  83185. 803e2a2: f915 eea2 3853 ca6d 5c11 618b 76b1 ea97 ....S8m..\.a.v..
  83186. 803e2b2: 1e9c c980 e45a 9930 0dc5 c30a 0a4a 8e9a ....Z.0.....J...
  83187. 803e2c2: 4651 a62c 1238 9688 9cb8 da83 9435 d029 QF,.8.......5.).
  83188. 803e2d2: be3c b816 0211 db2b 314a d305 1296 6641 <.....+.J1....Af
  83189. 803e2e2: 498d 964d f8ca 2b28 faad 55f0 1f5f ce5a .IM...(+...U_.Z.
  83190. 803e2f2: 75fe 5b44 bd1c 1b5b 3d59 066e c936 ab77 .uD[..[.Y=n.6.w.
  83191. 803e302: 3fef c018 7e0d e3e2 1151 08fc 6e5d f605 .?...~..Q...]n..
  83192. 803e312: c8a2 b77a b876 768a 0fd7 6e7c 13e1 fd7e ..z.v..v..|n..~.
  83193. 803e322: 7e27 36b7 df6e 9612 6e55 0ac1 6116 6142 '~.6n...Un...aBa
  83194. 803e332: 2abc 5771 4842 9a59 e197 90a2 76cd 1cda .*qWBHY......v..
  83195. 803e342: 0f18 00b5 4721 d88b 53ee 8103 c30c 3c23 ....!G...S....#<
  83196. 803e352: 22db 0aec cf6c 58e4 5f17 fadc 1eba 2f3e ."..l..X._....>/
  83197. 803e362: 0ce9 5153 ba30 0c71 38f1 9786 d118 bf43 ..SQ0.q..8....C.
  83198. 803e372: 8c86 d747 c981 8bbc 152b 7a46 3885 4f7f ..G.....+.Fz.8.O
  83199. 803e382: 8a5e 1424 4052 a5af a2bc c8cb bf67 3320 ^.$.R@......g. 3
  83200. 803e392: 7670 fe71 f4d5 716b 76d5 9af6 0231 0063 pvq...kq.v..1.c.
  83201. 803e3a2: 714a 5f32 aea1 9fb8 2b8f 30c8 7f1c d55e Jq2_.....+.0..^.
  83202. 803e3b2: ffa6 1b93 d481 2103 8688 5e20 f80f 228a .......!.. ^..."
  83203. 803e3c2: a805 113b fdaf 124b e88a 8139 f497 c0f8 ..;...K...9.....
  83204. 803e3d2: 252b 0124 5eba c7a3 e80a 01f5 a854 66c2 +%$..^......T..f
  83205. 803e3e2: e7d4 d070 3136 c136 c8ab ad8b 9af2 26cd ..p.616........&
  83206. 803e3f2: 4d38 6c34 10e3 77e6 8403 126c c20f b6c3 8M4l...w..l.....
  83207. 803e402: 943c 9260 da51 ae01 428d d977 c06e 29f6 <.`.Q....Bw.n..)
  83208. 803e412: 8b82 38f6 68b8 8a31 e18b 1747 1821 7ab3 ...8.h1...G.!..z
  83209. 803e422: f679 f4c5 8877 c21e 732d a688 9cc2 098e y...w...-s......
  83210. 803e432: 35d0 5a17 ba07 8dd3 320b 1984 d93c 4d91 .5.Z.....2..<..M
  83211. 803e442: 03c9 6df3 e9ae 7e46 bd4a 4f5e 00c7 fe6f ...m..F~J.^O..o.
  83212. 803e452: bdd5 4fbd 5d6e e537 93ef e393 8ed3 aefc ...On]7.........
  83213. 803e462: e5b2 3cd8 b486 4ed3 700d 06b3 6ee5 08ca ...<...N.p...n..
  83214. 803e472: 6bd8 a300 b1ea e26b 9f15 3aa5 046c c0b3 .k....k....:l...
  83215. 803e482: 92b0 b9e1 f2a3 b669 a45b 01ab 49a0 3962 ......i.[....Ib9
  83216. 803e492: ee03 6711 4061 3c82 5fec b086 6587 8bdd ...ga@.<._...e..
  83217. 803e4a2: c174 7da4 08e1 c016 305f d708 385b 9b88 t..}...._0..[8..
  83218. 803e4b2: eff7 c5c2 4d9d 6534 1679 582b 0092 ecf8 .....M4ey.+X....
  83219. 803e4c2: a4c2 1813 bd0d 4f04 a8b7 084f 716a 48e4 .......O..O.jq.H
  83220. 803e4d2: 659b 1019 05e4 39c3 5377 cf04 6430 2b31 .e.....9wS..0d1+
  83221. 803e4e2: 982f 7d28 9e0b 7a00 4d09 e0e8 2ec0 373c /.(}...z.M....<7
  83222. 803e4f2: 16d4 49ee 1f8c 7844 0ce7 22de 91f8 b1b8 ...I..Dx..."....
  83223. 803e502: bc99 6b7c 1990 c0ad 86f1 27d7 8236 7084 ..|k.......'6..p
  83224. 803e512: 8c8d 391a e8a5 c78c ec3c 2cc2 8b71 70e4 ...9....<..,q..p
  83225. 803e522: 718f 655d 4014 9205 9bfa 9a9a 6a72 fb91 .q]e.@......rj..
  83226. 803e532: 1aa9 f640 cd26 e219 e918 386e a491 14a5 ..@.&.....n8....
  83227. 803e542: 0942 8df8 2aa2 4bb1 63cc 9570 6f5c c774 B....*.K.cp.\ot.
  83228. 803e552: bc46 2584 3a4c 0e78 a3ab aaf4 b034 9c9e F..%L:x.....4...
  83229. 803e562: 7d6f 46de c937 d04c 2727 63c8 3708 f625 o}.F7.L.''.c.7%.
  83230. 803e572: f0e2 7957 d1a5 df7a 7f79 46bd e8ff 296a ..Wy..z.y..F..j)
  83231. 803e582: ca22 30fb 7f66 f778 f0b1 91d5 255b 66a5 "..0f.x.....[%.f
  83232. 803e592: 2387 4d08 65b8 79a0 017a 0fb9 7e3f 1b78 .#.M.e.yz...?~x.
  83233. 803e5a2: 106f 05e1 0c01 c61e 95fe a0d2 77ab ef34 o............w4.
  83234. 803e5b2: d8f9 0a87 a809 1e01 4059 4bae 74b9 05f7 ........Y@.K.t..
  83235. 803e5c2: 1059 2848 a3cb c42c 5bc7 407e 89ad 444c Y.H(..,..[~@..LD
  83236. 803e5d2: 7722 bc60 f045 879c 4f28 241d 5c0d e6e7 "w`.E...(O.$.\..
  83237. 803e5e2: f39d 1655 555e 81e3 3749 6ad2 49e7 dabc ..U.^U..I7.j.I..
  83238. 803e5f2: b0c7 1311 8147 7c16 0093 65a6 a4db 2194 ....G..|...e...!
  83239. 803e602: b75e 9e50 9e41 594b e9a9 25c2 9c5a d493 ^.P.A.KY...%Z...
  83240. 803e612: 95aa 7433 0ea5 905b 2878 9cae 123e 2144 ..3t..[.x(..>.D!
  83241. 803e622: b8c8 e409 730d 1543 a0d7 1240 0562 4fc9 .....sC...@.b..O
  83242. 803e632: 8a05 92c0 462c c967 a1ce 16c8 70d8 280a ....,Fg......p.(
  83243. 803e642: 3872 8733 c7dd 8983 d5a1 95ea b73f ca82 r83.........?...
  83244. 803e652: 4d46 d5ab f4da aeaf f161 b980 848c 4e3e FM......a.....>N
  83245. 803e662: 21fc 5d28 1451 c125 26a6 3afc 615d d2c0 .!(]Q.%..&.:]a..
  83246. 803e672: cee0 06c6 3436 78d8 6e7a c560 0ff7 da03 ....64.xzn`.....
  83247. 803e682: 3034 1fdf 97c1 bcb6 44bc 0756 84cc 997e 40.......DV...~.
  83248. 803e692: ade4 3ac7 97bd 296b f1dd 54e9 7931 a3b9 ...:..k)...T1y..
  83249. 803e6a2: 3bd5 1984 ad33 b63e 9cec 05f7 ac4b 289e .;..3.>.....K..(
  83250. 803e6b2: 40b4 c751 096c 8c80 d024 6318 64ab 6109 .@Q.l...$..c.d.a
  83251. 803e6c2: b1aa a7d9 8880 d713 6943 752e a272 829a ........Ci.ur...
  83252. 803e6d2: a5dc 3aec 9ec1 d745 b0cb 0023 661c 73a9 ...:..E...#..f.s
  83253. 803e6e2: 2180 24b9 9002 66be 4880 1ca7 90ee 6497 .!.$...f.H.....d
  83254. 803e6f2: fd97 e070 0430 a255 f29c ca69 008b a264 ..p.0.U...i...d.
  83255. 803e702: 627f 2165 451c 7be4 9639 a1f1 a11c 228e .be!.E.{9......"
  83256. 803e712: 793c 8f98 e44b 6abb 94ea d2a9 c18a ad9f <y..K..j........
  83257. 803e722: 9016 0c79 5fc8 05a5 4066 2aef 1083 470a ..y.._..f@.*...G
  83258. 803e732: 5c89 92e2 106b 98f7 b38c 9215 cd0b 4d37 .\..k.........7M
  83259. 803e742: 65c8 d2e8 5f2a c28f 2843 8fde 6326 9eb2 .e..*_..C(..&c..
  83260. 803e752: e363 71a7 1401 0a5d 7fff e7d4 2547 4463 c..q..].....G%cD
  83261. 803e762: 753e ae28 a9d4 713a e64c 766a 3c68 3f22 >u(...:qL.jvh<"?
  83262. 803e772: a3e8 0781 e732 3802 00fe 3a68 36f0 60e1 ....2..8..h:.6.`
  83263. 803e782: 4e93 6348 a1de 82aa 2c0f e274 58ed 1dbb .NHc.....,t..X..
  83264. 803e792: 4d0b 7b93 2dd7 9251 7742 0ee1 1d9b 7e5e .M.{.-Q.Bw....^~
  83265. 803e7a2: 122e e7cf db10 f2f2 8282 faf8 63d1 4fab .............c.O
  83266. 803e7b2: 820f b6c0 4137 4094 0fcf 08f0 6a5d 4bde ....7A.@....]j.K
  83267. 803e7c2: 4119 bf7e 9ece 27cf 6927 b9cb 58f3 0a05 .A~....''i...X..
  83268. 803e7d2: 8740 1fcd f283 e44a dbdc 4685 8460 7eb8 @.....J....F`..~
  83269. 803e7e2: 7448 ece4 631a f27c 62e9 d8c7 c669 1c33 Ht...c|..b..i.3.
  83270. 803e7f2: 4886 91c2 849a 591f 85b8 cca1 e51e 48ce .H.....Y.......H
  83271. 803e802: f114 f701 e201 fe29 8262 0f4b 6792 66a3 ......).b.K..g.f
  83272. 803e812: db98 9825 90c3 20ba 54b5 0ad0 a6da 42eb ..%.... .T.....B
  83273. 803e822: eea3 3da8 0eec 0699 0b53 4463 60eb 778e ...=....S.cD.`.w
  83274. 803e832: dda2 844e 0095 f475 2c29 9c04 1e1b d9b3 ..N...u.),......
  83275. 803e842: e0f1 443a f220 7878 7a48 4a44 e583 67e5 ..:D .xxHzDJ...g
  83276. 803e852: d9a6 c743 7f38 4590 c3c1 dc70 0053 2e01 ..C.8..E..p.S...
  83277. 803e862: 6133 474f c747 d403 af7b d704 041f 8468 3aOGG...{.....h.
  83278. 803e872: c45c a1d8 c14f 9ea5 009a 7d41 da8b 01b9 \...O.....A}....
  83279. 803e882: 754b c25c 72c3 65bc d03d 3d35 9511 c22b Ku\..r.e=.5=..+.
  83280. 803e892: 8753 e8a2 c201 f96c 28f9 c1d8 cdc4 7347 S.....l..(....Gs
  83281. 803e8a2: 5a9f c412 1687 84d8 f791 19f9 2de0 7292 .Z...........-.r
  83282. 803e8b2: 2e52 4581 75c2 884e 37a9 81c8 b9ec c725 R..E.uN..7....%.
  83283. 803e8c2: fba0 786c b490 f90f 7caa 63ea e446 8017 ..lx.....|.cF...
  83284. 803e8d2: 587b c74c 132f 1747 c153 b777 bfb4 bcbc {XL./.G.S.w.....
  83285. 803e8e2: 708f 0076 4f62 2181 10dd 4183 fb43 7f24 .pv.bO.!...AC.$.
  83286. 803e8f2: 8480 cd16 5f29 3332 ac25 9aa4 5f90 2f6e ....)_23%...._n/
  83287. 803e902: fda1 e8a7 d731 6e52 4f34 8571 8731 7ca9 ....1.Rn4Oq.1..|
  83288. 803e912: 04ab 1595 6c0b 9ae5 5146 cc48 b990 3897 .....l..FQH....8
  83289. 803e922: 8975 6489 0cbb 62c8 3f27 1d09 008c 5f9b u..d...b'?....._
  83290. 803e932: 5d7d caf2 00c9 437c 0da3 8b7b 04ee f494 }]....|C..{.....
  83291. 803e942: a17b 7b06 5d0a d75d 9a38 fe06 2d5d 6341 {..{.]].8...]-Ac
  83292. 803e952: a25e 8ae1 0f61 6ccf 08b8 20f4 43b6 4531 ^...a..l... .C1E
  83293. 803e962: c9d9 3d80 b8c9 5da1 8f09 6586 4543 65c6 ...=...]...eCE.e
  83294. 803e972: 7d1c 5782 4065 f958 a877 7616 6b2a b068 .}.We@X.w..v*kh.
  83295. 803e982: 7ac3 1ba2 330a c386 f65c 9d4e 562a 5101 .z...3..\.N.*V.Q
  83296. 803e992: fe00 42b6 92df 401f 238b 23b1 0447 1219 ...B...@.#.#G...
  83297. 803e9a2: 7a1c 547a 5c0a 4f66 8050 9d87 b621 b82f .zzT.\fOP...!./.
  83298. 803e9b2: 20e2 fa7f 6680 1c08 8417 84f3 83d0 5f6b . ...f........k_
  83299. 803e9c2: 682e 2081 66c4 ac28 875f c9b6 4acc 1103 .h. .f(._....J..
  83300. 803e9d2: 8a05 bb97 a7c7 7273 1d66 5372 20d0 5ec6 ......srf.rS. .^
  83301. 803e9e2: 3449 3930 4397 35d1 ab6c f1d0 0671 70ba I409.C.5l...q..p
  83302. 803e9f2: 255b c203 5550 bb63 7d15 b46a 3585 014b [%..PUc..}j..5K.
  83303. 803ea02: b4fb ea5e 4b34 8f47 9668 8141 d0c9 6845 ..^.4KG.h.A...Eh
  83304. 803ea12: d4a5 68f5 28c5 2592 6c3d 3615 2848 a5b5 ...h.(.%=l.6H(..
  83305. 803ea22: 0c80 e53e 88cc 24f7 426f 3756 2872 f0cb ..>....$oBV7r(..
  83306. 803ea32: 4a4f 930e 2ba1 5048 00ac 915a b27b 438c OJ...+HP..Z.{..C
  83307. 803ea42: 864f 3004 c0e3 962b edc5 2f90 b94c d88a O..0..+..../L...
  83308. 803ea52: a70c fee2 e08a 598f 0897 200d 47ba 0bf8 .......Y... .G..
  83309. 803ea62: 713a 6288 83e0 dc3b 0c7b 167a ec34 0691 :q.b..;.{.z.4...
  83310. 803ea72: 8b87 e2a6 84ba 4c81 a075 a9d1 aae9 92b3 .......Lu.......
  83311. 803ea82: 4fe5 cd4a 9fcb 386d 14cd 725d 1e48 4fe4 .OJ...m8..]rH..O
  83312. 803ea92: 48a0 7338 8a16 6a9d 842d 99d8 3d62 6a37 .H8s...j-...b=7j
  83313. 803eaa2: 2d30 2881 9a8c f6f9 a1a2 9483 6511 68b4 0-.(.........e.h
  83314. 803eab2: 7de8 7a1e b77f 17d3 0027 3ded a777 d08f .}.z....'..=w...
  83315. 803eac2: 194f 0750 99b1 7d86 994c 0fa4 49b4 c503 O.P....}L....I..
  83316. 803ead2: 951d d3ea c7d0 7cad 0342 4fdf f53f d2c0 .......|B..O?...
  83317. 803eae2: da3d 062b 523f 7046 d832 6b03 ea26 b1e1 =.+.?RFp2..k&...
  83318. 803eaf2: 4c63 4321 762b 5f0d a3e9 7187 714e bffa cL!C+v._...qNq..
  83319. 803eb02: 324d 49ca 963a a381 1fc5 10e5 91c1 3232 M2.I:.........22
  83320. 803eb12: 30ec be95 04aa 70a4 e50e a90c d292 56d5 .0.....p.......V
  83321. 803eb22: fa7f 5e24 c139 f7ff fb56 5d8a 5510 b1e1 ..$^9...V..].U..
  83322. 803eb32: dc64 b7d7 560d c44a 44f5 85ff 5a27 face d....VJ..D..'Z..
  83323. 803eb42: 6c53 5cd2 127d 8da3 137c 8bdc 4e5d a29b Sl.\}...|...]N..
  83324. 803eb52: 5f97 d389 63a8 6b2e 8e84 c11c 596d 7b79 ._...c.k....mYy{
  83325. 803eb62: f5e8 3d6f 971f 27f4 6c4f 6f60 7f85 7a1b ..o=...'Ol`o...z
  83326. 803eb72: 89e1 f252 e1f0 e04c 272b 3ec4 1953 9d44 ..R...L.+'.>S.D.
  83327. 803eb82: 5937 bce3 7287 2827 b1a5 f946 2020 9189 7Y...r'(..F. ..
  83328. 803eb92: 165c 176e 88ea c5f9 7368 683b cda6 381c \.n.....hs;h...8
  83329. 803eba2: e776 860c edf2 60cf 9c40 5236 c83b 019f v......`@.6R;...
  83330. 803ebb2: fb59 ecd2 27c1 0206 534c 06fb 47b8 8581 Y....'..LS...G..
  83331. 803ebc2: c7a7 5a87 f3db 49ca 8735 8dd2 afa7 cfdf ...Z...I5.......
  83332. 803ebd2: ab5c eef2 9d35 0564 8394 094c 8cf5 4872 \...5.d...L...rH
  83333. 803ebe2: 3340 aa6d c363 5ba6 b8da 8584 c10d 46bb @3m.c..[.......F
  83334. 803ebf2: e5be e947 badc 5890 37c0 295c 3b3f 588e ..G....X.7\)?;.X
  83335. 803ec02: 5dcd ca24 7015 3e50 98c6 9411 2d29 4a28 .]$..pP>....)-(J
  83336. 803ec12: ec16 83c8 4e99 ba54 6fd2 0e45 27e4 95f5 .....NT..oE..'..
  83337. 803ec22: 596e 7a0a 1045 b1f0 6d03 0046 37a9 e028 nY.zE....mF..7(.
  83338. 803ec32: 1206 6bdc c739 3cbd c64c f1d9 3b76 609e ...k9..<L...v;.`
  83339. 803ec42: 9001 90e0 9052 3c26 2e1e 508e b8be eee7 ....R.&<...P....
  83340. 803ec52: 77d4 c615 5be9 27b2 e75d a569 6bc2 2e6e .w...[.'].i..kn.
  83341. 803ec62: 8178 6f30 2a0b 84cc 76e2 1c29 0a10 d40e x.0o.*...v).....
  83342. 803ec72: 1528 fbc0 d467 49a1 7073 8aba d637 ba40 (...g..Isp..7.@.
  83343. 803ec82: f4ed 0231 7b97 08fb d727 3ba5 5f82 325d ..1..{..'..;._]2
  83344. 803ec92: de5e c010 8c1a e204 c533 590d 8c63 0519 ^.......3..Yc...
  83345. 803eca2: d727 b641 6d55 e57a deab a2bd 236b f5cf '.A.Umz.....k#..
  83346. 803ecb2: c42d b0b3 4ddf 56d7 3eaf ae09 afb4 fce8 -....M.V.>......
  83347. 803ecc2: 93bb 0caa 66dc cae9 6093 111b fb70 5e1a .....f...`..p..^
  83348. 803ecd2: 445a d215 62a1 a1d2 4af0 7021 ea60 f057 ZD...b...J!p`.W.
  83349. 803ece2: 23b4 f659 11b2 9c3c bd0c 070b d330 d5ff .#Y...<.....0...
  83350. 803ecf2: 6d2b aafd a8be ee5f cb4d 0142 a157 a1ce +m...._.M.B.W...
  83351. 803ed02: 8743 935e 5edc d2e5 f3ab 182c a227 9792 C.^..^....,.'...
  83352. 803ed12: 9b35 f414 4534 c6cf 09a7 c55b 2b45 9f0c 5...4E....[.E+..
  83353. 803ed22: d89c 12dd c1ec cc31 d5bd 2b43 480a a1c1 ......1...C+.H..
  83354. 803ed32: 2797 41f2 d4d5 ac84 b4f0 436b f573 920c .'.A......kCs...
  83355. 803ed42: eb7a 44a7 74e3 1fea f67a 9fbe 67c8 ae64 z..D.t..z....gd.
  83356. 803ed52: 3e05 4c24 f1d8 cff8 b008 2014 92ff 4cc0 .>$L....... ...L
  83357. 803ed62: cf49 8b14 9d21 e6a0 fac6 3d26 03d4 60bb I...!.....&=...`
  83358. 803ed72: 5cdf b92a 7978 0c93 d05f bdcf a708 8237 .\*.xy.._.....7.
  83359. 803ed82: 1cf1 bbaf 6f54 d52f 4828 8719 d913 e0ca ....To/.(H......
  83360. 803ed92: d2ed 58fc 3db3 6792 8261 2170 6944 8696 ...X.=.ga.p!Di..
  83361. 803eda2: 7337 3c62 e11c 484f c4e6 2b93 67fc 8a0d 7sb<..OH...+.g..
  83362. 803edb2: 6bdd 0a2e 1093 f6c0 cfa4 16f2 52e4 1f78 .k...........Rx.
  83363. 803edc2: 75b4 2064 1b76 2e42 9eb4 65e5 4be8 4503 .ud v.B....e.K.E
  83364. 803edd2: 4090 1644 48cd b87f b8e1 6b70 ff2d 1c87 .@D..H....pk-...
  83365. 803ede2: 7f72 808a 7cec bd60 3887 1d32 df93 18a0 r....|`..82.....
  83366. 803edf2: cf59 cf4b ea56 a0eb d553 3674 fc9f 7693 Y.K.V...S.t6...v
  83367. 803ee02: e956 4999 e684 7054 a740 d8ab d6cb 5ae3 V..I..Tp@......Z
  83368. 803ee12: 5914 9947 0305 847f 8860 0d48 3c68 b5a6 .YG.....`.H.h<..
  83369. 803ee22: b883 9e48 beb7 ee12 9c9e 3b58 2c81 3acd ..H.......X;.,.:
  83370. 803ee32: 9d00 75c8 0f15 d08d df95 7b1d bc65 7e0b ...u.......{e..~
  83371. 803ee42: 9f26 291e 7523 e272 9819 d77a ef6b 65e3 &..)#ur...z.k..e
  83372. 803ee52: 6cd4 fd1c 6922 21f1 e4a6 b72c 6ce3 932b .l.."i.!..,..l+.
  83373. 803ee62: c75c dc11 6d0a 9d43 25de 4701 4a7e 4479 \....mC..%.G~JyD
  83374. 803ee72: c20e 8265 87a2 1436 6656 37a7 c6b2 52dd ..e...6.Vf.7...R
  83375. 803ee82: 9700 38dc 049b 4156 dfd4 6fd1 5db0 8718 ...8..VA...o.]..
  83376. 803ee92: f882 0490 efa9 2b16 d660 d5f2 0b02 7727 .......+`.....'w
  83377. 803eea2: b648 7a0c 1ff1 1308 6576 2f81 273c 0784 H..z....ve./<'..
  83378. 803eeb2: 601b e04d bba9 21ed 571e a6c8 af4e c88c .`M....!.W..N...
  83379. 803eec2: 2751 0bc0 2456 f32b 32b3 2860 7fcb fc8a Q'..V$+..2`(....
  83380. 803eed2: af04 e2ed 5da8 8f40 dc90 6195 48bb a6a8 .....]@....a.H..
  83381. 803eee2: 678b ced2 84ab cf8e 86ab cbbe 508c 6bfe .g...........P.k
  83382. 803eef2: b00c ec08 b220 05e4 2390 2b76 d25c a9a1 .... ....#v+\...
  83383. 803ef02: bb17 d782 d4d4 d615 4256 3a58 466a 1d84 ........VBX:jF..
  83384. 803ef12: 7a88 b732 6f08 a2c4 a050 a67b 312c 3111 .z2..o..P.{.,1.1
  83385. 803ef22: 14b4 77ab d494 202e a79b 10dc a2a6 14e8 ...w... ........
  83386. 803ef32: 8b61 106e 7160 62b0 a4fc 4492 de9c 94e6 a.n.`q.b...D....
  83387. 803ef42: 1ede 5899 fc87 4b9b 0172 8051 c845 d017 ...X...Kr.Q.E...
  83388. 803ef52: 1903 b007 635e 640d bcb6 dbf6 d39e e4d0 ....^c.d........
  83389. 803ef62: 994c 417b a32f 85bf 2d82 5c45 0826 b013 L.{A/....-E\&...
  83390. 803ef72: 620b 55cd 6070 fcb9 53a3 e43d b127 b7b2 .b.Up`...S=.'...
  83391. 803ef82: f873 a776 655a c76e f6c4 7c45 6a4b 4ad2 s.v.Zen...E|Kj.J
  83392. 803ef92: 01bd 6a42 1ee8 4a9f 41f9 bc08 fefc ac0d ..Bj...J.A......
  83393. 803efa2: 3891 f782 c7db 3478 7da7 3b65 203e 452e .8....x4.}e;> .E
  83394. 803efb2: 19f7 46f4 070d e791 07f7 e3b8 df4e be07 ...F........N...
  83395. 803efc2: 0877 a757 c3a9 acdc 37d5 1ab6 43fc 9ed7 w.W......7...C..
  83396. 803efd2: 868f cc01 03fd f13c 5ed5 3d5d 3c3c 1eac ......<..^]=<<..
  83397. 803efe2: ab36 d461 c55f 85b5 2ada c41a 679d ff32 6.a._....*...g2.
  83398. 803eff2: 8783 77eb c2e9 b690 6ad6 b41d 9b5a d0cf ...w.....j..Z...
  83399. 803f002: ab4c a5b2 9a35 a549 d4d1 06b6 6695 f6a3 L...5.I......f..
  83400. 803f012: 52ac 696f a435 5b2b 6549 bf0b 2a0f adeb .Roi5.+[Ie...*..
  83401. 803f022: 3567 a5ca 4254 8305 a346 5075 ae69 6635 g5..TB..F.uPi.5f
  83402. 803f032: 01f3 b549 a2d1 95b6 c350 462f faad a6ba ..I.....P./F....
  83403. 803f042: 3720 1b2b 4acd 0363 d5dd 36b7 3ff9 3212 7+..Jc....6.?.2
  83404. 803f052: c34f 7217 2a35 68d9 286a 0e40 92ff b9b9 O..r5*.hj(@.....
  83405. 803f062: 022c 2d90 3550 bec0 6118 5a48 330d d46a ,..-P5...aHZ.3j.
  83406. 803f072: 2ab6 f3b8 35a4 d737 6baa d798 56c6 0d75 .*...57..k...Vu.
  83407. 803f082: f155 c2b3 7059 36a7 17c5 8981 f972 2d33 U...Yp.6....r.3-
  83408. 803f092: 60c9 4d64 0ad1 cfd7 271a 5128 7f2e 9a52 .`dM.....'(Q..R.
  83409. 803f0a2: 5e61 50e8 87f7 2990 acae 63e4 564e 0e48 a^.P...)...cNVH.
  83410. 803f0b2: e1c1 d07e 7abf f105 789b 8902 b69f 8578 ..~..z...x....x.
  83411. 803f0c2: e867 9ee1 e726 7d30 eb88 af4a becf 0880 g...&.0}..J.....
  83412. 803f0d2: 7857 e56e 23c7 4d91 432c b5a3 0079 129c Wxn..#.M,C..y...
  83413. 803f0e2: d746 30b1 0b5a 6cc8 01ad 83ed 634a fd6d F..0Z..l....Jcm.
  83414. 803f0f2: a559 0eb1 692a a1ad 5688 5f13 1507 a706 Y...*i...V._....
  83415. 803f102: 4e02 5c27 2038 8260 0345 4fc8 a5b8 a317 .N'\8 `.E..O....
  83416. 803f112: 0826 b6aa 3eb6 34ac 3536 0408 3a20 a6ea &....>.465.. :..
  83417. 803f122: c351 895a f08e db31 5615 3a90 2023 4774 Q.Z...1..V.:# tG
  83418. 803f132: 2b55 2aa2 b977 b9c1 ab49 60c5 a203 d164 U+.*w...I..`..d.
  83419. 803f142: 322d 63b8 a000 b9ed c1a5 4a1b d70b bfe5 -2.c.......J....
  83420. 803f152: a3f0 78e3 9149 4217 54a8 da3f 340a b6b6 ...xI..B.T?..4..
  83421. 803f162: cdb4 737a 6958 1a35 fe1a 3f03 025b 34ab ..zsXi5....?[..4
  83422. 803f172: 8115 2076 ab60 ff45 50a9 03fe 18ee 43f7 ..v `.E..P.....C
  83423. 803f182: 736c b820 8cf1 304b c26d 2f1c b0c0 dade ls ...K0m../....
  83424. 803f192: aec0 00df aec9 ec81 16d7 d441 59c0 2eb8 ..........A..Y..
  83425. 803f1a2: a33a b47f 7222 eadd baad d9b6 6de4 efff :..."r.......m..
  83426. 803f1b2: 3376 a473 42d8 f99a 6e0d 7dfa 814a d826 v3s..B...n.}J.&.
  83427. 803f1c2: eaba a5c1 8d1f d666 5bd7 e6da 3ad6 f531 ......f..[...:1.
  83428. 803f1d2: f5b5 3aca d436 26d6 0dd6 0db9 3fac 6bfe ...:6..&.....?.k
  83429. 803f1e2: 06f8 6cbd eb6a fa75 1005 25ca fe08 df4f ...lj.u....%..O.
  83430. 803f1f2: 84a2 7796 a1b3 d26d 6b46 c0b6 1bf2 f8eb ...w..m.Fk......
  83431. 803f202: 6c6a 9ed4 c0b5 1b3a 16da 2b38 4098 d9b2 jl....:...8+.@..
  83432. 803f212: 96c4 ab5a 433d ab56 5e81 da90 0fc2 27d0 ..Z.=CV..^.....'
  83433. 803f222: dcf1 7c4d ab3e bba0 b40d 56bf 4e47 b37d ..M|>......VGN}.
  83434. 803f232: 549e a8d6 a352 87c1 ad4f b5a5 cb68 9783 .T..R...O...h...
  83435. 803f242: 5aa3 46bd ead5 04eb 7f20 1c8a cd2a 5601 .Z.F.... ...*..V
  83436. 803f252: 1d44 0382 738d fa1d 4989 4d50 042a a2b5 D....s...IPM*...
  83437. 803f262: 4d0a 51a3 0ee7 9ac1 1708 0a34 ad4c 0cfe .M.Q......4.L...
  83438. 803f272: 0afb e113 e271 2c06 a6fa 57c1 f068 9acf ....q..,...Wh...
  83439. 803f282: 4af5 89ab 57c1 6ad6 16c9 8a46 d21d 4702 .J...W.j..F....G
  83440. 803f292: e1ab 2334 6034 d4df c212 068c bccc e118 ..4#4`..........
  83441. 803f2a2: ac6c 1711 c03a 606f 0d7e 6ecd 5b6a 9c35 l...:.o`~..nj[5.
  83442. 803f2b2: 359c 051c 89f8 fd34 aadb 31d1 900a 5aca .5....4....1...Z
  83443. 803f2c2: 1443 5c24 5806 e924 56df d2ed 09ac 067f C.$\.X$..V......
  83444. 803f2d2: 18a4 8d49 6267 394f 529a bdbc 80b5 9ae4 ..I.gbO9.R......
  83445. 803f2e2: 147f 6259 81ab 6f29 3fac 6b5b bf82 316f ..Yb..)o.?[k..o1
  83446. 803f2f2: c052 9365 b126 4a5a 341e e937 5900 d503 R.e.&.ZJ.47..Y..
  83447. 803f302: 2ca8 0cc2 0f21 83e9 3afa 6ce1 bd7d 2c42 .,..!....:.l}.B,
  83448. 803f312: 4ea9 4152 a9bd 36b5 5806 3a22 d661 84e9 .NRA...6.X":a...
  83449. 803f322: 1641 418a 1b52 79f4 d950 3aa2 2454 1232 A..AR..yP..:T$2.
  83450. 803f332: 3e51 1ae0 8154 421a 2259 a49a 5e2e 308c Q>..T..BY"...^.0
  83451. 803f342: 7a82 f203 66ca 4d0b 3637 5071 826d 20fc .z...f.M76qPm..
  83452. 803f352: b0d1 837c 8513 1a44 a9d9 7e14 be20 60b0 ..|...D....~ ..`
  83453. 803f362: c074 81fd 6a61 262c 94b1 7dc4 3149 4207 t...aj,&...}I1.B
  83454. 803f372: 9092 d091 00e4 5f6d 0d7a 837f fe93 5877 ......m_z.....wX
  83455. 803f382: 3c45 435b 9297 e53f 2880 008a 7f13 01d7 E<[C..?..(......
  83456. 803f392: 666f 417e 8092 5758 33ba 60b1 ff51 0278 of~A..XW.3.`Q.x.
  83457. 803f3a2: bd62 db55 801c 0f5e 5f08 a203 03dc dc9a b.U...^.._......
  83458. 803f3b2: 7088 0158 0732 4624 42ca e4fe 8052 2171 .pX.2.$F.B..R.q!
  83459. 803f3c2: 6480 7d19 1171 e0ea 68dc 901c b034 a240 .d.}q....h..4.@.
  83460. 803f3d2: 83a8 2d79 2916 7e08 a456 e860 9979 3b82 ..y-.).~V.`.y..;
  83461. 803f3e2: d3ff e1ee e41d ffc6 188f 0a41 7ba6 692d ..........A..{-i
  83462. 803f3f2: 0647 ea37 a7a7 7f9d c101 087e 973c 0072 G.7.......~.<.r.
  83463. 803f402: 2f00 .
  83464. 0803f403 <data__index_html>:
  83465. 803f403: 692f 646e 7865 682e 6d74 006c 5448 5054 /index.html.HTTP
  83466. 803f413: 312f 312e 3220 3030 4f20 0d4b 530a 7265 /1.1 200 OK..Ser
  83467. 803f423: 6576 3a72 6c20 4977 2f50 2e31 2e33 2031 ver: lwIP/1.3.1
  83468. 803f433: 6828 7474 3a70 2f2f 6173 6176 6e6e 6861 (http://savannah
  83469. 803f443: 6e2e 6e6f 6e67 2e75 726f 2f67 7270 6a6f .nongnu.org/proj
  83470. 803f453: 6365 7374 6c2f 6977 2970 0a0d 6f43 746e ects/lwip)..Cont
  83471. 803f463: 6e65 2d74 654c 676e 6874 203a 3031 3937 ent-Length: 1079
  83472. 803f473: 0a0d 6f43 6e6e 6365 6974 6e6f 203a 6c43 ..Connection: Cl
  83473. 803f483: 736f 0d65 430a 6e6f 6574 746e 742d 7079 ose..Content-typ
  83474. 803f493: 3a65 7420 7865 2f74 7468 6c6d 0a0d 6f43 e: text/html..Co
  83475. 803f4a3: 746e 6e65 2d74 6e45 6f63 6964 676e 203a ntent-Encoding:
  83476. 803f4b3: 7a67 7069 0a0d 0a0d 8b1f 0008 0000 0000 gzip............
  83477. 803f4c3: 0a04 56bd 6f5d 44e3 fd14 832b 6979 baa5 ...V]o.D..+.yi..
  83478. 803f4d3: fba1 2084 54b6 8bba 4fb4 10ac f620 9a29 ... .T...O.. .).
  83479. 803f4e3: 93d8 1678 ed7f 9278 6fb4 60fd 5161 8291 ..x...x..o.`aQ..
  83480. 803f4f3: a010 e17d 17f3 8174 9a40 dda6 30bf 47fe ..}...t.@....0.G
  83481. 803f503: 3b9c bb8e 3521 5961 7d89 93b0 e7b1 7bde .;..!5aY.}.....{
  83482. 803f513: b9ee 5ee7 fb4f dbb5 edef 707d deff 161d ...^O.....}p....
  83483. 803f523: 24e9 dbf6 6774 4f31 9efb 60e3 7825 b7e8 .$..tg1O...`%x..
  83484. 803f533: a113 0b39 ae22 a10a 673d 7ba0 9bee 6778 ..9."...=g.{..xg
  83485. 803f543: 469f e75a 78ae 9038 cf43 d8f9 70fd ddd7 .FZ..x8.C....p..
  83486. 803f553: 92cb 6b9c 8dd9 c385 2c82 22d5 c985 3bdd ...k.....,."...;
  83487. 803f563: 089e a2fb 4a36 2279 673c c528 cf28 5e94 ....6Jy"<g(.(..^
  83488. 803f573: 37da a192 bc8e 0c50 2065 bb5c 92d8 d4a9 .7....P.e \.....
  83489. 803f583: c792 116e 58f0 3b78 095b 97df 20c9 5eb9 ..n..Xx;[.... .^
  83490. 803f593: 0a0f eca1 2382 f7a4 4206 a968 e163 1f9b .....#...Bh.c...
  83491. 803f5a3: 59cd 6879 ccce 4cdc e3ca b0f2 6d3c aab7 .Yyh...L....<m..
  83492. 803f5b3: ed37 a658 b09f 8948 e79e 5c24 dba6 5141 7.X...H...$\..AQ
  83493. 803f5c3: 4c38 d889 0a73 107d 228b 4212 4fc3 2811 8L..s.}..".B.O.(
  83494. 803f5d3: 6b99 0fa6 8072 62d5 b75f f01e af21 3a9e .k..r..b_...!..:
  83495. 803f5e3: 50ac e781 2ca8 db16 0a0f 6e6c cf55 a7f1 .P...,....lnU...
  83496. 803f5f3: aca2 859b 7e07 943b 1643 bcc4 3c28 e527 .....~;.C...(<'.
  83497. 803f603: 2ec3 ac57 71fa d143 83e3 d758 9ecb 17dc ..W..qC...X.....
  83498. 803f613: aba1 1cb3 6e9e b8d8 51e4 eaa8 df95 0be6 .....n...Q......
  83499. 803f623: 32e8 c50d 36fe 0b95 5604 e231 9fac 1611 .2...6...V1.....
  83500. 803f633: 0b8e ea6e 6d7b baf1 64c3 9c88 3a45 2570 ..n.{m...d..E:p%
  83501. 803f643: b36a 3ad8 6b88 807b 11ab 6fe1 9bb5 f8fe j..:.k{....o....
  83502. 803f653: 6ca0 606d 681e 4439 9b79 2748 6430 ecbe .lm`.h9Dy.H'0d..
  83503. 803f663: 3a02 32d2 17ed 7c15 7cdf 5a8f 511d cc95 .:.2...|.|.Z.Q..
  83504. 803f673: 3995 3337 ad33 5872 9335 2f69 4dab 989e .9733.rX5.i/.M..
  83505. 803f683: f2cb 7353 9305 8c39 333f 72d3 6cdc c914 ..Ss..9.?3.r.l..
  83506. 803f693: 6742 a0ea fbb6 3cae cd81 8425 f171 7f7c Bg.....<..%.q.|.
  83507. 803f6a3: 006b 57e5 2d94 3fd1 3c52 41cf 65bc a16d k..W.-.?R<.A.em.
  83508. 803f6b3: 7065 ed11 e634 c789 b5cb 79cb 622a ef66 ep..4......y*bf.
  83509. 803f6c3: b575 bb61 bde4 457a 05b5 5513 e28c 365e u.a...zE...U..^6
  83510. 803f6d3: 42a2 279b 06c4 fb92 401c 66a7 ccc6 e433 .B.'.....@.f..3.
  83511. 803f6e3: 0c77 58cc 4f22 42f2 cc95 cd0b e8b5 2d50 w..X"O.B......P-
  83512. 803f6f3: 60a1 5e2b e9cf 19c5 6fd7 2531 11fb 78a9 .`+^.....o1%...x
  83513. 803f703: 0859 a237 4a93 47b1 ef53 22d4 16a8 ebba Y.7..J.GS.."....
  83514. 803f713: 7392 a97a 8570 f9be 7cba ea84 0efc 5708 .sz.p....|.....W
  83515. 803f723: c266 832c d0cf 6356 87f3 5899 1398 f1b6 f.,...Vc...X....
  83516. 803f733: eed1 26de 0cda 8323 02ae 5a29 bb9c 047b ...&..#...)Z..{.
  83517. 803f743: 9684 a1f8 2d37 f4eb f1da cbe9 bebb 2ffd ....7-........./
  83518. 803f753: 6bae 67cc 98e5 4e81 332b 0b10 1b2e ca70 .k.g...N+3....p.
  83519. 803f763: d3b4 e253 3361 9ad8 489f a186 dea0 48a9 ..S.a3...H.....H
  83520. 803f773: 8e79 85fd 6442 bd03 4626 14e5 60dd 037e y...Bd..&F...`~.
  83521. 803f783: 27b5 4fe6 42f4 d013 447c e0e3 191f 05fd .'.O.B..|D......
  83522. 803f793: 9915 e741 405f e73c 720c a09f 5348 6f33 ..A._@<..r..HS3o
  83523. 803f7a3: 3948 b24f e690 8372 c6af d184 d076 3400 H9O...r.....v..4
  83524. 803f7b3: 3759 031d 5fd8 38b1 58a4 49e8 c1f0 23ca Y7..._.8.X.I...#
  83525. 803f7c3: 2b92 dbf0 34c6 0de7 7971 55cc 14d2 65b7 .+...4..qy.U...e
  83526. 803f7d3: 07f5 1040 7d6b d55f 7fed ab6d b877 42d6 ..@.k}_...m.w..B
  83527. 803f7e3: e941 2be6 0700 6633 eb8e 1ca2 26db 34c3 A..+..3f.....&.4
  83528. 803f7f3: 4f28 d249 814f c217 7cb0 af4d ac9b 2afb (OI.O....|M....*
  83529. 803f803: ec9b 4c5b 19b3 49f4 f0c3 55cb 3744 ab1b ..[L...I...UD7..
  83530. 803f813: 75cb e027 d5f4 a868 42df c8a1 c4ee 568e .u'...h..B.....V
  83531. 803f823: d2ea e44b 468c 8638 e622 2a18 e413 9c8a ..K..F8."..*....
  83532. 803f833: 48ed d26c 4c99 a153 5a3a 6b24 fc43 a760 .Hl..LS.:Z$kC.`.
  83533. 803f843: 6415 3e50 df86 5609 8663 c905 4e6e e8d1 .dP>...Vc...nN..
  83534. 803f853: fc2b 9a94 7ece 5783 0387 a0e5 2265 b13a +....~.W....e":.
  83535. 803f863: d9e8 b581 273a 07fe 4045 3f09 e923 d047 ....:'..E@.?#.G.
  83536. 803f873: ea2c c20e 0c41 d78d c599 8f58 f0d7 5655 ,...A.....X...UV
  83537. 803f883: 1bfe ccb4 0011 3580 2140 9e45 8913 7e76 .......5@!E...v~
  83538. 803f893: f435 284f d677 fd55 7027 817f 76cb e564 5.O(w.U.'p...vd.
  83539. 803f8a3: 3169 d8a8 834e 9537 acbd 5bb7 de8d 356e i1..N.7....[..n5
  83540. 803f8b3: 6b61 e3aa cba2 d3ab 0bd2 b81c 79ec efed ak...........y..
  83541. 803f8c3: ae07 56b5 c87e 7f35 c717 bba7 c6e9 56e6 ...V~.5........V
  83542. 803f8d3: 15ce 8a4f 05f7 7c86 6d11 be6c ae8d 67b1 ..O....|.ml....g
  83543. 803f8e3: b43c 3d8f fefc 4905 2b6e 0ce6 000b 2f00 <..=...In+.....
  83544. 0803f8f2 <data__favicon_ico>:
  83545. 803f8f2: 662f 7661 6369 6e6f 692e 6f63 0000 0000 /favicon.ico....
  83546. 803f902: 5448 5054 312f 312e 3220 3030 4f20 0d4b HTTP/1.1 200 OK.
  83547. 803f912: 530a 7265 6576 3a72 6c20 4977 2f50 2e31 .Server: lwIP/1.
  83548. 803f922: 2e33 2031 6828 7474 3a70 2f2f 6173 6176 3.1 (http://sava
  83549. 803f932: 6e6e 6861 6e2e 6e6f 6e67 2e75 726f 2f67 nnah.nongnu.org/
  83550. 803f942: 7270 6a6f 6365 7374 6c2f 6977 2970 0a0d projects/lwip)..
  83551. 803f952: 6f43 746e 6e65 2d74 654c 676e 6874 203a Content-Length:
  83552. 803f962: 3131 3035 0a0d 6f43 6e6e 6365 6974 6e6f 1150..Connection
  83553. 803f972: 203a 6c43 736f 0d65 430a 6e6f 6574 746e : Close..Content
  83554. 803f982: 742d 7079 3a65 6920 616d 6567 782f 692d -type: image/x-i
  83555. 803f992: 6f63 0d6e 430a 6361 6568 432d 6e6f 7274 con..Cache-Contr
  83556. 803f9a2: 6c6f 203a 7270 7669 7461 2c65 6d20 7861 ol: private, max
  83557. 803f9b2: 612d 6567 383d 3436 3030 0a0d 0a0d 0000 -age=86400......
  83558. 803f9c2: 0001 0001 1010 0000 0000 0020 0468 0000 .......... .h...
  83559. 803f9d2: 0016 0000 0028 0000 0010 0000 0020 0000 ....(....... ...
  83560. 803f9e2: 0001 0020 0000 0000 0440 0000 0000 0000 .. .....@.......
  83561. 803f9f2: 0000 0000 0000 0000 0000 0000 ffff 01ff ................
  83562. 803fa02: ffff 01ff ffff 01ff ffff 01ff ffff 01ff ................
  83563. 803fa12: ffff 01ff ffff 01ff d2d2 ffd2 d2d2 ffd2 ................
  83564. 803fa22: ffff 01ff ffff 01ff ffff 01ff ffff 01ff ................
  83565. 803fa32: ffff 01ff ffff 01ff ffff 01ff ffff 01ff ................
  83566. 803fa42: ffff 01ff ffff 01ff ffff 01ff ffff 01ff ................
  83567. 803fa52: 8d8d ff8d 8484 ff84 8989 ff89 8989 ff89 ................
  83568. 803fa62: 8484 ff84 8d8d ff8d ffff 01ff ffff 01ff ................
  83569. 803fa72: ffff 01ff ffff 01ff ffff 01ff ffff 01ff ................
  83570. 803fa82: ffff 01ff ffff 01ff a4a4 ffa4 8484 ff84 ................
  83571. 803fa92: aeae ffae ffff 01ff ffff 01ff ffff 01ff ................
  83572. 803faa2: ffff 01ff aeae ffae 8484 ff84 a4a4 ffa4 ................
  83573. 803fab2: ffff 01ff ffff 01ff 8181 ff81 ffff 01ff ................
  83574. 803fac2: ffff 01ff a0a0 ffa0 9a9a ff9a ffff 01ff ................
  83575. 803fad2: c7c7 ffc7 8f8f ff8f 8585 ff85 8585 ff85 ................
  83576. 803fae2: 8f8f ff8f caca ffca ffff 01ff d5d5 ffd5 ................
  83577. 803faf2: ffff 01ff 7777 ff77 ffff 01ff ffff 01ff ....www.........
  83578. 803fb02: d5d5 ffd5 8484 ff84 ffff 01ff a8a8 ffa8 ................
  83579. 803fb12: 8c8c ff8c bbbb ffbb ffff 01ff ffff 01ff ................
  83580. 803fb22: baba ffba afaf ffaf ffff 01ff ffff 01ff ................
  83581. 803fb32: 6465 ff5b ffff 01ff ffff 01ff ffff 01ff ed[.............
  83582. 803fb42: 9898 ff98 b0b0 ffb0 d5d5 ffd5 8484 ff84 ................
  83583. 803fb52: dada ffda 9595 ff95 8484 ff84 9d9d ff9d ................
  83584. 803fb62: d7d7 ffd7 ffff 01ff 9898 ff97 7a7b ff73 ............{zs.
  83585. 803fb72: cedb ff79 c0d2 ff55 ffff 01ff ffff 01ff ..y...U.........
  83586. 803fb82: 9393 ff93 ffff 01ff a4a4 ffa4 bebe ffbe ................
  83587. 803fb92: bdbd ffbd d1d1 ffd1 ffff 01ff ffff 01ff ................
  83588. 803fba2: b4b5 ffae 5f5f ff5d 979d ff6b c0d2 ff55 ....__]...k...U.
  83589. 803fbb2: ffff 01ff b5c9 ff35 ffff 01ff ffff 01ff ......5.........
  83590. 803fbc2: f0f0 fff0 ffff 01ff f1f1 fff1 ffff 01ff ................
  83591. 803fbd2: d5d5 ffd5 cfd0 ffce 8585 ff85 6060 ff60 ............```.
  83592. 803fbe2: 9194 ff85 b5ca ff37 ffff 01ff b9cc ff41 ......7.......A.
  83593. 803fbf2: ffff 01ff b4c9 ff33 ffff 01ff 6262 ff62 ......3.....bbb.
  83594. 803fc02: 5d5e ff5c 5c5c ff5c 5d5e ff5c 6161 ff60 ^]\.\\\.^]\.aa`.
  83595. 803fc12: 6567 ff5b 8486 ff7b ffff 01ff ffff 01ff ge[...{.........
  83596. 803fc22: ffff 01ff b5ca ff37 ffff 01ff b9cc ff41 ......7.......A.
  83597. 803fc32: ffff 01ff b4c9 ff33 ffff 01ff ffff 01ff ......3.........
  83598. 803fc42: b5c9 ff35 ffff 01ff c0d2 ff55 ffff 01ff ..5.......U.....
  83599. 803fc52: c4d4 ff5e c3d4 ff5c ffff 01ff ffff 01ff ..^...\.........
  83600. 803fc62: c3d4 ff5c c4d4 ff5e cedb ff79 c0d2 ff55 ..\...^...y...U.
  83601. 803fc72: ffff 01ff b5c9 ff35 ffff 01ff ffff 01ff ......5.........
  83602. 803fc82: c0d1 ff54 cfdc ff7d ffff 01ff b4c9 ff33 ..T...}.......3.
  83603. 803fc92: ffff 01ff bed0 ff50 b4c9 ff33 b4c9 ff33 ......P...3...3.
  83604. 803fca2: c0d2 ff55 ffff 01ff b4c9 ff33 ffff 01ff ..U.......3.....
  83605. 803fcb2: cedb ff79 c0d2 ff55 ffff 01ff ffff 01ff ..y...U.........
  83606. 803fcc2: ffff 01ff b4c9 ff33 ffff 01ff cad9 ff6f ......3.......o.
  83607. 803fcd2: b9cc ff41 d6e1 ff8f ffff 01ff ffff 01ff ..A.............
  83608. 803fce2: d5e0 ff8c b9cc ff40 cedb ff79 ffff 01ff ......@...y.....
  83609. 803fcf2: b4c9 ff33 ffff 01ff ffff 01ff ffff 01ff ..3.............
  83610. 803fd02: ffff 01ff c5d5 ff62 c1d2 ff58 ffff 01ff ......b...X.....
  83611. 803fd12: ffff 01ff bbce ff46 b5c9 ff35 b5c9 ff35 ......F...5...5.
  83612. 803fd22: bbce ff46 ffff 01ff ffff 01ff c0d2 ff55 ..F...........U.
  83613. 803fd32: c5d5 ff62 ffff 01ff ffff 01ff ffff 01ff ..b.............
  83614. 803fd42: ffff 01ff ffff 01ff c8d7 ff69 b4c9 ff33 ..........i...3.
  83615. 803fd52: cedb ff79 ffff 01ff ffff 01ff ffff 01ff ..y.............
  83616. 803fd62: ffff 01ff cedb ff79 b4c9 ff33 c8d7 ff69 ......y...3...i.
  83617. 803fd72: ffff 01ff ffff 01ff ffff 01ff ffff 0dff ................
  83618. 803fd82: ffff 01ff ffff 01ff ffff 01ff ffff 01ff ................
  83619. 803fd92: b9cd ff42 b4c9 ff33 b7cb ff3b b7cb ff3b ..B...3...;...;.
  83620. 803fda2: b4c9 ff33 b9cd ff42 ffff 01ff ffff 01ff ..3...B.........
  83621. 803fdb2: ffff 01ff ffff 01ff ffff 01ff ffff 01ff ................
  83622. 803fdc2: ffff 01ff ffff 01ff ffff 01ff ffff 01ff ................
  83623. 803fdd2: ffff 01ff ffff 01ff e4eb ffb5 e4eb ffb5 ................
  83624. 803fde2: ffff 01ff ffff 01ff ffff 01ff ffff 01ff ................
  83625. 803fdf2: ffff 01ff ffff 01ff ffff 01ff 0000 ffff ................
  83626. 803fe02: 0000 ffff 0000 ffff 0000 ffff 0000 ffff ................
  83627. 803fe12: 0000 ffff 0000 ffff 0000 ffff 0000 ffff ................
  83628. 803fe22: 0000 ffff 0000 ffff 0000 ffff 0000 ffff ................
  83629. 803fe32: 0000 ffff 0000 ffff 0000 ffff 5825 4c00 ............%X.L
  83630. 803fe42: 676f 756f 5474 726d 3f00 4800 5454 2f50 ogoutTmr.?.HTTP/
  83631. 803fe52: 2e31 2030 3032 2030 4b4f 0a0d 6f43 746e 1.0 200 OK..Cont
  83632. 803fe62: 6e65 2d74 7954 6570 743a 7865 2f74 7468 ent-Type:text/ht
  83633. 803fe72: 6c6d 0a0d 6553 2d74 6f43 6b6f 6569 203a ml..Set-Cookie:
  83634. 803fe82: 6e75 6d61 3d65 0d00 530a 7465 432d 6f6f uname=...Set-Coo
  83635. 803fe92: 696b 3a65 6920 3d64 0d00 530a 7465 432d kie: id=...Set-C
  83636. 803fea2: 6f6f 696b 3a65 7220 6c6f 3d65 0030 0a0d ookie: role=0...
  83637. 803feb2: 6553 2d74 6f43 6b6f 6569 203a 7561 6874 Set-Cookie: auth
  83638. 803fec2: 303d 3c00 4421 434f 5954 4550 6820 6d74 =0.<!DOCTYPE htm
  83639. 803fed2: 3e6c 683c 6d74 206c 616c 676e 3e3d 683c l><html lang=><h
  83640. 803fee2: 6165 3e64 6d3c 7465 2061 7468 7074 652d ead><meta http-e
  83641. 803fef2: 7571 7669 223d 6572 7266 7365 2268 6320 quiv="refresh" c
  83642. 803ff02: 6e6f 6574 746e 223d 3b30 7275 3d6c 692f ontent="0;url=/i
  83643. 803ff12: 646e 7865 682e 6d74 226c 3e2f 2f3c 6568 ndex.html"/></he
  83644. 803ff22: 6461 3c3e 682f 6d74 3e6c 0a0d 0a0d 2600 ad></html>.....&
  83645. 803ff32: 6c00 676f 6e69 003d 6170 7373 6f77 6472 .login=.password
  83646. 803ff42: 003d 0a0d 6553 2d74 6f43 6b6f 6569 203a =...Set-Cookie:
  83647. 803ff52: 6f72 656c 003d 9fd0 bed0 bbd0 8cd1 b7d0 role=...........
  83648. 803ff62: bed0 b2d0 b0d0 82d1 b5d0 bbd0 8cd1 6600 ...............f
  83649. 803ff72: 6e75 3d63 7200 6265 6f6f 0074 90d0 b4d0 unc=.reboot.....
  83650. 803ff82: bcd0 b8d0 bdd0 b8d0 81d1 82d1 80d1 b0d0 ................
  83651. 803ff92: 82d1 bed0 80d1 d028 d19e d181 d082 d0b0 ......(.........
  83652. 803ffa2: d0bd d0be 29b2 d000 d192 d08b d0ba d1bb .....)..........
  83653. 803ffb2: d18e d087 d0b5 d0bd d0b8 20b5 bdd0 b0d0 ........... ....
  83654. 803ffc2: b3d0 80d1 83d1 b7d0 bad0 b8d0 d020 d098 ............ ...
  83655. 803ffd2: d091 209f bed0 82d1 bcd0 b5d0 bdd0 b5d0 ... ............
  83656. 803ffe2: bdd0 bed0 0021 92d0 8bd1 bad0 bbd0 8ed1 ....!...........
  83657. 803fff2: 87d1 b5d0 bdd0 b8d0 b5d0 d020 d0bd d0b0 .......... .....
  83658. 8040002: d1b3 d180 d083 d0b7 d0ba 20b8 98d0 91d0 ........... ....
  83659. 8040012: 9fd0 d020 d0bd 20b5 83d1 b4d0 b0d0 bbd0 .. .... ........
  83660. 8040022: bed0 81d1 8cd1 d020 d1be d082 d0bc d0b5 ...... .........
  83661. 8040032: d0bd d1b8 d182 218c 6f00 6666 6100 7466 .......!.off.aft
  83662. 8040042: 7265 003d 9ed0 82d1 bad0 bbd0 8ed1 87d1 er=.............
  83663. 8040052: b5d0 bdd0 b8d0 b5d0 d020 d0bd d0b0 d1b3 ........ .......
  83664. 8040062: d180 d083 d0b7 d0ba 20b8 98d0 91d0 9fd0 ......... ......
  83665. 8040072: 0021 9ed0 82d1 bad0 bbd0 8ed1 87d1 b5d0 !...............
  83666. 8040082: bdd0 b8d0 b5d0 d020 d0bd d0b0 d1b3 d180 ...... .........
  83667. 8040092: d083 d0b7 d0ba 20b8 98d0 91d0 9fd0 d020 ....... ...... .
  83668. 80400a2: d0bd 20b5 83d1 b4d0 b0d0 bbd0 bed0 81d1 ... ............
  83669. 80400b2: 8cd1 0021 7473 706f d000 d0a2 d1b5 d181 ..!.stop........
  83670. 80400c2: 2082 bed0 81d1 82d1 b0d0 bdd0 bed0 b2d0 . ..............
  83671. 80400d2: bbd0 b5d0 bdd0 0021 a2d0 b5d0 81d1 82d1 ......!.........
  83672. 80400e2: d020 d0bd 20b5 83d1 b4d0 b0d0 bbd0 bed0 .... ..........
  83673. 80400f2: 81d1 8cd1 d020 d1be d181 d082 d0b0 d0bd .... ...........
  83674. 8040102: d0be d0b2 d1b8 d182 218c 6400 7369 6863 .........!.disch
  83675. 8040112: 7261 6567 d000 d0a2 d1b5 d181 2082 b7d0 arge......... ..
  83676. 8040122: b0d0 bfd0 83d1 89d1 b5d0 bdd0 0021 90d0 ............!...
  83677. 8040132: b4d0 bcd0 b8d0 bdd0 b8d0 81d1 82d1 80d1 ................
  83678. 8040142: b0d0 82d1 bed0 80d1 2820 97d0 b0d0 bfd0 ........ (......
  83679. 8040152: 83d1 89d1 b5d0 bdd0 0029 a2d0 b5d0 81d1 ........).......
  83680. 8040162: 82d1 d020 d0bd 20b5 83d1 b4d0 b0d0 bbd0 .. .... ........
  83681. 8040172: bed0 81d1 8cd1 d020 d0b7 d0b0 d1bf d183 ...... .........
  83682. 8040182: d181 d082 d1b8 d182 218c 7400 6d69 0065 .........!.time.
  83683. 8040192: 776f 656e 3d72 7300 7379 6f4c 6163 6974 owner=.sysLocati
  83684. 80401a2: 6e6f 003d 6f63 6d6d 6e65 3d74 7200 6165 on=.comment=.rea
  83685. 80401b2: 5f64 6f63 6d6d 6e75 7469 3d79 7700 6972 d_community=.wri
  83686. 80401c2: 6574 635f 6d6f 756d 696e 7974 003d 616d te_community=.ma
  83687. 80401d2: 616e 6567 4972 3d50 6d00 6e61 6761 7265 nagerIP=.manager
  83688. 80401e2: 5049 3d32 6d00 6e61 6761 7265 5049 3d33 IP2=.managerIP3=
  83689. 80401f2: 6d00 6e61 6761 7265 5049 3d34 6d00 6e61 .managerIP4=.man
  83690. 8040202: 6761 7265 5049 3d35 6400 6368 3d70 6900 agerIP5=.dhcp=.i
  83691. 8040212: 6170 6464 3d72 6700 3d77 6d00 7361 3d6b paddr=.gw=.mask=
  83692. 8040222: 7300 6177 7475 3d68 7200 5f73 6e65 6261 .swauth=.rs_enab
  83693. 8040232: 656c 3d64 7200 5f73 6573 7672 7265 003d led=.rs_server=.
  83694. 8040242: 7372 705f 726f 3d74 7200 5f73 7770 3d64 rs_port=.rs_pwd=
  83695. 8040252: 7200 5f73 656b 3d79 6400 3169 003d 6f72 .rs_key=.di1=.ro
  83696. 8040262: 3d31 7200 326f 003d 746e 3d70 6e00 7074 1=.ro2=.ntp=.ntp
  83697. 8040272: 6573 7672 7069 003d 6974 656d 003d 7475 servip=.time=.ut
  83698. 8040282: 3d63 4800 5454 0050 7270 646f 7461 3d65 c=.HTTP.prodate=
  83699. 8040292: 4800 5454 2f50 2e31 2030 3032 2030 4b4f .HTTP/1.0 200 OK
  83700. 80402a2: 0a0d 6f43 746e 6e65 2d74 7954 6570 743a ..Content-Type:t
  83701. 80402b2: 7865 2f74 7468 6c6d 0a0d 0a0d 7254 6575 ext/html....True
  83702. 80402c2: 7000 6761 3d65 6100 6c6c 4800 5454 2f50 .page=.all.HTTP/
  83703. 80402d2: 2e31 2031 3032 2030 4b4f 0a0d 6f43 746e 1.1 200 OK..Cont
  83704. 80402e2: 6e65 2d74 654c 676e 6874 253a 756c 0a0d ent-Length:%lu..
  83705. 80402f2: 0a0d 7325 7500 6573 6e72 6d61 3d65 6f00 ..%s.username=.o
  83706. 8040302: 646c 6170 7373 003d 656e 7077 7361 3d73 ldpass=.newpass=
  83707. 8040312: d000 d09f d1b0 d080 d0be d1bb 208c 83d1 ............. ..
  83708. 8040322: 81d1 bfd0 b5d0 88d1 bdd0 bed0 d020 d0b8 ............ ...
  83709. 8040332: d0b7 d0bc d0b5 d1bd d091 00bd 92d0 b2d0 ................
  83710. 8040342: b5d0 b4d0 b5d0 bdd0 8bd1 d020 d0bd d0b5 .......... .....
  83711. 8040352: d0ba d1be d180 d080 d0b5 d1ba d082 d1bd ................
  83712. 8040362: d08b 20b5 b4d0 b0d0 bdd0 bdd0 8bd1 b5d0 ... ............
  83713. 8040372: 0021 92d0 b2d0 b5d0 b4d0 91d1 bdd0 d020 !............. .
  83714. 8040382: d0bd d0b5 d0b2 d1b5 d080 d1bd d08b 20b9 ...............
  83715. 8040392: bfd0 b0d0 80d1 bed0 bbd0 8cd1 0021 4547 ............!.GE
  83716. 80403a2: 2054 6d2f 6961 2e6e 7363 0073 4547 2054 T /main.css.GET
  83717. 80403b2: 722f 746f 6b65 702e 676e 4700 5445 2f20 /rotek.png.GET /
  83718. 80403c2: 6166 6976 6f63 2e6e 6369 006f 4547 2054 favicon.ico.GET
  83719. 80403d2: 722f 6c6f 2e65 736a 5000 534f 2054 6c2f /role.js.POST /l
  83720. 80403e2: 676f 6e69 632e 6967 2f00 6f6c 6967 2e6e ogin.cgi./login.
  83721. 80403f2: 7468 6c6d 5400 6f6f 6c20 6e6f 2067 4f50 html.Too long PO
  83722. 8040402: 5453 7220 7165 6575 7473 0d21 000a 4547 ST request!...GE
  83723. 8040412: 2054 6d2f 6961 2e6e 736a 4700 5445 2f20 T /main.js.GET /
  83724. 8040422: 6573 7474 6e69 7367 682e 6d74 006c 692f settings.html./i
  83725. 8040432: 646e 7865 682e 6d74 006c 4547 2054 692f ndex.html.GET /i
  83726. 8040442: 666e 2e6f 7468 6c6d 4700 5445 2f20 6968 nfo.html.GET /hi
  83727. 8040452: 7473 726f 2e79 7468 6c6d 4700 5445 2f20 story.html.GET /
  83728. 8040462: 7075 5f73 6968 7473 726f 2e79 7468 6c6d ups_history.html
  83729. 8040472: 4700 5445 2f20 6567 4a74 6f73 2e6e 6763 .GET /getJson.cg
  83730. 8040482: 0069 4547 2054 732f 7465 6974 676e 2e73 i.GET /settings.
  83731. 8040492: 6763 0069 4f50 5453 2f20 6573 7474 6e69 cgi.POST /settin
  83732. 80404a2: 7367 632e 6967 6d00 6e61 6761 7265 5049 gs.cgi.managerIP
  83733. 80404b2: 4800 5454 2f50 2e31 2031 3032 2030 4b4f .HTTP/1.1 200 OK
  83734. 80404c2: 0a0d 3c00 4421 434f 5954 4550 6820 6d74 ...<!DOCTYPE htm
  83735. 80404d2: 3e6c 683c 6d74 206c 616c 676e 3e3d 683c l><html lang=><h
  83736. 80404e2: 6165 3e64 6d3c 7465 2061 7468 7074 652d ead><meta http-e
  83737. 80404f2: 7571 7669 223d 6572 7266 7365 2268 6320 quiv="refresh" c
  83738. 8040502: 6e6f 6574 746e 223d 3b30 7275 3d6c 732f ontent="0;url=/s
  83739. 8040512: 7465 6974 676e 2e73 7468 6c6d 2f22 3c3e ettings.html"/><
  83740. 8040522: 682f 6165 3e64 2f3c 7468 6c6d 0d3e 0d0a /head></html>...
  83741. 8040532: 000a 4547 2054 692f 666e 2e6f 6763 0069 ..GET /info.cgi.
  83742. 8040542: 4f50 5453 2f20 6e69 6f66 632e 6967 6f00 POST /info.cgi.o
  83743. 8040552: 6e77 7265 3c00 4421 434f 5954 4550 6820 wner.<!DOCTYPE h
  83744. 8040562: 6d74 3e6c 683c 6d74 206c 616c 676e 3e3d tml><html lang=>
  83745. 8040572: 683c 6165 3e64 6d3c 7465 2061 7468 7074 <head><meta http
  83746. 8040582: 652d 7571 7669 223d 6572 7266 7365 2268 -equiv="refresh"
  83747. 8040592: 6320 6e6f 6574 746e 223d 3b30 7275 3d6c content="0;url=
  83748. 80405a2: 692f 666e 2e6f 7468 6c6d 2f22 3c3e 682f /info.html"/></h
  83749. 80405b2: 6165 3e64 2f3c 7468 6c6d 0d3e 0d0a 000a ead></html>.....
  83750. 80405c2: 4547 2054 682f 7369 6f74 7972 632e 6967 GET /history.cgi
  83751. 80405d2: 4700 5445 2f20 7075 5f73 6968 7473 726f .GET /ups_histor
  83752. 80405e2: 2e79 6763 0069 4547 2054 622f 7461 745f y.cgi.GET /bat_t
  83753. 80405f2: 7365 2e74 6763 0069 4547 2054 752f 7370 est.cgi.GET /ups
  83754. 8040602: 705f 776f 7265 632e 6967 4700 5445 2f20 _power.cgi.GET /
  83755. 8040612: 6572 6573 2e74 6763 0069 4547 2054 722f reset.cgi.GET /r
  83756. 8040622: 6265 6f6f 2e74 6763 0069 4547 2054 632f eboot.cgi.GET /c
  83757. 8040632: 6e6f 6966 6d72 632e 6967 4700 5445 2f20 onfirm.cgi.GET /
  83758. 8040642: 7766 755f 6470 7461 2e65 6763 0069 4547 fw_update.cgi.GE
  83759. 8040652: 2054 632f 6168 676e 7065 6477 632e 6967 T /changepwd.cgi
  83760. 8040662: 4700 5445 2f20 6573 5074 6f72 6164 6574 .GET /setProdate
  83761. 8040672: 632e 6967 0000 .cgi..
  83762. 08040678 <file__settings_html>:
  83763. 8040678: b834 0803 b860 0803 b870 0803 1262 0000 4...`...p...b...
  83764. 8040688: 0001 0000 ....
  83765. 0804068c <file__ups_history_html>:
  83766. 804068c: 0678 0804 13bc 0804 13d0 0804 0541 0000 x...........A...
  83767. 804069c: 0001 0000 ....
  83768. 080406a0 <data__login_html>:
  83769. 80406a0: 6c2f 676f 6e69 682e 6d74 006c 5448 5054 /login.html.HTTP
  83770. 80406b0: 312f 312e 3220 3030 4f20 0d4b 530a 7265 /1.1 200 OK..Ser
  83771. 80406c0: 6576 3a72 6c20 4977 2f50 2e31 2e33 2031 ver: lwIP/1.3.1
  83772. 80406d0: 6828 7474 3a70 2f2f 6173 6176 6e6e 6861 (http://savannah
  83773. 80406e0: 6e2e 6e6f 6e67 2e75 726f 2f67 7270 6a6f .nongnu.org/proj
  83774. 80406f0: 6365 7374 6c2f 6977 2970 0a0d 6f43 746e ects/lwip)..Cont
  83775. 8040700: 6e65 2d74 654c 676e 6874 203a 3835 0d37 ent-Length: 587.
  83776. 8040710: 430a 6e6f 656e 7463 6f69 3a6e 4320 6f6c .Connection: Clo
  83777. 8040720: 6573 0a0d 6f43 746e 6e65 2d74 7974 6570 se..Content-type
  83778. 8040730: 203a 6574 7478 682f 6d74 0d6c 430a 6e6f : text/html..Con
  83779. 8040740: 6574 746e 452d 636e 646f 6e69 3a67 6720 tent-Encoding: g
  83780. 8040750: 697a 0d70 0d0a 1f0a 088b 0000 0000 0400 zip.............
  83781. 8040760: 7d0a cd54 d46e 1030 157e 2463 754e 7bb7 .}T.n.0.~.c$Nu.{
  83782. 8040770: a841 91c4 e950 1381 401c a382 cc93 5c6e A...P....@....n\
  83783. 8040780: db1c 93d8 eeec e2ad 09c0 c409 2415 015e .............$^.
  83784. 8040790: 03d1 8845 433e 8df6 2718 6ddb a423 e21e ..E.>C...'.m#...
  83785. 80407a0: d8f5 e333 67ef d9b4 a7bd 4fcf be5e 7179 ..3..g.....O^.yq
  83786. 80407b0: 6aca 4c6c a59e 1995 9765 7392 408a 7955 .jlL....e..s.@Uy
  83787. 80407c0: 00d6 562a 2ad6 4044 5bc9 885c 7447 9c37 ..*V.*D@.[\.Gt7.
  83788. 80407d0: 88d6 c05e 56bb 9277 16bf 9eaf 1388 78d7 ..^..Vw........x
  83789. 80407e0: ba85 c030 e959 822c 92a5 a767 aa12 5c25 ..0.Y.,...g...%\
  83790. 80407f0: 5917 80d5 9de4 9586 0177 e56f 74ad b585 .Y......w.o..t..
  83791. 8040800: a0ac 25d3 2188 d038 a356 4656 52c4 9019 ...%.!8.V.VF.R..
  83792. 8040810: 83f3 ad46 d375 fb36 8db8 8610 d140 f293 ..F.u.6.....@...
  83793. 8040820: 9e88 8d40 f206 5bfe d57f edff b72f fbef ..@....[..../...
  83794. 8040830: edab 7f79 fb49 6c8b de36 4665 b7db 0eac ..y.I..l6.eF....
  83795. 8040840: 90b0 51bc 1eda 3196 1672 48c0 711e 2063 ...Q...1r..H.qc
  83796. 8040850: 00d6 9d48 1962 47b4 1b86 704f d611 3b38 ..H.b..G..Op..8;
  83797. 8040860: 9d53 4f1a 8b39 94a1 383c 8703 9167 6792 S..O9...<8..g..g
  83798. 8040870: 39e3 466d 0ad1 6d57 acf2 1dd2 8d2b 518a .9mF..Wm....+..Q
  83799. 8040880: ab72 42ba 3605 88fe 160a 35aa 1d78 f42e r..B.6.....5x...
  83800. 8040890: 2a1a ce81 a753 6aff ea44 6108 cabc b533 .*..S..jD..a..3.
  83801. 80408a0: 7e83 949f 5b1b b71b 0974 a282 aa8f eba7 .~...[..t.......
  83802. 80408b0: 76ad a0ab a7bc 4c46 9257 dcef baa1 9e7a .v....FLW.....z.
  83803. 80408c0: 9ff7 9ffb a97b f57e b63f 481f 4fba 65c4 ....{.~.?..H.O.e
  83804. 80408d0: c13e 95e3 c305 f586 c19a f014 9578 d3b8 >...........x...
  83805. 80408e0: c2f9 8685 12a9 b3b5 1392 a4c6 52f4 4673 .............RsF
  83806. 80408f0: 5393 423b 5de0 ee4c 39ef 2b68 0952 1a55 .S;B.]L..9h+R.U.
  83807. 8040900: d055 143b eaec de78 257f 2f3f 8f92 0fc7 U.;...x..%?/....
  83808. 8040910: 116c e3fd 366c e524 b699 bdbe d26d 63be l...l6$.....m..c
  83809. 8040920: 25ea 4b12 8932 d093 e869 1406 ff23 96dd .%.K2...i...#...
  83810. 8040930: ca06 5d80 dcd2 f9f1 7243 0d35 1a40 408b ...]....Cr5.@..@
  83811. 8040940: 4570 cbd0 8f1a fcd9 afc8 a8a7 593c a04a pE..........<YJ.
  83812. 8040950: 93be e752 ec04 f6cf 5de3 52b0 caf6 ea85 ..R......].R....
  83813. 8040960: 684e 4937 9dc9 01e1 0536 b397 d909 16d8 Nh7I....6.......
  83814. 8040970: be8d b011 cb40 13e8 683e bf42 ace1 a653 ....@...>hB...S.
  83815. 8040980: 2a25 17fd f802 cc9b 24bd b30a ca24 3e74 %*.......$..$.t>
  83816. 8040990: 1376 ce33 6ceb 17f8 07f8 a233 8ac5 0415 v.3..l....3.....
  83817. 80409a0: 0000 ..
  83818. 080409a2 <data__info_html>:
  83819. 80409a2: 692f 666e 2e6f 7468 6c6d 0000 5448 5054 /info.html..HTTP
  83820. 80409b2: 312f 312e 3220 3030 4f20 0d4b 530a 7265 /1.1 200 OK..Ser
  83821. 80409c2: 6576 3a72 6c20 4977 2f50 2e31 2e33 2031 ver: lwIP/1.3.1
  83822. 80409d2: 6828 7474 3a70 2f2f 6173 6176 6e6e 6861 (http://savannah
  83823. 80409e2: 6e2e 6e6f 6e67 2e75 726f 2f67 7270 6a6f .nongnu.org/proj
  83824. 80409f2: 6365 7374 6c2f 6977 2970 0a0d 6f43 746e ects/lwip)..Cont
  83825. 8040a02: 6e65 2d74 654c 676e 6874 203a 3031 3839 ent-Length: 1098
  83826. 8040a12: 0a0d 6f43 6e6e 6365 6974 6e6f 203a 6c43 ..Connection: Cl
  83827. 8040a22: 736f 0d65 430a 6e6f 6574 746e 742d 7079 ose..Content-typ
  83828. 8040a32: 3a65 7420 7865 2f74 7468 6c6d 0a0d 6f43 e: text/html..Co
  83829. 8040a42: 746e 6e65 2d74 6e45 6f63 6964 676e 203a ntent-Encoding:
  83830. 8040a52: 7a67 7069 0a0d 0a0d 8b1f 0008 0000 0000 gzip............
  83831. 8040a62: 0a04 569d 6edd 36db 7e14 5615 69bb 2881 ...V.n.6.~.V.i.(
  83832. 8040a72: 766e 6035 8096 2b22 0286 1aeb 1da0 5eb0 nv5`.."+.......^
  83833. 8040a82: b40d db44 256c 9352 c728 4bbe adb2 68bb ..D.l%R.(..K...h
  83834. 8040a92: 0e81 30c1 4114 aed7 827b 6b74 b4b6 d389 ...0.A..{.tk....
  83835. 8040aa2: a057 68de 21df 272d 9c5e e7ec 3642 c88f W..h.!-'^...B6..
  83836. 8040ab2: f7f3 ef9d aa1c e57b 3b93 f7eb 6fee 64dc ......{..;...o.d
  83837. 8040ac2: 9343 7167 7e97 c659 20d5 020a 8248 71a7 C.gq.~Y.. ..H..q
  83838. 8040ad2: 1737 b386 c864 4acb 2898 4da8 fc3f 7b08 7...d..J.(.M?..{
  83839. 8040ae2: edee 98d0 1422 d75f 1472 5f05 5f86 08dc ...."._.r.._._..
  83840. 8040af2: 75d7 705e 7b23 0899 a258 1195 2a0a 6eb7 .u^p#{..X....*.n
  83841. 8040b02: 2246 881d 4956 5cf1 c144 8a48 42cd e697 F"..VI.\D.H..B..
  83842. 8040b12: b9cc 994d 619a 8a94 4c91 e844 1584 a4a9 ..M..a...LD.....
  83843. 8040b22: 3c91 ab0b 6784 5a22 c95b 58f9 75e6 973e .<...g"Z[..X.u>.
  83844. 8040b32: 4aeb 4e94 70e0 5d19 0b87 4d23 6226 ccfb .J.N.p.]..#M&b..
  83845. 8040b42: 9b4e ed6f b349 8f65 7eed c8f3 361e bb4f N.o.I.e..~...6O.
  83846. 8040b52: bf1d cdd7 7aa4 86c8 e8a5 4147 a5ce 4d5a .....z....GA..ZM
  83847. 8040b62: 2aaa a560 a2c8 32a0 4c93 4354 0c21 552c .*`....2.LTC!.,U
  83848. 8040b72: 2949 c30b a4cc b840 8c46 e74d 1f01 ff71 I)....@.F.M...q.
  83849. 8040b82: 6036 9955 4144 33a9 fab1 c2a0 8ee1 8f7f 6`U.DA.3........
  83850. 8040b92: 0785 a7ad 49d3 4ddc 88e5 1925 aaaf 5028 .....I.M..%...(P
  83851. 8040ba2: d47c 25e3 7ff3 2a61 bcfa 4cce f62b 58e5 |..%..a*...L+..X
  83852. 8040bb2: a1a4 05d1 9d2c 09d3 a2c9 fd28 dc56 b3e5 ....,.....(.V...
  83853. 8040bc2: a5d0 c54a 9578 060a bd08 4c8f 340f c2c5 ..J.x......L.4..
  83854. 8040bd2: c0f1 fb4c 6adb 107c 9930 6722 eaa1 a250 ..L..j|.0."g..P.
  83855. 8040be2: b33a 75a3 ead6 b823 2236 fd2c 5a69 80c4 :..u..#.6",.iZ..
  83856. 8040bf2: a96c d8e3 04be 5bba 1f76 1f28 3b34 56cd l......[v.(.4;.V
  83857. 8040c02: d8f3 a77b 67f3 4075 231d a0d5 f1f2 f6c6 ..{..gu@.#......
  83858. 8040c12: a867 936d 3d82 6fb1 3bed b87b 4d5c beaa g.m..=.o.;{.\M..
  83859. 8040c22: 4c5e 2791 8e46 a540 05e5 c4a6 eeff 287a ^L.'F.@.......z(
  83860. 8040c32: a32b 49cb f9eb e6a7 781b 229d a3e4 9f53 +..I.....x."..S.
  83861. 8040c42: 1a9d f7dc 9d90 7f81 e4b3 0145 1de0 336a ..........E...j3
  83862. 8040c52: 0336 e18b 05da b1de 05d1 8498 88f1 3267 6.............g2
  83863. 8040c62: 2345 1568 f4f6 8098 0f26 5d7d 6ee6 eefb E#h.....&.}].n..
  83864. 8040c72: b7e7 2837 80b7 3e51 455a cb81 1934 80c8 ..7(..Q>ZE..4...
  83865. 8040c82: b1a1 1a86 3626 dcee 07bd 4345 6ecc e40b ....&6....EC.n..
  83866. 8040c92: 5985 735c 9912 e85e e18c 27b0 299f 8969 .Y\s..^....'.)i.
  83867. 8040ca2: cc06 82aa f8c3 c087 0f6b 4f48 8867 d91f ........k.HOg...
  83868. 8040cb2: 9423 0b6b 310d 6444 1a74 d72b c6eb d6f3 #.k..1Ddt.+.....
  83869. 8040cc2: 4819 af5b 2b4a 3481 474a bb42 f80b ec0e .H[.J+.4JGB.....
  83870. 8040cd2: f371 b994 bfc2 9346 50ed 0dd9 8546 aa59 q.....F..P..F.Y.
  83871. 8040ce2: 52e3 0bae 7323 019a a0ee ea73 c4bd 39f6 .R..#s....s....9
  83872. 8040cf2: 7b42 9b03 cd47 b993 4719 9d54 6c8a c6a9 B{..G....GT..l..
  83873. 8040d02: a08f 8ecf 67dd bdf6 d063 fda1 fed3 4646 .....g..c.....FF
  83874. 8040d12: 5388 ed58 982f 4a29 528d 772c 4bbd 3438 .SX./.)J.R,w.K84
  83875. 8040d22: 34db 181e fcb8 4162 bfb1 1239 8565 2cf2 .4....bA..9.e..,
  83876. 8040d32: e18b 8df6 0675 bd12 3421 ed9a bd05 279c ....u...!4.....'
  83877. 8040d42: 4d3c 61a9 e7cf 8afa da1c 9043 da7e b63c <M.a......C.~.<.
  83878. 8040d52: 196f 7898 9ae2 aa87 11e1 d4a4 d631 6b94 o..x........1..k
  83879. 8040d62: 7a65 00b7 2ed6 076a 04b7 4c17 6a3d e2b5 ez....j....L=j..
  83880. 8040d72: 54ae 7d45 5a76 6805 1a65 7ab4 b553 9e1c .TE}vZ.he..zS...
  83881. 8040d82: 672d 82d3 18d8 ad12 c531 3b40 ce3e 1a84 -g......1.@;>...
  83882. 8040d92: 0060 6b07 69d7 9e90 fd8f 6539 800a ec4f `..k.i....9e..O.
  83883. 8040da2: 3c7b 7847 40fe 5318 7364 cff0 5461 ea93 {<Gx.@.Sds..aT..
  83884. 8040db2: 9d33 96b8 0df0 cd95 ffa5 0f1b fa51 c098 3...........Q...
  83885. 8040dc2: 6223 39bb 4874 c483 78c3 2031 ce89 0231 #b.9tH...x1 ..1.
  83886. 8040dd2: f171 d010 e173 06bf 69d1 e55b 96e2 e67b q...s....i[...{.
  83887. 8040de2: 6ad1 77be bd18 f663 0135 f008 0288 9007 .j.w..c.5.......
  83888. 8040df2: f668 fd51 b77f a027 4832 2c88 ace8 abbb h.Q...'.2H.,....
  83889. 8040e02: 6d2e df4d c7cf 3a50 3855 0f65 fdda fb07 .mM...P:U8e.....
  83890. 8040e12: 0582 b318 ed2f b31e c0bf afc7 b8f0 2c17 ..../..........,
  83891. 8040e22: eaad eef2 8bab abea c2fc bc0e 71b4 7548 .............qHu
  83892. 8040e32: f379 a8b4 dc75 8b24 bdbb 18da 66ad ac77 y...u.$......fw.
  83893. 8040e42: 0217 55a6 c992 21e4 57ae ea61 b152 eeaa ...U...!.Wa.R...
  83894. 8040e52: d2e5 c2dc bcbc 6d7a cae5 fcda ebba c519 ......zm........
  83895. 8040e62: 84f0 2945 5e73 904e 2bf5 a30c 00ef 07ae ..E)s^N..+......
  83896. 8040e72: 8765 89e6 0a37 133a f1dd efe7 3f45 fee6 e...7.:.....E?..
  83897. 8040e82: 0dc5 3eef 1610 f86f b54b 9a62 9fc4 730a ...>..o.K.b....s
  83898. 8040e92: daf5 67c7 09bf e3e8 2fea 307b 75b5 096c ...g...../{0.ul.
  83899. 8040ea2: 0000 ..
  83900. 08040ea4 <data__history_html>:
  83901. 8040ea4: 682f 7369 6f74 7972 682e 6d74 006c 0000 /history.html...
  83902. 8040eb4: 5448 5054 312f 312e 3220 3030 4f20 0d4b HTTP/1.1 200 OK.
  83903. 8040ec4: 530a 7265 6576 3a72 6c20 4977 2f50 2e31 .Server: lwIP/1.
  83904. 8040ed4: 2e33 2031 6828 7474 3a70 2f2f 6173 6176 3.1 (http://sava
  83905. 8040ee4: 6e6e 6861 6e2e 6e6f 6e67 2e75 726f 2f67 nnah.nongnu.org/
  83906. 8040ef4: 7270 6a6f 6365 7374 6c2f 6977 2970 0a0d projects/lwip)..
  83907. 8040f04: 6f43 746e 6e65 2d74 654c 676e 6874 203a Content-Length:
  83908. 8040f14: 3031 3339 0a0d 6f43 6e6e 6365 6974 6e6f 1093..Connection
  83909. 8040f24: 203a 6c43 736f 0d65 430a 6e6f 6574 746e : Close..Content
  83910. 8040f34: 742d 7079 3a65 7420 7865 2f74 7468 6c6d -type: text/html
  83911. 8040f44: 0a0d 6f43 746e 6e65 2d74 6e45 6f63 6964 ..Content-Encodi
  83912. 8040f54: 676e 203a 7a67 7069 0a0d 0a0d 8b1f 0008 ng: gzip........
  83913. 8040f64: 0000 0000 0a04 568d 8f5f 44db ff10 5b2a .......V_..D..*[
  83914. 8040f74: 9d53 2962 2e4e 05e2 d891 0a15 a87d a084 S.b)N.......}...
  83915. 8040f84: 2952 a782 dad3 d89e 5bdb baef 6bbb 02e7 R).......[...k..
  83916. 8040f94: 4487 e05b 48a5 7895 bc40 c420 3837 4e90 .D[..H.x@. .78.N
  83917. 8040fa4: d2ba 7deb e706 311b b5eb 8f83 c746 4a29 ...}...1....F.)J
  83918. 8040fb4: dff6 cecc 6fcc 337e c59b 8f9d 5b3f fe7e .....o~3....?[~.
  83919. 8040fc4: c3d5 24fb 0537 168f 97f6 2a70 d0b2 70f3 ...$7.....p*...p
  83920. 8040fd4: 3405 168d 1805 924a 2a9c 260d 2af4 0ab3 .4....J..*.&.*..
  83921. 8040fe4: c03e 76b3 3737 0ca6 69e0 eac5 fbd0 7832 >..v77...i....2x
  83922. 8040ff4: 51fc 94b0 4945 8b0d 7839 9124 80c2 9540 .Q..EI..9x$...@.
  83923. 8041004: f707 4843 e833 0495 202d 6af4 eb06 2a52 ..CH3...- .j..R*
  83924. 8041014: 9033 b35b e4d4 0a61 4b35 6820 6317 9826 3.[...a.5K h.c&.
  83925. 8041024: 9461 3a07 1ca1 d9c2 a0b8 ac27 8aa8 badd a..:......'.....
  83926. 8041034: a0d2 05da 9345 21e1 309a 70cc 9a88 b65f ....E..!.0.p.._.
  83927. 8041044: b62f 35df 9b6f e6b3 d90d 6b3e 9aae b73f /..5o.....>k..?.
  83928. 8041054: b72f 9bcf e68b 6935 c6fe dbe5 73ed bf3c /.....5i.....s<.
  83929. 8041064: de6a e7e0 671c 8b67 d3a9 705c 8e26 ae49 j....gg...\p&.I.
  83930. 8041074: 1560 057a 6265 6892 11ed 3c05 b4f4 70d9 `.z.eb.h...<...p
  83931. 8041084: 39d0 4180 3a3b ac51 c434 4a6c c60c 89c0 .9.A;:Q.4.lJ....
  83932. 8041094: 3e99 35a1 bb75 d11e 092a 253d 4c39 689e .>.5u...*.=%9L.h
  83933. 80410a4: 9e14 7dba 389c 6348 6e99 45a2 6aca 7092 ...}.8Hc.n.E.j.p
  83934. 80410b4: 75aa 09e8 c75a 1154 0437 ac29 c568 bf4d .u..Z.T.7.).h.M.
  83935. 80410c4: b15c 4813 2303 bc4b 1de9 c09d 08de 1dca \..H.#K.........
  83936. 80410d4: 0b45 b9da 44ce 270a 9b13 044e d9d8 32e0 E....D.'..N....2
  83937. 80410e4: d693 8a17 bc5f ffa6 35ed f3de 4b08 6631 ...._....5...K1f
  83938. 80410f4: 5510 30c0 9d77 c568 7d7b ae74 08f7 4ea7 .U.0w.h.{}t....N
  83939. 8041104: 4eda 8422 af6c a8e1 bdf9 b339 36d8 8897 .N".l.....9..6..
  83940. 8041114: e231 7dbd ace9 f95b 0ea1 cb12 9130 e769 1..}..[.....0.i.
  83941. 8041124: d46f 86fc cf6a 04ba c6bd 5d74 57ec 6263 o...j.....t].Wcb
  83942. 8041134: 7b25 5f95 a331 37df 6857 12ed 7f95 2e6c %{._1..7Wh....l.
  83943. 8041144: afb6 2bf6 4ce5 a91b d736 a1a1 6189 1235 ...+.L..6....a5.
  83944. 8041154: 4874 7f9b a7d5 5615 8386 006c a5bf f237 tH.....V..l...7.
  83945. 8041164: a103 716f 55d3 608c 10ac 2e8d 89d7 6a02 ..oq.U.`.......j
  83946. 8041174: 51e0 7f15 6b4a 6196 4851 f231 03e7 b42a .Q..Jk.aQH1...*.
  83947. 8041184: 1839 b85c b456 fb2c baeb c1e2 f2eb 35d9 9.\.V.,........5
  83948. 8041194: 6eb7 66cb 1b54 c592 02d8 1409 52e8 dd0a .n.fT........R..
  83949. 80411a4: bac6 b768 df5a d9db 278e bf6e a6f3 22e7 ..h.Z....'n...."
  83950. 80411b4: 623a 771c b28d 9ed3 6514 a88e 31fd afa8 :b.w.....e...1..
  83951. 80411c4: 2c73 7ca4 849f 28cd e826 1615 45e5 5fb3 s,.|...(&....E._
  83952. 80411d4: 67ea df4c 7379 5369 ef67 5a98 3853 bb6b .gL.ysiSg..ZS8k.
  83953. 80411e4: b190 d335 db7a f065 a528 a286 d35b c4f6 ..5.z.e.(...[...
  83954. 80411f4: 368e 1c44 b877 3a5a 1c5b 0eb1 116d a85a .6D.w.Z:[...m.Z.
  83955. 8041204: 16ed a9a6 c7cb e42e 88d8 5320 b2b2 1615 .......... S....
  83956. 8041214: c657 d148 87c7 c427 769e e925 2911 ce12 W.H...'..v%..)..
  83957. 8041224: e392 cbd0 3cc0 19a4 668c 2a3e 92e9 420a .....<...f>*...B
  83958. 8041234: a315 ce41 14d2 b604 5504 a121 0f4e 7d38 ..A......U!.N.8}
  83959. 8041244: 495a 769b 4094 dce7 11ed b5b9 5299 dd41 ZI.v.@.......RA.
  83960. 8041254: b9da 0cc9 515a 1dea c323 97fc 6334 25a2 ....ZQ..#...4c.%
  83961. 8041264: 7a21 44cb 0d59 975b 7063 2952 fd85 251a !z.DY.[.cpR)...%
  83962. 8041274: 79b1 f66b f635 99b5 1d17 5888 f397 1ba9 .yk.5......X....
  83963. 8041284: 9c5c 4416 c52b c159 15b0 ee1e 6b82 bf91 \..D+.Y......k..
  83964. 8041294: 7e2d 7b02 ffe6 a607 05f6 7b76 faf4 9524 -~.{......v{..$.
  83965. 80412a4: f5f6 207a e8cc e8ee f300 e661 ff3b d2dd ..z ......a.;...
  83966. 80412b4: d89f be16 2f74 7f96 d423 4daa e9e8 e82e ....t/..#..M....
  83967. 80412c4: a32e ef1d 47f6 2a5f 5056 09b5 a898 1941 .....G_*VP....A.
  83968. 80412d4: 1d48 29e0 3497 ea3d 3ce8 5660 65cc 09fc H..).4=..<`V.e..
  83969. 80412e4: 751e f6ae 2b1d d8c9 eb3d 4876 7739 8f5e .u...+..=.vH9w^.
  83970. 80412f4: b0dd d013 b775 706f c26b 5dd2 361c 3163 ....u.opk..].6c1
  83971. 8041304: b23f ba31 dd72 d0fe 65f6 452c b36c 913f ?.1.r....e,El.?.
  83972. 8041314: 2fe6 7cb2 45f4 521f 285f b1a8 9c62 6123 ./.|.E.R_(..b.#a
  83973. 8041324: f7ba 7ae2 fda8 fb66 dd96 39e2 5f6c ebd3 ...z..f....9l_..
  83974. 8041334: e1cf 5a8d 9f51 99bc be3f f23b f486 27f4 ...ZQ...?.;....'
  83975. 8041344: 1c52 06c3 036b cf1f 2555 7db0 7763 ff05 R...k...U%.}cw..
  83976. 8041354: 381b 1d3d b841 d7c6 ae4f 5027 9d23 79fd .8=.A...O.'P#..y
  83977. 8041364: 1f6d 10d6 a826 94b0 4a29 64c0 b39d 9f24 m...&...)J.d..$.
  83978. 8041374: 302b 1295 ecde 2f7d c50c 51bd 6e6f 95c0 +0....}/...Qon..
  83979. 8041384: 18ff 29ad c0af c7f7 6677 87fe 64b5 3929 ...)....wf...d)9
  83980. 8041394: 76fc d0d8 bfdb ff50 1100 94f1 524b 0009 .v....P.....KR..
  83981. 80413a4: 0000 0000 ....
  83982. 080413a8 <file__main_css>:
  83983. 80413a8: 1950 0804 1964 0804 1970 0804 2a04 0000 P...d...p....*..
  83984. 80413b8: 0001 0000 ....
  83985. 080413bc <data__ups_history_html>:
  83986. 80413bc: 752f 7370 685f 7369 6f74 7972 682e 6d74 /ups_history.htm
  83987. 80413cc: 006c 0000 5448 5054 312f 312e 3220 3030 l...HTTP/1.1 200
  83988. 80413dc: 4f20 0d4b 530a 7265 6576 3a72 6c20 4977 OK..Server: lwI
  83989. 80413ec: 2f50 2e31 2e33 2031 6828 7474 3a70 2f2f P/1.3.1 (http://
  83990. 80413fc: 6173 6176 6e6e 6861 6e2e 6e6f 6e67 2e75 savannah.nongnu.
  83991. 804140c: 726f 2f67 7270 6a6f 6365 7374 6c2f 6977 org/projects/lwi
  83992. 804141c: 2970 0a0d 6f43 746e 6e65 2d74 654c 676e p)..Content-Leng
  83993. 804142c: 6874 203a 3131 3337 0a0d 6f43 6e6e 6365 th: 1173..Connec
  83994. 804143c: 6974 6e6f 203a 6c43 736f 0d65 430a 6e6f tion: Close..Con
  83995. 804144c: 6574 746e 742d 7079 3a65 7420 7865 2f74 tent-type: text/
  83996. 804145c: 7468 6c6d 0a0d 6f43 746e 6e65 2d74 6e45 html..Content-En
  83997. 804146c: 6f63 6964 676e 203a 7a67 7069 0a0d 0a0d coding: gzip....
  83998. 804147c: 8b1f 0008 0000 0000 0a04 568d 6edd 44dc ...........V.n.D
  83999. 804148c: 7e14 d715 d154 8a5a 59bd 41b8 ed64 850a .~..T.Z..Y.Ad...
  84000. 804149c: 545e 1042 1429 55c1 b634 aecf 99a7 bb1d ^TB.)..U4.......
  84001. 80414ac: b1e3 5b37 9482 14a4 8a2e 9a54 540b a121 ..7[......T..T!.
  84002. 80414bc: 3caa 0441 28aa 6d3f 615f 46fc 999c 17b1 .<A..(?m_a.F....
  84003. 80414cc: d9a7 7b44 ebb1 39f9 e7ff e73b f8cc 27c6 ..D{...9..;....'
  84004. 80414dc: ef9f f17c eef5 276d 3393 8d16 bff5 08c3 ..|...m'.3......
  84005. 80414ec: 869f 8bae 203b 3469 819e 4e24 1192 8251 ....; i4..$N..Q.
  84006. 80414fc: dd0c 4e4a 0ffc cef1 669c 1652 dc3e 68af ..JN.....fR.>..h
  84007. 804150c: ba1d f95f 3f77 77f6 59f2 2441 198d 4eb8 .._.w?.w.YA$...N
  84008. 804151c: 7392 1c09 ee59 0edc 9d21 c742 c9c4 420c .s..Y...!.B....B
  84009. 804152c: a6b7 2f30 2172 747b 9a73 2cca a14c 09a6 ..0/r!{ts..,L...
  84010. 804153c: 66f8 49b3 9539 3094 4cbf 8308 b470 2339 .f.I9..0.L..p.9#
  84011. 804154c: 7487 cd56 fb96 04aa 3661 5504 5b86 42a8 .tV.....a6.U.[.B
  84012. 804155c: c952 5220 373f 9b0f f563 9d5a 7fab e69c R. R?7..c.Z.....
  84013. 804156c: bd44 4e69 539a 7ffc 4782 9aaf 8e27 a67a D.iN.S...G..'.z.
  84014. 804157c: aa9e e3e7 a5a1 331e 0fca 4c9c 24c0 6774 .......3...L.$tg
  84015. 804158c: f284 2920 d74b c011 b742 0b94 6506 2006 .. )K...B....e.
  84016. 804159c: 7651 0899 485a 2e47 740a c240 1ca1 23de Qv..ZHG..t@....#
  84017. 80415ac: b135 aea7 8a53 7424 ce45 b820 2257 d0f1 5...S.$tE. .W"..
  84018. 80415bc: e39e 86c2 ce31 45d3 4e34 ed69 8c24 6594 ....1..E4Ni.$..e
  84019. 80415cc: 72e8 c752 3844 e3f6 30a7 1521 dd93 4276 .rR.D8...0!...vB
  84020. 80415dc: 210f 65f5 a05e 4ba4 be3c 0896 5ec2 6345 .!.e^..K<....^Ec
  84021. 80415ec: 9ad2 794e 870a 4e81 0621 ead5 f960 d734 ..Ny...N!...`.4.
  84022. 80415fc: 10b6 a1fc ee98 e3bf cf78 6875 3e8a af03 ........x.uh.>..
  84023. 804160c: 8a7c 6af9 2b49 f1d6 71a3 459d b4b8 7ad4 |..jI+...q.E...z
  84024. 804161c: 6111 56c8 8e2a 73d4 8e75 3f91 ff57 97aa .a.V*..su..?W...
  84025. 804162c: 69cd dc73 b63c 35da 9f7d c107 2924 969f .is.<..5}...$)..
  84026. 804163c: ded6 fd48 6c8a 2398 7d64 fea3 7f52 57ab ..H..l.#d}..R..W
  84027. 804164c: d9ab 9f28 1de4 33cb baf5 0ef9 7a93 ba8c ..(....3.....z..
  84028. 804165c: 9bce 75ef 5762 5533 b945 d19f e652 7162 ...ubW3UE...R.bq
  84029. 804166c: 3c31 9124 46b4 f660 f2e1 88bf 8561 6115 1<$..F`.....a..a
  84030. 804167c: d6c3 814b 3586 0462 6fc3 5762 3156 6406 ..K..5b..obWV1.d
  84031. 804168c: 1182 f369 089d 1220 aaf6 33f8 d352 1629 ..i... ....3R.).
  84032. 804169c: ce43 de07 0f76 260e 3d0f 7381 8a41 13a2 C...v..&.=.sA...
  84033. 80416ac: 16d7 8a0d 46cb cc17 0eba 48c5 07da d489 .....F.....H....
  84034. 80416bc: e0c5 280b 9c8b c697 b1bf 3239 9af6 12d5 ...(......92....
  84035. 80416cc: f61f b5bc c3a0 2a20 1697 52b3 65e8 8607 ...... *...R.e..
  84036. 80416dc: 7b22 431f d675 0a3c 531c 6f59 e39b 4b00 "{.Cu.<..SYo...K
  84037. 80416ec: bb28 834c 54c9 d6fa 39d0 77ea 5964 784d (.L..T...9.wdYMx
  84038. 80416fc: 3cd6 535e 1fdc a508 ea87 444f f9c6 a255 .<^S......OD..U.
  84039. 804170c: aed0 07e6 230b c544 55e9 ef84 f718 fa93 .....#D..U......
  84040. 804171c: 3d45 2d5d 37f2 12f5 f5a1 8116 808c 6c46 E=]-.7........Fl
  84041. 804172c: 96ea 8572 17f6 9f5a 3921 2d59 0ceb 5179 ..r...Z.!9Y-..yQ
  84042. 804173c: 869a 8ea8 50d8 1687 a657 4ac3 1bdd 764c .....P..W..J..Lv
  84043. 804174c: 945a a7ee 1244 c34c dcd0 afe8 294e 977e Z...D.L.....N)~.
  84044. 804175c: d1d8 ab65 82b1 46fd 1b37 270d 847d 6c50 ..e....F7..'}.Pl
  84045. 804176c: b731 714c b92c 153f a579 493b 495c f399 1.Lq,.?.y.;I\I..
  84046. 804177c: 9f2e e378 dbe8 f5b6 4eb8 13ce 9346 d083 ..x......N..F...
  84047. 804178c: 829d bbbc b7bb a64b 1830 c879 1657 3b84 ......K.0.y.W..;
  84048. 804179c: 5044 67e2 4d34 6381 13f7 d615 d1cd 2306 DP.g4M.c.......#
  84049. 80417ac: abf7 a35c 291b 3ed0 20ab d672 54d6 a808 ..\..).>. r..T..
  84050. 80417bc: 553b 69d7 4542 5c42 d3d2 7d47 a641 9b94 ;U.iBEB\..G}A...
  84051. 80417cc: 4372 2983 aa2f a37e b5b6 549a e042 4244 rC.)/.~....TB.DB
  84052. 80417dc: 1c4a 254f 807d 7c5d 46e4 3c1b 8b2e a1ed J.O%}.]|.F.<....
  84053. 80417ec: 58fd 7557 3528 a315 8a33 7f8d e96b 899f .XWu(5..3...k...
  84054. 80417fc: baff e451 2138 f2d6 ac4d 6df2 18fd b2f6 ..Q.8!..M..m....
  84055. 804180c: e855 7d29 cb87 cdc1 06c1 4626 2f6e b0bd U.)}......&Fn/..
  84056. 804181c: 2f5b 63d0 c76b 664e daef 0b80 d993 a5a3 [/.ck.Nf........
  84057. 804182c: 6deb 5b6a ae0c 418e e821 888c 4f85 0d79 .mj[...A!....Oy.
  84058. 804183c: 4242 c36a b29e a49c 035d a1ee 662c fc79 BBj.....]...,fy.
  84059. 804184c: 5e29 a6b5 bbf6 3274 b7a5 e9b4 6121 5acc )^....t2....!a.Z
  84060. 804185c: 69be 173f ca88 bdba 5893 0137 974d e8fe .i?......X7.M...
  84061. 804186c: c5fc 5f6c 8afb eb1d 7605 4783 74ba f0cd ..l_.....v.G.t..
  84062. 804187c: 6d3f c47e e48e ecec d97d d6b9 0f15 4c72 ?m~.....}.....rL
  84063. 804188c: 6328 9f08 5676 745e 3bb9 7334 8d7c 80a7 (c..vV^t.;4s|...
  84064. 804189c: 4979 7c5c 5c0a 15cb f2f5 f238 6f36 dc0e yI\|.\....8.6o..
  84065. 80418ac: 5e3e 20bd 07e7 c0b0 c17a c3b7 e2a4 b938 >^. ....z.....8.
  84066. 80418bc: b070 f780 1c0d 0d1d 9c20 f0e3 e7cf d401 p....... .......
  84067. 80418cc: 6f88 bb6f efd6 108a 6402 c9d8 a453 6080 .oo......d..S..`
  84068. 80418dc: d19e db24 2016 c12b d1dd 6e07 f218 835b ..$.. +....n..[.
  84069. 80418ec: c69e 721e d1de 135b 8156 6de7 18de 1f79 ...r..[.V..m..y.
  84070. 80418fc: 39d5 9d4d 6fad e3fb 3ccc ff1c 2503 ce74 .9M..o...<...%t.
  84071. 804190c: 4891 000a 0000 0000 .H......
  84072. 08041914 <file__favicon_ico>:
  84073. 8041914: 0000 0000 f8f2 0803 f902 0803 053c 0000 ............<...
  84074. 8041924: 0001 0000 ....
  84075. 08041928 <HTTP_200_OK>:
  84076. 8041928: 5448 5054 312f 312e 3220 3030 4f20 0d4b HTTP/1.1 200 OK.
  84077. 8041938: 0d0a 000a ....
  84078. 0804193c <file__info_html>:
  84079. 804193c: b848 0803 09a2 0804 09ae 0804 04f6 0000 H...............
  84080. 804194c: 0001 0000 ....
  84081. 08041950 <file__login_html>:
  84082. 8041950: 193c 0804 06a0 0804 06ac 0804 02f6 0000 <...............
  84083. 8041960: 0001 0000 ....
  84084. 08041964 <data__main_css>:
  84085. 8041964: 6d2f 6961 2e6e 7363 0073 0000 5448 5054 /main.css...HTTP
  84086. 8041974: 312f 312e 3220 3030 4f20 0d4b 530a 7265 /1.1 200 OK..Ser
  84087. 8041984: 6576 3a72 6c20 4977 2f50 2e31 2e33 2031 ver: lwIP/1.3.1
  84088. 8041994: 6828 7474 3a70 2f2f 6173 6176 6e6e 6861 (http://savannah
  84089. 80419a4: 6e2e 6e6f 6e67 2e75 726f 2f67 7270 6a6f .nongnu.org/proj
  84090. 80419b4: 6365 7374 6c2f 6977 2970 0a0d 6f43 746e ects/lwip)..Cont
  84091. 80419c4: 6e65 2d74 654c 676e 6874 203a 3031 3435 ent-Length: 1054
  84092. 80419d4: 0d35 430a 6e6f 656e 7463 6f69 3a6e 4320 5..Connection: C
  84093. 80419e4: 6f6c 6573 0a0d 6f43 746e 6e65 2d74 7974 lose..Content-ty
  84094. 80419f4: 6570 203a 6574 7478 632f 7373 0a0d 6f43 pe: text/css..Co
  84095. 8041a04: 746e 6e65 2d74 6e45 6f63 6964 676e 203a ntent-Encoding:
  84096. 8041a14: 7a67 7069 0a0d 6143 6863 2d65 6f43 746e gzip..Cache-Cont
  84097. 8041a24: 6f72 3a6c 7020 6972 6176 6574 202c 616d rol: private, ma
  84098. 8041a34: 2d78 6761 3d65 3638 3034 0d30 0d0a 1f0a x-age=86400.....
  84099. 8041a44: 088b 0000 0000 0400 d50a 6b7d 238f 7239 ..........}k.#9r
  84100. 8041a54: 5fe0 a791 e7d0 6dae a349 bd57 d854 79c2 ._.....mI.W.T..y
  84101. 8041a64: f6c6 80f9 c05b bd80 da9f 418d 994a ca55 ....[......AJ.U.
  84102. 8041a74: 496d 4829 eeaa d1aa 3fe9 0718 3818 70e0 mI)H.....?...8.p
  84103. 8041a84: ec7e f01f e95f e49f 9278 2641 a533 ef6a ~..._...x.A&3.j.
  84104. 8041a94: bb87 9dad 2519 119f 88c1 3060 2418 fc7f .....%....`0.$..
  84105. 8041aa4: 9fcd d675 76d5 2d95 5fcb fe8b b77c 7ceb ..u..v.-._..|..|
  84106. 8041ab4: f719 fd07 e751 767f f77e ffdf f3be ca3f ....Q..v~.....?.
  84107. 8041ac4: b179 15de f5f0 ee54 65fb a3f5 db2b cdf9 y.....T..e..+...
  84108. 8041ad4: fd8f f565 7554 edb3 9cbe 8b2f b66e f32b ..e.Tu..../.n.+.
  84109. 8041ae4: 9ba2 fb17 5cac baee e58f 3cd3 ecdb 6acb .....\.....<...j
  84110. 8041af4: 3f8d b79f f745 aab1 c5f6 bbb6 b228 ff1c .?..E.......(...
  84111. 8041b04: b4f3 9ead dd37 5655 bbae 62ab dcfd 675d ....7.UV...b..]g
  84112. 8041b14: ba5f 62bb 354e cf76 55ab 7db6 e43d 6ee5 _..bN5v..U.}=..n
  84113. 8041b24: ccb3 a75e 65b3 ff35 ec7c 36ef 7ae5 bd56 ..^..e5.|..6.zV.
  84114. 8041b34: 2efc 7edb e6ee eb8f 63c3 deb5 76f7 d7fb ...~.....c...v..
  84115. 8041b44: 3165 f72d c080 d8fc 5687 d966 bbb6 9e7b e1-......Vf...{.
  84116. 8041b54: 3fc1 c39b daa6 d895 74e2 2c5b 7db3 a5f9 .?.......t[,.}..
  84117. 8041b64: 12a0 cb0f 21f2 f6eb d937 58ba 10f6 729e .....!..7..X...r
  84118. 8041b74: d4fd efed d9b3 78b2 e3d8 c3f7 0b7e fa3f .......x....~.?.
  84119. 8041b84: c59b 5961 01ec dee8 936e a1cd b4d0 183f ..aY....n.....?.
  84120. 8041b94: ab15 3f63 3003 14bf fedd bf6c 3fee f356 ..c?.0....l..?V.
  84121. 8041ba4: 1de7 9cfd 9f9a ea8b 200b e089 6750 e59a ......... ..Pg..
  84122. 8041bb4: 29be b0ff 5e2f bdf6 98bc 5b57 0e00 5ca0 .)../^....W[...\
  84123. 8041bc4: 6b57 b086 bcfb 7844 f8a0 b0ee 772c 258a Wk....Dx....,w.%
  84124. 8041bd4: 23e7 7e19 5eaa 44ba f80f 29d1 9bd7 7de7 .#.~.^.D...)...}
  84125. 8041be4: fe97 71fd baff 7e29 2bbb edb2 f17c d0e9 ...q..)~.+..|...
  84126. 8041bf4: 5afb 3ecc fb97 b65e 40d9 b64a 179e c5d2 .Z.>..^..@J.....
  84127. 8041c04: cb2c 189f c3fe 45d7 2fb9 4108 fccc cdba ,......E./.A....
  84128. 8041c14: 4736 89c0 aa86 634f cd34 711e fadc 3832 6G....Oc4..q..28
  84129. 8041c24: 1807 6ceb 9d3b fb55 b1c5 3d5c 9775 53c5 ...l;.U...\=u..S
  84130. 8041c34: ceb1 b30f 0b6a 3ac3 1c1d bbf9 cfbb fbbb ....j..:........
  84131. 8041c44: 61c5 e593 5c48 5e48 57ec 1e4b c7b0 556c .a..H\H^.WK...lU
  84132. 8041c54: 5f2e 7fa7 2db1 65b3 6ff7 e58a 0297 27f8 ._...-.e.o.....'
  84133. 8041c64: eeeb f5b2 b7ae b62b e3e5 82bd e44d 01d9 ......+.....M...
  84134. 8041c74: f65f fcb2 cf0f fdbb 3874 bc18 efbb 76ad _.......t8.....v
  84135. 8041c84: 64bd 71ce e556 07af 9c60 72a7 1d3d cfdc .d.qV...`..r=...
  84136. 8041c94: f9b2 4467 9d60 e6f7 b2d5 4eda fe2f f6ea ..gD`......N/...
  84137. 8041ca4: 7eaf ebfa bde1 8d7c e3c7 1c7b c7a5 f565 .~....|...{...e.
  84138. 8041cb4: f7b5 dd3a b7cd 72d5 bf79 ca28 05a7 74f7 ..:....ry.(....t
  84139. 8041cc4: 9ecc b2f3 ceea f5b3 6c97 ddd7 ab6c 6da7 .........l..l..m
  84140. 8041cd4: dbb1 bf75 9b00 8e57 cb35 b2f5 175c e23d ..u...W.5...\.=.
  84141. 8041ce4: 7bd0 0d68 5971 80f6 9f19 d3d6 b659 302b .{h.qY......Y.+0
  84142. 8041cf4: 1b97 ea02 dfee 9c7f cf03 4742 4fbb ae97 ..........BG.O..
  84143. 8041d04: 1c09 ed55 7077 b8fc f328 58bc ea7f 8bee ..U.wp..(..X....
  84144. 8041d14: 3015 beff ca08 b31d 0d43 3daf 2c8c e830 .0......C..=.,0.
  84145. 8041d24: 58b6 8fef 54d9 3378 329b 558b 7bcf 0104 .X...Tx3.2.U.{..
  84146. 8041d34: 2046 cd9b 1fb6 e5f7 597e 927c ead1 20c1 F ......~Y|....
  84147. 8041d44: abee 74d5 79b8 e4e9 b3f0 8fc8 6eb3 d9b5 ...t.y.......n..
  84148. 8041d54: 68b3 00ee f5ce 8f13 57d9 caa6 00cd 7206 .h.......W.....r
  84149. 8041d64: 24a8 5fee 14df ceab 9ee0 10c5 6986 c28a .$._.........i..
  84150. 8041d74: f401 7cff 1210 060f 1876 17a6 8f8f e383 ...|....v.......
  84151. 8041d84: 540e 708d 0e02 f4ed f076 a8ee eae2 ba5b .T.p....v.....[.
  84152. 8041d94: 7ab9 4f77 9584 18f1 d234 c516 5f7c a66d .zwO....4...|_m.
  84153. 8041da4: febd f415 2d0e 7201 5584 3faf 94a2 4f2f .....-.r.U.?../O
  84154. 8041db4: f944 16e9 fa98 a0f2 3e23 3265 591f 2939 D.......#>e2.Y9)
  84155. 8041dc4: 434a 6840 d832 1cbc db17 eb83 d959 5411 JC@h2.......Y..T
  84156. 8041dd4: 0f4f 4640 c67e 0451 0372 5f01 1f80 5fab O.@F~.Q.r.._..._
  84157. 8041de4: 47f1 2f2a 7c9d 80dc 443a 8616 cb31 443c .G*/.|..:D..1.<D
  84158. 8041df4: f3d9 3abe 2bce a250 679f f039 015b b132 ...:.+P..g9.[.2.
  84159. 8041e04: 04da b342 d6aa ea15 a2a2 7eeb f219 f403 ..B........~....
  84160. 8041e14: d9c7 2033 eebf 4ab2 63f0 2c59 b541 3efa ..3 ...J.cY,A..>
  84161. 8041e24: 909d c520 e5a7 017a b772 c117 2f90 c969 .. ...z.r..../i.
  84162. 8041e34: f783 dca5 a095 b521 6007 686d 5592 7118 ......!..`mh.U.q
  84163. 8041e44: 23e0 22cc 5ea2 cd54 e935 1458 d254 39b1 .#.".^T.5.X.T..9
  84164. 8041e54: d8e8 e6b4 f6ed 1551 8a6d 076d 8e18 ddc4 ......Q.m.m.....
  84165. 8041e64: f277 e98c 1073 852e 9505 6b0b d641 4c7f w...s......kA..L
  84166. 8041e74: 4f84 054c 024e 2dd1 41f6 b00a aaca 27dc .OL.N..-.A.....'
  84167. 8041e84: 2495 bfd7 3f9f 776f 37a0 5536 a309 95bd .$...?ow.76U....
  84168. 8041e94: 3ece a4c2 3384 fe45 6ba9 75ba 0789 94a9 .>...3E..k.u....
  84169. 8041ea4: 8f17 f3d9 7f72 5a34 be79 e628 819f 0223 ....r.4Zy.(...#.
  84170. 8041eb4: b628 fb30 1e54 c308 ac30 9351 662c d2b2 (.0.T...0.Q.,f..
  84171. 8041ec4: bc15 35de affd 579f 62b3 69fb 553a 2e86 ...5...W.b.i:U..
  84172. 8041ed4: 6bd7 db9a 75ca b2cf 130d 56ac 341a 5849 .k...u.....V.4IX
  84173. 8041ee4: 255a f884 f4d6 cf13 063e ffc4 dc9c 89b8 Z%......>.......
  84174. 8041ef4: ccc1 c867 8f1a b165 2dcc 05a5 8f02 2729 ..g...e..-....)'
  84175. 8041f04: 40f4 cf95 ca61 23af 54db cfc1 2dcd e973 .@..a..#.T...-s.
  84176. 8041f14: dd7e 8d23 53d9 fff5 8680 a701 e4e9 12e9 ~.#..S..........
  84177. 8041f24: 8592 0566 0f08 c7cf 7dbd 2d55 84c1 15b1 ..f......}U-....
  84178. 8041f34: 4935 d18b fc0c be58 1968 edf7 800a 8354 5I....X.h.....T.
  84179. 8041f44: 0561 f5c3 7cb8 732e 2e57 ae4a af15 9c15 a....|.sW.J.....
  84180. 8041f54: 916a 0c1c 6aa5 fe5b 2d8a 3b2c 6bb9 96b2 j....j[..-,;.k..
  84181. 8041f64: 15ae 1b50 2ad8 5360 4240 5060 15b4 66d1 ..P..*`S@B`P...f
  84182. 8041f74: 5556 d30e db29 0a23 905d 05a6 e541 3e68 VU..).#.]...A.h>
  84183. 8041f84: 34fe 40c9 344c 9600 66d9 9857 4122 5472 .4.@L4...fW."ArT
  84184. 8041f94: 6d9c a8d4 24b0 4586 32c3 dbae f64d c604 .m...$.E.2..M...
  84185. 8041fa4: 1890 fc4e f5a1 ead8 0d44 f3e8 0ed1 14a5 ..N.....D.......
  84186. 8041fb4: b42d bead 2e6a e4fe 6764 9008 0aa5 9ada -...j...dg......
  84187. 8041fc4: a0e6 0fe9 1f9d f798 7cc1 9526 e2ac e46d .........|&...m.
  84188. 8041fd4: 28ce 788c 32ba c959 6a0a ca0d 0914 b9fc .(.x.2Y..j......
  84189. 8041fe4: 5e99 364d 7f2f ae56 d536 9f76 f7ad a4f7 .^M6/.V.6.v.....
  84190. 8041ff4: d99e d9e4 f5a2 ff74 ccb5 0bf7 d6b6 12c4 ......t.........
  84191. 8042004: 7c78 3c7c 7aea ec00 5342 5963 ee3c 8fb5 x||<.z..BScY<...
  84192. 8042014: 3e87 4522 ab9c 63a6 5a8f b684 5260 cbce .>"E...c.Z..`R..
  84193. 8042024: 0f2f e6b4 7038 a307 d5c9 45e6 a72d fc5b /...8p.....E-.[.
  84194. 8042034: f32d 951a 92e6 5ade 3e9a 976f b7ef d860 -......Z.>o...`.
  84195. 8042044: ee7e d66f 974f 1e9d e854 86f4 eff8 d575 ~.o.O...T.....u.
  84196. 8042054: 16db 2260 9007 fccb da8f 29cd df1e ce1a ..`".......)....
  84197. 8042064: 05f6 01d8 f320 0162 7378 66d3 bd55 9d74 .... .b.xs.fU.t.
  84198. 8042074: ea64 8fb1 13d6 8f58 ecab 5d0f 1bf7 4856 d.....X....]..VH
  84199. 8042084: 1bfc 76ac 55f9 767d c0cc a796 fc50 d3da ...v.U}v....P...
  84200. 8042094: 0863 2463 30f4 d434 1c14 11c5 0014 37e3 c.c$.04........7
  84201. 80420a4: 4fdb 0c79 6fa8 d968 1683 6c93 e9d0 8cdd .Oy..oh....l....
  84202. 80420b4: 7a03 b2f9 904c 0de1 dab4 bdb9 d181 f032 .z..L.........2.
  84203. 80420c4: 34b7 bbd9 0ac2 d3df f66c b687 c766 d5df .4......l...f...
  84204. 80420d4: 502c adb8 21d1 f7d0 b04d 2a82 3d02 5873 ,P...!..M..*.=sX
  84205. 80420e4: 0cc1 17eb 4816 ce1b b580 591f a609 5d4f .....H.....Y..O]
  84206. 80420f4: 80ab dcc0 3c93 b22e 341c a0c0 4683 f23a .....<...4...F:.
  84207. 8042104: f6ea 9669 1fbd f174 3faf 8cba ea5b cb68 ..i...t..?..[.h.
  84208. 8042114: 5833 e414 876a c78f d937 a6ec acbd a259 3X..j...7.....Y.
  84209. 8042124: 6aa2 c814 f6c2 4d64 32a1 0d9d a387 7b9b .j....dM.2.....{
  84210. 8042134: 02c3 619c 23d7 4e0a 1cdc 002a ee85 a6e6 ...a.#.N..*.....
  84211. 8042144: 3419 13a0 a02d 1561 ab0c a52c b161 5b12 .4..-.a...,.a..[
  84212. 8042154: 82f5 b331 3036 008a 17a9 773f ab7b 3114 ..1.60....?w{..1
  84213. 8042164: 3d63 b07e 2f9c 01a3 91ff 5664 6a63 3b25 c=~../....dVcj%;
  84214. 8042174: 31c2 0d34 1955 b14e 48bc a24d ba1a 04d7 .14.U.N..HM.....
  84215. 8042184: 6b5d 22a1 aa43 0538 c287 cb07 ee55 a60c ]k."C.8.....U...
  84216. 8042194: 5a01 0cbc d5ee c1f7 4c0b 02aa 783d 4297 .Z.......L..=x.B
  84217. 80421a4: b7dd aae1 bb88 a184 c87d a7b4 04e9 8265 ........}.....e.
  84218. 80421b4: a375 89e6 432b 6287 9a32 5e3c 804d 70f1 u...+C.b2.<^M..p
  84219. 80421c4: af31 80b0 e922 aaec 9965 2e77 c306 386c 1..."...e.w...l8
  84220. 80421d4: 142b df27 6760 0b7c 2d68 d24b cfb9 0f7b +.'.`g|.h-K...{.
  84221. 80421e4: 365b 9a83 3860 a3de 21c2 b07a 1f3e 2b01 [6..`8...!z.>..+
  84222. 80421f4: b23b ccc6 c0c1 5b49 bf00 165f 6ff6 e861 ;.....I[.._..oa.
  84223. 8042204: 719d c11b cb49 6cd8 28b7 fbf2 7b5f 3ae5 .q..I..l.(.._{.:
  84224. 8042214: 5e2f c7a0 91d1 4b66 1458 4a12 c8ea 7581 /^....fKX..J...u
  84225. 8042224: 2729 cb38 5760 12c0 961a eddb 2cfc 9873 )'8.`W.......,s.
  84226. 8042234: 9492 1986 5750 9498 9864 5224 dc42 30cd ....PW..d.$RB..0
  84227. 8042244: 6998 c7f1 3b1f ecab 67a5 c252 1ff1 9b11 .i...;...gR.....
  84228. 8042254: b550 bd87 2e5f b5b9 4b92 cbf2 3427 7892 P..._....K..'4.x
  84229. 8042264: e551 b94a 5f24 b9ca 60b7 912a 5de6 f792 Q.J.$_...`*..]..
  84230. 8042274: 20d7 81fc f5c4 a327 abdb e19b 1c64 c3af . ....'.....d...
  84231. 8042284: e057 58ad d102 9a98 ca34 5d9e 3cf2 263f W..X....4..].<?&
  84232. 8042294: 517a 593b 24dd f2c4 84da 0008 aab2 1d30 zQ;Y.$........0.
  84233. 80422a4: 02b5 3406 26ae b5c1 ae43 43b2 06d4 a183 ...4.&..C..C....
  84234. 80422b4: c99d 7d28 6750 f4de dcb1 1382 be6d 9728 ..(}Pg......m.(.
  84235. 80422c4: dbe0 9873 17b7 3473 8183 bb24 64f5 ed73 ..s...s4..$..ds.
  84236. 80422d4: 5ce5 047b 0855 36d2 74fc 9e10 ba2e ce50 .\{.U..6.t....P.
  84237. 80422e4: d246 940f c400 1f32 dfe8 3f36 2a26 4031 F.....2...6?&*1@
  84238. 80422f4: 4787 3d28 4907 3083 812b 813c 1823 e7c8 .G(=.I.0+.<.#...
  84239. 8042304: 4f58 4ca1 2a66 36b6 b1d3 aa63 cba6 d54c XO.Lf*.6..c...L.
  84240. 8042314: 2c74 aa9a 32e9 ff3d 7692 ec21 2240 f051 t,...2=..v!.@"Q.
  84241. 8042324: 570b bf51 8853 f224 341c cf3e 9a41 d368 .WQ.S.$..4>.A.h.
  84242. 8042334: 25e5 39ea 1338 5cf5 8e9e 3927 ace5 8400 .%.98..\..'9....
  84243. 8042344: 18d8 f53f ad39 5e89 7d12 6c03 e3a0 4e0a ..?.9..^.}.l...N
  84244. 8042354: 72be 4663 ba75 2fde d57a 0f63 c8dd abef .rcFu../z.c.....
  84245. 8042364: bf3c b14c ddc5 fc23 0b69 66e4 c474 0b14 <.L...#.i..ft...
  84246. 8042374: 66a1 5c13 5e3c 1fe1 e32b 480e c7d4 32f9 .f.\<^..+..H...2
  84247. 8042384: eddb f37e f85b fbd9 e7e4 dd8b c41e ee7b ..~.[.........{.
  84248. 8042394: 3266 1a46 3cca d6af ab62 0f92 199c 9f77 f2F..<..b.....w.
  84249. 80423a4: ad07 2574 1175 9ea4 bb6a a700 db2f ec02 ..t%u...j.../...
  84250. 80423b4: a75d 1c46 a03e 702d c01b 57ac 3f60 fc04 ].F.>.-p...W`?..
  84251. 80423c4: aa20 ffdd e7e2 c69f 5b3f a727 dfb3 1f6e .......?['...n.
  84252. 80423d4: efe1 bd3e 207f f87d 6f41 8374 6c8d 68d7 ..>.. }.Aot..l.h
  84253. 80423e4: d429 a7a7 ec0b ba08 2a02 93a1 205b 39a2 )........*..[ .9
  84254. 80423f4: dc53 13b6 db70 90b2 32c3 b767 d6a9 d83b S...p....2g...;.
  84255. 8042404: b0bd 6946 307f e77c e17d 57e0 4f40 7fe4 ..Fi.0|.}..W@O..
  84256. 8042414: 155d 9979 c075 5e2f eb14 580e 9d93 7ef7 ].y.u./^...X...~
  84257. 8042424: baca 06b9 ff13 50f2 b56f 4671 85c3 ef96 .......Po.qF....
  84258. 8042434: 55e3 affc cde4 9f57 ecac a0e5 1f83 0021 .U....W.......!.
  84259. 8042444: 2d0f 5af8 ec7b 0798 4dcb 8866 c906 98f0 .-.Z{....Mf.....
  84260. 8042454: 883d 0b42 d467 0904 a0a4 6c1d 1499 9d0d =.B.g......l....
  84261. 8042464: 85ea 689c bad7 d87c f93b 5277 56d9 ada8 ...h..|.;.wR.V..
  84262. 8042474: c725 6d1c b92d 8b42 3ee4 f10e 1d59 a717 %..m-.B..>..Y...
  84263. 8042484: 6513 706e 46f3 514b 244b 593b 1235 75cc .enp.FKQK$;Y5..u
  84264. 8042494: 6a62 de2e d35a f393 6bbb b9be 474f fcd3 bj..Z....k..OG..
  84265. 80424a4: 7dad 9aba 9f41 013a 9db3 175f 6144 14b0 .}..A.:..._.Da..
  84266. 80424b4: f2bd 2829 b149 de5b e848 55b7 7434 cefe ..)(I.[.H..U4t..
  84267. 80424c4: 8b8a 8237 68ea 56f5 5d1c db45 d2a3 1798 ..7..h.V.]E.....
  84268. 80424d4: cd17 5ea2 b227 db01 865b c8e7 5041 59b1 ...^'...[...AP.Y
  84269. 80424e4: 4d90 428f a0e4 b362 9f70 a8a8 0276 e314 .M.B..b.p...v...
  84270. 80424f4: e305 b611 c0b2 0e0d 1cbb d9a4 0f59 740f ............Y..t
  84271. 8042504: e261 9816 31b8 164a 0a11 f93d 0f22 9ea1 a....1J...=."...
  84272. 8042514: 95c4 6a47 2192 047f f1ed 3ae2 2d8b b313 ..Gj.!.....:.-..
  84273. 8042524: f7d2 322e 09dc 736b 0c5a 2eaf 8401 85d3 ...2..ksZ.......
  84274. 8042534: bc04 6d1e ca59 124e ffb8 3770 379c 1928 ...mY.N...p7.7(.
  84275. 8042544: 07fc c7d9 e987 5c8f b6bc 8448 629a 2e4c .......\..H..bL.
  84276. 8042554: 9800 745a 4715 d30b 4d0e 4c50 251b 1a6a ..Zt.G...MPL.%j.
  84277. 8042564: 60d3 55a2 9128 a12d 87c9 be7e 36ad b1e0 .`.U(.-...~..6..
  84278. 8042574: 7759 2fdc 2458 3d3e 8041 0084 f16a e461 Yw./X$>=A...j.a.
  84279. 8042584: fa1e 29b4 141a 3490 a71f d540 cfe2 3d44 ...)...4..@...D=
  84280. 8042594: 824a 3345 a943 799b 6fb6 0aa5 18ad d722 J.E3C..y.o....".
  84281. 80425a4: a289 bc83 6c5a 0453 6ef2 a14e 9883 421f ....ZlS..nN....B
  84282. 80425b4: d4b9 900a ccd8 4b8e 0cc7 0f63 0fc2 6e56 .......K..c...Vn
  84283. 80425c4: d978 9e3b cb1a 1d5a 7995 38b1 2980 b595 x.;...Z..y.8.)..
  84284. 80425d4: b87b f6a9 73bc 6e1c b6bb bd3a a4d6 3ccd {....s.n..:....<
  84285. 80425e4: 2403 bc5b 2db5 9505 ee29 d529 39c3 a141 .$[..-..).)..9A.
  84286. 80425f4: c705 88aa 7a26 d815 6b67 64f2 0264 bc5c ....&z..gk.dd.\.
  84287. 8042604: aeae ef77 cef3 c4c1 6e97 496b 50f1 a39d ..w......nkI.P..
  84288. 8042614: f2f0 0d77 28e4 423b 21d6 63c4 022e a1f4 ..w..(;B.!.c....
  84289. 8042624: 9c45 a0eb 7599 c2bd b486 3db3 a639 11a8 E....u.....=9...
  84290. 8042634: d415 d781 da26 332f 8abe 03a2 17ca 1b3c ....&./3......<.
  84291. 8042644: d108 82c0 aca6 1bb2 82c7 354c db97 b860 ..........L5..`.
  84292. 8042654: e4a9 fd2a 1efd 444c 2f4c d440 4752 5eb7 ..*...LDL/@.RG.^
  84293. 8042664: b898 7162 53a4 73eb 969f 6d53 dba0 6809 ..bq.S.s..Sm...h
  84294. 8042674: abd0 9377 1b8c a0d4 2011 2ce8 c0f8 b8f6 ..w...... .,....
  84295. 8042684: 8e43 dbc7 98e4 5d2e 8221 075b cb05 3986 C......]!.[....9
  84296. 8042694: 8aa6 642d a098 4cb6 2d10 0d44 4db3 e56a ..-d...L.-D..Mj.
  84297. 80426a4: 3c17 f667 83b3 a25e d637 5370 8932 23b9 .<g...^.7.pS2..#
  84298. 80426b4: ed84 8bd0 f619 bfe7 ba9a 25f3 f2e2 33ae ...........%...3
  84299. 80426c4: 05e1 553f 905d ccbf 6ec2 1588 9073 a888 ..?U]....n..s...
  84300. 80426d4: 9553 b53c a546 19d8 c3c9 5346 876f 1349 S.<.F.....FSo.I.
  84301. 80426e4: 7315 1692 5fa9 536e c8ea 6968 2455 e795 .s..._nS..hiU$..
  84302. 80426f4: a09a 9ba4 c3a5 d939 e24d 1216 ab2d e0bc ......9.M...-...
  84303. 8042704: dff9 ae0b 678c 8fb2 3d7a 16c6 ef19 4f24 .....g..z=....$O
  84304. 8042714: 2d85 ccca 95e9 447c a15b ec83 c769 6b1d .-....|D[...i..k
  84305. 8042724: edae 6db8 7584 469f 9481 d939 80b3 5016 ...m.u.F..9....P
  84306. 8042734: 4933 9a34 0798 2dea f848 d86b 60a9 48d0 3I4....-H.k..`.H
  84307. 8042744: 5872 f343 5a31 bbda 0b45 f1f5 e0b9 fa76 rXC.1Z..E.....v.
  84308. 8042754: b114 50a8 33b3 6129 42a5 9f4c 5dc8 180c ...P.3)a.BL..]..
  84309. 8042764: cb0f 7039 64c9 4166 5093 eb24 a132 4450 ..9p.dfA.P$.2.PD
  84310. 8042774: 45b3 55ec 6eb1 5348 b609 61ad 0efb 1a1d .E.U.nHS...a....
  84311. 8042784: 6b9d adb4 5e79 a3b8 b4df c00d 8af1 825c .k..y^........\.
  84312. 8042794: a855 7d09 fc8a ea38 b9e5 dc99 dd5c 0f82 U..}..8.....\...
  84313. 80427a4: 4a4e b62a 6f29 39dd 891b 9360 dad7 ad82 NJ*.)o.9..`.....
  84314. 80427b4: 083f 944c 8865 c70b 9ed2 aaec 985e b64f ?.L.e.......^.O.
  84315. 80427c4: 38d9 5100 0a86 af1c 3ec7 91f8 5420 1d0e .8.Q.....>.. T..
  84316. 80427d4: bbf8 0bec b8b4 1b5f 8138 0336 6ac5 e054 ......_.8.6..jT.
  84317. 80427e4: 91df 00a2 a37a ff2e 6c77 dbf6 7cdc bb23 ....z...wl...|#.
  84318. 80427f4: b448 824b 0331 91bd 04c4 6e4c 49de b1fd H.K.1.....Ln.I..
  84319. 8042804: 8ca4 c021 5b90 349a 84b7 1973 cc0f d268 ..!..[.4..s...h.
  84320. 8042814: 409f 0e05 740f ecbb 0a48 c433 c615 ef03 .@...t..H.3.....
  84321. 8042824: 515f 15b4 2539 1582 5193 7f0e 22f7 aa43 _Q..9%...Q..."C.
  84322. 8042834: c515 48db 4018 b34c 08a3 caaf 564e 5e3f ...H.@L.....NV?^
  84323. 8042844: b860 af74 ac04 e803 fc04 642b dd31 1d27 `.t.......+d1.'.
  84324. 8042854: 07e0 373b 3ba9 3123 dd53 a3cb da70 79ea ..;7.;#1S...p..y
  84325. 8042864: e8be c0e1 1041 2af2 975b 679b 970c d6ae ....A..*[..g....
  84326. 8042874: 6db0 94d7 0613 b9c7 dfe5 8433 42f0 2f18 .m........3..B./
  84327. 8042884: a206 3f10 7070 2244 d775 25ab 09c6 cd10 ...?ppD"u..%....
  84328. 8042894: de4a 8365 57b1 d354 c98b 0264 94de 7819 J.e..WT...d....x
  84329. 80428a4: 330d f8d8 d542 dbc2 665f 555e 9816 e3bc .3..B..._f^U....
  84330. 80428b4: 613d 520e 1761 d52e d72d d58f bac9 0aea =a.Ra...-.......
  84331. 80428c4: d6ad d7cb 66ce d10b 0780 d7d9 6896 87db .....f.......h..
  84332. 80428d4: 25e7 cc6d 9382 7e12 c306 0c72 272a a99d .%m....~..r.*'..
  84333. 80428e4: e99d 35cd b86c 37a9 82d5 e8d3 8e17 44f6 ...5l..7.......D
  84334. 80428f4: 2a31 efd7 0e92 10fb 9b98 13e2 ac1b bc7c 1*............|.
  84335. 8042904: 2f98 f5b2 f153 e0b7 ff86 bc0a 85d7 886f ./..S.........o.
  84336. 8042914: fc4f 26fd 4d87 4c50 5eec 316c 1f1c 0abc O..&.MPL.^l1....
  84337. 8042924: dddb d5cf 021a bb65 cf17 881b c917 0eff ......e.........
  84338. 8042934: e282 ad61 a3bb dbb8 e0e1 179d dd0c 3dd2 ..a............=
  84339. 8042944: 974d 177b ef9a 88b6 becd 5bae 6264 30cc M.{........[db.0
  84340. 8042954: 4206 e390 8401 f754 6504 da23 01ab 60da .B....T..e#....`
  84341. 8042964: fa36 0af5 c522 2efd c830 6c29 e32a 3fee 6..."...0.)l*..?
  84342. 8042974: 2def d1bb 965a c1d6 be2e bf7d 201d 4542 .-..Z.....}.. BE
  84343. 8042984: dcaa e781 3ada 6fb5 822d f32f 6d37 402f .....:.o-./.7m/@
  84344. 8042994: 3f5c 1040 2302 a39a 74ee 28b8 e28a aa98 \?@..#...t.(....
  84345. 80429a4: 3961 d13c 3609 b10f 8e02 830f 9761 39be a9<..6......a..9
  84346. 80429b4: c15a 0cf2 4b04 7aab bd45 6dc6 e898 8c01 Z....K.zE..m....
  84347. 80429c4: 368d 1ae9 6039 b225 c1b8 d53f 41e6 0130 .6..9`%...?..A0.
  84348. 80429d4: 032b a1a5 0b6f a4c7 8e95 fef1 d9cd 37d4 +...o..........7
  84349. 80429e4: 19b8 a4cc 9d67 65d1 8632 7368 6d05 a1d0 ....g..e2.hs.m..
  84350. 80429f4: f240 c623 d270 8eb1 8e5e b262 8885 dc02 @.#.p...^.b.....
  84351. 8042a04: 2e73 7b72 23fa d3ce 7be8 000a b415 f2c2 s.r{.#...{......
  84352. 8042a14: f01c 9413 1d43 6e94 c83d ea09 1680 d302 ....C..n=.......
  84353. 8042a24: 35e2 5b68 82d2 bb72 f9e7 0e1c a42d 8f9b .5h[..r.....-...
  84354. 8042a34: 8333 5f9a edb3 b71a 925f c768 b699 85a6 3.._...._.h.....
  84355. 8042a44: a5c9 9b57 ed62 637d 11e2 2a63 d485 f6ed ..W.b.}c..c*....
  84356. 8042a54: 8a5b f132 8ada 1404 2b6b c428 2b6a 9312 [.2.....k+(.j+..
  84357. 8042a64: ada7 4c6c 5c10 686c c2ac 8943 73e7 aa38 ..lL.\lh..C..s8.
  84358. 8042a74: 371a 3f12 2745 8c77 d431 5183 927d 3a43 .7.?E'w.1..Q}.C:
  84359. 8042a84: b317 2fe5 e58f 6612 e016 9544 db11 adae .../...f..D.....
  84360. 8042a94: d627 862a ca59 1dbe 564d 7cc1 4103 7968 '.*.Y...MV.|.Ahy
  84361. 8042aa4: 05f1 740e 36f1 4eb0 7e3b 2f6b 85cc 19d8 ...t.6.N;~k/....
  84362. 8042ab4: fc88 e4b9 886c 85fd 4f7d 09b2 a03a d67d ....l...}O..:.}.
  84363. 8042ac4: 0ef9 0a5c 6485 c06a cae9 b0f7 5f29 a620 ..\..dj.....)_ .
  84364. 8042ad4: 8e95 4d35 3087 81b3 0136 b749 f406 4c1d ..5M.0..6.I....L
  84365. 8042ae4: 2779 3964 fd08 78c1 3046 9e97 50f1 4694 y'd9...xF0...P.F
  84366. 8042af4: 8f9e 4661 93b0 e70f cc52 4d5a e1bf b7a6 ..aF....R.ZM....
  84367. 8042b04: b508 9a1f 32ee 159b 34f6 ff4a 740e 1845 .....2...4J..tE.
  84368. 8042b14: c57a 7b67 ac94 1ec1 cf28 6cda aa7f 2ab5 z.g{....(..l...*
  84369. 8042b24: 9dff e988 4d11 b81d 513a 38be 9578 0433 .....M..:Q.8x.3.
  84370. 8042b34: eee8 3f43 9cbc f1ab b85b 4041 a8ce 993f ..C?....[.A@..?.
  84371. 8042b44: a400 7df5 5869 d451 744f 04e9 8c6a f9cb ...}iXQ.Ot..j...
  84372. 8042b54: ae7c 1a7a 420f 2cc9 8e42 e333 52b8 6b50 |.z..B.,B.3..RPk
  84373. 8042b64: 1c2c e3c6 c7f5 0b00 4cf6 bf71 e1f2 43b1 ,........Lq....C
  84374. 8042b74: 20e4 ac57 0052 ce1d f909 5ff9 e68f 9025 . W.R......_..%.
  84375. 8042b84: 0d49 4284 757d 6575 59cc 495d 6b7a 9c81 I..B}uue.Y]Izk..
  84376. 8042b94: b080 90b8 0a18 57c4 6490 21a3 4395 9b8e .......W.d.!.C..
  84377. 8042ba4: 0d44 c199 5553 559c 080f 1caa dd98 128d D...SU.U........
  84378. 8042bb4: 6662 1df6 de8e ea44 e8db c1cd ec0d 4084 bf....D........@
  84379. 8042bc4: 37b5 3f14 e45e 8068 b2fd 5d80 0a90 480e .7.?^.h....]...H
  84380. 8042bd4: 233a 11ca 1651 0331 0913 528c 5762 2401 :#..Q.1....RbW.$
  84381. 8042be4: ec05 30b4 1527 cd58 51c8 5803 eb6f 67ec ...0'.X..Q.Xo..g
  84382. 8042bf4: b853 5452 b492 e49b 63f8 9d8b d965 c881 S.RT.....c..e...
  84383. 8042c04: 1f3d 8c5e 0cea 35d9 b301 69da a423 6886 =.^....5...i#..h
  84384. 8042c14: 6bb2 3088 beb8 aa39 1412 1a69 d2e8 5106 .k.0..9...i....Q
  84385. 8042c24: c872 0b3b c712 046f 0942 1761 5314 0da9 r.;...o.B.a..S..
  84386. 8042c34: 0d0f e1ca 0c01 593b 0e31 be61 c09b 0750 ......;Y1.a...P.
  84387. 8042c44: c793 ca29 67f7 933e b4d9 617e 5182 226d ..)..g>...~a.Qm"
  84388. 8042c54: bd78 4a53 f7ae c9c5 1771 ca9c 432d bc48 x.SJ....q...-CH.
  84389. 8042c64: f6b4 70b7 f59a 08a0 088f a761 3060 f96c ...p......a.`0l.
  84390. 8042c74: 2acd d866 4ebf 986a 87ff 8c17 3d75 7767 .*f..Nj.....u=gw
  84391. 8042c84: 5528 ddfc 90e6 531b 28a2 9f8f 0275 cd83 (U.....S.(..u...
  84392. 8042c94: 7fba 6c6f 4bed bca6 ca77 03c6 567b ba13 ..ol.K..w...{V..
  84393. 8042ca4: e841 05b6 3043 015a 8820 8de2 cbc5 0c00 A...C0Z. .......
  84394. 8042cb4: bf3f 477c 074b 11a1 e6fa 4d48 06ea f394 ?.|GK.....HM....
  84395. 8042cc4: 8aed 2c77 34cc 65e2 e949 c509 3494 35bb ..w,.4.eI....4.5
  84396. 8042cd4: 4a42 1293 0120 3124 af74 0ed7 470a 3d04 BJ.. .$1t....G.=
  84397. 8042ce4: da51 a7d0 3e0d 894b 76e4 1092 c822 7433 Q....>K..v..".3t
  84398. 8042cf4: bde8 88ec 0114 6ea4 eba4 7230 878a 0988 .......n..0r....
  84399. 8042d04: d714 a33e 151e 9b39 8845 cdc3 5c28 e0d6 ..>...9.E...(\..
  84400. 8042d14: 6b68 420f 3f84 8833 3b2f 9825 884e 0b44 hk.B.?3./;%.N.D.
  84401. 8042d24: 4dd1 f870 0f4b 4bc9 9e8a 0036 988a d14c .Mp.K..K..6...L.
  84402. 8042d34: f580 5314 7f9c f41e 335c 5b9f ecee e517 ...S....\3.[....
  84403. 8042d44: 5efa 74d3 a61e 815e 618f 4315 0ab3 58bb .^.t..^..a.C...X
  84404. 8042d54: ea71 9290 e910 08f8 f3f3 47b4 9111 2c11 q..........G...,
  84405. 8042d64: e61e d8f0 f903 b198 b9ac 4005 7700 0d50 ...........@.wP.
  84406. 8042d74: 3f9c 312c e3b9 1a09 2200 05b0 a386 2a30 .?,1....."....0*
  84407. 8042d84: ed42 a686 4cb2 3d5d 4a75 f063 bf51 c13e B....L]=uJc.Q.>.
  84408. 8042d94: 0b8d 091c 93e2 4268 a987 4e97 f6b2 2f8a ......hB...N.../
  84409. 8042da4: cc60 60ef e164 b9e0 f1f8 1180 1c20 8e1b `..`d....... ...
  84410. 8042db4: 43c2 3cf4 3aac f360 9a7f 372d ec8b b8bd .C.<.:`...-7....
  84411. 8042dc4: 7f3a 0d7b 2a00 0d61 d452 fc46 eead fed1 :.{..*a.R.F.....
  84412. 8042dd4: 15f5 848b 852c 320f 1bb9 538b d052 233c ....,..2...SR.<#
  84413. 8042de4: cd5d 35d7 2400 fe9d d778 e029 2f90 40ac ]..5.$..x.)../.@
  84414. 8042df4: 307b 415e 9643 baf6 3234 a35c c149 2a8c {0^AC...42\.I..*
  84415. 8042e04: 1830 7256 64c5 3e96 f2b9 e00c 3e77 b52a 0.Vr.d.>....w>*.
  84416. 8042e14: 8b3d fc6b 3993 1348 1cb3 42ff 75e0 58a0 =.k..9H....B.u.X
  84417. 8042e24: d474 a04d 49a9 5cdc e7a6 854a afbe 2979 t.M..I.\..J...y)
  84418. 8042e34: 7d6c 5b66 6345 08a5 9e34 0273 7d20 0a72 l}f[Ec..4.s. }r.
  84419. 8042e44: 934a ef5b 67cd e0a6 b934 55ad d219 fe06 J.[..g..4..U....
  84420. 8042e54: 8a56 f134 e6bf ec2b 9a27 8611 513a b14a V.4...+.'...:QJ.
  84421. 8042e64: 5539 d18c 553a f08a 2f4b 23ec 02c6 0989 9U..:U..K/.#....
  84422. 8042e74: 2ab8 22de b743 8d69 5545 f577 fdc4 0ca1 .*."C.i.EUw.....
  84423. 8042e84: cb4d 44a6 3c69 1636 3bf5 f9ce 192c 65ce M..Di<6..;..,..e
  84424. 8042e94: 5e2d 2b28 298d 94c7 99a6 d6d1 93a4 28d2 -^(+.).........(
  84425. 8042ea4: db05 1f81 3081 b066 2444 b1d7 e34a e7e8 .....0f.D$..J...
  84426. 8042eb4: dbab d85b b035 abc0 30f8 4ba3 4edb 946e ..[.5....0.K.Nn.
  84427. 8042ec4: 9257 1255 ba48 ca8a c917 568a c509 f23d W.U.H......V..=.
  84428. 8042ed4: 136c e340 a3a5 3921 a505 94af d300 a667 l.@...!9......g.
  84429. 8042ee4: 34e0 f5b9 31f1 ed99 28d2 3588 a34a 2e22 .4...1...(.5J.".
  84430. 8042ef4: 68f3 6893 b168 0176 5292 cd8a c689 fe84 .h.hh.v..R......
  84431. 8042f04: 4aa7 4935 9ca3 0c3a 2b79 1821 4c91 b56a .J5I..:.y+!..Lj.
  84432. 8042f14: a09a dba1 f2ce 7389 2aba 738b 75db 4e81 .......s.*.s.u.N
  84433. 8042f24: 6f2c 8a74 3125 6b3d 154e b9d2 534e e4cc ,ot.%1=kN...NS..
  84434. 8042f34: eb33 e10c 94f2 49f8 1254 ef2c 9e2b f22b 3......IT.,.+.+.
  84435. 8042f44: 86ae 2612 b8ad 95ce d77d 2b5c 0eca 66ad ...&....}.\+...f
  84436. 8042f54: 20fb a126 e0d5 a5c6 249b d38c 8118 7b6c . &......$....l{
  84437. 8042f64: 54d0 b53f e8c2 491a 7ac8 29bd 9187 83d1 .T?....I.z.)....
  84438. 8042f74: 5289 432d faed 684b d72b d792 6914 7cd4 .R-C..Kh+....i.|
  84439. 8042f84: 2b7e a66e 0b58 be44 2b54 a676 79d8 9d8d ~+n.X.D.T+v..y..
  84440. 8042f94: e3a5 ca1c 94a7 2b9d 18a8 509f be41 433c .......+...PA.<C
  84441. 8042fa4: 6e7b a571 d9c1 dfe5 3cd8 466b 35d1 2169 {nq......<kF.5i!
  84442. 8042fb4: 6d54 4c17 09c0 e925 7c50 b6b3 378c 5468 Tm.L..%.P|...7hT
  84443. 8042fc4: 4c29 59e6 0131 6f77 67ac b59b d4a5 6738 )L.Y1.wo.g....8g
  84444. 8042fd4: 1205 aa77 4903 5db2 34cb 163c e9e7 2510 ..w..I.].4<....%
  84445. 8042fe4: 5a2b 596d 78ab 5b52 35c6 3094 81e9 4c9a +ZmY.xR[.5.0...L
  84446. 8042ff4: f2ee 3b89 adf4 c7f3 eddd 0c64 4601 21a8 ...;......d..F.!
  84447. 8043004: e6e2 f09c 58b3 6637 93b7 e9c6 16b5 b91a .....X7f........
  84448. 8043014: 5a9e e589 9d4b 94d5 2f90 9985 0ed7 d469 .Z..K..../....i.
  84449. 8043024: 7e7c 6e2b 58a6 440b 54be 762b d8a6 8d79 |~+n.X.D.T+v..y.
  84450. 8043034: 6bb5 78ac 1ab4 5635 505c 6e31 2952 f2b5 .k.x..5V\P1nR)..
  84451. 8043044: ed0c c5b9 0695 9767 637f 67f3 ac68 f9ab ......g..c.gh...
  84452. 8043054: f6ec 6dca 8913 b020 486a 420b b1a4 7eb4 ...m.. .jH.B...~
  84453. 8043064: 77ac 8630 1b85 b608 55a7 272a b3d7 3cdb .w0......U*'...<
  84454. 8043074: 937b e2ba e71a aba8 47a0 421d ea92 c730 {........G.B..0.
  84455. 8043084: 56b0 a190 52c3 62af 5455 e558 7ea4 8a0a .V...R.bUTX..~..
  84456. 8043094: 192b cad2 3c69 0d9c daf2 ee32 2efa c99b +...i<....2.....
  84457. 80430a4: 37f2 cb68 0269 df16 5e74 150b 3a52 dd29 .7h.i...t^..R:).
  84458. 80430b4: 3348 1c5d 8d0c f204 8c25 0a2a f1ba 9f32 H3].....%.*...2.
  84459. 80430c4: c440 3667 6263 34ca ac8d d22f 8b8c 7329 @.g6cb.4../...)s
  84460. 80430d4: 3346 8aed 4027 51b0 04eb 14a5 26bf 109d F3..'@.Q.....&..
  84461. 80430e4: 6e16 0857 5941 f8c5 86ac 1c65 2bcf 8e7b .nW.AY....e..+{.
  84462. 80430f4: 999a 07cd bbb9 4332 0cd5 7489 4b42 3ac4 ......2C...tBK.:
  84463. 8043104: 2a46 eb37 3898 4514 abe5 b228 18d1 93dc F*7..8.E..(.....
  84464. 8043114: cd71 ab66 6a48 a39c e266 754e 48e4 d46d q.f.Hj..f.Nu.Hm.
  84465. 8043124: 0d32 c52f 3a79 c932 568a 6aa2 4f15 9d6a 2./.y:2..V.j.Oj.
  84466. 8043134: 86b8 2612 78ad f98a cddd 4350 d50f 947f ...&.x....PC....
  84467. 8043144: dd5f 0d5e 7379 17b5 e737 9aa4 b645 bb31 _.^.ys..7...E.1.
  84468. 8043154: 349d 0d29 d8d4 2b54 1cb1 6d3c f354 8c85 .4)...T+..<mT...
  84469. 8043164: 8a2a f3fb 205a 9a8d 6fcf cdc5 6b14 0061 *...Z ...o...ka.
  84470. 8043174: aa5f 3b15 ec53 c6bc 95da 8c53 a372 8a7e _..;S.....S.r.~.
  84471. 8043184: 2a0b 4dc6 a1da be56 4b5d c5c5 0695 36e7 .*.M..V.]K.....6
  84472. 8043194: 427f d557 3f9a 5d43 0e3d 7cb2 ab12 562b .BW..?C]=..|..+V
  84473. 80431a4: ac0d e2ae 2346 a58d 63f5 e3bd a2ad c028 ....F#...c....(.
  84474. 80431b4: e552 9f32 1f8c 6fc7 8bb2 c6a4 0a39 ea2b R.2....o....9.+.
  84475. 80431c4: 8753 d491 9c4e 1867 ca2c e1d2 5549 62b3 S...N.g.,...IU.b
  84476. 80431d4: 5717 a93b a2ab 4a0a b492 9aaa 8ddf a307 .W;....J........
  84477. 80431e4: 6ed8 e6cd bba3 6e91 85bf 9631 e84e 9c59 .n.....n..1.N.Y.
  84478. 80431f4: bea3 6e5c 4d2b 7a52 a9aa 36a1 b92a 5ade ..\n+MRz...6*..Z
  84479. 8043204: e5c8 18cb 1525 e675 41f5 2912 dd9f 9586 ....%.u..A.)....
  84480. 8043214: d529 e63c 50be 5e1b d4a6 4d59 abb5 08a7 ).<..P.^..YM....
  84481. 8043224: 46d9 14ed 5395 9b5c 47b4 bc5c 375d a545 .F...S\..G\.]7E.
  84482. 8043234: fb15 1b33 a13f e299 cfc6 4c50 ddf9 78d5 ..3.?.....PL...x
  84483. 8043244: 9b52 49a1 b069 8a62 8cda 92f4 6f56 4bd6 R..Ii.b.....Vo.K
  84484. 8043254: de18 c7c0 4c2a a614 47fa 4ae4 f445 f822 ....*L...G.JE.".
  84485. 8043264: 0830 a5fc 2744 809d 4a09 9728 79e0 71a3 0...D'...J(..y.q
  84486. 8043274: a920 56eb ed53 bdcc a678 0844 0d61 2b20 ..VS...x.D.a. +
  84487. 8043284: 047b 5331 d83f 30df a266 b36f a2a1 a8d0 {.1S?..0f.o.....
  84488. 8043294: 0f98 86ae c719 9a75 18db 46e1 62fe dd0b ......u....F.b..
  84489. 80432a4: b89c 2f6a ae41 3bb8 484f 4371 f137 2122 ..j/A..;OHqC7."!
  84490. 80432b4: ced5 06dd 016f 6e1f abee 4ec1 3887 6838 ....o..n...N.88h
  84491. 80432c4: 3118 7380 fca7 405c ac7f 0807 f0f0 14fe .1.s..\@........
  84492. 80432d4: f2cf 2b4b d7d7 70d7 4cfc feae 88d6 2a3c ..K+...p.L....<*
  84493. 80432e4: 3104 7020 6ee8 18b8 8596 160d 26d6 ade1 .1 p.n.......&..
  84494. 80432f4: 2603 0534 b20e 0b56 1023 a113 a094 e996 .&4...V.#.......
  84495. 8043304: 0cc5 e47b 7d23 9f65 3b69 690c 3d34 23d5 ..{.#}e.i;.i4=.#
  84496. 8043314: 7c98 54f4 73a2 ed13 8349 d047 d482 d7ed .|.T.s..I.G.....
  84497. 8043324: f01f a65f 9f61 21c8 7173 a716 6b26 ac99 .._.a..!sq..&k..
  84498. 8043334: 5d44 1f0f d655 c663 0f14 83da 5c00 5ac6 D]..U.c......\.Z
  84499. 8043344: 5a62 5cc3 0e1a 6714 35c9 dbc8 db14 4ba9 bZ.\...g.5.....K
  84500. 8043354: 3137 41b0 aea3 1f4d 69fc f2a3 da0c 4278 71.A..M..i....xB
  84501. 8043364: a356 6dad a091 3839 837e 0a00 e35d 37b8 V..m..98~...]..7
  84502. 8043374: 8f13 45c4 28e8 ed45 121e a41f 5a64 6423 ...E.(E.....dZ#d
  84503. 8043384: c43f 6361 5d8e 6439 231a 256b 9baa aba3 ?.ac.]9d.#k%....
  84504. 8043394: 2121 a36e 7cb7 d53a 450c 06a2 60ed 698a !!n..|:..E...`.i
  84505. 80433a4: 01a8 84ee 3bc6 2615 db05 eeff 99a2 6553 .....;.&......Se
  84506. 80433b4: 024f b440 3547 4871 9240 838a 2d32 76f6 O.@.G5qH@...2-.v
  84507. 80433c4: c32b bb4f 5295 0f16 d3bf ac95 1ef6 8c16 +.O..R..........
  84508. 80433d4: 0f97 8bb5 8073 d105 3c75 61ca 21a4 e204 ....s...u<.a.!..
  84509. 80433e4: e069 c63d 439b 27f3 e65a 7567 aa7e fe5e i.=..C.'Z.gu~.^.
  84510. 80433f4: 2e12 71ad 5327 bf7e 2209 31fc 9f60 e382 ...q'S~..".1`...
  84511. 8043404: 4113 0dfa 7137 2bca 5635 b9b3 6d80 ad17 .A..7q.+5V...m..
  84512. 8043414: 549e ca57 121a 4f75 2432 f1ad 0f23 4db6 .TW...uO2$..#..M
  84513. 8043424: 816d c1af 68a6 3a7a d82b 5c1f f3e3 1a1f m....hz:+..\....
  84514. 8043434: 5fcc f00c 012f 12bd 580b 03b9 da57 6259 ._../....X..W.Yb
  84515. 8043444: 05e1 a2da 4fc4 361d 97b0 604d 5b28 4182 .....O.6..M`([.A
  84516. 8043454: fd94 5470 2792 1201 daac d654 198d 83d3 ..pT.'....T.....
  84517. 8043464: c5a7 3043 5f5d 5f5c 8f67 9dc5 3a46 b5c2 ..C0]_\_g...F:..
  84518. 8043474: df4f 5301 ce17 7766 3290 6c74 0e01 7504 O..S..fw.2tl...u
  84519. 8043484: 3787 dd57 78d1 eddc 075f 3897 429d b5ae .7W..x.._..8.B..
  84520. 8043494: 08a1 3f1b 9ba9 745d 0738 c03a 573f e636 ...?..]t8.:.?W6.
  84521. 80434a4: c756 ee5b 4030 19c8 2e72 f802 8f58 c0a1 V.[.0@..r...X...
  84522. 80434b4: a64f bc18 94ea 15e2 7d6f e741 c572 f062 O.......o}A.r.b.
  84523. 80434c4: 0820 8af3 1a79 4dc7 1df3 10b2 24e0 4c90 ...y..M.....$.L
  84524. 80434d4: b0fb 89c5 dcf2 a3ed 56f8 4b9a 921f 8875 .........V.K..u.
  84525. 80434e4: f9cf 10ab ccd0 7745 4572 ae07 d3a3 8e42 ......EwrE....B.
  84526. 80434f4: f230 0a0e cf60 94af 807c 8f2b 5cbd 7327 0...`...|.+..\'s
  84527. 8043504: 48a9 d882 1b1a d74a ea41 536b f848 d04e .H....J.A.kSH.N.
  84528. 8043514: efe6 f437 487d 1c11 5b8e c12a a7e1 1203 ..7.}H...[*.....
  84529. 8043524: 8bd4 c29c 4971 2ed8 b73c e785 3836 e40d ....qI..<...68..
  84530. 8043534: 77e1 96f8 7d50 eb64 9ea7 8a54 20e9 1a92 .w..P}d...T.. ..
  84531. 8043544: fd50 382b 75cc 50cc 1f6d 8aa8 41b1 8ec9 P.+8.u.Pm....A..
  84532. 8043554: 08fb 310f bf15 c795 f462 16e1 ed7d 4f05 ...1....b...}..O
  84533. 8043564: c056 2dd5 9f74 3f1a 4529 4747 99ef 2691 V..-t..?)EGG...&
  84534. 8043574: 4003 056c a991 39fc 6344 6a4d cde0 8e21 .@l....9DcMj..!.
  84535. 8043584: 3416 f82d b317 fa74 ddac 6638 8815 a29c .4-...t...8f....
  84536. 8043594: fcf5 dea7 5a47 fbfd 2d09 277d 5e3c 10e5 ....GZ...-}'<^..
  84537. 80435a4: 0a9e 8fb1 8589 a463 6f17 63ea 0648 7e03 ......c..o.cH..~
  84538. 80435b4: 027e 0efc c8f2 7fc4 cf59 9b76 1ffb e9ee ~.......Y.v.....
  84539. 80435c4: a015 8972 1f97 0bc8 fe4a 8fcc 2ad8 a378 ..r.....J....*x.
  84540. 80435d4: 3c03 00ac 53da 0587 f520 5f37 ad10 257c .<...S.. .7_..|%
  84541. 80435e4: 2838 a8e4 62c5 cee2 8f6d f0f1 8c33 9c01 8(...b..m...3...
  84542. 80435f4: dbf8 79f1 d4a2 d630 da3d ae2a de22 45a8 ...y..0.=.*."..E
  84543. 8043604: 14e5 9098 e156 a842 def8 9637 8026 47bc ....V.B...7.&..G
  84544. 8043614: 7869 0527 2c8f fef2 63bd 3741 e171 0864 ix'..,...cA7q.d.
  84545. 8043624: c6ed 4e00 3cd1 f430 a826 48a7 3833 ac38 ...N.<0.&..H388.
  84546. 8043634: 9c4e 6bdb abfc 9555 5735 3972 d11a 9641 N..k..U.5Wr9..A.
  84547. 8043644: 7f98 cd9f 1d92 ec9a 6ba8 c98d 7548 a1a2 .........k..Hu..
  84548. 8043654: 3292 1aed 9daa 77cb e06e 7a86 f25a 438c .2.....wn..zZ..C
  84549. 8043664: e3a8 981b e5e0 2920 2fde 1e1b bd42 7be6 ...... )./..B..{
  84550. 8043674: 3d66 8efe 4857 0d82 bac3 b60c 6404 49ec f=..WH.......d.I
  84551. 8043684: 42fe 8955 ac03 8ab2 6dd2 1824 07cc 7355 .BU......m$...Us
  84552. 8043694: a581 3b71 77b2 341c 5723 5f03 762e 40b8 ..q;.w.4#W._.v.@
  84553. 80436a4: c231 df57 02ba d470 9fef 3d1c 21d7 be2b 1.W...p....=.!+.
  84554. 80436b4: dae0 970b 8b47 b630 7521 2195 4f63 4df3 ....G.0.!u.!cO.M
  84555. 80436c4: 2aa0 b6e0 4108 d4c1 8b22 b036 c713 e628 .*...A..".6...(.
  84556. 80436d4: 5d2a b4ce 0a15 c1c3 77cf 1dbe ecae 7f89 *].......w......
  84557. 80436e4: a32f 9284 fd45 a387 7746 1950 fc20 496a /...E...FwP. .jI
  84558. 80436f4: 34a6 f87a f510 27c3 d119 26e8 7794 01da .4z....'...&.w..
  84559. 8043704: 3c4f 5568 70c2 a9bf 3c45 aad8 0b93 44be O<hU.p..E<.....D
  84560. 8043714: 94e8 b106 b254 80a9 a33a 2dfe da1e 9c65 ....T...:..-..e.
  84561. 8043724: e327 0877 69c0 737e 44f4 6c43 7540 e5e8 '.w..i~s.DCl@u..
  84562. 8043734: 1924 c310 e6bf 3428 5cb4 753b a61e e46d $.....(4.\;u..m.
  84563. 8043744: 0fde d725 55ed e3c0 cbcf 2f8b 36c0 1970 ..%..U...../.6p.
  84564. 8043754: 5c08 0303 5357 38bc 22f9 d291 2631 496d .\..WS.8."..1&mI
  84565. 8043764: eea3 aba7 5929 a38b 55f1 faf7 ff0e bfdf ....)Y...U......
  84566. 8043774: 5b45 ba31 343a 332a 54bc 1b53 0d94 073e E[1.:4*3.TS...>.
  84567. 8043784: 8f04 2945 ca82 8188 c34f 8e30 e2c2 394e ..E)....O.0...N9
  84568. 8043794: 9b9a d01f 0f86 5297 21ee d383 bda6 92d7 .......R.!......
  84569. 80437a4: 863e 8eb3 05c9 fc1a 9f8c 2d3f 1df7 36c6 >.........?-...6
  84570. 80437b4: 51b4 ab5b 12a2 7fc6 63e2 21c3 fe85 b7bf .Q[......c.!....
  84571. 80437c4: edff c370 6da3 a0f8 7822 e6b1 a2c5 825a ..p..m.."x....Z.
  84572. 80437d4: 50ab cde7 3bbb ce58 c5c8 704b 37a2 84a8 .P...;X...Kp.7..
  84573. 80437e4: 5287 09d9 ae93 1518 4f37 c1e0 0cd5 9d0d .R......7O......
  84574. 80437f4: ead5 1f40 0bc5 7798 b1b9 c595 3336 51de ..@....w....63.Q
  84575. 8043804: 10e5 6330 882d 811f e58d c0dd 1d30 80de ..0c-.......0...
  84576. 8043814: 71cc 4c9e db1f 4db2 bbd4 1bc5 9a62 6268 .q.L...M....b.hb
  84577. 8043824: 4c3a 45b9 8683 87eb 8ec0 4aa8 7df1 00ca :L.E.......J.}..
  84578. 8043834: 83d8 3fa8 115a 3e80 dc49 af11 8f9c b1c6 ...?Z..>I.......
  84579. 8043844: e5cc 32f6 c188 21e5 43d4 dd78 bed0 155c ...2...!.Cx...\.
  84580. 8043854: 783d 37e3 7e5b ba0a 86eb e145 cbcd a2fd =x.7[~....E.....
  84581. 8043864: 04b5 d636 005a 0a7b 200b f838 ab3f c625 ..6.Z.{.. 8.?.%.
  84582. 8043874: d778 f784 cada cdba 44af 199c aaa8 6d89 x........D.....m
  84583. 8043884: 330e a183 d45e 4709 2a0d 3bb4 92dc 5830 .3..^..G.*.;..0X
  84584. 8043894: f204 bd87 831d 3ba6 d85f 72e8 535d 2dc2 .......;_..r]S.-
  84585. 80438a4: fa22 d653 5690 6be3 9416 35e2 69a7 1281 ".S..V.k...5.i..
  84586. 80438b4: 2334 9751 3df3 6eb6 6d45 03f0 fd02 9dc3 4#Q..=.nEm......
  84587. 80438c4: c822 d5de e410 0e0f 813a 03e0 7203 8d30 ".......:....r0.
  84588. 80438d4: 0be0 9e6c 0222 1489 2f97 450f e68d 74c1 ..l."..../.E...t
  84589. 80438e4: e0d0 5284 4832 1e6b 64a8 0267 76a2 206d ...R2Hk..dg..vm
  84590. 80438f4: cf75 1133 34aa 3bdd a4fc dbb8 f4a4 e2e3 u.3..4.;........
  84591. 8043904: 8292 aec1 2797 c782 5385 ab32 48e8 6d7b .....'...S2..H{m
  84592. 8043914: 1445 54c1 e619 f608 3451 b7e6 5034 a5e7 E..T....Q4..4P..
  84593. 8043924: 2b44 90a6 9d82 f878 61d4 35dd 99e5 8d01 D+....x..a.5....
  84594. 8043934: 32fe ae79 64ad 974d 2beb baeb 1cde 3d70 .2y..dM..+....p=
  84595. 8043944: 4a06 ee86 2b8f 56e7 50fa d5fe a2ec 1aad .J...+.V.P......
  84596. 8043954: 0cf4 998a d7a1 6174 7092 0888 00f8 e76e ......ta.p....n.
  84597. 8043964: fbe0 e075 68ad 4338 f7cb c1e9 6355 dc15 ..u..h8C....Uc..
  84598. 8043974: f6a2 364a c254 616a 82af ff75 c15c 1d73 ..J6T.ja..u.\.s.
  84599. 8043984: 4c60 af3e 39f7 64ba 364f 50ca dac0 d695 `L>..9.dO6.P....
  84600. 8043994: b4aa 8e44 7e0d ab68 5787 1d5e 6154 11b1 ..D..~h..W^.Ta..
  84601. 80439a4: afa7 c3a3 a25b ec70 1d97 ecbc 1182 1523 ....[.p.......#.
  84602. 80439b4: ead7 c981 adeb 993c acf8 0265 9e76 405e ......<...e.v.^@
  84603. 80439c4: 1501 0687 8689 9d7e 634c 13d7 4ae8 394d ......~.Lc...JM9
  84604. 80439d4: 687c e74f 7a51 4f74 efd6 b16d d624 6a7e |hO.QztO..m.$.~j
  84605. 80439e4: 8d74 0018 ee47 1235 ef7e 4524 10e7 8f6e t...G.5.~.$E..n.
  84606. 80439f4: dc3c 789e 6d77 d62d 780b 13a6 7a5e 7fdc <..xwm-..x..^z..
  84607. 8043a04: 96a9 21fb 9cdc bfe7 c146 38d7 9af8 a21c ...!....F..8....
  84608. 8043a14: 9550 7861 f9e4 704f 5f45 c07a e13d 9661 P.ax..OpE_z.=.a.
  84609. 8043a24: 6797 e4b8 3bf2 0a1c 32b8 7853 b95b 198a .g...;...2Sx[...
  84610. 8043a34: 4c77 4a17 06a6 d709 327a 6d46 d051 1d6f wL.J....z2FmQ.o.
  84611. 8043a44: ff23 bb42 518c 677c 7461 a121 332c 340c #.B..Q|gat!.,3.4
  84612. 8043a54: f1ec 8f00 5f22 651c 5004 194c ee7c e53b ...."_.e.PL.|.;.
  84613. 8043a64: c242 8865 4fb9 e74a 272d 36eb 2f93 529b B.e..OJ.-'.6./.R
  84614. 8043a74: 5439 10be 8b67 2c35 6168 8aab 2904 764d 9T..g.5,ha...)Mv
  84615. 8043a84: 2682 4318 7781 222a a587 0448 bdef ff59 .&.C.w*"..H...Y.
  84616. 8043a94: bd0c a4ad bcb9 35be c5d9 fe15 d805 883c .......5......<.
  84617. 8043aa4: 088b 13df 4830 64fa f2b9 2140 69e3 da0f ....0H.d..@!.i..
  84618. 8043ab4: dc54 6f70 8bdc 3a83 ff28 887a 017f 9a20 T.po...:(.z... .
  84619. 8043ac4: 3705 6b12 68ba 3518 1314 9ecb add4 0307 .7.k.h.5........
  84620. 8043ad4: 7fbc 3dc0 ceb5 4c0f b6e8 5343 f3f9 6e9b ...=...L..CS...n
  84621. 8043ae4: 4ea0 3fa7 1b07 df78 244a 7329 2590 8c20 .N.?..x.J$)s.% .
  84622. 8043af4: e2aa 4f4c 59ff 2ef2 734b 09ab 6edc aba6 ..LO.Y..Ks...n..
  84623. 8043b04: 8a46 8021 c2f5 82b2 602d 19b8 bb7a 7612 F.!.....-`..z..v
  84624. 8043b14: f153 9153 95a3 f336 0df0 0786 0af8 f8d6 S.S...6.........
  84625. 8043b24: 4b73 6efb 0143 26eb 49c1 38c3 1a0e 8f6f sK.nC..&.I.8..o.
  84626. 8043b34: d7d3 f50a b8da 3083 484e 701b dae6 8225 .......0NH.p..%.
  84627. 8043b44: 9fed 26a3 008c b386 d927 7f82 7c02 ca70 ...&....'....|p.
  84628. 8043b54: f8f2 5344 15b4 29b7 f5dd 43a6 2ee0 4a05 ..DS...)...C...J
  84629. 8043b64: 0083 48a3 c58f f01b 4c75 19b0 ec78 6bf6 ...H....uL..x..k
  84630. 8043b74: 6eef a300 6fa6 de3a 86f1 3c00 50d7 553d .n...o:....<.P=U
  84631. 8043b84: ca4d 5bc3 f2b7 19ee 04aa c59a 1e75 0fa5 M..[........u...
  84632. 8043b94: a9d3 3997 19be 2135 3444 c7b5 4292 4689 ...9..5!D4...B.F
  84633. 8043ba4: e81c f8db 6849 866f a454 f17b ef15 f3d9 ....Iho.T.{.....
  84634. 8043bb4: a137 80aa fde0 8ab6 6e39 f8d4 ac3a 4504 7.......9n..:..E
  84635. 8043bc4: bb03 6787 7cc8 64b2 fb57 8d89 b0e8 0dbe ...g.|.dW.......
  84636. 8043bd4: 887c 1355 8ec8 a7b9 41e6 06ae 2276 e324 |.U......A..v"$.
  84637. 8043be4: 16a7 dc84 16fe f802 4a3d ddcf fd4d 1a3d ........=J..M.=.
  84638. 8043bf4: c8ef ef3c 4ce9 97ef 09da 7fa1 e777 086e ..<..L......w.n.
  84639. 8043c04: bf7e fb72 7749 30b7 c12b 89b5 69ff 78f2 ~.r.Iw.0+....i.x
  84640. 8043c14: 40fe 9bff 4ff1 26b1 130d 5963 cbe0 d1ad .@...O.&..cY....
  84641. 8043c24: d169 2f9b f9cb 2ee7 fb6e e875 ebc6 8913 i../....n.u.....
  84642. 8043c34: 7d32 5b44 e296 1b71 fedc 3adc c9bd 9834 2}D[..q....:..4.
  84643. 8043c44: 53d3 e4ae bafe 2a80 5d70 b973 2321 edda .S.....*p]s.!#..
  84644. 8043c54: b8c6 a985 cb4a 7070 2b8d 9535 d1c1 9a0d ....J.pp.+5.....
  84645. 8043c64: ca91 c4ad b184 18fc 6891 19b6 111d 43bd .........h.....C
  84646. 8043c74: e810 99b1 cb4a 5408 1930 f2d6 e762 ba27 ....J..T0...b.'.
  84647. 8043c84: 1d0c 7d3e 7a10 1055 ff28 03b4 73e5 3a69 ..>}.zU.(....si:
  84648. 8043c94: 7cd7 fcb3 6a14 99f4 5a5a 1b00 c960 7cd2 .|...j..ZZ..`..|
  84649. 8043ca4: a2ac 54b9 6c3d 5f9f 7220 8d22 663e 72f3 ...T=l._ r".>f.r
  84650. 8043cb4: 8438 780d a5e6 4f74 9d40 1ee5 f06f 274f 8..x..tO@...o.O'
  84651. 8043cc4: b577 bc61 583d f0cc f34f 6d71 4fc7 08f3 w.a.=X..O.qm.O..
  84652. 8043cd4: d080 6d0c 3a31 ee10 0404 0247 4ab0 60b6 ...m1:....G..J.`
  84653. 8043ce4: c350 6803 00cc 2df2 943b 6e75 9350 9d97 P..h...-;.unP...
  84654. 8043cf4: ac32 dd3c 81c5 22ee 6633 bac6 4edf 211e 2.<...."3f...N.!
  84655. 8043d04: 6324 78f6 5bb1 5f54 b6e1 1cc5 eef6 05f9 $c.x.[T_........
  84656. 8043d14: 6d02 7adc 621f 5548 8929 06de 29b3 112e .m.z.bHU)....)..
  84657. 8043d24: aeef a0fe 51e4 6f55 c8aa 0708 3b58 f45a .....QUo....X;Z.
  84658. 8043d34: 4871 b21b 7388 f21a 4f80 1c82 b1f0 46ca qH...s...O.....F
  84659. 8043d44: e76f 0707 722c 94a6 9402 99e8 deb1 8d10 o...,r..........
  84660. 8043d54: e240 91a3 245b b2b0 2ce5 21d1 5350 03f9 @...[$...,.!PS..
  84661. 8043d64: b6dd 54b5 6cbb abe4 48af 7115 b22f 0ea9 ...T.l...H.q/...
  84662. 8043d74: 8bd3 b132 4407 e728 ecd9 cc5e cf08 f5db ..2..D(...^.....
  84663. 8043d84: ccde e225 fd32 bbd4 d4b0 8ba2 f1cd 7106 ..%.2..........q
  84664. 8043d94: 1469 9671 006e 9012 4c50 6d50 c689 025b i.q.n...PLPm..[.
  84665. 8043da4: 6a57 d24f b01b d6c5 01db b109 c925 9865 WjO.........%.e.
  84666. 8043db4: 009a ade0 a25a ba65 2675 8e9c c7aa 3086 ....Z.e.u&.....0
  84667. 8043dc4: 9445 7243 7e9a 4870 9855 7704 2e19 ebd1 E.Cr.~pHU..w....
  84668. 8043dd4: a066 8c83 7b08 aa3f 2c01 2a82 6442 2dc8 f....{?..,.*Bd.-
  84669. 8043de4: 4003 346b 48be 24e0 b418 a481 838c 2df5 .@k4.H.$.......-
  84670. 8043df4: 88b2 8d21 0c8c fb62 46a8 12e8 eb45 9ac8 ..!...b..F..E...
  84671. 8043e04: 46e4 0d54 821c 4328 f4c1 d115 5832 f732 .FT...(C....2X2.
  84672. 8043e14: f4b4 b16f dbe4 0379 96a7 1053 fc0f 4316 ..o...y...S....C
  84673. 8043e24: a990 fa26 7c18 4658 81c5 a00e 6417 6df9 ..&..|XF.....d.m
  84674. 8043e34: 0d11 91fe 9878 ceb7 d2d8 d088 4797 ca7a ....x........Gz.
  84675. 8043e44: 9baf 8c50 b16d 3bb3 22ef 304c 08dd c40c ..P.m..;."L0....
  84676. 8043e54: 6ec7 9dba a85e 8153 c079 224f 96da 7698 .n..^.S.y.O"...v
  84677. 8043e64: 501c 87bb 01c6 bd61 b072 df87 cc41 253b .P....a.r...A.;%
  84678. 8043e74: 05c4 04f8 cb46 e3f5 4b58 1469 a7c2 9fe2 ....F...XKi.....
  84679. 8043e84: 49bc 1781 1cc5 4a0b d990 dd38 b400 fbe6 .I.....J..8.....
  84680. 8043e94: a865 336b faf5 48fd 2ed3 4d4c c1b4 8864 e.k3...H..LM..d.
  84681. 8043ea4: 49a0 f275 9cb8 0c88 adce 235a cf98 ac69 .Iu.......Z#..i.
  84682. 8043eb4: 2422 41d4 4ef1 0f58 4f92 c1ab b264 1ea2 "$.A.NX..O..d...
  84683. 8043ec4: 4e7c 2a0d d593 895c 4ae1 a938 a429 8917 |N.*..\..J8.)...
  84684. 8043ed4: 78db c310 588e 035b 6fc2 456d f614 32d6 .x...X[..omE...2
  84685. 8043ee4: 448c 916b 40a6 f9a1 ff10 5e74 4112 ebd2 .Dk..@....t^.A..
  84686. 8043ef4: 9e0b 3fb6 37fd 7fb3 43e8 491a 9fe6 c5b6 ...?.7...C.I....
  84687. 8043f04: 702b 9652 f13f d0bb 0cde e671 fa33 a258 +pR.?.....q.3.X.
  84688. 8043f14: 5900 538c 8eb6 9beb 20c1 6cdc d2b7 f35c .Y.S..... .l..\.
  84689. 8043f24: a74b 258f 8604 eb34 7a23 8acc 9b60 ab16 K..%..4.#z..`...
  84690. 8043f34: fecd a0f5 1836 622e ff89 2621 4085 b677 ....6..b..!&.@w.
  84691. 8043f44: f7a0 d26f 0d74 0e6a 00c2 88b1 209c 2fd1 ..o.t.j...... ./
  84692. 8043f54: a526 39d1 6504 76ec 970b 4231 dea7 536e &..9.e.v..1B..nS
  84693. 8043f64: a6c0 8501 ea06 788b c0a8 c979 fa4c 035b .......x..y.L.[.
  84694. 8043f74: cc85 f19d 8863 bc1b d03c 7093 ff7d 7432 ....c...<..p}.2t
  84695. 8043f84: 128f 11f0 c6b8 7a1c 7d98 28be f997 b87b .......z.}.(..{.
  84696. 8043f94: df4f 53db 8974 3f27 5eab f06b ebf4 c650 O..St.'?.^k...P.
  84697. 8043fa4: 35fc 133e 28b3 1242 9cfb 7e86 f6e0 d855 .5>..(B....~..U.
  84698. 8043fb4: 0ec3 0587 5576 1719 2c19 ae44 b69e dde0 ....vU...,D.....
  84699. 8043fc4: 5d57 d1a2 1bcb 91e7 3a60 c02b 564f 3e80 W]......`:+.OV.>
  84700. 8043fd4: bb66 cff5 fdbf b7e3 05ff fcff b7eb fdff f...............
  84701. 8043fe4: dfed bcff d011 d0dc 7471 6f59 5fe4 81a8 ........qtYo._..
  84702. 8043ff4: a67f ff7f dbf1 7d3f e3fb 4d79 138d fd4d ......?}..yM..M.
  84703. 8044004: 542b 3fff fedf bce9 2606 0689 edfe 3fdb +T.?.....&.....?
  84704. 8044014: fb7f 6fb7 847f ff7f b7fb 0bff 9d68 d4d9 ...o........h...
  84705. 8044024: f2f0 2e2c 9d1a 6c57 5e7c c9b1 aea5 78df ..,...Wl|^.....x
  84706. 8044034: 0031 399b 8d67 50c1 3ef1 6613 b119 4ab3 1..9g..P.>.f...J
  84707. 8044044: 41bb ab39 1fb4 a701 9c45 017f b7ad 3229 .A9.....E.....)2
  84708. 8044054: 6aa7 7143 a3c1 8bbc c0f2 6d2b bf81 3aad .jCq......+m...:
  84709. 8044064: 419c 4af4 1133 811a 3ada a241 6c05 0b63 .A.J3....:A..lc.
  84710. 8044074: 3af0 eeaf 39df 1775 5b99 b000 1a31 9a8c .:...9u..[..1...
  84711. 8044084: b5d3 7a8b 8ccd b3c4 041b 087d d441 e8d1 ...z......}.A...
  84712. 8044094: 0212 7822 85b7 d41d 9d4d f053 6f1e aa45 .."x....M.S..oE.
  84713. 80440a4: 4758 61f1 2d6a 0d91 1a15 3074 b979 a818 XG.aj-....t0y...
  84714. 80440b4: 7f66 110c 31f9 955b d7cb 2ee9 ef5b bde0 f....1[.....[...
  84715. 80440c4: 6db1 5189 e563 f8b2 bd3d 9550 4d20 eb1c .m.Qc...=.P. M..
  84716. 80440d4: 4a6c efb3 b05c 55f3 f0dd 9ae3 2064 06cb lJ..\..U....d ..
  84717. 80440e4: 048d 0480 6f45 22e0 c070 925b 3aba 7079 ....Eo."p.[..:yp
  84718. 80440f4: bc69 b428 1405 28cd 821c 5dde 57ec eb4b i.(....(...].WK.
  84719. 8044104: 97c7 f4c8 6b60 80bc d1d0 1f60 3d5d ead3 ....`k....`.]=..
  84720. 8044114: caa4 9b36 db22 eb66 3179 fae5 2191 ac7f ..6.".f.y1...!..
  84721. 8044124: 1836 e7d2 a6ed 2ac0 b9c0 ab96 1c49 d916 6......*....I...
  84722. 8044134: 1023 b00b b62e 470c 5d3d 1f25 c248 057c #......G=]%.H.|.
  84723. 8044144: fc11 63b4 041f ae3f 5761 5b23 0672 1ed1 ...c..?.aW#[r...
  84724. 8044154: e29e 155a 26dc 136f 76b8 d4d0 6f20 f19d ..Z..&o..v.. o..
  84725. 8044164: 253d 44ce 6dc5 65d9 428d eb02 dd2b d497 =%.D.m.e.B..+...
  84726. 8044174: e7d8 e388 98d4 6f60 3991 48c2 0828 6c64 ......`o.9.H(.dl
  84727. 8044184: 8d0f 2bd0 dbab c4e1 a1d4 8dbc 0f60 3b43 ...+........`.C;
  84728. 8044194: 8716 e07b 7560 a402 4faf 0729 b491 3a0d ..{.`u...O)....:
  84729. 80441a4: 1ac8 6274 cd4b 582f caac ca6e bc18 9662 ..tbK./X..n...b.
  84730. 80441b4: e9c1 8350 5607 b57b f2e8 a005 a491 c11f ..P..V{.........
  84731. 80441c4: 9848 bba3 df02 8373 cb83 f960 52d6 45e8 H.....s...`..R.E
  84732. 80441d4: b56e 746c 86e5 cb98 9ae8 c84e 8b34 d45b n.lt......N.4.[.
  84733. 80441e4: 1871 6ed1 cab1 ef5d 7795 dc36 8bf7 201c q..n..]..w6....
  84734. 80441f4: 7270 7ec4 b8cb 8635 9e86 dd71 5fed fc97 pr.~..5...q.._..
  84735. 8044204: 1238 46af ca39 9501 6bb3 3fa3 43c6 705f 8..F9....k.?.C_p
  84736. 8044214: 78ef faa0 f4a6 5a92 877f d9ef b3c1 4a89 .x.....Z.......J
  84737. 8044224: 2f76 c7cb 9d3e e4a9 79a5 3e57 0b22 87e3 v/..>....yW>"...
  84738. 8044234: ee1f 5795 44c8 3a91 5f87 6aab 8535 4478 ...W.D.:._.j5.xD
  84739. 8044244: af50 e6a1 5316 e090 4663 0e99 e1df 305b P....S..cF....[0
  84740. 8044254: e0ef 0aff ef31 c08f 2ee0 ba26 a4b6 c313 ....1.....&.....
  84741. 8044264: 6ae8 65ff 4bf4 f8f5 be8b 496c 26e7 5c20 .j.e.K....lI.& \
  84742. 8044274: d218 3687 727d 4efb cd0d b87a f3bd 4f85 ...6}r.N..z....O
  84743. 8044284: 4764 a101 c034 06c0 6f89 4f10 25ff 957b dG..4....o.O.%{.
  84744. 8044294: 6352 56ec d59f e034 9810 7e9a dd7d 421f Rc.V..4....~}..B
  84745. 80442a4: b368 5769 c673 fea3 fae8 b02d d07a c0e0 h.iWs.....-.z...
  84746. 80442b4: 0799 3f4d e0ea 1100 dcb9 2104 289d b8a2 ..M?.......!.(..
  84747. 80442c4: 854f 4988 97aa 8b2e 3e97 74d8 e933 9003 O..I.....>.t3...
  84748. 80442d4: 3ba6 98cd f5dc 9a47 0341 19a0 71a3 4dff .;....G.A....q.M
  84749. 80442e4: e043 9ad1 b458 83f4 d2d0 3a8f e0c8 c33e C...X......:..>.
  84750. 80442f4: fe55 d903 f4dc e5e0 5e02 ec89 aaef a52d U........^....-.
  84751. 8044304: b86b 9353 c6db be1f 7317 b680 4856 c093 k.S......s..VH..
  84752. 8044314: d133 03b0 0185 60b7 28c8 b3ab 331e 189e 3......`.(...3..
  84753. 8044324: 6b33 af8b 83ae 4e2f 96b3 77bd 0156 1487 3k..../N...wV...
  84754. 8044334: f689 c3d0 c834 f633 624a e689 af8d 37fa ....4.3.Jb.....7
  84755. 8044344: a9f3 3fa8 6298 c221 a00f aafc 8ea7 21fa ...?.b!........!
  84756. 8044354: 0fc8 d6ba f489 0e96 0d3d 38d8 733e 57e0 ........=..8>s.W
  84757. 8044364: f736 26a1 5527 1ff4 d92c ab43 a31b 0000 6..&'U..,.C.....
  84758. 08044374 <file__history_html>:
  84759. 8044374: 1914 0804 0ea4 0804 0eb4 0804 04f1 0000 ................
  84760. 8044384: 0001 0000 ....
  84761. 08044388 <file__role_js>:
  84762. 8044388: b80c 0803 adef 0803 adfb 0803 0a0f 0000 ................
  84763. 8044398: 0001 0000 5448 5054 312f 302e 3220 3030 ....HTTP/1.0 200
  84764. 80443a8: 4f20 0d4b 430a 6e6f 6574 746e 542d 7079 OK..Content-Typ
  84765. 80443b8: 3a65 6574 7478 682f 6d74 0d6c 0d0a 000a e:text/html.....
  84766. 80443c8: 227b 4341 3a22 0022 2c22 4422 2243 223a {"AC":".","DC":"
  84767. 80443d8: 2200 222c 6e69 665f 6572 2271 223a 2200 .","in_freq":"."
  84768. 80443e8: 222c 756f 5f74 7266 7165 3a22 0022 2c22 ,"out_freq":".",
  84769. 80443f8: 7022 7277 3a22 0022 2c22 6222 7461 635f "pwr":".","bat_c
  84770. 8044408: 7061 3a22 0022 2c22 6922 6e6e 7265 745f ap":".","inner_t
  84771. 8044418: 6d65 2270 223a 2200 222c 6162 5f74 6974 emp":".","bat_ti
  84772. 8044428: 656d 6c5f 6665 2274 223a 2200 222c 6964 me_left":".","di
  84773. 8044438: 2231 223a 2200 222c 6f72 2231 223a 2200 1":".","ro1":"."
  84774. 8044448: 222c 6f72 2232 223a 2200 222c 5f6d 6c61 ,"ro2":".","m_al
  84775. 8044458: 7261 226d 223a 2200 222c 5f75 6c61 7261 arm":".","u_alar
  84776. 8044468: 226d 223a 2200 222c 656e 7374 7465 6974 m":".","netsetti
  84777. 8044478: 676e 5f73 6863 6e61 6567 2264 223a 2200 ngs_changed":"."
  84778. 8044488: 007d 227b 6572 6461 635f 6d6f 756d 696e }.{"read_communi
  84779. 8044498: 7974 3a22 0022 2c22 7722 6972 6574 635f ty":".","write_c
  84780. 80444a8: 6d6f 756d 696e 7974 3a22 0022 2c22 6d22 ommunity":".","m
  84781. 80444b8: 6e61 6761 7265 5049 3a22 0022 2c22 6d22 anagerIP":".","m
  84782. 80444c8: 6e61 6761 7265 5049 2232 223a 2200 222c anagerIP2":".","
  84783. 80444d8: 616d 616e 6567 4972 3350 3a22 0022 2c22 managerIP3":".",
  84784. 80444e8: 6d22 6e61 6761 7265 5049 2234 223a 2200 "managerIP4":"."
  84785. 80444f8: 222c 616d 616e 6567 4972 3550 3a22 0022 ,"managerIP5":".
  84786. 8044508: 2c22 6922 6170 6464 2272 223a 2200 222c ","ipaddr":".","
  84787. 8044518: 7767 3a22 0022 2c22 6d22 7361 226b 223a gw":".","mask":"
  84788. 8044528: 2200 222c 6864 7063 3a22 2c00 7322 6177 .","dhcp":.,"swa
  84789. 8044538: 7475 2268 003a 222c 7372 735f 7265 6576 uth":.,"rs_serve
  84790. 8044548: 2272 223a 2200 222c 7372 705f 726f 2274 r":".","rs_port"
  84791. 8044558: 223a 2200 222c 7372 705f 6477 3a22 0022 :".","rs_pwd":".
  84792. 8044568: 2c22 7222 5f73 656b 2279 223a 2200 222c ","rs_key":".","
  84793. 8044578: 7372 655f 616e 6c62 6465 3a22 2c00 6422 rs_enabled":.,"d
  84794. 8044588: 7461 2265 223a 2200 222c 6974 656d 3a22 ate":".","time":
  84795. 8044598: 0022 2c22 6e22 7074 3a22 0022 2c22 6e22 ".","ntp":".","n
  84796. 80445a8: 7074 6573 7672 7069 3a22 0022 2c22 7522 tpservip":".","u
  84797. 80445b8: 6374 3a22 0022 2c22 7522 6d74 3a22 0022 tc":".","utm":".
  84798. 80445c8: 2c22 6c22 7361 7374 6e79 7463 6d69 2265 ","lastsynctime"
  84799. 80445d8: 223a 7b00 7522 7470 6d69 2265 223a 2200 :".{"uptime":"."
  84800. 80445e8: 222c 6f6d 6564 226c 223a 2200 222c 7270 ,"model":".","pr
  84801. 80445f8: 646f 7461 2265 223a 2200 222c 7766 6576 odate":".","fwve
  84802. 8044608: 7372 6f69 226e 223a 2200 222c 616d 6163 rsion":".","maca
  84803. 8044618: 6464 2272 223a 2200 222c 6573 6e72 226f ddr":".","serno"
  84804. 8044628: 223a 2200 222c 776f 656e 2272 223a 2200 :".","owner":"."
  84805. 8044638: 222c 7973 4c73 636f 7461 6f69 226e 223a ,"sysLocation":"
  84806. 8044648: 2200 222c 6f63 6d6d 6e65 2274 223a 2200 .","comment":"."
  84807. 8044658: 222c 7075 5f73 6f6d 6564 226c 223a 2200 ,"ups_model":"."
  84808. 8044668: 222c 7075 5f73 7766 6576 7372 6f69 226e ,"ups_fwversion"
  84809. 8044678: 223a 4800 5454 2f50 2e31 2031 3032 2030 :".HTTP/1.1 200
  84810. 8044688: 4b4f 0a0d 6f43 746e 6e65 2d74 7954 6570 OK..Content-Type
  84811. 8044698: 743a 7865 2f74 7468 6c6d 0a0d 0a0d 7b00 :text/html.....{
  84812. 80446a8: 7022 6761 2265 203a 005b 6925 5d00 222c "page": [.%i.],"
  84813. 80446b8: 6170 6567 2273 223a 5200 6265 6f6f 5474 pages":".RebootT
  84814. 80446c8: 7361 006b 6374 6970 5f70 6874 6572 6461 ask.tcpip_thread
  84815. 80446d8: 0000 ..
  84816. 080446da <memp_num>:
  84817. 80446da: 0004 0006 000c 0005 0019 0010 0006 0008 ................
  84818. 80446ea: 0014 000a 001e 0032 0005 0009 0032 0019 ......2.....2...
  84819. 080446fa <memp_sizes>:
  84820. 80446fa: 001c 0020 0094 001c 0010 0010 002c 0014 .. .........,...
  84821. 804470a: 0014 0010 0020 0010 0024 0080 0010 0614 .... ...$.......
  84822. 804471a: 0000 ..
  84823. 0804471c <tcp_pcb_lists>:
  84824. 804471c: ff28 2000 ff30 2000 ff20 2000 ff34 2000 (.. 0.. .. 4..
  84825. 0804472c <tcp_backoff>:
  84826. 804472c: 0201 0403 0605 0707 0707 0707 0307 .............
  84827. 08044739 <tcp_persist_backoff>:
  84828. 8044739: 0603 180c 6030 ff78 ....0`x
  84829. 08044740 <ip_addr_broadcast>:
  84830. 8044740: ffff ffff ....
  84831. 08044744 <ip_addr_any>:
  84832. 8044744: 0000 0000 ....
  84833. 08044748 <syslocation_len_default>:
  84834. 8044748: 0000 0000 ....
  84835. 0804474c <snmp_scalar>:
  84836. 804474c: 3fcd 0803 3a81 0803 4011 0803 3b95 0803 .?...:...@...;..
  84837. 804475c: 0001 0000 ....
  84838. 08044760 <udpentry_nodes>:
  84839. 8044760: 0784 2000 0784 2000 ... ...
  84840. 08044768 <attable>:
  84841. 8044768: 361b 0803 3621 0803 3623 0803 3627 0803 .6..!6..#6..'6..
  84842. 8044778: 0002 0001 4898 0804 49c0 0804 .....H...I..
  84843. 08044784 <mib2_nodes>:
  84844. 8044784: 4f90 0804 4b58 0804 074c 2000 5034 0804 .O..XK..L.. 4P..
  84845. 8044794: 4958 0804 4b28 0804 4d84 0804 48f4 0804 XI..(K...M...H..
  84846. 080447a4 <iprteentry_nodes>:
  84847. 80447a4: 07b4 2000 07b4 2000 07b4 2000 07b4 2000 ... ... ... ...
  84848. 80447b4: 07b4 2000 07b4 2000 07b4 2000 07b4 2000 ... ... ... ...
  84849. 80447c4: 07b4 2000 07b4 2000 07b4 2000 07b4 2000 ... ... ... ...
  84850. 80447d4: 07b4 2000 ...
  84851. 080447d8 <iprouteinfo>:
  84852. 80447d8: 0002 0000 0000 0000 0000 0000 0000 0000 ................
  84853. 80447e8: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  84854. 80447f8: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  84855. 8044808: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  84856. 8044818: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  84857. 8044828: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  84858. 8044838: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  84859. 8044848: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  84860. 8044858: 0000 0000 ....
  84861. 0804485c <sysname_default>:
  84862. 804485c: 5146 4e44 752d 6b6e 0000 0000 FQDN-unk....
  84863. 08044868 <ipntomentry_ids>:
  84864. 8044868: 0001 0000 0002 0000 0003 0000 0004 0000 ................
  84865. 08044878 <interfaces_scalar>:
  84866. 8044878: 36d5 0803 36f5 0803 3623 0803 3627 0803 .6...6..#6..'6..
  84867. 8044888: 0001 0000 ....
  84868. 0804488c <syslocation_default>:
  84869. 804488c: 0000 0000 ....
  84870. 08044890 <interfaces_ids>:
  84871. 8044890: 0001 0000 0002 0000 ........
  84872. 08044898 <attable_id>:
  84873. 8044898: 0001 0000 ....
  84874. 0804489c <mgmt>:
  84875. 804489c: 361b 0803 3621 0803 3623 0803 3627 0803 .6..!6..#6..'6..
  84876. 80448ac: 0002 0001 4f8c 0804 4d80 0804 .....O...M..
  84877. 080448b8 <mib2_ids>:
  84878. 80448b8: 0001 0000 0002 0000 0003 0000 0004 0000 ................
  84879. 80448c8: 0005 0000 0006 0000 0007 0000 000b 0000 ................
  84880. 080448d8 <mib2>:
  84881. 80448d8: 361b 0803 3621 0803 3623 0803 3627 0803 .6..!6..#6..'6..
  84882. 80448e8: 0002 0008 48b8 0804 4784 0804 .....H...G..
  84883. 080448f4 <snmp>:
  84884. 80448f4: 361b 0803 3621 0803 3623 0803 3627 0803 .6..!6..#6..'6..
  84885. 8044904: 0002 001c 4e78 0804 4d10 0804 ....xN...M..
  84886. 08044910 <tcp_scalar>:
  84887. 8044910: 3f41 0803 3979 0803 3623 0803 3627 0803 A?..y9..#6..'6..
  84888. 8044920: 0001 0000 ....
  84889. 08044924 <sys_tem_nodes>:
  84890. 8044924: 4a64 0804 4a64 0804 4a64 0804 4a64 0804 dJ..dJ..dJ..dJ..
  84891. 8044934: 4a64 0804 4a64 0804 4a64 0804 dJ..dJ..dJ..
  84892. 08044940 <snmpenableauthentraps_default>:
  84893. 8044940: 0002 0000 ....
  84894. 08044944 <udp_nodes>:
  84895. 8044944: 49ac 0804 49ac 0804 49ac 0804 49ac 0804 .I...I...I...I..
  84896. 8044954: 0768 2000 h..
  84897. 08044958 <icmp>:
  84898. 8044958: 361b 0803 3621 0803 3623 0803 3627 0803 .6..!6..#6..'6..
  84899. 8044968: 0002 001a 4c24 0804 4ab4 0804 ....$L...J..
  84900. 08044974 <ip_scalar>:
  84901. 8044974: 3e55 0803 3709 0803 37c9 0803 3627 0803 U>...7...7..'6..
  84902. 8044984: 0001 0000 ....
  84903. 08044988 <udpentry_ids>:
  84904. 8044988: 0001 0000 0002 0000 ........
  84905. 08044990 <ipntomentry>:
  84906. 8044990: 361b 0803 3621 0803 3623 0803 3627 0803 .6..!6..#6..'6..
  84907. 80449a0: 0002 0004 4868 0804 4b48 0804 ....hH..HK..
  84908. 080449ac <udp_scalar>:
  84909. 80449ac: 3a1d 0803 3a49 0803 3623 0803 3627 0803 .:..I:..#6..'6..
  84910. 80449bc: 0001 0000 ....
  84911. 080449c0 <attable_node>:
  84912. 80449c0: 4a48 0804 HJ..
  84913. 080449c4 <ifspecific>:
  84914. 80449c4: 0002 0000 0000 0000 0000 0000 0000 0000 ................
  84915. 80449d4: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  84916. 80449e4: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  84917. 80449f4: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  84918. 8044a04: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  84919. 8044a14: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  84920. 8044a24: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  84921. 8044a34: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  84922. 8044a44: 0000 0000 ....
  84923. 08044a48 <atentry>:
  84924. 8044a48: 361b 0803 3621 0803 3623 0803 3627 0803 .6..!6..#6..'6..
  84925. 8044a58: 0002 0003 4ba8 0804 4ca0 0804 .....K...L..
  84926. 08044a64 <sys_tem_scalar>:
  84927. 8044a64: 3629 0803 42ad 0803 3db9 0803 4059 0803 )6...B...=..Y@..
  84928. 8044a74: 0001 0000 ....
  84929. 08044a78 <tcp_nodes>:
  84930. 8044a78: 4910 0804 4910 0804 4910 0804 4910 0804 .I...I...I...I..
  84931. 8044a88: 4910 0804 4910 0804 4910 0804 4910 0804 .I...I...I...I..
  84932. 8044a98: 4910 0804 4910 0804 4910 0804 4910 0804 .I...I...I...I..
  84933. 8044aa8: 08b4 2000 4910 0804 4910 0804 ... .I...I..
  84934. 08044ab4 <icmp_nodes>:
  84935. 8044ab4: 4f5c 0804 4f5c 0804 4f5c 0804 4f5c 0804 \O..\O..\O..\O..
  84936. 8044ac4: 4f5c 0804 4f5c 0804 4f5c 0804 4f5c 0804 \O..\O..\O..\O..
  84937. 8044ad4: 4f5c 0804 4f5c 0804 4f5c 0804 4f5c 0804 \O..\O..\O..\O..
  84938. 8044ae4: 4f5c 0804 4f5c 0804 4f5c 0804 4f5c 0804 \O..\O..\O..\O..
  84939. 8044af4: 4f5c 0804 4f5c 0804 4f5c 0804 4f5c 0804 \O..\O..\O..\O..
  84940. 8044b04: 4f5c 0804 4f5c 0804 4f5c 0804 4f5c 0804 \O..\O..\O..\O..
  84941. 8044b14: 4f5c 0804 4f5c 0804 \O..\O..
  84942. 08044b1c <sysdescr_len_default>:
  84943. 8044b1c: 0004 0000 ....
  84944. 08044b20 <interfaces_nodes>:
  84945. 8044b20: 4878 0804 0954 2000 xH..T..
  84946. 08044b28 <tcp>:
  84947. 8044b28: 361b 0803 3621 0803 3623 0803 3627 0803 .6..!6..#6..'6..
  84948. 8044b38: 0002 000f 4cd4 0804 4a78 0804 .....L..xJ..
  84949. 08044b44 <syscontact_default>:
  84950. 8044b44: 0000 0000 ....
  84951. 08044b48 <ipntomentry_nodes>:
  84952. 8044b48: 0a18 2000 0a18 2000 0a18 2000 0a18 2000 ... ... ... ...
  84953. 08044b58 <interfaces>:
  84954. 8044b58: 361b 0803 3621 0803 3623 0803 3627 0803 .6..!6..#6..'6..
  84955. 8044b68: 0002 0002 4890 0804 4b20 0804 .....H.. K..
  84956. 08044b74 <iprteentry_ids>:
  84957. 8044b74: 0001 0000 0002 0000 0003 0000 0004 0000 ................
  84958. 8044b84: 0005 0000 0006 0000 0007 0000 0008 0000 ................
  84959. 8044b94: 0009 0000 000a 0000 000b 0000 000c 0000 ................
  84960. 8044ba4: 000d 0000 ....
  84961. 08044ba8 <atentry_ids>:
  84962. 8044ba8: 0001 0000 0002 0000 0003 0000 ............
  84963. 08044bb4 <tcpconnentry_nodes>:
  84964. 8044bb4: 08dc 2000 08dc 2000 08dc 2000 08dc 2000 ... ... ... ...
  84965. 8044bc4: 08dc 2000 ...
  84966. 08044bc8 <ip_nodes>:
  84967. 8044bc8: 4974 0804 4974 0804 4974 0804 4974 0804 tI..tI..tI..tI..
  84968. 8044bd8: 4974 0804 4974 0804 4974 0804 4974 0804 tI..tI..tI..tI..
  84969. 8044be8: 4974 0804 4974 0804 4974 0804 4974 0804 tI..tI..tI..tI..
  84970. 8044bf8: 4974 0804 4974 0804 4974 0804 4974 0804 tI..tI..tI..tI..
  84971. 8044c08: 4974 0804 4974 0804 4974 0804 0908 2000 tI..tI..tI.....
  84972. 8044c18: 0970 2000 0730 2000 4974 0804 p.. 0.. tI..
  84973. 08044c24 <icmp_ids>:
  84974. 8044c24: 0001 0000 0002 0000 0003 0000 0004 0000 ................
  84975. 8044c34: 0005 0000 0006 0000 0007 0000 0008 0000 ................
  84976. 8044c44: 0009 0000 000a 0000 000b 0000 000c 0000 ................
  84977. 8044c54: 000d 0000 000e 0000 000f 0000 0010 0000 ................
  84978. 8044c64: 0011 0000 0012 0000 0013 0000 0014 0000 ................
  84979. 8044c74: 0015 0000 0016 0000 0017 0000 0018 0000 ................
  84980. 8044c84: 0019 0000 001a 0000 ........
  84981. 08044c8c <udp_ids>:
  84982. 8044c8c: 0001 0000 0002 0000 0003 0000 0004 0000 ................
  84983. 8044c9c: 0005 0000 ....
  84984. 08044ca0 <atentry_nodes>:
  84985. 8044ca0: 0928 2000 0928 2000 0928 2000 (.. (.. (..
  84986. 08044cac <ipaddrentry_nodes>:
  84987. 8044cac: 0884 2000 0884 2000 0884 2000 0884 2000 ... ... ... ...
  84988. 8044cbc: 0884 2000 ...
  84989. 08044cc0 <ipaddrentry_ids>:
  84990. 8044cc0: 0001 0000 0002 0000 0003 0000 0004 0000 ................
  84991. 8044cd0: 0005 0000 ....
  84992. 08044cd4 <tcp_ids>:
  84993. 8044cd4: 0001 0000 0002 0000 0003 0000 0004 0000 ................
  84994. 8044ce4: 0005 0000 0006 0000 0007 0000 0008 0000 ................
  84995. 8044cf4: 0009 0000 000a 0000 000b 0000 000c 0000 ................
  84996. 8044d04: 000d 0000 000e 0000 000f 0000 ............
  84997. 08044d10 <snmp_nodes>:
  84998. 8044d10: 474c 0804 474c 0804 474c 0804 474c 0804 LG..LG..LG..LG..
  84999. 8044d20: 474c 0804 474c 0804 474c 0804 474c 0804 LG..LG..LG..LG..
  85000. 8044d30: 474c 0804 474c 0804 474c 0804 474c 0804 LG..LG..LG..LG..
  85001. 8044d40: 474c 0804 474c 0804 474c 0804 474c 0804 LG..LG..LG..LG..
  85002. 8044d50: 474c 0804 474c 0804 474c 0804 474c 0804 LG..LG..LG..LG..
  85003. 8044d60: 474c 0804 474c 0804 474c 0804 474c 0804 LG..LG..LG..LG..
  85004. 8044d70: 474c 0804 474c 0804 474c 0804 474c 0804 LG..LG..LG..LG..
  85005. 08044d80 <mgmt_nodes>:
  85006. 8044d80: 48d8 0804 .H..
  85007. 08044d84 <udp>:
  85008. 8044d84: 361b 0803 3621 0803 3623 0803 3627 0803 .6..!6..#6..'6..
  85009. 8044d94: 0002 0005 4c8c 0804 4944 0804 .....L..DI..
  85010. 08044da0 <iprteentry>:
  85011. 8044da0: 361b 0803 3621 0803 3623 0803 3627 0803 .6..!6..#6..'6..
  85012. 8044db0: 0002 000d 4b74 0804 47a4 0804 ....tK...G..
  85013. 08044dbc <ifentry>:
  85014. 8044dbc: 361b 0803 3621 0803 3623 0803 3627 0803 .6..!6..#6..'6..
  85015. 8044dcc: 0002 0016 4f04 0804 4fdc 0804 .....O...O..
  85016. 08044dd8 <udpentry>:
  85017. 8044dd8: 361b 0803 3621 0803 3623 0803 3627 0803 .6..!6..#6..'6..
  85018. 8044de8: 0002 0002 4988 0804 4760 0804 .....I..`G..
  85019. 08044df4 <ip_ids>:
  85020. 8044df4: 0001 0000 0002 0000 0003 0000 0004 0000 ................
  85021. 8044e04: 0005 0000 0006 0000 0007 0000 0008 0000 ................
  85022. 8044e14: 0009 0000 000a 0000 000b 0000 000c 0000 ................
  85023. 8044e24: 000d 0000 000e 0000 000f 0000 0010 0000 ................
  85024. 8044e34: 0011 0000 0012 0000 0013 0000 0014 0000 ................
  85025. 8044e44: 0015 0000 0016 0000 0017 0000 ............
  85026. 08044e50 <sysdescr_default>:
  85027. 8044e50: 776c 5049 0800 lwIP.
  85028. 08044e55 <sysname_len_default>:
  85029. 8044e55: 0008 1b00 ...
  85030. 08044e58 <tcpconnentry>:
  85031. 8044e58: 361b 0803 3621 0803 3623 0803 3627 0803 .6..!6..#6..'6..
  85032. 8044e68: 0002 0005 4fc8 0804 4bb4 0804 .....O...K..
  85033. 08044e74 <syscontact_len_default>:
  85034. 8044e74: 0000 0000 ....
  85035. 08044e78 <snmp_ids>:
  85036. 8044e78: 0001 0000 0002 0000 0003 0000 0004 0000 ................
  85037. 8044e88: 0005 0000 0006 0000 0008 0000 0009 0000 ................
  85038. 8044e98: 000a 0000 000b 0000 000c 0000 000d 0000 ................
  85039. 8044ea8: 000e 0000 000f 0000 0010 0000 0011 0000 ................
  85040. 8044eb8: 0012 0000 0013 0000 0014 0000 0015 0000 ................
  85041. 8044ec8: 0016 0000 0018 0000 0019 0000 001a 0000 ................
  85042. 8044ed8: 001b 0000 001c 0000 001d 0000 001e 0000 ................
  85043. 08044ee8 <sys_tem_ids>:
  85044. 8044ee8: 0001 0000 0002 0000 0003 0000 0004 0000 ................
  85045. 8044ef8: 0005 0000 0006 0000 0007 0000 ............
  85046. 08044f04 <ifentry_ids>:
  85047. 8044f04: 0001 0000 0002 0000 0003 0000 0004 0000 ................
  85048. 8044f14: 0005 0000 0006 0000 0007 0000 0008 0000 ................
  85049. 8044f24: 0009 0000 000a 0000 000b 0000 000c 0000 ................
  85050. 8044f34: 000d 0000 000e 0000 000f 0000 0010 0000 ................
  85051. 8044f44: 0011 0000 0012 0000 0013 0000 0014 0000 ................
  85052. 8044f54: 0015 0000 0016 0000 ........
  85053. 08044f5c <icmp_scalar>:
  85054. 8044f5c: 3851 0803 387d 0803 3623 0803 3627 0803 Q8..}8..#6..'6..
  85055. 8044f6c: 0001 0000 ....
  85056. 08044f70 <internet>:
  85057. 8044f70: 361b 0803 3621 0803 3623 0803 3627 0803 .6..!6..#6..'6..
  85058. 8044f80: 0002 0002 08fc 2000 5050 0804 ....... PP..
  85059. 08044f8c <mgmt_ids>:
  85060. 8044f8c: 0001 0000 ....
  85061. 08044f90 <sys_tem>:
  85062. 8044f90: 361b 0803 3621 0803 3623 0803 3627 0803 .6..!6..#6..'6..
  85063. 8044fa0: 0002 0007 4ee8 0804 4924 0804 .....N..$I..
  85064. 08044fac <ipaddrentry>:
  85065. 8044fac: 361b 0803 3621 0803 3623 0803 3627 0803 .6..!6..#6..'6..
  85066. 8044fbc: 0002 0005 4cc0 0804 4cac 0804 .....L...L..
  85067. 08044fc8 <tcpconnentry_ids>:
  85068. 8044fc8: 0001 0000 0002 0000 0003 0000 0004 0000 ................
  85069. 8044fd8: 0005 0000 ....
  85070. 08044fdc <ifentry_nodes>:
  85071. 8044fdc: 07dc 2000 07dc 2000 07dc 2000 07dc 2000 ... ... ... ...
  85072. 8044fec: 07dc 2000 07dc 2000 07dc 2000 07dc 2000 ... ... ... ...
  85073. 8044ffc: 07dc 2000 07dc 2000 07dc 2000 07dc 2000 ... ... ... ...
  85074. 804500c: 07dc 2000 07dc 2000 07dc 2000 07dc 2000 ... ... ... ...
  85075. 804501c: 07dc 2000 07dc 2000 07dc 2000 07dc 2000 ... ... ... ...
  85076. 804502c: 07dc 2000 07dc 2000 ... ...
  85077. 08045034 <mib2_ip>:
  85078. 8045034: 361b 0803 3621 0803 3623 0803 3627 0803 .6..!6..#6..'6..
  85079. 8045044: 0002 0017 4df4 0804 4bc8 0804 .....M...K..
  85080. 08045050 <internet_nodes>:
  85081. 8045050: 489c 0804 513c 0804 .H..<Q..
  85082. 08045058 <prefix>:
  85083. 8045058: 0001 0000 0003 0000 0006 0000 0001 0000 ................
  85084. 08045068 <snmp_version>:
  85085. 8045068: 0000 0000 ....
  85086. 0804506c <snmp_publiccommunity>:
  85087. 804506c: 7570 6c62 6369 ff00 public.
  85088. 08045073 <ethbroadcast>:
  85089. 8045073: ffff ffff ffff ......
  85090. 08045079 <ethzero>:
  85091. 8045079: 0000 0000 0000 7445 5f68 6669 2000 7325 ......Eth_if. %s
  85092. 8045089: 0d0a 4400 4348 4350 696c 6e65 0074 6577 ...DHCPClient.we
  85093. 8045099: 5262 6965 696e 0074 6552 6e69 7469 6557 bReinit.ReinitWe
  85094. 80450a9: 0062 1800 b..
  85095. 080450ac <enterprises_ids>:
  85096. 80450ac: a318 0000 ....
  85097. 080450b0 <bt6701_ids>:
  85098. 80450b0: 0001 0000 ....
  85099. 080450b4 <swt_nodes>:
  85100. 80450b4: 5104 0804 .Q..
  85101. 080450b8 <rotek_nodes>:
  85102. 80450b8: 51a0 0804 .Q..
  85103. 080450bc <signals_ids>:
  85104. 80450bc: 0001 0000 0002 0000 0003 0000 0004 0000 ................
  85105. 80450cc: 0005 0000 0006 0000 0007 0000 0008 0000 ................
  85106. 80450dc: 0009 0000 000a 0000 000b 0000 000c 0000 ................
  85107. 80450ec: 000d 0000 000e 0000 000f 0000 0010 0000 ................
  85108. 80450fc: 0011 0000 0012 0000 ........
  85109. 08045104 <bt6701>:
  85110. 8045104: 361b 0803 3621 0803 3623 0803 3627 0803 .6..!6..#6..'6..
  85111. 8045114: 0002 0001 50b0 0804 5218 0804 .....P...R..
  85112. 08045120 <rotek>:
  85113. 8045120: 361b 0803 3621 0803 3623 0803 3627 0803 .6..!6..#6..'6..
  85114. 8045130: 0002 0001 521c 0804 50b8 0804 .....R...P..
  85115. 0804513c <mib_private>:
  85116. 804513c: 361b 0803 3621 0803 3623 0803 3627 0803 .6..!6..#6..'6..
  85117. 804514c: 0002 0001 51bc 0804 51c4 0804 .....Q...Q..
  85118. 08045158 <signals_nodes>:
  85119. 8045158: 5204 0804 5204 0804 5204 0804 5204 0804 .R...R...R...R..
  85120. 8045168: 5204 0804 5204 0804 5204 0804 5204 0804 .R...R...R...R..
  85121. 8045178: 5204 0804 5204 0804 5204 0804 5204 0804 .R...R...R...R..
  85122. 8045188: 5204 0804 5204 0804 5204 0804 5204 0804 .R...R...R...R..
  85123. 8045198: 5204 0804 5204 0804 .R...R..
  85124. 080451a0 <swt>:
  85125. 80451a0: 361b 0803 3621 0803 3623 0803 3627 0803 .6..!6..#6..'6..
  85126. 80451b0: 0002 0001 51c0 0804 50b4 0804 .....Q...P..
  85127. 080451bc <mib_private_ids>:
  85128. 80451bc: 0001 0000 ....
  85129. 080451c0 <swt_ids>:
  85130. 80451c0: 0003 0000 ....
  85131. 080451c4 <mib_pivate_nodes>:
  85132. 80451c4: 51c8 0804 .Q..
  85133. 080451c8 <enterprises>:
  85134. 80451c8: 361b 0803 3621 0803 3623 0803 3627 0803 .6..!6..#6..'6..
  85135. 80451d8: 0002 0001 50ac 0804 51e4 0804 .....P...Q..
  85136. 080451e4 <enterprises_nodes>:
  85137. 80451e4: 5120 0804 Q..
  85138. 080451e8 <signals>:
  85139. 80451e8: 361b 0803 3621 0803 3623 0803 3627 0803 .6..!6..#6..'6..
  85140. 80451f8: 0002 0012 50bc 0804 5158 0804 .....P..XQ..
  85141. 08045204 <signals_var>:
  85142. 8045204: 7ba9 0803 7b69 0803 7ad9 0803 7995 0803 .{..i{...z...y..
  85143. 8045214: 0001 0000 ....
  85144. 08045218 <bt6701_nodes>:
  85145. 8045218: 51e8 0804 .Q..
  85146. 0804521c <rotek_ids>:
  85147. 804521c: 038f 0000 3025 6432 252e 3230 2e64 3025 ....%02d.%02d.%0
  85148. 804522c: 6432 2520 3230 3a64 3025 6432 253a 3230 2d %02d:%02d:%02
  85149. 804523c: 0064 6425 252e 2e64 6425 2520 3a64 6425 d.%d.%d.%d %d:%d
  85150. 804524c: 253a 2064 0d0a 4800 6165 2070 6e61 2064 :%d ...Heap and
  85151. 804525c: 7473 6361 206b 6f63 6c6c 7369 6f69 0a6e stack collision.
  85152. 804526c: 6500 6978 0074 0000 666e 0000 6e69 7469 .exit...nf..init
  85153. 804527c: 0079 0000 6e61 0000 4241 4443 4645 0000 y...an..ABCDEF..
  85154. 804528c: 6261 6463 6665 0000 3130 3332 3534 3736 abcdef..01234567
  85155. 804529c: 3938 0000 0043 0000 4f50 4953 0058 0000 89..C...POSIX...
  85156. 80452ac: 0000 0000 002e 0000 ........
  85157. 080452b4 <_init>:
  85158. 80452b4: b5f8 push {r3, r4, r5, r6, r7, lr}
  85159. 80452b6: bf00 nop
  85160. 80452b8: bcf8 pop {r3, r4, r5, r6, r7}
  85161. 80452ba: bc08 pop {r3}
  85162. 80452bc: 469e mov lr, r3
  85163. 80452be: 4770 bx lr
  85164. 080452c0 <_fini>:
  85165. 80452c0: b5f8 push {r3, r4, r5, r6, r7, lr}
  85166. 80452c2: bf00 nop
  85167. 80452c4: bcf8 pop {r3, r4, r5, r6, r7}
  85168. 80452c6: bc08 pop {r3}
  85169. 80452c8: 469e mov lr, r3
  85170. 80452ca: 4770 bx lr