author | Xindong Xu <xindong.xu@amlogic.com> | 2018-02-22 05:30:47 (GMT) |
---|---|---|
committer | Xindong Xu <xindong.xu@amlogic.com> | 2018-02-22 05:30:47 (GMT) |
commit | dec7f9cbfbae09c0eb32d059c1ddd67c76d9f058 (patch) | |
tree | c58418f5d3372db096d3a9946d35ae9f740b13b9 | |
parent | 855447d7e51ee5889edfd188a758ddefb130d73b (diff) | |
download | ampere-dec7f9cbfbae09c0eb32d059c1ddd67c76d9f058.zip ampere-dec7f9cbfbae09c0eb32d059c1ddd67c76d9f058.tar.gz ampere-dec7f9cbfbae09c0eb32d059c1ddd67c76d9f058.tar.bz2 |
ampere: add some missing documents [1/1]
PD# NONE
add some missing documents
Change-Id: I6fa4edfd73d780122b4efd8ddb552455735c5b0a
92 files changed, 32240 insertions, 12 deletions
diff --git a/frameworks/.gitignore b/frameworks/.gitignore deleted file mode 100755 index 51e7587..0000000 --- a/frameworks/.gitignore +++ b/dev/null @@ -1,3 +0,0 @@ -# av is a separate git project -/av/ -/pppoe/
\ No newline at end of file diff --git a/prebuilt/.gitignore b/prebuilt/.gitignore deleted file mode 100644 index 0d43ade..0000000 --- a/prebuilt/.gitignore +++ b/dev/null @@ -1,4 +0,0 @@ -# libmedia is a separate git project -/libmedia/ -#libstagefrighthw is a separate git project -/libstagefrighthw/ diff --git a/prebuilt/libmedia/Android.mk b/prebuilt/libmedia/Android.mk new file mode 100755 index 0000000..2d6a257 --- a/dev/null +++ b/prebuilt/libmedia/Android.mk @@ -0,0 +1,16 @@ +# Copyright (C) 2012 Amlogic Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +include $(call all-subdir-makefiles) + diff --git a/prebuilt/libmedia/codec/Android.mk b/prebuilt/libmedia/codec/Android.mk new file mode 100755 index 0000000..2c52dd0 --- a/dev/null +++ b/prebuilt/libmedia/codec/Android.mk @@ -0,0 +1,22 @@ +ifeq (,$(wildcard $(LOCAL_PATH)/../../../AmFFmpegAdapter)) +ifeq (,$(wildcard $(BOARD_AML_VENDOR_PATH)/AmFFmpegAdapter)) +LOCAL_PATH := $(call my-dir) + +PATH_32 := $(TARGET_OUT_VENDOR)/lib/ +PATH_64 := $(TARGET_OUT_VENDOR)/lib64/ + +include $(CLEAR_VARS) + +LOCAL_MODULE := libstagefright_soft_amsoftdec +LOCAL_MULTILIB := both +LOCAL_MODULE_SUFFIX :=.so +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE_CLASS := SHARED_LIBRARIES +LOCAL_MODULE_PATH_32 := $(PATH_32) +LOCAL_MODULE_PATH_64 := $(PATH_64) +LOCAL_SRC_FILES_arm := lib/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX) +LOCAL_SRC_FILES_arm64 := lib64/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX) + +include $(BUILD_PREBUILT) +endif +endif diff --git a/prebuilt/libmedia/codec/lib/libstagefright_soft_amsoftdec.so b/prebuilt/libmedia/codec/lib/libstagefright_soft_amsoftdec.so new file mode 100755 index 0000000..fa63faf --- a/dev/null +++ b/prebuilt/libmedia/codec/lib/libstagefright_soft_amsoftdec.so @@ -0,0 +1,84 @@ +ELF + + + + + + + + +vQ "a$W +e=
jQ
kd=
E.w)YyzU153s^b6ZJ4 + + +03/K +ȳWW +SHxDPHxDNHxDKHxD +h + + + % +&m h0Fh:HxD +!xDI +P +ll
+ B +444$4 + +I FyD)h Fp5+ +5 KjtD + p( +lHl + + + + + +F(FFz00F)F"Fp@ҽ@ + + +6A +XFBF + "O@ + + + +FVF + + +G +xD +!F +(FoBF + + GpGF + +pR@ +p@ + FRR +Nreu h +.,dp
.pldpcp. +pJ +pJ + FoG + +) + bh^h + + +A +"&D7zXZ +] +ĢQR9A82*f1u;{pK>
H<a#*m:7T +Y3'O
~HOdL0fqP!g@%4Δ#|PXѭ҅؋[5mk(G|ҏ +MKdX/L +5Es̮PZ0git*<<2w!ފ03Z +pC"\Y|[|o <o0]T7}]tH2AԖy@b>㭚_Umq/f.`bmԛY-w#^=HΉ&&.Չu>'D7ˇ&t?&x}AtUM®ο<O +/6L#|@cDW 2%E4pahC1sمIv
70nޖٛW0춧m8mv.5@a?A)ޚ=$ +>ue`hfS haҦg2ҭ7rկNˡYߵvc_Yt7x !'Δh:JDVQu|CsqES@C@ٌtPX9/m|e[CNbN\ڨ=Sykd!?.҃poI]ŮȞBucc柳Z&hrǒk(:rj)v1;\dm90^ɹx,ifki6;ri;@̅
J\fM$:^1[5(T/j`@%,3`ڒJd%k Ƭ~[wKF .dJՕx0OT/3zɽ;XH*[e$,k +`2 g%zjjr3\*
-~䤨ce2֢f⫕5 E>j^J̝!O\7ʞ~${R" +䒕{&f@- B(pV*PIs$PN%poHȦ=&9p +
:|Rh'jrc)V|'{7)Tx|!;hJ=a2%Mjf@Jm@`^c +[91MFwQ݈nAP0yF$[+9
m]"zSұk$b{J4==A?Kγ=PӰN,2$qi{} +عElӓ^LIEduwD'\W
XQBէ9k\KHRJ'To'J#p-ԨbOW蚔[h Bo=xxd_߭M\6 + diff --git a/prebuilt/libmedia/codec/lib64/libstagefright_soft_amsoftdec.so b/prebuilt/libmedia/codec/lib64/libstagefright_soft_amsoftdec.so new file mode 100755 index 0000000..d75310d --- a/dev/null +++ b/prebuilt/libmedia/codec/lib64/libstagefright_soft_amsoftdec.so @@ -0,0 +1,60 @@ +ELF + + + + + + + + +e=
V=
E.wkd)U15r^]yzZJ4 + +GB8 0 +H;@ + +)) ) + + + +@ +@C +@? +@ + +{H;@ ++ +# +k +k ++T(} +yH;@@ + + + + + + + + + + + + + + + + + + + + + + + + +Fyiݻ6{P +JחQ5_E8b/ۊݱWg06u&*xfO_7'7) RJҳƇzr7õpΧ#ADvܑiWi +q'3v| kry,b&Sq0MGJo/2xTPreRf[ug +Bln*2AʅZ-?hz=z*Fםq)7o,qpvѯYXj!#k=vWBIWG hi&[U꫁ҝM`x@Uj܄iDwF>]|{Jq74.P;?dcE9
\Q\`YNm3}R1ɪřAet~D\53̞{ih9B^F%R7UZpRd}2| +s0Q65}ZnqأcSssMs
bL`5TchrjLEp~'Ѯ!$3>-E*wYzd;4b546;aibj7uVOggb + diff --git a/prebuilt/libmedia/libavenhancements/Android.mk b/prebuilt/libmedia/libavenhancements/Android.mk new file mode 100755 index 0000000..3a8c559 --- a/dev/null +++ b/prebuilt/libmedia/libavenhancements/Android.mk @@ -0,0 +1,54 @@ +LOCAL_PATH := $(call my-dir) + +PATH_32 := $(TARGET_OUT_VENDOR)/lib/ +PATH_64 := $(TARGET_OUT_VENDOR)/lib64/ + +ifeq (,$(wildcard $(LOCAL_PATH)/../../../frameworks/av/AmFFmpegAdapter)) +ifeq (,$(wildcard $(LOCAL_PATH)/../../../AmFFmpegAdapter)) +include $(CLEAR_VARS) + +LOCAL_MODULE := libamffmpegadapter +LOCAL_MULTILIB := both +LOCAL_MODULE_SUFFIX :=.so +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE_CLASS := SHARED_LIBRARIES +LOCAL_MODULE_PATH_32 := $(PATH_32) +LOCAL_MODULE_PATH_64 := $(PATH_64) +LOCAL_SRC_FILES_arm := lib/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX) +LOCAL_SRC_FILES_arm64 := lib64/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX) + +include $(BUILD_PREBUILT) + +include $(CLEAR_VARS) + +LOCAL_MODULE := libavenhancements +LOCAL_MULTILIB := both +LOCAL_MODULE_SUFFIX :=.so +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE_CLASS := SHARED_LIBRARIES +LOCAL_MODULE_PATH_32 := $(PATH_32) +LOCAL_MODULE_PATH_64 := $(PATH_64) +LOCAL_SRC_FILES_arm := lib/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX) +LOCAL_SRC_FILES_arm64 := lib64/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX) + +include $(BUILD_PREBUILT) + +endif +endif + +ifeq (,$(wildcard $(LOCAL_PATH)/../../../frameworks/av/amnuplayer)) +ifeq (,$(wildcard $(LOCAL_PATH)/../../../amnuplayer)) +include $(CLEAR_VARS) + +LOCAL_MODULE := libamnuplayer +LOCAL_MULTILIB := 32 +LOCAL_MODULE_SUFFIX :=.so +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE_CLASS := SHARED_LIBRARIES +LOCAL_MODULE_PATH_32 := $(PATH_32) +LOCAL_SRC_FILES_arm := lib/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX) + +include $(BUILD_PREBUILT) +endif +endif + diff --git a/prebuilt/libmedia/libavenhancements/lib/libamffmpegadapter.so b/prebuilt/libmedia/libavenhancements/lib/libamffmpegadapter.so new file mode 100755 index 0000000..5a4ec52 --- a/dev/null +++ b/prebuilt/libmedia/libavenhancements/lib/libamffmpegadapter.so @@ -0,0 +1,630 @@ +ELF + + + + + + + +h +BD*p@ + + +8]Z +PʡE:0y/\̕YeSE Ky[" qX +VߤQ{l(IF= +(4$,4$ ,4$(4$,4$$ + + +R+R +s` + + + +yQ$~} + +|88888888Y + +s_$ + + + +@1A0@1A@XR@@1A1! ;1!1<Rb +R. +03/K +" + + + + + +`. +8044! +pP + + + + + + + + + +E + + + + + + +W + +PU$ + +u + +h +p00 + +x + +PV + +T +> +`
+D`
+00 0C + +| +@ + + + +p + + +k + +J +H'B@ +q! + + + + + +@, +0 "0( + + 0"0( " + +x + ++ +EQP + P + +T2\ +@ + + +$0 . + +Pp + + + +@x<p804 Pa!o!v's!?, + + + + + + +@ +J + +arF +L( +( + + +p +D%< + + + + + N +P +h + +h + + + +$$q$ +$ + g + + +wD +Dr + + +T\ +@ + +` + +\ +P +L + +v + + +` +Udp +P + +b + + + + +@ + +\ +0pP/ + +0`Pmo +@ + + @ + + + +h@8P + + + +t + + +h@8P + + +嫚 +8 + + + + + + + +G 0 +8< + + +{ + + + +/ + +:. + + + +( +,@x + + + + +PP @PT +tp +pl +lh +hd +d, +`m +\ +\ +`E +@ +X,T +TP +PL +LH +HD +D@ +@< +<8 +84 +4 + + + +0z| + +I +A +@ +@ +@h +< 偀 + +<@pD Ā#4!?#7!?L0($,4 +(@8 + + + + L + + + +$ +0`8 +`,pw + +q,@ +`$ +<f< +<L +,L +/ +P0`? + +9 + p - + +',P `( + +_ +p +?p + + + +84P + + + +?O +4p + + + +$ +0`8 +!6 +H +$, + + + +p + + +1 + +` + + + + + + + +| +0= + + + + + +! +` + + +G + + + + + + + + +P + + +` + + + + + + + + + + + + + + +A@T +/ + + + + + + + +x +` +H +0 + + + + + + + +P + +0 +K +Q + + + + + + +
+ +` +AJ +d + +t +# +h +h + + + +(p + + + + + + +d + + + +hP +p +b + +0 +\ +D + + + +` + + + +@ + + + +@ + +K + + += +/ + + + + + +0 + +8 + +d/ +( + +8 +$ + + + 0[Y +0 80 + +8 +8O[parseSei]mBuffer == NULL + + + +P +0p + +0.0 +( + + +
+` + +e`` +: + + + +7X + + + +@@ + + +bPU +A + + + + + +A@T + + +b@T B +AA +h` +X +Q +C + +` X +\ + + + + +` + + +@ + + + +@ + + +`, +A + +d + + +` +$ + +( + +8 + + + + + + + + + + + + + + + + + + +l +T +s +uo +rk + +YS +VO + + + + + +0 +p + + + + +@PA + A + e + +6A +XFBF + "O@ + + + + + +G +xD +!F +(FoBF + + GpGF +pR@ +p@ + FRR +Nreu h +.,dp
.pldpcp. +pJ +pJ + FoG + + bh^h +j +T + +`V +V + + + + + + + +A +"&D7zXZ +IѨa)yz}Z\nW"HzӬ0j[Ei˪z0\Ź ꪼImk}WN$io$"_ +[HFŁ
<e+Rbo +xv="r7}LJN>ªCcѽH~VyCΙ`aKE<VHH'S70<z
p:!hSbۡͧ" +(->"XDWPk%.W7v~IXXd-}u%VEj˅qxF@SH&aeoQ^[2H&r~>oKl"bXE) Aܩ35vh#Z0mbڊ;[ͤ&`8ZZdJObjwy|⎐|"=
ttxfsX\h'MVrocRij$*=q~Ε`?a۾1RբX}xim|tGf=VF@qV&>6uIY-!6jjLA~g +A62)Ǹe;~m.%HrXkk +L\?a.H#nʓCLk+= GwG/B@$-eGI2lft"nh?2Mbd{ÆC|i$Ȟ +K{k2< +'<nݻ83Vj|nǸcUTs2X0dL(=՜7}|@rVcHWy4dLLS0sNCXqŹ+U\)alht46:[ +ˀ +sY,gێ77/煤 UJ +G *I{bE3^6S/kǭccrn~WG>~ZlWC-Dnc^We+BSh/C +,dC<8CYX )UG=[Yli+&5GuA]JpٚH=h?l!=o(8Qvw2<p +dP֧XprfgYZT#P-a.ϩ+P|S2`OlBR
%+$6JNT +tuC A +_g%nv8^Xd̲Vm/JK4l&b'U'$$
7R7~yyUt`[&g3kg+4|Pa^>+)S Zf=E16/UEB,0!y]h*h qנ02Gf| WAxȀAƐhfsyK5dۇ{>.$g)M'742GmJxZ,:IZ!XբH? + +*Z]-,( +?3HC;Edd<Eǜ_37$r'+엽Bntzus'3!k!WwX ?t[/xUqJ +ѓIݜ섅n +[>KtC.D!֘nq3u0F5/Ywֆ#t:d(SGM8Xcʮ|랴e!D6Sv/h[3<9b21@,7l' +g diff --git a/prebuilt/libmedia/libavenhancements/lib/libamnuplayer.so b/prebuilt/libmedia/libavenhancements/lib/libamnuplayer.so new file mode 100755 index 0000000..357767c --- a/dev/null +++ b/prebuilt/libmedia/libavenhancements/lib/libamnuplayer.so @@ -0,0 +1,2322 @@ +ELF + + + + + + + + + +/ +F +I +w + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +j + + + + + + + + + + + + + + + + + + + + + + + + + + `FK1 + +d +"
B@b3Pb4 + +$! +@ +"`@H% + +@ + + +B0 + + + + +A=/5nQH +~a>+ҖW@цsT e]Qlb7gq_1X~0$QrN)θLI#i-lh2&WC*Nٝ+LL( + sϿy8P=}Hb#sBCEOc#̃ɷSIFR 0:(7yP Cvh</:V}f}p\;R9v +g UR<a +?@sm;oS<hmU7f).1z6b;)?WoȀߗڿD5tҽ[Jcmy䗶;!Y`W@^V>XA(I~Jy9eX>Xcwoop:ZIQ'xɸ3R#R%n{T=XH2ЙC+ +vp;T,v麝}iޔ&M٦;de>Nj )j:7H]f'mDKMc31"P1r?1!2Uv +ԎX^u>Qh:Pܺ<75:7pU$O?ѕl#,ڰ{-ܦpN]r>%HzZ~G@x!PJ3V=پ&s"o6[ֺ+zL3xtZ=*|γ?s؏G =3W㖀NFDȳ#v"{$SRКB*BӖqMnpgU1jccpIpnQoxWNnc(UpmѪʊ ƺX=dv:=3*7 #"z[=X>2D ~ D@E;a2/H}A2hmEae5$`,+m+ἤ<֚xq/}SryN+eUR]]=YH5U6 (o{y1t>7s8E!c(#8lZc,x\$}G>ZjrOH~ZtVTFXfæ@矣ŴLbZ&+XB|lqA"[ DQZ++/1iN?TOوwTqzh +/'y͍H+0b笈K3w>P9g4HIB
'A:8.78#n^ɽoܝXgccNl9,>o BH1x,0mmxeq?u!>Y{]6GwH;1Z= I,o{vnMK2tK>w寥5 ޯRY7ma|urWV"`ߙƏ%A>~`MgXgUOղZ4=LhY7FfS>kqSiKtcA՟:X`S#[ye,!$qXmv{j'?<|$O[v[JOK]0u('#U(Wy8(M*ƻjpp%1LkMWFlOPcjvɄ,I80qÍ]<D< F8b!ʰ9Ty< GFHGzn+M/#)̵"_^6sAQO${zn3
i=B Ž҄5'K*Du0yin4#@6XCRw% +Uo'EVҲQg,<َ +aW;],jbn#[NRy|J ./O*`-F(îLubs~I&MX]O + T(.+@U-^X@D50:d6e]]1߱|7C H5kc~Ƃȡas41>$o Z,$ƿ5{Bqq{Z8D9:mnuǹ{1ܷq*9DyV|st+D/XXV- +){VUՙyx"2o
bfMBٶ,yl W8oMgB:0-ǮY;QjgaLue0ҋ#q?=l0ʥE"lT
Rه^c>-J@lNxW@n+vkuDUt"[;UJCTv5n[1d1v<䃡o!Ҹ" ?f*=Il.SE +\9PqoVfʿ烮Rx10ygWӸ꒒:JMɻq2䠋OGƻ5fV2UG`{n{عLDefWQy+SahYUTF-ׯw$ +ѯW]<l"㵠eJɏWl?5NݘL:0yk-Z;VirLS{5y_G%px]j67$KƿouY噏.(]-`L!Y@F"- +Q̎:dT
Zf)>&lOÐ/pPIy(?Fvd:k1JLgWQ
x(:AG i%ȹt5qZdN#M}zZ[v,pn3hNÙByܘҟ1NPc5{L*vZnS`)mrw+rrE¨B8=Wj-\7$D`{0} IxzUTߌD7Y[R (Բz]zt){FdM:K NyҜ'/XR9K/$'0#q7.>nM2'@Jv)v2#M"J×e-cŻћ/N<DK%z[S%O0R̞Oڋi*#}ib1_eP: rsV0W +_uGp iA*C
v=Ϩv +a_`ZU8E<$F&S T_,Jpa3o $Ph;eMi<,w|\AIgiH J03YpEʘ^<ik!2vZRHhsNZ]y!%˸&Nޯ`N8Q?gé2CЁ+kM87h݆{</s!HwP蔼L ?KR癬%fxRpZuػ^W<`gyl3QeD0 =C*`c&e[v6HIS,mh B +ݑ7F9$-6&N]XLI[ +)G]/
L +9huR@{GM-pX_V^2432`S*-}ԆtK_,+X 1yDv\!WIF<hɥ}:P*@/ >@\%z])HM ȩ> 0.ǿ lR
vk1o{
v,@p=?;L +QmASua;T-P]Ai#=J6gϹ<ney ƣTo[[a~:qmJw%OkiK/CDl<M8<P*V&@ٷ%>" WG[V4TmxY*Qsz`-d@o.0/{!d'QyK/IoWNh3+G98wʣy;|j{<ib'04{ߝ!M@Kݱ +<3!q8d3Hoʘ@5(4.&<lFd"VKaɒNJ&kÑg1"g{VIG`J +/d+բVWq\]eU!K-~lXse+qV{7x/ +jQ(q3MK>wT)}TT1!j]q7 +y8KPP膑C87i^)oPĸQHSJKŢpt:||.jmq1-@ +(
K1Xx|Iy1Xz27PRޯ@-lM8zvet[<3;TY?"+]n)3`@ۀ^ H(]I8tͽg˦vS{ +7܊X{1>az#6!M + +( + +o +M + +n + + +Z +
+| + +C +{ + + +$ + + + +| +'a +8BW& + +# +$$ + + + + + + +H*FxDh H1!`xD!F@X6] +h)FHxD + +h!F@WԿ~^ +IxDyD +h!F@W +03/K + +ZP9IhFyD0/hF% + +n\Y +4X + + + Uppuh(F +paaa
HxD + + hB F%`pFFFF0Fp!K + +0FFI J+FyDzDf'HF`' + +I
yDO + A3
+ + A3
+pG +t + +i +i +i +PF9FuQF(F(h +o!F + + h + +xD + + + F!2F + +>0 +YI +i + +# +KRra +H
+IKxDyD{DHIKxDyD{D0 +8hz +' + +(H%y + +%4 FF(FF(F + +0 + + + + +I +KyD{DHIKxDyD{D +I +KyD{DHIKxDyD{Dv" +I +KyD{DHIKxDyD{D! +HIKxDyD{DZIKyD{DRH
IKxDyD{DHH IKxDyD{D@ +"CFFOO'FWyh + + +HxD + +HxD +IKxDyD{D +iI(F "yDfHxD + +XI"FyD +! +xt$I*FyD"I"FyD I:FCFyD +8jFL( +i + +!I*F#FyD8I2FyD +8( +LDF~-& +mD +iQt +yD QF Ga! +uAF D-UI +#yDRI +KxDyD{DHIKxDyD{D +FkFFF# + +YFBFeQiA + +! FA"FYF +Fxч{x{xkx+ +B*` + +;y|+Cy+ +( J)F&FF!FiiXFFXF DXFF!F@FF@FFXF.ii+DD5&q +OFicDD^O + ( I)FFV!FXiiXFFXFDXFF!FJ@FF@FFXFvii3DD#6OuOu`iiV(D9F"F`9 WFicDDF\HxD2 + + + + + A2t + Fp +8h +jiFG0# + +A1J8FAF!A0(F d)ȿd!d + +HxD +HxD +HxD +)F0FD +2H"F2IxDyD +I +KyD{D^ + F@Q +(h<0hQD)F.5 + + + + + + + + + + +jGsAPa +B,BBCcA,BB +Ac!as + + + +)Fz +DSAI1 + + )Fh FSqT1 )FXGP!i1)FFGP4tD@a)F4!F)F&A)FGPQd1n + +`+Ep + +1 +( + +FF + + + +(! + +FFO +@F!@F!@F!@F! +~0Oc` 0OC0O#0 + +!FA
+"`(FF + + +@5bG'@! +p + + +xD +h +8FF9F` hi FG + + +)F"o + `1F츱&F +(h + +h,,e +xD + +"yD"yD + O3h(h)h*h,h0h4h<h@hDhHLhP(T8 +#X8\hA +CX4Qxh|hiF( +I}DKxDyD +FHxD +M H +J}D +KxDzD +1h(F D jFp +G +(o + +yD8(`` +yD(@w
xD +mGHD@" +yD( +b4yDP(0b +yD( + +!FE +ݚI yD `(LۚNlO + yD2F;F +yD( a +<(` +;(`_IyD(a`h + +JHxD + + + + +%%%%%%% %%%
%% % I + #FyD %I
#FyD + + + + +%I%OcyD + +0F!FXI yD8 + +0@8`}J06(` +F@( + +!F +8jF( +Z hO`!F"<!FI(F"FyDI +o +D!F4 +8jF( +#<err +8 + + +xI*F#FyD$I:FyDIBFyD +yDp0FxcI2F(hyD( +++@^IyDI yDHxDuQIR yDlTIyD0F1F0F0FF(hT2F + FF0F F1F0FF0F F1F0F +(%(hC븳(hO +Gl!DB5DR!DqBxFMAuB@EAf1B +mG +F + + +`(d8O +p(hyD + +jGF;(hyD + +@ + + +ѷ +(HFL(f + h +># + +@HF + + +G + + + h + + + +N᱙ȱh +"@( +yD( +*!F@( +r 'yDzD + + + + + + +p + + + +I +&)h +hlG(hh oG +h + +єpI +Ŀ(hH +I yDZ{ +eFF<(h )F + ; < F +( ; < Fh! + h kG!I" yD'I( yD +')hlGx)Fx +@I yD +, +G + +$A +(Fv7h + +yD +"H@ +">(FR + +h + +*\V@( +yD(`I +yD + +OppbFa7 +"5 +(yDh60hP0D +( +ZIyDbhlGGrL1(*NIyD h*:6 + +. I KyD{DJ<t +n +I + yD + +!"FGFelB FF
I
+ +yD + +*(&љI ++ (ۗNJ~D +HC JF1F +چOsBFF,FkI kJ3FyD +pG +mG #I JyDzDd FHxD + +AI AJyDzDo%0 +yD +9F" +h +hlG +8R( +IKxDyD{D4O +xH I*FyDJI"FyDI:FCFyDX +HxD +KIyD +!F0FE +2H*F2IxDyD +H
+IKxDyD{D +uIv yD v +uIu yDzv
DVa +s( +uIv yDd +w
FeQ iQ(@ v"(Fl +v> +h(&W +j +i)$i +Z5 +# +lH +IKxDyD{D + + + + + + +H +I +KxDyD{D^4 +4 +
+ F +D +hhIh@hBFpGFH!FxD + + +(hyDV + n +F + +8( +(hA + + +pB + +O + +1F@F !p +pHIHF yDKIyDN + +h
+ + +yD)k
IEC2
ibyDIBF
yD
+m +G +D@3LO +Ps + +FB +B + +p<:I:F yD +H +I +KxDyD{DIKyD{D +F8F?d:F + +F(FZ? +P +0F0FR +. +0F0F< +
k8F0FO3yDPFk*F0FO3yD0 +8hyD4(8hyD*( +kyDBIkyD<@( + +T + + +0hQD)F
|HxD + +I +E +yDzD + FYIFyDXIyD F +r FSIFyD + + + +N$N + + + +0 +T@(% w%o& D + +<5 +0 +OЉO +.L@) p9: +#FFPBO +$( +*` +O +9F + +$l0hl2FGF +@BH @ (@8hm 1s0X ir!1s0X ir! 9I + 5H +xD + +I +KyD{D +`1
F +0 +iHB ho|qBl FG + +& +F + +r0hh0FG ++I,+KyD{DJH
JIJKxDyD{DBH BICKxDyD{D + +F
IcFyD h h + +K{DK {D)H*KxD{DR + +@ + +I + yD + + +P1P + (F + KyD{Dn + + +ii(DDBFz h + + +` +0F)F!j)O +0F)F!j )O +) + (F FF(F F +p FR +IyD F> FhIF +HxD +j*pGd + +(j(е + +(! +(O + + + +FyDpm)F"FF8F F + + + + b + + +vX + + + + + + +IlF FyDl FIF +! +IyD F0 FZIF +@* @ +H xD + + + + +D + +pGj + +
.& +HF9FG +6%IyD#IyDIyD iF@FHlFxD +I +(hGiPFd(FIFRFGFPF-@FIF46Bͱ(hP(D + F4 F)F2F41F*F6 F& + FE +67BHxD +xD + + +A +O + +0 h +B=GI h +:pG+b
+;A
+pG+b +;A
+pGo +9;@ + +~xHxD +!E +CX4P(b, + +7 + q8 F(F1Fhi`(h&` + + + + +FhR# +IyD F F IF +8jF( + + + Fh +o)FGXe +| +)hg`o +| + +Օ *2AI
yD,d + +A `p| + +p8=e +8( + +DRaV1(FNI"FyDJ +4X +yD + +8FD + NF(h(:IJ1yDqzD + +k + +yDD1IyD>@( +8FD@F>(FPH +9F AF +@( + +P@( +(F@( +@ + + + + +J FF
0F9F + + +FF0 +HFA +F@( +tIF0" -xpy +sxD&yD + +P 0 +o +|G + +гxD +O +bG +x@F +rFHDxD +(HOqxD"Ozr +o +|G +H + +H + + +P +XInyD*F#F HHxD +hFjGE7ڻ +F1F(h +z + +tpA8FHF@FR\FEH +0h +I +yD + +1h I yDF 蝹F#`oF +H xD + +i +G_O0qA m +`<(FlDiBє Fl + kF1F F +kF)F FRPGJ +F8FQF(F!FRFI:oyDIyDkI"FyDI*FyDIyD2FJFCFHxD +o|GliB F +` +`EFFF H(7\ + +`FFT*@ +0khjGF(FVqmDpe@ +FI"FyD +(F~&`p + +(FAF"Fi9BHxD + F<7FWyh + +xD +)h F +' +O3s D@4O +F +aO1 qO +O7{w +O +!$TF + +N + +bO + +xDFIKyD{D] + +liFG +0F9FoF1hObhi8FG +H
+IKxDyD{D + +H xD +RIK +yD{DK += +HxDh F +JzDQhD 2 F2 +HxDh ) F +HxDh F%1(F +JzDQhD ) F +1F +`xipal(haiaia(ha&` + +` hi FG + + + +H xD +A5IKyD{DIKyD{DIyD F8 FbIF + P/UP +PFx +8Ft(Fp0FFIFSF +d +
(FHxD +HIKxDyD{Db< +j +0hQD0hQDHxD +8jFB( +KxDyD{D + + + +(%OzsDXCqI;F'F4Fv + + +BO +2HxD +
FxD + +(h +D FH + +&(hFkQe1B1(hyD +(hyD +# Fu(hjFlAoB,xD +xD +0F(F1Fx +o`0F0F +(hyD + + + + +!F +0hQD +X + + + + + + F + + +`* + + + +!F +!F"(F +)F0 + +f + + + + + F>XFyDp(hyDP + +x(hyD2 +(hyDj +!v F)F +(hyDN +# + + + +(hyD$ +JlQF +>FiB +i +i(hyD + +@ + +p + + +TyD> +*@B +TxI(F!F A0pQ0FFyD~V +- + FZ^IFyD] + F.IFyDyIzKyD{D`yIyD F + FtIFyDIKyD{DKHIIKyD{DFSIyD F +z F +H F_IFyDqSITKyD{D$VQIyD F +0 FLIFyDYYH +YIZKxDyD{D> + + + + + + +iQ(@ +iQ:6 +KyD{DIKyD{Dd +IF +p +H
+IKxDyD{D +HIKxDyD{D + + + +L +|z FyD: FyD4 + Fh% F)F( F)F$@( +H FH +p +X F +| + +|&(FyD(FyD +(FTd(F!FD@" +|L FyDD FyD + FU F)F| F)Fx@( +FPF0)FJG21e! + +x +X(F(FyD(FyD +(F4(F!F(F!F(F@@ZF Fb(F. +X FI FyDI FyD + F듥 F)F F)F@( +I FyIyD(F F)F(F +X FNqI FyDoI FyD +- F@( + + +|._p FyD_x FyD + F F)F F)F F@PF(F F:_ +LiA +XAF8F<
` HF
PXF F 0F|8FPIF[F +H!F(FjH +iA +"dF FP8EЛ +HDO + +H +|d FyD$ FyD + FT4 F)F F)F@( + + +p +X +| +p +Xx< + + +ȼȼ +L + H +LL +)F + hiFb(F F +",($ +(F(F!F(F!F + +@@yDg Fx F1F艡 Fp F9F00FYF4 + + +WD=((FIFRF g + +"FF|HxD +
u(FB(F:Fp +"pF0F\F @ +"RF8 + +`Q0 : +FFA1B9Fa(F@ FQ~b. + ? +i1D#STD"b Kb "q +T D`p q `q q q r(Ff `F(F(F`r(F +F(FF0F9F(FFg r0FF0Fr50F hF0FFHF9F0F(D +pp +
HxD +HxD +i ah(FB +9mhBk\I> #yDLWIF + +(h<0hQD)Fd 5 + + +0 +
+
<@ +
0b@W 0h9R,D > = +4`' +@'(h0hQD)F +xDbJyD +hKh +P ` +D ` +FxD)F +
+0hQDHxD + + + +L0
H@ + +SBFiiD!(n + mF(
CFk +!Ff + + + +TF/(TF FF F?!|FW}B=F)Fd +BG0F:!FJEJF + +* +*pGHh + + + +`YFF + EF +QDi8hki +" +1A +pa(haiaia(ha&`HxD + + + +h + +ixDi +@ hiiDu hiiDF!Iu +HIKxDyD{DIyD F6 F` +IF +OE(O +WD=(0FIFRF g +)( +)o/aɲ)oVAɲ)'o6 D@(FK +"FzFB +0!i2DZ F< -HxD +~F +#Ga!uA +" +" +"Fn FsGGeJc9sWr: +h1F8 h' +h1F h +
\ + GEx + +h1FN' +i1D +!p!qAAq +8p#ixp7#i28FD# +0p#ipp6#i20FD# +i1 +h1F(x' +h1FR' +h1F h +DB( +h1FZHxDh +h1FP'# +i1D +s0'i* B +-H/-I-KxDyD{D +I"FyD.XI F"yD&F +h1F(F| hGeAr1 hFnc1HxD + +0hAFiBO( +iiDD"QD +qHq +eBI2FyDI*FyD&I"FyDP + +IyD Fp FIF +8 +@F +I +KyD{DnIKyD{Df +O6FH8h)F"xh)F" +D%8h1F"( F9F"Pxh1F"t︱ F9F +C +8i +hB F F+HxD +C!'F
+ +yD{D +FbJ H !F"A +F@ChF +5 + +<UAUATU ? +-p)p +H` +@ +" + +" +" +0 AFFHF)F 0 +~l,"f숹 8F`F(FAFHF)F"I +b +yl>">2F:*F#F +iiD" +TD!Ap +shs@ S@0t#Attt +i +T ` +rhr`{0tpth +thtwaIT +ñ?O + +vv1wqw +ww +I hyD((F@)IKyD{D\ +O0d +,?NI +0(B +`n"Dan"HBx + +0F&0F + +0FI2F(hyDt +
0FF0F +(FO +" +
IHxD + +0(B +`n"an"HBx +"0F +" + F8FIF0F!F
@FtIF@FYFX@F9F@FYFz@F!F0F\@F1F(FTjfn(Fb(F9Fl(F!FZk(FV +
SH&xD + +Q(F~
)FBF(F." +QFL +б + + +"F $`B + + +N%u $Bx +9F*F + + F +?7 Ei +^ +"F>FB + +뵱( )FF~ !F,0 *FjiiDPF +< + F F +~ + F F +nx +t + F_I"FyD + +(FJF(FpTIF F2FyDRIR yDPF + +%H + + F +"IFyD!IyD F +t FIFyD +( +( FAF"`$. F(
Н`(FAF"x + B!i2(FD@ +HxD +"FOFvB
xYt +(h0l0FR0F( +"F$F B +xD + + +IyD h hpP +(8@0 F1F&7/HxD + F@&y + +H! +xDO + +"0F!F F0F!F:0F +"!F +"0!F +1@ + +`Q0r% +ȿ +"9F0F9F F F +"!FF!F0F`0F +4I64K#yD{DHIyD F|" FIFyD&I KyD{D0IyD Fd + FIFyDIyD FT F~ +IFyD +IyD h!,( +IyD h!,( +!,( + +b F +jG +iiD*F +|
7HxD ++H+I+KxDyD{D +OE(O +:@Fb T1 +$^$a +#E( +) +'SE( +iiiP2F8DQD + QE( +IF"HB( +H +HxD +&B&E +)F"HB( +/FW/B(Ffj9`1F#F HxD +QFi"#FHB( +T2 + +$ +H +HxD +jB$$ vja +x +w + +LjhB +TiiDBpjIFijFAFh +I +KyD{D +(} + +xD +)o/aɲ)oVAɲ) +(F +O +F$/$ ! f(!` + +O +x(
/ !@Bѧ +)Ff" +I!!!! +tHxD +HxD +jB $K$O 0 +I KyD{D
+!` +ElElf`
`(b hb +|p + +OE(O +WD=(0FIFRF2 g +)( +"FB x +0F)F:FiBшhB +jB &k&o T + +!mB F" +` e }i)iiD,F! + +iiD + +!l!lDB( + +EJ
+ +U%c + +" +FFPFF +y@ + A0 +@ +`ahA`ah``` + + +" qp'!p +p!"Qu@O*p@* +D@0L +@*t +(FT@FRHxD@F(FAFϊ +@* +(F(@F&造@Fl(FjAFϊ +@* +(F@FO + +qqqSHuxD +A)T +x + +"$B&$8Fj +6H-6I6KxDyD{DIK(yD{D +GH!aV!1F h +FI*F#FyDdI2FyD +h
p$pF +p +p +o +1F` + 8 x))
4
X +А +AF +F +xD +q + + +GH&GIGKxDyD{D + +u)F()F.`
HxD +H
+IKxDyD{D|IKyD{Dt +FhFvHxD +O +8B+Х 0FIF(# F9Fx8B(FZ( +HFZI^ + +85YFT +0FTIRF +tFxDF +8BPF1F"FD(QF"F(FBHF)F0hQD)FO4 ,^FW F i7IF6 +v@ + +0FPJYF(hzD( +D8F ((hE8I JyDzDq + +&dHXxDLhhp\PX +hB51B +R F)IF + +(hyD: +z v
4 + + p p +, +( +B=8FF!FXF9F!F1 +CBF +pI +h(@ q +
| +F8F +P`
+ +0@ +`1F +0@ +B.*FPF` + +x)6F
+ +#1F0*0hQDIFr$0Y0hQ,1Df< 4
^ +xD
+P F +P F +v +p +%O + + + +?O + + +8iIFJ yDzD`8i!p8i +IFyD +
8 PF8IFd(F9F
8 PF8IFZy(FJFd)F%F +X +O +8 +7pt + + +)-ۊB+ڐt1[p1?+X: +pGIKyD{D6 +"B~ x +": + + +HxD +P6 @ +A0` +@EAFF + + +0 + + + +Zx
+zD +! + +HxD +HxD +FFh!FAPh`(hR,D FFHxD + + + +;A +pG+b +;A +pGo +9;@ + + + +", bB xaiBHO0 +h|yjzjIyD@zjIyD `HxD +w + +( EPF, +8%DFPFzDAPFV( +2PFF +yD\{I[FyD:FR@ +DIyD FD + +pGipGi` + +DAF +p~pl + F F8 +1l +1l +, nF +1l +IyD F< FfIF +D*fDEBRrB +D *#@%#B@Ir2Gbbe2BXG`"p"B +D*F rnESbVBB +Gpra2C41RB@܀C51RBEGBNB +D*GalRFvlRB@ŀGabdbB +" F +F +>PFXFQFPFF" F0F +,*.hA^@( +"0FB x ,) +0F&E6
(
T +8F1FRFx슡8F + +"FZFB4 +"F6FBxx)D +" F(B x +E +"F" + +"F + HxD + + $XF|HFz@Fv +XFfIF yDj + +IJyDzD ODt +"%H(xD + +" +IlF FyDH FrIF + +$$ + +p|anF@ +0Fm(F1F +p@ +HxD +q!FQ5H%FxD + +xD + +*F0F0F +(F(F +|D0Ff +yDPF~QFBFPFOG +^ +vF"0FQF(CIg +I(FD +yDj +F +)F`F(F/1 T!F8F"t1F"(Fn@( +(F" +(0 +(O + +(F6!h5I*FyD +D<+ +iFiDt]B5B +xD + +FI"FyD +"yD8 F +!m8FT + +HI"`myD`m`I
0hyD +I +0hyD +*u +*u + + +0hQD)F +6 +d +vO +
O:O5O1 +xD +*n7{Dp + + F
FX,F7O + +@F!FFF +FhC` F
0hQD9F + +? +F +H +I +KxDyD{D +H +IKxDyD{D +iiQ\G) pG +id( +UA +NF + +j + + +IyD F FDIF +KxDyD{D H I KxDyD{D1 +H +I +KxDyD{DV H I +KxDyD{DN +HF. IyD h h + !F !F!F +
pO +xD +! +d! ! " + + B + + + HA d +FJ + + + +B1
O + +FB +hhi G б!hp +xD +(]G+0G+ 48BI@$pyDI@'pyD + +D +N"F +yD + +"IF0 + + +>D +hhQ +D
X + + +xD + +( F F~F8F81F7`0hi FF FD FhF +xD + +
0 +Ba +O +jG.FF0F0F(@tozvHxD +C +O +!@ap + + + + +O2 +@0F9F*Fhh mGhh mG +i28FD"9F0F-")F"xh ~ iC:툱"I# yDt +E + + +H&xD + + + + + +( +I$yD h h
m +HxD@p +e +HxD@p +e +! + +W +PF`! +] +TIyDF.@ +@ +i1 + +( + +ꜱ +i1 + + DF-@ + +i1 +i1 +0F! +xD +! + + + yDF IF.d + + +pk\
@i + $ FQF*FEd +xD +yDF +AF-xk@i +C + +O +0FO +(жhmB9O +1h(F)F0)Fl^(1h(F)F@)FX% +
(FIF2Fh\Eh +HxDh ) F +HxDh F%1(Fn +JzDQhD ) FR +0 +(B +@0HF)FFDFThh騻0F!F?.` Z +YF8l0F!FZFp t$ +,F +#hF hF"1jihiGرFeQiQx(H"xD + +hh9FY +\HxD +F0F0FHxD +O{ F!DF F!@F -( + + +EF1FPFFt2FE + + @ +(j `HhQD!FX창 +i*
**'*$шkر( +i#* *%!@"B*$*B* +
+fE oEl(a IP +(c hc +&((((E(4(@𢀠h&hh@ +hFeQiQ$Fd
a1(x @1FF(F9FHxD +HxD +(F!d(@V *( +@pCX@W( +1/ +1(F!F2(F!.(F!*(C(F!$(F! (@(F!(F!(@(F !(F! +(@ /( +1?
/HI JOcyDzDI J@CyDzDI J@CyDzD +1 +2(Fp +2(FYFKI KJ@SyDzD(F!(((F!(F!(((F!(F!(((F!(F!(( /( +1?!I !J@CyDzDdI J@CyDzDZI J@CyDzDPI J@CyDzDF + +F0hQDIF
FIFF$F p + +gm + +iiDIFw-amiB +hiHFGIhyD +iiDDRF +iB +iB + +bmO +iB. +iiii +i7 +:F3F + +i
i2(FD F)FF=Ih yD + xD + +p`.I +I yD|o
HxD +X +fH + + +@ +)F$ +FPF? ` +PF*F& +)F6^Ej F !HxD +(F2lI lJOcyDzDOFvi +F +B( +B( +E@F2F;F + + + +
+( +H%FxD +IyD h!,( + ,( +Ѕi +4 + +4 + +K +D +F$0hQDAF(B
(B? +F(F:P + +F + +HFH0hQDAFD(B
(B8h + R,D*(B(B IyD h h +9Fȱ + +4 +8h$R,DD(B(B +)h"Fhi(FG +o + +4 +$ +h +yD h h؏ +s + +徰FHxD +e + + + + +C + +@ + +!,( + +8TBD|T8TBDp(=(? +8FYFRFB
+-AF
ah + +` +s +FRKB +F```1hAh``h +FRKB +F`C``!s +FR;sE +F` +FR;sE +F` +hFiB[h +p I cyD +8pG + +! + +8F"!F4i B( + + + +hx +8F"!FTHi B( +8F!F +#B( +(0I1JyDzD, ++ +#B( +
+!FBF( +iiD +hB"Ox +HxD F)FHxD + +HBO( + +!B( + + +ʡ"F +OxO +$UE( +@ +<XmгjQ"Pzhii
D)FF +"FiiD)FPD0 !B( +jQ"iiii8DPDbh0aD^ahBO( +iDjiB( + +MI"F+FyD +DI"yD4FTPh +(F F)Fl +"iIE( +e +` +&I&JyDzDIyD + +x +v +xDO6O +FtA iqFg e1FIŢ0yD +O +BЃF + +HxD0h +Fn +c1 + +yD + E( +iD +2( + +@I" +yD + + +i1 +F`"
+<$$ ` + + + + +0FBF +5Fj)F"xD + +(FIFD ((O(wO + +hFeQiQ8hFtAiq8hFg +eI} +yD +i1 +FAF\ VO( + + TE( +ji) +hFeQiQ.8hFnc1"28hGeAr1K2*8hDeQC"" +xD +,[ +hFeQiQ +Y +! +hFeQiQ hFnc1 +xDO +!E( + +8F +BAI HEO +iiD1F( +iB( +iB( +PF +#aaЩ +( +iB( +n'B( + +`pF8HFxD +2 +T hi + FO +M Ex +i1 +F +I +@ + +iiDa +A +!F +H +/6 $O +HxD + +QkF"FC +ZF3I yD") BO( +1kF"FC +F3I yD + B( +.ƀ +HxD +hiGF$HF
FxD +x +OIF yD,O +P +HIxDJyD +O +O +?ȿO + +0F!F` FdOOih +jGx + + +*F +I yD" F(F + + + + +0 +8h1R,DZ FH@xD +jG`DTyD h hU +M?O + + + + +PU$ +F1FRW45P + + + +HxDh F +JzDQhD F: +HxDh :) F +HxDh F +%1(F +JzDQhD ) F +IyD h!,( +IyD h!,( +`FOL-|t],dFtE7]/4tE + | + FOEp + +`-O
%H
+%O
xDD + + + + + +ECg1xAB@逪/ F!^ +D? Fr += +!- + + + + +6A +XFBF + "O@ + + + +FVF + + + +G +xD +!F +(FoBF + + GpGF +pR@ +p@ + FRR +Nreu h +.,dp
.pldpcp. +pJ +pJ + FoG + + bh^h +?o/o C02 +@-@ + + +/oo +@-@ +JZt + + +@D u + + + ! 0bà01@O +",#<r + BQ 0c1 + + + +T\ + +0/ +``! + +6R#2"<$!R \ +R&^b1>!,° + + +Ѝ + + + +Ѝ + +j +T + +`V +V + + + + +tjjjjLkPtuHuuvxwwww +0(HNj + + +$ +P + +4 +odppxqqqdrrr,s +06@ ر<h + + +HH2,`hL(X +SSDU0W?] +^__ +m?`w +l8$ +̙H + +Lxxx$|H&Ʈ` +D + +pT
hp +|""$L$n$$$ +(WX\Z] `cDcdxee4fhi + + + + + + + + + + + + + + + FLAG_CAN_SEEK_FORWARD: %d FLAG_CAN_SEEK: %d FLAG_DYNAMIC_DURATION: %d + FLAG_SECURE: %d FLAG_PROTECTED: %d + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + +<O8pLHERA_[VuVR6j+n
cZg@y]}z{pf^t#W✎9`<'RdX[+F6`}h-/30]lm2'pVIKqL6" Ε=u(:Fy>Cͼ-}wp4mG0K=V9'C#= +VM#RV/K`mpl +e=hﶻ'odj#ͳ`~>ɐ}:{y`6q}[Fu2t-0q].KYT@PENOJ+GC!}{`COF +A +"&D7zXZ +]EOkgvK-9允 +QQtR]&,=^7$KbҲr$mLpC1=LY&.o8riitv[%Tj,DLbi+]c.vZ#C+ +[9ݛ5_h!9.^'dCf3K]qاXIն2.?WA+>ߖ,Pl8k*Ț(Sɂ |(:YJذnQj]VqtxHkH9pQH3dI(%vY@p8zNu9 +b<)^V'ֳUxA>?Pb2I@ɻl$|BXRbLel9{ޞ^ECS9asV6G
+6Yػ?=1L8Lk[q8ѱ
C@Yq.l@d?@ٗ.,<FkISZcFUe/6Sc*iIMe-=,~K.Qq[yNFA,'=pV55e7M{1_!qƅ}s&1Ճ[{j\,B d,HղAATV!\kTB*H"qşX!LKaMVHbqDLە~ڋDC+#ցYe fQnJJw[k=iF,f.%:xx]y;ez釕F8]yWtIHrjO$=nՎmx TWM^[G +[OZ>nEa3;\fh}B +7yFPqofEwNKgnO5{1aoC1!>XRM{oZn[yL`jwk,a
G+_ND(n*q}2K3l7YGCbGZO&D +kYny^5}}ȱ]~W"F0d|7PBh9Yn. +Ӧ.3K}E/da>ZWgI]tDu|;Ayؒ^u;컠j~UPt Xb5
vUq-Lu@Z"ƜuƼSl@2ʊJFJW#xr:GN*|>t__60d +=VeQI(̲gr-xY66!λWWpMp3rѧ/)CV.ehl9A7Q&'n7#@e'Yy3_ej}OeOxdwtm@կHW4U3>k +B)70]lJAGD)(Ati\A}~V1)䷜5d||2:>HIȬp!@/ FmPENAm lmBbV'R[8KT(^]ZėP:[%/L"fqZlwa"vT#..d +:L&~t^DadrfďF1ӓ&w +w'#+<ݼex03TH0F>{tM
fr('C^_c^"6הx4gC04T }p_S Gqrk
)?}idPh{ +\ȗ] x x> +-8=G>ȋr[OԾZ_U#̯|%%ҬXSi"jzz,d~pTӛq#x$M.<Α![;>uoL=DXOJL/EkT~O@H#ͱvyTii5V+\E֠kWvPLFQTLFzU`+-}81>9I Un;b;;{vMihA'/jmӶ囊!؛k[DIhFDaYM%]4&D散Fs),S4 #%Y:ɋP*aB.i3r%]D0yhc)ѻ?߆]Hj݀hVƶ>pTܭCijY@u~+ɂ0gL=0(5ğ#bŮrh` F^dl[<7ґ
Yqa9] +Pl#5I].A!:gk*pW|B_bjocoi̯a.=P=,?
Sı#t}if,feb:|@>F\/~;#]fH&Τ>Tk/Pz4wd\߬ īځ#0KϳwGxLj(jUU%P:'M~%i?sB0@>CTo8ܖl(%Ie3e{kwpAE +$DjAL\+E{csXs<P;yÒ
i)e@NxS
xlY^kFiہG_E4ӷ9b^k=M-E)Z3^MM TVfG8m)#gK%(ѩU@:l&!? +pWf7
5
}a +FLQ^E>nsaكsu[lR]M9ZօIܰcgIWEAZ0R9FwDS7^~@1WUW
mE{`<AZ#w䑙]ͽ˵^]zMmy⺮GڃT.ɢ B36<HQK'{]ٕK{b:k%
ڥ?
]'pV-gVS]:ӳ_m*F6v$؝Q0IbW&כ_,eysVOh1^CL_vCΜva4@{H8q"%xGo\i`վ}>m.H! +FF.Na/h +FAh=C25Z:;/n\*#.,P!ǍN5GCiK +3}ȉeN|}<hKk˘
=Ic +4f4kiZڭ8c̺ݝ9馦#I}*f):vGuAg$9Uzi_c2S⚁w:V\#<qnSj$9k<3pgQa4Zz&-T{BӍf#D3 Tl1y(91'|{'8DVCO`vzݲ6DAGҎ*sk +Ö\9)<4FEzZS:`յMЁՌv])#s{V)̛+qT9gwȭB6IxSq 3p)*nU5!ԓaW
ƛ4&iP9u=n3cREsc\Ef[DaRU~~/L!yK#<<p̞*|Sz=a! ~MV.'p%sEkq =GaA/
Yt#r)Zް{¶/ +Hfc==GӘx%b,Ŝ!
3|-8zmu*\?@:)5Ú;ZN qr"~p[GQi-HzCb_{bJo/k4izW&{v?& +odv$;Uv&Nd&h~0 +|雊9!U28r35c\irbUEp)u[=$>a}\wE1B+%R}WKLߨV'qLWW-1{HFg9/K8xGt6`0k +j~u3 z*<"[O-w,5׃z7m\&thBepC;W'^s&%C*F1Tm9FV}\ΐtvsϣ[[YAϷJvKtӡE qk&Qc`l&,`JL4r=2"(zX lvX@ў)tv<9Sez`<UNPaW
M}rt-ښφ3x +`uh<4]N9Z+xWrepQ:ܡw8)^!E2&N& +g^3UlMHd +N`nKl,-T5(eU ܳb8(RLe +D?-1~0l&qz%kǩ^N uQ>=`j*atMiP*;^mƩNx؇̔*SR"P,4<ٽB?YeraigSa!Ea +dtM7~ۍhN\1`GJ +I_*vF1uG þ9rEݥFLY+;pէr~) ; +tuWf=m]y24cxpOL_Ngd长$1qYZ$ +oZPnhdQي%3D<9#qw*WnH_.Q/yďT,wmzeXэޣ*SN|/шȃ:hLKN~arui|qcf5d:`R9
:fm͂%2RoڟkA++Pi&tm$A9xӖm'IdQ-Nջ%ppZa[;Ui諌ō]Oz#)*9!x]/]EOYBPd_˨ثuTl/@$t}{}T<zD2.NlE#L_|uy[ҡcҞ2C-^2ũ@GS]D6Voim,,eT\x"7@x.#?w +eD XH!ryP0brff7|i-xk}zIL)Y)oS'\P~)"":OѶ$=,k1@¡ +rFuJ79 +za@gF<<jYJi:C\({4:GgqS{\~`wm~O:1m\c'G3;ɸJxv@S`Cm*JEZ 3&Jp8R}cksFq^T2fh}ҁXL5? +i;kr!tعG`!Mģ(;Hgh,YlC@, +Y۞H(n!ώHQ4@¢-dY_WYhT}"qD;TXI25a l(|2IS<H0ѲBjYBs4pOєJGHDKk +7nnd9w&[$ťY䋸IJ2#>G<E&2%CvK݇iv($r%\RT_r@bllV
qc +~}ExXl>/1e<C=cʌ^Ԟ(*ױ +uZ/F8YKZ|ܡMrrWmYuV-AajmӘk3غw7k*87ӣ3dWg +qGًͭ8a]m)@Lp+!FC)L(A/ +m}(ƨk1RG۹>+Y lilj}sIz>/qMVb
F/`sԯ*:ڬp6vSIȵ3.n+ +R&;át-Iկp鳖㻝1[#HX +h*U +e: 7R/4)qi!fW?ZO}NA(-S&#{lFRddd]Mb
iZj%;;M/+\B͖P=5(BJrLZ
5Y#V9+ :H +zUɘ +y[o$ +gA(R/&w}ITJO?Z 0 +111$'u07kQ&YSI]teJ[C\BRa2
RNYvO&vW
2 +D90^$(X7+@&)!L{2"jNcA_Ry +W+5|* V3ƻ2$AgM$ 2\ce>(jw">!Խ%ͷ <<(bpP,Fg,Q7'Y%Jr^ C%LΰdnVYBZZk]*-_-^AԌ+!G^V|vLDݨ(^KY̽L1uJ +ԅgWھ/,k*9S#AK\w ;4_6;ekZ;؋W +o[JSz Z_XpB]_-%Y+s%od6Wj\C5Y"'.@6odB/HMb +iHFlS:@gS%Dps6/S;e\\k0_"19inzC:_STn#b*.q̷B*1[)o*5"$(5
AQʥ2iϾF1IR(vBpxpdKq7M%KܷrLuBCTTH_,uφNKԋV˖#l<}{\YiL1/?ae zY7 "Lĥ%Wfc^hp@pg&m6#!Y\R&C[1<9zfNUƫSĤ)/=0PM +J6ID +(ܚ\|hShe@b) +=
l"h yk}TS :\%zđ +ʻaʌ*RDY`zJ[wəmQJz&͆P(< B>|f渌sYȦlb: R\ +=>`l=N 3ևa&NG {U[f0"@U\84 ^ͥ:?秸?Ee
#z7YzeCr&qG.W7qx+G!3,XL#]!\xsբ"W +B#eB@|Jftr9XnI>B7l\-s/\rs>;p WS+{:\CSo0|FG'b:(o?/u.[Gd~ٰ>1*#rV}'Qzz:H,PpK=42ڨ^#V,q~g0Ӈ˝la=۔eRzvX)coxmx2E;8³^R +Vhs< zd +4:I*己F.J]Ɛ (yarMfrRIIZxȒo,,Rْ#Z3nbBQ6֣TE(W +a84gf!c_Rg
[B+ԛL@mN!7$jBb&$%_ +Nh9CYoMF4v`dψi= +Sq@(d/Nie;iMq>ՙcѴ<M? +)C%Y?K'1a$%/5{KӤOUe1`(lr9-V8L<)otcCe+$vV0:gZ
CRݚ +vө_M15=<rt70FxHwWnOq`tY:,~GIw^C4$,+$3(
փ\ICNcKLٲ̍aO +=J~q:0; +әv'F$"+}/s,L-)CuyeX
ߤKKK]rzuD8go
Rk)s[hnaRwEsCJG
+Fa95*EjΒO׳lB.qM\8 Ǥ~%zvQn?d$zBVVzsW*:)GG0)]gZ]dM'"'7p-WؼN\qpzQeN65>.GL'\)>/cαRZN]a{O\lZJlzjAi7]z F<@;lޙ-b-yodh, UIAƣЌȷiʞj";B:6 xXh1(:E֤35auV%H7\ +K433= +Da䒨;ɽ!8C64Ӕc]/\DT3 +y5uxd,U)qPEw"}I +=Xİ5ɱȬJ +M/6-*Q#0oK.ˎpK)Fb`w)ϰs>vjHٖ٨"]]N+*vDm-?H"0U!AZϘ7n}Zb eQkT"~B9O?!=&7v`7z}I!9 AUoH2i='^p-lp*33_J wv-~tI6`X{fkt.l6Y|@s +UBvQnyySEn-.b~:²lK?,DV9clL{hd +dV+}b3S1? sCk%wN/ +TNDF>B$RY-h_-0B5gu3k1^` + + + + + + + diff --git a/prebuilt/libmedia/libavenhancements/lib/libavenhancements.so b/prebuilt/libmedia/libavenhancements/lib/libavenhancements.so new file mode 100755 index 0000000..b42211c --- a/dev/null +++ b/prebuilt/libmedia/libavenhancements/lib/libavenhancements.so @@ -0,0 +1,88 @@ +ELF + + + + + + + + +03/K +# +`p + + + + + + + +t +\ +D +, + + + +\ + + + +7 P +@L +@< +@, +@ +@ +@h + +, + + + + +P + +/ +@ +@ +@$``` +R +" + +, + +6A +XFBF + "O@ + + + +FVF + + + +G +xD +!F +(FoBF + + GpGF +pR@ +p@ + FRR +Nreu h +.,dp
.pldpcp. +pJ +pJ + FoG + + bh^h + +A +"&D7zXZ +FE~m^aʬOXr3b0
f`j3 LClɪwK
kk,O/~S8Oq/zUkEu|ߑ_H"UЉJ2"{r٤82\[w7?M(}h֦tcH^6XnwpEè86ǀæфy7kϫLzp5d)EB$wjY/ +E
"6 +,`{סQf1J>(dVNb,/
mnPTꁻл +O5h&Ia'ԽdQ:>]VC4Vsd~BANysk=uEG^/
ɴ>7YZivuCJq6_@~+W`Ȩ_ vK@ۏoH^'wf\'#L/!KI\Bi6^6wIՋu1~q:KftEKёc^u!;7qsr!?'sWp2ʫ(0?l$hN
*)G즛@{6:Tjq>r".-OOJZL`e+$'Ģzv!#:I
3Ɩɔ5W+)nwheNRƹxц9/`$(m +<UBucY{љb^4B)v"uNzK.RxъQBFYoxi8)|"89$Aȡ3Iwxyk{OXeR %^} diff --git a/prebuilt/libmedia/libavenhancements/lib64/libamffmpegadapter.so b/prebuilt/libmedia/libavenhancements/lib64/libamffmpegadapter.so new file mode 100755 index 0000000..ee8bbb1 --- a/dev/null +++ b/prebuilt/libmedia/libavenhancements/lib64/libamffmpegadapter.so @@ -0,0 +1,281 @@ +ELF + + + + + +' + + +dn`z2`%(h)fc4xDy){Bcŀ'()sE))ȿ l 9g4v|K/oa:Ap3Lj=9܌DE8E:Mmp< :CA'f<n %nو\ /FY1-k-{pX8PʡE +)6ŨBVߤQ{l(IFd<t + +' +:m:}::;{ +<x + + +CB ְ +DB ְ +EB( ְ +FB0 ְ +GB8 ְ + +A +I +q + + + +! +) +1 +9 +AI +Q +Y +aiq
y Y_O{C + +2@ + 4A +2 +| +@ +@9 + +`8j + K@9 ++ +@Mh +m +cT{AO¨_g_WO{C@!# +
˚ R)U*hr? +K +A~ )} +)qS)}@ 1 +k!* + + +k + +}+_ +`Ӫ +}@R,}R)}J}? +!T `I +a +@ +@z@T +@ +p}} + + + + + + + + + +@"@ + +
˚ +@A +
˚Z@&@ +C*# +;@ +@7 +)}(
Ț^@)!B +@2h +_WO
{H;@ +@1@A)CTI +?
+T*^@@yx +`g)A +@ +@ +_WO{ + +2@U + +2* +{AO¨ +O{ +@ +) ++@ +`?k + +@AA +@ + +@AA +@ + +@h +CWO{H;@ +@H +@# +@ +@a@@ + +@ +@e + +@AA +@A +@` +@= + + +@WB +@ +Rh +@ A? +@@ +@i +@(i +@(1 +@(ia@(@ +@ u@)2 u +@ u@)2 u +@` +{H;@ +@ +@3 +@@C +@ +@A +@` +@ + + + + + +@ + +@AA +@AA +_WO
{I;)@w + + + + + + +@@ C +aw(@@@# + 1 @@*H;@@ A + + + + +7v +}SSx*mSsx/@x+@3xJ@y'@@y; + +B>c +{C +B82*{__WO{*h + +
+*J + +B>c4 +B>c +B>cO{C + + +@ + +@BA +@BA +@ +@@ +H +h +@d@~* +@d@R!r*@b@RAor + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +H + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[aYSLg,3 rw`hBuX0B_o_2Ɨwe9]zc"+92!d7 +kCV
Ks̭z>nÝvuw^i9IdzZy:om]XArfLGEu0
3ޠK:<>gڄ,T!ܟz*>M8Y Zr`eʃϱ_Cy
j$<f!s +~auȲUi~sWJ%ņ{G@. +-fÝR|X5E1zt]{F}=)Feb2eg=ANLIԾ`oڤpįT+O
M+* +s)և I~Ʈfy$$)v1tŶ;X(Èkgn42 PU#]i,6`lJ%mioeƬ=gt[ӄ\(2R74AA<v*S^8A(c
,NI9a_$ywj"\%[#<dvE**]^$KƳJ%kI7{zg*L5Ķh +[R JF]h}thM3JW2-FZʿl +\*9hJLYޡZ""E92kwek2},*}?1FZ"Jx"ҲȐf-ˠS[f_VGQqo4@F5^qssXoUu"uzZ6GXמʟhǧ=}+L^X&zZD=Uxnjag⢎Pu)Mc# :wk`l~SIeAb62b>o]2D7-Ӌ_UbM*j[ƓŬNmV@Z̦ܲ|/?!WP7`t-٥B"C! +fz$RWw+>p^ȚGvА'u=9tFŒ1em"w,,s>`J齰/-y diff --git a/prebuilt/libmedia/libavenhancements/lib64/libavenhancements.so b/prebuilt/libmedia/libavenhancements/lib64/libavenhancements.so new file mode 100755 index 0000000..3ad0f04 --- a/dev/null +++ b/prebuilt/libmedia/libavenhancements/lib64/libavenhancements.so @@ -0,0 +1,43 @@ +ELF + + + + + + +! + +9 + +Q + +i + +
+ += + +a + + + + + + + + + + + +A=g + + + + + +@@ + + + +Sq=I[iQNTf3sJn@imW
; + diff --git a/prebuilt/libstagefrighthw/Android.mk b/prebuilt/libstagefrighthw/Android.mk new file mode 100755 index 0000000..04133b1 --- a/dev/null +++ b/prebuilt/libstagefrighthw/Android.mk @@ -0,0 +1,192 @@ +ifeq (,$(wildcard hardware/amlogic/omx)) +LOCAL_PATH := $(call my-dir) + +ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 26 && echo OK),OK) +OMX_PATH_32 := $(TARGET_OUT_VENDOR)/lib/ +OMX_PATH_64 := $(TARGET_OUT_VENDOR)/lib64/ +else +OMX_PATH_32 := $(TARGET_OUT)/lib/ +OMX_PATH_64 := $(TARGET_OUT)/lib64/ +endif + +include $(CLEAR_VARS) +LOCAL_MODULE := libstagefrighthw +LOCAL_MULTILIB := both +LOCAL_MODULE_SUFFIX := .so +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE_CLASS := SHARED_LIBRARIES +LOCAL_MODULE_PATH_32 := $(OMX_PATH_32) +LOCAL_MODULE_PATH_64 := $(OMX_PATH_64) +LOCAL_SRC_FILES_arm := lib/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX) +LOCAL_SRC_FILES_arm64 := lib64/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX) +include $(BUILD_PREBUILT) + +include $(CLEAR_VARS) +LOCAL_MODULE := libthreadworker_alt +LOCAL_MULTILIB := both +LOCAL_MODULE_SUFFIX := .so +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE_CLASS := SHARED_LIBRARIES +LOCAL_MODULE_PATH_32 := $(OMX_PATH_32) +LOCAL_MODULE_PATH_64 := $(OMX_PATH_64) +LOCAL_SRC_FILES_arm := lib/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX) +LOCAL_SRC_FILES_arm64 := lib64/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX) +include $(BUILD_PREBUILT) + +include $(CLEAR_VARS) +LOCAL_MODULE := libOmxVideo +LOCAL_MULTILIB := both +LOCAL_MODULE_SUFFIX := .so +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE_CLASS := SHARED_LIBRARIES +LOCAL_MODULE_PATH_32 := $(OMX_PATH_32) +LOCAL_MODULE_PATH_64 := $(OMX_PATH_64) +LOCAL_SRC_FILES_arm := lib/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX) +LOCAL_SRC_FILES_arm64 := lib64/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX) +include $(BUILD_PREBUILT) + +include $(CLEAR_VARS) +LOCAL_MODULE := libOmxAudio +LOCAL_MULTILIB := both +LOCAL_MODULE_SUFFIX := .so +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE_CLASS := SHARED_LIBRARIES +LOCAL_MODULE_PATH_32 := $(OMX_PATH_32) +LOCAL_MODULE_PATH_64 := $(OMX_PATH_64) +LOCAL_SRC_FILES_arm := lib/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX) +LOCAL_SRC_FILES_arm64 := lib64/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX) +include $(BUILD_PREBUILT) + +include $(CLEAR_VARS) +LOCAL_MODULE := libHwAudio_dcvdec +LOCAL_MULTILIB := both +LOCAL_MODULE_SUFFIX := .so +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE_CLASS := SHARED_LIBRARIES +LOCAL_MODULE_PATH_32 := $(OMX_PATH_32) +LOCAL_MODULE_PATH_64 := $(OMX_PATH_64) +LOCAL_SRC_FILES_arm := lib/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX) +LOCAL_SRC_FILES_arm64 := lib64/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX) +include $(BUILD_PREBUILT) + +include $(CLEAR_VARS) +LOCAL_MODULE := libOmxCore +LOCAL_MULTILIB := both +LOCAL_MODULE_SUFFIX := .so +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE_CLASS := SHARED_LIBRARIES +LOCAL_MODULE_PATH_32 := $(OMX_PATH_32) +LOCAL_MODULE_PATH_64 := $(OMX_PATH_64) +LOCAL_SRC_FILES_arm := lib/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX) +LOCAL_SRC_FILES_arm64 := lib64/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX) +include $(BUILD_PREBUILT) + +include $(CLEAR_VARS) +LOCAL_MODULE := libOmxCoreSw +LOCAL_MULTILIB := both +LOCAL_MODULE_SUFFIX := .so +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE_CLASS := SHARED_LIBRARIES +LOCAL_MODULE_PATH_32 := $(OMX_PATH_32) +LOCAL_MODULE_PATH_64 := $(OMX_PATH_64) +LOCAL_SRC_FILES_arm := lib/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX) +LOCAL_SRC_FILES_arm64 := lib64/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX) +include $(BUILD_PREBUILT) + +include $(CLEAR_VARS) +LOCAL_MODULE := libOmxBase +LOCAL_MULTILIB := both +LOCAL_MODULE_SUFFIX := .so +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE_CLASS := SHARED_LIBRARIES +LOCAL_MODULE_PATH_32 := $(OMX_PATH_32) +LOCAL_MODULE_PATH_64 := $(OMX_PATH_64) +LOCAL_SRC_FILES_arm := lib/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX) +LOCAL_SRC_FILES_arm64 := lib64/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX) +include $(BUILD_PREBUILT) + +include $(CLEAR_VARS) +LOCAL_MODULE := libomx_worker_peer_alt +LOCAL_MULTILIB := both +LOCAL_MODULE_SUFFIX := .so +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE_CLASS := SHARED_LIBRARIES +LOCAL_MODULE_PATH_32 := $(OMX_PATH_32) +LOCAL_MODULE_PATH_64 := $(OMX_PATH_64) +LOCAL_SRC_FILES_arm := lib/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX) +LOCAL_SRC_FILES_arm64 := lib64/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX) +include $(BUILD_PREBUILT) + +include $(CLEAR_VARS) +LOCAL_MODULE := libomx_timed_task_queue_alt +LOCAL_MULTILIB := both +LOCAL_MODULE_SUFFIX := .so +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE_CLASS := SHARED_LIBRARIES +LOCAL_MODULE_PATH_32 := $(OMX_PATH_32) +LOCAL_MODULE_PATH_64 := $(OMX_PATH_64) +LOCAL_SRC_FILES_arm := lib/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX) +LOCAL_SRC_FILES_arm64 := lib64/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX) +include $(BUILD_PREBUILT) + +include $(CLEAR_VARS) +LOCAL_MODULE := libomx_framework_alt +LOCAL_MULTILIB := both +LOCAL_MODULE_SUFFIX := .so +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE_CLASS := SHARED_LIBRARIES +LOCAL_MODULE_PATH_32 := $(OMX_PATH_32) +LOCAL_MODULE_PATH_64 := $(OMX_PATH_64) +LOCAL_SRC_FILES_arm := lib/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX) +LOCAL_SRC_FILES_arm64 := lib64/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX) +include $(BUILD_PREBUILT) + +include $(CLEAR_VARS) +LOCAL_MODULE := libomx_clock_utils_alt +LOCAL_MULTILIB := both +LOCAL_MODULE_SUFFIX := .so +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE_CLASS := SHARED_LIBRARIES +LOCAL_MODULE_PATH_32 := $(OMX_PATH_32) +LOCAL_MODULE_PATH_64 := $(OMX_PATH_64) +LOCAL_SRC_FILES_arm := lib/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX) +LOCAL_SRC_FILES_arm64 := lib64/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX) +include $(BUILD_PREBUILT) + +include $(CLEAR_VARS) +LOCAL_MODULE := libomx_av_core_alt +LOCAL_MULTILIB := both +LOCAL_MODULE_SUFFIX := .so +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE_CLASS := SHARED_LIBRARIES +LOCAL_MODULE_PATH_32 := $(OMX_PATH_32) +LOCAL_MODULE_PATH_64 := $(OMX_PATH_64) +LOCAL_SRC_FILES_arm := lib/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX) +LOCAL_SRC_FILES_arm64 := lib64/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX) +include $(BUILD_PREBUILT) + +include $(CLEAR_VARS) +LOCAL_MODULE := libfpscalculator_alt +LOCAL_MULTILIB := both +LOCAL_MODULE_SUFFIX := .so +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE_CLASS := SHARED_LIBRARIES +LOCAL_MODULE_PATH_32 := $(OMX_PATH_32) +LOCAL_MODULE_PATH_64 := $(OMX_PATH_64) +LOCAL_SRC_FILES_arm := lib/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX) +LOCAL_SRC_FILES_arm64 := lib64/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX) +include $(BUILD_PREBUILT) + +include $(CLEAR_VARS) +LOCAL_MODULE := libdatachunkqueue_alt +LOCAL_MULTILIB := both +LOCAL_MODULE_SUFFIX := .so +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE_CLASS := SHARED_LIBRARIES +LOCAL_MODULE_PATH_32 := $(OMX_PATH_32) +LOCAL_MODULE_PATH_64 := $(OMX_PATH_64) +LOCAL_SRC_FILES_arm := lib/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX) +LOCAL_SRC_FILES_arm64 := lib64/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX) +include $(BUILD_PREBUILT) + +endif diff --git a/prebuilt/libstagefrighthw/lib/libHwAudio_dcvdec.so b/prebuilt/libstagefrighthw/lib/libHwAudio_dcvdec.so new file mode 100755 index 0000000..b41922d --- a/dev/null +++ b/prebuilt/libstagefrighthw/lib/libHwAudio_dcvdec.so @@ -0,0 +1,83 @@ +ELF + + +03/K + hRA + + hRA + +OQ + +@ +p @`#9S'0Cb. +2b + +*FB +B +f(r` a +pc +@ +0 + +F@ +@ +Yb(@\bгZ^먳 + $?H?IxD?JyD + + + +hIiyDjJ +h1 +bHxD +6 + +8 + + + + + + +6A +XFBF + "O@ + + + + + +G +xD +!F +(FoBF + + GpGF +pR@ +p@ + FRR +Nreu h +.,dp
.pldpcp. +pJ +pJ + FoG +$ + + bh^h + *HPh + + + + + + +A +"&D7zXZ +S*8ZlD"(-ET + GѷFHcD혡ц>,~ +_lmjT9t]gy!)BOٖ`:ڇIÕj8vv5ME06.>8dKf!,ҞxvH}0XlR=Ȕ
V`ÔP ,]k0MC$(,xwA ӐoCa }?+yD:5T?Cy0-~ bq?wxm[y*fXCBg +V[`T9[ [A +ߎ/N#cfK`9.&z$X/Hb >o|?o'W+FZNyBh+y4gQ >3EJV0ˢ_.i]m,8lọ=M]~/|3|[GI*}`<I9 YIaMYY%,|_f}_`|MlM
b;OĐK+shk%c7w̚xx$}ѪVmlr^BVQw\H(bJϥY.%~u3]Tt]Hkq"jcys|t|. +mʜ7[)vִb&}wsQur~5ġGܶIC8|''= 5ui[iٗBB`P
9shM~⠩5Dtb^;$Lwֽ TcyFmx.BHMM9p;:%R;N" x˜QLlq_jfe.Oi5<18N5RePV;,##ԛphQ?ݠ#6)f;=.27$ʏquK-(y\"9=7IGdhf|L{$[L&GV%ӯE]yWF$+A.[݃љ}PN)E@ŀʏeG_E>_S0gUxh]i`12oPWC֩1o,nk*/y9tpnqjƼD`='7կQ9Uy4F_5z4yT+&&؋~_ɏE8esLnR*n#|^=Rvm,yM92P&#=c\~G.Ta%t +B.b1h*M<3mJ9- ~yaD| + + diff --git a/prebuilt/libstagefrighthw/lib/libOmxAudio.so b/prebuilt/libstagefrighthw/lib/libOmxAudio.so new file mode 100755 index 0000000..ee11da9 --- a/dev/null +++ b/prebuilt/libstagefrighthw/lib/libOmxAudio.so @@ -0,0 +1,84 @@ +ELF + + + + + +03/K +O0O1gHxD +FA
+A +K1a(Frp +FyD #F,P$ + ++b*-bJBJ$B +4B* "bd S+8F` iSB(K2 !" "| +`7F + + + +
L
0 +IJhyDzD + + + + +X +Oa*A*$A +!Qcc<n hK+(!`N + hB. F%`p + + + +6A +XFBF + "O@ + + + +FVF + + +G +xD +!F +(FoBF + + GpGF +pR@ +p@ + FRR +Nreu h +.,dp
.pldpcp. +pJ +pJ + FoG + + bh^h +?o/o C02 +@-@ + + +/oo +@-@ +j +T + +`V +V + + + + + + +A +"&D7zXZ +.f7Z*M8u%2M/Q2>8S3`L[Q;ND-t]3i~kǍXb19.Tkkx@[X>T{Khuw#E6^x<wխ7dyS.ҫ&d3ěd]5 +>đ(3pb ᒢǔ^4:E]E[ӟ.4 X +
`YMA3Vi܉gÒF&@2]=qHKgsa47P[ja5~n~-Ѿ mƖ-P1Τ_ +P.[u*#;l]}÷IrLYwVRض0/"h8^! +MXvúOکqY9i(+q{Rۈ+K#zmm:>AnlnVziK +xc;AL7l^fIZw`21:vGm>!(gGpƔѧe| <FKs7l-r5Z?6Lbs*ԖUx7Y{r hP<h]<7pKǛ I!bO\ޫY.btB mp7<V1&
3RճvQTXik]Ҁ.4C?v4`
Äsf'_n]B<`*卮rʨkhs@g>#8F2̴1^xBh +/b V/2uz' .ҋǮXNnDn<2m#e!mVDE<w>JפOuLlW5h.X1m4~!`;&dwʏ1o:q3Ca7wF=mSșU$ GTۓ*v{$y?M
aL*drٹa})
c%×ҞCVFPPHQaxe"WeJ[U*\E~ 0Dۆm*';KI!ݻ8FU{txܙr&Q=t/ДK>:US) kx!{"7Ld%{H&`a c.jd&ECLr=_("
jJ@p--Bog2M8@m珄<drw2g ɥ~ćd)LxhfB
~]uG#+)4+' + diff --git a/prebuilt/libstagefrighthw/lib/libOmxBase.so b/prebuilt/libstagefrighthw/lib/libOmxBase.so new file mode 100755 index 0000000..66abdcd --- a/dev/null +++ b/prebuilt/libstagefrighthw/lib/libOmxBase.so @@ -0,0 +1,72 @@ +ELF + + + + + +* XHНJ +bCQw*'dm0 +d~+vMA)ZkaS:~1v'[jvCEST}1|(U){V@B:* + + +03/K +AIA +kbh`pGF-HF +h@hh +- +o#Da`| FP@ +IhhyD.( +(FPX/AhBhB2BъB +*nB`m0eiF F + + + +6A +XFBF + "O@ + + + +FVF + + +G +xD +!F +(FoBF + + GpGF +pR@ +p@ + FRR +Nreu h +.,dp
.pldpcp. +pJ +pJ + FoG +hX + + bh^h +j +T + +`V +V + + +A +"&D7zXZ +3`(ݤ#|.f +Df)+ȲԤr9b +
v[k7j +5NW"cc6@1/
yз+ST)yh4[Wqso?h# +ߧbBP+S!Cl FG><PǥF!zK9\3et
>NJɏ ';б +W1tosmd3:\ZG
yUjoa,&M;0v'ꏒ>NS.~ +;2:CRhEb[ŷV4IFՌU +0a֫|Q{O"x&y+g9dgͼHΑU=MGǼ<e-|YF}IM +^v#2"`2_
T1g;-_^1i5Bݮ +}mՖ,[Y85#`9D` !s)"Zk[5o#fe;#8%IJoWsV ;wߡ}dSEgf5)7dG&UeNx\Ⱥ6.TtӅ
Tf#?Qɷ9xFмu#/i;#$x'cH#{zo㑤fúX:UNU572b+AMhz1;y1O-^IHkBqr/# 66@eAHt-R~I_R@}0(\S5MleJ+L!.rwݢgm+s5 +};|e;mXp=Kb[]rON3]ECf!R%Dg:\+7EDp9|%"zHlKKVŃ'*ew<7`ݣntta<wy?E?btw#8Z="E%5e}a
bwyJ
hToW(Vhwκ\N mY4K9D0PMѓ + +:>5XAs}8U"/Fv('0
B[ԞfLm~^ĘqVQ$|el@aȃ\bO崁۫By\]m_!a7wT"h$Pj'u96/zOPڻݡrfmg еWkT=N%!Bc2J<sy恹R!hwjln*=
^)<fk\j$eE3|eC + diff --git a/prebuilt/libstagefrighthw/lib/libOmxCore.so b/prebuilt/libstagefrighthw/lib/libOmxCore.so new file mode 100755 index 0000000..800c3b8 --- a/dev/null +++ b/prebuilt/libstagefrighthw/lib/libOmxCore.so @@ -0,0 +1,50 @@ +ELF + +03/K + +6A +XFBF + "O@ + + + + + +G +xD +!F +(FoBF + + GpGF +p!P +pR@ +p@ + FRR +Nreu h +.,dp
.pldpcp. +pJ +pJ + FoG + + bh^h +-------------------------------- +ARCH = %s +author:aml.sh multi-media team +branch name: %s +git version: %s +last changed: %s +build-time: %s +build-name: %s +uncommitted-file-num:%d +-------------------------------- + + +A +"&D7zXZ +%=x4Gtm*FO-{c*L<z4ghkPbpŌEğAuRaܳ2g0[돿gaUU
M7GfѨ%SBZ4~M}{9@MHBX}!*rR2H}Lqx[9`Osp#[ [ +3I*i ,d~R>]0,
A "2*mFF۹ +]cpף䂘Y-vo:9;Ʃ;QR-dAM̷8'%KE鄙$T3xLں +fyDiFΈ&|"<͚sBjjDy]-&R3KM8s̲\V[c
Liy[ =W۶ bsV_O +ZPK$OƼlfw!٘IqUҰ"d
.ity+4{tLK#gG}v}:4=|3rXpoךOXf(D[cM5yVyBr
+D +{,1 -{k`6sk\[`ڿS` t9]@m=Sբrg#y@̶]|5-HT*Qe퇞"d %'95/Bs?ZZydoJI&`UŸd^of diff --git a/prebuilt/libstagefrighthw/lib/libOmxCoreSw.so b/prebuilt/libstagefrighthw/lib/libOmxCoreSw.so new file mode 100755 index 0000000..7b17ef0 --- a/dev/null +++ b/prebuilt/libstagefrighthw/lib/libOmxCoreSw.so @@ -0,0 +1,51 @@ +ELF + + + + + + + +h!F@ +03/K +. 4 HFxDP!(F +$I% yDX F\.HxD&-HxD + + +6A +XFBF + "O@ + + + +FVF + + +G +xD +!F +(FoBF + + GpGF +pR@ +p@ + FRR +Nreu h +.,dp
.pldpcp. +pJ +pJ + FoG + + bh^h + *HPh + +A +"&D7zXZ +19R$֑!] Lڒ렛k"IbRj"&>a)PVQ37UvJn
U@G8 Zwa+Xv8<Zi +rBG]Ӄ)o(ndZ$ +bC4}
@kEқBUp?nYyDs1=`ׁA7hĶYU]xI*uVhwue,qnKWlnĆUU3Gy/#y@t(R1SGH3,D˅ARywȝt<b<O˳̦Vg 8ZNQ6KV^[A6\t5FZv(*Q.J~g!5"r뀳%;ǠJB Rr]aKb-;Ja<I]n 3ΰ]|kX58WUo{>vd5]ꀟa4:Kʍ>#mp"۾zGX<Tkf#EI,5F}eoSn)h+L%0'K+`n~pxݑ4N`6~cF`\fP#oPDQ34>] A"*,´XNRCߴYn_:^":W_RgmTK(km.x)>Gi(XXr3@,vH~`O%ش"U"լWc-tWjHj&pj(48-4@ SfҼ{XLB2OϭaL<5Oid2ʴO~Co1|b +Hq&ϭ?¡(72;$7,ubݲxT910ug>hup(W/a:sٞG-沄*R2Aߘސ`>RSaJ;ejh,Q<K}hóhC15H<HD=$@jDi|AK@ǙWWz%)K1b +X,_DL`h3Bl}iK|)5펑l5ջxz2)4Sv +&/IihR$ pm~P%]HܓR@oSivBR~++Z*5y;}^rr*h%?O,#a}l^QF +$}Ml'Q"1mlz~O^W"PuA_mEzP|K%7H{5te8=w}]D!)"^ПZ!'v\kСK{u/ډ*^E&"Zcˬ`JC}vq) +*k]Zj>dŤ>1ZYJ+qxoS\;&\uh',|åS݁<7tVWU7g77}zLz-.%(g=lP diff --git a/prebuilt/libstagefrighthw/lib/libOmxVideo.so b/prebuilt/libstagefrighthw/lib/libOmxVideo.so new file mode 100755 index 0000000..0ac58e0 --- a/dev/null +++ b/prebuilt/libstagefrighthw/lib/libOmxVideo.so @@ -0,0 +1,3191 @@ +ELF + + + +x + + + + + + + + + + + + +| + + +> +y +@@ + + +zP&[:\?BM=tki5niqsoCoЫ]Վs<]ޤmmc>J==rlr21}q +jQOWM`p *D,uKR
`(/5'K3 +g7%G:M= i퍑 _<v.v +x+vF0K}? dL=4db[ky_Mc$t
1vCݏf
&n1Ncu<37_- j.Ѓl^~ϴT9ȗ_znL:RRxN35zo$
O;4n\Ǘ<IQGfVogSSBhb6wNι]arʏP.\Џ`nN]UpؓE/1a¥?YSHapM:o_Hz6>T.Ar_lyTpnw"'zV)t%8=34t;g $X ZWվN\MҨ,Re)H/hV+SF%-Xc
tI`L7yKTk+{g`rD.f] +ΏJ *ԏ4tؓuO* +;OQ%QK/Z4
͚Dߗc,uYj 줚{y4 +&
vp+xDGDUI QC(nb6D.0we +di^sPk2<egM=Wi+$x&|:F'q=3F88]J + +,e%fEWvVbChÝhpqo@|W1zԚ1ϝgE%z>T.KY'h|\R')h#zlu48Q-mWW5?81"إJqX4l6ohm8Q jE+5yť {t|bǦ>4HIiK/[< 7dh7J +)ɇY8"Ie +k + +k +f +| +|yu qqg + { + +h + +` + + +~ +l + + + + + +l +x +~ + + +n + +o + + +} + +s +vziii +l +e +z +y|l +px +
d +
f
o + + +h!F@0k +I"yD1` +03/K +L|D FHOQxDH +( +IyD +I
yD + + + + +! + +P Xpquaajfta@* + +``te + +O pOp`hoI.0yD + + F@ +@ +HF F@! + +(F@ +@ +hl%F(F@! +F
IcFyD h h +IF +J yD +zD +zD + A a = #amIJ (#(#yD#dzD3%hh* + a a a I J#yDazD d a
d +\0;*F.ȿ&8F2FOs +8FVhBh +h*@hJh +F5 )F +Ib6LD3LABFAȿCL +D +u((FOryD !D(F(ѝ +F5P +,D +D +D +$597P;" +p6H"j +` +,(xD, +|D +u +v0FnO rXyD?h)L,|DhzD !FvB !Fp0FP( FAFb +uX`d +FF +r +t F` + +x +p8 +p +p +@FX0"HCB, yDzD@FPF + +X 2F^?݁D^h)@vD `t p+yDzD@FQ +-%A01 +u(FX0(HCB( yDzD1?Q +,C +C +C +#59 +v0F$@yD. +,zDA +A +A +!5 +y hh*q)`C(FO@a" +vF0Fz +,zDA +A +A +!5 + +v0FX)FO@b?h)HDH$|DhzD !Fբ !F0F(F +(@ $yDzDK8FF` +(FO!U"@
+ +vF0FB +,zDA +A +A +!5 + +(I yD + + + +(S(@JA*(0zDXa +( + +\0;*E-ȿ%0F*FOs@ +I + yDH$ + +E + + + +BXJ + +2N3J~DzDT1F
+PIyD + +#Y@P@C5GI +9I* yD +t:F+OF+MD}D@X + f ft +Op!p +H%FxD +0F + +w0"k +(F(F勉 n!CnGF+1I1 yD +H +MO + +FFHxD +xxCB2C +DaE2bE$ + +B +0(FIF"F(FIF"F(((FIF +/1
,OG +x( x(ؿ +@ +/KO +, +< +L +X + + +E + + + +DP[xkp]%dx +ѹc +O + +O +"<"pPYRPR@ + XZRQQPQRQA +
bpR|*gU]`b +@"&O + +0F +`O +(V(h +( +(! +PF? #+FyDzD #+FyDzDv`h2JCٱpo8Opa Io8Ob " yDJ20zD +(#0 +(0# +(Z(ѭHxDHxDFHxDFHxDI3FJyD +!jP I + + + +Icj +yD `j(8 + F + + + + +H + + +EO + + + + + + + + + +0yD(zD +D +|hJFAF0l@ + + +@ +@ + + + + +Bܔ +"yD + + +( +\ + +P +\!@ +, + + + +0 +) + +0 1+ + +2 3- + +4 5/ + +6 7% + +8 9' + +: ;1 + +< =3 + +> ?9 + +@ A5 + +B C; + +D E7 +yDF |RG + "T HXi(@ +G + +g(EFoј +F(F!(@\ + +(F! +@poRF + +E
LehyD. +-HE +cHI HJyDzD } + + + + + +@ +@ + +( +LD2FLC +FBCȿ +O + +xD'F,, +xDF +xDF0BBll*yDa +xD +LD2FLC +FBCȿ +O +*(!B %yDJzD L1ooEb&q@P@C`F%yDbezDG + +xD + 0yD`* +@! +IhyDR, h1 F, +QP@O8`*d +t + F + +11 + +(F@ +@ + +(O8%pA + + +FD\b +8'zA 9F +JzD# IF3F + F F F &f^ +F")b +F:&)F"%zD +r + +(F@ +@ +(F +NF~D0F + +HI@J yDpzDNLP0I6yD +\!(F H)F +$ +(c! +u +p@ +u +p@O +xD +Fȿ#O +Fȿ#O + +/ +)i) +FȿO + +Fȿ#O + +\k#X+~D +F + +q +( + +O +O +8'zAO* +9Fb +dd)3F yD +A + +( zD +lC@ +F + +-EY`1 BO O i)ؔ +FC +p +p@ +G +\""1F +;A +pG+b +;A +pGo +9;@ + +H$xD +H$xD + +F
IcFyD h h +"xD + +1)`{ 0pcC1 + 0J +1BA1i!uv +Svv)h1)`u +>p F+F +ApG +o)hD +qq!qq"3rqrrr1srsss!r\1)D +"1tpttt0uru4(h2I0(`1yD +f +aO*@ + +0@*(h0(`u +yD h h"鐠 +@@0
@@0#@3+ D +$0 +@ + +@@0
@@0#@3+ DH +$0 +@ +aF +p F + +ApG +o)hD + Bq"qqr#BrrrsCsss"\2*D + +#tAtttuCu)h1)`u +f +aO*@ + +0@*(h0(`u +yD h h +D\a9))3cEӐ"I + @pG + +!d + +IyD +E + +#Fh +? IF]hxx( +"yD0Fr\ )F0F H豔t + +1 +:`o! + +9mHIHyD^)h F +1)`>D + pbB1 +0 +A +! +"=KD{DY +st(h0(`u(F(F<p,I,JyDzD'I(JyDzD + +IxD +JyD +2 )F +KFO0F +.Bw +, + + +
+A + +E +P*pZF +oa
oAo!C + + +)g H豕t +IF +,C +2C +B +":iD@rxiCD +t'%I+F + + + + + +EP@O8`*d +t + +``qhA`qh`p`0 +11 + +(F@ +@ + +t??I ?J0yDzD +(O8%p@ + + +ED\b +8'zA 9F +JzD# IF3F + +F")b +r +c P + , + +HF@ +@ +HFHF +u +p@ +u +p@ +o +FȿO + + + +o +FȿO + + + + +W +0rdF7DVP) +0@J B+DRqb + ++ +)i) +FȿO + +o +FȿO + + + + + +(zD@ + f| +j +%`#F + 0%yDzD v8D8 +q +( + +O +O +8'zAO* +9F8 +#3F yD +A + +J zD +lC@ +.H1.I/KxDyD{DZ +p@ +G +[""1F +p +`F`iq9 +qq/r@irr0 -&.FcAO ?-AO +j|Cb0B"D6>`pCa".A!7!OvOwyD&'yD&`'yDOv'yD&x'yD`"#0F +iq9 +qq/r-A+FFB O +kr+rF -OAAa^#| + q + + +Aݪ + + +F. +xDyD +h +xDyD +xD +xD +xD +xD +xD +xD +xDyD +xD +xD +xD +xD +xD +xD +%-F +?GcC#3C* +-F@
EFQ#D + + + + +F.! +
@o0 +(yD + + +h('8D. +)#4.zDQ$,(9Ss# + + + h*F)`fFYF:F|, +A!Aݪ + + +F.#B) +
@o1 +DR)`Ss# + + +$)ȿ@9D(ȿ@8 @0`7h5/O@ +@ + + "F(Ѐ( +
@o0 + 0xx +-F<F-OAAaxA!cA")4 +x)-E +(& + +-,*FF?OA + ² + + ++ +-LF ++ o"߿ + + + Bj!.-ZF +0xx(OCCbB" +-F + +!2C@ +B +@"o_1%Ѫ.- + +@o_!) +? + + xDHyDIhRr " +? + + dyD +? + + 4xD +FFF-7 $Da+xA!- _-y1C@*C ' `x xx6Fa- + +)+ A +aA!(sq; +CqF@yJq7rzDsrrha .(-߿- .FMF + 0xx)OCCbB +-侩F `@xx!-Aa(A!F&FF-uF"FA,0IDBbB" x{. +0FF +%s +( +I JyDzD(\!(FH)F +F h$MIMJyD#hzD +h2 +` +I yD +FFHxD0F +HxD
I
yD ".& + +IyD h h +! + + +-A
F +"xF F(FV +"fFHxD +` F + dll +0 + ++0 +* + +zBO + (b! + + +ikk
+.h +2k +JzDhR# Rh:FcFhrFF@`G +L|D$hT" +G + + + + + +( j)F(2' +(BB I +O +0/ȿ0'O +pi +0A +8_x +*Q1A0" + +p(x + +ѨhBI + +II + + + +hha +hhaa + + + +H +gI +OzpAF2F +QqB8FF.F + '( + +p@ + +՟, +՟( + +L$ +F* + + +pGff??̌? +@ + +i`hj`a( + + + + +!aabbhao +)08A"eO2b(`fc0`'* T +@ɛQ0(AO + YF +@zȋQ0APFF +F + +L +eIe#hyD +` +d a + +tF +H +й A + + +`9F(h(h! $ +ii@)"²(F`!z F +$ +`oo +iC i@(@ " +$A +aoo !e hAF h!9 + ii@.@@ +iA d
d +$ +`oo +iC i@(@ " +$ +`oo +$ +`oo +2FiA d
d +$ +`oo + h!9 +PF5 + +L |P +0F)FDQF +O +@h Q0( +DOp5B +
+g*B
+B*0g*a +B* B +Pg*a +B*@B + +a +Կ `Q0pG +@pi Q0A09 +RE9BFF +@F +@pi Q0A09 +@pi Q0A09 +(3 pG + +(O +(wsBЙ 1t
qt
tt 1uqu u +(1 b rr + r @j +r @pf + + +Ei +J )FzD + + + + + + + +!2F#F +F !F*F`) !FzD +I yDH!oxDpO6 + F FIݢ yDNB@p& +xEo +yD h h +vdi_get_common_memory, pady:0x%08x + +monet.bin size :%d!!! + +VPU INIT Start!!! + + + eO + hA1.0 hOq + + + +`fO + h^?@m hn!oD hOq"on h + + + + + + +sC +,P +qA +q@A +qTA +h + +P + +O +E@r As? +? ? + +COq h"Oq hjOq h +FOaqbXrO`p"XLF hf$ h1^8 h1FVL hj9FP67 + +D +D ED h`!Oq< hOq6 hp!"0 hOq + + + + +IjyD + Fl + + + + + +!` +IyDIyD . + +мI cayD F +kH(l8hl(ll +P@yHxD +bhyDh h +`)h0FF i(VD'h(h0FVD7 iB +)h0F`hh +B0F + +`ha`j0b J + + +۞HxDi1aHO1xDA`!bI?yDH`@H!xDrT0OQ +\zK +TJO +B +"X + + +yDB +*h@,ATX3P!`2N2J~DzD1ml0l +` +ch +}D,!hB +cJ`zD4 + +lT0hBh#DB10#I +HxDk IyDj"HxDi9a@h + +` +a +IyDHh + zAEa +ۼ +ۼ +h1` +@ +Q<`B +IyD h hb + +h +A +T`B +IyD h h +h +C +T`B +&`He +xDB +*hA,ATX3P ` i!hJhzD +p"퀈 + +0HL +xD +B + +<l +DB + +zDh2`hRLB32-#I +L +R +(` &HxD +Y + + + +D`h\ +hB31hb +L + +HxD +a +sDa)1F+ +F )9D+! +* +*: +: + + +p +s+a( F!Opi B0aBF +Fgo +`Q0(v +!i! {I+*!z` O0(` +i0a + +hB + +@ + +i`hj`a(Fo)F +%(p4(FP +"G&OK + + aaiab caha +)Qr +fdA{Fv&dIvfeI&eBF +I J;FyDzD F~ +ff g `g!D + +* + F)FP4 + +t* +DW + +`9F(hF(h! $ +xD + +@ + ll + + +@ + ll + d h h! T +1bJ +IyDzD + + + +B F? O + +!" +Q|$!!zDOR\DodD + + + +2 + +D 5T +#\ + 0 +@"F +c + + +8F +D0\6]P + + + +uFD8FM}D,]4D 0__ +D] dLU5F +N +D + +p + +b DYIE +@F pW +P + `wr' + r' @3@! HB%xD]H +xDD +DjH56xxD% ]@+HxD];j + +O +7@# + +*XxxG' +[x + +U +q$U@;(/ +" + +J +T +U + +3+~?D 0rH + +GL7H_ +BO A2J? +A&OuV +"H0Jp +3q + + +@T! +ER + +@ZDЀ + + + +BD
E + + +O~PA*O}Q%IFA +B +A +O +F$l +F + +2* + + + +qgd +O + + +.ܰ + +l)F0FB
a! +!LQF0F + + + + + + + + + + +e@RLXFDF9F ? +** +??-@ +* +B*A + +0 + +l + + +QI + + + +7Q0S1+@ +A1pk +(3 ;+ + +@F)FDaFF%m- +0PH,P +3SHmbDS\p2D)D9DEp 1D:DwFB + +mp0 amwFAIBOp8 IB + ! +"mm +P[! +"\0p +Bڒp +B% + mEVQUQPqEi(O +v + m) `o` + +(ѧ / +z"489/8"F + + + + + + + + +F + F + +PD)DDOq +Qq!D?BZTOXrOXb + +E +D + + +HxD +,*B +,
*,G'7B +,
*,G&6B +,
*,G%5B +,
*,G$4B +,
*,G#3B +,
*,G"2B +,
*,G!1B +h hꈳ#yDzD#h V Fv$yD#hzD#yDzD#yDzD#yDzD#h 2 F +ڪIJyD +b
@F@F +p +<ua*uO!LO!P |^"C*AJ#"dhFt +Q`@do&,o??&
# +sX(:@FYF*F4dD@+h +#N'F + +D +=к @d +qlP +F0F)F:F4=D^DDE )F +pl + +J + +qOa +DW + +`9F(h*(h! $ +xD +!n +E + + F!*F +&
hrP +xR m)FFgafaP0 (Oa{8O +!n +E +MF)F +`y + +.?k0ct + F +8 + F!*FDWD@&t +0y4 i& h F +x mAF$FgafaP0 (Oa{8O +`y + + hDQ +F . + F + F`H\ +pH + + + +h +&7 +2 + ( + + + +y +`p +[ + +)ѐo + +#\ + +L5 + +A'!! ++ +FO+ +A'?! +- + +fHH!xD`
+ +@' t +l +O + + +ID\ kIyDa
+N L + +O +dʛ + + +@D0F^ q$ + +O9 + + +p + + + + +B T +hWYp + + d + + +* + + ! + + + + + +*1 +!l)۷ +:2*1C + + + iEVQUQ@ + +՟, +՟( + +L$ +F* + + +pGff??̌? +F +@ + +i`( + + +**!a!bbha +
c + + dTUeaa +!` +\ +(F +@*2l +݀ h0a +d0IyD h h\ + + + +PFPF!<(F!
Oy/\Ow, + # + + + +p` +t)`1F +,QC + + + UE)7B(D"^\X
VH.xD + +@ P! PA%gjF%HG%J@G"R$T!&VA(Xa*ZBtE AaEF . +O"M"M'"M7BBBdBBDHFHHHJH]JHTTTTTTT +FtD FBl + + +O + + +ܰ" +ܸ + + + +FD + +O + + +ܰ" +ܸ + + + + @W|h Ok + $ O+
+P\ +DW\ +DAR\z' ' + h/ +@ +$ +FO +D
3D +Ff7 +Gg&; +Cc#C#&CC 4$4(44#S#S_FײV +RTB+DBB'D7DB"B@$ +^E% +VO +FBWB"K6BT$O b BBhB +WOFWv +P +D2D 2CnChSCSC#
+'y +Q +!!!!+]]9DG2]!O!&) +` +xK! FAA` + +Bb +Cc +Aa< ce(@_ R +DFFE#c0@B$1D1OL +HH DC +aAAHG + <DPDDWIP PGGG'@GTtOgGGG +0 +KCgGBB"`$0DDBPCB"Bbd$r2DCRC +
\ vO +OyxDi +nn + + + +I +J yDzDN F@/dev/amvideo + +)hE1mF*Fa +D
+!`IyD h h~ +)hE 1mF*Fa +D
+!`IyD h h@ +F0h
E12FF +E
+?(` FI +p + + + + + + + +"#d +FI(yD h h + +I JyDzD + +I JyDzD + +"#J + +I JyDzD$ +FE1 +FE1@h +FE1ڻ +FVh F# F + +FEC1@h +FEE1@h +FEG1𬹀IjFyD h h +FE1@h +FE1IkF@yD h h + + +I JyDzD +FE1r +FE18FACP + +I JyDzD +F`E1L? +ܽ@I JyDzD + +1 +/I + + + + +(F9F2FF? +HxDE +B +HxD0hBXAh + F)F6F? + + FF?p3@0BE0 + FP + +@ + FJFF +AF +`?%:I#F:J +O5f%IF%JyD +"HxD +P +d + + +H( + + + + +$ +kkkkkkkkkkkkamHC + +/ +'''''''''' ''HC + + + + + + + + + + + + +(8 +9
O0,
+9
O0"
+9
Հ-:!!G!!W!'!g!7!w!͇!!͗!!ͧ!!ͷ!H@J` +@*@'J@Gj@g@@7@W@w +@*@'J@Gj@g@@7@W@w +@*@'J@Gj@g@@7@W@w +@*@'J@Gj@g@@7@W@w!!G!!W!'!g!7!w!͇!!͗!!ͧ!!ͷ!H@J` +@*@'J@Gj@g@@7@W@w +@*@'J@Gj@g@@7@W@w +@*@'J@Gj@g@@7@W@w +@*@'J@Gj@g@@7@W@wpG-OS +@*@'J@Gj@g@@7@W@w +@*@'J@Gj@g@@7@W@w +C*C'JCGjCgCC7CWCw +C*C'JCGjCgCC7CWCwpG-FFdFO +! """
аNѾ!Ɍ
bb'b7!b 1a "bWbgbw%Pf`QqPaIBbb͗bͧb̷)j晴abbb-na +! """
аNҾ!Ɍ
bb'b7!b 2a "bWbgbw%Pf`RrPaIBbb͗bͧb̷)j朗abbb-na +! """
аNӾ!Ɍ
bb'b7!b 3a "bWbgbw%Pf`SsPaIBbb͗bͧb̷)j望abbb-na +! """
аNԾ!Ɍ
bb'b7!b 4a "bWbgbw%Pf`TtPaIBbb͗bͧb̷)j杖abbb-na +! """
аNվ!Ɍ
bb'b7!b 5a "bWbgbw%Pf`UuPaIBbb͗bͧb̷)j歹abbb-na +! """
аN־!Ɍ
bb'b7!b 6a "bWbgbw%Pf`VvPaIBbb͗bͧb̷)j殺abbb-na +! """
аN!Ɍ
bb'b7!b 7a "bWbgbw%Pf`WwPaIBbb͗bͧb̷)j流abbb-na +`RCJXII +`1RJ8 zDv5A pKL|D`h +xl<u0< + 1FdE0FOd + +HxD +HxD`hHP +`\ + FF(h*h#FI + +FEa + +(C +C +C +#<0h + +6A +XFBF + "O@ + + + +FVF + + +G + +xD +!F +(FoBF + + GpGF +pR@ +p@ + FRR +Nreu h +.,dp
.pldpcp. +pJ +pJ + FoG + + bh^h +?o/o C02 +@-@ + + +/oo +@-@ +JZt + + +@D u + + + ! 0bà01@Op@-̌!J#Z + +T\ + +0/ +``! + +6R#2"<$!R \ +R&^b1>!,° + + +Ѝ + + + +Ѝ + +j +T + +`V +V + +0 +, + +Z0[l +4ܧl +(,t&x + +)H14$56(8h<( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + do codec reset + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +;`@0ɛ @) @9! @ 1 @ +w + +Ș w @ + +@ +@ +@ + 8v + + +*:J_|@Lv + +@ +@@ ( + + +հx s@?@s +@ +ȉ`@x + + +l@ + +Zcl@6 + +y +ȃ`@ xx +Ɔ䃸l@8@x +l@ +Ȃ`@ xx +ްx +8F,h@9 +@,i@k +h@F +@Ԃ + + +Ȅ`@ +`@ +䄸p@ +4p@ +䄸p@t@@8A@8 + @ @ @!@ @1@ +$ @@) @@9 @"@ @2@@F) +'߀@@ +Zw +s +s w +s w +s w +Ș +Ș䑸 +Ã +Ș䒸 +@Q +Au +Ȑu +@܁u + +ɉ@Չ + t +@ Չ"ȋu + + + +YI9
) __) +p`P@0 +u +YI9
) ___) +p`P@0 +u +Y
I9) ___) +p`P@0 +u +Y
I9) ___) +p`P@0 +u +Y
I9) ___) +p`P@0 +u +Y
I9) __ޘu +Ȑu w +Hu +ɐu AuA +Ȑu + +@#@ +@}( +ɐ &@8 +ɐ@9&@8 +ɐ@)_8
+䛸 +ɐ@ +@ +ɒ@ '@" +ɐ@ +ɐ@ &@8 +ɐ@ 9 +@ex@KF @KF8@憸@T +@e@]ߌ@ +@e +Ș w +w @pB@( +w +@ +w +w@`) +w Pw +@e$ +@e@zi9@zi9@ziT9@6F41 +@e(%b@v# +@e +@e!1@ve@A( +@e!@ +@e!@3@v@=@!1@! +@eL +@e! + _Ih>MlI)v@( +@e2@KQ()C恸@pa@0@KQ()C恸@a4A0@KQ()C恸@d@0@KQ()C恸@Xd@0 +@e0D +@e +@e +@e! +@e1@Kq0@K0@ +@e1 +@e_@v +@e1@KQ @ +@e +@e)C@d3@KQ()C恸@d4A +@e@KA(x@KQ) +@ +@eɒ + +@8@48H@
@( +(@t8H@( +(@8H@T> @ +)t9H( +(@D8Ic(@ގ@0߀@!ߎ@+ߘuB48@ +ɞ +@@Q( +ɔ +ȋ@( @Nʊ( +( +@e8?߅ߘ +ȃ@T2@ 1@# +@߄=M3 @h>M @ +@ +PɄɦȄITX(V,@"8 +䂸@9" +ډ +Ȇ@(
@ +8 @BAĄ䂸@9@" +2@ +(Ȓɉ +$$2_(( +@(Ȓɉ +H +,-伸 +,- +,#@&@((䔸ێ䀸(ᇸ(Ȧ/89,ᇸ(,ᇸ(Ȧ)8Ȇ@4 +䀉ȁ(y9ը(9ȑ)8c +ɑ)@(8@)8ȡ)8c _ض +@ +@ +@c +AJ + +䚸 ( +@ + + +@e0(!?>@ +@e0 AAP*Ș +@e0 +@e OA@*Ș +@e ރ1 +@e +@e @ _ +@e1@KQ& +@eX(XY@cߐ䚸(F +@e@ +@e$@_@>@ @_ߨ@ +@ +@e wމ3@$( +@e +1@82@>@@KX$@@H@TD@ +(Ȑq@n(䪈Ȑq@g(2@1({@m8(8(8@z( +$$@ +( +( +@*(@P@:(@K +( +D +D +@l) +Ȅ@ +#@ +@e*ʷ=@#@ +Ճ@E߃@_@@Q߃@߃@_@ 9 1 + +"I!Փ䐸 +(8@8_@@=c0( +@8@8_@ _8i +@e8 +@e3 +@e# +@e# +"I!Փ䑸 +(8@8_@@=cA( +@e8 +@e2 +@e" +@e"@( + (@=cB1 +@0(;M- + + + + @Y +@T3 +@T)@2a(@$ +@T)0 8I+M@ +Ȁ䀸@4@ +@e# 1@ +@[! +@ +ȏ + ( +@e> +@e> +@[! H8+M8@KX" @$(@g, +
@ +@e&@KV @@g! + +@) @x91@8_@(9+M(@( +ȍ2M2M + + + + +@ +@ +@ +@ +@ +@e@6 +@e +@e2@6 +@e3@@3@@zi( +@ +@8;M"@ +@e"@ +@e2 @ +@e @H +ɉ
@P8 +@e2 @& +@e@6,@ +@ +@ +@8
@P(
@Q8@ +Ճ@ :P-"@[(@@q +rȈ +@k" +@e# +@e(@ᆘ,ᇸ +@e ?@, @ +@e) +@e8 +@e +@e +@e +@e?M@ ?M>M3@# >M3[@KS )C@pa +@e@@ +@e +@e<M3$@[%@(ՊȃlB)i@(h@ +@e +@e _1@8h>@`@3H@{&zO(@F( +@F$< +Ȍ2M@> +Ȍ2M@( 6}&(@v(@)@)ٸ
+Ȍ2M +@e<?@ +@e< +@e<_@M +@e, +Հ@@@2A!(Ւ@$@$4A( +Հ@@$@$@F +-&@$=6@4 +(Î@" `(8 +@V +$(&@, +@86@0(Ï@" `(8 +@Ȇ@Ȅɿ@ +@e, +@e,@4h +@8@@
0 0 +@e4?@q +@e4 +@e4@O +@e8@@T +@e8@@u + +i@LϏ`@ @+Y@@" +@e +@e@2@3@1@1 y$@8d@d + +@e1 +@e1=M1׃@@Y߹ +@e!@@ +@e!@@P߁@ +@e! +@e1vށ@@| +@e! +@e! +@e1ȩ@ +@e1 + + +@e@ +@e2@EW +@e +@e +@e +@e +@eո߆h@ +@e @Ղ@߱ +@e@Ղ@ȥ +@e +@e +@e@ +@e +@e@Ղ +@e@ +@e +@e@rՂ +@e" +@e2 +@e@ +@e=LչNߘXչ +@e@AՂ +@e" +@e2 +@e@ +@eU +@e@"Ղ@3 +@e +@e +@e@ +@e6ރ@ +@T! + + +Ã +@e4 @AߘՖ_@ +@e4 @!2H"ppHBPOp"ޘ _h) + + +Ã +@e6 @#ߘՔ_@ +@e6 @
0HBQOp"aH"ABޘ +@e + +@e: \Հ ضi + +@e0 +@e0@ _1@( +@̸>M@ +ۚ@ +&A +ۚ@@ۖIȊ@1 +,; +&@ɇH،?@z8@ +89 +&' +Ȍ +Ȍ +&ÆH ) +i@Q@\Q@W01(ظa +ȃ;M! @@6@38 + + +Ȃ;M6䂸@H+@2*:ހ +Ȃ 䒸@Y(@I8 +@e& +ɔ +@e +@e ( +@e +@e @( +@e @ +@e @y(@ ( +@e @ +@e @9(H@i( +@e0 +@e0 +@e0 +@e0 + +w +w +Ʌ + +ɐ +@ +ɐ +ۘ +߀@ @@8 +@@!@@ +@ +@ +@ +@@#A (>@ +@:@#@#:@@3 C +@:@#:@F @+@f + +@ +_@ +ߑb@ހ@խރ@(tD)Ԁ@ +J +@@<@:@@ @@,@*@<@:@@@ +@Ԅ
@ᐸ@ؽAᐸ@ؽ@:
@*
@:@ +@@@*?A + + +@ +@@ +@ +@` +@@@,@*@<@:@@ + +@@@,@*@ +@@ + @ +@@Dˎȃ&$VT@@@ؽ@@@ؽ@ؽފ@@@@@@ؽ@@@}ؽ@@@sؽ@@@iؽ@@@_ؽ@@@Uؽ@@@]ؽ@@@Sؽ + + !@3@* +@:@ +ފ
@
@@ؽAA@ +ؽ@<@:
@,
@*
@<
@:@@ +@@@,@*A[@:@@ +@ +@ + +@ +@ +@, +@* +@< +@:@@ + yފ@@3ؽ@@*ؽ + 2ފ@@ؽ@@ؽ + ފ@@@@ +( +Ș +( +( +(} @ @@( +@@( +@@( +@$@( +@4@(}@@( + +( +( +(
+( +^y@4@ +Q@@( +2iȄA + +@ +( +@ +( +@ +(
+Ra@$@ +2a@4@ +a@ +@Z( @@4@2m@@m@ +@z(@@$@ +A$@ +4ʈAڊA$A4 +Ó䚸@Ȇ +@@g +@4@k
@
@$
@4@@4@@@$A?3 +) +@ +@ +@$ +@4@@@$@4@@@$@4@4ޔA +@ +@ +@$ +@4@@@$@4@@@$- +@ @@ @*@$ @:@4'A$A$ +) +@ +@ +@$ +@4@@@$@4@@@$@4h)I P +Ȃx@1.}؉"u +ȁ +@(@@HA@ +@!ASCDq_@@1q@1 +ȁ +ȁ +@( +@ +ȁ +@(( + +@!SC +@!_@@SCbA3Q@(8@ @׃ +_@ +_@ ߂( ߁ ((("( +M$ +@@ +@@ +@!@ +@1@ +@A@ +@Q@ +@a@ +@q@@@@@@!@@1@ @!@ @1@z}0g@A +ȃx@( +ȃx 9@ +߄&ߢ7@ +ɔ +_@ +@A@A +¢Lۃ䂺9@^߄ +Ȍa_|@ + + +ɞ @ +1@ + +ɆȎ @ +?@ + +
@"@2@H7@ߘRB _@1h@,ߘԃ_@_@ +2 _hI +OY ;@߃ + +P +䃸䘺Q䘺Gߘ +@߁@P߁@߁0@E +@ + +$@@( +ȁ@( +ȁ@(@ +@2@24 + @@ZȈ@@2 + @A +@ +@# +@ +@3 +Ș + @ +@wW@"@3@@_ +@"@ +@2@ +@)@9@# +@ +@@ @@@ +@$ +` +@A8((Xt +@9 +@9 +@!9 +@19 +@A9 +@Q9 +@a9 +@q9@9@9@!9@19_@ @A8((&t +@18 @Q8((t +@Q8h +@a8d @a8 +@q8] @q8ߨa +@8@8N +@8@8G +@!8@!8@ _Hh9@ltD@߂ +9G +Ȉ'B@3BT@$2@ +@$R @S + +ɒd@ @@# @@#1tD@ +ȁ +ȁ$@ + + +ᗸ @@и*_@
}mm}9F=@* +@g9F +&@ )+ @ + +ȉ + + +) +@4_@@ +@" + +@2 _@Ը@ +@
*@= +@$$ Ɂ Ê +@ +ȏ +@
* (@$ +@(90@4 @ +@( +@8@ |_tD9@ܸ +ɜ@@䀸*( +ɜ@䀸* ($#$ؒ +ɜ@@ +ɜ@@ +ȃ &&B@& +ȃ @@+@,@ _Hi8@4 +@"@ Ɇ _@ +@"BA + +@8_@(9@$ +@( + l +Ɔ䊸@&*@93Դ@}߁ȉ + +@Æ䊸@] + @ +䍸`@ +CLg@h@ +1ƃ + ȉ
+Ȋ + +Lᗸ +ȊɎ4_@Ɏ@M (@ +Ș䝸`@ȍ(
+ȍ@@i
ޒd_䔙 +䞸@@=`@ @ Ñ`@ +nF@D`@ +Ȏ@ +ڸ +ϟ䞸@@@@@@ +ɞ}A ۆ˶@ +ɞ{A R +ɞA a +䖸 +ɘ`@ + +Ȁڿ0 +ɞ}A @ۆ@@ @@0(B@H@&H + +䋸@FԀ䋸@ 9@8 +ɛ @8h@Ȇh2ء8_@ _@ +*_/0 +ȁ@ +,۸ +!@$ M + +ق( +Ã䏸Ճ@7Ț#80 +4 +ɉ䏸
Չ@ᗸȪ)80
+@ +ɉ䍸Չ@ +@ +H +@@ @v@ +@@
@@
@@
@@ @t@ @H@ @@ @䐿ۀ䐿ڀ ـ䐿؉ @ @ ) +Հ@@ @|fߘgCB@ @|S@Nߘn@ _)թ/#! +"@ + + @ + @h-@ +Սߘߘߘ +ߘ +䃸߃% +ɛ * +ɛ *@@c +Ȋߘ8( + +yߘSOL
n3OL
h@OL
_( +sOL
SSOL
O +o +߃(ߘl nߘjߘZaߘ]ߘMsOL
4P +K丿:&,ڸ +䜸 +N_@ށ䊸
(@($@2"@@@@@ȋ@@ @@ +ɚ <1ۃ@@ +ɚ + + +D@&@6!"# &2@6-ߘMH +@*&&@ȆC +
B + + +@Ȃ@ +@2@&A,__@ )@-܁@/Ճ@1~ߘߘ@!( + + + +䁺 +_ _A.$A¢B + @ᅖ@ᆓ٘B@阽݉@^_@@TBOB +e@~^ɉ _9 + U +O*A@OXb@ +b@=,'b; +/ @s + @ + + @ᅖ@ᆔ +Ջ +@߈3 +@߈ւ@E߃ @ +@߈@ +@ތ@<(9_ +Ą +J@ + @-߃@GjTOFW +@vzOv @߃ +@L0sO3s@߃ +@ߓ@ +@߃@ߓ +@(9 +@w߃ +@s߃ +@m(9䃞 +@ߍ +@ +@߃@ߋ
@ߌ
+@:߃ +@4ߕ +@RߨEpob +@Dw?`
Opl +@6߃@E +@
ߏ@. +x@o@ +@@߯Ekol@߃@UUSUOUU@߃@߃@n䃘@ +ʚɔ + HԂ +Q@@ՋQ@@ +Q@@ՋQ@@"Փ}ɋ} "䋽Ȃރ@@J +Q@@ՋQ@@#Փ}ɋ} #Ճ䋽Ȃ@ԋQ@@ԋ@J +Q@@ՋQ@@$Փ}ɋ} *䋽Ȃރ@ԋQ@@ԋ@ԓ}ɋ} J +Q@@ՋQ@@*;ԃ䋽 +ԑ + +@ + +(@. +Ċ@ + +@F +@8 +@ + + +0(@@ + + +/_@+@xR +\p'<ޏ@ +@՛@RՌ +ȉՃ4@ᄘ=H@ +
8ك@lhcll. + + +d*@
&Մ䀺`
+ +d׆_@@ + +
+@@ՁH +@@ + +䂸@ԑ䖸 +Ȁ- +䖸 +Ȁ0@ޚ +@8 8/ + +H@ +@߱ո䳺䱿ݑ$ +Dݐ +@rDT$ރ@\բ + +Հ +ג䑸d@h@ +@ +@ +@3 +>@; +@3 +>@; +@ +ȉ @-@0 )@1-@8Ւ +ɘ +ɘ + + +@@) +( +@h@䉽 + +Ċ@ + +@C?@ +%@ +ߊ&@ +t@8 +@ + + + + +%@&@ +ȉՃT@ᄘ%@t@^@Նh䌿Ֆ%@ߊ@T@ +h߆@q +䖸 +ۜLe@E&@ +@8 +@ +ȸ䳸@七hn +@߈= +nnn@_@ + +@tߊMQ@O@@C@B@@@n + +݀@'@@߆@ +@ ++ + @ $Ֆ ( 8' +@ +'@' +@ߊ@'@߇ۃ'@G߇ +@sߊ
ۃ'@j߇@@ +](@ + @'@8 + +@ߊ + +@ߊ +(@ +@ߊ@,@!@Ֆ ( 8L)@h18a:' @q߈ȑA +A'@߈N +@8`ރ'@߈>@L$
a +ȉH@
H +@߈ȑ + +@Xߊ@^ +@ߊ8 +@6!ԍ@ԍ_ +@ߊ@8 +@) +98@)2 + +ɘ +@@( @1 +ȉ +ȆXF_@ ɊȖF +Rߊa _H e + + + +ȅo +˿@ĸ +TO#o= + +9@o +Ș䒸@ +øB +B@D +ʤ@ +qߘ +83 +_4@@D@ +_4@hɃ <@+ߨ@$(@A (R²<@RҺ<@
+A@ + ]&0@!ܐ@ +@ +@ + + + + + +8 + +LDN&Nb +<&N(LD.k.C +<r3 +< $ +Lj΄̆fb.sf.*E> +0.( +<D +LDN$LF(H(Lb +Ϟˢ.!M!MϞ. +G +L( +<(*M( +&(:'(J?* +<L +<? <LL*L*NGF*(R`~̀<(*(<< +C(D*C><9 +<A<M + +((71X445<.)$*L +2(X2<3(3<4&5N)*ς/ .LE$FLG$HL4&5N$%.($$%L @$ +D0(A< +8 + +LDN&Nb +<&N(LD.k.C +<r3 +< $ +Lj΄̆fb.sf.*E> +Li&jNE +<x +<I +*> +C˄4<6>Ik>I~2Y0 N>"0(w9~*y%(D*N +Lj΄̆fb +>#< +.q(*tx +f +U(K + +407<+>z>>=(X(b(> +l(u +.=(**( + +7+(4Y*;Z({.g*f(e +a>.(*3M*({<p(<(<(q U(K +. +q +-m<m&N X#* f< +$L +=. +k*x(Uy(Uz( +U{(U +T,@A+T(* +, +
+ !(
")0#*18$+29%,3:&-4;'.5</6=7>?$#)/#,6A)6FX$/AXs!!)!)6!)6G!)6G[b + + + + + + + + +DISPLAY QUE OVER-FLOW + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@ + + + + + + + + + +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz +$4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz +t +1mx1`Ձ$S'~trE@jИMMJ8ˠ}pѝlZB3*hXAa `r)vE\l7N.,Od҆>"?čOft^Q%-S[],(%&`( +-Agt|8SP7#Jr+,3z=%vˍ$i3'XQ<L;JNhX} P[?~q#dp¹JƮ?~#UhdV3N ꮯ1r#ri+6>,r#R!mN:[/;EO\Z5ThpMLVl8)x^{=%V^bi}{OGp^{Ho@lN5Gq"@RbjreUic.ͧ:2Jvz)|F;O@*-k#Bv}у])wB +.˕鏳xN
V"eU +y҄N*ҘCs=(l/DGI"ċ*mXRy@(Omb +>;SYʟp29DF:Bk*D*C
̰/,aR?ߟFX`rt2{AM3{}lΞҚUZϷj +H%~"U,!x ?O10a8UT^BAOqE,
~CFb9\^|ZWVx?t--R[{y2_?b"^AL}n<ۧf?vΑdx>ulW(ob=G;pSbTFh;ܷxB[^d(姀ݓ9v[J\"ɳU2dJ!{8K̤d0+$~ּ';~;˻#Q +n, /PF%홄&dʹ.EV@_FjjWtv[[lJ4sW2DvS[ޒ-X}ߞpfǸeb> +j30:r/H}Ldc&lD&1eIӵUli%26k-UXOؾ+&s*{GgOv>"bQ",/tu~fNߗTXJjx U3 +"<j\Frzl\\{S=!Kjȥ7X<Ծ>znj%&RvפR\k:Kw
iPIzHf
Optv+OZOm( 2k WQǢ!E$"e2'Eoۋ"xxjjq1'%GcTS"X9ξTXh
('qh;SBf5+b+, w(>!*I':r>$aCK>cгI8rh0[8}w*7b \^[cSv`rqC凌Wf 9@U41u\5@Q;!=O2fB6.-svYB4Ɯ(^$f`s0@w0 bP-&ުt[Mp&Y>Z;2qg8$&fg +.!ul"ZZ)vt# X>W-_Avש;=bf%/G+:iU戶M@.kO0DBFSF; e<\VgJ +6gF 'i<`ڧ +K тymy-Gj8={%]5:Yk1Cr*/_TX)څ!/<S~ɷQ5}y8fdlU +zRC;+NG&b}f@/:Qhr̷7N9oZs7ɳ9(%q_Qe:ƤV@J+|o!]@tYSE^3YkL'ɷj`w&\)Q,a,KKބCNeT~jٳ
ч#cA;ף3|;4Tt+Sfoj8= S.ӂijG4-g6yMszxbP +15]@±Ӳv8HI̗p5
nƨ)c[wc f`S"w0xvco0sڽP08mW |J0̉a)a(kuU0c~nj܉W2 +݇AU8]L)dK8cQS Kgt=A]ivor_}d5ǮTI}>[yrϺYB|k42W%ܶCF\ldDU(=@G +aq/2웑js%n ԧ'UB;<MԜ.(jOK!u +mv-aQ4ӹ8P<]¬'eOVg洕sDMY-|ڼ=M4]/vʃoP$Bݲ5` "߇؛٨cQ)(ɟ=OTai7Z7:._LdEj`1-8r-Dtpv{tZÇ'$ 0 _Oۧl&nƺh+R4 +8 +R +=|Y{ѻ8~ҚYc*7pT5HLf:/Wӑє
9e%2T<Ϟt߮RC,ÌXܓN.Ń%(ppSYG&ZkJFQ/ۅ(O\MXoɩ!Waka6א +cgGU3W;BDY63OAlj5XӗH_դ5GhʽY6@ej,ri +z'!!Y'!d;fJ2Gpl,Ÿ~*a1^DLA29J@Pto`qnQk/0)T8Y䒈"K i{$6]w$y>cSWݫbǴݹf<]SԲl軨cn{~ko}<7PXn;ylkq#n41)
r=˻qѾ>S.c$FJea{;%L\?_!3&͇iE}sb>ꪋ0Lt5O7Vuckuc,!5Ja `ƺfu`S +딧3"6
<牔/@DB<Kp +d|^4I-<j͎L#qaH}
o7,x9N"| 3W#%r%E4\\: +U2۪ +yW&~< 1(>\"
7?+f@wnipg($[CTo^"Kh=ڡޡg*yp\ + +Ai!g߆)G&Z2ÆMwQkyEږ
CTVj?/iP,=ݫ\VaU.oK֊oRjA0EG#a_d/sGN#:y_n@k&~<S'߹ ҍg\Kh]=2,}E(z/O# %+5Y0eOeWN/7dQThWfs&ܭx3(Aw`5ETl68⪹9Ye!e,_8sU~>\@BߊrqNY +\yy^eU_ TFdyɹK,-2 0e'<`7j!"a~Yt͘,HQ<|ѡ +WHnGQ~CoafnHMS='Tu.G+抶wgFKvt +CO\tG#d8?6b*n[LJv{ݨ$+l,)Tj:oZ$W=-BdU(\++B*ܤ3' B
(n;r徦'[\Ϝ 2%\oAm)B.0J"!^ŠjDQ" +(؟{<PCZžCN>3|N;Zj}MؿS=sn'0S?v-9QL[mpI!NĶՠrKk{9ۗDŽövZAhZ
>(}_8M|cӎZ!dlOe>;"Gm*&)zHaeVk_^CT']\ֳ7ܨvہTBTi[ߌ҅K߀61MV*lY36kUizS)88T;Z~cט~tGDŽr-] +1kcJ:#0/ + +2w#Ͻ5LNu,z@6X-qǏЁ~esO ݚ"\[ڍ\#*ec_LM|PI8]"'BܮNИg*"B#Qќ[:VN^!fKcz$)HH=uҹD +Y2,w](E.*6 .ɕ(s+:^fP#ē +VL20oBd3':iJ`uł
'[@lkmHwNX3 +9 'X +yJհ +] (_}H \MhW䮳\s6N.z]`$pDQx "h2Ps +І(_ +0=sGc3D~%ZgFk },En6WI|b3 YJX^ }jM䍐GOO82q[\rdn[QF&GDLuWIlJe?(Q(k `WL/se: +9tT{5t5\#qcL?d7}Y(7O"*ǰ'>Ċ1uKpd'{,a-_SG`13x&pU+[L}ѡкb6g_q)16KC ěF<DH<X4~s +/!HMEG|0DQd~<[bV1}NF<-l| +)AD8%*|JrBTA:o~:En5!G +-\!t` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+A +"&D7zXZ +'/kuykfJg$}0t`9v*=<~jw뗲"R|ݓ4h1X?2p6[)&UaX淲@gޓ(/`9'WVy7rBC +7_N|]ߏ1ILϊl)CC~l֍7._̻6!E~-㞇Qe$59߹6j*Trs>k_7߉+iy""[?ߨ{&ޣR"gl_t
D|8:Ym)Ɩfi\5bC[oו$+ӕYG#}^ZPIH݉B2ބosM
\u) ϓ%n>L2o
%$x.(-F, +-R$$<%2:vk;7PZ#Ֆ1~-5+BQJ~ӑ9)5rҬ) +PhoUc3J݈=ZK
L!xX4nnHkc)"}MQ/h +m(N(pѯЎiBJ2!c*pV&6ޕYaKBq{5"n "hKYTWÛYOD,D] 0gmPwtSFb7j6Yu?x35x^S/˭dH+EI +c cɉl8SL=<gACcixn p,FOH0
~ZCsx㊦G;:8bM ʞȟuȩ(3u)WNJ|NZn_6%?xD3i-ax결Gָ{$tp +ٕѰ,rIb
&_Z\j1d>6h1pUFoG<9ډ㝺.̸uQm8WN;vnj+͗Ab5:F߆D @٢vm0S1)*G@sEN0:Ϟ\oRg!k[-[s\
.Y]侩%&] +Mez%WOT0 +2WSt-ؑ] +q"tN ̇פlNoT> \6ka97$XhP9դ˰]:G8 +3QܗڽLxAi5qT[2.aGD +ڪ
<݊4p<[|$[,Sq4
\ +`oAWR3FXi.\IGC8SI'[ӷ,Z۰P=L=czGhosgdÇ*B_2}Z|Bhr-oV6U'o!bqQ}6whA'0blMD8 +aEARb=$o(30m|lZʆ`ME~Npk@ug'dlG8Z3P"Ag*8jq*d⦫8m ECn㍂7?HDON?cl?Wn#Yi>BYfbΩ{?mt +LZ=@;HK+
j)Ho2 +\| e)(o
(Yxgh9!k$p{ +hdX+lxtH`[g9lE~([zĬlvEaQ=Oơ\5#6LITLn<J +DO>V'0sbJz4joU wbT;ڳRv3u|wCJhV +!o(s0PSCȫ ۻ1Y1MViڇJr9YGm|=vRUw6yL=PN; +e1BV_"O-d6[?ܞo&y,Kpn;-zޅqJ5?bu(vBU,|_(ns bϘګg6d1r$?֭kŅYRaZ},7Rl+
ԄL`]qv1# +#"?& +5gǍ|~~a)GfD$^L{ߜ%(C +ٔ? +LG{:\*W>P[v7p#t
ֹF2Aׁgc!yٗ-e"&Px +=#e";yBYvנ*1"uxP[BJtHZx:3ZQoǣv{pn]_w`~c^S6.T/,|>c c;h5*fc؞ypo~Čy
Y#<!R!?FܙyΆ pEG>BH_7h$(!͖8I庿P4"`b+}jO<ϼbr +St5zZdQ1(NNe;81ը +{lw + diff --git a/prebuilt/libstagefrighthw/lib/libdatachunkqueue_alt.so b/prebuilt/libstagefrighthw/lib/libdatachunkqueue_alt.so new file mode 100755 index 0000000..bf25129 --- a/dev/null +++ b/prebuilt/libstagefrighthw/lib/libdatachunkqueue_alt.so @@ -0,0 +1,68 @@ +ELF + + +03/K +H%FxD +ah(FB + +6A +XFBF + "O@ + + + + + +G +xD +!F +(FoBF + + GpGF +pR@ +p@ + FRR +Nreu h +.,dp
.pldpcp. +pJ +pJ + FoG + + bh^h + + + + + + + + + + + + + + + + + + + + + + + +A +"&D7zXZ +ڈvF +-JKJ-A;hRR>y֨'xwKdθC}g75F'(G٨)Y\{9rX{Hu'?}?ȋVT'fVd}1Cs Q~9516r焽uM]xmDn5S!]#*lHY8 +Mj1qm/`ed,~O?I;ѵfqVph1ߺ\օV5N(]/qrv]{u.;)pC@ 9CZdk,qg$dV.~{zYFpߪ(rHJ CZ9啕rY(\-Kb0Oݎ}}1욠v{5`5+y50 +ݬ(gb/V2ZNUeYou%/MNaW9BYn֫yʕL(E4pfbKZ])X)PBBOT6{sFhSQcE +KñC$k7.ηW;{4"*q?wa!_$6MzI:<i8!{9~4%0"B<*ؿEǔeDWL}{j]RZeAH@X+(!0j*QJZQ +.h9Lz"@C/d_wh9/8P☝Kg(Mߺjˋe +b F 8w60PDzl!gleOqR3!^ehK*{
X^j瀏cTxق%~ZZ5v)T*LeLqLߗb9`Sìh=:ɀJ-Kj&=w$Jv|Wc@.`YZ;iKջdPch>7_酨}v^]RbMdfp@|mLw9\ʷdՖL#뵧`<e.!n,Zb\z~a<A̢e^:u5y>ޗ+Bri%_Xׄ\4i_F]xAVf +d%=$q^^dϝ;uN0PkZyY&vtfۓR!~3nZ<}<,L5dBQ\ jO\?Jy!}6u~urM4SRJ{USYfrA;homזGHܿ(NWO +noBG-ehQ"βv8Fg͉*{4ѭi}_[F<\?V[y؟\{SRrR~m9`mZo@ +@ + + diff --git a/prebuilt/libstagefrighthw/lib/libfpscalculator_alt.so b/prebuilt/libstagefrighthw/lib/libfpscalculator_alt.so new file mode 100755 index 0000000..98930cc --- a/dev/null +++ b/prebuilt/libstagefrighthw/lib/libfpscalculator_alt.so @@ -0,0 +1,69 @@ +ELF + +03/K + + + +6A +XFBF + "O@ + + + + + +G +xD +!F +(FoBF + + GpGF +pR@ +p@ + FRR +Nreu h +.,dp
.pldpcp. + +pJ +pJ + FoG + + bh^h +JZt + + +@D u + + + ! 0bà01@OxGF + + + + + + + + + + + + + + + + + + +A +"&D7zXZ +WY_qGQQ= +{f^,g~i6ewji!ѸH2}G!~j38rx߲^BękXHC1;DZ<Aq:XHP&%spW/wolHkZϘ5AKBk3CDTvkKÒ2v Ab9$J33!Ȍ|YGcT'C$#*}l +eiyde<<*ޭ`WY8_
N-M&H.mlgįDsPV h&=NWx,;wSe;}#3ܟU~.Z@;$&ǒ%F{9hAϹEx =,'S/q +>Wcc*0kj<QVAϢPU8 ) +,,s %w/;h7(`8h;|+=*ʏΠU+gDwL& 3Fy8-IvX,!ĄYSL3KwpƳX{/S>Fk>R*FfOzŦ-%m"$!QF7;*4-m_TlQL(Ӓz}i˄5O0b2&_g4/s.3C +ou B$*s*C\j0^i1-jpq{~5O,V)3cMuU|[v[Nh-<T+'{2;vNjxdC%
EptqF_p6-x<⟤h3G@[4_9*RHˉZ#QwtC+k39anT{NaLg!U@<*#)15AA +8%(EҎ,n_3УEDX3DZ-|0nlmG0ΚZ{\;Ik6L~FdžKBzOG[tcB=&Ue|ծ9BRJhBL(;XE^ %2x1p*⮄bߑK]XT(Œ%m)t1
_
~ڰ,6L1x~OH:[;f + + + + diff --git a/prebuilt/libstagefrighthw/lib/libomx_av_core_alt.so b/prebuilt/libstagefrighthw/lib/libomx_av_core_alt.so new file mode 100755 index 0000000..295e29a --- a/dev/null +++ b/prebuilt/libstagefrighthw/lib/libomx_av_core_alt.so @@ -0,0 +1,55 @@ +ELF + +|+GܐwCE
KDw9-N"9{]IУ&9]蘚9GvK>o
F܄6t2BY + +03/K + +6A +XFBF + "O@ + + + + + +G +xD +!F +(FoBF + + GpGF +pR@ +p@ + FRR +Nreu h +.,dp
.pldpcp. +pJ +pJ + FoG + + bh^h + + +A +"&D7zXZ +:ȶh&8 +;=cmf +\
+y7n8"IZAc}٠Ʀ-ˁMNc$_^@pϒfÉn9ԇP_ps + v)TvG\[Fێߏ{DLr-;. +m 7fbz!|;I7
+sYG5Vm7xXC[|sThJId1jDBzJfFL>'ENkST3admUd2QͽHU]&qN-#$ME9|CZ<,)J٩H*Z'YbqJ^F|g߫<kEܣfgՓܖ}Gftc>qc +$BE_x"+cnh.nNB+b9ۋpNpXfZai$住$Z+(6caO]
4@]~sh~~; {»b<u`{({V +V_nioJlpM%o.D7x
sZvhu`gӶٴumاFbn6W#Qbĉ4[eCkVKR8:}+PHRXG["(<WM$C0^=xӎKG#YWaա ҳqu2P +&1]izA
YҠe416ܹ7E㧭ه:.(i'D8hW˻k:ZR"3:Gq@]1h*["̥^P#\U l + +m̓8jU6Bnrp#99o2?˲M#ls +G W#mKߩ^1Is +`EEC~ytg.̙A;r߾
nj&K5ɺX'F%,0Aq@`Kgbd gxvP0U 3!dOM}o9d^?Ǘ +x=QX1o_.߭叩a+)eL<_@45WOYDD]A{`-jXƇ}wq*I\HRiQҸC";fz> +$ZU=C6.|84u~_Ϛ4SUMM+XDN:YVJqinT.`EYA̴0< x¦%!ݤЮ۽>زe\QvVlp9'ltx+x-8hC8ؽC蕲ٗKL c47sGźiVu 5cxؚc9Qm)%v'TZ +Lm4|)όaJOg؍^R +Z
wP8o5
p|{FqqNyy#=:;\5~36~zIfys6L8]vu5F3XX
@ +:>Lȯ}>˵!x_VIwe=f>hcȉ>< + w"ѳ係J݃]lRy0]7٘+`k'Ý:-\GXgs aױ?U<($vS^z*q,wsPD'CZJV\B*q -@,@XB&KNiT + + diff --git a/prebuilt/libstagefrighthw/lib/libomx_clock_utils_alt.so b/prebuilt/libstagefrighthw/lib/libomx_clock_utils_alt.so new file mode 100755 index 0000000..3a578e9 --- a/dev/null +++ b/prebuilt/libstagefrighthw/lib/libomx_clock_utils_alt.so @@ -0,0 +1,55 @@ +ELF + +@BM` + +03/K +!JFQF + +6A +XFBF + "O@ + + + + + +G +xD +!F +(FoBF + + GpGF +P +pR@ +p@ + FRR +Nreu h +.,dp
.pldpcp. +pJ +pJ + FoG + + bh^h +j +T + +`V +V + + +A +"&D7zXZ +1-cMBSFC$8naZ+W+~fv@;)6Ϋl`;s~$C #]4.RC +'0qko*<|}dqra_Q7gQ+_ypcP`&ԴBk_fd=^{kOI7:
SEuH5F_?4j_V
mJ+en&b;(AG^2D qWfz}6_$5u1q]b<Nio8*W;?埵R^ᔵ!9.MrZ wyUWg>bFW(b80ȁA|rAii@s,mR9`\e31uʼnWD *^kbjKǶv鱎#(&tEYY Y]goE?~3M8 +"߳}zZ9fJ +xP\d=d7U^L + + #͵_=CJVQ +1ͺ(!p;6~6"YPAiFRc !,T +{b]*3`?ke,d16sV?NAfi +J;$݇\u$=/"/DdYfY3~̽89QpLV + AxMFeFj;m2+ +يTgo}z@;6:zeYvU0/9Ƕɓ:ww'1wk},V0zL#t@a)QFAN.3غL֕Y,9^E|J?XBrM+]W%A +?eB2}zGK=n4?\vY t@Kޜt+j0/}'ST]FQ0;Pٛ|!A)b"P㝫dvTM/~Q1V=zI)LK[Bz>}mhpkLC^8^ώƍ'ɚ=vǢ.zх~TbҠ+t0 +Zxy2 + diff --git a/prebuilt/libstagefrighthw/lib/libomx_framework_alt.so b/prebuilt/libstagefrighthw/lib/libomx_framework_alt.so new file mode 100755 index 0000000..716dbbc --- a/dev/null +++ b/prebuilt/libstagefrighthw/lib/libomx_framework_alt.so @@ -0,0 +1,397 @@ +ELF + + + + + +W + + + + + + + + + + + + + +Em@`<( +@ ${Da0h +$!
(P#A 'YDԞa@I .L!0 + +)ePjI@[o۠e?ckguG XuW/|jckTZV%q8>~
쎦Ż*dI8 T]ѓw8K^&aY6GFPk۲g~S6c q&=!TP4'eP*0*Cme*DzMP[nT$\+ķ'Hԥ~d'oO9!zzJ|* {_6ByZPy"JNKVjՓvQCEKS%=34Nhk_Ld
@EEsV"22ϞJüouͽ* maTso[k R>U!9X2ؙ>!bW^S(Iԭ!&19MPig75-.9NQUP!М +At[Ŋ֚KV6Piz50yA_XM+B7}zb`Av=^_XNE=a|ռ.8B;[s]@9mޚer&hpSp+ +>/ +۠k ]42狔˄"`dFqTchPhIa+ˉ
jh -'Ϟ*ur˼oI\_wnC~|nX/B:k9Ƅ VeL~fRqlv[efxR +lTyo+BJ"7qX"H)yeho>) 7'\5#?~ +`ޭ&^!(:#|Fp + + + + + + + + + + + + + + + + + + + + + + + + + + +H*FxDh H1!`xD!F@N7 +03/K +H! +F + F@Y +( +FxD + +F + ++ +)h<1`hh +' +(6B + F0F.( +)I) yDxh m I yDxhImG F +| +| +-OF(H
FFxD +G IJ yDzDGHF F
HxD +/3O:FOF?I@ ? +FO2FI. +A yD + +FO:FI +zD Lw8F48FA4 +C0hQD F"0hQDz0hQDrHxD + +HxD + +6Bv0FL0FqJA +)F + + + +D +0F +p@ +0Fl(lv0F4p"!F0F(hmLHPxD +h@p
+(HPxD +FxD
F + + +K +H |8| +VP +4 + + +(c8F(8Fndd~ F +4 + +(c8F(8Fndd F +1IRyD. + + + +E +|F(FF +л0F +KyD{D:IKyD{D2 + + +s + + + +o +퀽#h;ApG +C +56 +S + + + +
+HxD + + +W + + VAzYA,V +zD!OKDNM{D?h~Db}DO +_Ih +k+F +K{Dhhh +guAFu`"u@ + gO0tupvpwppp,wgs p +0FE +!ig +(`! + E + +(`! +(`! + +ppF.F0F +`* +0Fp@ + +H +I +KxDyD{D> +H +IKxDyD{D6 +!sssB +sqssA +!ss0Fss +!G$xhh!G%)xhh!G' F.u>d0xhh!G +!GHxhh!GLH0xD +](F ](F鸳'<s@ud(FF +'a+I+ +FyDA + +XF +v F@ +40F@ +8@ +%s +(c0F( +I@m +J + + +D + +D + +! +.. yDzDlA +O + +( +F + -yDzDr!` +!F`* +@*8F&T6xD +(OS0 ,-yD0zD +(Oc +((y(@@wh8F +F + +>c(i`hxd@F FF +yD`'sp@ +wp*@' zDhh +((y(@@wh8F. +F +((y(@ǃ||h yD+F +((y(@Vh +) + + +8F@ +@ +FJF8FFH8F + +$yDzD +06xD + +8@wh8FF +$D + `2IJyD +JzD0F)F +`*<@@ +`@*koI@mcoJ +`@ +(h8D)h>)y)=8Ih@f0yD +@@ +(h$ + +єp8P(F(F8F( +
I. +(FI +FyD + +
Uxhh!G Fe<H1xD +9F`* +@*0Fn +Xqa*@ +D*Np` +HSp` +\D + +HxD +`*Xp@ +[p@*e +Np@ +(hHe +Sp@ +(h\ +HxD +
fxhh!G FelP +Xp@ + `NpdSecgc@ + Hc8<S=c?cA +\cL HPSxDQcSc +9F`* +@*0Fj +[p`* +5h@p +Hh@p +\D + ` +b +`*Xp@ +[p@*;h@p +Np@ +0hH"!I#!J +Sp@ +0h\ +9F`* +@*0F + <s@AcCcA*!ccpqccA*!cupccc@ +N +
fxhh!Gxhh!G Fhd"a +O +eq|sffA*O +0.,$ yDzDA +D + `6 +D + + +(F@ +@ +(F3(F + +.& yDzDA +& dd$yDzD +pp!h@
+`hBY!iB +jpd'@
+@'dh1B6@p +DBآDBٕI p ` +AF`* +@pai + + + +hHF + +D& F"F
=h(FF F)F FIF" +(x +PF0FJ +# h SFfhB + + + +- +Sp@ +Op@ +4 lc<\p@sAcCc@ + cptsucwcA +h!cmpscc@ +jp@ +fp@ +, upscc@ +qp@ +$ c`scc@ +~p@ +zp@ +0 `scc@ +`@ +( <d8d`tddT`h!@TDtEdGdF FTtdd FAF Fw +'JDA`*dH`B +"\$trddB*w0@D!@ + @xHdxDT0 +P +PPPhBxhn!q
xhnxhn! +HxD
I
yDp +XFQF HxD +H)FxDh8hj F8F!FJFGF F- F)F@F Fp(F +IyD h hjl + + +@F +F
IcFyD h h +"F FZ(F +"FHxD +` F + +6A +XFBF + "O@ + + + +FVF + + +G +xD +!F +(FoBF + + GpGF +pR@ +p@ + FRR +Nreu h +.,dp
.pldpcp. +pJ +pJ + FoG + + bh^h +?o/o C02 +@-@ + + + + +secure memory not enough. but at least 1 + + + + + + + + + + +A +"&D7zXZ +,dPRE\I"C{SA6wKktd9ե\vw~/* Q#oV) +"}j[B*iRusV{|X35gmy5.;H>$nE-L ,~NZ˾AyA=Z~?d5$1>` +w}H~Mxﺐ@#27ďs4 +IknɵjjJ}ͣMd+p~7\Ddd8eF\DD<: ?/G&,N͡\,سGd:Sb5+Px$>yN<x$ܣ-ٹBj+,AЂ|+楖飿bGr+S ?kZϝ +l3Io7@yPgA~?7 +3Zfaﺑ!łviaɈqOP;=$b=p_wI^Yn˳L|7Zs> +"zܛ3";UVJ{vE$h^R.Uo>婓)}=ɖ`wz7a
FB[ֲetf+)قc'~
bV}o~(~EBu]=ecZVJ]p? +FVŹ9uϢNk!$k,,sO=5byT!&Ȣ{i +JeISVLy +C:UǨ,yE5O>#3Ж<mTh$H@B\m<= 8 US#)
xWq:5#V̺.f Zrj*.Lgw"<YAvŤt'-bTU|w@_Ѝ0M?ߺ''n%+}+!.tx1ZZc +:&'gNUr;/M`rPRmԺ@k0c&Ѕpus$ +Zҽ!Ty%E*)(O놔7o[F`^EIrKO\tAm;J<BF` KZ,rl6,$z"t>.ԟz.>*mO~{K~`gl {\h]oߖpB=gGfOP!z^n+Piq/y+97'0$;N*l,eiJKfqV`kU$4|m>nZh/{@m?FY ЈBw 6KJ,s?VC*NFnRR3A~|BXuH_3d?j{Z`qdclSh߬]?nSSD$ zRmwm"a7o$PkM/qC-Xiԍ/T?+SiW&.\@@scò +i@vg1K)84z-"r78inkz@[{Ȕk`6Hn@ԃ`aevTy'7(SvbS)rtAͤ]=ȴ$T-h9ucFnM4xK8o5D/}gN(kJDa䦑#R۾i bbK""1S>ȏ
MH<X`jzK$wNњez'wbg4M`kuU͂5kJHXꇯN}7A]ڻ;6 ȇ$ +ȎBԣhؔ\=qfkmJ2ay +d 0۩WG#JH`l)5E3u~Q|>+w~JfKSV]!0{,":5V*8x?kĨ\*rb=_D@ю% <;ZҦbu@J]&e_9pcjxKh1auɃmM0gZWZܻ<KoBLJ<el4Wj0襮泡zh.ab@~zndUdkZ
FWPt#ܮmrw/$86ȉQqu ًurYo>IJFebS\x#T$e2* +: {bLHN^f>kt[` +k?:6ȯteab/nkѻ@HQ<`JNQx=[].;Fץ@2ÄF{q^zٜ"|JcC +Am/:ջޅ4g#ARoj9>KEzrD$tsk^R#b%Y
2Y4=*!&OP7N|W#>R#
'WD_;aEMWW>KHJ5N#oTOٙ7`1^7P&tx"ϬyȜwmypFgJ *UZfkN diff --git a/prebuilt/libstagefrighthw/lib/libomx_timed_task_queue_alt.so b/prebuilt/libstagefrighthw/lib/libomx_timed_task_queue_alt.so new file mode 100755 index 0000000..697d8cb --- a/dev/null +++ b/prebuilt/libstagefrighthw/lib/libomx_timed_task_queue_alt.so @@ -0,0 +1,65 @@ +ELF + + + + + + + + + + + + + + + + +@0 +rk!A4uMczqX*.H|]}xWCE쪏oo[[˜_˚q*L%%qۦ + +03/K +H%FxD +@ + + +6 + +6A +XFBF + "O@ + + + + + +G +xD +!F +(FoBF + + GpGF +pR@ +p@ + FRR +Nreu h +.,dp
.pldpcp. +pJ +pJ + FoG + + bh^h + + +A +"&D7zXZ +N5%m:!rfR!r:OVHQ1l)eTƴj$aұ(#bZѥ+aϹtҶlGI +f&P * lȈ<L#&sIBxXpt=1D2B3j3Dɋ16}m +}Xz).e<1A߿x>S0İlV]1VA˃CiU)>ȯ} +sda" +gC'Tȋ'ܨ[^$+F䊾:fē,uOx ƿ١YnJ1A1ܢY2>G%=EeSSW4\F֢BS[sқ=8ПTI^?9;f`Q!!Sмψn]NSs%]3OVA5BdJg3 ԋ#e*.y~(bVՃvXOVNkT*HnnDDUw(od脅YkT/7dh(`?"mJ6jV\)*R.MBo0H\Y9$`[iѿ@.tk<\F|y
ęB?g;pf֨˘"=,Tfɏko+g{EoMpH(vpu^辇[\h\I1dD +\Җ)ȩG
p-X35<9ׁ_9Um{1Mg{qtkHn0ފKi7/otJgy^eӶ~aL~(BUjRVﯨbWe@"Of_5x'`C +.őx(SsC*g.>L f4=!%jL'=+JEʇlH\yA)o<@!9JIt
#~qzfCaNTmP>?~r15j#KttMaaȬeP#=ћ
7ugM]\(xA~*m3;B4Oh,joMW@sjJ)/[9l)wu8~0Ƽ;:dR2uDE[@Umy=\<-
+zR;F +J902Vjfgkӫf+J% =?vs iا + diff --git a/prebuilt/libstagefrighthw/lib/libomx_worker_peer_alt.so b/prebuilt/libstagefrighthw/lib/libomx_worker_peer_alt.so new file mode 100755 index 0000000..7065b60 --- a/dev/null +++ b/prebuilt/libstagefrighthw/lib/libomx_worker_peer_alt.so @@ -0,0 +1,52 @@ +ELF + + + +03/K + + +Bp AFJF3Ff6(FhhB(FGƼ\ +IF +JO +K +yDzD{D + +6A +XFBF + "O@ + + + + + +G +xD +!F +(FoBF + + GpGF +pR@ +p@ + FRR +Nreu h +.,dp
.pldpcp. +pJ +pJ + FoG + + bh^h + + +A +"&D7zXZ +Hu>bES͑=8Jfɉ)iC75dj5gp=!uO_pFi?# dqvh[(}tj\xA֍Tz86]y,+jTu0P^v>odl";$$9ܥ--vam㰪VTPcsQ. R͎ hϽBRhyNс]Aj$"qz݈&gz_LƧdIX;H>hgs+J0ť9 +SsOP/Hefw_nO4x8:qU̾s;{MbD֥{rRG +}%#}:v(E^&d&|PmP['r<sIiY߃T*a:nFWMmt
a)ZLQUV{u2!ID;ʜkՍ%Zd]"%'ĎX+0GZ\u-QѩōxnFM27qᅜ$$|T|:&mшl\ N}:R +\ +.['*\@Sx5w_i/fZ0ҟ]zwSy.<K@rvw&%G$\$:`&:k(T[^g4Ce5`y°NYiA,5)5*R!NN~ku0Pe5a<k=cn*,U~L vx_BzЗJа$WLB7Y!7)Mڡk0Pky㐩+geDncj*$bHzϪlQ<$zPfnv<K_׆I|R%4DAAJy%4eV>r*a%{U"PC%&%Ol:?" UN#.%X2fРTjS9>Wt,p(`{U1!,Ngeٸ|m
Y, +3bT2"3 \ȒJ+,:vxzbXͲ~KG|v~Qo|gZSAgyA)lk:㜌ct8ޱE
YdYSy(dۈ9tyVj} +*Dچh(H:ũO789<Ar_VdϧIb@S[!a=>ܕo֊>^K٭?`,nПe=wx>oPw·me&t{0#5v@}z8f{Fꃩ ԷAC4^qIE}Ez.ĒɿW?1 .C*hV#o(%d7Sqz-)tD[cXM}1Y3zGfM!1ƕz +{Txz,h^QssXJ~2d=vj03zOP|Z +ϟn
/tĊLjz69ўY\`}sFAcQ<tk"Ob>9U$#Rhgn<_ګP(mկelr@um-3T}HLa5 +i?ƜP`pk9Fժm' .8mCpsT;Yg$&ͯEo xD_mt| + diff --git a/prebuilt/libstagefrighthw/lib/libstagefrighthw.so b/prebuilt/libstagefrighthw/lib/libstagefrighthw.so new file mode 100755 index 0000000..4fbbf72 --- a/dev/null +++ b/prebuilt/libstagefrighthw/lib/libstagefrighthw.so @@ -0,0 +1,61 @@ +ELF + + + + + + + + + +03/K + @ +, + @ +, +HxD + +! C +F + + +IF +J yD +zD + +6A +XFBF + "O@ + + + +FVF + + +G +xD +!F +(FoBF + + GpGF +pR@ +p@ + FRR +Nreu h +.,dp
.pldpcp. + +pJ +pJ + FoG + + bh^h + +A +"&D7zXZ +41Cz>&|6/LbF~|sFy xekǾ2$[#>݆UE}-+N + +{@?ƤZ"yH2. ,{nHeI)E%]9d1~]ƎX(B*^|@Tv\f#!k 0Sк+8m\9$ F +Tו6[ݾ?^o5Eqj_l@`G{ޅ
J.qr c[1䤉tLphFmb=TҺ*Z}oD3)U@gtG h3K맽PDt)
Tg\q!IYR-JcZ؛E>!TQxZBCV<ܜrdC{ 42dɀ +0]2laI!ImR~"' Sxu:jBQl?o7t5zz8ƈv>s"d$Qcړ^SN "4j.VBx"(g~2{ +45m:! efYvS] +HܠJ]l"SScߘ)"k6;xvp˿sOΦkU{Fp#Xb[LE<=a`3k,ʤQj!piECjQZ*BCnGn۪qg>ؽ<;7!GiP]\`Fw<ȼMd⪇9^2IŹ(smt(3ywsDG+FL=TyxEˬsn7QI|6O(؉#P M|y*fi:>)qUL)4kS!+(Џd.ٖw(+ꐰbXw{D +7:.q}2)<xmG]/{b$pl %(P4 Kǡz:t:Tr0eQⳣ5e)dO4Sf}a;#b;ӭ diff --git a/prebuilt/libstagefrighthw/lib/libthreadworker_alt.so b/prebuilt/libstagefrighthw/lib/libthreadworker_alt.so new file mode 100755 index 0000000..f7edcd8 --- a/dev/null +++ b/prebuilt/libstagefrighthw/lib/libthreadworker_alt.so @@ -0,0 +1,44 @@ +ELF + + + +03/K + +I yD/a/s0Fp + +6A +XFBF + "O@ + + + + + +G +xD +!F +(FoBF + + GpGF +pR@ +p@ + FRR +Nreu h +.,dp
.pldpcp. +pJ +pJ + FoG + + bh^h + +A +"&D7zXZ +G6 +/rH N֖28~h40Wטq.m-HA&yGl}Ws~|qȮ.߫5o%+3rmU&98ڋjOsw(nS%Z<|s <1I˷6;fcwׇ<P8)E%4/}tޡJJM}P +yW1!⸒q/I|Zr= +:(fK,g
^UV%6PePAepbIg@f2(gC~,}t˚AsD;y`5XB`$ѯj +~"0:昞'Ql!aaD
lT-EEFqRPժF4j
\]?o) +Xɑ{G|=!^1㽤#Gmo45M=P9TXFQo:Pܢݻp"%|U$7Is'>t +`7i;wg:sy%b~0Wɞ^̎JEU;A-<`&;y/SqXD@X=QBKDm%"'sJNrIdaZK<dǀwj +^Xf 4wעqsgV! "m)VQ{DD`kzMM-^@%mL8;jeRlᇣ1a.,!o`[3M{Znulŷ
4k;g͍Qt%p&cO](stME 1)hVTRQxhP ta} +s"Hb3dN14;}?٦
~c|X]4ͬ!^9dn="jߗS!js=C>wX/YJ;jfumÐC iHC,p^3=S=zN~3gJVSI]mbj.=a&"RybI(\f6Wk&EYt_:nK`: aFI;,?Jn<vOӣ|gEP8cRaoQyj<m*p#}j;TU9wIPLM`Oe@G/"wi_}Gp[UP$
:^w#??%RukN diff --git a/prebuilt/libstagefrighthw/lib64/libHwAudio_dcvdec.so b/prebuilt/libstagefrighthw/lib64/libHwAudio_dcvdec.so new file mode 100755 index 0000000..b41922d --- a/dev/null +++ b/prebuilt/libstagefrighthw/lib64/libHwAudio_dcvdec.so @@ -0,0 +1,83 @@ +ELF + + +03/K + hRA + + hRA + +OQ + +@ +p @`#9S'0Cb. +2b + +*FB +B +f(r` a +pc +@ +0 + +F@ +@ +Yb(@\bгZ^먳 + $?H?IxD?JyD + + + +hIiyDjJ +h1 +bHxD +6 + +8 + + + + + + +6A +XFBF + "O@ + + + + + +G +xD +!F +(FoBF + + GpGF +pR@ +p@ + FRR +Nreu h +.,dp
.pldpcp. +pJ +pJ + FoG +$ + + bh^h + *HPh + + + + + + +A +"&D7zXZ +S*8ZlD"(-ET + GѷFHcD혡ц>,~ +_lmjT9t]gy!)BOٖ`:ڇIÕj8vv5ME06.>8dKf!,ҞxvH}0XlR=Ȕ
V`ÔP ,]k0MC$(,xwA ӐoCa }?+yD:5T?Cy0-~ bq?wxm[y*fXCBg +V[`T9[ [A +ߎ/N#cfK`9.&z$X/Hb >o|?o'W+FZNyBh+y4gQ >3EJV0ˢ_.i]m,8lọ=M]~/|3|[GI*}`<I9 YIaMYY%,|_f}_`|MlM
b;OĐK+shk%c7w̚xx$}ѪVmlr^BVQw\H(bJϥY.%~u3]Tt]Hkq"jcys|t|. +mʜ7[)vִb&}wsQur~5ġGܶIC8|''= 5ui[iٗBB`P
9shM~⠩5Dtb^;$Lwֽ TcyFmx.BHMM9p;:%R;N" x˜QLlq_jfe.Oi5<18N5RePV;,##ԛphQ?ݠ#6)f;=.27$ʏquK-(y\"9=7IGdhf|L{$[L&GV%ӯE]yWF$+A.[݃љ}PN)E@ŀʏeG_E>_S0gUxh]i`12oPWC֩1o,nk*/y9tpnqjƼD`='7կQ9Uy4F_5z4yT+&&؋~_ɏE8esLnR*n#|^=Rvm,yM92P&#=c\~G.Ta%t +B.b1h*M<3mJ9- ~yaD| + + diff --git a/prebuilt/libstagefrighthw/lib64/libOmxAudio.so b/prebuilt/libstagefrighthw/lib64/libOmxAudio.so new file mode 100755 index 0000000..1466d89 --- a/dev/null +++ b/prebuilt/libstagefrighthw/lib64/libOmxAudio.so @@ -0,0 +1,69 @@ +ELF + + + + + +GB8 0 +h ` + +R2 +A2CpR`F|||| +'`B +%`" #`b%{AB%{C +uK9 +sK9{A*O¨_O{C +;K9( +hK9 + + + + +pR1( +H;@ +@ +@ +. +!9B8 cT, +R + +` `:A` +Rc*{_{ +RS*{_O{ +Au2K9F +#s2K9({A*O¨_O{C +9{A*O¨_{ +2K9( +u2K9 +9e +9{AO¨$RH +k +k +@ +@~` + @_ ka +@K@_k +BqI + + + + + + + + + + + + + + + + + + + + + +ߕbf>nIJ*j9ho {"۟x5sSuʜY+747ONfpA]7((E*}ffЇ ṳ%C!$ÐNn>bz/Yp'TDGvnov\B>3"SÁઁxu7.(-(H$ Ru<pRHU!ݐ8Bx"-
0M|[7 + diff --git a/prebuilt/libstagefrighthw/lib64/libOmxBase.so b/prebuilt/libstagefrighthw/lib64/libOmxBase.so new file mode 100755 index 0000000..6e37c7c --- a/dev/null +++ b/prebuilt/libstagefrighthw/lib64/libOmxBase.so @@ -0,0 +1,72 @@ +ELF + + + + + + + DHь<J +bCQw*dm0 +d~MA)S:~'[jvCE}1|{V@B:* + + +GB8 0 +,@RHr +) +) +@RHri + +k! +@ +@# +@ + +RIR@r{ +? +h + + + +P`JA` +L`FA` +HJ`A` +A +! + + + + +@`JAa@hz@h~F`@ +@h +@`JAa&:`JA2/" +@ +@ +@irB +hrj&A +@_ +Rf +@)*C_ + +`b, +{AO¨WO{ + +@2~h2 +@a +@ +@* +@(HAh + + + + + + + + + + +/,^f#v9lUL_u$cnqŔ$ͼoBkI1.2w7@fE4~v b\@j=DGNCt
?<24)(]<1_n3jON`?VoVD/%dBw}{n46{?Nii.ETȺk-hSC=+Le8Bٕ'BP-Qjr=j߃lQ7'IVn.A*yT-LV䉰n1 /UqzWA Z$%Gz7OuA[t4Zm +$Lm*,N+tk$_SG+y$>(-ʂ"&u{(p2J^߳JtQ۷TJVȦ4}j6'0DN&1̳ ^eU%~Ҏ'^3Fn0|INeP"ø\4=0^YR}]d±:cܠ&+Q:!" +jn՝`/
F E+3q/%D6֞ + + diff --git a/prebuilt/libstagefrighthw/lib64/libOmxCore.so b/prebuilt/libstagefrighthw/lib64/libOmxCore.so new file mode 100755 index 0000000..b6f25b1 --- a/dev/null +++ b/prebuilt/libstagefrighthw/lib64/libOmxCore.so @@ -0,0 +1,14 @@ +ELF +-------------------------------- +ARCH = %s +author:aml.sh multi-media team +branch name: %s +git version: %s +last changed: %s +build-time: %s +build-name: %s +uncommitted-file-num:%d +-------------------------------- + + +>P3?dN=f-)=k&'ޑ6UOe:|_66a}07b@ diff --git a/prebuilt/libstagefrighthw/lib64/libOmxCoreSw.so b/prebuilt/libstagefrighthw/lib64/libOmxCoreSw.so new file mode 100755 index 0000000..c1d4b3f --- a/dev/null +++ b/prebuilt/libstagefrighthw/lib64/libOmxCoreSw.so @@ -0,0 +1,24 @@ +ELF + + + + + A"
@@C + + + + + + + + + +緒 +|*_$:_rC?5V=֧F95ى˘2@uE>|V]g<KyH=p]apHk/gO>J4UŮ;mOSFFYǼF+]]n&A1갈XD?GO_(+`~)j=mM,V݃̀ݟclȵdAE,̬oxTjgm* ;ޑwu}:ow`1ƤWxa:F5s視}?༦~۽.cm +lU% + + + + + + diff --git a/prebuilt/libstagefrighthw/lib64/libOmxVideo.so b/prebuilt/libstagefrighthw/lib64/libOmxVideo.so new file mode 100755 index 0000000..401e9fa --- a/dev/null +++ b/prebuilt/libstagefrighthw/lib64/libOmxVideo.so @@ -0,0 +1,2762 @@ +ELF + + + + + + + + + + +AP@ +P +`L@0 + + + + + +kz9&SHap.eڢШf镙tؓ4\lD9{ +D]^{YPzǦ>K}Xaԏ}W:bý"oG~m!u'"IyN?is,R8]Jd +,7]ebZs&[@yؓeE/1 줚9uh#zW|-J *G0c
nDZW8so>BM=6߷qSF%tpbZh<m+ťg7.f]֍>g\<mdg29J]aoL#uЫ]I $yf,5lemn5FC7_z ;1 p,xu4+48 +T@x]jid^*qXb +xOcNnN!x +(]ޤme)_z0ȗʐ +hrʏ^<pi +{M=_&S6҆FNn]{]^Z4 p~q˞דٿ +
&nj2MDF,iE!x Ai!0h]l>YhHI%M.{t|\AWBIQGip1ĤsP-iXuQ j5ȗR' R5#w + + UQQQPSz +} + +M + +%*%O& &l'8(8(0(s((W())U**(***R + +.` .b + +5c +5[ +6z +9Y + + + + + + + + + + + + + + +AB P + P + P + P + P + P + P + P + P +BB P +CB P +DB P +EB( P +FB0 P +GB8 P +B +h + +k
+ +B{C +i +т3mA_ +=@ + +@J + {AB_{C +` + +9a= +9 +9thB99? +h&
i6
"9>
9? + + + + +}R
ך(! +h.w@vR 9hh@A +J922` +O +(`CK +ka +ka +ka +ka +ka +k| +_ B + +A + +87hJ9 + + + +@H + +A +J9 R R +@H +J9 RA +@9@#@ +J9 RA +R + +J9 RA +@ +=EM
U]emu} +~*; +ka + + +k +R + + +C + + + +* +* +k
+*
+ + + + + +k + +k+T) +k + +k+T) + +L +* +Q + + + + + + + + +j2J + +_ k + + + + + + kkT + + + + + +_ k + + + kkT_ + kk + + + + + + + + kkT + +kT k + + + kkT_ + + + + + +!o + +R +R2+ + + + +kkT_ +?k + + + +kkT + + +kATi + + +j
+ + + +_k + + + + + + + +m + +kkTi + + + +kkT +(J@9J4**K)8) + + + +O +) )}S + + +R +9N D9 +Ri +9 D9i +9 qAiuA?q)iAq ZRh + + +{H;@ +@ +@ +kT + + + +a + ] + + +O{H;@ +@ + +J92u" + + +Q9 + +E +M +U!l:BH
+}S +]22+}S +5+}S +=+}S +e+}S +m+}S ++}S +u+}S +}+}S +:I@9?qU +Q9H +99H;@Z + + +9 hB4 +*@_k TJ +{H;@ + +Ո h +7bN@BI9h ++A8k +( + @ + kT? +k +R + + kT? + + +h + + kT? + kT? +]STA *? +9j +9 +9vhi +29u*b 99V^`* +9s +9 + +9 Y@ + +u +9.( +* a +* a +clBA%ef# +)}Xk|qS`"+GJ}iIk=RJf%룐rJ} }@q(}efBA%# +9` +D@7) +H;@@ A +* a +* a + +(# + +(# +* a +* a +9@ +9thH9 + +}R- +(A +KK +Kh
+93 +90 +9 +* a +9`B +* a +* a +* a + + +Ո Ê? +Ո Ê? +D +9 +a +* a +* a + G5H>|W G +K- +G + +! +j# + +% +Ո 7 + + + +Ո hÊ? +* a +9;* +* a + +* a +* a +~ + @@!a +* a +D +ijj^
kK
+jjC)} "IqS)}$fӉ| +}@qH}e%# +a@) +*)2 a +9hbI9h +* a +9( +* a +
+* a +* a +* a + +K + + +}S)! +*C +e@(@j} +? +G +9J + +il5ifJ9)l5 +92dR*hB +* a + + + +* +* a + +* a +* a +* a +R*)')ں +S + +}S}Shj +@2# +yA +! +E +Q +A +M +y9A +@9@9Bl=2 +@9 +@9 + + +@9 +@* +
@#sW/ +C + C +J92t" + +@ + +R +}S}S + +J92 + + +9J +9f +9whix +9̳ +9 +@ +9 Y@ +9.( +* a +* a +cl>A%ef# +)}Xk|qS`"+GJ}iIk=RJf%룐rJ} }@q(}ef>A%# +9`D@7; +* a +* a + +(# + +(# +|hRA( +* a +* a +9@ +9tϫhH9 + +#̫@@ +DgDh2Hyi6Hyj:Hyk>Hy +D6 +KK +Kh
+D6 +9+ + +9U +9 +* a +9`" +* a +* a +* a + + +Ո Ê/ +Ո Ê/ +9 +a +* a +* a + G5Hp|W G +K- +G + +! +J" +*$ +Ո ' + + + +Ո hÊ/ + + +* a +9z + +* a +* a +K +Dh6`B +Dh6h"Hy +*3 +9) +`@aRAФRJ +9J2dR*hB +* a + +* + +ibjV
kk
+jbC)} "IqS)}$fӉ| +}@qH}e%# +a@) +*)2 a +9hRI9h +* a +9( +* a +* a +* a +* a +* a +R*)') +h!@9@9
@9 + +_( +3J*
+H +@9@9 @9
@9JSj33H**! +xSx3)~J +k ?kk +*?kj +K(@K_ +_WO
{(R +@9@9* +S*3I}S) + +)5< + + +KkL! +) +* +@9?qE@9S_kp3Q@3k* + + +* + +@9 @9
@9)SI3i3Z(*7 ++ +UZK= +j= +1Sj+8`j +J`yS})}j*8_`) +} `J` +K vS_ +
+ +@9$@9 + +@9@9 @9
@9JSj3' +( +* + +@9 @9
@9)SI3i3(*# +*Zj +)_ ++}@k +IQ +)n5 +* +@9R@91S331*Y + +@91@9 +.h5jm8/@9, +@9-@9 + +p}@_ +QU + +St3J +*$`@9jr8je8k
@9 +q +h +@4yu4 + +@yz + +@yz@\ +@yy + +_ +Kj + +* +@ + + + +@ +@ + + +@ +@ + * + +H;@* +2 + +9 + + + +9i + +@ +@ + +{H;@** +kR(1 *Rji8i +k}kckb +_k +k) +k +kb +k +} +rJ}Jc_k" +kC +}S_k + +I- +@ka + + +k +k + +k +}+ +b +"A!( + +@@ +k* +}RJ
}j R̬Řr}}+ӌb
_k( +
*RJ쳊 +R + + + + +@(! *A *a *I) + +! +A + + ++ + +K +cA) +ib +@wZ + + +)eS& + +* +HhJ +?k +} +}_ + +_ + +
+? +-
+@9 +Hr Ke@- +K + +k +*L +kQ +*CT +*) + +i(0 + + + +k + +}K} +}@*|~{EODWC_BgAF_*Rhh8 +DI*}lc? +* +Ϛ}P +kQ +*T +*) +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +*/)/) +J_ @qThFIiNI(} + +0@9 + + +0@91 + + + +0@9 + +h +h +j#h +; + +@9
+@9}Sr + D) +AI f@ +F? +k; + + +*EUU+BJ +*jI lEy) +j kIy +j ?aTh +f@ +F? +k +HT? +km& +A9* + E +B) + E +B) + D) +AI f@ +E? +kJ +G? +kM + D) +AI f@h6 +G? +km + +SB(2!tu&S +SB02Js +yR*y6R*x +R*x +R*x + +x +SS +< +2p}R**+w +SBd2o +u< +R**sqR +R*s +R**s +k1CqR&R*ps$R**ls R *hs2 + + +R**rqR +R*r +R**r +R*er +Rk +R*^rqR +R*rr +R**Xr2***Sr +k1CqR&R* r$R**r R *r2 +R**q{21 +~~~
~~~~~~~~~~~~~~~~~ +iA):} +@@-n +I} uS3 +tM{! +@@hm +}S}S)])mk!@@ +U +hm@7`@a +BbBm +B+Rm`@@+Rm`@2 +k`@3R*k`@4R*k`@4R*j`@3R*j`@2 +2/dc.@a +2*&d`@2j4 +ja +@ +7 +7%j 7@;Ri + +@ib@ k +@ + + +K +K +K> + +K +K +} +} + +@j.@2 J + H h +@I +@ +7@@ +@2
2L +@ + +@a +@J +r +@J +r +!@9 +!@9 +*_ +@ !@9 +@ !@9 +2,! +)2! +)2! +aRj + +*! +@!@9)LSaR +@_% +@!@9,K +7 +@aR +k2K! +@!@9 +7 +@+!@k BK% +@!@9 +`R
@`R* +J +J2! +@!@9 +7 +@aR +K! +@!@9_ +@짟 +I! +!@9@? +*[]* + + +K@ +hJ +(+! +hJ +(!@ +@@? +GHH)(! +GHH)(! +a + + +@? +h + + + + +7hR@9(6 +7hR@9 + + +6 + + +@ + + + +@* +@ + +[ + + + +S + + + + + + + + + + +$q +Qi + +@ +߿Rr@ +k +* *uN{ +R*r? +k@ +k
+R*r? +k@ +k +R*r? +k@ +k + + +
+ + + +R*J.@ +@C + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + do codec reset + + + + + + + + + + + + + + + + + + + + + + + + + + +%s + + + + + + + + + + + + + + + + + + + + + + +vdi_get_common_memory, pady:0x%08x + +monet.bin size :%d!!! + +VPU INIT Start!!! + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +;`@0ɛ @) @9! @ 1 @ +w + +Ș w @ + +@ +@ +@ + 8v + + +*:J_|@Lv + +@ +@@ ( + + +հx s@?@s +@ +ȉ`@x + + +l@ + +Zcl@6 + +y +ȃ`@ xx +Ɔ䃸l@8@x +l@ +Ȃ`@ xx +ްx +8F,h@9 +@,i@k +h@F +@Ԃ + + +Ȅ`@ +`@ +䄸p@ +4p@ +䄸p@t@@8A@8 + @ @ @!@ @1@ +$ @@) @@9 @"@ @2@@F) +'߀@@ +Zw +s +s w +s w +s w +Ș +Ș䑸 +Ã +Ș䒸 +@Q +Au +Ȑu +@܁u + +ɉ@Չ + t +@ Չ"ȋu + + + +YI9
) __) +p`P@0 +u +YI9
) ___) +p`P@0 +u +Y
I9) ___) +p`P@0 +u +Y
I9) ___) +p`P@0 +u +Y
I9) ___) +p`P@0 +u +Y
I9) __ޘu +Ȑu w +Hu +ɐu AuA +Ȑu + +@#@ +@}( +ɐ &@8 +ɐ@9&@8 +ɐ@)_8
+䛸 +ɐ@ +@ +ɒ@ '@" +ɐ@ +ɐ@ &@8 +ɐ@ 9 +@ex@KF @KF8@憸@T +@e@]ߌ@ +@e +Ș w +w @pB@( +w +@ +w +w@`) +w Pw +@e$ +@e@zi9@zi9@ziT9@6F41 +@e(%b@v# +@e +@e!1@ve@A( +@e!@ +@e!@3@v@=@!1@! +@eL +@e! + _Ih>MlI)v@( +@e2@KQ()C恸@pa@0@KQ()C恸@a4A0@KQ()C恸@d@0@KQ()C恸@Xd@0 +@e0D +@e +@e +@e! +@e1@Kq0@K0@ +@e1 +@e_@v +@e1@KQ @ +@e +@e)C@d3@KQ()C恸@d4A +@e@KA(x@KQ) +@ +@eɒ + +@8@48H@
@( +(@t8H@( +(@8H@T> @ +)t9H( +(@D8Ic(@ގ@0߀@!ߎ@+ߘuB48@ +ɞ +@@Q( +ɔ +ȋ@( @Nʊ( +( +@e8?߅ߘ +ȃ@T2@ 1@# +@߄=M3 @h>M @ +@ +PɄɦȄITX(V,@"8 +䂸@9" +ډ +Ȇ@(
@ +8 @BAĄ䂸@9@" +2@ +(Ȓɉ +$$2_(( +@(Ȓɉ +H +,-伸 +,- +,#@&@((䔸ێ䀸(ᇸ(Ȧ/89,ᇸ(,ᇸ(Ȧ)8Ȇ@4 +䀉ȁ(y9ը(9ȑ)8c +ɑ)@(8@)8ȡ)8c _ض +@ +@ +@c +AJ + +䚸 ( +@ + + +@e0(!?>@ +@e0 AAP*Ș +@e0 +@e OA@*Ș +@e ރ1 +@e +@e @ _ +@e1@KQ& +@eX(XY@cߐ䚸(F +@e@ +@e$@_@>@ @_ߨ@ +@ +@e wމ3@$( +@e +1@82@>@@KX$@@H@TD@ +(Ȑq@n(䪈Ȑq@g(2@1({@m8(8(8@z( +$$@ +( +( +@*(@P@:(@K +( +D +D +@l) +Ȅ@ +#@ +@e*ʷ=@#@ +Ճ@E߃@_@@Q߃@߃@_@ 9 1 + +"I!Փ䐸 +(8@8_@@=c0( +@8@8_@ _8i +@e8 +@e3 +@e# +@e# +"I!Փ䑸 +(8@8_@@=cA( +@e8 +@e2 +@e" +@e"@( + (@=cB1 +@0(;M- + + + + @Y +@T3 +@T)@2a(@$ +@T)0 8I+M@ +Ȁ䀸@4@ +@e# 1@ +@[! +@ +ȏ + ( +@e> +@e> +@[! H8+M8@KX" @$(@g, +
@ +@e&@KV @@g! + +@) @x91@8_@(9+M(@( +ȍ2M2M + + + + +@ +@ +@ +@ +@ +@e@6 +@e +@e2@6 +@e3@@3@@zi( +@ +@8;M"@ +@e"@ +@e2 @ +@e @H +ɉ
@P8 +@e2 @& +@e@6,@ +@ +@ +@8
@P(
@Q8@ +Ճ@ :P-"@[(@@q +rȈ +@k" +@e# +@e(@ᆘ,ᇸ +@e ?@, @ +@e) +@e8 +@e +@e +@e +@e?M@ ?M>M3@# >M3[@KS )C@pa +@e@@ +@e +@e<M3$@[%@(ՊȃlB)i@(h@ +@e +@e _1@8h>@`@3H@{&zO(@F( +@F$< +Ȍ2M@> +Ȍ2M@( 6}&(@v(@)@)ٸ
+Ȍ2M +@e<?@ +@e< +@e<_@M +@e, +Հ@@@2A!(Ւ@$@$4A( +Հ@@$@$@F +-&@$=6@4 +(Î@" `(8 +@V +$(&@, +@86@0(Ï@" `(8 +@Ȇ@Ȅɿ@ +@e, +@e,@4h +@8@@
0 0 +@e4?@q +@e4 +@e4@O +@e8@@T +@e8@@u + +i@LϏ`@ @+Y@@" +@e +@e@2@3@1@1 y$@8d@d + +@e1 +@e1=M1׃@@Y߹ +@e!@@ +@e!@@P߁@ +@e! +@e1vށ@@| +@e! +@e! +@e1ȩ@ +@e1 + + +@e@ +@e2@EW +@e +@e +@e +@e +@eո߆h@ +@e @Ղ@߱ +@e@Ղ@ȥ +@e +@e +@e@ +@e +@e@Ղ +@e@ +@e +@e@rՂ +@e" +@e2 +@e@ +@e=LչNߘXչ +@e@AՂ +@e" +@e2 +@e@ +@eU +@e@"Ղ@3 +@e +@e +@e@ +@e6ރ@ +@T! + + +Ã +@e4 @AߘՖ_@ +@e4 @!2H"ppHBPOp"ޘ _h) + + +Ã +@e6 @#ߘՔ_@ +@e6 @
0HBQOp"aH"ABޘ +@e + +@e: \Հ ضi + +@e0 +@e0@ _1@( +@̸>M@ +ۚ@ +&A +ۚ@@ۖIȊ@1 +,; +&@ɇH،?@z8@ +89 +&' +Ȍ +Ȍ +&ÆH ) +i@Q@\Q@W01(ظa +ȃ;M! @@6@38 + + +Ȃ;M6䂸@H+@2*:ހ +Ȃ 䒸@Y(@I8 +@e& +ɔ +@e +@e ( +@e +@e @( +@e @ +@e @y(@ ( +@e @ +@e @9(H@i( +@e0 +@e0 +@e0 +@e0 + +w +w +Ʌ + +ɐ +@ +ɐ +ۘ +߀@ @@8 +@@!@@ +@ +@ +@ +@@#A (>@ +@:@#@#:@@3 C +@:@#:@F @+@f + +@ +_@ +ߑb@ހ@խރ@(tD)Ԁ@ +J +@@<@:@@ @@,@*@<@:@@@ +@Ԅ
@ᐸ@ؽAᐸ@ؽ@:
@*
@:@ +@@@*?A + + +@ +@@ +@ +@` +@@@,@*@<@:@@ + +@@@,@*@ +@@ + @ +@@Dˎȃ&$VT@@@ؽ@@@ؽ@ؽފ@@@@@@ؽ@@@}ؽ@@@sؽ@@@iؽ@@@_ؽ@@@Uؽ@@@]ؽ@@@Sؽ + + !@3@* +@:@ +ފ
@
@@ؽAA@ +ؽ@<@:
@,
@*
@<
@:@@ +@@@,@*A[@:@@ +@ +@ + +@ +@ +@, +@* +@< +@:@@ + yފ@@3ؽ@@*ؽ + 2ފ@@ؽ@@ؽ + ފ@@@@ +( +Ș +( +( +(} @ @@( +@@( +@@( +@$@( +@4@(}@@( + +( +( +(
+( +^y@4@ +Q@@( +2iȄA + +@ +( +@ +( +@ +(
+Ra@$@ +2a@4@ +a@ +@Z( @@4@2m@@m@ +@z(@@$@ +A$@ +4ʈAڊA$A4 +Ó䚸@Ȇ +@@g +@4@k
@
@$
@4@@4@@@$A?3 +) +@ +@ +@$ +@4@@@$@4@@@$@4@4ޔA +@ +@ +@$ +@4@@@$@4@@@$- +@ @@ @*@$ @:@4'A$A$ +) +@ +@ +@$ +@4@@@$@4@@@$@4h)I P +Ȃx@1.}؉"u +ȁ +@(@@HA@ +@!ASCDq_@@1q@1 +ȁ +ȁ +@( +@ +ȁ +@(( + +@!SC +@!_@@SCbA3Q@(8@ @׃ +_@ +_@ ߂( ߁ ((("( +M$ +@@ +@@ +@!@ +@1@ +@A@ +@Q@ +@a@ +@q@@@@@@!@@1@ @!@ @1@z}0g@A +ȃx@( +ȃx 9@ +߄&ߢ7@ +ɔ +_@ +@A@A +¢Lۃ䂺9@^߄ +Ȍa_|@ + + +ɞ @ +1@ + +ɆȎ @ +?@ + +
@"@2@H7@ߘRB _@1h@,ߘԃ_@_@ +2 _hI +OY ;@߃ + +P +䃸䘺Q䘺Gߘ +@߁@P߁@߁0@E +@ + +$@@( +ȁ@( +ȁ@(@ +@2@24 + @@ZȈ@@2 + @A +@ +@# +@ +@3 +Ș + @ +@wW@"@3@@_ +@"@ +@2@ +@)@9@# +@ +@@ @@@ +@$ +` +@A8((Xt +@9 +@9 +@!9 +@19 +@A9 +@Q9 +@a9 +@q9@9@9@!9@19_@ @A8((&t +@18 @Q8((t +@Q8h +@a8d @a8 +@q8] @q8ߨa +@8@8N +@8@8G +@!8@!8@ _Hh9@ltD@߂ +9G +Ȉ'B@3BT@$2@ +@$R @S + +ɒd@ @@# @@#1tD@ +ȁ +ȁ$@ + + +ᗸ @@и*_@
}mm}9F=@* +@g9F +&@ )+ @ + +ȉ + + +) +@4_@@ +@" + +@2 _@Ը@ +@
*@= +@$$ Ɂ Ê +@ +ȏ +@
* (@$ +@(90@4 @ +@( +@8@ |_tD9@ܸ +ɜ@@䀸*( +ɜ@䀸* ($#$ؒ +ɜ@@ +ɜ@@ +ȃ &&B@& +ȃ @@+@,@ _Hi8@4 +@"@ Ɇ _@ +@"BA + +@8_@(9@$ +@( + l +Ɔ䊸@&*@93Դ@}߁ȉ + +@Æ䊸@] + @ +䍸`@ +CLg@h@ +1ƃ + ȉ
+Ȋ + +Lᗸ +ȊɎ4_@Ɏ@M (@ +Ș䝸`@ȍ(
+ȍ@@i
ޒd_䔙 +䞸@@=`@ @ Ñ`@ +nF@D`@ +Ȏ@ +ڸ +ϟ䞸@@@@@@ +ɞ}A ۆ˶@ +ɞ{A R +ɞA a +䖸 +ɘ`@ + +Ȁڿ0 +ɞ}A @ۆ@@ @@0(B@H@&H + +䋸@FԀ䋸@ 9@8 +ɛ @8h@Ȇh2ء8_@ _@ +*_/0 +ȁ@ +,۸ +!@$ M + +ق( +Ã䏸Ճ@7Ț#80 +4 +ɉ䏸
Չ@ᗸȪ)80
+@ +ɉ䍸Չ@ +@ +H +@@ @v@ +@@
@@
@@
@@ @t@ @H@ @@ @䐿ۀ䐿ڀ ـ䐿؉ @ @ ) +Հ@@ @|fߘgCB@ @|S@Nߘn@ _)թ/#! +"@ + + @ + @h-@ +Սߘߘߘ +ߘ +䃸߃% +ɛ * +ɛ *@@c +Ȋߘ8( + +yߘSOL
n3OL
h@OL
_( +sOL
SSOL
O +o +߃(ߘl nߘjߘZaߘ]ߘMsOL
4P +K丿:&,ڸ +䜸 +N_@ށ䊸
(@($@2"@@@@@ȋ@@ @@ +ɚ <1ۃ@@ +ɚ + + +D@&@6!"# &2@6-ߘMH +@*&&@ȆC +
B + + +@Ȃ@ +@2@&A,__@ )@-܁@/Ճ@1~ߘߘ@!( + + + +䁺 +_ _A.$A¢B + @ᅖ@ᆓ٘B@阽݉@^_@@TBOB +e@~^ɉ _9 + U +O*A@OXb@ +b@=,'b; +/ @s + @ + + @ᅖ@ᆔ +Ջ +@߈3 +@߈ւ@E߃ @ +@߈@ +@ތ@<(9_ +Ą +J@ + @-߃@GjTOFW +@vzOv @߃ +@L0sO3s@߃ +@ߓ@ +@߃@ߓ +@(9 +@w߃ +@s߃ +@m(9䃞 +@ߍ +@ +@߃@ߋ
@ߌ
+@:߃ +@4ߕ +@RߨEpob +@Dw?`
Opl +@6߃@E +@
ߏ@. +x@o@ +@@߯Ekol@߃@UUSUOUU@߃@߃@n䃘@ +ʚɔ + HԂ +Q@@ՋQ@@ +Q@@ՋQ@@"Փ}ɋ} "䋽Ȃރ@@J +Q@@ՋQ@@#Փ}ɋ} #Ճ䋽Ȃ@ԋQ@@ԋ@J +Q@@ՋQ@@$Փ}ɋ} *䋽Ȃރ@ԋQ@@ԋ@ԓ}ɋ} J +Q@@ՋQ@@*;ԃ䋽 +ԑ + +@ + +(@. +Ċ@ + +@F +@8 +@ + + +0(@@ + + +/_@+@xR +\p'<ޏ@ +@՛@RՌ +ȉՃ4@ᄘ=H@ +
8ك@lhcll. + + +d*@
&Մ䀺`
+ +d׆_@@ + +
+@@ՁH +@@ + +䂸@ԑ䖸 +Ȁ- +䖸 +Ȁ0@ޚ +@8 8/ + +H@ +@߱ո䳺䱿ݑ$ +Dݐ +@rDT$ރ@\բ + +Հ +ג䑸d@h@ +@ +@ +@3 +>@; +@3 +>@; +@ +ȉ @-@0 )@1-@8Ւ +ɘ +ɘ + + +@@) +( +@h@䉽 + +Ċ@ + +@C?@ +%@ +ߊ&@ +t@8 +@ + + + + +%@&@ +ȉՃT@ᄘ%@t@^@Նh䌿Ֆ%@ߊ@T@ +h߆@q +䖸 +ۜLe@E&@ +@8 +@ +ȸ䳸@七hn +@߈= +nnn@_@ + +@tߊMQ@O@@C@B@@@n + +݀@'@@߆@ +@ ++ + @ $Ֆ ( 8' +@ +'@' +@ߊ@'@߇ۃ'@G߇ +@sߊ
ۃ'@j߇@@ +](@ + @'@8 + +@ߊ + +@ߊ +(@ +@ߊ@,@!@Ֆ ( 8L)@h18a:' @q߈ȑA +A'@߈N +@8`ރ'@߈>@L$
a +ȉH@
H +@߈ȑ + +@Xߊ@^ +@ߊ8 +@6!ԍ@ԍ_ +@ߊ@8 +@) +98@)2 + +ɘ +@@( @1 +ȉ +ȆXF_@ ɊȖF +Rߊa _H e + + + +ȅo +˿@ĸ +TO#o= + +9@o +Ș䒸@ +øB +B@D +ʤ@ +qߘ +83 +_4@@D@ +_4@hɃ <@+ߨ@$(@A (R²<@RҺ<@
+A@ + ]&0@!ܐ@ +@ +@ + + + + + +8 + +LDN&Nb +<&N(LD.k.C +<r3 +< $ +Lj΄̆fb.sf.*E> +0.( +<D +LDN$LF(H(Lb +Ϟˢ.!M!MϞ. +G +L( +<(*M( +&(:'(J?* +<L +<? <LL*L*NGF*(R`~̀<(*(<< +C(D*C><9 +<A<M + +((71X445<.)$*L +2(X2<3(3<4&5N)*ς/ .LE$FLG$HL4&5N$%.($$%L @$ +D0(A< +8 + +LDN&Nb +<&N(LD.k.C +<r3 +< $ +Lj΄̆fb.sf.*E> +Li&jNE +<x +<I +*> +C˄4<6>Ik>I~2Y0 N>"0(w9~*y%(D*N +Lj΄̆fb +>#< +.q(*tx +f +U(K + +407<+>z>>=(X(b(> +l(u +.=(**( + +7+(4Y*;Z({.g*f(e +a>.(*3M*({<p(<(<(q U(K +. +q +-m<m&N X#* f< +$L +=. +k*x(Uy(Uz( +U{(U +T,@A+T(* +, +
+ !(
")0#*18$+29%,3:&-4;'.5</6=7>?$#)/#,6A)6FX$/AXs!!)!)6!)6G!)6G[b + + + + + + + + +DISPLAY QUE OVER-FLOW + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +H + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +H + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz +$4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz +t +1mx1`Ձ$S'~trE@jИMMJ8ˠ}pѝlZB3*hXAa `r)vE\l7N.,Od҆>"?čOft^Q%-S[],(%&`( +-Agt|8SP7#Jr+,3z=%vˍ$i3'XQ<L;JNhX} P[?~q#dp¹JƮ?~#UhdV3N ꮯ1r#ri+6>,r#R!mN:[/;EO\Z5ThpMLVl8)x^{=%V^bi}{OGp^{Ho@lN5Gq"@RbjreUic.ͧ:2Jvz)|F;O@*-k#Bv}у])wB +.˕鏳xN
V"eU +y҄N*ҘCs=(l/DGI"ċ*mXRy@(Omb +>;SYʟp29DF:Bk*D*C
̰/,aR?ߟFX`rt2{AM3{}lΞҚUZϷj +H%~"U,!x ?O10a8UT^BAOqE,
~CFb9\^|ZWVx?t--R[{y2_?b"^AL}n<ۧf?vΑdx>ulW(ob=G;pSbTFh;ܷxB[^d(姀ݓ9v[J\"ɳU2dJ!{8K̤d0+$~ּ';~;˻#Q +n, /PF%홄&dʹ.EV@_FjjWtv[[lJ4sW2DvS[ޒ-X}ߞpfǸeb> +j30:r/H}Ldc&lD&1eIӵUli%26k-UXOؾ+&s*{GgOv>"bQ",/tu~fNߗTXJjx U3 +"<j\Frzl\\{S=!Kjȥ7X<Ծ>znj%&RvפR\k:Kw
iPIzHf
Optv+OZOm( 2k WQǢ!E$"e2'Eoۋ"xxjjq1'%GcTS"X9ξTXh
('qh;SBf5+b+, w(>!*I':r>$aCK>cгI8rh0[8}w*7b \^[cSv`rqC凌Wf 9@U41u\5@Q;!=O2fB6.-svYB4Ɯ(^$f`s0@w0 bP-&ުt[Mp&Y>Z;2qg8$&fg +.!ul"ZZ)vt# X>W-_Avש;=bf%/G+:iU戶M@.kO0DBFSF; e<\VgJ +6gF 'i<`ڧ +K тymy-Gj8={%]5:Yk1Cr*/_TX)څ!/<S~ɷQ5}y8fdlU +zRC;+NG&b}f@/:Qhr̷7N9oZs7ɳ9(%q_Qe:ƤV@J+|o!]@tYSE^3YkL'ɷj`w&\)Q,a,KKބCNeT~jٳ
ч#cA;ף3|;4Tt+Sfoj8= S.ӂijG4-g6yMszxbP +15]@±Ӳv8HI̗p5
nƨ)c[wc f`S"w0xvco0sڽP08mW |J0̉a)a(kuU0c~nj܉W2 +݇AU8]L)dK8cQS Kgt=A]ivor_}d5ǮTI}>[yrϺYB|k42W%ܶCF\ldDU(=@G +aq/2웑js%n ԧ'UB;<MԜ.(jOK!u +mv-aQ4ӹ8P<]¬'eOVg洕sDMY-|ڼ=M4]/vʃoP$Bݲ5` "߇؛٨cQ)(ɟ=OTai7Z7:._LdEj`1-8r-Dtpv{tZÇ'$ 0 _Oۧl&nƺh+R4 +8 +R +=|Y{ѻ8~ҚYc*7pT5HLf:/Wӑє
9e%2T<Ϟt߮RC,ÌXܓN.Ń%(ppSYG&ZkJFQ/ۅ(O\MXoɩ!Waka6א +cgGU3W;BDY63OAlj5XӗH_դ5GhʽY6@ej,ri +z'!!Y'!d;fJ2Gpl,Ÿ~*a1^DLA29J@Pto`qnQk/0)T8Y䒈"K i{$6]w$y>cSWݫbǴݹf<]SԲl軨cn{~ko}<7PXn;ylkq#n41)
r=˻qѾ>S.c$FJea{;%L\?_!3&͇iE}sb>ꪋ0Lt5O7Vuckuc,!5Ja `ƺfu`S +딧3"6
<牔/@DB<Kp +d|^4I-<j͎L#qaH}
o7,x9N"| 3W#%r%E4\\: +U2۪ +yW&~< 1(>\"
7?+f@wnipg($[CTo^"Kh=ڡޡg*yp\ + +Ai!g߆)G&Z2ÆMwQkyEږ
CTVj?/iP,=ݫ\VaU.oK֊oRjA0EG#a_d/sGN#:y_n@k&~<S'߹ ҍg\Kh]=2,}E(z/O# %+5Y0eOeWN/7dQThWfs&ܭx3(Aw`5ETl68⪹9Ye!e,_8sU~>\@BߊrqNY +\yy^eU_ TFdyɹK,-2 0e'<`7j!"a~Yt͘,HQ<|ѡ +WHnGQ~CoafnHMS='Tu.G+抶wgFKvt +CO\tG#d8?6b*n[LJv{ݨ$+l,)Tj:oZ$W=-BdU(\++B*ܤ3' B
(n;r徦'[\Ϝ 2%\oAm)B.0J"!^ŠjDQ" +(؟{<PCZžCN>3|N;Zj}MؿS=sn'0S?v-9QL[mpI!NĶՠrKk{9ۗDŽövZAhZ
>(}_8M|cӎZ!dlOe>;"Gm*&)zHaeVk_^CT']\ֳ7ܨvہTBTi[ߌ҅K߀61MV*lY36kUizS)88T;Z~cט~tGDŽr-] +1kcJ:#0/ + +2w#Ͻ5LNu,z@6X-qǏЁ~esO ݚ"\[ڍ\#*ec_LM|PI8]"'BܮNИg*"B#Qќ[:VN^!fKcz$)HH=uҹD +Y2,w](E.*6 .ɕ(s+:^fP#ē +VL20oBd3':iJ`uł
'[@lkmHwNX3 +9 'X +yJհ +] (_}H \MhW䮳\s6N.z]`$pDQx "h2Ps +І(_ +0=sGc3D~%ZgFk },En6WI|b3 YJX^ }jM䍐GOO82q[\rdn[QF&GDLuWIlJe?(Q(k `WL/se: +9tT{5t5\#qcL?d7}Y(7O"*ǰ'>Ċ1uKpd'{,a-_SG`13x&pU+[L}ѡкb6g_q)16KC ěF<DH<X4~s +/!HMEG|0DQd~<[bV1}NF<-l| +)AD8%*|JrBTA:o~:En5!G +-\!t` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+kş6BoeԌz9prkң[ NS%qI?r/Vyq<1J. uDR'5S2pTho`h}FT=(͐lzm/N W|dy1ե_rd}V +QfnD{|Lvd<dɯkٮBHcAַD>Q#L-*փOkEXO|$@c.qplD.,$[[u1ÉZe^pZ9AKt)KuXPPfjHED3fGEtOˊWXlv%Lz%H"l眻+$'B9zAoJ!rhphHS[M4\>*^oP];t84IR/96BtK;_|]]i!lv/jbclk#[-9qW)U83 ĭ{
)|.юEgxu{_{qGiz;W6gcOwטv`/fd\Z8F"'JL:^oxw)'6NfDgf@ >FEΝXG&NںfUZ_2&hYi{nO;CS L]ր3߯Yk]
5?. +B&5K14@r+4(k$o}k=Q'|x>,]+ +鄷0m +Wr/Fي~+n^]pIE1% U +TK؏Z<~ ++^k+5JuHxM%ޔ4ojuGmi
9g=JqﵘbbRkM÷VjΌT$yt`$`=|Upj8I&̔&|$7ާ +a\X`W OViH)>7Ͳa +fx᭽6߲ \C:y\nD>)ZEt5|K>z^v
,tL5&۠ ?gQsGh diff --git a/prebuilt/libstagefrighthw/lib64/libdatachunkqueue_alt.so b/prebuilt/libstagefrighthw/lib64/libdatachunkqueue_alt.so new file mode 100755 index 0000000..117fdfa --- a/dev/null +++ b/prebuilt/libstagefrighthw/lib64/libdatachunkqueue_alt.so @@ -0,0 +1,37 @@ +ELF +<#|D + + + +@)G)A +@AT +@ +@ +@ +@` +@h +@aT +@ +@AT +@ +@2 +@* +@@B7@@ +@i@ Th@A7! + +@)|@H @ +@ +T +@9@@5@E +@2F + + + + + +~H#zAM&s#Q/\n-~ٙx}V,*:,j9
Ix8жu$1HEd*rAyqZtFL2ivP؇Ɣy#t*]HdvN Qh:~5XIUwgH +INS686z)K^C]}i|b__nؕuԝΪ=oӠrl캢lbIpϓgz0/ +hQc)bpQ;q@ UY+Q&ecgS>%dF1wP4Z[`pFu7/#[.تc/JZocJ4!o-KË>E^qL&?8h;zr=ZX}`õEIw +l,2>k褴)!תmq~<x#Xcu=HثO$T)pΌ>1 !=`!Jd/-
T͌d5d ڋXt1NxےJ$8<owƃeST + + diff --git a/prebuilt/libstagefrighthw/lib64/libfpscalculator_alt.so b/prebuilt/libstagefrighthw/lib64/libfpscalculator_alt.so new file mode 100755 index 0000000..e74e49b --- a/dev/null +++ b/prebuilt/libstagefrighthw/lib64/libfpscalculator_alt.so @@ -0,0 +1,10 @@ +ELF + + + + + + +H^[2-ahvέ-j#?e.èdc%1`p!|Q#ZEykE*<c%^8RAGΝAzolcKcQ; +Ur0a1zDL|}I7g@Y@TM*B}(btW4"˃ywi'|h#tV
ߧX;E2.oFsz (A[*4.{^L}i]iVR +y|eq,`
u/gݛFqNJ-Y|$Pgs$'FCCKAYkS4c:Iɉ9x 30J+|0ABw)8No!;zڶz0C+iu[I(6#c]{EdvTy%1# J)u6աsj@Yrp diff --git a/prebuilt/libstagefrighthw/lib64/libomx_av_core_alt.so b/prebuilt/libstagefrighthw/lib64/libomx_av_core_alt.so new file mode 100755 index 0000000..4a4ff4f --- a/dev/null +++ b/prebuilt/libstagefrighthw/lib64/libomx_av_core_alt.so @@ -0,0 +1,14 @@ +ELF +|+GܐwCE
KDw9-N"9{]IУ&9]蘚9GvK>o
F܄6t2BY + + + + + +@J + + + +_iա;y{$CDvN MN@w;u҈QDEʮh|BC*X!?UAճNQ\ +}j8{{\S=B$>h^YAM0"yP.dyO=V}oAG(Py+|sa{ڥ&&FⰨY)ӣ0#+2J)fXZY2cթֱ=@@z҉xX۷=!&2|z݀ϨwQv1#|\k +( |Jf/4!_T1 v!1J:
<Mgm+K@(z7Q3J""<묷Ubw] diff --git a/prebuilt/libstagefrighthw/lib64/libomx_clock_utils_alt.so b/prebuilt/libstagefrighthw/lib64/libomx_clock_utils_alt.so new file mode 100755 index 0000000..762d2e2 --- a/dev/null +++ b/prebuilt/libstagefrighthw/lib64/libomx_clock_utils_alt.so @@ -0,0 +1,24 @@ +ELF + + +B +Hr +_ + +) + +@2~h2 +@a +@ +PB0 @* +Jp)@U
˚ ?֨{BOA +@a2 +@(HAh + + + + + +m 1Lf<S: 5)
*ik 1.ev0u`Keª7{gWcO:0yDfq<q4Y0;80O<*ʚ| nɺH +X־V3ݰ;QSJƬ|{w˥ONL+tAH3j*XU + diff --git a/prebuilt/libstagefrighthw/lib64/libomx_framework_alt.so b/prebuilt/libstagefrighthw/lib64/libomx_framework_alt.so new file mode 100755 index 0000000..dd569b9 --- a/dev/null +++ b/prebuilt/libstagefrighthw/lib64/libomx_framework_alt.so @@ -0,0 +1,436 @@ +ELF + + + + + + + + + + + +3 @0@4) a@0 VΨ +k P +Q$'!"}!Ahh +)ePjI@[o۠8e>c)SkguG XuW/|$N4jckT[V%>~
쎦ŻdI8 ]ѓ8K*aY6GFPc&g~c q&=*0me*!T'ePMP[nT$\+ķ'Hԥdh9!'oOzz {_6ByZPy"JN]KVjՓvQCEKS34Nhkd
@E_LVūϞKüo* $22aTso[k S>9X>bWV!^S(Iԭ!&9MPig75-.9NPTU!М +n&ٕAŊ֚KV7PizAx[_XMAv=`|ռ^_.8K;[s]A9^F^6er&hp/Ԑ>/ +۠kTp+ ]42"`˄dFqT0tDchPhIa+ˉh -'Ϟ*ur˼oIwnC~|nX/k9oƄ VeL~fRqlv[efxRyo+BJ"7qX"H)yei) 7'\5#?s>&^!(:#|vF`$Z2۠>ZgLT`BϩePl 8W3>ZApz}ʄSZ + + +33n445l + + +CB +DB +EB( +FB0 +GB8 +O{H;@ + + +@A K% +@A K% +@A K% + + + +) ++@ + + +` + R*ZVvw +9 +9 Rh +vw +9 +9 +999ihn8r9 + +@# +@@# + + y;);k +kk:(kca + +kA + + + + +H;@** + + +h@sA +{H;@ +{H;@* +O{H;@* +U;ը@V +H;@ +@"#K +@"#K + + +@"#K +@"#K +@"#K + + + + +@"{ + +@"{ +@"{ + + + + + + +2 +- + + + + + +R*` +_WO
{H;@ +hA +R* +O{H;@ +{H;@ +A + + +{H;@ +hA + + +@R= + +BsA + +@sA +a + + +@ +@ +{AO¨ +@ +@ +@ + +@( +@( +@ +@ +I + + +@ +@ +Rw +@4`@{AB4{C +h +(Mh +^8 +!<C +A +H +{H;@A +^8 + +H;@* +@"# + + + +@VD kA + +R*h +h& ) +)i")i*)i&
) +@iVD k +@`" +@B)A +@`" + +@`" +@. +@f + + +@`" +j ?Aq+ + +ki + +R +} _k + R2,1?@q-1?kJ +k1i")?@q2#1@q! +@! + +@ + +@A +@A +@A +@A +@A +@A + +@"# +c +@q)j)C*Ǒ)} + + RBh + + +@"# +@"# +c +@q)j + + R@h + + +@`" + +@`" +@@! +@`" +c +@q)j)C*Ǒ$} + +^8 +@" +@" +@ += +@ += +T;Ո@ +@" +@" +@"# +@"# += +@"# +@"# +@"# += +@"# +@" +@" +rhB9F9J9N9jz`:=9{BOAC_{ +{H;@! +H;@ +@ + +Eh +@ +@RD +@ +@D k +@D + +@A k +Rh +)hR +r? +k +)iZ +R*! + + +@ + +@jA@? +k8 + +@ + +@! +@iA k +@`" + +@) +@iRD k! +@iD k +@*h' +@iD k +@=i*( + + +_k +_k +y@yh& +y@h +@h"@yh2 +y&@yh6 +y*@yh: +y.@yh> +y + +@) + +@) +@A ka + +@ւ +@2` +}@( +k +*@9 + + +@_ + + +@i@9 +@ +_ +%s + + + + +secure memory not enough. but at least 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +x +`4
0P8p + +#xԗ I
N>E2=3T +hw,X$N;&a,N:KBn@m'MFH[lȕ/Ųmlq>Z0EDDN<Ln tvQ)0-S0\jr ]"̰xhM@M~ooP+r|`FrBF2&579\cP
J.VĞF1 ;۹JTR෧
_]K8STkۙ<m>n&?;85X +
36o,aNF2G5Ali%Wpˉ"e'P/;&xY'rSddl_Yk@;//r9I!g?1e\"3l7Y~&/Z+) s,*ao.@>]]>b{*B.B(hF-FXKY,WΏp0!jn]۳ A"@@rDۇe(ÑNKo+F%b/sKmY-(rk}rJ<61FwWӕ3=lj[zn_ϟ+UC6
Tnxvj?-OUɎ;E9]t/_4M h0gWPpiY +n;aYex% +P댁MҠ%D>.6jP6? +[gFwR-'Lrלxe^"W,\l~+mIY7R@ 5$цlGnZt2AviDmי8!/xqF.9P +ŧ8ܮ+
c`@4|Ne %↤L7--Gx<>cQI #,Ɖx +/ +g + + diff --git a/prebuilt/libstagefrighthw/lib64/libomx_timed_task_queue_alt.so b/prebuilt/libstagefrighthw/lib64/libomx_timed_task_queue_alt.so new file mode 100755 index 0000000..3d14d1f --- a/dev/null +++ b/prebuilt/libstagefrighthw/lib64/libomx_timed_task_queue_alt.so @@ -0,0 +1,32 @@ +ELF + + + + + +%qrk!A4MczqX*.H|wxWCE쪏ooZ[a}_%q*Lۦ + + +) ++` + + + + + + + + + + + + + + + + +˂ηd}gJ|11V4@YNB(Pm+"E"rE +1疢juRB qY;0~6傛HGiyb)]r&+Bm.bil 21u{r&SG %H<H/f@r2@՟7Bk%U3҂Q +ʭ$Hv|"hdQho'^~W+.]ѸCvt"T)u7:A(/~ZDTLM<7e~L"5 ȽHJo$*wmؕ 'q]qATKHmgqK]~3$R.}oFQ[g{?( +j>Kj6dca5mp!zc&XvVr + diff --git a/prebuilt/libstagefrighthw/lib64/libomx_worker_peer_alt.so b/prebuilt/libstagefrighthw/lib64/libomx_worker_peer_alt.so new file mode 100755 index 0000000..ac78f28 --- a/dev/null +++ b/prebuilt/libstagefrighthw/lib64/libomx_worker_peer_alt.so @@ -0,0 +1,8 @@ +ELF + + + + + + + UwPY |\lp{PC3-=:SP"-vIR~շ
+%+eWS^4=6v4ܖzR9Z`Ve=u6Õ~f&Qe}H=(LNjӠW,[eZLLN>PUCQPA}YQ8g`W¶wa:0zI4 diff --git a/prebuilt/libstagefrighthw/lib64/libstagefrighthw.so b/prebuilt/libstagefrighthw/lib64/libstagefrighthw.so new file mode 100755 index 0000000..f6d3d6d --- a/dev/null +++ b/prebuilt/libstagefrighthw/lib64/libstagefrighthw.so @@ -0,0 +1,32 @@ +ELF + + + + + + + + + + +@`" + +@{AB + + + + + + + + + + + + + + + +Ѝu6zި[ҬQ +9q1~kֳ?t?Ãls::;dLv՛2]K*7F;Nä֞XJ7pnٓ3+33-#IbXj`0="@6`^@`;*NPNtȘ"?qLA +Fx`{+ diff --git a/prebuilt/libstagefrighthw/lib64/libthreadworker_alt.so b/prebuilt/libstagefrighthw/lib64/libthreadworker_alt.so new file mode 100755 index 0000000..9bd2e93 --- a/dev/null +++ b/prebuilt/libstagefrighthw/lib64/libthreadworker_alt.so @@ -0,0 +1,9 @@ +ELF + + + + + + + +~+0-|Key9 diff --git a/system/.gitignore b/system/.gitignore deleted file mode 100644 index 549ab22..0000000 --- a/system/.gitignore +++ b/dev/null @@ -1,3 +0,0 @@ -# modem is a separate git project -/modem/ -/droidvold/ diff --git a/system/droidvold/Android.mk b/system/droidvold/Android.mk new file mode 100755 index 0000000..6356425 --- a/dev/null +++ b/system/droidvold/Android.mk @@ -0,0 +1,73 @@ +LOCAL_PATH:= $(call my-dir) + +common_src_files := \ + VolumeManager.cpp \ + DroidVold.cpp \ + NetlinkManager.cpp \ + NetlinkHandler.cpp \ + Process.cpp \ + fs/Ext4.cpp \ + fs/Vfat.cpp \ + fs/Ntfs.cpp \ + fs/Exfat.cpp \ + fs/Hfsplus.cpp \ + fs/Iso9660.cpp \ + fs/Sdcardfs.cpp \ + Disk.cpp \ + VolumeBase.cpp \ + PublicVolume.cpp \ + ResponseCode.cpp \ + Utils.cpp + +common_c_includes := \ + system/libhidl/transport/include/hidl \ + external/libcxx/include + +common_shared_libraries := \ + vendor.amlogic.hardware.droidvold@1.0_vendor \ + libhidlbase \ + libhidltransport \ + libsysutils \ + libcutils \ + liblog \ + liblogwrap \ + libext4_utils \ + libselinux \ + libutils \ + libbinder \ + libbase \ + libext2_blkid \ + libext2fs \ + libext2_com_err \ + libext2_e2p + + +common_static_libraries := \ + libfs_mgr \ + +vold_conlyflags := -std=c11 +vold_cflags := -W -Wall -Wno-missing-field-initializers -Wno-unused-variable -Wno-unused-parameter + +include $(CLEAR_VARS) + +LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk +LOCAL_MODULE := droidvold +LOCAL_CLANG := true +LOCAL_SRC_FILES := \ + main.cpp \ + $(common_src_files) + +LOCAL_INIT_RC := droidvold.rc + +LOCAL_C_INCLUDES := $(common_c_includes) +LOCAL_CFLAGS := $(vold_cflags) +LOCAL_CFLAGS += -DHAS_NTFS_3G +LOCAL_CFLAGS += -DHAS_VIRTUAL_CDROM +LOCAL_CONLYFLAGS := $(vold_conlyflags) + +LOCAL_SHARED_LIBRARIES := $(common_shared_libraries) +LOCAL_STATIC_LIBRARIES := $(common_static_libraries) + +LOCAL_PROPRIETARY_MODULE := true + +include $(BUILD_EXECUTABLE) diff --git a/system/droidvold/Disk.cpp b/system/droidvold/Disk.cpp new file mode 100755 index 0000000..8bd3e41 --- a/dev/null +++ b/system/droidvold/Disk.cpp @@ -0,0 +1,593 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Disk.h" +#include "PublicVolume.h" +#include "Utils.h" +#include "VolumeBase.h" +#include "VolumeManager.h" +#include "ResponseCode.h" + +#include <android-base/file.h> +#include <android-base/stringprintf.h> +#include <android-base/logging.h> + +#include <vector> +#include <fcntl.h> +#include <inttypes.h> +#include <stdio.h> +#include <stdlib.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <sys/mount.h> +#include <sys/sysmacros.h> + +using android::base::ReadFileToString; +using android::base::WriteStringToFile; +using android::base::StringPrintf; + +namespace android { +namespace droidvold { + +static const char* kSgdiskPath = "/system/bin/sgdisk"; +static const char* kSgdiskToken = " \t\n"; + +static const char* kSysfsMmcMaxMinors = "/sys/module/mmcblk/parameters/perdev_minors"; + +static const unsigned int kMajorBlockScsiA = 8; +static const unsigned int kMajorBlockSr = 11; +static const unsigned int kMajorBlockScsiB = 65; +static const unsigned int kMajorBlockScsiC = 66; +static const unsigned int kMajorBlockScsiD = 67; +static const unsigned int kMajorBlockScsiE = 68; +static const unsigned int kMajorBlockScsiF = 69; +static const unsigned int kMajorBlockScsiG = 70; +static const unsigned int kMajorBlockScsiH = 71; +static const unsigned int kMajorBlockScsiI = 128; +static const unsigned int kMajorBlockScsiJ = 129; +static const unsigned int kMajorBlockScsiK = 130; +static const unsigned int kMajorBlockScsiL = 131; +static const unsigned int kMajorBlockScsiM = 132; +static const unsigned int kMajorBlockScsiN = 133; +static const unsigned int kMajorBlockScsiO = 134; +static const unsigned int kMajorBlockScsiP = 135; +static const unsigned int kMajorBlockMmc = 179; +static const unsigned int kMajorBlockExperimentalMin = 240; +static const unsigned int kMajorBlockExperimentalMax = 254; + +static const char* kGptBasicData = "EBD0A0A2-B9E5-4433-87C0-68B6B72699C7"; +static const char* kGptAndroidMeta = "19A710A2-B3CA-11E4-B026-10604B889DCF"; +static const char* kGptAndroidExpand = "193D1EA4-B3CA-11E4-B075-10604B889DCF"; + +enum class Table { + kUnknown, + kMbr, + kGpt, +}; + +static bool isVirtioBlkDevice(unsigned int major) { + /* + * The new emulator's "ranchu" virtual board no longer includes a goldfish + * MMC-based SD card device; instead, it emulates SD cards with virtio-blk, + * which has been supported by upstream kernel and QEMU for quite a while. + * Unfortunately, the virtio-blk block device driver does not use a fixed + * major number, but relies on the kernel to assign one from a specific + * range of block majors, which are allocated for "LOCAL/EXPERIMENAL USE" + * per Documentation/devices.txt. This is true even for the latest Linux + * kernel (4.4; see init() in drivers/block/virtio_blk.c). + * + * This makes it difficult for vold to detect a virtio-blk based SD card. + * The current solution checks two conditions (both must be met): + * + * a) If the running environment is the emulator; + * b) If the major number is an experimental block device major number (for + * x86/x86_64 3.10 ranchu kernels, virtio-blk always gets major number + * 253, but it is safer to match the range than just one value). + * + * Other conditions could be used, too, e.g. the hardware name should be + * "ranchu", the device's sysfs path should end with "/block/vd[d-z]", etc. + * But just having a) and b) is enough for now. + */ + return IsRunningInEmulator() && major >= kMajorBlockExperimentalMin + && major <= kMajorBlockExperimentalMax; +} + +Disk::Disk(const std::string& eventPath, dev_t device, + const std::string& nickname, const std::string& eventName, int flags): + mDevice(device), mSize(-1), mNickname(nickname), mFlags(flags), mCreated( + false), mJustPartitioned(false) { + mId = StringPrintf("disk:%u,%u", major(device), minor(device)); + mEventPath = eventPath; + mDevName = eventName; + mSysPath = StringPrintf("/sys/%s", eventPath.c_str()); + mDevPath = StringPrintf("/dev/block/%s", mDevName.c_str()); + + mSrdisk = (!strncmp(nickname.c_str(), "sr", 2)) ? true : false; +} + +Disk::~Disk() { + CHECK(!mCreated); +} + +std::shared_ptr<VolumeBase> Disk::findVolume(const std::string& id) { + for (auto vol : mVolumes) { + if (vol->getId() == id) { + return vol; + } + auto stackedVol = vol->findVolume(id); + if (stackedVol != nullptr) { + return stackedVol; + } + } + return nullptr; +} + +std::shared_ptr<VolumeBase> Disk::findVolumeByPath(const std::string& path) { + for (auto vol : mVolumes) { + if (vol->getPath() == path) { + return vol; + } + } + return nullptr; +} + +void Disk::listVolumes(VolumeBase::Type type, std::list<std::string>& list) { + for (auto vol : mVolumes) { + if (vol->getType() == type) { + list.push_back(vol->getId()); + } + // TODO: consider looking at stacked volumes + } +} + +status_t Disk::create() { + CHECK(!mCreated); + mCreated = true; + notifyEvent(ResponseCode::DiskCreated, StringPrintf("%d", mFlags)); + + // do nothing when srdisk is created + if (mSrdisk) + return OK; + + readDiskMetadata(); + // sleep 10ms + usleep(10000); + + std::string fsType; + std::string unused; + + // if no partition, handle here + if (ReadPartMetadata(mDevPath, fsType, unused, unused) == OK) { + if (!fsType.empty()) { + if (VolumeManager::Instance()->getDebug()) + LOG(DEBUG) << "treat entire disk as partition, devPath=" << mDevPath; + createPublicVolume(mDevName, true, 0); + } + } + + return OK; +} + +status_t Disk::reset() { + CHECK(!mCreated); + mCreated = true; + notifyEvent(ResponseCode::DiskCreated, StringPrintf("%d", mFlags)); + + // do nothing when srdisk is created + if (mSrdisk) + return OK; + + readDiskMetadata(); + + if (mPartNo.size() == 0) { + createPublicVolume(mDevName, true, 0); + } else { + std::string partDevName; + for (auto part : mPartNo) { + if (mFlags & Flags::kUsb) + partDevName = StringPrintf("%s%d", mDevName.c_str(), part); + else if (mFlags & Flags::kSd) + partDevName = StringPrintf("%sp%d", mDevName.c_str(), part); + + createPublicVolume(partDevName, false, part); + } + } + + + return OK; +} + +status_t Disk::destroy() { + CHECK(mCreated); + destroyAllVolumes(); + notifyEvent(ResponseCode::DiskDestroyed); + mCreated = false; + return OK; +} + +void Disk::handleJustPublicPhysicalDevice( + const std::string& physicalDevName) { + auto vol = std::shared_ptr<VolumeBase>(new PublicVolume(physicalDevName, true)); + if (mJustPartitioned) { + LOG(DEBUG) << "Device just partitioned; silently formatting"; + vol->setSilent(true); + vol->create(); + vol->format("auto"); + vol->destroy(); + vol->setSilent(false); + } + + mVolumes.push_back(vol); + vol->setDiskId(getId()); + vol->setSysPath(getSysPath()); + vol->create(); + //vol->mount(); +} + +void Disk::createPublicVolume(const std::string& partDevName, + const bool isPhysical, int part) { + auto vol = std::shared_ptr<VolumeBase>(new PublicVolume(partDevName, isPhysical)); + if (mJustPartitioned) { + LOG(DEBUG) << "Device just partitioned; silently formatting"; + vol->setSilent(true); + vol->create(); + vol->format("auto"); + vol->destroy(); + vol->setSilent(false); + } + + mVolumes.push_back(vol); + vol->setDiskId(getId()); + vol->setSysPath(getSysPath()); + vol->setDiskFlags(mFlags); + vol->setPartNo(part); + + vol->create(); + //vol->mount(); +} + +void Disk::destroyAllVolumes() { + for (auto vol : mVolumes) { + vol->destroy(); + } + mVolumes.clear(); +} + +status_t Disk::readDiskMetadata() { + mSize = -1; + mLabel.clear(); + + int fd = open(mDevPath.c_str(), O_RDONLY | O_CLOEXEC); + if (fd != -1) { + if (ioctl(fd, BLKGETSIZE64, &mSize)) { + mSize = -1; + } + close(fd); + } + + unsigned int majorId = major(mDevice); + switch (majorId) { + case kMajorBlockSr: + case kMajorBlockScsiA: case kMajorBlockScsiB: case kMajorBlockScsiC: case kMajorBlockScsiD: + case kMajorBlockScsiE: case kMajorBlockScsiF: case kMajorBlockScsiG: case kMajorBlockScsiH: + case kMajorBlockScsiI: case kMajorBlockScsiJ: case kMajorBlockScsiK: case kMajorBlockScsiL: + case kMajorBlockScsiM: case kMajorBlockScsiN: case kMajorBlockScsiO: case kMajorBlockScsiP: { + std::string path(mSysPath + "/device/vendor"); + std::string tmp; + if (!ReadFileToString(path, &tmp)) { + PLOG(WARNING) << "Failed to read vendor from " << path; + return -errno; + } + mLabel = tmp; + break; + } + case kMajorBlockMmc: { + std::string path(mSysPath + "/device/manfid"); + std::string tmp; + if (!ReadFileToString(path, &tmp)) { + PLOG(WARNING) << "Failed to read manufacturer from " << path; + return -errno; + } + uint64_t manfid = strtoll(tmp.c_str(), nullptr, 16); + // Our goal here is to give the user a meaningful label, ideally + // matching whatever is silk-screened on the card. To reduce + // user confusion, this list doesn't contain white-label manfid. + switch (manfid) { + case 0x000003: mLabel = "SanDisk"; break; + case 0x00001b: mLabel = "Samsung"; break; + case 0x000028: mLabel = "Lexar"; break; + case 0x000074: mLabel = "Transcend"; break; + } + break; + } + default: { + if (isVirtioBlkDevice(majorId)) { + LOG(DEBUG) << "Recognized experimental block major ID " << majorId + << " as virtio-blk (emulator's virtual SD card device)"; + mLabel = "Virtual"; + break; + } + LOG(WARNING) << "Unsupported block major type " << majorId; + return -ENOTSUP; + } + } + + notifyEvent(ResponseCode::DiskSizeChanged, StringPrintf("%" PRIu64, mSize)); + notifyEvent(ResponseCode::DiskLabelChanged, mLabel); + notifyEvent(ResponseCode::DiskSysPathChanged, mSysPath); + return OK; +} + +void Disk::handleBlockEvent(NetlinkEvent *evt) { + std::string eventPath(evt->findParam("DEVPATH")?evt->findParam("DEVPATH"):""); + std::string devName(evt->findParam("DEVNAME")?evt->findParam("DEVNAME"):""); + std::string devType(evt->findParam("DEVTYPE")?evt->findParam("DEVTYPE"):""); + + // can we handle this event + if (eventPath.find(mEventPath) == std::string::npos) { + LOG(DEBUG) << "evt will handle by other disk " << mEventPath; + return; + } + + if (devType != "partition") { + LOG(DEBUG) << "evt type is not partition " << devType; + evt->dump(); + return; + } + + std::string partDevName; + switch (evt->getAction()) { + case NetlinkEvent::Action::kAdd: { + int part = atoi(evt->findParam("PARTN")); + + mPartNo.push_back(part); + if (mFlags & Flags::kUsb) + partDevName = StringPrintf("%s%d", mDevName.c_str(), part); + else if (mFlags & Flags::kSd) + partDevName = StringPrintf("%sp%d", mDevName.c_str(), part); + + LOG(INFO) << " partDevName =" << partDevName; + createPublicVolume(partDevName, false, part); + break; + } + case NetlinkEvent::Action::kChange: { + // ignore + LOG(DEBUG) << "Disk at " << mDevPath << " changed"; + break; + } + case NetlinkEvent::Action::kRemove: { + // will handle by vm + break; + } + default: { + LOG(WARNING) << "Unexpected block event action " << (int) evt->getAction(); + break; + } + } +} + +#if 0 +status_t Disk::readPartitions() { + if (mSrdisk) { + // srdisk has no partiton concept. + LOG(INFO) << "srdisk try entire disk as fake partition"; + //createPublicVolume(mDevice); + return OK; + } + + int8_t maxMinors = getMaxMinors(); + if (maxMinors < 0) { + return -ENOTSUP; + } + + destroyAllVolumes(); + + // Parse partition table + + std::vector<std::string> cmd; + cmd.push_back(kSgdiskPath); + cmd.push_back("--android-dump"); + cmd.push_back(mDevPath); + + std::vector<std::string> output; + status_t res = ForkExecvp(cmd, output); + if (res != OK) { + LOG(WARNING) << "sgdisk failed to scan " << mDevPath; + notifyEvent(ResponseCode::DiskScanned); + mJustPartitioned = false; + return res; + } + + Table table = Table::kUnknown; + bool foundParts = false; + std::string physicalDevName, partDevName; + for (auto line : output) { + char* cline = (char*) line.c_str(); + char* token = strtok(cline, kSgdiskToken); + if (token == nullptr) continue; + + if (!strcmp(token, "DISK")) { + const char* type = strtok(nullptr, kSgdiskToken); + if (!strcmp(type, "mbr")) { + table = Table::kMbr; + } else if (!strcmp(type, "gpt")) { + table = Table::kGpt; + } + } else if (!strcmp(token, "PART")) { + foundParts = true; + int i = strtol(strtok(nullptr, kSgdiskToken), nullptr, 10); + if (i <= 0 || i > maxMinors) { + LOG(WARNING) << mId << " is ignoring partition " << i + << " beyond max supported devices"; + continue; + } + dev_t partDevice = makedev(major(mDevice), minor(mDevice) + i); + + if (mFlags & Flags::kUsb) + partDevName = StringPrintf("%s%d", mDevName.c_str(), i); + else if (mFlags & Flags::kSd) + partDevName = StringPrintf("%sp%d", mDevName.c_str(), i); + LOG(INFO) << " partDevName =" << partDevName; + + if (table == Table::kMbr) { + const char* type = strtok(nullptr, kSgdiskToken); + + if (IsJustPhysicalDevice(mSysPath, physicalDevName)) { + LOG(INFO) << " here,we don't create public:xx,xx for physical device only!"; + handleJustPublicPhysicalDevice(physicalDevName); + break; + } + + // support mort than 16 partitions + if (i > 15) + getPhysicalDev(partDevice, mSysPath, i); + + switch (strtol(type, nullptr, 16)) { + case 0x06: // FAT16 + case 0x0b: // W95 FAT32 (LBA) + case 0x0c: // W95 FAT32 (LBA) + case 0x0e: // W95 FAT16 (LBA) + + case 0x07: // NTFS & EXFAT + createPublicVolume(partDevName, false); + break; + + default: + // We should still create public volume here + // cause some disk table types are not matched above + // but can be mounted successfully + createPublicVolume(partDevName, false); + LOG(WARNING) << "unsupported table kMbr type " << type; + break; + } + } else if (table == Table::kGpt) { + const char* typeGuid = strtok(nullptr, kSgdiskToken); + const char* partGuid = strtok(nullptr, kSgdiskToken); + + if (!strcasecmp(typeGuid, kGptBasicData)) { + createPublicVolume(partDevName, false); + } + } + } + } + + // Ugly last ditch effort, treat entire disk as partition + if (table == Table::kUnknown || !foundParts) { + LOG(WARNING) << mId << " has unknown partition table; trying entire device"; + + std::string fsType; + std::string unused; + if (ReadPartMetadata(mDevPath, fsType, unused, unused) == OK) { + if (IsJustPhysicalDevice(mSysPath, physicalDevName)) { + handleJustPublicPhysicalDevice(physicalDevName); + } else { + createPublicVolume(partDevName, false); + } + } else { + LOG(WARNING) << mId << " failed to identify, giving up"; + } + } + + notifyEvent(ResponseCode::DiskScanned); + mJustPartitioned = false; + return OK; +} +#endif + +status_t Disk::unmountAll() { + for (auto vol : mVolumes) { + vol->unmount(); + } + return OK; +} + +void Disk::notifyEvent(int event) { + VolumeManager::Instance()->getBroadcaster()->sendBroadcast(event, + getId()); +} + +void Disk::notifyEvent(int event, const std::string& value) { + VolumeManager::Instance()->getBroadcaster()->sendBroadcast(event, + StringPrintf("%s %s", getId().c_str(), value.c_str())); +} + + +bool Disk::isSrdiskMounted() { + if (!mSrdisk) { + return false; + } + + for (auto vol : mVolumes) { + return vol->isSrdiskMounted(); + } + + return false; +} + +int Disk::getMaxMinors() { + // Figure out maximum partition devices supported + unsigned int majorId = major(mDevice); + switch (majorId) { + case kMajorBlockScsiA: case kMajorBlockScsiB: case kMajorBlockScsiC: case kMajorBlockScsiD: + case kMajorBlockScsiE: case kMajorBlockScsiF: case kMajorBlockScsiG: case kMajorBlockScsiH: + case kMajorBlockScsiI: case kMajorBlockScsiJ: case kMajorBlockScsiK: case kMajorBlockScsiL: + case kMajorBlockScsiM: case kMajorBlockScsiN: case kMajorBlockScsiO: case kMajorBlockScsiP: { + // Per Documentation/devices.txt this is static + return 31; + } + case kMajorBlockMmc: { + // Per Documentation/devices.txt this is dynamic + std::string tmp; + if (!ReadFileToString(kSysfsMmcMaxMinors, &tmp)) { + LOG(ERROR) << "Failed to read max minors"; + return -errno; + } + return atoi(tmp.c_str()); + } + default: { + if (isVirtioBlkDevice(majorId)) { + // drivers/block/virtio_blk.c has "#define PART_BITS 4", so max is + // 2^4 - 1 = 15 + return 15; + } + } + } + + LOG(ERROR) << "Unsupported block major type " << majorId; + return -ENOTSUP; +} + +void Disk::getPhysicalDev(dev_t &device, const std:: string& sysPath, int part) { + std::string smajor, sminor; + std::string physicalDev, lpDev; + int major, minor; + + if (part <= 15) + return; + + if (GetPhysicalDevice(sysPath, physicalDev) == OK) { + lpDev = StringPrintf("%s%d", physicalDev.c_str(), part); + if (!access(lpDev.c_str(), F_OK) && + readBlockDevMajorAndMinor(lpDev, smajor, sminor) == OK) { + major = atoi(smajor.c_str()); + minor = atoi(sminor.c_str()); + device = makedev(major, minor); + } + } +} + +} // namespace vold +} // namespace android diff --git a/system/droidvold/Disk.h b/system/droidvold/Disk.h new file mode 100755 index 0000000..a623a62 --- a/dev/null +++ b/system/droidvold/Disk.h @@ -0,0 +1,135 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef ANDROID_VOLD_DISK_H +#define ANDROID_VOLD_DISK_H + +#include "Utils.h" +#include "VolumeBase.h" + +#include <utils/Errors.h> +#include <sysutils/NetlinkEvent.h> + +#include <vector> + +namespace android { +namespace droidvold { + +class VolumeBase; + +/* + * Representation of detected physical media. + * + * Knows how to create volumes based on the partition tables found, and also + * how to repartition itself. + */ +class Disk { +public: + Disk(const std::string& eventPath, dev_t device, const std::string& nickname, + const std::string& eventName, int flags); + virtual ~Disk(); + + enum Flags { + /* Flag that disk is adoptable */ + kAdoptable = 1 << 0, + /* Flag that disk is considered primary when the user hasn't + * explicitly picked a primary storage location */ + kDefaultPrimary = 1 << 1, + /* Flag that disk is SD card */ + kSd = 1 << 2, + /* Flag that disk is USB disk */ + kUsb = 1 << 3, + /* Flag that disk is EMMC internal */ + kEmmc = 1 << 4, + }; + + const std::string& getId() { return mId; } + const std::string& getEventPath() { return mEventPath; } + const std::string& getSysPath() { return mSysPath; } + const std::string& getDevPath() { return mDevPath; } + dev_t getDevice() { return mDevice; } + uint64_t getSize() { return mSize; } + const std::string& getLabel() { return mLabel; } + int getFlags() { return mFlags; } + + std::shared_ptr<VolumeBase> findVolume(const std::string& id); + std::shared_ptr<VolumeBase> findVolumeByPath(const std::string& path); + + void listVolumes(VolumeBase::Type type, std::list<std::string>& list); + + status_t create(); + status_t destroy(); + + status_t readDiskMetadata(); + status_t readPartitions(); + + status_t unmountAll(); + + bool isSrdiskMounted(); + void notifyEvent(int msg); + void notifyEvent(int msg, const std::string& value); + void destroyAllVolumes(); + + void handleBlockEvent(NetlinkEvent *evt); + status_t reset(); + +private: + /* ID that uniquely references this disk */ + std::string mId; + /* Original event path */ + std::string mEventPath; + /* Device path under sysfs */ + std::string mSysPath; + /* Device path under dev */ + std::string mDevPath; + + std::string mDevName; + /* Kernel device representing disk */ + dev_t mDevice; + /* Size of disk, in bytes */ + uint64_t mSize; + /* User-visible label, such as manufacturer */ + std::string mLabel; + /* Current partitions on disk */ + std::vector<std::shared_ptr<VolumeBase>> mVolumes; + /* Nickname for this disk */ + std::string mNickname; + /* Flags applicable to this disk */ + int mFlags; + /* Flag indicating object is created */ + bool mCreated; + /* Flag that we just partitioned and should format all volumes */ + bool mJustPartitioned; + /* Flag indicating is srdisk or not */ + bool mSrdisk; + + std::vector<int> mPartNo; + + void createPublicVolume(const std::string& partDevName, + const bool isPhysical, int part); + void createPrivateVolume(dev_t device, const std::string& partGuid); + void handleJustPublicPhysicalDevice(const std::string& physicalDevName); + void getPhysicalDev(dev_t &device, const std:: string& sysPath, int part); + + int getMaxMinors(); + + DISALLOW_COPY_AND_ASSIGN(Disk); +}; + +} // namespace vold +} // namespace android + +#endif diff --git a/system/droidvold/DroidVold.cpp b/system/droidvold/DroidVold.cpp new file mode 100755 index 0000000..a1db38f --- a/dev/null +++ b/system/droidvold/DroidVold.cpp @@ -0,0 +1,198 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "DroidVold.h" + +#define LOG_TAG "DroidVold" + +#include <android-base/logging.h> +#include <android-base/stringprintf.h> +#include <cutils/fs.h> +#include <cutils/log.h> + +#include "VolumeManager.h" + +namespace vendor { +namespace amlogic { +namespace hardware { +namespace droidvold { +namespace V1_0 { +namespace implementation { + +DroidVold *sInstance; + +DroidVold *DroidVold::Instance() { + if (!sInstance) + sInstance = new DroidVold(); + return sInstance; +} + +DroidVold::DroidVold() { + mCallback = NULL; +} + +DroidVold::~DroidVold() { +} + +Return<void> DroidVold::setCallback(const sp<IDroidVoldCallback>& callback) { + if (VolumeManager::Instance()->getDebug()) + LOG(DEBUG) << "setCallback =" << callback.get(); + + /* + if (callback != NULL) { + mClients.push_back(callback); + } + */ + + mCallback = callback; + return Void(); +} + +Return<Result> DroidVold::reset() { + VolumeManager *vm = VolumeManager::Instance(); + vm->reset(); + return Result::OK; +} + +Return<Result> DroidVold::shutdown() { + VolumeManager *vm = VolumeManager::Instance(); + vm->shutdown(); + return Result::OK; +} + +Return<Result> DroidVold::mount(const hidl_string& id, uint32_t flag, uint32_t uid) { + // mount [volId] [flags] + if (VolumeManager::Instance()->getDebug()) + LOG(DEBUG) << "mount id=" << id << " flag=" << flag; + + VolumeManager *vm = VolumeManager::Instance(); + std::string vid = id; + +#ifdef HAS_VIRTUAL_CDROM + // is loop volume + if (flag == 0xF) { + if (vm->mountloop(vid.c_str())) { + LOG(ERROR) << " mount loop error!"; + return Result::FAIL; + } + return Result::OK; + } +#endif + + auto vol = vm->findVolume(vid); + if (vol == nullptr) { + LOG(ERROR) << "mount ,count not find volume id=" << vid; + return Result::FAIL; + } + + vol->setMountFlags(flag); + vol->setMountUserId(uid); + + int res = vol->mount(); + if (res != 0) { + LOG(ERROR) << "failed to mount volume=" << vol; + return Result::FAIL; + } + + return Result::OK; +} + +Return<Result> DroidVold::unmount(const hidl_string& id) { + // unmount [volId] + VolumeManager *vm = VolumeManager::Instance(); + std::string vid = id; + +#ifdef HAS_VIRTUAL_CDROM + if (vid.find("/mnt/loop") != std::string::npos) { + if (vm->unmountloop(true)) { + LOG(ERROR) << "unmount loop error!"; + return Result::FAIL; + } + return Result::OK; + } +#endif + + auto vol = vm->findVolume(vid); + if (vol == nullptr) { + LOG(ERROR) << "unmount, count not find volume id=" << vid; + return Result::FAIL; + } + + int res = vol->unmount(); + + if (res != 0) { + LOG(ERROR) << "failed to unmount volume=" << vol; + return Result::FAIL; + } + + return Result::OK; +} + +Return<Result> DroidVold::format(const hidl_string& id, const hidl_string& type) { + // format [volId] [fsType|auto] + VolumeManager *vm = VolumeManager::Instance(); + std::string vid = id; + std::string fsType= type; + auto vol = vm->findVolume(id); + + if (vol == nullptr) { + LOG(ERROR) << "format, count not find volume id=" << vid; + return Result::FAIL; + } + + int res = vol->format(fsType); + + if (res != 0) { + LOG(ERROR) << "failed to unmount volume=" << vol; + return Result::FAIL; + } + + return Result::OK; +} + +void DroidVold::sendBroadcast(int event, const std::string& message) { + if (VolumeManager::Instance()->getDebug()) + LOG(DEBUG) << "event=" << event << " message=" << message; + + hidl_string mss = message; + if (mCallback != NULL) + mCallback->onEvent(event, mss); + + /* + for (int i = 0; i < clientSize; i++) { + mClients[i]->onEvent(event, mss); + } + for (auto client : mClients) { + client->onEvent(event, mss); + } + */ +} + +Return<int32_t> DroidVold::getDiskFlag(const hidl_string &path) { + int32_t flag = 0; + std::string mPath = path; + + flag = VolumeManager::Instance()->getDiskFlag(mPath); + + return flag; +} + +} // namespace implementation +} // namespace V1_0 +} // namespace droidvold +} // namespace hardware +} // namespace amlogic +} // namespace vendor diff --git a/system/droidvold/DroidVold.h b/system/droidvold/DroidVold.h new file mode 100755 index 0000000..0c576cf --- a/dev/null +++ b/system/droidvold/DroidVold.h @@ -0,0 +1,77 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef VENDOR_AMLOGIC_HARDWARE_DROIDVOLD_V1_0_DROIDVOLD_H +#define VENDOR_AMLOGIC_HARDWARE_DROIDVOLD_V1_0_DROIDVOLD_H + +#include <vendor/amlogic/hardware/droidvold/1.0/IDroidVold.h> +#include <hidl/MQDescriptor.h> +#include <hidl/Status.h> + +#include <utils/Mutex.h> +#include <vector> + +namespace vendor { +namespace amlogic { +namespace hardware { +namespace droidvold { +namespace V1_0 { +namespace implementation { + +using ::android::hidl::base::V1_0::DebugInfo; +using ::android::hidl::base::V1_0::IBase; +using ::vendor::amlogic::hardware::droidvold::V1_0::IDroidVold; +using ::vendor::amlogic::hardware::droidvold::V1_0::IDroidVoldCallback; +using ::vendor::amlogic::hardware::droidvold::V1_0::Result; +using ::android::hardware::hidl_array; +using ::android::hardware::hidl_memory; +using ::android::hardware::hidl_string; +using ::android::hardware::hidl_vec; +using ::android::hardware::Return; +using ::android::hardware::Void; +using ::android::sp; + +class DroidVold : public IDroidVold { +public: + DroidVold(); + virtual ~DroidVold(); + + // Methods from ::vendor::amlogic::hardware::droidvold::V1_0::IDroidVold follow. + Return<void> setCallback(const sp<IDroidVoldCallback>& callback) override; + Return<Result> reset() override; + Return<Result> shutdown() override; + Return<Result> mount(const hidl_string& id, uint32_t flag, uint32_t uid) override; + Return<Result> unmount(const hidl_string& id) override; + Return<Result> format(const hidl_string& id, const hidl_string& type) override; + Return<int32_t> getDiskFlag(const hidl_string &path) override; + + static DroidVold *Instance(); + void sendBroadcast(int event, const std::string& message); + +private: + //std::vector<sp<IDroidVoldCallback>> mClients; + sp<IDroidVoldCallback> mCallback; + mutable android::Mutex mLock; +}; + +} // namespace implementation +} // namespace V1_0 +} // namespace droidvold +} // namespace hardware +} // namespace amlogic +} // namespace vendor + +#endif // VENDOR_AMLOGIC_HARDWARE_DROIDVOLD_V1_0_DROIDVOLD_H diff --git a/system/droidvold/NetlinkHandler.cpp b/system/droidvold/NetlinkHandler.cpp new file mode 100755 index 0000000..5c3efc4 --- a/dev/null +++ b/system/droidvold/NetlinkHandler.cpp @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <errno.h> +#include <string.h> + +#define LOG_TAG "droidVold" + +#include <cutils/log.h> + +#include <sysutils/NetlinkEvent.h> +#include "NetlinkHandler.h" +#include "VolumeManager.h" + +NetlinkHandler::NetlinkHandler(int listenerSocket) : + NetlinkListener(listenerSocket) { +} + +NetlinkHandler::~NetlinkHandler() { +} + +int NetlinkHandler::start() { + return this->startListener(); +} + +int NetlinkHandler::stop() { + return this->stopListener(); +} + +void NetlinkHandler::onEvent(NetlinkEvent *evt) { + VolumeManager *vm = VolumeManager::Instance(); + const char *subsys = evt->getSubsystem(); + + if (!subsys) { + SLOGW("No subsystem found in netlink event"); + return; + } + + if (!strcmp(subsys, "block")) { + vm->handleBlockEvent(evt); + } +} diff --git a/system/droidvold/NetlinkHandler.h b/system/droidvold/NetlinkHandler.h new file mode 100755 index 0000000..00a31c8 --- a/dev/null +++ b/system/droidvold/NetlinkHandler.h @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _NETLINKHANDLER_H +#define _NETLINKHANDLER_H + +#include <sysutils/NetlinkListener.h> + +class NetlinkHandler: public NetlinkListener { + +public: + NetlinkHandler(int listenerSocket); + virtual ~NetlinkHandler(); + + int start(void); + int stop(void); + +protected: + virtual void onEvent(NetlinkEvent *evt); +}; +#endif diff --git a/system/droidvold/NetlinkManager.cpp b/system/droidvold/NetlinkManager.cpp new file mode 100755 index 0000000..177dba8 --- a/dev/null +++ b/system/droidvold/NetlinkManager.cpp @@ -0,0 +1,109 @@ +/* + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <stdio.h> +#include <errno.h> +#include <string.h> + +#include <sys/socket.h> +#include <sys/select.h> +#include <sys/time.h> +#include <sys/types.h> +#include <sys/un.h> + +#include <linux/netlink.h> + +#define LOG_TAG "droidVold" + +#include <cutils/log.h> + +#include "NetlinkManager.h" +#include "NetlinkHandler.h" + +NetlinkManager *NetlinkManager::sInstance = NULL; + +NetlinkManager *NetlinkManager::Instance() { + if (!sInstance) + sInstance = new NetlinkManager(); + return sInstance; +} + +NetlinkManager::NetlinkManager() { + mBroadcaster = NULL; +} + +NetlinkManager::~NetlinkManager() { +} + +int NetlinkManager::start() { + struct sockaddr_nl nladdr; + int sz = 64 * 1024; + int on = 1; + + memset(&nladdr, 0, sizeof(nladdr)); + nladdr.nl_family = AF_NETLINK; + nladdr.nl_pid = getpid(); + nladdr.nl_groups = 0xffffffff; + + if ((mSock = socket(PF_NETLINK, SOCK_DGRAM | SOCK_CLOEXEC, + NETLINK_KOBJECT_UEVENT)) < 0) { + SLOGE("Unable to create uevent socket: %s", strerror(errno)); + return -1; + } + + if (setsockopt(mSock, SOL_SOCKET, SO_RCVBUFFORCE, &sz, sizeof(sz)) < 0) { + SLOGE("Unable to set uevent socket SO_RCVBUFFORCE option: %s", strerror(errno)); + goto out; + } + + if (setsockopt(mSock, SOL_SOCKET, SO_PASSCRED, &on, sizeof(on)) < 0) { + SLOGE("Unable to set uevent socket SO_PASSCRED option: %s", strerror(errno)); + goto out; + } + + if (bind(mSock, (struct sockaddr *) &nladdr, sizeof(nladdr)) < 0) { + SLOGE("Unable to bind uevent socket: %s", strerror(errno)); + goto out; + } + + mHandler = new NetlinkHandler(mSock); + if (mHandler->start()) { + SLOGE("Unable to start NetlinkHandler: %s", strerror(errno)); + goto out; + } + + return 0; + +out: + close(mSock); + return -1; +} + +int NetlinkManager::stop() { + int status = 0; + + if (mHandler->stop()) { + SLOGE("Unable to stop NetlinkHandler: %s", strerror(errno)); + status = -1; + } + delete mHandler; + mHandler = NULL; + + close(mSock); + mSock = -1; + + return status; +} diff --git a/system/droidvold/NetlinkManager.h b/system/droidvold/NetlinkManager.h new file mode 100755 index 0000000..f123fa0 --- a/dev/null +++ b/system/droidvold/NetlinkManager.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _NETLINKMANAGER_H +#define _NETLINKMANAGER_H + +#include <sysutils/SocketListener.h> +#include <sysutils/NetlinkListener.h> +#include "DroidVold.h" + +using namespace android; +using ::vendor::amlogic::hardware::droidvold::V1_0::implementation::DroidVold; + +class NetlinkHandler; + +class NetlinkManager { +private: + static NetlinkManager *sInstance; + +private: + DroidVold *mBroadcaster; + NetlinkHandler *mHandler; + int mSock; + +public: + virtual ~NetlinkManager(); + + int start(); + int stop(); + + void setBroadcaster(DroidVold *sl) { mBroadcaster = sl; } + DroidVold *getBroadcaster() { return mBroadcaster; } + + static NetlinkManager *Instance(); + +private: + NetlinkManager(); +}; +#endif diff --git a/system/droidvold/Process.cpp b/system/droidvold/Process.cpp new file mode 100755 index 0000000..e68011e --- a/dev/null +++ b/system/droidvold/Process.cpp @@ -0,0 +1,222 @@ +/* + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <stdio.h> +#include <unistd.h> +#include <errno.h> +#include <string.h> +#include <fcntl.h> +#include <dirent.h> +#include <ctype.h> +#include <pwd.h> +#include <stdlib.h> +#include <poll.h> +#include <sys/stat.h> +#include <signal.h> + +#define LOG_TAG "ProcessKiller" +#include <cutils/log.h> + +#include "Process.h" + +int Process::readSymLink(const char *path, char *link, size_t max) { + struct stat s; + int length; + + if (lstat(path, &s) < 0) + return 0; + if ((s.st_mode & S_IFMT) != S_IFLNK) + return 0; + + // we have a symlink + length = readlink(path, link, max- 1); + if (length <= 0) + return 0; + link[length] = 0; + return 1; +} + +int Process::pathMatchesMountPoint(const char* path, const char* mountPoint) { + int length = strlen(mountPoint); + if (length > 1 && strncmp(path, mountPoint, length) == 0) { + // we need to do extra checking if mountPoint does not end in a '/' + if (mountPoint[length - 1] == '/') + return 1; + // if mountPoint does not have a trailing slash, we need to make sure + // there is one in the path to avoid partial matches. + return (path[length] == 0 || path[length] == '/'); + } + + return 0; +} + +void Process::getProcessName(int pid, char *buffer, size_t max) { + int fd; + snprintf(buffer, max, "/proc/%d/cmdline", pid); + fd = open(buffer, O_RDONLY | O_CLOEXEC); + if (fd < 0) { + strcpy(buffer, "???"); + } else { + int length = read(fd, buffer, max - 1); + buffer[length] = 0; + close(fd); + } +} + +int Process::checkFileDescriptorSymLinks(int pid, const char *mountPoint) { + return checkFileDescriptorSymLinks(pid, mountPoint, NULL, 0); +} + +int Process::checkFileDescriptorSymLinks(int pid, const char *mountPoint, char *openFilename, size_t max) { + + + // compute path to process's directory of open files + char path[PATH_MAX]; + sprintf(path, "/proc/%d/fd", pid); + DIR *dir = opendir(path); + if (!dir) + return 0; + + // remember length of the path + int parent_length = strlen(path); + // append a trailing '/' + path[parent_length++] = '/'; + + struct dirent* de; + while ((de = readdir(dir))) { + if (!strcmp(de->d_name, ".") || !strcmp(de->d_name, "..") + || strlen(de->d_name) + parent_length + 1 >= PATH_MAX) + continue; + + // append the file name, after truncating to parent directory + path[parent_length] = 0; + strcat(path, de->d_name); + + char link[PATH_MAX]; + + if (readSymLink(path, link, sizeof(link)) && pathMatchesMountPoint(link, mountPoint)) { + if (openFilename) { + memset(openFilename, 0, max); + strlcpy(openFilename, link, max); + } + closedir(dir); + return 1; + } + } + + closedir(dir); + return 0; +} + +int Process::checkFileMaps(int pid, const char *mountPoint) { + return checkFileMaps(pid, mountPoint, NULL, 0); +} + +int Process::checkFileMaps(int pid, const char *mountPoint, char *openFilename, size_t max) { + FILE *file; + char buffer[PATH_MAX + 100]; + + sprintf(buffer, "/proc/%d/maps", pid); + file = fopen(buffer, "r"); + if (!file) + return 0; + + while (fgets(buffer, sizeof(buffer), file)) { + // skip to the path + const char* path = strchr(buffer, '/'); + if (path && pathMatchesMountPoint(path, mountPoint)) { + if (openFilename) { + memset(openFilename, 0, max); + strlcpy(openFilename, path, max); + } + fclose(file); + return 1; + } + } + + fclose(file); + return 0; +} + +int Process::checkSymLink(int pid, const char *mountPoint, const char *name) { + char path[PATH_MAX]; + char link[PATH_MAX]; + + sprintf(path, "/proc/%d/%s", pid, name); + if (readSymLink(path, link, sizeof(link)) && pathMatchesMountPoint(link, mountPoint)) + return 1; + return 0; +} + +int Process::getPid(const char *s) { + int result = 0; + while (*s) { + if (!isdigit(*s)) return -1; + result = 10 * result + (*s++ - '0'); + } + return result; +} + +extern "C" void vold_killProcessesWithOpenFiles(const char *path, int signal) { + Process::killProcessesWithOpenFiles(path, signal); +} + +/* + * Hunt down processes that have files open at the given mount point. + */ +int Process::killProcessesWithOpenFiles(const char *path, int signal) { + int count = 0; + DIR* dir; + struct dirent* de; + + if (!(dir = opendir("/proc"))) { + SLOGE("opendir failed (%s)", strerror(errno)); + return count; + } + + while ((de = readdir(dir))) { + int pid = getPid(de->d_name); + char name[PATH_MAX]; + + if (pid == -1) + continue; + getProcessName(pid, name, sizeof(name)); + + char openfile[PATH_MAX]; + + if (checkFileDescriptorSymLinks(pid, path, openfile, sizeof(openfile))) { + SLOGE("Process %s (%d) has open file %s", name, pid, openfile); + } else if (checkFileMaps(pid, path, openfile, sizeof(openfile))) { + SLOGE("Process %s (%d) has open filemap for %s", name, pid, openfile); + } else if (checkSymLink(pid, path, "cwd")) { + SLOGE("Process %s (%d) has cwd within %s", name, pid, path); + } else if (checkSymLink(pid, path, "root")) { + SLOGE("Process %s (%d) has chroot within %s", name, pid, path); + } else if (checkSymLink(pid, path, "exe")) { + SLOGE("Process %s (%d) has executable path within %s", name, pid, path); + } else { + continue; + } + + if (signal != 0) { + SLOGW("Sending %s to process %d", strsignal(signal), pid); + kill(pid, signal); + count++; + } + } + closedir(dir); + return count; +} diff --git a/system/droidvold/Process.h b/system/droidvold/Process.h new file mode 100755 index 0000000..62a9313 --- a/dev/null +++ b/system/droidvold/Process.h @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _PROCESS_H +#define _PROCESS_H + +#ifdef __cplusplus + +class Process { +public: + static int killProcessesWithOpenFiles(const char *path, int signal); + static int getPid(const char *s); + static int checkSymLink(int pid, const char *path, const char *name); + static int checkFileMaps(int pid, const char *path); + static int checkFileMaps(int pid, const char *path, char *openFilename, size_t max); + static int checkFileDescriptorSymLinks(int pid, const char *mountPoint); + static int checkFileDescriptorSymLinks(int pid, const char *mountPoint, char *openFilename, size_t max); + static void getProcessName(int pid, char *buffer, size_t max); +private: + static int readSymLink(const char *path, char *link, size_t max); + static int pathMatchesMountPoint(const char *path, const char *mountPoint); +}; + +extern "C" { +#endif /* __cplusplus */ + void vold_killProcessesWithOpenFiles(const char *path, int signal); +#ifdef __cplusplus +} +#endif + +#endif diff --git a/system/droidvold/PublicVolume.cpp b/system/droidvold/PublicVolume.cpp new file mode 100755 index 0000000..a389993 --- a/dev/null +++ b/system/droidvold/PublicVolume.cpp @@ -0,0 +1,297 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "fs/Vfat.h" +#include "fs/Ntfs.h" +#include "fs/Exfat.h" +#include "fs/Hfsplus.h" +#include "fs/Iso9660.h" +#include "fs/Ext4.h" +#include "fs/Sdcardfs.h" +#include "PublicVolume.h" +#include "Utils.h" +#include "VolumeManager.h" +#include "ResponseCode.h" + +#include <android-base/stringprintf.h> +#include <android-base/logging.h> +#include <cutils/fs.h> +#include <private/android_filesystem_config.h> + +#include <fcntl.h> +#include <stdlib.h> +#include <sys/mount.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <sys/wait.h> +#include <sys/sysmacros.h> + +using android::base::StringPrintf; + +namespace android { +namespace droidvold { + +static const char* kChownPath = "/system/bin/chown"; + +PublicVolume::PublicVolume(const std::string& physicalDevName, const bool isPhysical) : + VolumeBase(Type::kPublic), mJustPhysicalDev(isPhysical) { + setId(physicalDevName); + mDevPath = StringPrintf("/dev/block/%s", getId().c_str()); +} + +PublicVolume::~PublicVolume() { +} + +status_t PublicVolume::readMetadata() { + status_t res = ReadPartMetadata(mDevPath, mFsType, mFsUuid, mFsLabel); + + if (VolumeManager::Instance()->getDebug()) + LOG(DEBUG) << "blkid get devPath=" << mDevPath << " fsType= " << mFsType; + + notifyEvent(ResponseCode::VolumeFsTypeChanged, mFsType); + + // TODO: find the Uuid of srdisk + // If mFsUuid of publicVolume is empty, + // it will cause systemUi crash when it is mounted + if (mFsUuid.empty()) { + if (major(mDevice) == 11) + mFsUuid = "sr0"; + else + mFsUuid = "fakeUuid"; + } + + notifyEvent(ResponseCode::VolumeFsUuidChanged, mFsUuid); + notifyEvent(ResponseCode::VolumeFsLabelChanged, mFsLabel); + + return OK; +} + +status_t PublicVolume::doCreate() { + return 0; +} + +status_t PublicVolume::doDestroy() { + return 0; +} + +status_t PublicVolume::doMount() { + // TODO: expand to support mounting other filesystems + readMetadata(); + + if (mFsType != "vfat" && + mFsType != "ntfs" && + mFsType != "exfat" && + strncmp(mFsType.c_str(), "ext", 3) && + mFsType != "hfs" && + mFsType != "iso9660" && + mFsType != "udf") { + LOG(ERROR) << getId() << " unsupported filesystem " << mFsType; + return -EIO; + } + + // Use UUID as stable name, if available + std::string stableName = getId(); + if (!mFsUuid.empty()) { + stableName = mFsUuid; + } + mRawPath = StringPrintf("/mnt/media_rw/%s", stableName.c_str()); + + mFuseDefault = StringPrintf("/mnt/runtime/default/%s", stableName.c_str()); + mFuseRead = StringPrintf("/mnt/runtime/read/%s", stableName.c_str()); + mFuseWrite = StringPrintf("/mnt/runtime/write/%s", stableName.c_str()); + + + VolumeManager *vm = VolumeManager::Instance(); + + if (mFsType == "vfat") { +#ifdef HAS_VFAT + sleep(5); + if (vm->isMountpointMounted(mRawPath.c_str())) { + LOG(DEBUG) << getId() << " vfat will handle by vold"; + return 0; + } +#else + LOG(DEBUG) << getId() << " vfat will handle by vold"; + return 0; +#endif + } + + if (vm->isMountpointMounted(mRawPath.c_str())) { + LOG(ERROR) << " path:" << mRawPath << " is already mounted"; + return -EIO; + } + + setInternalPath(mRawPath); + + if (getMountFlags() & MountFlags::kVisible) { + setPath(StringPrintf("/storage/%s", stableName.c_str())); + } else { + setPath(mRawPath); + } + + if (prepareDir(mRawPath, 0700, AID_ROOT, AID_ROOT)) { + PLOG(ERROR) << getId() << " failed to create mount points"; + return -errno; + } + + if (prepareDir(mFuseDefault.c_str(), 0700, AID_ROOT, AID_ROOT) || + prepareDir(mFuseRead.c_str(), 0700, AID_ROOT, AID_ROOT) || + prepareDir(mFuseWrite.c_str(), 0700, AID_ROOT, AID_ROOT)) { + rmdir(mRawPath.c_str()); + PLOG(ERROR) << getId() << " failed to create FUSE mount points"; + return -errno; + } + + + // Mount device + status_t mountStatus = -1; + + if (mFsType == "vfat") { + mountStatus = vfat::Mount(mDevPath, mRawPath, false, false, false, + AID_MEDIA_RW, AID_MEDIA_RW, 0007, true); + } else if (mFsType == "ntfs") { + mountStatus = ntfs::Mount(mDevPath.c_str(), mRawPath.c_str(), false, false, + AID_MEDIA_RW, AID_MEDIA_RW, 0007, true); + } else if (mFsType == "exfat") { + mountStatus = exfat::Mount(mDevPath.c_str(), mRawPath.c_str(), false, false, + AID_MEDIA_RW, AID_MEDIA_RW, 0007, true); + } else if (!strncmp(mFsType.c_str(), "ext", 3)) { + mountStatus = ext4::Mount(mDevPath, mRawPath, false, false, true, mFsType); + } else if (mFsType == "hfs") { + mountStatus = hfsplus::Mount(mDevPath.c_str(), mRawPath.c_str(), false, false, + AID_MEDIA_RW, AID_MEDIA_RW, 0007, true); + } else if (mFsType == "iso9660" || mFsType == "udf") { + if ((mountStatus = iso9660::Mount(mDevPath.c_str(), mRawPath.c_str(), false, false, + AID_MEDIA_RW, AID_MEDIA_RW, 0007, true)) == 0) + mSrMounted = true; + } + + if (mountStatus) { + PLOG(ERROR) << " failed to mount " << mDevPath << " as " << mFsType; + rmdir(mRawPath.c_str()); + return -EIO; + } else { + LOG(INFO) << "successfully mount " << mDevPath << " as " << mFsType; + } + + if (!strncmp(mFsType.c_str(), "ext", 3)) { + std::vector<std::string> cmd; + cmd.push_back(kChownPath); + cmd.push_back("-R"); + cmd.push_back("media_rw:media_rw"); + cmd.push_back(mRawPath); + + std::vector<std::string> output; + status_t res = ForkExecvp(cmd, output); + if (res != OK) { + LOG(WARNING) << "chown failed " << mRawPath; + return res; + } + + RestoreconRecursive(mRawPath); + + LOG(VERBOSE) << "Finished restorecon of " << mRawPath; + } + + + // mount sdcardfs + if (getMountFlags() & MountFlags::kPrimary) { + sdcardfs::run_sdcardfs(mRawPath, stableName, + 1023, 1023, getMountUserId(), false, true); + } else { + sdcardfs::run_sdcardfs(mRawPath, stableName, + 1023, 1023, getMountUserId(), false, false); + } + + return OK; +} + +status_t PublicVolume::doUnmount() { + // Unmount the storage before we kill the FUSE process. If we kill + // the FUSE process first, most file system operations will return + // ENOTCONN until the unmount completes. This is an exotic and unusual + // error code and might cause broken behaviour in applications. + KillProcessesUsingPath(getPath()); + +#ifdef HAS_VIRTUAL_CDROM + std::string stableName = getId(); + if (!mFsUuid.empty()) { + stableName = mFsUuid; + } + + VolumeManager *vm = VolumeManager::Instance(); + vm->unmountLoopIfNeed(stableName.c_str()); +#endif + + ForceUnmount(mFuseDefault); + ForceUnmount(mFuseRead); + ForceUnmount(mFuseWrite); + ForceUnmount(mRawPath); + + rmdir(mFuseDefault.c_str()); + rmdir(mFuseRead.c_str()); + rmdir(mFuseWrite.c_str()); + rmdir(mRawPath.c_str()); + + mFuseDefault.clear(); + mFuseRead.clear(); + mFuseWrite.clear(); + mRawPath.clear(); + + return OK; +} + +status_t PublicVolume::doFormat(const std::string& fsType) { + if (fsType == "vfat" || fsType == "auto") { + if (WipeBlockDevice(mDevPath) != OK) { + LOG(WARNING) << getId() << " failed to wipe"; + } + if (vfat::Format(mDevPath, 0)) { + LOG(ERROR) << getId() << " failed to format"; + return -errno; + } + } else { + LOG(ERROR) << "Unsupported filesystem " << fsType; + return -EINVAL; + } + + return OK; +} + +status_t PublicVolume::prepareDir(const std::string& path, + mode_t mode, uid_t uid, gid_t gid) { + if (fs_prepare_dir(path.c_str(), 0700, AID_ROOT, AID_ROOT)) { + if (errno == ENOTCONN) { // Transport endpoint is not connected + LOG(ERROR) << getId() << " failed to create mount point"; + LOG(INFO) << "umount " << path << " and try again"; + // lazy umount + if (!umount2(path.c_str(), MNT_DETACH) || errno == EINVAL || errno == ENOENT) { + if (fs_prepare_dir(path.c_str(), 0700, AID_ROOT, AID_ROOT)) { + return -1; + } + return OK; + } + PLOG(ERROR) << " failed to umount " << path; + return -1; + } + return -1; + } + + return OK; +} + +} // namespace vold +} // namespace android diff --git a/system/droidvold/PublicVolume.h b/system/droidvold/PublicVolume.h new file mode 100755 index 0000000..b196a4d --- a/dev/null +++ b/system/droidvold/PublicVolume.h @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef ANDROID_VOLD_PUBLIC_VOLUME_H +#define ANDROID_VOLD_PUBLIC_VOLUME_H + +#include "VolumeBase.h" + +#include <cutils/multiuser.h> + +namespace android { +namespace droidvold { + +/* + * Shared storage provided by public (vfat) partition. + * + * Knows how to mount itself and then spawn a FUSE daemon to synthesize + * permissions. AsecVolume and ObbVolume can be stacked above it. + * + * This volume is not inherently multi-user aware, so it has two possible + * modes of operation: + * 1. If primary storage for the device, it only binds itself to the + * owner user. + * 2. If secondary storage, it binds itself for all users, but masks + * away the Android directory for secondary users. + */ +class PublicVolume : public VolumeBase { +public: + explicit PublicVolume(const std::string& physicalDevName, const bool isPhysical); + virtual ~PublicVolume(); + +protected: + status_t doCreate() override; + status_t doDestroy() override; + status_t doMount() override; + status_t doUnmount() override; + status_t doFormat(const std::string& fsType) override; + bool isSrdiskMounted() { return mSrMounted;} + + status_t readMetadata(); + status_t initAsecStage(); + status_t prepareDir(const std::string& path, mode_t mode, uid_t uid, gid_t gid); + +private: + /* Kernel device representing partition */ + dev_t mDevice; + /* Block device path */ + std::string mDevPath; + /* Mount point of raw partition */ + std::string mRawPath; + + std::string mFuseDefault; + std::string mFuseRead; + std::string mFuseWrite; + + /* Filesystem type */ + std::string mFsType; + /* Filesystem UUID */ + std::string mFsUuid; + /* User-visible filesystem label */ + std::string mFsLabel; + + bool mSrMounted; + + /* Just sd/udisk physical devices are used */ + bool mJustPhysicalDev; + + DISALLOW_COPY_AND_ASSIGN(PublicVolume); +}; + +} // namespace vold +} // namespace android + +#endif diff --git a/system/droidvold/ResponseCode.cpp b/system/droidvold/ResponseCode.cpp new file mode 100755 index 0000000..d7e778d --- a/dev/null +++ b/system/droidvold/ResponseCode.cpp @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <stdio.h> +#include <errno.h> +#include <string.h> + +#define LOG_TAG "Vold" + +#include <cutils/log.h> + +#include "ResponseCode.h" + +int ResponseCode::convertFromErrno() { + if (errno == ENODEV) { + return(ResponseCode::OpFailedNoMedia); + } else if (errno == ENODATA) { + return(ResponseCode::OpFailedMediaBlank); + } else if (errno == EIO) { + return(ResponseCode::OpFailedMediaCorrupt); + } else if (errno == EBUSY) { + return(ResponseCode::OpFailedStorageBusy); + } else if (errno == ENOENT) { + return(ResponseCode::OpFailedStorageNotFound); + } + + SLOGW("Returning OperationFailed - no handler for errno %d", errno); + return(ResponseCode::OperationFailed); +} diff --git a/system/droidvold/ResponseCode.h b/system/droidvold/ResponseCode.h new file mode 100755 index 0000000..52faf9a --- a/dev/null +++ b/system/droidvold/ResponseCode.h @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _RESPONSECODE_H +#define _RESPONSECODE_H + +class ResponseCode { +public: + // 100 series - Requestion action was initiated; expect another reply + // before proceeding with a new command. + static const int ActionInitiated = 100; + + static const int VolumeListResult = 110; + + // 200 series - Requested action has been successfully completed + static const int CommandOkay = 200; + static const int ShareStatusResult = 210; + + // 400 series - The command was accepted but the requested action + // did not take place. + static const int OperationFailed = 400; + static const int OpFailedNoMedia = 401; + static const int OpFailedMediaBlank = 402; + static const int OpFailedMediaCorrupt = 403; + static const int OpFailedVolNotMounted = 404; + static const int OpFailedStorageBusy = 405; + static const int OpFailedStorageNotFound = 406; + + // 500 series - The command was not accepted and the requested + // action did not take place. + static const int CommandSyntaxError = 500; + static const int CommandParameterError = 501; + static const int CommandNoPermission = 502; + + // 600 series - Unsolicited broadcasts + static const int UnsolicitedInformational = 600; + static const int VolumeStateChange = 605; + static const int VolumeMountFailedBlank = 610; + static const int VolumeMountFailedDamaged = 611; + static const int VolumeMountFailedNoMedia = 612; + static const int VolumeUuidChange = 613; + static const int VolumeUserLabelChange = 614; + + static const int ShareAvailabilityChange = 620; + + static const int VolumeDiskInserted = 630; + static const int VolumeDiskRemoved = 631; + static const int VolumeBadRemoval = 632; + + static const int DiskCreated = 640; + static const int DiskSizeChanged = 641; + static const int DiskLabelChanged = 642; + static const int DiskScanned = 643; + static const int DiskSysPathChanged = 644; + static const int DiskDestroyed = 649; + + static const int VolumeCreated = 650; + static const int VolumeStateChanged = 651; + static const int VolumeFsTypeChanged = 652; + static const int VolumeFsUuidChanged = 653; + static const int VolumeFsLabelChanged = 654; + static const int VolumePathChanged = 655; + static const int VolumeInternalPathChanged = 656; + static const int VolumeDestroyed = 659; + + static int convertFromErrno(); +}; +#endif diff --git a/system/droidvold/Utils.cpp b/system/droidvold/Utils.cpp new file mode 100755 index 0000000..550a456 --- a/dev/null +++ b/system/droidvold/Utils.cpp @@ -0,0 +1,713 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Utils.h" +#include "Process.h" + +#include <android-base/file.h> +#include <android-base/logging.h> +#include <android-base/stringprintf.h> +#include <cutils/fs.h> +#include <cutils/properties.h> +#include <private/android_filesystem_config.h> +#include <logwrap/logwrap.h> + +#include <mutex> +#include <dirent.h> +#include <fcntl.h> +#include <linux/fs.h> +#include <stdlib.h> +#include <sys/mount.h> +//#include <sys/types.h> +#include <sys/stat.h> +#include <sys/wait.h> +#include <sys/statvfs.h> +#include <sys/sysmacros.h> +#include <stdio.h> +#include <unistd.h> +#include <string.h> + + +#include "ext2fs/ext2fs.h" +#include "blkid/blkid.h" + +#ifndef UMOUNT_NOFOLLOW +#define UMOUNT_NOFOLLOW 0x00000008 /* Don't follow symlink on umount */ +#endif + +using android::base::ReadFileToString; +using android::base::StringPrintf; + +namespace android { +namespace droidvold { + +security_context_t sBlkidUntrustedContext = nullptr; + +static const char* kBlkidPath = "/system/bin/blkid"; +static const char* kKeyPath = "/data/misc/vold"; + +static const char* kProcFilesystems = "/proc/filesystems"; + +status_t PrepareDir(const std::string& path, mode_t mode, uid_t uid, gid_t gid) { + const char* cpath = path.c_str(); + int res = fs_prepare_dir(cpath, mode, uid, gid); + + if (res == 0) { + return OK; + } else { + return -errno; + } +} + +status_t ForceUnmount(const std::string& path) { + const char* cpath = path.c_str(); + if (!umount2(cpath, UMOUNT_NOFOLLOW) || errno == EINVAL || errno == ENOENT) { + return OK; + } + // Apps might still be handling eject request, so wait before + // we start sending signals + sleep(5); + + Process::killProcessesWithOpenFiles(cpath, SIGINT); + sleep(5); + if (!umount2(cpath, UMOUNT_NOFOLLOW) || errno == EINVAL || errno == ENOENT) { + return OK; + } + + Process::killProcessesWithOpenFiles(cpath, SIGTERM); + sleep(5); + if (!umount2(cpath, UMOUNT_NOFOLLOW) || errno == EINVAL || errno == ENOENT) { + return OK; + } + + Process::killProcessesWithOpenFiles(cpath, SIGKILL); + sleep(5); + if (!umount2(cpath, UMOUNT_NOFOLLOW) || errno == EINVAL || errno == ENOENT) { + return OK; + } + + return -errno; +} + +status_t KillProcessesUsingPath(const std::string& path) { + const char* cpath = path.c_str(); + if (Process::killProcessesWithOpenFiles(cpath, SIGINT) == 0) { + return OK; + } + sleep(5); + + if (Process::killProcessesWithOpenFiles(cpath, SIGTERM) == 0) { + return OK; + } + sleep(5); + + if (Process::killProcessesWithOpenFiles(cpath, SIGKILL) == 0) { + return OK; + } + sleep(5); + + // Send SIGKILL a second time to determine if we've + // actually killed everyone with open files + if (Process::killProcessesWithOpenFiles(cpath, SIGKILL) == 0) { + return OK; + } + PLOG(ERROR) << "Failed to kill processes using " << path; + return -EBUSY; +} + +status_t BindMount(const std::string& source, const std::string& target) { + if (::mount(source.c_str(), target.c_str(), "", MS_BIND, NULL)) { + PLOG(ERROR) << "Failed to bind mount " << source << " to " << target; + return -errno; + } + return OK; +} + +status_t ReadPartMetadata(const std::string& path, std::string& fsType, + std::string& fsUuid, std::string& fsLabel) { + blkid_cache cache = NULL; + const char *devices = path.c_str(); + + if (blkid_get_cache(&cache, "/dev/null") < 0) { + PLOG(ERROR) << "blkid get cache failed path=" << path; + blkid_put_cache(cache); + return -errno; + } + + blkid_dev dev = blkid_get_dev(cache, devices, BLKID_DEV_NORMAL); + if (dev) { + blkid_tag_iterate iter; + const char *type, *value; + + iter = blkid_tag_iterate_begin(dev); + while (blkid_tag_next(iter, &type, &value) == 0) { + LOG(DEBUG) << "type=" << type << " value=" << value; + + if (!strcmp(type, "TYPE")) { + fsType = StringPrintf("%s", value); + } else if (!strcmp(type, "UUID")) { + fsUuid = StringPrintf("%s", value); + } else if (!strcmp(type, "LABEL")) { + fsLabel = StringPrintf("%s", value); + } + } + blkid_tag_iterate_end(iter); + } + + return OK; +} + + +status_t ForkExecvp(const std::vector<std::string>& args) { + return ForkExecvp(args, nullptr); +} + +status_t ForkExecvp(const std::vector<std::string>& args, security_context_t context) { + size_t argc = args.size(); + char** argv = (char**) calloc(argc, sizeof(char*)); + for (size_t i = 0; i < argc; i++) { + argv[i] = (char*) args[i].c_str(); + if (i == 0) { + LOG(VERBOSE) << args[i]; + } else { + LOG(VERBOSE) << " " << args[i]; + } + } + + if (setexeccon(context)) { + LOG(ERROR) << "Failed to setexeccon"; + abort(); + } + status_t res = android_fork_execvp(argc, argv, NULL, false, true); + if (setexeccon(nullptr)) { + LOG(ERROR) << "Failed to setexeccon"; + abort(); + } + + free(argv); + return res; +} + +status_t ForkExecvp(const std::vector<std::string>& args, + std::vector<std::string>& output) { + return ForkExecvp(args, output, nullptr); +} + +status_t ForkExecvp(const std::vector<std::string>& args, + std::vector<std::string>& output, security_context_t context) { + std::string cmd; + for (size_t i = 0; i < args.size(); i++) { + cmd += args[i] + " "; + if (i == 0) { + LOG(VERBOSE) << args[i]; + } else { + LOG(VERBOSE) << " " << args[i]; + } + } + output.clear(); + + if (setexeccon(context)) { + LOG(ERROR) << "Failed to setexeccon"; + abort(); + } + FILE* fp = popen(cmd.c_str(), "r"); + if (setexeccon(nullptr)) { + LOG(ERROR) << "Failed to setexeccon"; + abort(); + } + + if (!fp) { + PLOG(ERROR) << "Failed to popen " << cmd; + return -errno; + } + char line[1024]; + while (fgets(line, sizeof(line), fp) != nullptr) { + LOG(VERBOSE) << line; + output.push_back(std::string(line)); + } + if (pclose(fp) != 0) { + PLOG(ERROR) << "Failed to pclose " << cmd; + return -errno; + } + + return OK; +} + +pid_t ForkExecvpAsync(const std::vector<std::string>& args) { + size_t argc = args.size(); + char** argv = (char**) calloc(argc + 1, sizeof(char*)); + for (size_t i = 0; i < argc; i++) { + argv[i] = (char*) args[i].c_str(); + if (i == 0) { + LOG(VERBOSE) << args[i]; + } else { + LOG(VERBOSE) << " " << args[i]; + } + } + + pid_t pid = fork(); + if (pid == 0) { + close(STDIN_FILENO); + close(STDOUT_FILENO); + close(STDERR_FILENO); + + if (execvp(argv[0], argv)) { + PLOG(ERROR) << "Failed to exec"; + } + + _exit(1); + } + + if (pid == -1) { + PLOG(ERROR) << "Failed to exec"; + } + + free(argv); + return pid; +} + +status_t ReadRandomBytes(size_t bytes, std::string& out) { + out.clear(); + + int fd = TEMP_FAILURE_RETRY(open("/dev/urandom", O_RDONLY | O_CLOEXEC | O_NOFOLLOW)); + if (fd == -1) { + return -errno; + } + + char buf[BUFSIZ]; + size_t n; + while ((n = TEMP_FAILURE_RETRY(read(fd, &buf[0], std::min(sizeof(buf), bytes)))) > 0) { + out.append(buf, n); + bytes -= n; + } + close(fd); + + if (bytes == 0) { + return OK; + } else { + return -EIO; + } +} + +status_t HexToStr(const std::string& hex, std::string& str) { + str.clear(); + bool even = true; + char cur = 0; + for (size_t i = 0; i < hex.size(); i++) { + int val = 0; + switch (hex[i]) { + case ' ': case '-': case ':': continue; + case 'f': case 'F': val = 15; break; + case 'e': case 'E': val = 14; break; + case 'd': case 'D': val = 13; break; + case 'c': case 'C': val = 12; break; + case 'b': case 'B': val = 11; break; + case 'a': case 'A': val = 10; break; + case '9': val = 9; break; + case '8': val = 8; break; + case '7': val = 7; break; + case '6': val = 6; break; + case '5': val = 5; break; + case '4': val = 4; break; + case '3': val = 3; break; + case '2': val = 2; break; + case '1': val = 1; break; + case '0': val = 0; break; + default: return -EINVAL; + } + + if (even) { + cur = val << 4; + } else { + cur += val; + str.push_back(cur); + cur = 0; + } + even = !even; + } + return even ? OK : -EINVAL; +} + +static const char* kLookup = "0123456789abcdef"; + +status_t StrToHex(const std::string& str, std::string& hex) { + hex.clear(); + for (size_t i = 0; i < str.size(); i++) { + hex.push_back(kLookup[(str[i] & 0xF0) >> 4]); + hex.push_back(kLookup[str[i] & 0x0F]); + } + return OK; +} + +status_t NormalizeHex(const std::string& in, std::string& out) { + std::string tmp; + if (HexToStr(in, tmp)) { + return -EINVAL; + } + return StrToHex(tmp, out); +} + +uint64_t GetFreeBytes(const std::string& path) { + struct statvfs sb; + if (statvfs(path.c_str(), &sb) == 0) { + return (uint64_t)sb.f_bfree * sb.f_bsize; + } else { + return -1; + } +} + +// TODO: borrowed from frameworks/native/libs/diskusage/ which should +// eventually be migrated into system/ +static int64_t stat_size(struct stat *s) { + int64_t blksize = s->st_blksize; + // count actual blocks used instead of nominal file size + int64_t size = s->st_blocks * 512; + + if (blksize) { + /* round up to filesystem block size */ + size = (size + blksize - 1) & (~(blksize - 1)); + } + + return size; +} + +// TODO: borrowed from frameworks/native/libs/diskusage/ which should +// eventually be migrated into system/ +int64_t calculate_dir_size(int dfd) { + int64_t size = 0; + struct stat s; + DIR *d; + struct dirent *de; + + d = fdopendir(dfd); + if (d == NULL) { + close(dfd); + return 0; + } + + while ((de = readdir(d))) { + const char *name = de->d_name; + if (fstatat(dfd, name, &s, AT_SYMLINK_NOFOLLOW) == 0) { + size += stat_size(&s); + } + if (de->d_type == DT_DIR) { + int subfd; + + /* always skip "." and ".." */ + if (name[0] == '.') { + if (name[1] == 0) + continue; + if ((name[1] == '.') && (name[2] == 0)) + continue; + } + + subfd = openat(dfd, name, O_RDONLY | O_DIRECTORY); + if (subfd >= 0) { + size += calculate_dir_size(subfd); + } + } + } + closedir(d); + return size; +} + +uint64_t GetTreeBytes(const std::string& path) { + int dirfd = open(path.c_str(), O_DIRECTORY, O_RDONLY); + if (dirfd < 0) { + PLOG(WARNING) << "Failed to open " << path; + return -1; + } else { + uint64_t res = calculate_dir_size(dirfd); + close(dirfd); + return res; + } +} + +bool IsFilesystemSupported(const std::string& fsType) { + std::string supported; + if (!ReadFileToString(kProcFilesystems, &supported)) { + PLOG(ERROR) << "Failed to read supported filesystems"; + return false; + } + return supported.find(fsType + "\n") != std::string::npos; +} + +status_t WipeBlockDevice(const std::string& path) { + status_t res = -1; + const char* c_path = path.c_str(); + unsigned long nr_sec = 0; + unsigned long long range[2]; + + int fd = TEMP_FAILURE_RETRY(open(c_path, O_RDWR | O_CLOEXEC)); + if (fd == -1) { + PLOG(ERROR) << "Failed to open " << path; + goto done; + } + + if ((ioctl(fd, BLKGETSIZE, &nr_sec)) == -1) { + PLOG(ERROR) << "Failed to determine size of " << path; + goto done; + } + + range[0] = 0; + range[1] = (unsigned long long) nr_sec * 512; + + LOG(INFO) << "About to discard " << range[1] << " on " << path; + if (ioctl(fd, BLKDISCARD, &range) == 0) { + LOG(INFO) << "Discard success on " << path; + res = 0; + } else { + PLOG(ERROR) << "Discard failure on " << path; + } + +done: + close(fd); + return res; +} + +std::string BuildDataUserDePath(const char* volumeUuid, userid_t userId) { + // TODO: unify with installd path generation logic + std::string data(BuildDataPath(volumeUuid)); + return StringPrintf("%s/user_de/%u", data.c_str(), userId); +} + +dev_t GetDevice(const std::string& path) { + struct stat sb; + if (stat(path.c_str(), &sb)) { + PLOG(WARNING) << "Failed to stat " << path; + return 0; + } else { + return sb.st_dev; + } +} + +std::string DefaultFstabPath() { + char hardware[PROPERTY_VALUE_MAX]; + property_get("ro.hardware", hardware, ""); + return StringPrintf("/fstab.%s", hardware); +} + +status_t RestoreconRecursive(const std::string& path) { + LOG(VERBOSE) << "Starting restorecon of " << path; + + // TODO: find a cleaner way of waiting for restorecon to finish + const char* cpath = path.c_str(); + property_set("selinux.restorecon_recursive", ""); + property_set("selinux.restorecon_recursive", cpath); + + char value[PROPERTY_VALUE_MAX]; + while (true) { + property_get("selinux.restorecon_recursive", value, ""); + if (strcmp(cpath, value) == 0) { + break; + } + usleep(100000); // 100ms + } + + LOG(VERBOSE) << "Finished restorecon of " << path; + return OK; +} + +status_t SaneReadLinkAt(int dirfd, const char* path, char* buf, size_t bufsiz) { + ssize_t len = readlinkat(dirfd, path, buf, bufsiz); + if (len < 0) { + return -1; + } else if (len == (ssize_t) bufsiz) { + return -1; + } else { + buf[len] = '\0'; + return 0; + } +} + +ScopedFd::ScopedFd(int fd) : fd_(fd) {} + +ScopedFd::~ScopedFd() { + close(fd_); +} + +ScopedDir::ScopedDir(DIR* dir) : dir_(dir) {} + +ScopedDir::~ScopedDir() { + if (dir_ != nullptr) { + closedir(dir_); + } +} + +bool IsRunningInEmulator() { + return property_get_bool("ro.kernel.qemu", 0); +} + +status_t readBlockDevMajorAndMinor( + const std::string& devPath, + std::string& major, std::string& minor) { + major.clear(); + minor.clear(); + + std::vector<std::string> cmd; + cmd.push_back("/system/bin/ls"); + cmd.push_back("-l"); + cmd.push_back(devPath); + + std::vector<std::string> output; + status_t res = ForkExecvp(cmd, output); + if (res != OK) { + LOG(WARNING) << "failed to identify ls -l " << devPath; + return res; + } + + // Extract values from output + // brw------- root root 179, 1 2015-01-01 00:00 mmcblk0p1 + char value[128]; + for (auto line : output) { + int count = sscanf(line.c_str(), "%3s", value); + if (count == 1 && !strcmp(value, "brw")) { // block device + char f[128], s[128]; + if (sscanf(line.c_str(), "%[^','],%s", f, s) == 2) { // split ',' + minor = s; + char *cline = strdup(f); + char *str = strtok(cline, " "); + char buf[25]; + while (str != nullptr) { + if (sscanf(str, "%[1-9]", buf) == 1) { + major = buf; + } + str = strtok(nullptr, " "); + } + } + } + } + + return OK; +} + +// Get physical device path (such as /dev/block/sda) by kernel event sys path +status_t GetPhysicalDevice( + const std::string& sysPath, std::string& physicalDev) { + int iPos = sysPath.find("/block/"); + if (iPos < 0) { + LOG(WARNING) << "can't find \"/block/\" in " << sysPath; + return -1; + } + + physicalDev = StringPrintf("/dev/block/%s", sysPath.substr(iPos + 7).c_str()); + if (access(physicalDev.c_str(), F_OK)) { + LOG(INFO) << "physical dev: " << physicalDev + " doesn't exist"; + return -1; + } + + return OK; +} + +// /sys//devices/d0072000.sd/mmc_host/sd/sd:0007/block/mmcblk0 +// /sys//devices/dwc2_b/usb1/1-1/1-1.2/1-1.2:1.0/host0/target0:0:0/0:0:0:0/block/sda +status_t GetLogicalPartitionDevice( + const dev_t device, const std::string& sysPath, std::string& logicalPartitionDev) { + std::string physicalDev; + const unsigned int kMajorBlockMmc = 179; + const unsigned int kMaxNumOfPartition = 31; + + // logical partition dev's major & minor + unsigned int devMajor = major(device); + unsigned int devMinor = minor(device); + + if (GetPhysicalDevice(sysPath, physicalDev) != OK) { + return -1; + } + + LOG(INFO) << "physical dev: " << physicalDev << + ", logical partition dev's major: " << devMajor << ", minor: " << devMinor; + + // For now, assume that MMC devices are SD, and that + // everything else is USB + std::string lpDev; + std::string major, minor; + for (unsigned int i = 1; i <= kMaxNumOfPartition; i ++) { + if (devMajor == kMajorBlockMmc) { // SD + lpDev = StringPrintf("%sp%d", physicalDev.c_str(), i); + } else { // USB + lpDev = StringPrintf("%s%d", physicalDev.c_str(), i); + } + + if (!access(lpDev.c_str(), F_OK) && + readBlockDevMajorAndMinor(lpDev, major, minor) == OK && + (int)devMajor == atoi(major.c_str()) && + (int)devMinor == atoi(minor.c_str())) { + logicalPartitionDev = lpDev; + LOG(INFO) << "find logical partition dev: " << logicalPartitionDev; + break; + } + } + + return OK; +} + +// Such as /dev/block/sda is used, return true,otherwise false +// just true,saved sda to physicalDevName +bool IsJustPhysicalDevice( + const std::string& sysPath, std::string& physicalDevName) { + std::string major, minor; + std::string physicalDev; + std::string logicalPartitionDev; + const unsigned int kMajorBlockMmc = 179; + + if (GetPhysicalDevice(sysPath, physicalDev) == OK) { + std::vector<std::string> cmd; + cmd.push_back(kBlkidPath); + cmd.push_back("-c"); + cmd.push_back("/dev/null"); + cmd.push_back("-s"); + cmd.push_back("TYPE"); + cmd.push_back("-s"); + cmd.push_back("UUID"); + cmd.push_back("-s"); + cmd.push_back("LABEL"); + cmd.push_back(physicalDev); + + std::vector<std::string> output; + status_t res = ForkExecvp(cmd, output, sBlkidUntrustedContext); + if (res != OK) { + LOG(WARNING) << "failed to identify blkid " << physicalDev; + return false; + } + + char value[128]; + for (auto line : output) { + // Extract values from blkid output, if defined + const char* cline = line.c_str(); + if (!strncmp(cline, physicalDev.c_str(), strlen(physicalDev.c_str()))) { + if (readBlockDevMajorAndMinor(physicalDev, major, minor) == OK) { + logicalPartitionDev = (atoi(major.c_str()) == kMajorBlockMmc) ? + StringPrintf("%sp1", physicalDev.c_str()) : + StringPrintf("%s1", physicalDev.c_str()); + if (access(logicalPartitionDev.c_str(), F_OK)) { + // And logical partition device doesn't exist, + // we're sure physical device is used. + // length /dev/block/ = 11,such as sda or mmcblk0, + // we get as physical device name. + physicalDevName = StringPrintf("%s", physicalDev.substr(11).c_str()); + return true; + } + } + } + } + } + + return false; +} + +} // namespace vold +} // namespace android diff --git a/system/droidvold/Utils.h b/system/droidvold/Utils.h new file mode 100755 index 0000000..0e5e644 --- a/dev/null +++ b/system/droidvold/Utils.h @@ -0,0 +1,160 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef ANDROID_VOLD_UTILS_H +#define ANDROID_VOLD_UTILS_H + +#include <utils/Errors.h> +#include <cutils/multiuser.h> +#include <selinux/selinux.h> + +#include <vector> +#include <string> + +// DISALLOW_COPY_AND_ASSIGN disallows the copy and operator= functions. It goes in the private: +// declarations in a class. +#if !defined(DISALLOW_COPY_AND_ASSIGN) +#define DISALLOW_COPY_AND_ASSIGN(TypeName) \ + TypeName(const TypeName&) = delete; \ + void operator=(const TypeName&) = delete +#endif + +struct DIR; + +namespace android { +namespace droidvold { + +/* SELinux contexts used depending on the block device type */ +extern security_context_t sBlkidContext; +extern security_context_t sBlkidUntrustedContext; +extern security_context_t sFsckContext; +extern security_context_t sFsckUntrustedContext; + +/* fs_prepare_dir wrapper that creates with SELinux context */ +status_t PrepareDir(const std::string& path, mode_t mode, uid_t uid, gid_t gid); + +/* Really unmounts the path, killing active processes along the way */ +status_t ForceUnmount(const std::string& path); + +/* Kills any processes using given path */ +status_t KillProcessesUsingPath(const std::string& path); + +/* Creates bind mount from source to target */ +status_t BindMount(const std::string& source, const std::string& target); + +/* Reads filesystem metadata from untrusted device at path */ +status_t ReadPartMetadata(const std::string& path, std::string& fsType, + std::string& fsUuid, std::string& fsLabel); + +/* Returns either WEXITSTATUS() status, or a negative errno */ +status_t ForkExecvp(const std::vector<std::string>& args); +status_t ForkExecvp(const std::vector<std::string>& args, security_context_t context); + +status_t ForkExecvp(const std::vector<std::string>& args, + std::vector<std::string>& output); +status_t ForkExecvp(const std::vector<std::string>& args, + std::vector<std::string>& output, security_context_t context); + +pid_t ForkExecvpAsync(const std::vector<std::string>& args); + +status_t ReadRandomBytes(size_t bytes, std::string& out); + +/* Converts hex string to raw bytes, ignoring [ :-] */ +status_t HexToStr(const std::string& hex, std::string& str); +/* Converts raw bytes to hex string */ +status_t StrToHex(const std::string& str, std::string& hex); +/* Normalize given hex string into consistent format */ +status_t NormalizeHex(const std::string& in, std::string& out); + +uint64_t GetFreeBytes(const std::string& path); +uint64_t GetTreeBytes(const std::string& path); + +bool IsFilesystemSupported(const std::string& fsType); + +/* Wipes contents of block device at given path */ +status_t WipeBlockDevice(const std::string& path); + +std::string BuildKeyPath(const std::string& partGuid); + +std::string BuildDataSystemLegacyPath(userid_t userid); +std::string BuildDataSystemCePath(userid_t userid); +std::string BuildDataSystemDePath(userid_t userid); +std::string BuildDataMiscLegacyPath(userid_t userid); +std::string BuildDataMiscCePath(userid_t userid); +std::string BuildDataMiscDePath(userid_t userid); +std::string BuildDataProfilesDePath(userid_t userid); +std::string BuildDataProfilesForeignDexDePath(userid_t userid); + +std::string BuildDataPath(const char* volumeUuid); +std::string BuildDataMediaCePath(const char* volumeUuid, userid_t userid); +std::string BuildDataUserCePath(const char* volumeUuid, userid_t userid); +std::string BuildDataUserDePath(const char* volumeUuid, userid_t userid); + +dev_t GetDevice(const std::string& path); + +std::string DefaultFstabPath(); + +status_t RestoreconRecursive(const std::string& path); + +status_t SaneReadLinkAt(int dirfd, const char* path, char* buf, size_t bufsiz); + +class ScopedFd { + const int fd_; +public: + ScopedFd(int fd); + ~ScopedFd(); + int get() const { return fd_; } + + DISALLOW_COPY_AND_ASSIGN(ScopedFd); +}; + +class ScopedDir { + DIR* const dir_; +public: + ScopedDir(DIR* dir); + ~ScopedDir(); + DIR* get() const { return dir_; } + + DISALLOW_COPY_AND_ASSIGN(ScopedDir); +}; + +/* Checks if Android is running in QEMU */ +bool IsRunningInEmulator(); + +/* Get physical device,such as /dev/block/mmcblk1 */ +status_t GetPhysicalDevice( + const std::string& sysPath, + std::string& physicalDev); + +/* Get logical partition device,such as /dev/block/mmcblk1p1 */ +status_t GetLogicalPartitionDevice( + const dev_t device, + const std::string& sysPath, + std::string& logicalPartitionDev); + +/* Check sd/udisk physical devices whether are used */ +bool IsJustPhysicalDevice( + const std::string& sysPath, + std::string& physicalDevName); + +status_t readBlockDevMajorAndMinor( + const std::string& devPath, + std::string& major, std::string& minor); + +} // namespace vold +} // namespace android + +#endif diff --git a/system/droidvold/VolumeBase.cpp b/system/droidvold/VolumeBase.cpp new file mode 100755 index 0000000..e2e53b9 --- a/dev/null +++ b/system/droidvold/VolumeBase.cpp @@ -0,0 +1,275 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Utils.h" +#include "VolumeBase.h" +#include "VolumeManager.h" +#include "ResponseCode.h" + +#include <android-base/stringprintf.h> +#include <android-base/logging.h> + +#include <fcntl.h> +#include <stdlib.h> +#include <sys/mount.h> +#include <sys/stat.h> +#include <sys/types.h> + +using android::base::StringPrintf; + +namespace android { +namespace droidvold { + +VolumeBase::VolumeBase(Type type) : + mType(type), mMountFlags(0), mMountUserId(-1), mCreated(false), mState( + State::kUnmounted), mSilent(false), mDiskFlags(0), mPartNo(0) { +} + +VolumeBase::~VolumeBase() { + CHECK(!mCreated); +} + +void VolumeBase::setState(State state) { + mState = state; + notifyEvent(ResponseCode::VolumeStateChanged, StringPrintf("%d", mState)); +} + +status_t VolumeBase::setDiskId(const std::string& diskId) { + if (mCreated) { + LOG(WARNING) << getId() << " diskId change requires destroyed"; + return -EBUSY; + } + + mDiskId = diskId; + return OK; +} + +status_t VolumeBase::setPartGuid(const std::string& partGuid) { + if (mCreated) { + LOG(WARNING) << getId() << " partGuid change requires destroyed"; + return -EBUSY; + } + + mPartGuid = partGuid; + return OK; +} + +status_t VolumeBase::setMountFlags(int mountFlags) { + if ((mState != State::kUnmounted) && (mState != State::kUnmountable)) { + LOG(WARNING) << getId() << " flags change requires state unmounted or unmountable"; + return -EBUSY; + } + + mMountFlags = mountFlags; + return OK; +} + +status_t VolumeBase::setDiskFlags(int diskFlags) { + if (mCreated) { + LOG(WARNING) << getId() << " Diskflags change requires destroyed"; + return -EBUSY; + } + + mDiskFlags = diskFlags; + return OK; +} + +status_t VolumeBase::setPartNo(int part) { + if (mCreated) { + LOG(WARNING) << getId() << " partNo change requires destroyed"; + return -EBUSY; + } + + mPartNo = part; + return OK; +} + +status_t VolumeBase::setMountUserId(userid_t mountUserId) { + if ((mState != State::kUnmounted) && (mState != State::kUnmountable)) { + LOG(WARNING) << getId() << " user change requires state unmounted or unmountable"; + return -EBUSY; + } + + mMountUserId = mountUserId; + return OK; +} + +status_t VolumeBase::setSilent(bool silent) { + if (mCreated) { + LOG(WARNING) << getId() << " silence change requires destroyed"; + return -EBUSY; + } + + mSilent = silent; + return OK; +} + +status_t VolumeBase::setId(const std::string& id) { + if (mCreated) { + LOG(WARNING) << getId() << " id change requires not created"; + return -EBUSY; + } + + mId = id; + return OK; +} + +status_t VolumeBase::setPath(const std::string& path) { + if (mState != State::kChecking) { + LOG(WARNING) << getId() << " path change requires state checking"; + return -EBUSY; + } + + mPath = path; + notifyEvent(ResponseCode::VolumePathChanged, mPath); + return OK; +} + +status_t VolumeBase::setInternalPath(const std::string& internalPath) { + if (mState != State::kChecking) { + LOG(WARNING) << getId() << " internal path change requires state checking"; + return -EBUSY; + } + + mInternalPath = internalPath; + notifyEvent(ResponseCode::VolumeInternalPathChanged, mInternalPath); + return OK; +} + +void VolumeBase::notifyEvent(int event) { + if (mSilent) return; + VolumeManager::Instance()->getBroadcaster()->sendBroadcast(event, + getId()); +} + +void VolumeBase::notifyEvent(int event, const std::string& value) { + if (mSilent) return; + VolumeManager::Instance()->getBroadcaster()->sendBroadcast(event, + StringPrintf("%s %s", getId().c_str(), value.c_str())); +} + + +void VolumeBase::addVolume(const std::shared_ptr<VolumeBase>& volume) { + mVolumes.push_back(volume); +} + +void VolumeBase::removeVolume(const std::shared_ptr<VolumeBase>& volume) { + mVolumes.remove(volume); +} + +std::shared_ptr<VolumeBase> VolumeBase::findVolume(const std::string& id) { + for (auto vol : mVolumes) { + if (vol->getId() == id) { + return vol; + } + } + return nullptr; +} + +status_t VolumeBase::create() { + CHECK(!mCreated); + + mCreated = true; + status_t res = doCreate(); + notifyEvent(ResponseCode::VolumeCreated, + StringPrintf("%d \"%s\" \"%s\"", mType, mDiskId.c_str(), mPartGuid.c_str())); + setState(State::kUnmounted); + return res; +} + +status_t VolumeBase::doCreate() { + return OK; +} + +status_t VolumeBase::destroy() { + CHECK(mCreated); + + if (mState == State::kMounted) { + unmount(); + setState(State::kBadRemoval); + } else { + setState(State::kRemoved); + } + + notifyEvent(ResponseCode::VolumeDestroyed); + status_t res = doDestroy(); + mCreated = false; + return res; +} + +status_t VolumeBase::doDestroy() { + return OK; +} + +status_t VolumeBase::mount() { + if ((mState != State::kUnmounted) && (mState != State::kUnmountable)) { + LOG(WARNING) << getId() << " mount requires state unmounted or unmountable"; + return -EBUSY; + } + + setState(State::kChecking); + status_t res = doMount(); + if (res == OK) { + setState(State::kMounted); + } else { + setState(State::kUnmountable); + } + + return res; +} + +status_t VolumeBase::unmount() { + if (mState != State::kMounted) { + LOG(WARNING) << getId() << " unmount requires state mounted"; + return -EBUSY; + } + + setState(State::kEjecting); + for (auto vol : mVolumes) { + if (vol->destroy()) { + LOG(WARNING) << getId() << " failed to destroy " << vol->getId() + << " stacked above"; + } + } + mVolumes.clear(); + + status_t res = doUnmount(); + setState(State::kUnmounted); + return res; +} + +status_t VolumeBase::format(const std::string& fsType) { + if (mState == State::kMounted) { + unmount(); + } + + if ((mState != State::kUnmounted) && (mState != State::kUnmountable)) { + LOG(WARNING) << getId() << " format requires state unmounted or unmountable"; + return -EBUSY; + } + + setState(State::kFormatting); + status_t res = doFormat(fsType); + setState(State::kUnmounted); + return res; +} + +status_t VolumeBase::doFormat(const std::string& fsType) { + return -ENOTSUP; +} + +} // namespace vold +} // namespace android diff --git a/system/droidvold/VolumeBase.h b/system/droidvold/VolumeBase.h new file mode 100755 index 0000000..28a2cfe --- a/dev/null +++ b/system/droidvold/VolumeBase.h @@ -0,0 +1,165 @@ +/* + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef ANDROID_VOLD_VOLUME_BASE_H +#define ANDROID_VOLD_VOLUME_BASE_H + +#include "Utils.h" + +#include <cutils/multiuser.h> +#include <utils/Errors.h> + +#include <sys/types.h> +#include <list> +#include <string> + +namespace android { +namespace droidvold { + +/* + * Representation of a mounted volume ready for presentation. + * + * Various subclasses handle the different mounting prerequisites, such as + * encryption details, etc. Volumes can also be "stacked" above other + * volumes to help communicate dependencies. For example, an ASEC volume + * can be stacked on a vfat volume. + * + * Mounted volumes can be asked to manage bind mounts to present themselves + * to specific users on the device. + * + * When an unmount is requested, the volume recursively unmounts any stacked + * volumes and removes any bind mounts before finally unmounting itself. + */ +class VolumeBase { +public: + virtual ~VolumeBase(); + + enum class Type { + kPublic = 0, + kPrivate, + kEmulated, + kAsec, + kObb, + }; + + enum MountFlags { + /* Flag that volume is primary external storage */ + kPrimary = 1 << 0, + /* Flag that volume is visible to normal apps */ + kVisible = 1 << 1, + }; + + enum class State { + kUnmounted = 0, + kChecking, + kMounted, + kMountedReadOnly, + kFormatting, + kEjecting, + kUnmountable, + kRemoved, + kBadRemoval, + }; + + const std::string& getId() { return mId; } + const std::string& getDiskId() { return mDiskId; } + const std::string& getPartGuid() { return mPartGuid; } + Type getType() { return mType; } + int getMountFlags() { return mMountFlags; } + userid_t getMountUserId() { return mMountUserId; } + State getState() { return mState; } + const std::string& getPath() { return mPath; } + const std::string& getSysPath() { return mSysPath; } + const std::string& getInternalPath() { return mInternalPath; } + int getDiskFlags() { return mDiskFlags; } + int getPartNo() { return mPartNo; } + + status_t setDiskId(const std::string& diskId); + status_t setPartGuid(const std::string& partGuid); + status_t setMountFlags(int mountFlags); + status_t setMountUserId(userid_t mountUserId); + status_t setSilent(bool silent); + void setSysPath(const std::string& sysPath) { mSysPath = sysPath; } + status_t setDiskFlags(int diskFlags); + status_t setPartNo(int part); + + void addVolume(const std::shared_ptr<VolumeBase>& volume); + void removeVolume(const std::shared_ptr<VolumeBase>& volume); + + std::shared_ptr<VolumeBase> findVolume(const std::string& id); + + status_t create(); + status_t destroy(); + status_t mount(); + status_t unmount(); + status_t format(const std::string& fsType); + virtual bool isSrdiskMounted() = 0; + +protected: + explicit VolumeBase(Type type); + + virtual status_t doCreate(); + virtual status_t doDestroy(); + virtual status_t doMount() = 0; + virtual status_t doUnmount() = 0; + virtual status_t doFormat(const std::string& fsType); + + status_t setId(const std::string& id); + status_t setPath(const std::string& path); + status_t setInternalPath(const std::string& internalPath); + void notifyEvent(int msg); + void notifyEvent(int msg, const std::string& value); + +private: + /* ID that uniquely references volume while alive */ + std::string mId; + /* ID that uniquely references parent disk while alive */ + std::string mDiskId; + /* Partition GUID of this volume */ + std::string mPartGuid; + /* Volume type */ + Type mType; + /* Flags used when mounting this volume */ + int mMountFlags; + /* User that owns this volume, otherwise -1 */ + userid_t mMountUserId; + /* Flag indicating object is created */ + bool mCreated; + /* Current state of volume */ + State mState; + /* Path to mounted volume */ + std::string mPath; + /* Device path under sysfs */ + std::string mSysPath; + /* Path to internal backing storage */ + std::string mInternalPath; + /* Flag indicating that volume should emit no events */ + bool mSilent; + int mDiskFlags; + int mPartNo; + + /* Volumes stacked on top of this volume */ + std::list<std::shared_ptr<VolumeBase>> mVolumes; + + void setState(State state); + + DISALLOW_COPY_AND_ASSIGN(VolumeBase); +}; + +} // namespace vold +} // namespace android + +#endif diff --git a/system/droidvold/VolumeManager.cpp b/system/droidvold/VolumeManager.cpp new file mode 100755 index 0000000..5b82180 --- a/dev/null +++ b/system/droidvold/VolumeManager.cpp @@ -0,0 +1,437 @@ +/* + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <dirent.h> +#include <errno.h> +#include <fcntl.h> +#include <fts.h> +#include <mntent.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/ioctl.h> +#include <sys/mount.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <sys/wait.h> +#include <unistd.h> +#include <sys/sysmacros.h> +#include <sys/sysmacros.h> + +#include <linux/kdev_t.h> +#include <linux/loop.h> + +#define LOG_TAG "droidVold" + +#include <android-base/logging.h> +#include <android-base/stringprintf.h> +#include <cutils/fs.h> +#include <cutils/log.h> + +#include <selinux/android.h> + +#include <sysutils/NetlinkEvent.h> +#include <private/android_filesystem_config.h> + +#include "VolumeManager.h" +#include "NetlinkManager.h" +#include "DroidVold.h" + +#include "fs/Ext4.h" +#include "fs/Vfat.h" +#include "Utils.h" +#include "Process.h" +#include "fs/Iso9660.h" + +#ifdef HAS_VIRTUAL_CDROM +#define LOOP_DEV "/dev/block/loop0" +#define LOOP_MOUNTPOINT "/mnt/loop" +#endif + +using android::base::StringPrintf; + +static const unsigned int kMajorBlockMmc = 179; +static const unsigned int kMajorBlockExperimentalMin = 240; +static const unsigned int kMajorBlockExperimentalMax = 254; + +VolumeManager *VolumeManager::sInstance = NULL; + +VolumeManager *VolumeManager::Instance() { + if (!sInstance) + sInstance = new VolumeManager(); + return sInstance; +} + +VolumeManager::VolumeManager() { + mDebug = false; + mBroadcaster = NULL; +#ifdef HAS_VIRTUAL_CDROM + mLoopPath = NULL; +#endif +} + +VolumeManager::~VolumeManager() { +} + +int VolumeManager::setDebug(bool enable) { + mDebug = enable; + return 0; +} + +int VolumeManager::start() { + // Always start from a clean slate by unmounting everything in + // directories that we own, in case we crashed. + unmountAll(); + + return 0; +} + +int VolumeManager::stop() { + return 0; +} + +void VolumeManager::handleBlockEvent(NetlinkEvent *evt) { + std::lock_guard<std::mutex> lock(mLock); + + if (mDebug) { + LOG(VERBOSE) << "----------------"; + LOG(VERBOSE) << "handleBlockEvent with action " << (int) evt->getAction(); + evt->dump(); + } + + std::string devType(evt->findParam("DEVTYPE")?evt->findParam("DEVTYPE"):""); + + + if (devType == "disk") { + std::string eventPath(evt->findParam("DEVPATH")?evt->findParam("DEVPATH"):""); + std::string devName(evt->findParam("DEVNAME")?evt->findParam("DEVNAME"):""); + + int major = atoi(evt->findParam("MAJOR")); + int minor = atoi(evt->findParam("MINOR")); + dev_t device = makedev(major, minor); + + switch (evt->getAction()) { + case NetlinkEvent::Action::kAdd: { + for (auto source : mDiskSources) { + if (source->matches(eventPath)) { + // For now, assume that MMC and virtio-blk (the latter is + // emulator-specific; see Disk.cpp for details) devices are SD, + // and that everything else is USB + int flags = source->getFlags(); + if (major == kMajorBlockMmc + || (android::droidvold::IsRunningInEmulator() + && major >= (int) kMajorBlockExperimentalMin + && major <= (int) kMajorBlockExperimentalMax)) { + flags |= android::droidvold::Disk::Flags::kSd; + } else { + flags |= android::droidvold::Disk::Flags::kUsb; + } + + auto disk = new android::droidvold::Disk(eventPath, device, + source->getNickname(), devName, flags); + disk->create(); + mDisks.push_back(std::shared_ptr<android::droidvold::Disk>(disk)); + break; + } + } + break; + } + case NetlinkEvent::Action::kChange: { + LOG(DEBUG) << "Disk at " << major << ":" << minor << " changed"; + for (auto disk : mDisks) { + if (disk->getDevice() == device) { + if (disk->isSrdiskMounted()) { + LOG(DEBUG) << "srdisk ejected"; + disk->destroyAllVolumes(); + break; + } + + //disk->readMetadata(); + //disk->readPartitions(); + } + } + break; + } + case NetlinkEvent::Action::kRemove: { + auto i = mDisks.begin(); + while (i != mDisks.end()) { + if ((*i)->getDevice() == device) { + (*i)->destroy(); + i = mDisks.erase(i); + } else { + ++i; + } + } + break; + } + default: { + LOG(WARNING) << "Unexpected block event action " << (int) evt->getAction(); + break; + } + } + + } else { + for (auto disk : mDisks) { + disk->handleBlockEvent(evt); + } + } + +} + +void VolumeManager::addDiskSource(const std::shared_ptr<DiskSource>& diskSource) { + mDiskSources.push_back(diskSource); +} + +std::shared_ptr<android::droidvold::VolumeBase> VolumeManager::findVolume(const std::string& id) { + + for (auto disk : mDisks) { + auto vol = disk->findVolume(id); + if (vol != nullptr) { + return vol; + } + } + return nullptr; +} + +void VolumeManager::listVolumes(android::droidvold::VolumeBase::Type type, + std::list<std::string>& list) { + list.clear(); + for (auto disk : mDisks) { + disk->listVolumes(type, list); + } +} + +int VolumeManager::unmountAll() { + std::lock_guard<std::mutex> lock(mLock); + + for (auto disk : mDisks) { + disk->unmountAll(); + } + + return 0; +} + +#ifdef HAS_VIRTUAL_CDROM +int VolumeManager::loopsetfd(const char * path) +{ + int fd,file_fd; + + if ((fd = open(LOOP_DEV, O_RDWR)) < 0) { + SLOGE("Unable to open loop0 device (%s)",strerror(errno)); + return -1; + } + + if ((file_fd = open(path, O_RDWR)) < 0) { + SLOGE("Unable to open %s (%s)", path, strerror(errno)); + close(fd); + return -1; + } + + if (ioctl(fd, LOOP_SET_FD, file_fd) < 0) { + SLOGE("Error setting up loopback interface (%s)", strerror(errno)); + close(file_fd); + close(fd); + return -1; + } + + close(fd); + close(file_fd); + + SLOGD("loopsetfd (%s) ok\n", path); + return 0; +} + +int VolumeManager::loopclrfd() +{ + int fd; + int rc=0; + + if ((fd = open(LOOP_DEV, O_RDWR)) < 0) { + SLOGE("Unable to open loop0 device (%s)",strerror(errno)); + return -1; + } + + if (ioctl(fd, LOOP_CLR_FD, 0) < 0) { + SLOGE("Error setting up loopback interface (%s)", strerror(errno)); + rc = -1; + } + close(fd); + + SLOGD("loopclrfd ok\n"); + return rc; +} + +int VolumeManager::mountloop(const char * path) { + if (isMountpointMounted(LOOP_MOUNTPOINT)) { + SLOGW("loop file already mounted,please umount fist,then mount this file!"); + errno = EBUSY; + return -1; + } + + if (loopsetfd(path) < 0) { + return -1; + } + + if (fs_prepare_dir(LOOP_MOUNTPOINT, 0700, AID_ROOT, AID_SDCARD_R)) { + SLOGE("failed to create loop mount points"); + return -errno; + } + + if (android::droidvold::iso9660::Mount(LOOP_DEV, LOOP_MOUNTPOINT, false, false, + AID_SDCARD_R, AID_SDCARD_R, 0007, true)) { + loopclrfd(); + SLOGW("%s failed to mount via ISO9660(%s)", LOOP_DEV, strerror(errno)); + return -1; + } else { + mLoopPath = strdup(path); + SLOGI("Successfully mount %s as ISO9660", LOOP_DEV); + } + + return 0; +} + +int VolumeManager::unmountloop(bool unused) { + if (!isMountpointMounted(LOOP_MOUNTPOINT)) { + SLOGW("no loop file mounted"); + errno = ENOENT; + return -1; + } + + android::droidvold::ForceUnmount(LOOP_MOUNTPOINT); + loopclrfd(); + rmdir(LOOP_MOUNTPOINT); + + if (mLoopPath != NULL) { + free(mLoopPath); + mLoopPath = NULL; + } + + return 0; +} + +void VolumeManager::unmountLoopIfNeed(const char *label) { + if (mLoopPath != NULL && strstr(mLoopPath, label)) { + SLOGD("umount loop"); + unmountloop(true); + } +} + +#endif + +bool VolumeManager::isMountpointMounted(const char *mp) +{ + FILE *fp = setmntent("/proc/mounts", "r"); + if (fp == NULL) { + SLOGE("Error opening /proc/mounts (%s)", strerror(errno)); + return false; + } + + bool found_mp = false; + mntent* mentry; + while ((mentry = getmntent(fp)) != NULL) { + if (strcmp(mentry->mnt_dir, mp) == 0) { + found_mp = true; + break; + } + } + endmntent(fp); + return found_mp; +} + +int VolumeManager::reset() { + // Tear down all existing disks/volumes and start from a blank slate so + // newly connected framework hears all events. + for (auto disk : mDisks) { + disk->destroy(); + disk->reset(); + } + + return 0; +} + +int VolumeManager::shutdown() { + for (auto disk : mDisks) { + disk->destroy(); + } + mDisks.clear(); + return 0; +} + +int VolumeManager::mkdirs(char* path) { + // Only offer to create directories for paths managed by vold + if (strncmp(path, "/mnt/media_rw/", 13) == 0) { + // fs_mkdirs() does symlink checking and relative path enforcement + return fs_mkdirs(path, 0700); + } else { + SLOGE("Failed to find mounted volume for %s", path); + return -EINVAL; + } +} + +static void do_coldboot(DIR *d, int lvl) { + struct dirent *de; + int dfd, fd; + + dfd = dirfd(d); + + fd = openat(dfd, "uevent", O_WRONLY | O_CLOEXEC); + if (fd >= 0) { + write(fd, "add\n", 4); + close(fd); + } + + while ((de = readdir(d))) { + DIR *d2; + + if (de->d_name[0] == '.') + continue; + + if (de->d_type != DT_DIR && lvl > 0) + continue; + + fd = openat(dfd, de->d_name, O_RDONLY | O_DIRECTORY); + if (fd < 0) + continue; + + d2 = fdopendir(fd); + if (d2 == 0) + close(fd); + else { + do_coldboot(d2, lvl + 1); + closedir(d2); + } + } +} + +void VolumeManager::coldboot(const char *path) { + DIR *d = opendir(path); + + if (d) { + do_coldboot(d, 0); + closedir(d); + } +} +int VolumeManager::getDiskFlag(const std::string &path) { + if (mDebug) + LOG(DEBUG) << "getdisk flag path=" << path; + for (auto disk : mDisks) { + auto vol = disk->findVolumeByPath(path); + if (vol != nullptr) { + return disk->getFlags(); + } + } + return 0; +} diff --git a/system/droidvold/VolumeManager.h b/system/droidvold/VolumeManager.h new file mode 100755 index 0000000..59b8c69 --- a/dev/null +++ b/system/droidvold/VolumeManager.h @@ -0,0 +1,125 @@ +/* + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef ANDROID_DROIDVOLD_VOLUME_MANAGER_H +#define ANDROID_DROIDVOLD_VOLUME_MANAGER_H + +#include <pthread.h> +#include <fnmatch.h> +#include <stdlib.h> + +#include <list> +#include <mutex> +#include <string> +#include <unordered_map> +#include <unordered_set> + +#include <cutils/multiuser.h> +#include <utils/List.h> +#include <utils/Timers.h> +#include <sysutils/NetlinkEvent.h> + +#include "Disk.h" +#include "VolumeBase.h" +#include "DroidVold.h" + +using namespace android; +using ::vendor::amlogic::hardware::droidvold::V1_0::implementation::DroidVold; + +class VolumeManager { +public: +#ifdef HAS_VIRTUAL_CDROM + char *mLoopPath; +#endif + +private: + static VolumeManager *sInstance; + + DroidVold *mBroadcaster; + + bool mDebug; + +public: + virtual ~VolumeManager(); + // TODO: pipe all requests through VM to avoid exposing this lock + std::mutex& getLock() { return mLock; } + + int start(); + int stop(); + + void handleBlockEvent(NetlinkEvent *evt); + + class DiskSource { + public: + DiskSource(const std::string& sysPattern, const std::string& nickname, int flags) : + mSysPattern(sysPattern), mNickname(nickname), mFlags(flags) { + } + + bool matches(const std::string& sysPath) { + return !fnmatch(mSysPattern.c_str(), sysPath.c_str(), 0); + } + + const std::string& getNickname() { return mNickname; } + int getFlags() { return mFlags; } + + private: + std::string mSysPattern; + std::string mNickname; + int mFlags; + }; + + void addDiskSource(const std::shared_ptr<DiskSource>& diskSource); + std::shared_ptr<android::droidvold::VolumeBase> findVolume(const std::string& id); + void listVolumes(android::droidvold::VolumeBase::Type type, std::list<std::string>& list); + + /* Reset all internal state, typically during framework boot */ + int reset(); + /* Prepare for device shutdown, safely unmounting all devices */ + int shutdown(); + + /* Unmount all volumes, usually for encryption */ + int unmountAll(); + + /* for iso file mount and umount */ +#ifdef HAS_VIRTUAL_CDROM + int loopsetfd(const char * path); + int loopclrfd(); + int mountloop(const char * path); + int unmountloop(bool force); + void unmountLoopIfNeed(const char *label); +#endif + + int setDebug(bool enable); + bool getDebug() { return mDebug; } + + void setBroadcaster(DroidVold *sl) { mBroadcaster = sl; } + DroidVold *getBroadcaster() { return mBroadcaster; } + + static VolumeManager *Instance(); + bool isMountpointMounted(const char *mp); + int mkdirs(char* path); + void coldboot(const char *path); + int getDiskFlag(const std::string &path); + +private: + VolumeManager(); + + std::mutex mLock; + std::list<std::shared_ptr<DiskSource>> mDiskSources; + std::list<std::shared_ptr<android::droidvold::Disk>> mDisks; +}; + +#endif diff --git a/system/droidvold/droidvold.rc b/system/droidvold/droidvold.rc new file mode 100755 index 0000000..d8192a5 --- a/dev/null +++ b/system/droidvold/droidvold.rc @@ -0,0 +1,4 @@ +service droidvold /vendor/bin/droidvold + class core + ioprio be 2 + writepid /dev/cpuset/foreground/tasks diff --git a/system/droidvold/fs/Exfat.cpp b/system/droidvold/fs/Exfat.cpp new file mode 100755 index 0000000..d05afbd --- a/dev/null +++ b/system/droidvold/fs/Exfat.cpp @@ -0,0 +1,215 @@ +/* + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <stdio.h> +#include <fcntl.h> +#include <unistd.h> +#include <errno.h> +#include <string.h> +#include <dirent.h> +#include <errno.h> +#include <fcntl.h> + +#include <sys/types.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <sys/mman.h> +#include <sys/mount.h> +#include <sys/wait.h> +#include <linux/kdev_t.h> + +#define LOG_TAG "droidVold" + +#include <cutils/log.h> +#include <cutils/properties.h> +#include <logwrap/logwrap.h> +#include <android-base/stringprintf.h> +#include <android-base/logging.h> + +#include "Exfat.h" + +#define UNUSED __attribute__((unused)) + +static char FSCK_EXFAT_PATH[] = "/system/bin/fsck.exfat"; +static char MKEXFAT_PATH[] = "/system/bin/mkfs.exfat"; +static char MOUNT_EXFAT_PATH[] = "/system/bin/mount.exfat"; + +extern "C" int mount( + const char *, const char *, const char *, + unsigned long, const void *); + +namespace android { +namespace droidvold { +namespace exfat { + +int Check(const char *fsPath) { + bool rw = true; + if (access(FSCK_EXFAT_PATH, X_OK)) { + LOG(WARNING) << "skipping exfat check"; + return 0; + } + + int pass = 1; + int rc = 0; + int status; + do { + const char *args[3]; + args[0] = FSCK_EXFAT_PATH; + args[1] = fsPath; + args[2] = NULL; + + rc = android_fork_execvp(2, (char **)args, &status, false, true); + if (rc != 0) { + LOG(ERROR) << "exfat check failed due to logwrap error"; + errno = EIO; + return -1; + } + + if (!WIFEXITED(status)) { + LOG(ERROR) << "exfat check did not exit properly"; + errno = EIO; + return -1; + } + + status = WEXITSTATUS(status); + switch (status) { + case 0: + LOG(INFO) << "exfat check completed ok"; + return 0; + + case 2: + LOG(ERROR) << "exfat check failed (not exfat filesystem)"; + errno = ENODATA; + return -1; + + default: + LOG(ERROR) << "exfat check failed.unknown exit code " << status; + //errno = EIO; + //We can still mount some disks even if fs check failed. + return 0; + } + } while (0); + + return 0; +} + +int Mount(const char *fsPath, const char *mountPoint, + bool ro UNUSED, bool remount UNUSED, int ownerUid UNUSED, + int ownerGid UNUSED, int permMask UNUSED, bool createLost UNUSED) { +#ifdef HAS_EXFAT_FUSE + int rc; + int status; + do { + const char *args[4]; + args[0] = MOUNT_EXFAT_PATH; + args[1] = fsPath; + args[2] = mountPoint; + args[3] = NULL; + + rc = android_fork_execvp(3, (char **)args, &status, false, true); + if (rc != 0) { + LOG(ERROR) << "exfat mount failed due to logwrap error"; + errno = EIO; + return -1; + } + + if (!WIFEXITED(status)) { + LOG(ERROR) << "exfat mount did not exit properly"; + errno = EIO; + return -1; + } + + status = WEXITSTATUS(status); + switch (status) { + case 0: + return 0; // mount ok + + default: + LOG(ERROR) << "exfat mount failed.unknown exit code " << rc; + errno = EIO; + return -1; + } + } while (0); +#else + int rc; + unsigned long flags; + char mountData[255]; + + flags = MS_NODEV | MS_NOEXEC | MS_NOSUID | MS_DIRSYNC; + flags |= (ro ? MS_RDONLY : 0); + flags |= (remount ? MS_REMOUNT : 0); + + sprintf(mountData, "uid=%d,gid=%d,fmask=%o,dmask=%o", + ownerUid, ownerGid, permMask, permMask); + + rc = mount(fsPath, mountPoint, "exfat", flags, mountData); + if (rc && errno == EROFS) { + LOG(ERROR) << fsPath << + " appears to be a read only filesystem - retry mount ro"; + flags |= MS_RDONLY; + rc = mount(fsPath, mountPoint, "exfat", flags, mountData); + } +#endif + return rc; +} + +int Format(const char *fsPath, unsigned int numSectors) { + const char *args[11]; + int rc; + int status; + args[0] = MKEXFAT_PATH; + + if (numSectors) { + char tmp[32]; + snprintf(tmp, sizeof(tmp), "%u", numSectors); + const char *size = tmp; + args[1] = "-s"; + args[2] = size; + args[3] = fsPath; + args[4] = NULL; + rc = android_fork_execvp(4, (char **)args, &status, false, true); + } else { + args[7] = fsPath; + args[8] = NULL; + rc = android_fork_execvp(8, (char **)args, &status, false, true); + } + + if (rc != 0) { + LOG(ERROR) << "exfat check failed due to logwrap error"; + errno = EIO; + return -1; + } + + if (!WIFEXITED(status)) { + LOG(ERROR) << "exfat check did not exit properly"; + errno = EIO; + return -1; + } + + status = WEXITSTATUS(status); + if (status == 0) { + LOG(INFO) << "exfat format ok"; + return 0; + } else { + LOG(ERROR) << "exfat format failed.unknown exit code " << rc; + errno = EIO; + return -1; + } +} + +} // namespace exfat +} // namespace vold +} // namespace android diff --git a/system/droidvold/fs/Exfat.h b/system/droidvold/fs/Exfat.h new file mode 100755 index 0000000..5b86a4d --- a/dev/null +++ b/system/droidvold/fs/Exfat.h @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef ANDROID_VOLD_EXFAT_H +#define ANDROID_VOLD_EXFAT_H + +#include <unistd.h> +#include <string> + +namespace android { +namespace droidvold { +namespace exfat { + +int Check(const char *fsPath); +int Mount(const char *fsPath, const char *mountPoint, bool ro, + bool remount, int ownerUid, int ownerGid, int permMask, + bool createLost); +int Format(const char *fsPath, unsigned int numSectors); + +} // namespace exfat +} // namespace vold +} // namespace android + +#endif diff --git a/system/droidvold/fs/Ext4.cpp b/system/droidvold/fs/Ext4.cpp new file mode 100755 index 0000000..a0708e2 --- a/dev/null +++ b/system/droidvold/fs/Ext4.cpp @@ -0,0 +1,186 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <fcntl.h> +#include <unistd.h> +#include <errno.h> +#include <string.h> +#include <dirent.h> +#include <errno.h> +#include <fcntl.h> +#include <vector> +#include <string> + +#include <sys/types.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <sys/mman.h> +#include <sys/mount.h> +#include <sys/wait.h> + +#include <linux/kdev_t.h> + +#define LOG_TAG "droidVold" + +#include <android-base/logging.h> +#include <android-base/stringprintf.h> +#include <cutils/log.h> +#include <cutils/properties.h> +#include <logwrap/logwrap.h> +#include <selinux/selinux.h> + +#include "Ext4.h" +#include "Utils.h" + +using android::base::StringPrintf; + +namespace android { +namespace droidvold { +namespace ext4 { + +static const char* kResizefsPath = "/system/bin/resize2fs"; +static const char* kMkfsPath = "/system/bin/make_ext4fs"; +static const char* kFsckPath = "/system/bin/e2fsck"; + +bool IsSupported() { + return access(kMkfsPath, X_OK) == 0 + && access(kFsckPath, X_OK) == 0 + && IsFilesystemSupported("ext4"); +} + +status_t Check(const std::string& source, const std::string& target) { + // The following is shamelessly borrowed from fs_mgr.c, so it should be + // kept in sync with any changes over there. + + const char* c_source = source.c_str(); + const char* c_target = target.c_str(); + + int status; + int ret; + long tmpmnt_flags = MS_NOATIME | MS_NOEXEC | MS_NOSUID; + char *tmpmnt_opts = (char*) "nomblk_io_submit,errors=remount-ro"; + + /* + * First try to mount and unmount the filesystem. We do this because + * the kernel is more efficient than e2fsck in running the journal and + * processing orphaned inodes, and on at least one device with a + * performance issue in the emmc firmware, it can take e2fsck 2.5 minutes + * to do what the kernel does in about a second. + * + * After mounting and unmounting the filesystem, run e2fsck, and if an + * error is recorded in the filesystem superblock, e2fsck will do a full + * check. Otherwise, it does nothing. If the kernel cannot mount the + * filesytsem due to an error, e2fsck is still run to do a full check + * fix the filesystem. + */ + ret = mount(c_source, c_target, "ext4", tmpmnt_flags, tmpmnt_opts); + if (!ret) { + int i; + for (i = 0; i < 5; i++) { + // Try to umount 5 times before continuing on. + // Should we try rebooting if all attempts fail? + int result = umount(c_target); + if (result == 0) { + break; + } + ALOGW("%s(): umount(%s)=%d: %s\n", __func__, c_target, result, strerror(errno)); + sleep(1); + } + } + + /* + * Some system images do not have e2fsck for licensing reasons + * (e.g. recent SDK system images). Detect these and skip the check. + */ + if (access(kFsckPath, X_OK)) { + ALOGD("Not running %s on %s (executable not in system image)\n", + kFsckPath, c_source); + } else { + ALOGD("Running %s on %s\n", kFsckPath, c_source); + + std::vector<std::string> cmd; + cmd.push_back(kFsckPath); + cmd.push_back("-y"); + cmd.push_back(c_source); + + // ext4 devices are currently always trusted + return ForkExecvp(cmd, sFsckContext); + } + + return 0; +} + +status_t Mount(const std::string& source, const std::string& target, bool ro, + bool remount, bool executable, const std::string& type) { + int rc; + unsigned long flags; + + const char* c_source = source.c_str(); + const char* c_target = target.c_str(); + + flags = MS_NOATIME | MS_NODEV | MS_NOSUID | MS_DIRSYNC; + + flags |= (executable ? 0 : MS_NOEXEC); + flags |= (ro ? MS_RDONLY : 0); + flags |= (remount ? MS_REMOUNT : 0); + + rc = mount(c_source, c_target, type.c_str(), flags, NULL); + + if (rc && errno == EROFS) { + SLOGE("%s appears to be a read only filesystem - retrying mount RO", c_source); + flags |= MS_RDONLY; + rc = mount(c_source, c_target, type.c_str(), flags, NULL); + } + + return rc; +} + +status_t Resize(const std::string& source, unsigned long numSectors) { + std::vector<std::string> cmd; + cmd.push_back(kResizefsPath); + cmd.push_back("-f"); + cmd.push_back(source); + cmd.push_back(StringPrintf("%lu", numSectors)); + + return ForkExecvp(cmd); +} + +status_t Format(const std::string& source, unsigned long numSectors, + const std::string& target) { + std::vector<std::string> cmd; + cmd.push_back(kMkfsPath); + cmd.push_back("-J"); + + cmd.push_back("-a"); + cmd.push_back(target); + + if (numSectors) { + cmd.push_back("-l"); + cmd.push_back(StringPrintf("%lu", numSectors * 512)); + } + + // Always generate a real UUID + cmd.push_back("-u"); + cmd.push_back(source); + + return ForkExecvp(cmd); +} + +} // namespace ext4 +} // namespace vold +} // namespace android diff --git a/system/droidvold/fs/Ext4.h b/system/droidvold/fs/Ext4.h new file mode 100755 index 0000000..c071066 --- a/dev/null +++ b/system/droidvold/fs/Ext4.h @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef ANDROID_VOLD_EXT4_H +#define ANDROID_VOLD_EXT4_H + +#include <utils/Errors.h> + +#include <string> + +namespace android { +namespace droidvold { +namespace ext4 { + +bool IsSupported(); + +status_t Check(const std::string& source, const std::string& target); +status_t Mount(const std::string& source, const std::string& target, bool ro, + bool remount, bool executable, const std::string& type="ext4"); +status_t Format(const std::string& source, unsigned long numSectors, + const std::string& target); +status_t Resize(const std::string& source, unsigned long numSectors); + +} // namespace ext4 +} // namespace vold +} // namespace android + +#endif diff --git a/system/droidvold/fs/F2fs.cpp b/system/droidvold/fs/F2fs.cpp new file mode 100755 index 0000000..0fd32fa --- a/dev/null +++ b/system/droidvold/fs/F2fs.cpp @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "F2fs.h" +#include "Utils.h" + +#include <android-base/logging.h> +#include <android-base/stringprintf.h> + +#include <vector> +#include <string> + +#include <sys/mount.h> + +using android::base::StringPrintf; + +namespace android { +namespace droidvold { +namespace f2fs { + +static const char* kMkfsPath = "/system/bin/make_f2fs"; +static const char* kFsckPath = "/system/bin/fsck.f2fs"; + +bool IsSupported() { + return access(kMkfsPath, X_OK) == 0 + && access(kFsckPath, X_OK) == 0 + && IsFilesystemSupported("f2fs"); +} + +status_t Check(const std::string& source) { + std::vector<std::string> cmd; + cmd.push_back(kFsckPath); + cmd.push_back("-a"); + cmd.push_back(source); + + // f2fs devices are currently always trusted + return ForkExecvp(cmd, sFsckContext); +} + +status_t Mount(const std::string& source, const std::string& target) { + const char* c_source = source.c_str(); + const char* c_target = target.c_str(); + unsigned long flags = MS_NOATIME | MS_NODEV | MS_NOSUID | MS_DIRSYNC; + + int res = mount(c_source, c_target, "f2fs", flags, NULL); + if (res != 0) { + PLOG(ERROR) << "Failed to mount " << source; + if (errno == EROFS) { + res = mount(c_source, c_target, "f2fs", flags | MS_RDONLY, NULL); + if (res != 0) { + PLOG(ERROR) << "Failed to mount read-only " << source; + } + } + } + + return res; +} + +status_t Format(const std::string& source) { + std::vector<std::string> cmd; + cmd.push_back(kMkfsPath); + cmd.push_back(source); + + return ForkExecvp(cmd); +} + +} // namespace f2fs +} // namespace vold +} // namespace android diff --git a/system/droidvold/fs/F2fs.h b/system/droidvold/fs/F2fs.h new file mode 100755 index 0000000..ede9465 --- a/dev/null +++ b/system/droidvold/fs/F2fs.h @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef ANDROID_VOLD_F2FS_H +#define ANDROID_VOLD_F2FS_H + +#include <utils/Errors.h> + +#include <string> + +namespace android { +namespace droidvold { +namespace f2fs { + +bool IsSupported(); + +status_t Check(const std::string& source); +status_t Mount(const std::string& source, const std::string& target); +status_t Format(const std::string& source); + +} // namespace f2fs +} // namespace vold +} // namespace android + +#endif diff --git a/system/droidvold/fs/Hfsplus.cpp b/system/droidvold/fs/Hfsplus.cpp new file mode 100755 index 0000000..8a01d03 --- a/dev/null +++ b/system/droidvold/fs/Hfsplus.cpp @@ -0,0 +1,152 @@ +/* + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <stdio.h> +#include <fcntl.h> +#include <unistd.h> +#include <errno.h> +#include <string.h> +#include <dirent.h> +#include <errno.h> +#include <fcntl.h> + +#include <sys/types.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <sys/mman.h> +#include <sys/mount.h> +#include <sys/wait.h> + +#include <linux/kdev_t.h> + +#define LOG_TAG "droidVold" + +#include <cutils/log.h> +#include <cutils/properties.h> +#include <logwrap/logwrap.h> +#include <android-base/stringprintf.h> +#include <android-base/logging.h> + +#include "Hfsplus.h" + +#define UNUSED __attribute__((unused)) + +static char FSCK_HFSPLUS_PATH[] = "/system/bin/fsck_hfsplus"; + +extern "C" int mount( + const char *, const char *, const char *, + unsigned long, const void *); + +namespace android { +namespace droidvold { +namespace hfsplus { + +int Check(const char *fsPath) { + bool rw = true; + if (access(FSCK_HFSPLUS_PATH, X_OK)) { + LOG(WARNING) << "skipping hfsplus check"; + return 0; + } + + int pass = 1; + int rc = 0; + int status; + + do { + const char *args[5]; + args[0] = FSCK_HFSPLUS_PATH; + args[1] = "-p"; + args[2] = "-f"; + args[3] = fsPath; + args[4] = NULL; + + rc = android_fork_execvp(4, (char **)args, &status, false, true); + if (rc != 0) { + LOG(ERROR) << "hfsplus check failed due to logwrap error"; + errno = EIO; + return -1; + } + + if (!WIFEXITED(status)) { + LOG(ERROR) << "hfsplus chedk did not exit properly"; + errno = EIO; + return -1; + } + + status = WEXITSTATUS(status); + switch (status) { + case 0: + LOG(INFO) << "hfsplus check completed ok"; + return 0; + + case 8: + LOG(ERROR) << "hfsplus check failed (not hfsplus filesystem)"; + errno = ENODATA; + return -1; + + case 4: + if (pass++ <= 3) { + LOG(INFO) << "hfsplus modified - rechecking pass " << pass; + continue; + } + LOG(ERROR) << "failed check hfsplus after too many rechecks"; + errno = EIO; + return -1; + + default: + LOG(ERROR) << "hfsplus check failed.unknown exit code " << rc; + errno = EIO; + return -1; + } + } while (0); + + return 0; +} + +int Mount(const char *fsPath, const char *mountPoint, + bool ro, bool remount, int ownerUid, int ownerGid, + int permMask UNUSED, bool createLost UNUSED) { + int rc; + unsigned long flags; + char mountData[255]; + + flags = MS_NODEV | MS_NOEXEC | MS_NOSUID | MS_DIRSYNC; + flags |= (ro ? MS_RDONLY : 0); + flags |= (remount ? MS_REMOUNT : 0); + + permMask = 0; + sprintf(mountData, "nls=utf8,uid=%d,gid=%d", ownerUid, ownerGid); + + rc = mount(fsPath, mountPoint, "hfsplus", flags, mountData); + if (rc && errno == EROFS) { + LOG(ERROR) << fsPath << + " appears to be a read only filesystem - retrying mount ro"; + flags |= MS_RDONLY; + rc = mount(fsPath, mountPoint, "hfsplus", flags, mountData); + } + + return rc; +} + +int Format(const char *fsPath UNUSED, unsigned int numSectors UNUSED) { + LOG(WARNING) << "skipping hfsplus format"; + errno = EIO; + return -1; +} + +} // namespace hfsplus +} // namespace vold +} // namespace android diff --git a/system/droidvold/fs/Hfsplus.h b/system/droidvold/fs/Hfsplus.h new file mode 100755 index 0000000..52171c8 --- a/dev/null +++ b/system/droidvold/fs/Hfsplus.h @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef ANDROID_VOLD_HFSPLUS_H +#define ANDROID_VOLD_HFSPLUS_H + +#include <unistd.h> +#include <string> + +namespace android { +namespace droidvold { +namespace hfsplus { + +int Check(const char *fsPath); +int Mount(const char *fsPath, const char *mountPoint, bool ro, + bool remount, int ownerUid, int ownerGid, int permMask, + bool createLost); +int Format(const char *fsPath, unsigned int numSectors); + +} // namespace hfsplus +} // namespace vold +} // namespace android + +#endif diff --git a/system/droidvold/fs/Iso9660.cpp b/system/droidvold/fs/Iso9660.cpp new file mode 100755 index 0000000..8918f48 --- a/dev/null +++ b/system/droidvold/fs/Iso9660.cpp @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <stdio.h> +#include <fcntl.h> +#include <unistd.h> +#include <errno.h> +#include <string.h> +#include <dirent.h> +#include <errno.h> +#include <fcntl.h> + +#include <sys/types.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <sys/mman.h> +#include <sys/mount.h> + +#include <linux/kdev_t.h> + +#define LOG_TAG "droidVold" + +#include <cutils/log.h> +#include <cutils/properties.h> +#include <android-base/stringprintf.h> +#include <android-base/logging.h> + +#include "Iso9660.h" + +#define UNUSED __attribute__((unused)) + +extern "C" int mount( + const char *, const char *, const char *, + unsigned long, const void *); + +namespace android { +namespace droidvold { +namespace iso9660 { + +int Check(const char *fsPath UNUSED) { + LOG(WARNING) << "skipping iso9660 check"; + return 0; +} + +int Mount(const char *fsPath, const char *mountPoint, + bool ro UNUSED, bool remount, int ownerUid, int ownerGid, + int permMask UNUSED, bool createLost UNUSED) { + int rc; + unsigned long flags; + char mountData[255]; + + flags = MS_NODEV | MS_NOEXEC | MS_NOSUID | MS_DIRSYNC; + flags |= MS_RDONLY; + flags |= (remount ? MS_REMOUNT : 0); + + sprintf(mountData, "utf8,uid=%d,gid=%d",ownerUid, ownerGid); + + rc = mount(fsPath, mountPoint, "iso9660", flags, mountData); + if (rc !=0) { + rc = mount(fsPath, mountPoint, "udf", flags, mountData); + } + + return rc; +} + +int Format(const char *fsPath UNUSED, unsigned int numSectors UNUSED) { + LOG(WARNING) << "skipping iso9660 format"; + errno = EIO; + return -1; +} + +} // namespace iso9660 +} // namespace vold +} // namespace android diff --git a/system/droidvold/fs/Iso9660.h b/system/droidvold/fs/Iso9660.h new file mode 100755 index 0000000..1606621 --- a/dev/null +++ b/system/droidvold/fs/Iso9660.h @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef ANDROID_VOLD_ISO9660_H +#define ANDROID_VOLD_ISO9660_H + +#include <unistd.h> +#include <string> + +namespace android { +namespace droidvold { +namespace iso9660 { + +int Check(const char *fsPath); +int Mount(const char *fsPath, const char *mountPoint, bool ro, + bool remount, int ownerUid, int ownerGid, int permMask, + bool createLost); +int format(const char *fsPath, unsigned int numSectors); + +} // namespace iso9660 +} // namespace vold +} // namespace android + +#endif diff --git a/system/droidvold/fs/Ntfs.cpp b/system/droidvold/fs/Ntfs.cpp new file mode 100755 index 0000000..7571e34 --- a/dev/null +++ b/system/droidvold/fs/Ntfs.cpp @@ -0,0 +1,249 @@ +/* + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <stdio.h> +#include <fcntl.h> +#include <unistd.h> +#include <errno.h> +#include <string.h> +#include <dirent.h> +#include <errno.h> +#include <fcntl.h> + +#include <sys/types.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <sys/mman.h> +#include <sys/mount.h> +#include <sys/wait.h> + +#include <linux/kdev_t.h> + +#define LOG_TAG "droidVold" + +#include <cutils/log.h> +#include <cutils/properties.h> +#include <logwrap/logwrap.h> +#include <android-base/stringprintf.h> +#include <android-base/logging.h> + +#include "Ntfs.h" + +#define UNUSED __attribute__((unused)) + +#ifdef HAS_NTFS_3G +static char NTFS_3G_PATH[] = "/vendor/bin/ntfs-3g"; +static char NTFSFIX_3G_PATH[] = "/vendor/bin/ntfsfix"; +static char MKNTFS_3G_PATH[] = "/vendor/bin/mkntfs"; +#endif /* HAS_NTFS_3G */ + +extern "C" int mount( + const char *, const char *, const char *, + unsigned long, const void *); + +namespace android { +namespace droidvold { +namespace ntfs { + +int Check(const char *fsPath UNUSED) { +#ifndef HAS_NTFS_3G + LOG(WARNING) << "skipping ntfs check"; + return 0; +#else + bool rw = true; + if (access(NTFSFIX_3G_PATH, X_OK)) { + LOG(WARNING) << "skipping ntfs check"; + return 0; + } + + int pass = 1; + int rc = 0; + int status; + do { + const char *args[4]; + args[0] = NTFSFIX_3G_PATH; + args[1] = "-n"; + args[2] = fsPath; + args[3] = NULL; + + rc = android_fork_execvp(3, (char **)args, &status, false, true); + if (rc != 0) { + LOG(ERROR) << "ntfs check failed due to logwrap error"; + errno = EIO; + return -1; + } + + if (!WIFEXITED(status)) { + LOG(ERROR) << "ntfs check did not exit properly"; + errno = EIO; + return -1; + } + + status = WEXITSTATUS(status); + + switch (status) { + case 0: + LOG(INFO) << "ntfs check completed ok"; + return 0; + case 1: + LOG(ERROR) << "ntfs check failed (not a ntfs filesystem)"; + errno = ENODATA; + return -1; + default: + LOG(ERROR) << "ntfs check failed.unknown exit code " << rc; + errno = EIO; + return -1; + } + } while (0); + + return 0; +#endif +} + +int Mount(const char *fsPath, const char *mountPoint, + bool ro UNUSED, bool remount UNUSED, int ownerUid, + int ownerGid, int permMask, bool createLost UNUSED) { +#ifndef HAS_NTFS_3G + int rc; + unsigned long flags; + char mountData[255]; + + flags = MS_NODEV | MS_NOEXEC | MS_NOSUID | MS_DIRSYNC; + flags |= (ro ? MS_RDONLY : 0); + flags |= (remount ? MS_REMOUNT : 0); + + permMask = 0; + sprintf(mountData, "uid=%d,gid=%d,fmask=%o,dmask=%o", + ownerUid, ownerGid, permMask, permMask); + + rc = mount(fsPath, mountPoint, "ntfs", flags, mountData); + if (rc && errno == EROFS) { + LOG(ERROR) << fsPath << + " appears to be a read only filesystem - retry mount ro"; + flags |= MS_RDONLY; + rc = mount(fsPath, mountPoint, "ntfs", flags, mountData); + } + + return rc; +#else + int rc; + int status; + const char *args[11]; + char mountData[255]; + + sprintf(mountData, "locale=utf8,uid=%d,gid=%d,fmask=%o,dmask=%o", + ownerUid, ownerGid, permMask, permMask); + + args[0] = NTFS_3G_PATH; + args[1] = fsPath; + args[2] = mountPoint; + args[3] = "-o"; + args[4] = mountData; + args[5] = NULL; + + rc = android_fork_execvp(5, (char **)args, &status, false, true); + if (rc != 0) { + LOG(ERROR) << "ntfs check failed due to logwrap error"; + errno = EIO; + return -1; + } + + if (!WIFEXITED(status)) { + LOG(ERROR) << "ntfs check did not exit properly"; + errno = EIO; + return -1; + } + + status = WEXITSTATUS(status); + return status; +#endif /* HAS_NTFS_3G */ +} + +int Format(const char *fsPath UNUSED, unsigned int numSectors UNUSED) { +#ifndef HAS_NTFS_3G + LOG(WARNING) << "skipping ntfs format"; + errno = EIO; + return -1; +#else + char * label = NULL; + int fd; + int argc; + const char *args[10]; + int rc; + int status; + + args[0] = MKNTFS_3G_PATH; + args[1] = "-f"; + + if (numSectors) { + char tmp[32]; + snprintf(tmp, sizeof(tmp), "%u", numSectors); + const char *size = tmp; + args[2] = "-s"; + args[3] = size; + if (label == NULL) { + args[4] = fsPath; + args[5] = NULL; + argc = 6; + } else { + args[4] = "-L"; + args[5] = label; + args[6] = fsPath; + args[7] = NULL; + argc = 7; + } + } else { + if (label == NULL) { + args[2] = fsPath; + args[3] = NULL; + argc = 3; + } else { + args[2] = "-L"; + args[3] = label; + args[4] = fsPath; + args[5] = NULL; + argc = 5; + } + } + + rc = android_fork_execvp(argc, (char **)args, &status, false, true); + if (rc != 0) { + LOG(ERROR) << "ntfs format failed due to logwrap error"; + errno = EIO; + return -1; + } + + if (!WIFEXITED(status)) { + LOG(ERROR) << "ntfs format did not exit properly"; + errno = EIO; + return -1; + } + + status = WEXITSTATUS(status); + if (status == 0) { + LOG(INFO) << "ntfs formatted ok"; + } else { + LOG(ERROR) << "ntfs Format failed.unknown exit code " << rc; + errno = EIO; + return -1; + } + return 0; +#endif +} + +} // namespace ntfs +} // namespace vold +} // namespace android diff --git a/system/droidvold/fs/Ntfs.h b/system/droidvold/fs/Ntfs.h new file mode 100755 index 0000000..f68080f --- a/dev/null +++ b/system/droidvold/fs/Ntfs.h @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef ANDROID_VOLD_NTFS_H +#define ANDROID_VOLD_NTFS_H + +#include <utils/Errors.h> +#include <unistd.h> +#include <string> + +namespace android { +namespace droidvold { +namespace ntfs { + +int Check(const char *fsPath); +int Mount(const char *fsPath, const char *mountPoint, bool ro, + bool remount, int ownerUid, int ownerGid, int permMask, + bool createLost); +int Format(const char *fsPath, unsigned int numSectors); + +} // namespace ntfs +} // namespace vold +} // namespace android + +#endif diff --git a/system/droidvold/fs/Sdcardfs.cpp b/system/droidvold/fs/Sdcardfs.cpp new file mode 100755 index 0000000..faaa883 --- a/dev/null +++ b/system/droidvold/fs/Sdcardfs.cpp @@ -0,0 +1,171 @@ +/* + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <fcntl.h> +#include <unistd.h> +#include <errno.h> +#include <string.h> +#include <dirent.h> +#include <errno.h> +#include <fcntl.h> + +#include <sys/types.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <sys/mman.h> +#include <sys/mount.h> +#include <sys/wait.h> +#include <linux/fs.h> +#include <sys/ioctl.h> + +#include <linux/kdev_t.h> + +#define LOG_TAG "droidVold" + +#include <android-base/logging.h> +#include <android-base/strings.h> +#include <android-base/file.h> +#include <android-base/macros.h> +#include <android-base/stringprintf.h> +#include <cutils/log.h> +#include <cutils/properties.h> +#include <cutils/multiuser.h> + +#include <private/android_filesystem_config.h> + +#include "Utils.h" + +#define PROP_SDCARDFS_DEVICE "ro.sys.sdcardfs" +#define PROP_SDCARDFS_USER "persist.sys.sdcardfs" + +using android::base::StringPrintf; + +namespace android { +namespace droidvold { +namespace sdcardfs { + +static bool supports_sdcardfs(void) { + std::string filesystems; + if (!android::base::ReadFileToString("/proc/filesystems", &filesystems)) { + PLOG(ERROR) << "Could not read /proc/filesystems"; + return false; + } + for (const auto& fs : android::base::Split(filesystems, "\n")) { + if (fs.find("sdcardfs") != std::string::npos) return true; + } + return false; +} + +static bool should_use_sdcardfs(void) { + char property[PROPERTY_VALUE_MAX]; + + // Allow user to have a strong opinion about state + property_get(PROP_SDCARDFS_USER, property, ""); + if (!strcmp(property, "force_on")) { + LOG(WARNING) << "User explicitly enabled sdcardfs"; + return supports_sdcardfs(); + } else if (!strcmp(property, "force_off")) { + LOG(WARNING) << "User explicitly disabled sdcardfs"; + return false; + } + + // Fall back to device opinion about state + if (property_get_bool(PROP_SDCARDFS_DEVICE, true)) { + LOG(WARNING) << "Device explicitly enabled sdcardfs"; + return supports_sdcardfs(); + } else { + LOG(WARNING) << "Device explicitly disabled sdcardfs"; + return false; + } +} + + +static bool sdcardfs_setup(const std::string& source_path, const std::string& dest_path, uid_t fsuid, + gid_t fsgid, bool multi_user, userid_t userid, gid_t gid, mode_t mask) { + std::string opts = android::base::StringPrintf("fsuid=%d,fsgid=%d,%smask=%d,userid=%d,gid=%d", + fsuid, fsgid, multi_user?"multiuser,":"", mask, userid, gid); + + if (mount(source_path.c_str(), dest_path.c_str(), "sdcardfs", + MS_NOSUID | MS_NODEV | MS_NOEXEC | MS_NOATIME, opts.c_str()) == -1) { + PLOG(ERROR) << "failed to mount sdcardfs filesystem"; + return false; + } + + return true; +} + +static bool sdcardfs_setup_bind_remount(const std::string& source_path, const std::string& dest_path, + gid_t gid, mode_t mask) { + std::string opts = android::base::StringPrintf("mask=%d,gid=%d", mask, gid); + + if (mount(source_path.c_str(), dest_path.c_str(), nullptr, + MS_BIND, nullptr) != 0) { + PLOG(ERROR) << "failed to bind mount sdcardfs filesystem"; + return false; + } + + if (mount(source_path.c_str(), dest_path.c_str(), "none", + MS_REMOUNT | MS_NOSUID | MS_NODEV | MS_NOEXEC | MS_NOATIME, opts.c_str()) != 0) { + PLOG(ERROR) << "failed to mount sdcardfs filesystem"; + if (umount2(dest_path.c_str(), MNT_DETACH)) + PLOG(WARNING) << "Failed to unmount bind"; + return false; + } + + return true; +} + + +int run_sdcardfs(const std::string& source_path, const std::string& label, uid_t uid, + gid_t gid, userid_t userid, bool multi_user, bool full_write) { + std::string dest_path_default = "/mnt/runtime/default/" + label; + std::string dest_path_read = "/mnt/runtime/read/" + label; + std::string dest_path_write = "/mnt/runtime/write/" + label; + + umask(0); + if (multi_user) { + // Multi-user storage is fully isolated per user, so "other" + // permissions are completely masked off. + if (!sdcardfs_setup(source_path, dest_path_default, uid, gid, multi_user, userid, + AID_SDCARD_RW, 0006) + || !sdcardfs_setup_bind_remount(dest_path_default, dest_path_read, AID_EVERYBODY, 0027) + || !sdcardfs_setup_bind_remount(dest_path_default, dest_path_write, + AID_EVERYBODY, full_write ? 0007 : 0027)) { + PLOG(ERROR) << "failed to sdcardfs_setup"; + } + } else { + // Physical storage is readable by all users on device, but + // the Android directories are masked off to a single user + // deep inside attr_from_stat(). + if (!sdcardfs_setup(source_path, dest_path_default, uid, gid, multi_user, userid, + AID_SDCARD_RW, 0006) + || !sdcardfs_setup_bind_remount(dest_path_default, dest_path_read, + AID_EVERYBODY, full_write ? 0027 : 0022) + || !sdcardfs_setup_bind_remount(dest_path_default, dest_path_write, + AID_EVERYBODY, full_write ? 0007 : 0022)) { + PLOG(ERROR) << "failed to sdcardfs_setup"; + } + } + + return 0; +} + + +} // namespace sdcardfs +} // namespace droidvold +} // namespace android diff --git a/system/droidvold/fs/Sdcardfs.h b/system/droidvold/fs/Sdcardfs.h new file mode 100755 index 0000000..c43dd0d --- a/dev/null +++ b/system/droidvold/fs/Sdcardfs.h @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef ANDROID_VOLD_SDCARD_H +#define ANDROID_VOLD_SDCARD_H + + +#include <sys/stat.h> +#include <sys/types.h> +#include <unistd.h> +#include <string> +#include <cutils/multiuser.h> + +namespace android { +namespace droidvold { +namespace sdcardfs { + +int run_sdcardfs(const std::string& source_path, const std::string& label, uid_t uid, + gid_t gid, userid_t userid, bool multi_user, bool full_write); + +} // namespace sdcardfs +} // namespace droidvold +} // namespace android + +#endif diff --git a/system/droidvold/fs/Vfat.cpp b/system/droidvold/fs/Vfat.cpp new file mode 100755 index 0000000..6b9d53c --- a/dev/null +++ b/system/droidvold/fs/Vfat.cpp @@ -0,0 +1,209 @@ +/* + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <fcntl.h> +#include <unistd.h> +#include <errno.h> +#include <string.h> +#include <dirent.h> +#include <errno.h> +#include <fcntl.h> + +#include <sys/types.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <sys/mman.h> +#include <sys/mount.h> +#include <sys/wait.h> +#include <linux/fs.h> +#include <sys/ioctl.h> + +#include <linux/kdev_t.h> + +#define LOG_TAG "droidVold" + +#include <android-base/logging.h> +#include <android-base/stringprintf.h> +#include <cutils/log.h> +#include <cutils/properties.h> +#include <selinux/selinux.h> + +#include <logwrap/logwrap.h> + +#include "Vfat.h" +#include "Utils.h" + +using android::base::StringPrintf; + +namespace android { +namespace droidvold { +namespace vfat { + +static const char* kMkfsPath = "/system/bin/newfs_msdos"; +static const char* kFsckPath = "/system/bin/fsck_msdos"; + +bool IsSupported() { + return access(kMkfsPath, X_OK) == 0 + && access(kFsckPath, X_OK) == 0 + && IsFilesystemSupported("vfat"); +} + +status_t Check(const std::string& source) { + if (access(kFsckPath, X_OK)) { + SLOGW("Skipping fs checks\n"); + return 0; + } + + int pass = 1; + int rc = 0; + do { + std::vector<std::string> cmd; + cmd.push_back(kFsckPath); + cmd.push_back("-p"); + cmd.push_back("-f"); + cmd.push_back(source); + + // Fat devices are currently always untrusted + rc = ForkExecvp(cmd, sFsckUntrustedContext); + + if (rc < 0) { + SLOGE("Filesystem check failed due to logwrap error"); + errno = EIO; + return -1; + } + + switch (rc) { + case 0: + SLOGI("Filesystem check completed OK"); + return 0; + + case 2: + SLOGE("Filesystem check failed (not a FAT filesystem)"); + errno = ENODATA; + return -1; + + case 4: + if (pass++ <= 3) { + SLOGW("Filesystem modified - rechecking (pass %d)", + pass); + continue; + } + SLOGE("Failing check after too many rechecks"); + errno = EIO; + return -1; + + case 8: + SLOGE("Filesystem check failed (no filesystem)"); + errno = ENODATA; + return -1; + + default: + SLOGE("Filesystem check failed (unknown exit code %d)", rc); + errno = EIO; + return -1; + } + } while (0); + + return 0; +} + +status_t Mount(const std::string& source, const std::string& target, bool ro, + bool remount, bool executable, int ownerUid, int ownerGid, int permMask, + bool createLost) { + int rc; + unsigned long flags; + char mountData[255]; + + const char* c_source = source.c_str(); + const char* c_target = target.c_str(); + + flags = MS_NODEV | MS_NOSUID | MS_DIRSYNC; + + flags |= (executable ? 0 : MS_NOEXEC); + flags |= (ro ? MS_RDONLY : 0); + flags |= (remount ? MS_REMOUNT : 0); + + sprintf(mountData, + "utf8,uid=%d,gid=%d,fmask=%o,dmask=%o,shortname=mixed", + ownerUid, ownerGid, permMask, permMask); + + rc = mount(c_source, c_target, "vfat", flags, mountData); + + if (rc && errno == EROFS) { + SLOGE("%s appears to be a read only filesystem - retrying mount RO", c_source); + flags |= MS_RDONLY; + rc = mount(c_source, c_target, "vfat", flags, mountData); + } + + if (rc == 0 && createLost) { + char *lost_path; + asprintf(&lost_path, "%s/LOST.DIR", c_target); + if (access(lost_path, F_OK)) { + /* + * Create a LOST.DIR in the root so we have somewhere to put + * lost cluster chains (fsck_msdos doesn't currently do this) + */ + if (mkdir(lost_path, 0755)) { + SLOGE("Unable to create LOST.DIR (%s)", strerror(errno)); + } + } + free(lost_path); + } + + return rc; +} + +status_t Format(const std::string& source, unsigned long numSectors) { + std::vector<std::string> cmd; + cmd.push_back(kMkfsPath); + cmd.push_back("-F"); + cmd.push_back("32"); + cmd.push_back("-O"); + cmd.push_back("android"); + cmd.push_back("-c"); + cmd.push_back("64"); + cmd.push_back("-A"); + + if (numSectors) { + cmd.push_back("-s"); + cmd.push_back(StringPrintf("%lu", numSectors)); + } + + cmd.push_back(source); + + int rc = ForkExecvp(cmd); + if (rc < 0) { + SLOGE("Filesystem format failed due to logwrap error"); + errno = EIO; + return -1; + } + + if (rc == 0) { + SLOGI("Filesystem formatted OK"); + return 0; + } else { + SLOGE("Format failed (unknown exit code %d)", rc); + errno = EIO; + return -1; + } + return 0; +} + +} // namespace vfat +} // namespace vold +} // namespace android diff --git a/system/droidvold/fs/Vfat.h b/system/droidvold/fs/Vfat.h new file mode 100755 index 0000000..383ec74 --- a/dev/null +++ b/system/droidvold/fs/Vfat.h @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef ANDROID_VOLD_VFAT_H +#define ANDROID_VOLD_VFAT_H + +#include <utils/Errors.h> + +#include <string> + +namespace android { +namespace droidvold { +namespace vfat { + +bool IsSupported(); + +status_t Check(const std::string& source); +status_t Mount(const std::string& source, const std::string& target, bool ro, + bool remount, bool executable, int ownerUid, int ownerGid, int permMask, + bool createLost); +status_t Format(const std::string& source, unsigned long numSectors); + +} // namespace vfat +} // namespace vold +} // namespace android + +#endif diff --git a/system/droidvold/main.cpp b/system/droidvold/main.cpp new file mode 100755 index 0000000..6d4abae --- a/dev/null +++ b/system/droidvold/main.cpp @@ -0,0 +1,183 @@ +/* + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Disk.h" +#include "VolumeManager.h" +#include "NetlinkManager.h" +#include "DroidVold.h" + +#define LOG_TAG "droidVold" + +#include <android-base/logging.h> +#include <android-base/stringprintf.h> +#include <cutils/klog.h> +#include <cutils/properties.h> +#include <cutils/sockets.h> + +#include <binder/IPCThreadState.h> +#include <binder/ProcessState.h> +#include <binder/IServiceManager.h> +#include <HidlTransportSupport.h> + +#include <stdio.h> +#include <stdlib.h> +#include <errno.h> +#include <string.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <getopt.h> +#include <fcntl.h> +#include <dirent.h> +#include <fs_mgr.h> + +#include "cutils/klog.h" +#include "cutils/log.h" +#include "cutils/properties.h" + +static int process_config(VolumeManager *vm, bool* has_adoptable); + +static void set_media_poll_time(void); + +struct fstab *fstab; + +using namespace android; +using ::android::base::StringPrintf; +using ::android::hardware::configureRpcThreadpool; +using ::android::hardware::joinRpcThreadpool; +using ::vendor::amlogic::hardware::droidvold::V1_0::implementation::DroidVold; +using ::vendor::amlogic::hardware::droidvold::V1_0::IDroidVold; +using ::vendor::amlogic::hardware::droidvold::V1_0::Result; + +int main(int argc, char** argv) { + setenv("ANDROID_LOG_TAGS", "*:v", 1); + android::base::InitLogging(argv, android::base::LogdLogger(android::base::SYSTEM)); + + LOG(INFO) << "doildVold 1.0 firing up"; + + //android::ProcessState::initWithDriver("/dev/hwbinder"); + configureRpcThreadpool(4, true); + + VolumeManager *vm; + NetlinkManager *nm; + DroidVold *dv; + + /* Create our singleton managers */ + if (!(vm = VolumeManager::Instance())) { + LOG(ERROR) << "Unable to create VolumeManager"; + exit(1); + } + + if (!(nm = NetlinkManager::Instance())) { + LOG(ERROR) << "Unable to create NetlinkManager"; + exit(1); + } + + if (property_get_bool("droidvold.debug", false)) { + vm->setDebug(true); + } + + if (!(dv= DroidVold::Instance())) { + LOG(ERROR) << "Unable to create DroidVold"; + exit(1); + } + + vm->setBroadcaster(dv); + nm->setBroadcaster(dv); + + if (vm->start()) { + PLOG(ERROR) << "Unable to start VolumeManager"; + exit(1); + } + + bool has_adoptable; + + if (process_config(vm, &has_adoptable)) { + PLOG(ERROR) << "Error reading configuration... continuing anyways"; + } + + if (nm->start()) { + PLOG(ERROR) << "Unable to start NetlinkManager"; + exit(1); + } + + sp<IDroidVold> idv = DroidVold::Instance(); + if (idv == nullptr) + ALOGE("Cannot create IDroidVold service"); + else if (idv->registerAsService() != OK) + ALOGE("Cannot register IDroidVold service."); + else + ALOGI("IDroidVold service created."); + + set_media_poll_time(); + vm->coldboot("/sys/block"); + + /* + * This thread is just going to process Binder transactions. + */ + joinRpcThreadpool(); + + LOG(ERROR) << "droidVold exiting"; + exit(0); +} + +static void set_media_poll_time(void) { + int fd; + + fd = open ("/sys/module/block/parameters/events_dfl_poll_msecs", O_WRONLY); + if (fd >= 0) { + write(fd, "2000", 4); + close (fd); + } else { + LOG(ERROR) << "kernel not support media poll uevent!"; + } +} + +static int process_config(VolumeManager *vm, bool* has_adoptable) { + std::string path(android::droidvold::DefaultFstabPath()); + fstab = fs_mgr_read_fstab(path.c_str()); + if (!fstab) { + PLOG(ERROR) << "Failed to open default fstab " << path; + return -1; + } + + /* Loop through entries looking for ones that vold manages */ + *has_adoptable = false; + for (int i = 0; i < fstab->num_entries; i++) { + if (fs_mgr_is_voldmanaged(&fstab->recs[i])) { + if (fs_mgr_is_nonremovable(&fstab->recs[i])) { + LOG(WARNING) << "nonremovable no longer supported; ignoring volume"; + continue; + } + + std::string sysPattern(fstab->recs[i].blk_device); + std::string nickname(fstab->recs[i].label); + int flags = 0; + + if (fs_mgr_is_encryptable(&fstab->recs[i])) { + flags |= android::droidvold::Disk::Flags::kAdoptable; + *has_adoptable = true; + } + if (fs_mgr_is_noemulatedsd(&fstab->recs[i]) + || property_get_bool("vold.debug.default_primary", false)) { + flags |= android::droidvold::Disk::Flags::kDefaultPrimary; + } + + vm->addDiskSource(std::shared_ptr<VolumeManager::DiskSource>( + new VolumeManager::DiskSource(sysPattern, nickname, flags))); + } + } + return 0; +} diff --git a/tdk/.gitignore b/tdk/.gitignore index b2d4d3d..3965bf2 100644 --- a/tdk/.gitignore +++ b/tdk/.gitignore @@ -8,7 +8,6 @@ .* *.o *.o.* -*.a *.s *.su *.mod.c @@ -17,7 +16,6 @@ *.order *.elf *.swp -*.bin *.patch *.cfgtmp *.diff diff --git a/tdk/ta_export/keys/root_aes_key.bin b/tdk/ta_export/keys/root_aes_key.bin new file mode 100755 index 0000000..8ce85b6 --- a/dev/null +++ b/tdk/ta_export/keys/root_aes_key.bin @@ -0,0 +1 @@ +3x⌦ʣ_П0Y&;C~yh
\ No newline at end of file diff --git a/tdk/ta_export/keys/ta_aes_iv.bin b/tdk/ta_export/keys/ta_aes_iv.bin new file mode 100755 index 0000000..8bc1bb6 --- a/dev/null +++ b/tdk/ta_export/keys/ta_aes_iv.bin @@ -0,0 +1 @@ +b5!݁r>W
\ No newline at end of file diff --git a/tdk/ta_export/keys/ta_aes_key.bin b/tdk/ta_export/keys/ta_aes_key.bin new file mode 100755 index 0000000..e5cff83 --- a/dev/null +++ b/tdk/ta_export/keys/ta_aes_key.bin @@ -0,0 +1 @@ +'^ C785V=#
\ No newline at end of file diff --git a/tdk/ta_export/lib/libmpa.a b/tdk/ta_export/lib/libmpa.a new file mode 100755 index 0000000..3f7f282 --- a/dev/null +++ b/tdk/ta_export/lib/libmpa.a @@ -0,0 +1,1286 @@ +!<arch> +/ 1512712347 0 0 0 1608 ` + + + + + +__mpa_set_unused_digits_to_zero +mpa_montgomery.o/ +mpa_mem_static.o/ +mpa_misc.o/ 1512712346 7593 7000 100666 39120 ` +ELF +Jh01 + + + + + + +B +B + +B + +B + + + + + + + + + + +7 + + + + + + +. #[!)2/V# Y`"D +A +*D + + + + +F +I +H + +ELF +F + B FAFh + + +K +. + + + + + + + + + + + +B + + + + + + + + + + + + + + + +" + + +G +- + + + + + +f#> +A +*D + + + +H +E +E +I +K +L +M +N +O +O +P +Q + +R +S +S +O +G +W +S + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +ELF +8A0F_z1F O#F{OO + +!F + 7OE + +!F!F!F + SiJJ) +A @@ 4!R +"A !@h@2l + !!IP& DA +B`! E +
@ ) 0 +@B + + + + +$ +d + + + + + +o/Dyeڜ + + +@ +# + +a + +O!Pv + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +B + + + + + + + +"
+ + + + + + +9 +H + + + + + + + + +thKhi!K=2%!/].t/hKKKLK~X4.$F%uK!< <
+A +*D + + + +K +L +M +N +N +O +N +N +N +N +P +Q +R +S +K +T +P +Q +U +V +V +W +M +P +W +X +X +X + +X +X +X +N +Y +M +X + + + + + + +ELF + + +7 + + + +B + +B + +B + + + + +$ + + + + + + +( + +- +X +A +*D + + + +ELF +D; +O + GYh +O + + + + + + + + +: ? +E; +O +DEмB + + +V +9 + + + + +f + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +B + + + + + + + + + + + + + + + + + + + + +A +*D + + + + +D +G +E +G +H +G +C +J +G +G +K +K +H +K +H +L +L +M +N +O +C +P +P +Q +Q +R +S +O +T +U +H +V +V +V +F +G +H +K +K +I +H +V +H +V + + + + + + + + + + + + + + +ELF +*Fch + + +@ +# + + + + + + + + + + + + + + +B + + + + + + + + +8 + + + + + + + + + + +A + += + +XgggLggdf!J!K!KZKKKKKKKC..r../KKL1!/9PzX f;j;[hg/[0r<JYKKK..4z 5$ggMZ//? !-!W +A +*D + + +E +E +F +G +F +G +F +H +G +F +F +G +E +G +E +G +E +G +E +H +H +I +J +H +H +H +I +J +H +H +K +J +J +J +J +J +F +F +L +M +M +M +M +M +M +M +G +F +G +F +H +G +H +H +H +J +K +F +L +M +M +M +K +F +N +K +F +E +E +F +M +G + + + + + + + + + + + + + + + + + + + + + + + + + + + + +ELF +FHhFhR<R`R,FhS`i`HiG + + + +a +D + +$ + + + + +B + +B + + +B + +B + + + + + + + + + +@ +6 + +1 + + + + + +A +*D + + +N + +ELF +R#F +O + +K +. + + + + + + + + + + + + + + +B + + + + + + + + + + + + + +5 + + + +A +*D + + + +F +F +D +I +J +G +K +L +I +J +E +K +L + + + +ELF +ch" + +< + + + +B + + +B + + +" + + +T + + +` + + + + + +! +) +.$ +A +*D + + + + + +R +S +T +R + +ELF +T!8 +B +T! + Bت + + gE5T% +9 + + + + + + +B + + + + + + + + + + + + + + + + + +4 +.!; .x ; J!!!Yh!G<9.G:tF.;J0/DJ>. +A +*D + + + +C +G +H +C +G +H + +ELF +F +Y%:F5PFshB +Y' +&v +OD + *F6MFW + +K +. + + + + + + + + + + + + + + + + + + + + + + + + + +B + + + + + + + +< + +2 + + + + + +6 + + + + + + +fm !! +<0!N/-!OgL\OgPK=NX5< +<Rx w (MdM[ +<//-!NNg]gk1Ir"@0NK=LX7< < !/ +J<P!@=!3KMY=Z#0! + = +A +*D + + + + + +G +I +E +E +D +D +G +F +L +J +L +J +M +N +O +L +L +J +J +F +F +M +N +O +M +M +O +F +J +M +N +M +O +J +F +M +N + + + + + + + + + + + + + + + + + + + + +ELF +@BF + + + + +B + + + + + + + + + + + + + + + + + +< y 5Y +A +*D + + + + + + +B +B +B + +ELF +FKFFF;F +:/FF + +@ +# + + + + + + + + + +B + + +I + + + + + + + + + ++ + + + + + +A +*D + + + + +D +D +D +D +E +F +G +G +H +I +E +E +E +E +F +J +J +J +J +ELF + +f +Q2$9 Q0Pu + + + +B + +B + + + + + + + +, + +& + + + + + + + + +A +*D + + + +D + +ELF +74 + +50_( + ( +(
(а HBHApG pGA +@6KD FF +{h[B{`O6JzDx0F + +B + 0\>HFQ2F1) +1 + + + + +4 + + + + + +C +b + + + + + + + + + + +0 + + + + + + +| + + + + + + + +B + +B +B + + + + + + + + + + + + + + + + + + + + + + +E + + + + + + +9 +2 + +0 + +./w. +. +A +*D + + + + + + + + + +_ +` +_ + +b +c + +_ +_ +f +g + + + + + +ELF +FFF!F9FBF#F1F +FFF!F9FBF#F1F +FFF!F9FBF#F1F + +@ +# + + + + + + +B + + + + + + + + + + + + + + + +H + + + + .M#>gvK +..M#>gvK +..M#>gvK .Pz &z 4K\Y=Z"LZ=gMP)L +A +*D + + + + + + +C +E +F +C +G +E +I +C +G +E +K +C +G +M +N +E +E +O +M +P +G +G +F +M + diff --git a/tdk/ta_export/lib/libpng.a b/tdk/ta_export/lib/libpng.a new file mode 100755 index 0000000..0ecf789 --- a/dev/null +++ b/tdk/ta_export/lib/libpng.a @@ -0,0 +1,5440 @@ +!<arch> +/ 1512712347 0 0 0 8436 ` + +ELF +CiHiBۀB̿ + TT +KF!hF{D FiF + +(F!ih +BsB +y*vJy;*s؊y<*p
"hF + +iF0 +
K{DK{DK{DK{D0pG +ЊhO3"R"`"hA + +FF, +cFwL|D +0 c #`JB"ZC2EkJzDA0@ cC B #OrBbJzD+`J0F +#JzD +0F9F*FC +J +jx6OLDx +*#yfyy&#zlzDz,8F +FFF,YIyDO +"BRI% FyD2ENI% FyD ++)I% FyD0d2#$I FyD +ո@0..I% FyD0I FyD +--^0-[E-e-V% %%Ou % +. +.5/ .!.0<, (tD,CE@tDD@tD<DDH7B` +0F +!f/0T +,I"yD,IyD, +ZձH B'J'KzD{D +IyD +IyDJ0"oCCoSCJ08@8 +F +hFKB Mh ++h#` + + +*F#F ++h#`M (( +HJ08FIoCCyDoSCJ0 +oCCI0FoSCyDJ0
Ё& +FFK +KBB + +R@\5- uP +*+A& X!6! VE + +Jan +r; +z]ʅxTvt諌roipӞnl8j*hfdcR0a(O_onp][0YW,f
V}:T/iRPrNM=KquxI'GE4DexB*@Xa?M=;895864/3+1y"/9.Ȳ,C*U)+'.&$M"ǤR!~@*M
D +{^cbSSBo +%I`qPE
ɼG +BNPU^zs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +xx4yy[zz~{||-}}G~~_t'/58973-$
vdېQƑ;$ +}aҕC$rN)nڛEY+cˠ2eˢ1_ä'Qyۧ<_ ߪ?[uӭ0FZlDZ!|ֲ0<FNUY\]\YTNF=2%vg÷WĦEŔ2ƀkǹUȢ=Ɋ#pʼ Uˡ8̄fͱGΑ&pϺNИ*tѽOҗ(qӹIԑ hկ=քYן,rظDىZڟ)n۳<܀ Mݑ\ޠ'j߭3v>G
OUY\^^\YUO +H@~6t+h\N?{.jX +E1lV?y'aH-fK.fH +y + +2U
^<! +@AB#C0D?EQFeG|HIJKLN9OaPQRSUPVWXY=[~\] _R`ab>def@hij[lm$opqfstJvw9yz2|}7Fу_P5ܓ2☔Iy9¦V%ʯ{W7Ҿ¥ĜƕȒʑ̔ΙСҭԻ.NqM3tPotential overflow in png_zalloc() +libpng version 1.6.21 - January 15, 2016 +Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson +Copyright (c) 1996-1997 Andreas Dilger +Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. + + + + +/ + + + + + + + + + + + + k +wz + + + + + + + + + + + + + + + + + + + + + + + +PS +Q~ +Uf +Vf +W +X$ +Zq +[ +\$ +^e +_ +aH +bs +c< +e) +f$ +g$ + +) +h +j + + +#Py + + + + + + +$#Py +$#Qy#Pu +$#Q0#Py + + +#Q0#Pt + + + + + + +#Pu +#Q0 + + + + + + + + +#Qt +#Qu + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +) +Y + +z + +) + + + +) +) +Y + +) + + + + + + +& + + + + + + + + + + + +$ + + + + + + + + + +@$ + +|) +!$ + + +& + + + + + +B +B + + + + +B + + + + +B +B +B + + +B + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +QQQ0-( +"@$ +w +RRR0-( +w +QQQ0-( +"@$ +QQQ0-( +"@$ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +R$ + + + ; + + ++ + + + + + +' + +. +Ϩ + + +; + + + + + +.v.=>+=>6u. u.0 + !%.YKf +.(.O M9<s!M#j`q%11/G%
f !/h1,%1##>xX .%J " ++ #Zm<Jh<!<B6x D!Kg?-/ + v + v +< J)% x t ! x (<i/XZ.""%*2L[A w<$z 'y !'y +..%!5M=[3. !$#>0/Z"$=-C# +. %M +X!1u4z P!Rfjjf(Jc. +<i=A=A
<t +<D +<mk73?<`y .g n."=!,Y!,K4/y7 +." + K#{. #+?. + v.Kft %) 1E < ... +A +*D + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +! +" +$ +$ + + + + + +( +) +* ++ +& + +! +/ +( +1 +/ + + + + + + + + + + + + + + + + + + + + + + + + + +3 +( + + + + + + + + + + + + + + + + + + + + + + + + +8 + +" +? +! +" + + + + + + + + + + + + + + + +K + + +N +N +N + +N +N +N +N +N +N +N +N +N + + + + +R +R +$ +$ + +G +H +I +Q +N + +N +N +N +N +N +N +N +N +N +V +V +V +N +N +N +N +N +N +N +N +N +N +N +N +N +N +N +N +N +N + + + + +N +V +N +\ +[ + +N +^ +\ + +] + +[ + + + + + + + + + + +` +Z +V +V +N +^ +\ +] + +Z +V +V +d + +c + + + + + + + + + + + + + + + + + +/ +< +S +W + + + +ELF +!QHF +!QDf +|,4F&HF +!"F&"<HF +!HFY | +!FdF
" OY |<O +#\ *3+G +FF +FF +F@ + + + + + + + + + + + + + + + + +i + 3 +v + + + + + + + + + + + + + + +{ + + + + + + + + + + +P + +Q/ +U +V +W +X +Z" +[ +\ +^n +_E +a +b$ +c +e) +f +g + +E +) +hF + + + + + + + + + + + + + + + + + + + + + + + +F + + +% + + +% + +& + + +& + + + + + + + + +B +B + + + +B +B + + + + + + + + + + + + r + + + + +_ + + + + +; +zk + +L +R +ӯ + + + + + 1s./ + z 0# +.J v. + q , Y l.#*+ j.j h<% +<vJ +.L0 +.5z4~. !-![ +A +*D + + + + + + +w +w +x +w +x +y +{ +y +{ +z +z + + + + + + +z + + + + + + + +v + +v +v + +v + + + + + + + + + + + + + + + + + + + + + +ELF + +J0FF +@FOrF# F@FOrF# F@ +F%u? HpGFpG +
+l` +m +H!r +Hl` +k`Kk;`k3`
k+`,l#`F hIr +#h` + + + + +U + + + + + + + +B + + + + + +Lw + + + + + + + + + + +$ +RPt + + + + + + + + + + + + + + + + + + + + + + + +Pt + + + +Pt + + + + + + +
+ + + + + + + + + + + + + + +$ +% + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +) + + ++- + +& + + + + + +B + +B + +B + + + + + + + + + + + + + + +0 +/ + + + + +i +N +' += +H ++: +4 + + + + +.Z5YA +A +*D + + + + + + +c +c +p +n +o +r +s + + + + + + + + + + + + + + + + + +" +# +( +* + + + +ELF +GF@FpFF +I(FyDO0FB(Fp@ + +, + + + + + + + + +l + 6 +>s + + + + + + + + + + +r + + + + + + + + + + + + +$Qt +$Q0Pt + +9 + + +# +& + + + + +B + + + +B +B + +B + + +ON + + + + + + + + + + + + +|h + + +
Q +5 +d + + + +J!001i!J +<#/ +A +*D +B + + + + + + + + + + + +q +o +q +o +m +s +t + +m +q +u +t +m +q +m +y +s +t +| +~ + + + + + + + + + + + + + + + + + + + + + +ELF +-!*-!* ؝-=$- +UIB +2B?t F)FOIB +2B?f F)FIIBF +2B?W F)FBIB"B?I F)FF<KB +2B?: F)F6KB +2B?, F)F0K!B +2B? F)F)KB +2B? F)F#KB +2B? +2B? F)FzKB52B? F)Fl +2B? F)F3KBF +2B? F)F$IB"B? F)FFKB2љB? F)FB?w F)F +ҚI FyDBЗI FyDh1 +@ F1 F=єi1+:%i1+ F + + +. + + + + + + + +T + +x + + + + + + + + +Q + + + +B + + + + + + + + + + + + + + + + + + + + + + + + + + +^r) + + + + + +Y* +~* +O* + +* + ++ + +\) + +Rb+ + ++ + ++ + +(+ + + + +79, + +d, + +2, + +F, + +, + + +- + +#;- + +f- + +- + +-- + +A- + +<. + +K=. + +h. + +. +e. +. + +D/ +) +}/ + +& + + + + + +B + + + +B + + + + +B +B + +B + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Z + + + + + + +l + + +0 +%m +} +N +>; + + + + + + +fi,!!=YZ +fgYY}fz &?/X !-$,5@F>0:>> +t,<-?M0-/M"K[YK0>u>K|!A!.u./3K% --0!-/ /i.. !/$M- n /Xs ^<" /gK0/>?0!!!?+3?=!!:3!=3!=y.t. .3YKg=Y//k>0=^KL +X +XK9 + ? +JM##6z.KA +A +*D + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +" + + + +ELF + +O +ԧBѻ# +zJ]CXCX +\]CWCfJ +s0%F +34$GF +OOk1]Դd!Ѹ2iI FyDFUxՒ + +EْI FyD +1d1 +k
O{ZF"Os +"#0F9F +7DWE +I FyD + ! +s0#F + + +000 + +MD-D< +sDDMFOz +O "!09F:F;F0F7O F0FO Fk1+дd1 + +[QFOLELOH H +QFO +O +7i ++DI FyD0F8F0F+F +O,3 + + ɲ +!RFF + +R"# 0FIYF
#0FOK"= +K +C +,O +NL +( \i(OzE + +F0C@0 F + + +D)++ +,DO)O(qEDї Fs!0Jr!s1B #I FyDvB!I FyDph1ñ0Քi!*@1% F)F" F1F + F F F F + + F + F(%. F( % +չ +C +~* CHC. C .C -I FyDCE+I FyD{h +ih1+A-I9 +: DK F +X +isZ+i +Oj +- + + + +Dƿ[#@05eEtj[ +@-O jRL + + +> + +O +h +4 h1+@,I9 +x](4WD1 +0("OAIX10 +IXO: +IX1;+3B +BND,SDBv + +# +;o1$JBѳi+"I(FyDch + + O4 +O,*0 +* + +0 + + +@ + + +Ѵ\!`1BݎI FyD444DD F8QFEE F1FnK FB1F2)FfKFౝB +0 FQF;F F1F]KB@0C0B0 FIF FFOKB F1FLKB F1FIKB F1FzFKB F1FrCKB F1Fj@KB F1Fb=KB F1FZ:KB F1FR7KB F1FJ4KB F1FB1KB F1F:.KB F1F2+KB F1F*(KB F1F"%KB F1F"KB F1FKB F1F +K F1FB +FI FyDIyD +#3SCB2Ӹ +IyDF + +. + + + + + + + + + + + +{ + + + + + + + + + + +% + +9 + + + + + + + + +9 +U +P +Q +U +V +Wg +Xs +Z +[g +\s +^ +_ +a +b +c +e4 +fs +gs + +4 +h +j + + + + + + + + + + + + +" $ %z +"?%1$" +" $ %#RUx +" $ %{ +"?%1$" +" $ %#Q1#Pv +" $ %"<%1$" +" $ % +x + + + +F + + + + +F +5 +i + +F + + + + + + +z +8 + +* + + + + + + + + + + + + + + +U +U + + + + +U + + + + + + + + + + + + + + + + + + + + + + + + +4 + + + + + + +& + + + + + +B + +B + + + + + +B + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +z + +p +qs +" + +8 +Pw +$ +$ +$ +$ +$ ++ + + + + + + + + + + + + + + + + + + + + + + + + + + += + +M +): + + + + +106=0=>!?." ^J" 2[+X !"!"!"!" +J? 3!z #"#t +J!"/C=S6QQ +<{ +J +>2T$n6yf{J.Js 6< +.= + l.<p =-B0/L +.x ( +JiY# .a5$v. #0L1.u.61+
f"Ry21 +.//?ZL/` J + v !6YL/ZY[ZLXxJ\J t#! .M +<5//<KtJX +J0 +< / +<0 +<0 <0=^0B0B0C0C0B0 +<BNg<Y#+B+o.[+? +A +*D + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + +! + +" + +# + +$ + +% +& +' +( + + +) +* ++ +) +* ++ +, + + +- + + + + + + +( + + +) +* ++ +, + + + + + + +( + +0 +( + + +2 +3 + + + + +3 + +3 +4 + + + + + + + + + + + + + + +
+ + + + + +6 +6 +7 +, +, +, +, +, +8 +, +9 +, +, +, + + + += +# + +> + +? +@ +% +* +& +' +A + +" +( + +B +/ +* +* + +D +E +F +D +6 +5 +G ++ +G + +D ++ ++ ++ +K +G + + + + + + + + + + + + + + + + +C +D +H + + + +ELF + + + + + + +$ + + + + + +M + +r + + + + + + + + + + + + + +& + + + + +B + + + + + + + + + + + + + + + + + +U + ++ + +/ +7 + +I + +& + +A +*D + + + + +d +f + + + + + + + + + + + + + + + + + + + + +ELF + +Eђ +IyD + +0#@sC +"' +"p 2x1Ov1"s0I FyDC0p +\:JE|2]JE
=Z]JE"6 +" CxIF0 2U 2U6B + + + +E71O +\* + +EO + +EDDD +KB + +Քk! B +" Քl F0>0
+AC + + + + +** + + + + + +** + +Ap +p23B0#S!++
+a\MFxFxFSI FyD0FF(FF + + +&6pa^x + +6 +f&6^pax + +6 + f&6p23B0#0PA+@+Wєk(Sє%\!PK+ٔK+ +# +"2b#~+kD##vhD##vic~Ccvc~#cvjc~++2##~+#cv#~+c~+##vh#~+##vc~+ ++ + D@@OyD0@*z1dq*@Հ X+hiظ)иDи\: CDo +2D +. 9 + +NE^V + +NE"k`jrrjz*gї^:O iB`VpNxFxpNxFvxlNxF]l:AEћ + +lO<kxk0;FFFXE +*L(IEaE +H\(p7B! +_ +qIQ(p7pϲ!GqW" 2" +App7ypy3p6F +^xF&xH (G,fEFE" +pyp01FSFFFXE)zz!)r;iz۲rKC۲+r + + + +,СE) +,EѴ~q? + +pqpq? +qq&I[)9O) +p~Xp +pp +qXq13 + + +q\ + + + +** + + + + +** + + + +!!p30EћxQ~ +yOxy&FE^x|A[&`6`7 + +^ypyA[&`6`7 +qඹ~a6 + +papa6 +qa^qG7HW( + +30E0nyy!~ + +pp +qYqLAEJx,_y +~ +*G7 + +_qq630B MK@ +
+ +0 + + +O +KK +K +O)K +K K )? IO I I IO0J +OHHHOJ +EӦ~x3 + + +xAy8 +0+hҲ +;. + + + + + + + + +w + + + + + + + + + + +2 + + + + + + + +z +w +w + + + +&Pt + +0 + + + + + + + + +: + + + + + + + + + + + + + 0 +o> + + + + + + + + + + + + + + + + + + + + + + +D +$ +$ +E +7 +: + + + + + + + + +S +d-P + + + + + + + + +^Q + +0 +0 + +. +* +WR +2wR +R +R +R +R + +S + +& + + + + + + +B + +B + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + + + + +p +"8& +tr +"8& +tr +"8& + +z +"8& + +qt"tr +"8&< +z +"8&@ +tr +"8& + + + + + + + + + + +8%1$w +1$w +1$w +1$s +1$s +1$z +1$s8$s!@$@&r +1$s8$s!@$@&r +1$s8$s!@$@&t&2$t"" +1$x +1$s8$s!@$@&r +1$s8$s!@$@&r +1$s8$s!@$@&t&2$t"" +7q +q +7q +q +??6q +q +??6q +q +??6q +q +??6q +q +4q +q +4q +q +4q +q +4q +q +$ + +$ +$ +"# +s8$s" +x +s8$s" +x +p|8$s" +"# +y +y +y + + + +y +y +q +"#r& +s +"# +y +q +"#r& +s +"# +s +"# +w +' +w +' +w +s +"# +' +' +x +| +px8$s" +t +w +px8$s" +t +w +w +s8$s" +"t +w +s8$s" +"#@%"#@%) +s8$s" +t +s8$s" +s8$s" +" +s8$s" +t +s8$s" +s8$s" +"#@%"#@%) +{ +w +px8$s" +t +w +px8$s" + +s8$s" +t +"# +s8$s" +"#) +w +s8$s" +"#) +s8$s" +t +s8$s" +s8$s" +"# +s8$s" +| +s8$s" +| +z +v +@"y +v +@"#@%"#@%$( +v +@"y +v +@"#@%"#@%( +| +| +@"#( +v +@"#>( +v +@"#( +px1$sq +t +@"# +@"#h( +v +@"#( +v +@"#( +s1$sq +t +@"# +| + + + + + + +0 +0 +1 +1 +2 + + +8%2 +8%2 +8%3 + + + + + + +. + + + +( + + + + + +. +_ + +L +9 +F +W +@ + + + w.&)=~.<" +26tuO<jgSf. $1Kd%$g^gd##_?-/N3#i,2/KL!M%t<[1[h +.zXL0 +.6J.6 /-l0wJz. +2kt_ +X/L/_-0-{X##?##?##?z##? +##?##@=| %AMi\\g#[L
f +!?"J +t,h JDZgnY<OK~t.> +Xi)'#YAYv#[KL=! + +./
t?@!@!</O=O0 +.Y01/cJz<4)<"/0Pb$0/mJS<-.<"--!/H//,!/00>Y/s +<;#,#*3*"1zJ5733+Mu!-#!-#0/WXzJB9J",!/H/!-1/^h/-!""!-!h<FJ:..!;#10""=vhv(X +<uJL,0MZBY=m.fhZZvJf? .v<iK=A==q<f[==x<X Jv<+O,1-)0$0zfPcY=L>LA6x.KK02*h1+1KKZ 1fL/"6,"zJ4U2[K=L>Lj<N<2 <[<w<Xw<0/L#`e//Kk.X0!>/xX<x.F<fwX9i2\#ZRe=-K-0#!;!-0K^.,i"Z?2gKm fi<x<XxJ"0Y=?#K=De0K1-0K1/-/Y\ .t""K=M0L#nf<y.<fxJ#+M2="v##g@#Y=L>LRI/-/-Y/!1/1I/-K-0!/1*2IK-Z!/-A +.x..x .u<x .x ]"0><z.#<$v22v22vJz <]"1?<z.#"v22v22vJz <y,":X,"v-G
XrY//4I/Ihv5y.5yt"/1-<J{.HC],"v-GJv/0y +X}J }.X } !0e1=/< +.+"//KKz.<*"///KKK0,/Lu.<1>%y. .,#K*<*"////-0y.<kL> +f="="[# +A +*D + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +# +& +6 +< + + + +ELF +K "{D FiF + 0-PF*F"F2 +AF Fo +(ooo@F +xcxx#IyDF +0F)FI FyDI FyD-0CS0 + + +IyDC)F05I FyD8@8 +FFF
FF 3л?к?й?и?{i0I FyD"3 oCC F1FoSC"3I FyDC6q"3 F +# F1F + +6q F F1F|z + + + +PE0 +3N+ +BE
0 +KD0
t +0 +N~DN~DN~DN~D F"3 F)FoCCoSC"3V F1F F)F +DO + O PFIFF9I FyDPFIF/JFB4I FyD +!YC F( ++qE FB}AFjF# F + 10# 1
0#1%*ћմ\1Bص +D"RB" +0[)FfI FyD Fi"F F6)F_I FyD1F*F F +JyD +* +* +# z +0[)F@I FyDh- F)F<I FyD^i"F FF7IyD F)FZ1F*F +00#"=0 +IyD IyD IyD + + +;2 F9F'r#% F + +l۲&3C<<B@р-#FgtIFyD4`CeC + + + +v + + + + + + + + +IF2FO +M}D +M}DR4P$@FFFGp +.l1+@ +k!*(@ (* *0 + +q + + +V + + + + + + + + +h +T{ + + + + + + + + + + + +) +) + + + + + + + + +) +%( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +T +I +I + + + + +) + + + + + + + +K +) +0 + + +WX + +x + + + + +Y +SY + + + + +Z + +;Z + + + + +) + +) + +) + +=[ + + + +) + +) + + + + + + + + + + + + + + + +) + + + + +<) + + +^g^ + + + +^ +n^ + + +& + + + + + + + + +B + + + +B +B + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +c +" +" +$ + +7p +??6p +4p ++ ++ + + + + +/ + + + + + +e + + + +Š +j9 + + + + + +< +</?1![rJLJf@*.@2#/.0=3!..u.(1$%>w<Xw< .bf ?!2-4/Z![ +X!-? +<q. i .J@"/1L>",>:0j$ {1L"1>$"?>!i10<S +.OvmWDMAMN X-Mzt +b<!=M'X!1% <?!/3!%!35 $*$55*2M>h + z.%]," +v.< +."0NZ=PKZ u.<u <>""\L\ +< + /,&B# +.v. +J003!(0L3$##=(0v1!!! +.Q>@*2/wXJ +.Y0/+C(-4= +J22"0#>gh + r.!/M/JKLf@"//6YZ +A +*D + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +" + + + + + + + +$ +% + +& + + +' +( + + + + + ++ + + + + + + + + +) + ++ +, + + + + + + + + + + + + + + +. + + + + + + + +0 + + + + + + + +2 + + + + + + + +4 + + + + + + + + +6 + + + + + + + + +8 + + + + + + + + + +: +: + +; + + + + + + += + + + + + + +? +@ ++ + + + + + + + +@ + + + + + + + +@ + +D + + +E + + + + + +H + +F + +) + + + + + + +G + + + + + + + +* +L +O +) +) +Q +) + + + +R +S +S +O + + + + + + + + + + + + + + + + + + + +$ +2 +S + + + +ELF +"hC `0FFjF# +,
+(FQF +~!Or +(FQFFI(FyD9FRF(F1FFX(FIFI(FyDGAF2F + +`S 0 +2*
rBܲBB
I8FyD +"MhC`0C +Ƞ`C 0D0UU<#8FQF4<3q +"F`08F1h +DDIyDFTbXB +3?=I(FyDO +zFC'F 8FIF" +IyD8@0B +F) +74 .5F5F'FkN,,<; + +. + +& + + + +& + + + + + + +& +1x + + + + + + + + + + +O +5 + + + +5 + + + + + + + + + + + + + + + + +) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +^4 + + +5 +) + +c5 + + +) + +5 + + + + + +6 + +) + +&7 + + +) + +) + +d7 + + +n8 + +x + + + + + + +^9 +8-9 +CW9 +Gv9 + +& + + + + +B + + + +B + + + +B +B + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +v +l + +B +<: + + + + +XA + x !/////0LhK+. # +<v<v. +Xz[?!\,/0,"0 # +<.Qy ' +<?;!/ +A +*D + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +) + + + +ELF +xC+B@B Bh +x<Sx2<B+F"r"rz*< + +xpUx]px2p3B"+"F
xpUx]pxpxpyqUy2]q3B0"r"rz*"r[C`0zHh@z(+#xxpp1B+4 +x3yqpHxLyHqLp1 +x3yqpHxLyHqLp1 +hz@A[BSCJhi)f<eVeeeb% x:AO +P@IyD0@ 00 +J*jZ:zF&fV6vN.n^>~A!aQ1q I)iY9yE%eU5u
M-m]=}C#cS3sK+k[;{G'gW7wO/o_? +JZ*j:zN^.n>~CS#c3sGW'g7wK[+k;{O_/o? +*:JZjz+;K[k{,<L\l|
-=M]m}.>N^n~/?O_opng_set_filler is invalid for low bit depth gray output + +, + + + + + + + + + +T + 5 +t + + + + + + + + + + + +t + + + + + + + + + +d + +& + + + + +B + +B + +B +B + + + +B + + + + + + + + + + +m + + + + + + + +, +( + +38 + +M + + +^ + + +J#K{##/K` +X0 +->- +A +*D + + +s +u + + + + + + + + + + + + + + + + + + + + + + + +ELF + + + + + + + + + + +M + +r + + + + + + + + + + + + + +& + + + + +B + + + + + + + + + +O + + + + + + + + ++ + +; +7 + + + +A +*D + + + + +d + + + + + + + + + + + + + + + + + + + + +ELF +b~(F +(F0C +B(F6 +30Y +F8O +FC +D)++ +F + + +F* F F( Fi F F F1Fp@p +, + + + + + + + + + + + +Lx + + + + + + + + + + + + + + + + + + + + + +0 + + +( +) + + + + + + + + + + + + + + + + + + +v+ ++ +^+ + +
+ ++ + , +@, +p, + +, +!, +& - +A3- +Fq- +W- +L- +R- +. +69. +1c. +,. + +. + + +`D/ +\_/ +/ +i/ +/ +/ +H0 +c0 +^0 + + +0 + +dA1 + +& + + + + + +B + + + +B + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +C + + + + + +O + +l +: +>L +8 + + +W + +T +l + +. .c.PJ///!O/L`fe&.X # +<=j=j==&==>YkX.r. +< + +<=P +X / +A +*D + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +% + + + +ELF +!iz6C,C jz*4ؔ1ih+* *+ + +Q ,Q + +QQ ,, +QB +<,7E00TX*z@1*(jz)h*O +~ + + + + + + +" + + + + +H + + ) + +s + + + + + + + + + + + + + + + +; + + + + + + + + + + + +! + +& + + + + + +B + + + + + + + + + +I + + + +D + + + + + + + +(, +h + +7 +ˬ +/ + + +.!=!Kk}X }.AL +.v !#*%$*$!50!%0h-BC,"Q*K+ .} .}<9.} 2$91z.&z< .o.X$*&?Q1d ~ >!?z.&z<v..m.<~ >N11c/"+.~.!?z.&z<6!n..o<.O~X ~. ~."Cy. +."!!/! ~ <#!!!///"!" ~ <0Cy. .,#/-+X#!!!!! +.+#9Xy '/
<k +A +*D + + +` +a +b +^ +^ +c + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +ELF +,m= + + + + ƿ') +vx4.`ȿvB@aaB v1Ixɲ)9Uȿq@B4BӽD11$p#@QDa<q +_ȿz4PDLE +w _ȿx2CDbE@AJB<DD +0 + + +@! :" " +SK +"{D F0BMKo{D0 +k"{[=E0#1KE1CE1B1SE1B + ObF ``ƹ# +ppGs
FF"#F2hF0F)FiF" F F8Q F1F"B#2| +ApppG"IFhFyDq!#2 +%)p-hI FyD +`hF(F#F +0//Ѹ@ и +0jF
#I p +j1ck1+Дl1+# +B + FIyDIyDI FyD(&\!VC FI52F< F"0<0<50B F0C0|ETLPp +I FiF2F F F
m +''F 6I0FyD2IBD0Fb0FO +0F)"h +4A+y+4 +<э04<04<04<04< 0 + +0 4<0 + 4< 0 + 4<0 + + 4<
0 + +40F:Fh +h3B0F +y +0I# +҈ + +l!P0*)CC +IyDI FjF#IyD +Ɉ + + +lP ),CCIyDF
IjF#l1 +!B +IyD +I jF + "B(FTSIh: +I FiF:F% F1F*F F +9K{D4 +o + F I3FXp Fo + + +"P0:F F& +I0# +3$113 1$11(1p41$!-AF3B41]Ӑh1 +F#A +F{DD$pD +QE@FRF+0DOEK{D3h+$ ;Xz0`+XCXC0p` + FIF:F+FDa!ou FIF:F+FB H1DaD1HaF F9F*FDa F9F*FB H1DaD1HaF@ FIF:F+FDa @ FIF:F+FB H1DaD1HaF FIF:F+F +Da FIF:F+FBH1DaD1Ha + + +, + + + + + + + + +v + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+$ +( +) + + + +F +F + + + + + +cI +0 + +WJ +x + +.K +IK +nK + + + + +^VL + + +& + + + + + + + +B + +B + + +B + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ +
+ +
+ + + + + + + + + + + +0 +2 + +B + +F + + + + + + + + +, + + + + + + + + + + + + + + + + + + + + + + + + + + + + +m +, +K +7 + + + + + +Jv.#/4"/-5 +.u. +.11u - + !u /-!- + u. +J + !u /-!- + u. +J + v +</>>/Z1>,N,04z ( +.v +A +*D + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +& +) +6 + + + diff --git a/tdk/ta_export/lib/libutee.a b/tdk/ta_export/lib/libutee.a new file mode 100755 index 0000000..8240df8 --- a/dev/null +++ b/tdk/ta_export/lib/libutee.a @@ -0,0 +1,2937 @@ +!<arch> +/ 1512712347 0 0 0 7602 ` + +tee_api_property.o/ +tee_api_objects.o/ +tee_api_operations.o/ +tee_tcpudp_socket.o/ +tee_socket_pta.o/ +tee_api_watermark.o/ +utee_syscalls_a32.o/ +default_regular.o/ + +/0 1512712346 7593 7000 100666 80592 ` +ELF +## + +H +K" +H@{DxD +S +} +l + + + + +0 +m +-}t + +7 +L}u +Y + + + + +g}u + + + + + +}u + + + +}u + +}u +}t +B +}u +B}u +%) + + + +B + +B + + + + + + +B + + +B + + + + + + +H* + + + + + +T + + +R + + +.##"3KL"2 +A +*D + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +ELF +HxD + +len + +WP4} +B}u +Pw +Pw +Qw +}u + + + + + + + + + + + +Qu + + +"# +! + +
+ + + +B + + + +B + + +dG + + + + + + + + +p + + + +E + + +$K~.K=!.#m !-/J +A +*D + + + + + +| +| +| +} +| + + +| +| +} + +| +~ + + +| + + + + + + + + + + + + + + + + + + + + + + + + + +ELF + + + +B + + + + + + + + + +T + +u + + + +A +*D + + + + +C +D + + +ELF + + + +> + + +N + +\ + +p + +4 +1 +B + +B + + + + + + + + + +M + + + + +i + ++ + +A +*D + + + + + +B +F +A +F +H +E +I +J +E + +ELF +kF +B + +.?:;'< + + + +! + +Y + + +* + +T + + +G + + + +A +*D + + + + +K +M + +ELF + + + +4 +B + + + + + + + + + + + +1 + + + + + +.$#o !/<!@J.i .>ef.n f!K!"!Z!0b :#!"!Z!0X ) :#!"!Y!X +A +*D + + + + + + + + +) +* + +ELF +K" +H!{DxD +F{D +FpF
FF!F +H LxD K" HA!{D + + + + + + + + + + + + + + + + + + + + + + + + + + +I + +B + +B + + +B +B +B + + + + + +B + + + + + + + +a +& + + + +7 +> +J/4=
.% +<."?/$N" +.$ +. +565#/P#/./R/Q6/Q=` . +f'{<.> +A +*D + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +ELF + +O +K" +H!{DxD +K" +H!{DxD +FpGK{D`pG +K" +H@{DxD +KB K" H@{DxD +K" +HOq{DxD +a +b +buf +x + + + + +}t + + +}t +$}t + +2}t +<}t +O + +
+ + + + +B + + +B + +B +B +B +B + +B + + + + + + + +8 + + + +( + + +o ./K"/pJJ20B+!" +l q<J! <.37%/"P!0"01!!0/:0m<O7%/#Z!"1 +A +*D + + + + + + +v +y +w +{ +| +v + +w +| +} + + +| +} + +| +} + + +| + +| +} + +| +} + +| +} + +| + + + + + + + + + + + + + + + + + + + + + + + + +ELF +K" +H\!{DxD +K" +H@_{DxD + +KB +K" +H@ +!{DxD +K" +H@S!{DxD +K" +HOq{DxD + +i + + +R + + + + + + + +}t +}t +}t +}t +$}u +(}u +,}u +1}t +9}t +;}v +E}t +G}v +r}t +u}t +x}t +}t + +_}t + + + + + + +}t + +}t + +}t + +}t + + +}t + + + + + + +-}t + + + + + +D}t + + + + +S}t +`}t + +p}t +}t +}t +}t +}t +}t +:; + + + + + +B + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +"+ + +
+ + +O + + + + +4 +& + +. + #0/K/!!!!"w#0 + 1 +. +A +*D + + + +a + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +ELF +FFk˱gk1FjB4B(/F:Fkak8c +BDckk<[BD +1[BD1F +KB +lKB +أSB +=FFO"#:F +k)F*F + +bib +FFxK"H@!{DxD( +BC#iCE> j`ji9F j##aFP`j1FFKB&iC#a KB3B3BK"HO4q{DxD( +A{DxD +sB;BsBѨkik + + +zD + kjkF +,J(FX#F +H +;BKB3BK"H@a{DxD +H +;BKB3BK"HOa{DxD + 9`{`l{ala +H +;BK"H@Oq{DxD +LH"@aq{DxD +2H"Oa{DxD +(H"@jq{DxD + +K" +H@q{DxD +K" +H@q{DxD + +k +o + +" +z$}v +$}w +$}y + + + + +$}u + + + +z$}t +e$}u + + + + +$}u +$}t + + + +$}u + + + + + + + +$}u + +$}t + +$}u + + + + + + + +S$}u + +$}u +$}v +$}v +
+$}v +$}v +$}w +$}t +$}u +#$}t +C$}t +P$}t +S$}u +W$}u +`$}u + +$}u +A$}t + +$}t +$}t +$}u +$}u +$}w +$}w +$}w +$}w + +$}t +$}t + + +)$}t + +`$}t + +l$}w +o$}w +r$}w +y$}t +$}t +$}t +<$}t +$}t +$}{ +$}x +$}{ +$}{ +$}{ +$}t +$}{ +$}x +. +$}{ +$}{ +$}{ +$}t +$}y +$}v +$}y +$}y +$}y +$}t + +p +$}x +$}v +$}x +$}x +$}x ++$}t +=$}{ +?$}v +A$}{ +D$}{ +F$}{ +O$}t +a$}z +c$}v +e$}z +h$}z +j$}z +$ +q$}t +$}y +$}v +$}y +$}y +$}y +$}y +$}y +$}y +$}y +$}y +$}t +$}t +$}t +$}t +n +k +g +j +o +q +t +u +w + + + + + + +. + +{ + + + +:; + + + + + +B + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# +# + + + + + + + + + + + + + + + +X +.Z=!!#=%"1 +<!!/"'Y0#=?1/=/-!!/#/""PJ7 J +<!!/!!#=-/42;K2!L/"",A +A +*D + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@ + +ELF +3#
p$K"$HY!{DxD +h{"K +h{"K +FFF'K"'H@{DxD + +E +]K + + +j + + + + + + + + + + +q{ + +Z +l + + + + + + +}u +}t + +}t +}u +}t +#}t + +#}t + + + +.?:;'I@B + + +B + + + + + + + + + + +J8 + + +! + + += + + + +z + + + + +A +*D + + + + + + + +x +y +z +x +y +| +x +x +y +x +y +~ +x +y +x +y + +x +y +x +y +x +y + +x +y +x +y +x +y + +x +y +x +y + +x +x +y +x +y + +x +y +x +y + +x +y +x +y + +x +x +y +x +y + +x +y +x +y +x +y + +x +y +x +y + +x +y +x +y +x +y + +x +y +x +y +x +y + +x +y +x +y + +x + + + + + + + + + + + + + + + + + +ELF +B +PP +PP + +B + + + + + + + +H + + + + +] +6 +, + + + + +A +*D + + +: +: + + +ELF + +p +3 +_ + +u + + + +x + + + + + + + + + +O +z +~@ + + + +B + + + + + + +-= +| + + + + + + +
+ + + + + + +A +*D + + + + + + +n +o +n +o +p +q +r +n +o +p +q +r +n +o +s +n +o +t +u +r +n +o +v +n +o +n +o +v +n +o + + + + + + + + + + + + + + + + + + + + + + + + +ELF +F +a +b +Q!P1 +QP3 + + +
+ + +B + + + + + + + + + + + + + +.0#!0,"" zJ&/!E'[.'[;!/2. <w< 4"E1#/03.Dx<(4"71#/02.R^"z<$"#/0 +A +*D + + +R +S +U +V +U +U +U +U + + +ELF +pa +pa +va +pa + + +
+ + + + +B + + + + + + + + + + + +Z + + +A +*D + + + +C +C +C +C +C + + +ELF +Y +D +Q +v| +Y +D +Q + + + + + + +B + +, + + +p + + + +l + +z + + ++ + +; + + + +A +*D + + +C +C + + +ELF +g@ +V +` +g@ +V +` +g@ +V +` +AJ +:W + + + + +B + + + + + +_, + +4 + + + + + + + + + + +A +*D + + +C +C +C +C + + +ELF + +res +res + +4 + + +B + + + ++ + + + + + +s + + + + + +4 + +3 + + +A +*D + + + +C +C + + +ELF +" +t + + + + + + +! +B +B + +B + + + + +*' + % +!JW +#BJ + +! +; + + + + +] +& + + + + + +A +*D + + +E + + +ELF + + +9- +I + + + + +B + + + ++ + + +Y + + +` + + + + +M + +_ + + + + +A +*D + + + +C + + + +ELF +' +' +' +' +' +M +' +' + + + + + +B + + +B + + +D + + + + + + + + + +# + + + +A +*D + + + + +F +F +F +F +F +F + + + +ELF + + + + + + + +! + + +B + + + +I- + + + +( + + + +b + + + + + + +A +*D + + + +I +J +I +J + + +ELF +h +' + + + +4 + + + + + + + + + + + + + + + +/ + +A +*D + + + +ELF +hBhB +( +G + + + +B + + + + +' + + + + + + + + + + + +1 +> + + +A +*D + + +8 +8 +9 +9 +; +< +< +< +< + + + +ELF +K"(F3!{D + +}6 + + + + + + + + + +O + + + + + + + + + + + + + + +& + + +B + +B + + + + + + + +r + + + + + + + + + +9 + + +_ + + + + + +& + +A +*D + + + + +g +h +i + +j +k +j +l +m +o +p +q +r +s +t +u +v +w +x +y +z +{ +| +} +~ + + + + + + + + +s + + + + + + + + + + + +ELF +H"IKxDyD{D\B
bF@F
+hB4B0FJ + +`5=`3` +hIh h +SXFF +!F0 B + +b + += +W +h + +) +#p + + +& +B + + + +B + +B + + + +B + + + + + + + +6 +
+ + + + + +E +<L//+$<<@!'x !]0kK-!""/$3!&0u"/ + u J +A +*D + + + + +^ +_ +` + +c +e +c +e + +ELF +`HxDA`hF +` JzDh;`3@h + +_ +- + + + + +[92/ +E + + + + + + + + +
+B + +B +B + + + + + + +" + + + + + + +l + + + + + + + +J>1< /.?fi#xX #/~.f<(.= +A +*D + + + +h +l +m +n +o +p +q +r +s +t +u +r +v +t +w +x +y + + + + +ELF +PP +QQ +PP +QP +PQ +PP +QQ +PP +B +B + +B + +B +$ + + +! + + + +@ + + +' + + + +A +*D + + + + + + +ELF +p +A +*D +gprof_a32.o/ 1512712346 7593 7000 100666 618 ` +ELF +A +*D +ELF + + + + + + + + + + + + + + + +
+
+
+"
+,
+6
+@
+J
+ + + + +* +* +^ +, + + + + + +( + + + +2 + + + + + + + + + +4 + + + + + + + + + +> + + + + +A +*D + + + + + + + + +ELF + + + + + + + + + + + + + + +
+
+%
+/
+9
+C
+M
+W
+a
+k
+( +2 + + +* +* + +, + + + + + +( + + + +2 + + + + + +4 + + + + + + + + + + + + + + +, +9 + +A +*D + + + + + + + diff --git a/tdk/ta_export/lib/libutils.a b/tdk/ta_export/lib/libutils.a new file mode 100755 index 0000000..80d7b0f --- a/dev/null +++ b/tdk/ta_export/lib/libutils.a @@ -0,0 +1,3935 @@ +!<arch> +/ 1512712347 0 0 0 3136 ` + +r( +r( +t +t +t +t +t +t + + +4 +4 +arm32_aeabi_divmod_a32.o/ +arm32_aeabi_divmod.o/ +arm32_aeabi_ldivmod_a32.o/ +arm32_aeabi_ldivmod.o/ +arm32_aeabi_shift.o/ +arm32_aeabi_softfloat.o/ +f32_to_i32_r_minMag.o/ +f32_to_i64_r_minMag.o/ +f32_to_ui32_r_minMag.o/ +f32_to_ui64_r_minMag.o/ +f64_to_i32_r_minMag.o/ +f64_to_i64_r_minMag.o/ +f64_to_ui32_r_minMag.o/ +f64_to_ui64_r_minMag.o/ +s_normSubnormalF64Sig.o/ +s_normSubnormalF32Sig.o/ +s_roundPackToF32.o/ +s_roundPackToF64.o/ +s_shortShiftRightJam64.o/ +s_shiftRightJam32.o/ +s_normRoundPackToF32.o/ +s_normRoundPackToF64.o/ +s_shiftRightJam64.o/ +s_countLeadingZeros8.o/ +s_countLeadingZeros32.o/ +s_countLeadingZeros64.o/ +softfloat_state.o/ +softfloat_raiseFlags.o/ +s_propagateNaNF32UI.o/ +s_f32UIToCommonNaN.o/ +s_commonNaNToF64UI.o/ +s_f64UIToCommonNaN.o/ +s_propagateNaNF64UI.o/ +s_commonNaNToF32UI.o/ +buf_compare_ct.o/ + +bget_malloc.o/ 1512712347 7593 7000 100666 67032 ` +ELF +[h +l2 +d@VH@E2UIVKxDyD{DP, + +BIKxDyD{D`O +BlH@kIlKxDyD{DB3&.gHOrfIgKxDyD{DS,8S<AhB`H@`I`KxDyD{DC`D<D,1FD,9WK{Dh +"*I*KxDyD{DN3A F)FF +V5p +تBؑBبB3B + + + + +@0 + +]) +4 +
+ + + + + + + +2 +5 +B + + + + + + + + + + + + + + + + + +:; + + + + + + +B + + + +B + +B + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +"K + + +A +K +- +0 + + +J + + + + + + + + + + /= +.= +X#",0!=//=! + <<n.{.J=f y /v..10 +.
+A +*D + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +ELF + + + + + + + + + + + + + + +A +*D + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +ELF +D +"F8F +Pv +Rx +Pw + +B + + + +1 + + + + + + + +: + +A +*D + + +7 +8 +9 + +ELF + +(
( (аXBXApG pGa+A8( + +B +.?:;'I@B +B + +B +B + + + + + + + + + + + + +A +*D + + + + +ELF +^ + +^ +4 + + + + +B + + + +& + + + + + + + + + + + + + +A +*D + + +" +" + +ELF + +B + + + +$ + + + + + + + + +A +*D + +ELF +ڰG +Z6:h +8X'O (F OI +8X_F +h`:`9F"F3F""?GE +6:h +JZEZF + BEBF +3FE !FXF"FF(FE@F!F +F + + t + i + t + + +B + + + + + + + + + + + +* +
+ + + + + + + + + + + +6 + + + +A +*D + + + +3 +4 +3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +ELF +Pv +Pt +Rt +Qv +Pu + + +B + +' + +3 + + + + + + + + + +, + + + + +A +*D + + + +4 +5 +6 + +ELF + + +B + +1 + +' + + +, + + + + + + + + +A +*D + + +4 +5 +6 + + +ELF + +B + + + + + + + + + + + + + + + + +A +*D + +E +E + + + +ELF + + +& + + + + + + + + + + + + + +A +*D +1 + + +ELF + + + + + + + + + + + + + + + + + +A +*D + + +ELF + + + + + + + + + + + +/ + + + + + + v .! +A +*D + + + +ELF + +B + + + + + + + + + + + + +' + + + +A +*D + + + + +ELF +Fx1Bx + + + + + + + + + + + + +A +*D + + + + + +ELF + ++ + + + + + + + + + + + + + +A +*D + + + +ELF +B + + + + + + + + + + + + + + + +A +*D + + + + + +ELF + + + + +! + + + + + + + +/ + +A +*D + + +ELF +B +h( + + +5 + + +- + + + + + + + +A +*D + + + + + +ELF +B + + + + + + + + + + ++ + + + + +0 +A +*D + + + + +ELF + +B + + + + + + + + + + + + + +A +*D + + + + + +ELF + + +& +" + + + + + + + + + + + + +A +*D + + + + +ELF + + + + + + + + + ++ + + + + + + +A +*D + + + + + +ELF +JOO;K? + +&PF +v +L +& + +B + + +S + + + + + + + +( + + +A +*D + + + +6 +3 +4 +7 +8 +9 + +ELF +A +*D +/26 1512712347 7593 7000 100666 24996 ` +ELF + + + + + + + + + + + + + + + + + + + + +B + + + +# + + + + + + + + + + + +.! /=/N./Z[?./Z[?./ZZK1./Z +A +*D + + + + + + + + + + + + +! + +ELF +A +*D +ELF + +i +q + +4 + + +B + + + + + + + + +( + + + + + + + + + + + + + + +<=0#/> +./u//tKK +A +*D + + + + + + + + + + +ELF + +Z* +Z* +4 + + + + + + + + + + + + + +A +*D + + + +ELF +A +*D +/119 1512712347 7593 7000 100666 41560 ` +ELF +y +y +y +y + + + + + + + + + + + + + + + +
+B + + + + + + + + + +& + + + + +* + + + + + +A +*D + + + + + + + + + +0 + + + + + + + + + +% +' +) ++ ++ +. +0 +2 +2 +0 +6 +8 +: +< +< +? +A +C +C +A +G +I +K +M +O +Q +S +U +W +Y +[ +] +_ +a +c +e +g +i + + + + + + + + + + + + + + + + + + + + + + + + + + +ELF + +a +b + + +/ + + + +- + + + + + + + +A +*D + + + +ELF +~SED<]RF F)F + +EE2FFXF HO{@Op +Oe + + +:; + + +B + +&,= + ++ + + + + + +; + + +< + +.u .Y 2//1!//A/A!!/="x!/{/,2@!//00! +A +*D + + + +- +. +. ++ +/ +0 +- +ELF +D + + + +% +e6 + +( +B + + + + + + + + +- + + + + + + +A +*D + +, + +ELF + + +q +% +3 + +( + +B + + +. + + + + + + + + + + + + +A +*D + + +( + +ELF + + + + +% +3 + +( +B + + + + + + + + + + + + +A +*D + + +( + +ELF +Oe + + + +:; + + + +B + + + + + + + + + + + +A +*D + + + +> +, +, +- +. +/ +0 +ELF + +a +b + + +/ + + + + + + + + + + +A +*D + + + +ELF +FI +FhF + + +
+ + + + +B + + + + + + + + + + + + +A +*D +, +- +. +ELF + +# +
+% +N3 + +( + + +B + + + + + + + + +8 + + + + + +A +*D + + +) +ELF + +KXxBpg@BaA + +5 +S + +A +a3 + + + + +( + +B + + + + + + + + + + + + +A +*D + +* +( +ELF + + + + + + ++3 + +( + + + +B + + + + +) + + + + + + + + v.
:u.
! +A +*D + +) +ELF +KXxBp O0O1 + + +0 + + + +3 + +( + + +B + + + + + + + + + + + + 0t
.,0s
! +A +*D + +( +* +ELF +yDO + +a + + + + +B + +/ + + + + + + + + + +A +*D + +ELF + +#O +#e OyOxIi +#i O sOrCc +OZ + + +:; + + + + + +B + + +&1= + + +" +9 + + + + + + + + + +A +*D +- +. +. ++ +/ +0 +- +ELF + +: +a + +A +)6 + +( +B + + + + + + + + + + + + +. +A +*D + +, + +ELF + +T +: + +A +2 + +( +B + + +1 + + + + +) +, + + + + + +A +*D + + +) +ELF + += +: + +A +2 + +( +B + + + + + + + + +' + + + + +A +*D + + +) +ELF + + +C# +CO +:C +I +IOs +Ow + + +:; + + + + + +B + + + + + + + + + + + + + + + + +A +*D + + + +, +, +- +. +/ +0 +ELF +yDO + +, +a + + + + +B + +/ + + +$ + + + + + + + + +A +*D + +ELF + +9 + + +
+ + + +B + + +% + + + + + + + + +; +A +*D + +, +- +. +/ + +ELF + +O4D;@4 +KY0xBp6 + + +2 + +& + + +( +B + + + +6 + + + + + + + +3 + +A +*D + + ++ +( +) +ELF +
@t +4K +dBeEO4o + +M +g + + +A +03 + +( + +B + + + + + + + + + + + + + + +.
+A +*D + + ++ +( +) +( +ELF + K[0xBpTF + + + + + +!3 + +( +B + + + + +3 + + + +6 + + + + +.!-vJ +.!/I0s.
.+/0! + +A +*D + + ++ +( +) +ELF +
@t + + +x + +3 + +( + +B + + + + + + + + + + + + + + + + ht..,#,>s. L! +A +*D + +( +) +( ++ +ELF + +a + + +B + + + + +/ + + + + +( + + + + + + +A +*D + +( + +ELF + + +a + + + +B + +/o + + +1 + + + + + + + + +.0 +A +*D + +) +' + +ELF + + +a + + +B + +/ + + +3 + + +9 + + + + + + +A +*D + +( +) +* + +ELF +K"F+F +RBcC + +a +<Pv + + +B + +/G + + + +) + + + + + + + + +A +*D + +) +ELF + +a + + +B + + +/ + + + + + + + + + + +A +*D + +( +) + +ELF + + + +5 +a + + +B + +/ + + + + + +9 + + + + + + +A +*D + +) +' + +ELF +TМ@ + +a + + + +B + +/ + + +1 + + + + + + + + +A +*D + +( +) +* + +ELF + +a +=
Q0
Pt +<
Q0
} + + +B + + +/o + + + +1 + +' + + + + +8 + +A +*D + +( +) +* + +ELF + +
+( +& +w' + + + + + +" +Pu + +( + + + +B + + + + +# + + + + + + + + +A +*D +, +- +- +. +/ +ELF + +TOPO:@ + +ET@ + +eF"BZ%. +F
FKk2 +1 + +
+( +& +v' + + + + +u +" +@$@& +@$@& + +( + + + +B + +)"F + + + +H + + + + + + + +\ + + + + + + ++ + +2 +% + + + + + +A +*D +, +- +- +. +/ +ELF +uiA +uiB +Pv +0)( + + + + + +B + + + +0)( + + + + + + + + + + + + + + +# + + + +/ + +A +*D + ++ ++ +, +- + +ELF +0 \oGWOV +O8Pf + +E@
@Oq +Ao +CS +PFYF#FF +uiA + + + + + + + +B + + + + + + + + + + + + + + + + + +A +*D +, +, +- +. +ELF + + +z + +4 + + + + + + + + + + +A +*D + + + +) +' + +ELF + +z + +4 +B + + + + + + + + + + + + +A +*D + + +( + +ELF +8O + ++ +dCOx!FDD` + +. +t + + + + +$ +% + +L + +A + +Pt + +( + + + +B + + + + + + ++ + + + + + + + + + +A +*D + +) +* +* +ELF + +@P_ + + + +U + + +~$ +X% + +L +? +A + + +( + + + +B + + + + + + + + + + + + + + + + + +A +*D + + +) +* +* +ELF + + +0 + + + +" + + + + + + + + + + +A +*D + + + + +ELF +KB @ + +B + + + + + + + + + + + +A +*D + + + +ELF + + +H + + +B + + + + ++ + + + + + + + +A +*D +N + + +( +) + +ELF +: + + +C + + + +B + +* + + + + + + + + + + +A +*D + + + +) +' +' +* + +ELF +% + + + + +- + + + + + + + + +A +*D + + + +ELF + + + + + + + + + + +! + + +A +*D + + + + +ELF + +3+ +B +4 + + + +* + + + + + + +( + + + + + + +A +*D + + +ELF + + + +B +! + + + + + + + + + + + +A +*D + + +ELF +5DO +D EE + +a32 +a0 +z +mid + + +4 + + + + + + + + + + + + +A +*D + + +ELF + +&
+ + + + + + + + + + + +! + +A +*D + + + + + + +ELF +B + + + + + +# + + + + + +A +*D + + + +ELF +
+ +6 + +1 +B + +&9 + + + + + + + + + + +A +*D + + +, +ELF +" + + +.?:;'@B +B + + + + + + + + + + + +A +*D + +& + +ELF + + + + + + + + + + + + + + +A +*D + + +ELF +
IO0 @)@P +x + + +.?:;'@B +B + + + + + +( + + + + + + + + +A +*D + +& +ELF +O +O +FO + + + + + +1 +B + +& + + + + + + + + + + +A +*D + +, +ELF +@p@@@ + + + +B + + + + + + + + +" + +2 + + +A +*D + + + +ELF +; +ܸ#fи*fи @X.jи0и-@_U +3h6C{j + + +`H`" + +AEq0 +" +" F<F
F " +#x( ! AqFFT
XF +;< +E +պ + +o0$ +K9 +8 + +1YE{ # +;: +m! + +@ + + + + + + + +4 + + + + + + + + + + + +B + + + + + + + +" + + + + + + + + + + + + +A +*D + +2 +3 +4 +0 +0 + + + +1 +5 + + +ELF +F + + +PQ + +B + + +! + + + + + + + ++ + + + + + + +A +*D + + + + +. + +ELF + +' + + +& +! + + + + + + + + + + + + + +A +*D + + + + +ELF + + +& + + + + + + + + + + + + +A +*D + + +ELF +q1JzD +ȿ$,($+U ++, +5 + + + + + + + } + + + +4 +B + +. +B + + + + +B + + + + + + + +# +2 + + + + + +A +*D + + +P +Q +P +P +P +P +R +S +ELF +A +*D diff --git a/tdk/ta_export/lib/libzlib.a b/tdk/ta_export/lib/libzlib.a new file mode 100755 index 0000000..011e7f5 --- a/dev/null +++ b/tdk/ta_export/lib/libzlib.a @@ -0,0 +1,1004 @@ +!<arch> +/ 1512712347 0 0 0 1050 ` + + +ELF +DD{DwDD8wDA8A3B FOqF(FFOq
FARB;F + +rem + + +4 +B +B + +B + + + + +q +4 +" + +[ +* + + + + + + + + + + + + + +A +*D + +' +( +( +( +( +( +( + + +ELF +5lBɻ@l2u\E
Y=ѫ0&: +|
<qPA' %hWo fa^)"а=Y
.;\l ұt9Gwҝ≻d>jm
Zjz ' +}Dңhi]Wbgeq6lknv+ӉZzJgo߹ホCՎ`~ѡ8ROggW?K6H+
L +J6`zA`Ugn1yiFafo%6hRwG"/&U;(Z+j\1е,[d&c윣ju +m ?6grW +
TN³9a&g`MGiIwn>JjѮZf@;7SŞϲG0º0S$6к)WTg#.zfJah]+o*7Z- + + + + + +B +.:;'@B +B + + + +B +B + + + + + +& + + + + + + + + +( +A +*D + + +ELF +T\h3UCa-Opnjko|oeE +< PiT + l `l 0o9g +@>d .0Ij[rB F_ f"nn*@!o:Ҳ[Qh+h#3hT0`3tI+X\%nJX \ + ."n:"f +Fl + +C:d Fo + +#iܱ#ici3 + h +TXh +Th +Th +Taa +3PTcaq#ojh +ihIhTXihIh +TihɈTihyTba ) + +ibaiXIihT +Tcaij+(khbi(c +0+++## +T + +cot +yB3BыBYqE`!f!nS)4hO +0!JJ FzD#1FhG+( (i +FF.l +ThhPT3 +ThhPTz3hPTca F F)(Fi`i +O c `!ZbBce d:Be + + +{ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ++Q1 + ++Q1 ++Qv +' + + + + + +B + + +B + + + + + + + + + + +6 + +2 + + + +1D + + + + + + + + + + + + + + + + + + + + +
+
+ + + + +2 + + + + + + + +1 + + + ! +.B)3 +f?5w/?O#[KBy. ""=!K"Y=====!<.<.b <;v.= +fXuJ= +<A= +."hE!$ +J-/wJ=Y0A==!-!"$FYKYKYKh>^[$>L/=@//>=!/u + +<M02"-V... +A +*D + + + + + + + +? +? +@ +A +B +B +C +? +D +D +D +D +D +D +D +D +D + +D + +D + +@ + +B +A +@ + +J +I +B +C +A +A +Q +@ +A +A +A +A +A +A +A +D +D +D +D +S +T +B +R +X +W +Y +? +? +W +? +? +? +? + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +ELF +C3f(82$nmB C +" d5{DIfcmOl;;@[E5GF +lL +bD"0JxI + +@!dù +#l8;##ZՐK{Dd5GF +bD" KxI + +@SRK{D.add=GFj=+@6lB!bl@99@@RbdjjblB4AF + + + + + + + + +& + +# +{ + + + + + + +!Q1 + +t +' + + + + +B + + + + + + + + + + + + + + + + + + + + + + + + + + + +. < o . +<!!+/0v!@":!/!A2 +A +*D + +? +@ +@ +@ +A + + + +ELF +&hmj +8>P* +`xx4@2
+>D + + + + +w# + + + + + + + +' + + + + + + + + + + + +2 + + + + + + + + +A +*D + + + +ELF +@-c0o +cbB:={D +" +ՍD`6 +i"E`a + +D`iE036"F0G`a + +`#i +ՍD`6 +i"E`a + +i"E` + +bCF& +#a0` + +cm9 + + + + + + + + + + +aCB# +DOs+ ++ ++0Fy*FQ +#o +ck+ F + + + + + + + + + +( + +V$ +$ + + + + + + +$Q1 + + + +$Q1 + +$Qu + +' + + + + + + +B + +B + + +B + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $!!!u/#:# + w "!!!*&=/Lo .$ +.4 //-5# +X0KK>!/K<>-2/?!M!\= +<
.% +A +*D + +I +I +I +L +R +R +P +S +R +R +R +R +I +R +R +R +R +S +I +T +T +T +U +R +S +R +S +I +I +S +S +K +I +I +I + + + + + +ELF +<O6 +\FFO +N7
+E p6` +q7YE8E, + + + + + +.?:;'I@B + + + + + + + + + + + + + + + + + +A +*D + + +ELF +,ܰJ4JJ4J}BO + +GahL +)dܰhGE$ݳ + + Gah H + + Gah H +=GiLh + +GahF +UEai +. +Կ3F +`RF F)FO +Z + +p + 0? +BihTT2h +U +
UBa +i:a0 +J$zD +(2,8+ +TcacihT3caBk +VUiDa
:!A@2Ca +
UBa +2` +6B(FV +CairTN1h? +Uiaa
:A@2Ca FhJzDAl&i.
*h +CaizTO1hO.iaa
:A@21CaSi + + +gai
?H + +
+ + + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + +| + + + + + + + + + + + + + + +' + + + + + + + + +B + + +B + + + + + + + + + + + + + + + + + + + + + + +V +p +x +n + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +3% + + + + + + + + +: + + + + + +.G600n .! +.@ `XCy '\JX! + q.!=g= + t.= t."#, 3"!n..!Ym.<l< ) +X!@ +X>!'y<5 +<-!Kg"v"&x C=e/;=-/XO + +A +*D + + + + +G + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +ELF + + + + + +' + + + + +B + + + + + + + + + + + +A +*D + + +" +# +$ +$ + + +ELF +err +len +s1 +len +B +B + + +B + + + + + + + + + ++ + + + +A +*D + + |