GSI updates for system/core

Change-Id: I6c1795bda1b79fe0267bd0bccc88e6f6a6ea3c01
diff --git a/patches/system/core/0001-Revert-logd-add-passcred-for-logdw-socket.patch b/patches/system/core/0001-Revert-logd-add-passcred-for-logdw-socket.patch
index 8bae5d0..114df57 100644
--- a/patches/system/core/0001-Revert-logd-add-passcred-for-logdw-socket.patch
+++ b/patches/system/core/0001-Revert-logd-add-passcred-for-logdw-socket.patch
@@ -1,7 +1,7 @@
-From 633df09b9c0150e82e2ffdbcbd77c9dfed99a605 Mon Sep 17 00:00:00 2001
+From 62a86315f0fc659ae79c17451210cb03f651ac96 Mon Sep 17 00:00:00 2001
 From: Pierre-Hugues Husson <phh@phh.me>
 Date: Sun, 10 Dec 2017 00:26:21 +0100
-Subject: [PATCH 1/3] Revert "logd: add "+passcred" for logdw socket"
+Subject: [PATCH 1/7] Revert "logd: add "+passcred" for logdw socket"
 
 This reverts commit 54d8ff1121440d0ef4565ce0ab3751f82fdb393c.
 
@@ -12,7 +12,7 @@
  2 files changed, 6 insertions(+), 6 deletions(-)
 
 diff --git a/logd/LogListener.cpp b/logd/LogListener.cpp
-index fc51dcf08d..f7f8e17924 100755
+index fc51dcf08..f7f8e1792 100755
 --- a/logd/LogListener.cpp
 +++ b/logd/LogListener.cpp
 @@ -149,14 +149,14 @@ int LogListener::getLogSocket() {
@@ -36,7 +36,7 @@
      return sock;
  }
 diff --git a/logd/logd.rc b/logd/logd.rc
-index bd303b72ba..4fd845f002 100644
+index bd303b72b..4fd845f00 100644
 --- a/logd/logd.rc
 +++ b/logd/logd.rc
 @@ -1,7 +1,7 @@
diff --git a/patches/system/core/0002-Some-kernel-crashes-when-using-too-recent-sdcardfs-o.patch b/patches/system/core/0002-Some-kernel-crashes-when-using-too-recent-sdcardfs-o.patch
index 10471bd..fce1ff6 100644
--- a/patches/system/core/0002-Some-kernel-crashes-when-using-too-recent-sdcardfs-o.patch
+++ b/patches/system/core/0002-Some-kernel-crashes-when-using-too-recent-sdcardfs-o.patch
@@ -1,7 +1,7 @@
-From 164b7dcc67770829a65b4de26f6662a87a4636f4 Mon Sep 17 00:00:00 2001
+From 98ab89f66725161127ac16b097e2cc493ac50ecf Mon Sep 17 00:00:00 2001
 From: Pierre-Hugues Husson <phh@phh.me>
 Date: Tue, 14 Aug 2018 19:33:03 +0200
-Subject: [PATCH 2/3] Some kernel crashes when using too recent sdcardfs
+Subject: [PATCH 2/7] Some kernel crashes when using too recent sdcardfs
  options. Force everyone to old options
 
 Change-Id: Ia5cf1aa8dc07a0f4a78b4d8f760ca0944dabaa89
