521dc97afc4c5e3cfc984ee397888a8b44e8ddda
[android_pandora.git] / pnd / run_gingerbread.sh
1 #!/bin/bash
2 # run/kill Android from Linux, the hackjob script
3 # (c) Grazvydas "notaz" Ignotas, 2012
4 set -e -x
5
6 if [ "`id -u`" != "0" ]; then
7   # gksudo causes logging not to work somehow..
8   # so use it to only ask for password, use sudo to re-run the script
9   gksudo -m "Android needs root privileges to run, please enter your password" id
10   exec sudo -n $0
11 fi
12
13 root=/mnt/android
14 mpoint_main=`pwd`
15 kernel_ver=`uname -r`
16 exitcode=1
17
18 trap onexit INT QUIT TERM EXIT
19 trap '' HUP
20
21 err()
22 {
23   zenity --error --text "$1"
24   echo "$1"
25 }
26
27 onexit()
28 {
29   set +e +x
30
31   list="/sbin/ueventd /system/bin/logcat /system/bin/sh /system/bin/servicemanager
32     /system/bin/vold /system/bin/netd /system/bin/rild /system/bin/installd /sbin/adbd
33     /system/bin/mediaserver /system/bin/keystore /system/bin/debuggerd
34     /system/bin/dbus-daemon"
35   for pr in $list; do
36     pb=`basename $pr`
37     p=`ps -C $pb -o pid=,cmd= | grep $pr | awk '{print $1}'`
38     test -n "$p" && echo kill $p $pr && kill $p
39   done
40   for pr in $list; do
41     pb=`basename $pr`
42     p=`ps -C $pb -o pid=,cmd= | grep $pr | awk '{print $1}'`
43     test -n "$p" && echo kill -9 $p $pr && kill -9 $p
44   done
45   list2=`ps ax | grep -v grep | grep -e ':.. /system/' -e ':.. /data/' -e ' android\.' | awk '{print $1}'`
46   list3=`lsof | grep '/dev/binder' | awk '{print $2}' | uniq`
47   for p in $list2 $list3; do
48     test -n "$p" && echo kill $p && kill $p
49   done
50   
51   sleep 0.5
52   
53   for i in `seq 4`; do
54     sdmounts=`grep -e '\.android_secure' -e 'secure/asec' -e 'mnt/sdcard' /proc/mounts`
55     if [ -n "$sdmounts" ]; then
56       echo "$sdmounts" | awk '{print $2}' | xargs umount
57     fi
58
59     omounts=`grep "$root/" /proc/mounts | awk '{print $2}'`
60     if [ -n "$omounts" ]; then
61       for m in $omounts; do
62         if ! umount $m; then
63           umount -i $m
64         fi
65       done
66     fi
67
68     sleep 0.5
69     if umount $root; then
70       break;
71     fi
72   done
73
74   if ! pidof X > /dev/null; then
75     # need to restore SGX, X and friends
76     rmmod bufferclass_ti omaplfb pvrsrvkm
77     /etc/init.d/pvr-init start
78     rmmod wl1251_sdio # hmh
79     /etc/init.d/NetworkManager start
80     /etc/init.d/slim-init start
81   fi
82
83   if ! ps a | grep -q 'pnd_run.*run_gingerbread.sh'; then
84     # something killed pnd_run, have to clean up for it
85     cat > /tmp/clean_android.sh <<EOF
86       #!/bin/bash
87       trap '' HUP
88       sleep 3
89       umount $mpoint_main
90       umount $mpoint_main # needed twice??
91       losetup -a | awk -F ':' '{ print \$1 }' | xargs losetup -d 2> /dev/null
92       rm $0
93 EOF
94     cd /tmp/
95     chmod +x /tmp/clean_android.sh
96     /tmp/clean_android.sh &
97     sleep 1
98   fi
99   exit $exitcode
100 }
101
102
103 # logger, binder and ashmem
104 delay=0
105 if ! test -e /dev/log_events; then
106   modprobe logger
107   delay=0.5
108 fi
109 if ! test -e /dev/binder; then
110   modprobe binder
111   delay=0.5
112 fi
113 if ! test -e /dev/ashmem; then
114   modprobe ashmem
115   delay=0.5
116 fi
117 sleep $delay
118 if test ! -e /dev/log_events -o ! -e /dev/binder -o ! -e /dev/ashmem; then
119   err "could not load required Android modules,\n\
120 perhaps you are running unsupported\nfirmware/kernel."
121   exit 1
122 fi
123
124 if ! test -e rootfs.ext2; then
125   if ! cp -v pandora/default_rootfs.ext2 rootfs.ext2; then
126     err "file copy failed, not enough space?"
127     exit 1
128   fi
129 fi
130
131 if ! test -e data.ext4; then
132   size=`zenity --entry --text="\
133     Android needs a partition to store it's data and installed programs.\n\
134     This will be stored in preallocated file of size that you have to select now.\n\
135     Android documentation recommends at least 150MB, going below 50MB will cause\n\
136     problems, as well as over 2GB if you are running from FAT partitioned card.\n\n\
137     Please select size of Android data partition (in megabytes):\n\
138     (creation may take several minutes after you press OK)" \
139       --entry-text=150`
140   if test -z "$size" || ! dd if=/dev/zero of=data.ext4 bs=1M count=$size; then
141     err "failed to create file, not enough space? bad input?"
142     exit 1
143   fi
144   if ! mkfs.ext4 -O ^has_journal -m 0 -F data.ext4; then
145     err "failed to create filesystem"
146     exit 1
147   fi
148 fi
149
150 if ! fsck.ext4 -y data.ext4 || ! fsck.ext2 -y rootfs.ext2; then
151   if [ "$?" -ge "4" ]; then
152     err "file corruption detected, try clearing appdata."
153     exit 1
154   fi
155 fi
156
157 mkdir -p $root
158 mount -o loop,rw,noatime rootfs.ext2 $root
159 mount --bind $mpoint_main/system/ $root/system/
160 mount -o loop,rw,noatime data.ext4 $root/data
161
162 mkdir -p $root/vendor/
163
164 # handle SGX
165 mkdir -p $root/vendor/pvr
166 echo "0 0 android" > $root/vendor/pvr/egl.cfg
167
168 # load the right SGX driver
169 sgx_kernel_loaded=false
170 if ! grep -q '1.5.15.2766' /proc/pvr/version 2> /dev/null; then
171   echo have to change SGX kernel driver
172   /etc/init.d/pvr-init stop || true
173   if test -d $mpoint_main/pandora/pvr/$kernel_ver; then
174     # found with this android release
175     pvrbase=$mpoint_main/pandora/pvr/$kernel_ver
176   elif test -d /lib/modules/$kernel_ver/kernel/drivers/gpu/pvr/1.5.15.2766; then
177     # found in firmware
178     pvrbase=/lib/modules/$kernel_ver/kernel/drivers/gpu/pvr/1.5.15.2766
179   fi
180
181   if [ "x$pvrbase" != "x" ]; then
182     if insmod $pvrbase/pvrsrvkm.ko && insmod $pvrbase/omaplfb.ko; then
183       sgx_kernel_loaded=true
184       # optional
185       insmod $pvrbase/bufferclass_ti.ko || true
186     fi
187   fi
188 else
189   sgx_kernel_loaded=true
190 fi
191
192 sgx_user_ready=false
193 #if false; then
194 if $sgx_kernel_loaded; then
195   es=`cat /etc/powervr-esrev`
196   if [ "x$es" = "x" ]; then
197     err "unable to determine SGX version"
198   else
199     es="es$es"
200     # for some braindead reason 103 is named 121 too
201     sgx_ver=121
202     if [ "$es" = "es5" ]; then
203       sgx_ver=125
204     else
205       ln -fs /system/lib/$es/libGLESv2_POWERVR_SGX530_121.so $root/vendor/pvr/
206       ln -fs /system/lib/$es/libGLESv1_CM_POWERVR_SGX530_121.so $root/vendor/pvr/
207     fi
208     ln -fs /system/bin/$es/pvrsrvinit $root/vendor/pvr/
209     ln -fs /system/lib/$es/libPVRScopeServices.so $root/vendor/pvr/
210     ln -fs /system/lib/$es/libglslcompiler.so $root/vendor/pvr/
211     ln -fs /system/lib/$es/libsrv_um.so $root/vendor/pvr/
212     ln -fs /system/lib/$es/libIMGegl.so $root/vendor/pvr/
213
214     echo "0 1 POWERVR_SGX530_$sgx_ver" >> $root/vendor/pvr/egl.cfg
215     sgx_user_ready=true
216   fi
217 fi
218
219 if ! $sgx_user_ready; then
220   err "SGX driver load failed, no 3D support"
221 fi
222
223 # stop X and interfering things, get wifi ready
224 set +e
225 if pidof xfce4-session > /dev/null; then
226   user=`cat /tmp/currentuser`
227   # most often doesn't work :(
228   #if ! test -z "$user"; then
229   #  su -c 'xfce4-session-logout --logout' $user
230   #fi
231 fi
232 /etc/init.d/NetworkManager stop
233 modprobe mac80211
234 /etc/init.d/wl1251-init start
235 /etc/init.d/slim-init stop
236 sleep 1 # for wlan0, hmh..
237 chvt 2 & # may hang..
238 sleep 1
239 killall chvt 2> /dev/null || true
240 ifconfig wlan0 down
241 set -e
242
243 cp -v /etc/pointercal $root/vendor/
244 cp -v /lib/modules/$kernel_ver/kernel/drivers/net/wireless/wl1251/wl1251_sdio.ko $root/vendor/
245 mkdir -p $root/vendor/firmware
246 cp -v /lib/firmware/brf6300.bin $root/vendor/firmware/
247
248 # some cleanup
249 rm -rf $root/acct/uid/*
250
251 chroot $root /init &
252
253 # wait for a message
254 while true; do
255   sleep 1
256
257   if nc -V 2> /dev/null | grep -q GNU; then
258     # GNU nc always fails
259     msg=`nc -l -p 36936 localhost || true`
260   else
261     msg=`nc -l localhost 36936`
262   fi
263   if [ "x$msg" = "xquit" ]; then
264     break
265   fi
266   echo "unknown message: $msg"
267 done
268
269 # real init can't be killed this way
270 killall init
271
272 # done, run exit handler indirectly
273 exitcode=0