Enable dm-verity on shamu

Enable dm-verity for the system partition. Store state in the metadata
partition, and display a warning if dm-verity is started in logging
mode.

Increasing read-ahead for dm-verity devices from the default 512 to
2048 improves sequential read speeds 13-18% for block sizes 1k-2k and
~30% for larger block sizes (tested up to 32k), without considerably
affecting 512 byte block reads.

Change-Id: I9422a57b5315e69cf0610262259b13ae9e370fd3
diff --git a/device.mk b/device.mk
index 3e14931..fe5ed92 100644
--- a/device.mk
+++ b/device.mk
@@ -336,6 +336,10 @@
 PRODUCT_SYSTEM_VERITY_PARTITION := /dev/block/platform/msm_sdcc.1/by-name/system
 $(call inherit-product, build/target/product/verity.mk)
 
+PRODUCT_PACKAGES += \
+    slideshow \
+    verity_warning_images
+
 # setup scheduler tunable
 PRODUCT_DEFAULT_PROPERTY_OVERRIDES += \
     ro.qualcomm.perf.cores_online=2
diff --git a/fstab.shamu b/fstab.shamu
index 4a9989a..f07daf8 100644
--- a/fstab.shamu
+++ b/fstab.shamu
@@ -3,7 +3,7 @@
 # specify MF_CHECK, and must come before any filesystems that do specify MF_CHECK
 #
 #<src>                                                <mnt_point>  <type>  <mnt_flags and options>                     <fs_mgr_flags>
-/dev/block/platform/msm_sdcc.1/by-name/system         /system      ext4    ro,barrier=1                                wait
+/dev/block/platform/msm_sdcc.1/by-name/system         /system      ext4    ro,barrier=1                                wait,verify=/dev/block/platform/msm_sdcc.1/by-name/metadata
 /dev/block/platform/msm_sdcc.1/by-name/userdata    /data        ext4    rw,nosuid,nodev,noatime,nodiratime,noauto_da_alloc,nobarrier    wait,check,formattable,forceencrypt=/dev/block/platform/msm_sdcc.1/by-name/metadata
 /dev/block/platform/msm_sdcc.1/by-name/cache       /cache       ext4    rw,noatime,nosuid,nodev,barrier=1,data=ordered   wait,check,formattable
 /dev/block/platform/msm_sdcc.1/by-name/modem       /firmware    ext4    ro,barrier=1,context=u:object_r:firmware_file:s0    wait
diff --git a/init.shamu.rc b/init.shamu.rc
index 3513760..f6ebbf7 100644
--- a/init.shamu.rc
+++ b/init.shamu.rc
@@ -25,6 +25,9 @@
     chown system system /sys/kernel/debug/kgsl/proc
 
 on init
+    # Load persistent dm-verity state
+    verity_load_state
+
     mkdir /oem 0550 root root
 
     # Set permissions for persist partition
@@ -61,6 +64,12 @@
     setprop persist.data.df.agg.dl_pkt 10
     setprop persist.data.df.agg.dl_size 4096
 
+    # Adjust parameters for dm-verity device
+    write /sys/block/dm-0/queue/read_ahead_kb 2048
+
+    # Update dm-verity state and set partition.*.verified properties
+    verity_update_state
+
 on post-fs-data
     mkdir /tombstones/modem 0771 system system
     mkdir /tombstones/lpass 0771 system system
@@ -568,6 +577,9 @@
 on property:vold.decrypt=trigger_reset_main
     stop gnss-svcd
 
+on verity-logging
+    exec u:r:slideshow:s0 -- /sbin/slideshow warning/verity_red_1 warning/verity_red_2
+
 # When QCA1530 is known not to present
 on property:persist.qca1530=no
    stop gnss-svcd
diff --git a/verity/Android.mk b/verity/Android.mk
new file mode 100644
index 0000000..8493309
--- /dev/null
+++ b/verity/Android.mk
@@ -0,0 +1,52 @@
+#
+# Copyright 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.
+#
+
+# This contains the module build definitions for the hardware-specific
+# components for this device.
+#
+# As much as possible, those components should be built unconditionally,
+# with device-specific names to avoid collisions, to avoid device-specific
+# bitrot and build breakages. Building a component unconditionally does
+# *not* include it on all devices, so it is safe even with hardware-specific
+# components.
+
+LOCAL_PATH := $(call my-dir)
+
+define _add-warning-image
+include $$(CLEAR_VARS)
+LOCAL_MODULE := warning_$(notdir $(1))
+LOCAL_MODULE_STEM := $(notdir $(1))
+_img_modules += $$(LOCAL_MODULE)
+LOCAL_SRC_FILES := $1
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_CLASS := ETC
+LOCAL_MODULE_PATH := $$(TARGET_ROOT_OUT)/res/images/warning
+include $$(BUILD_PREBUILT)
+endef
+
+_img_modules :=
+_images :=
+$(foreach _img, $(call find-subdir-subdir-files, "images", "*.png"), \
+  $(eval $(call _add-warning-image,$(_img))))
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := verity_warning_images
+LOCAL_MODULE_TAGS := optional
+LOCAL_REQUIRED_MODULES := $(_img_modules)
+include $(BUILD_PHONY_PACKAGE)
+
+_add-warning-image :=
+_img_modules :=
diff --git a/verity/images/verity_red_1.png b/verity/images/verity_red_1.png
new file mode 100644
index 0000000..0b8c308
--- /dev/null
+++ b/verity/images/verity_red_1.png
Binary files differ
diff --git a/verity/images/verity_red_2.png b/verity/images/verity_red_2.png
new file mode 100644
index 0000000..e7a4b37
--- /dev/null
+++ b/verity/images/verity_red_2.png
Binary files differ