@@ -10,7 +10,7 @@
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 diff --git a/sdcard/sdcard.cpp b/sdcard/sdcard.cpp
-index f8f1cbb455..15b66acf7b 100644
+index f8f1cbb45..15b66acf7 100644
 --- a/sdcard/sdcard.cpp
 +++ b/sdcard/sdcard.cpp
 @@ -102,7 +102,7 @@ static bool sdcardfs_setup(const std::string& source_path, const std::string& de
diff --git a/patches/system/core/0003-First-drop_privs-which-may-fail-and-only-run-thread-.patch b/patches/system/core/0003-First-drop_privs-which-may-fail-and-only-run-thread-.patch
index 9baf4a6..a000329 100644
--- a/patches/system/core/0003-First-drop_privs-which-may-fail-and-only-run-thread-.patch
+++ b/patches/system/core/0003-First-drop_privs-which-may-fail-and-only-run-thread-.patch
@@ -1,7 +1,7 @@
-From 961a623a6e46bd3aa304453324dd5cbaa2b2c951 Mon Sep 17 00:00:00 2001
+From 0c37b11dc02104fe2922397b9afd7649e54de21b Mon Sep 17 00:00:00 2001
 From: Pierre-Hugues Husson <phh@phh.me>
 Date: Tue, 14 Aug 2018 19:33:23 +0200
-Subject: [PATCH 3/3] First drop_privs (which may fail) and only run thread
+Subject: [PATCH 3/7] First drop_privs (which may fail) and only run thread
  that might be scheduled before us
 
 Change-Id: I118fb2d4beedbeecf5d3a8d255929d3be480b923
@@ -10,7 +10,7 @@
  1 file changed, 6 insertions(+), 6 deletions(-)
 
 diff --git a/logd/main.cpp b/logd/main.cpp
-index 4af0d21f1e..bb64fb46fa 100644
+index 4af0d21f1..bb64fb46f 100644
 --- a/logd/main.cpp
 +++ b/logd/main.cpp
 @@ -450,6 +450,12 @@ int main(int argc, char* argv[]) {
diff --git a/patches/system/core/0004-Ignore-proc-kmsg-if-reading-from-it-faults.patch b/patches/system/core/0004-Ignore-proc-kmsg-if-reading-from-it-faults.patch
new file mode 100644
index 0000000..4892b2d
--- /dev/null
+++ b/patches/system/core/0004-Ignore-proc-kmsg-if-reading-from-it-faults.patch
@@ -0,0 +1,33 @@
+From 56576baa9e54b6a920b24781c0274785926bfef4 Mon Sep 17 00:00:00 2001
+From: Pierre-Hugues Husson <phh@phh.me>
+Date: Wed, 2 Jan 2019 17:17:20 +0100
+Subject: [PATCH 4/7] Ignore /proc/kmsg if reading from it faults
+
+On some devices, (The only known one is Y6 2018), reading from
+/proc/kmsg fails, with a status EFAULT
+This isn't just from logd, a simple cat /proc/kmsg does that as well.
+
+Simply stop reading logs from kernel in that case
+
+Change-Id: I4b902b7ec36107c722e2f5cc5dbb7964734bb71d
+---
+ logd/LogKlog.cpp | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/logd/LogKlog.cpp b/logd/LogKlog.cpp
+index ab980ac5d..fefa49867 100755
+--- a/logd/LogKlog.cpp
++++ b/logd/LogKlog.cpp
+@@ -239,6 +239,9 @@ bool LogKlog::onDataAvailable(SocketClient* cli) {
+             break;
+         }
+         if (retval < 0) {
++	    if(errno == EFAULT) {
++	        stopListener();
++	    }
+             return false;
+         }
+         len += retval;
+-- 
+2.17.1
+
diff --git a/patches/system/core/0005-ueventd-let-scripts-provide-firmware-directories.patch b/patches/system/core/0005-ueventd-let-scripts-provide-firmware-directories.patch
new file mode 100644
index 0000000..a81cfe7
--- /dev/null
+++ b/patches/system/core/0005-ueventd-let-scripts-provide-firmware-directories.patch
@@ -0,0 +1,298 @@
+From bd79c7ae1801e8ee4b796350b0f56dcef690d878 Mon Sep 17 00:00:00 2001
+From: Tom Cherry <tomcherry@google.com>
+Date: Fri, 13 Jul 2018 15:32:02 -0700
+Subject: [PATCH 5/7] ueventd: let scripts provide firmware directories
+
+Since some vendors will have firmware in mount points in
+/mnt/vendor/..., we extend the ueventd script language to allow
+specifying the firmware directories.
+
+Also, move the existing 4 directories to ueventd.rc as a primary user
+of this mechanism.
+
+Bug: 111337229
+Test: boot sailfish; firmwares load
+Change-Id: I0854b0b786ad761e40d2332312c637610432fce2
+Merged-In: I0854b0b786ad761e40d2332312c637610432fce2
+(cherry picked from commit 7421fa1aedc975f09d3c8b6b74aca454a5d2490d)
+---
+ init/devices.h            |  1 -
+ init/firmware_handler.cpp | 10 +++-----
+ init/firmware_handler.h   |  5 ++++
+ init/ueventd.cpp          | 52 ++++++++++++++-------------------------
+ init/ueventd_parser.cpp   | 52 +++++++++++++++++++++++++++++++++++++++
+ init/ueventd_parser.h     | 24 +++++-------------
+ rootdir/ueventd.rc        |  2 ++
+ 7 files changed, 87 insertions(+), 59 deletions(-)
+
+diff --git a/init/devices.h b/init/devices.h
+index f9035da3d..9224fcd82 100644
+--- a/init/devices.h
++++ b/init/devices.h
+@@ -106,7 +106,6 @@ class DeviceHandler {
+     DeviceHandler(std::vector<Permissions> dev_permissions,
+                   std::vector<SysfsPermissions> sysfs_permissions, std::vector<Subsystem> subsystems,
+                   std::set<std::string> boot_devices, bool skip_restorecon);
+-    ~DeviceHandler(){};
+ 
+     void HandleDeviceEvent(const Uevent& uevent);
+ 
+diff --git a/init/firmware_handler.cpp b/init/firmware_handler.cpp
+index 8c8d9f2ab..28bda34a2 100644
+--- a/init/firmware_handler.cpp
++++ b/init/firmware_handler.cpp
+@@ -21,7 +21,6 @@
+ #include <sys/wait.h>
+ #include <unistd.h>
+ 
+-#include <string>
+ #include <thread>
+ 
+ #include <android-base/chrono_utils.h>
+@@ -36,6 +35,8 @@ using android::base::WriteFully;
+ namespace android {
+ namespace init {
+ 
++std::vector<std::string> firmware_directories;
++
+ static void LoadFirmware(const Uevent& uevent, const std::string& root, int fw_fd, size_t fw_size,
+                          int loading_fd, int data_fd) {
+     // Start transfer.
+@@ -78,12 +79,9 @@ static void ProcessFirmwareEvent(const Uevent& uevent) {
+         return;
+     }
+ 
+-    static const char* firmware_dirs[] = {"/etc/firmware/", "/odm/firmware/",
+-                                          "/vendor/firmware/", "/firmware/image/"};
+-
+ try_loading_again:
+-    for (size_t i = 0; i < arraysize(firmware_dirs); i++) {
+-        std::string file = firmware_dirs[i] + uevent.firmware;
++    for (const auto& firmware_directory : firmware_directories) {
++        std::string file = firmware_directory + uevent.firmware;
+         unique_fd fw_fd(open(file.c_str(), O_RDONLY | O_CLOEXEC));
+         struct stat sb;
+         if (fw_fd != -1 && fstat(fw_fd, &sb) != -1) {
+diff --git a/init/firmware_handler.h b/init/firmware_handler.h
+index e456ac4e4..6081511b5 100644
+--- a/init/firmware_handler.h
++++ b/init/firmware_handler.h
+@@ -17,11 +17,16 @@
+ #ifndef _INIT_FIRMWARE_HANDLER_H
+ #define _INIT_FIRMWARE_HANDLER_H
+ 
++#include <string>
++#include <vector>
++
+ #include "uevent.h"
+ 
+ namespace android {
+ namespace init {
+ 
++extern std::vector<std::string> firmware_directories;
++
+ void HandleFirmwareEvent(const Uevent& uevent);
+ 
+ }  // namespace init
+diff --git a/init/ueventd.cpp b/init/ueventd.cpp
+index a284203ba..680944546 100644
+--- a/init/ueventd.cpp
++++ b/init/ueventd.cpp
+@@ -215,39 +215,6 @@ void ColdBoot::Run() {
+     LOG(INFO) << "Coldboot took " << cold_boot_timer.duration().count() / 1000.0f << " seconds";
+ }
+ 
+-DeviceHandler CreateDeviceHandler() {
+-    Parser parser;
+-
+-    std::vector<Subsystem> subsystems;
+-    parser.AddSectionParser("subsystem", std::make_unique<SubsystemParser>(&subsystems));
+-
+-    using namespace std::placeholders;
+-    std::vector<SysfsPermissions> sysfs_permissions;
+-    std::vector<Permissions> dev_permissions;
+-    parser.AddSingleLineParser("/sys/",
+-                               std::bind(ParsePermissionsLine, _1, &sysfs_permissions, nullptr));
+-    parser.AddSingleLineParser("/dev/",
+-                               std::bind(ParsePermissionsLine, _1, nullptr, &dev_permissions));
+-
+-    parser.ParseConfig("/ueventd.rc");
+-    parser.ParseConfig("/vendor/ueventd.rc");
+-    parser.ParseConfig("/odm/ueventd.rc");
+-
+-    /*
+-     * keep the current product name base configuration so
+-     * we remain backwards compatible and allow it to override
+-     * everything
+-     * TODO: cleanup platform ueventd.rc to remove vendor specific
+-     * device node entries (b/34968103)
+-     */
+-    std::string hardware = android::base::GetProperty("ro.hardware", "");
+-    parser.ParseConfig("/ueventd." + hardware + ".rc");
+-
+-    auto boot_devices = fs_mgr_get_boot_devices();
+-    return DeviceHandler(std::move(dev_permissions), std::move(sysfs_permissions),
+-                         std::move(subsystems), std::move(boot_devices), true);
+-}
+-
+ int ueventd_main(int argc, char** argv) {
+     /*
+      * init sets the umask to 077 for forked processes. We need to
+@@ -263,9 +230,26 @@ int ueventd_main(int argc, char** argv) {
+     SelinuxSetupKernelLogging();
+     SelabelInitialize();
+ 
+-    DeviceHandler device_handler = CreateDeviceHandler();
++    DeviceHandler device_handler;
+     UeventListener uevent_listener;
+ 
++    {
++        // Keep the current product name base configuration so we remain backwards compatible and
++        // allow it to override everything.
++        // TODO: cleanup platform ueventd.rc to remove vendor specific device node entries (b/34968103)
++        auto hardware = android::base::GetProperty("ro.hardware", "");
++
++        auto ueventd_configuration =
++                ParseConfig({"/ueventd.rc", "/vendor/ueventd.rc", "/odm/ueventd.rc", hardware});
++
++        device_handler = DeviceHandler{std::move(ueventd_configuration.dev_permissions),
++                                       std::move(ueventd_configuration.sysfs_permissions),
++                                       std::move(ueventd_configuration.subsystems),
++                                       fs_mgr_get_boot_devices(), true};
++
++        firmware_directories = ueventd_configuration.firmware_directories;
++    }
++
+     if (access(COLDBOOT_DONE, F_OK) != 0) {
+         ColdBoot cold_boot(uevent_listener, device_handler);
+         cold_boot.Run();
+diff --git a/init/ueventd_parser.cpp b/init/ueventd_parser.cpp
+index f74c87849..c114ec704 100644
+--- a/init/ueventd_parser.cpp
++++ b/init/ueventd_parser.cpp
+@@ -20,6 +20,7 @@
+ #include <pwd.h>
+ 
+ #include "keyword_map.h"
++#include "parser.h"
+ 
+ namespace android {
+ namespace init {
+@@ -72,6 +73,33 @@ Result<Success> ParsePermissionsLine(std::vector<std::string>&& args,
+     return Success();
+ }
+ 
++Result<Success> ParseFirmwareDirectoriesLine(std::vector<std::string>&& args,
++                                             std::vector<std::string>* firmware_directories) {
++    if (args.size() < 2) {
++        return Error() << "firmware_directories must have at least 1 entry";
++    }
++
++    std::move(std::next(args.begin()), args.end(), std::back_inserter(*firmware_directories));
++
++    return Success();
++}
++
++class SubsystemParser : public SectionParser {
++  public:
++    SubsystemParser(std::vector<Subsystem>* subsystems) : subsystems_(subsystems) {}
++    Result<Success> ParseSection(std::vector<std::string>&& args, const std::string& filename,
++                                 int line) override;
++    Result<Success> ParseLineSection(std::vector<std::string>&& args, int line) override;
++    Result<Success> EndSection() override;
++
++  private:
++    Result<Success> ParseDevName(std::vector<std::string>&& args);
++    Result<Success> ParseDirName(std::vector<std::string>&& args);
++
++    Subsystem subsystem_;
++    std::vector<Subsystem>* subsystems_;
++};
++
+ Result<Success> SubsystemParser::ParseSection(std::vector<std::string>&& args,
+                                               const std::string& filename, int line) {
+     if (args.size() != 2) {
+@@ -138,5 +166,29 @@ Result<Success> SubsystemParser::EndSection() {
+     return Success();
+ }
+ 
++UeventdConfiguration ParseConfig(const std::vector<std::string>& configs) {
++    Parser parser;
++    UeventdConfiguration ueventd_configuration;
++
++    parser.AddSectionParser("subsystem",
++                            std::make_unique<SubsystemParser>(&ueventd_configuration.subsystems));
++
++    using namespace std::placeholders;
++    parser.AddSingleLineParser(
++            "/sys/",
++            std::bind(ParsePermissionsLine, _1, &ueventd_configuration.sysfs_permissions, nullptr));
++    parser.AddSingleLineParser("/dev/", std::bind(ParsePermissionsLine, _1, nullptr,
++                                                  &ueventd_configuration.dev_permissions));
++    parser.AddSingleLineParser("firmware_directories",
++                               std::bind(ParseFirmwareDirectoriesLine, _1,
++                                         &ueventd_configuration.firmware_directories));
++
++    for (const auto& config : configs) {
++        parser.ParseConfig(config);
++    }
++
++    return ueventd_configuration;
++}
++
+ }  // namespace init
+ }  // namespace android
+diff --git a/init/ueventd_parser.h b/init/ueventd_parser.h
+index 83684f39e..343d58bfd 100644
+--- a/init/ueventd_parser.h
++++ b/init/ueventd_parser.h
+@@ -21,30 +21,18 @@
+ #include <vector>
+ 
+ #include "devices.h"
+-#include "parser.h"
+ 
+ namespace android {
+ namespace init {
+ 
+-class SubsystemParser : public SectionParser {
+-  public:
+-    SubsystemParser(std::vector<Subsystem>* subsystems) : subsystems_(subsystems) {}
+-    Result<Success> ParseSection(std::vector<std::string>&& args, const std::string& filename,
+-                                 int line) override;
+-    Result<Success> ParseLineSection(std::vector<std::string>&& args, int line) override;
+-    Result<Success> EndSection() override;
+-
+-  private:
+-    Result<Success> ParseDevName(std::vector<std::string>&& args);
+-    Result<Success> ParseDirName(std::vector<std::string>&& args);
+-
+-    Subsystem subsystem_;
+-    std::vector<Subsystem>* subsystems_;
++struct UeventdConfiguration {
++    std::vector<Subsystem> subsystems;
++    std::vector<SysfsPermissions> sysfs_permissions;
++    std::vector<Permissions> dev_permissions;
++    std::vector<std::string> firmware_directories;
+ };
+ 
+-Result<Success> ParsePermissionsLine(std::vector<std::string>&& args,
+-                                     std::vector<SysfsPermissions>* out_sysfs_permissions,
+-                                     std::vector<Permissions>* out_dev_permissions);
++UeventdConfiguration ParseConfig(const std::vector<std::string>& configs);
+ 
+ }  // namespace init
+ }  // namespace android
+diff --git a/rootdir/ueventd.rc b/rootdir/ueventd.rc
+index b03d83bf1..2f85dec07 100644
+--- a/rootdir/ueventd.rc
++++ b/rootdir/ueventd.rc
+@@ -1,3 +1,5 @@
++firmware_directories /etc/firmware/ /odm/firmware/ /vendor/firmware/ /firmware/image/
++
+ subsystem adf
+     devname uevent_devname
+ 
+-- 
+2.17.1
+
diff --git a/patches/system/core/0006-Show-bootanimation-after-decrypt.patch b/patches/system/core/0006-Show-bootanimation-after-decrypt.patch
new file mode 100644
index 0000000..10b203f
--- /dev/null
+++ b/patches/system/core/0006-Show-bootanimation-after-decrypt.patch
@@ -0,0 +1,43 @@
+From 8b3429f84656b0284a3c5c4d372c7318d577b53b Mon Sep 17 00:00:00 2001
+From: Isaac Lee <isaac.lee@mediatek.com>
+Date: Thu, 26 Jul 2018 17:07:25 +0800
+Subject: [PATCH 6/7] Show bootanimation after decrypt
+
+Because the original modification (restart SF which is added
+for display bootanimation) from O to P causes bootanimation NPE,
+ we remove the part of restart SF and add other flow to show
+ bootanimation.
+
+Test: manual, ran the test 10 times and it cause no NPE and
+      display BootAnimation after decrypt
+Test: boot aosp_sailfish
+
+Bug: 79547653
+Change-Id: I355ccdbb2e2f27d897e2e0ee00f9300ef38ede03
+(cherry picked from commit f32c20174349c058b20d3819802ed8aa8277c72d)
+---
+ rootdir/init.rc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/rootdir/init.rc b/rootdir/init.rc
+index c390c392d..6a28efb57 100644
+--- a/rootdir/init.rc
++++ b/rootdir/init.rc
+@@ -706,12 +706,12 @@ on property:vold.decrypt=trigger_restart_min_framework
+     class_start main
+ 
+ on property:vold.decrypt=trigger_restart_framework
+-    stop surfaceflinger
+-    start surfaceflinger
+     # A/B update verifier that marks a successful boot.
+     exec_start update_verifier
+     class_start main
+     class_start late_start
++    setprop service.bootanim.exit 0
++    start bootanim
+ 
+ on property:vold.decrypt=trigger_shutdown_framework
+     class_reset late_start
+-- 
+2.17.1
+
diff --git a/patches/system/core/0007-Fix-loading-ueventd.-ro.hardware-.rc.patch b/patches/system/core/0007-Fix-loading-ueventd.-ro.hardware-.rc.patch
new file mode 100644
index 0000000..29685e3
--- /dev/null
+++ b/patches/system/core/0007-Fix-loading-ueventd.-ro.hardware-.rc.patch
@@ -0,0 +1,33 @@
+From 10c6df7c3d1fb97c8945ddb49afbfb2ebb3fe7ca Mon Sep 17 00:00:00 2001
+From: Sen Jiang <senj@google.com>
+Date: Wed, 18 Jul 2018 17:27:24 -0700
+Subject: [PATCH 7/7] Fix loading ueventd.${ro.hardware}.rc.
+
+Regression introduced in aosp/717324.
+
+Bug: 111543389
+Test: device boots further
+Change-Id: I4cf57381104aa1a801cf82a42b1c5ae1a2273e89
+Merged-In: I4cf57381104aa1a801cf82a42b1c5ae1a2273e89
+(cherry picked from commit d76f174a785d2f1c17999a2d23b1fea2a33e4b1e)
+---
+ init/ueventd.cpp | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/init/ueventd.cpp b/init/ueventd.cpp
+index 680944546..b42a4c62a 100644
+--- a/init/ueventd.cpp
++++ b/init/ueventd.cpp
+@@ -240,7 +240,8 @@ int ueventd_main(int argc, char** argv) {
+         auto hardware = android::base::GetProperty("ro.hardware", "");
+ 
+         auto ueventd_configuration =
+-                ParseConfig({"/ueventd.rc", "/vendor/ueventd.rc", "/odm/ueventd.rc", hardware});
++                ParseConfig({"/ueventd.rc", "/vendor/ueventd.rc", "/odm/ueventd.rc",
++                             "/ueventd." + hardware + ".rc"});
+ 
+         device_handler = DeviceHandler{std::move(ueventd_configuration.dev_permissions),
+                                        std::move(ueventd_configuration.sysfs_permissions),
+-- 
+2.17.1
+