run_gingerbread: fix signal handling and exit
[android_pandora.git] / pnd / run_gingerbread.sh
CommitLineData
34a1da07 1#!/bin/bash
941f5584 2# run/kill Android from Linux, the hackjob script
34a1da07 3# (c) Grazvydas "notaz" Ignotas, 2012
4set -e -x
5
6if [ "`id -u`" != "0" ]; then
941f5584 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
34a1da07 11fi
12
13root=/mnt/android
14mpoint_main=`pwd`
15kernel_ver=`uname -r`
941f5584 16exitcode=1
34a1da07 17
941f5584 18trap onexit INT QUIT TERM EXIT
19trap '' HUP
34a1da07 20
21err()
22{
23 zenity --error --text "$1"
24 echo "$1"
25}
26
27onexit()
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
941f5584 53 for i in `seq 4`; do
34a1da07 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
941f5584 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
34a1da07 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
941f5584 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
93EOF
94 cd /tmp/
95 chmod +x /tmp/clean_android.sh
96 /tmp/clean_android.sh &
97 sleep 1
98 fi
99 exit $exitcode
34a1da07 100}
101
102
103# logger, binder and ashmem
104delay=0
105if ! test -e /dev/log_events; then
106 modprobe logger
107 delay=0.5
108fi
109if ! test -e /dev/binder; then
110 modprobe binder
111 delay=0.5
112fi
113if ! test -e /dev/ashmem; then
114 modprobe ashmem
115 delay=0.5
116fi
117sleep $delay
118if test ! -e /dev/log_events -o ! -e /dev/binder -o ! -e /dev/ashmem; then
119 err "could not load required Android modules,\n\
120perhaps you are running unsupported\nfirmware/kernel."
121 exit 1
122fi
123
124if ! 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
129fi
130
131if ! 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
148fi
149
150if ! 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
155fi
156
157mkdir -p $root
158mount -o loop,rw,noatime rootfs.ext2 $root
159mount --bind $mpoint_main/system/ $root/system/
160mount -o loop,rw,noatime data.ext4 $root/data
161
941f5584 162mkdir -p $root/vendor/
34a1da07 163
164# handle SGX
165mkdir -p $root/vendor/pvr
166echo "0 0 android" > $root/vendor/pvr/egl.cfg
167
168# load the right SGX driver
169sgx_kernel_loaded=false
170if ! 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
188else
189 sgx_kernel_loaded=true
190fi
191
192sgx_user_ready=false
193#if false; then
194if $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
217fi
218
219if ! $sgx_user_ready; then
220 err "SGX driver load failed, no 3D support"
221fi
222
223# stop X and interfering things, get wifi ready
224set +e
225if 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
231fi
232/etc/init.d/NetworkManager stop
233modprobe mac80211
234/etc/init.d/wl1251-init start
235/etc/init.d/slim-init stop
236sleep 1 # for wlan0, hmh..
237chvt 2 & # may hang..
238sleep 1
239killall chvt 2> /dev/null || true
240ifconfig wlan0 down
241set -e
242
941f5584 243cp -v /etc/pointercal $root/vendor/
244cp -v /lib/modules/$kernel_ver/kernel/drivers/net/wireless/wl1251/wl1251_sdio.ko $root/vendor/
34a1da07 245mkdir -p $root/vendor/firmware
941f5584 246cp -v /lib/firmware/brf6300.bin $root/vendor/firmware/
34a1da07 247
248# some cleanup
249rm -rf $root/acct/uid/*
250
251chroot $root /init &
252
253# wait for a message
254while 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"
267done
268
269# real init can't be killed this way
270killall init
941f5584 271
272# done, run exit handler indirectly
273exitcode=0