[automerger skipped] Allow OEMs to update old 32/64 devices' vendor partitions. am: 5127c802d6 -s ours

am skip reason: Merged-In Ieca1d6436814f786d555ff1fa2d38881be433511 with SHA-1 22bcb1d069 is already in history

Original change: https://android-review.googlesource.com/c/platform/test/vts-testcase/kernel/+/3413618

Change-Id: I4e3be94537c9bcec33b6e2159d5e6ae6a456074e
Signed-off-by: Automerger Merge Worker <[email protected]>
diff --git a/abi/TEST_MAPPING b/abi/TEST_MAPPING
new file mode 100644
index 0000000..7cd30de
--- /dev/null
+++ b/abi/TEST_MAPPING
@@ -0,0 +1,8 @@
+{
+  "kernel-presubmit": [
+    {
+      "name": "KernelAbilistTest"
+    }
+  ]
+}
+
diff --git a/api/TEST_MAPPING b/api/TEST_MAPPING
new file mode 100644
index 0000000..aba9301
--- /dev/null
+++ b/api/TEST_MAPPING
@@ -0,0 +1,16 @@
+{
+  "kernel-presubmit": [
+    {
+      "name": "bpf_module_test"
+    },
+    {
+      "name": "drop_caches_test"
+    },
+    {
+      "name": "KernelApiSysfsTest"
+    },
+    {
+      "name": "vts_kernel_tun_test"
+    }
+  ]
+}
diff --git a/api/bpf_native_test/Android.bp b/api/bpf_native_test/Android.bp
index d23a5b4..8cc6668 100644
--- a/api/bpf_native_test/Android.bp
+++ b/api/bpf_native_test/Android.bp
@@ -15,6 +15,7 @@
 //
 
 package {
+    default_team: "trendy_team_fwk_core_networking",
     default_applicable_licenses: ["Android-Apache-2.0"],
 }
 
diff --git a/api/bpf_native_test/OWNERS b/api/bpf_native_test/OWNERS
index 4ebca2d..c53d0c4 100644
--- a/api/bpf_native_test/OWNERS
+++ b/api/bpf_native_test/OWNERS
@@ -1,3 +1,3 @@
 # Bug component: 31808
 set noparent
-file:platform/system/bpf:master:/OWNERS_bpf
+file:platform/system/bpf:main:/OWNERS_bpf
diff --git a/api/drop_caches_prop/Android.bp b/api/drop_caches_prop/Android.bp
index 3be048c..96cfb2c 100644
--- a/api/drop_caches_prop/Android.bp
+++ b/api/drop_caches_prop/Android.bp
@@ -25,7 +25,10 @@
         "libcutils",
         "liblog",
     ],
-    test_suites: ["vts"],
+    test_suites: [
+        "general-tests",
+        "vts",
+    ],
     auto_gen_config: true,
     require_root: false,
 }
diff --git a/api/drop_caches_prop/drop_caches_test.cpp b/api/drop_caches_prop/drop_caches_test.cpp
index 76707ab..a6ea1e3 100644
--- a/api/drop_caches_prop/drop_caches_test.cpp
+++ b/api/drop_caches_prop/drop_caches_test.cpp
@@ -130,11 +130,15 @@
       usage_after_minor.ru_minflt - usage_before_minor.ru_minflt;
   long without_cache_major_faults =
       usage_after_major.ru_majflt - usage_before_major.ru_majflt;
-  bool failure = abs(with_cache_minor_faults - without_cache_major_faults) > 2;
-  ALOGI("There were %ld minor faults and %ld major faults.",
-        with_cache_minor_faults, without_cache_major_faults);
-  ASSERT_EQ(failure, false)
-      << "The difference between minor and major faults was too large.";
+
+  long with_cache_major_faults =
+      usage_after_minor.ru_majflt - usage_before_minor.ru_majflt;
+  long without_cache_minor_faults =
+      usage_after_major.ru_minflt - usage_before_major.ru_minflt;
+
+  ASSERT_NEAR(with_cache_minor_faults, without_cache_major_faults, 2)
+    << "with_cache_major_faults=" << with_cache_major_faults
+    << " without_cache_minor_faults=" << without_cache_minor_faults;
 
   // Try to clean up the garbage.data file from the device.
   remove("/data/local/tmp/garbage.data");
diff --git a/api/sysfs/Android.bp b/api/sysfs/Android.bp
index e447d41..fbf5b7c 100644
--- a/api/sysfs/Android.bp
+++ b/api/sysfs/Android.bp
@@ -25,6 +25,7 @@
     ],
     srcs: ["src/**/*.java"],
     test_suites: [
+        "general-tests",
         "vts",
     ],
     test_config: "KernelApiSysfsTest.xml",
diff --git a/api/sysfs/src/com/android/tests/sysfs/KernelApiSysfsTest.java b/api/sysfs/src/com/android/tests/sysfs/KernelApiSysfsTest.java
index 247356e..9dcdfa4 100644
--- a/api/sysfs/src/com/android/tests/sysfs/KernelApiSysfsTest.java
+++ b/api/sysfs/src/com/android/tests/sysfs/KernelApiSysfsTest.java
@@ -93,10 +93,10 @@
      */
     @Test
     public void testPerCpuCpufreq() throws Exception {
-        String filePath = "/sys/devices/system/cpu/present";
+        String filePath = "/sys/devices/system/cpu/online";
         assertTrue(TargetFileUtils.isReadOnly(filePath, getDevice()));
-        String presentCpus = getDevice().pullFileContents(filePath).trim();
-        String[] cpuRanges = presentCpus.split(",");
+        String onlineCpus = getDevice().pullFileContents(filePath).trim();
+        String[] cpuRanges = onlineCpus.split(",");
         List<Integer> cpuList = new ArrayList<>();
         Pattern p = Pattern.compile("(\\d+)(-\\d+)?");
         for (String range : cpuRanges) {
diff --git a/api/tun/Android.bp b/api/tun/Android.bp
index 8ad5116..1448eac 100644
--- a/api/tun/Android.bp
+++ b/api/tun/Android.bp
@@ -13,17 +13,24 @@
 // limitations under the License.
 
 package {
+    default_team: "trendy_team_fwk_core_networking",
     default_applicable_licenses: ["Android-Apache-2.0"],
 }
 
 cc_test {
     name: "vts_kernel_tun_test",
     srcs: ["vts_kernel_tun_test.cpp"],
-    cflags: ["-Wall", "-Werror"],
+    cflags: [
+        "-Wall",
+        "-Werror",
+    ],
     shared_libs: [
         "libbase",
     ],
-    test_suites: ["vts"],
+    test_suites: [
+        "general-tests",
+        "vts",
+    ],
     auto_gen_config: true,
     require_root: true,
 }
diff --git a/checkpoint/vts_kernel_checkpoint_test.py b/checkpoint/vts_kernel_checkpoint_test.py
index 644750a..2a8081d 100644
--- a/checkpoint/vts_kernel_checkpoint_test.py
+++ b/checkpoint/vts_kernel_checkpoint_test.py
@@ -112,7 +112,7 @@
           first_api_level = int(out)
         except:
           pass
-        self.assertTrue(first_api_level < 30 or self.isCheckpoint_,
+        self.assertTrue(first_api_level < 29 or self.isCheckpoint_,
                            "User Data Checkpoint is disabled")
 
     def testRollback(self):
diff --git a/dynamic_partitions/Android.bp b/dynamic_partitions/Android.bp
index 9f271cd..3778d9c 100644
--- a/dynamic_partitions/Android.bp
+++ b/dynamic_partitions/Android.bp
@@ -24,6 +24,7 @@
     ],
     srcs: ["src/**/*.java"],
     test_suites: [
+        "general-tests",
         "vts",
     ],
     test_config: "KernelDynamicPartitionsTest.xml",
diff --git a/dynamic_partitions/TEST_MAPPING b/dynamic_partitions/TEST_MAPPING
new file mode 100644
index 0000000..e40232a
--- /dev/null
+++ b/dynamic_partitions/TEST_MAPPING
@@ -0,0 +1,7 @@
+{
+  "kernel-presubmit": [
+    {
+      "name": "KernelDynamicPartitionsTest"
+    }
+  ]
+}
diff --git a/encryption/TEST_MAPPING b/encryption/TEST_MAPPING
new file mode 100644
index 0000000..866dcc3
--- /dev/null
+++ b/encryption/TEST_MAPPING
@@ -0,0 +1,7 @@
+{
+  "kernel-presubmit": [
+    {
+      "name": "vts_kernel_encryption_test"
+    }
+  ]
+}
diff --git a/encryption/file_based_encryption_tests.cpp b/encryption/file_based_encryption_tests.cpp
index 58c656d..b485440 100644
--- a/encryption/file_based_encryption_tests.cpp
+++ b/encryption/file_based_encryption_tests.cpp
@@ -261,12 +261,12 @@
   int fd_ = -1;
 };
 
-// Reads the raw data of the file specified by |fd| from its underlying block
-// device |blk_device|.  The file has |expected_data_size| bytes of initialized
-// data; this must be a multiple of the filesystem block size
+// Reads the raw data of a file specified by |fd|. The file is located on the
+// filesystem specified by |fs_info|. The file has |expected_data_size| bytes of
+// initialized data; this must be a multiple of the filesystem block size
 // kFilesystemBlockSize.  The file may contain holes, in which case only the
 // non-holes are read; the holes are not counted in |expected_data_size|.
-static bool ReadRawDataOfFile(int fd, const std::string &blk_device,
+static bool ReadRawDataOfFile(int fd, const FilesystemInfo &fs_info,
                               int expected_data_size,
                               std::vector<uint8_t> *raw_data) {
   int max_extents = expected_data_size / kFilesystemBlockSize;
@@ -306,16 +306,8 @@
   uint8_t *buf = static_cast<uint8_t *>(buf_mem.get());
   int offset = 0;
 
-  android::base::unique_fd blk_fd(
-      open(blk_device.c_str(), O_RDONLY | O_DIRECT | O_CLOEXEC));
-  if (blk_fd < 0) {
-    ADD_FAILURE() << "Failed to open raw block device " << blk_device
-                  << Errno();
-    return false;
-  }
-
   for (int i = 0; i < map->fm_mapped_extents; i++) {
-    const struct fiemap_extent &extent = map->fm_extents[i];
+    struct fiemap_extent &extent = map->fm_extents[i];
 
     GTEST_LOG_(INFO) << "Extent " << i + 1 << " of " << map->fm_mapped_extents
                      << " is logical offset " << extent.fe_logical
@@ -329,13 +321,46 @@
       return false;
     }
     if (extent.fe_length % kFilesystemBlockSize != 0) {
-      ADD_FAILURE() << "Extent is not aligned to filesystem block size";
+      ADD_FAILURE()
+          << "Extent (length) is not aligned to filesystem block size";
+      return false;
+    }
+    if (extent.fe_physical % kFilesystemBlockSize != 0) {
+      ADD_FAILURE() << "Extent (physical address) is not aligned to filesystem "
+                       "block size";
       return false;
     }
     if (extent.fe_length > expected_data_size - offset) {
       ADD_FAILURE() << "File is longer than expected";
       return false;
     }
+    // Find the raw block device and remap the physical offset.
+    std::string raw_blk_device;
+    for (const DiskMapEntry &map_entry : fs_info.disk_map) {
+      if (extent.fe_physical / kFilesystemBlockSize <= map_entry.end_blkaddr) {
+        if ((extent.fe_physical + extent.fe_length) / kFilesystemBlockSize >
+            (map_entry.end_blkaddr + 1)) {
+          ADD_FAILURE() << "Extent spans multiple block devices";
+          return false;
+        }
+        raw_blk_device = map_entry.raw_blk_device;
+        extent.fe_physical -= map_entry.start_blkaddr * kFilesystemBlockSize;
+        break;
+      }
+    }
+    if (raw_blk_device.empty()) {
+      ADD_FAILURE()
+          << "Failed to find a raw block device in the block device list";
+      return false;
+    }
+    // Open the raw block device and read out the data.
+    android::base::unique_fd blk_fd(
+        open(raw_blk_device.c_str(), O_RDONLY | O_DIRECT | O_CLOEXEC));
+    if (blk_fd < 0) {
+      ADD_FAILURE() << "Failed to open raw block device " << raw_blk_device
+                    << Errno();
+      return false;
+    }
     if (pread(blk_fd, &buf[offset], extent.fe_length, extent.fe_physical) !=
         extent.fe_length) {
       ADD_FAILURE() << "Error reading raw data from block device" << Errno();
@@ -351,11 +376,11 @@
   return true;
 }
 
-// Writes |plaintext| to a file |path| located on the block device |blk_device|.
-// Returns in |ciphertext| the file's raw ciphertext read from |blk_device|.
+// Writes |plaintext| to a file |path| on the filesystem |fs_info|.
+// Returns in |ciphertext| the file's raw ciphertext read from disk.
 static bool WriteTestFile(const std::vector<uint8_t> &plaintext,
                           const std::string &path,
-                          const std::string &blk_device,
+                          const FilesystemInfo &fs_info,
                           const struct f2fs_comp_option *compress_options,
                           std::vector<uint8_t> *ciphertext) {
   GTEST_LOG_(INFO) << "Creating test file " << path << " containing "
@@ -393,7 +418,7 @@
   }
 
   GTEST_LOG_(INFO) << "Reading the raw ciphertext of " << path << " from disk";
-  if (!ReadRawDataOfFile(fd, blk_device, plaintext.size(), ciphertext)) {
+  if (!ReadRawDataOfFile(fd, fs_info, plaintext.size(), ciphertext)) {
     ADD_FAILURE() << "Failed to read the raw ciphertext of " << path;
     return false;
   }
@@ -623,7 +648,7 @@
 enum {
   kSkipIfNoPolicySupport = 1 << 0,
   kSkipIfNoCryptoAPISupport = 1 << 1,
-  kSkipIfNoHardwareSupport = 1 << 2,
+  kSkipIfInlineEncryptionNotUsable = 1 << 2,
 };
 
 // Returns 0 if encryption policies that include the inode number in the IVs
@@ -682,7 +707,8 @@
                   << std::hex << flags << std::dec << Errno();
     return false;
   }
-  if (skip_flags & (kSkipIfNoCryptoAPISupport | kSkipIfNoHardwareSupport)) {
+  if (skip_flags &
+      (kSkipIfNoCryptoAPISupport | kSkipIfInlineEncryptionNotUsable)) {
     android::base::unique_fd fd(
         open(test_file_.c_str(), O_WRONLY | O_CREAT | O_CLOEXEC, 0600));
     if (fd < 0) {
@@ -696,13 +722,21 @@
                "unsupported on this kernel, due to missing crypto API support";
         return false;
       }
-      // We get EINVAL here when using a hardware-wrapped key and the inline
-      // encryption hardware supports wrapped keys but doesn't support the
-      // number of DUN bytes that the file contents encryption requires.
-      if (errno == EINVAL && (skip_flags & kSkipIfNoHardwareSupport)) {
+      // We get EINVAL here when we're using a hardware-wrapped key, the device
+      // has inline encryption hardware that supports hardware-wrapped keys, and
+      // there are hardware or kernel limitations that make it impossible for
+      // inline encryption to actually be used with the policy.  For example:
+      //
+      //   - The device's inline encryption hardware doesn't support the number
+      //     of DUN bytes needed for file contents encryption.
+      //
+      //   - The policy uses the IV_INO_LBLK_32 flag, and the filesystem block
+      //     size differs from the page size.  (Kernel limitation.)
+      if (errno == EINVAL && (skip_flags & kSkipIfInlineEncryptionNotUsable)) {
         GTEST_LOG_(INFO)
-            << "Skipping test because encryption policy is not compatible with "
-               "this device's inline encryption hardware";
+            << "Skipping test because encryption policy requires inline "
+               "encryption, but inline encryption is unsupported with this "
+               "policy on this device due to hardware or kernel limitations";
         return false;
       }
     }
@@ -724,8 +758,8 @@
                                     compress_options->log_cluster_size))
     return false;
 
-  if (!WriteTestFile(info->plaintext, test_file_, fs_info_.raw_blk_device,
-                     compress_options, &info->actual_ciphertext))
+  if (!WriteTestFile(info->plaintext, test_file_, fs_info_, compress_options,
+                     &info->actual_ciphertext))
     return false;
 
   android::base::unique_fd fd(open(test_file_.c_str(), O_RDONLY | O_CLOEXEC));
@@ -960,11 +994,11 @@
   std::vector<uint8_t> enc_key, sw_secret;
   if (!CreateAndSetHwWrappedKey(&enc_key, &sw_secret)) return;
 
-  if (!SetEncryptionPolicy(
-          FSCRYPT_MODE_AES_256_XTS, FSCRYPT_MODE_AES_256_CTS,
-          FSCRYPT_POLICY_FLAG_IV_INO_LBLK_64,
-          // 64-bit DUN support is not guaranteed.
-          kSkipIfNoHardwareSupport | GetSkipFlagsForInoBasedEncryption()))
+  if (!SetEncryptionPolicy(FSCRYPT_MODE_AES_256_XTS, FSCRYPT_MODE_AES_256_CTS,
+                           FSCRYPT_POLICY_FLAG_IV_INO_LBLK_64,
+                           // 64-bit DUN support is not guaranteed.
+                           kSkipIfInlineEncryptionNotUsable |
+                               GetSkipFlagsForInoBasedEncryption()))
     return;
 
   TestFileInfo file_info;
@@ -1054,7 +1088,7 @@
         << "Error writing data to " << path << Errno();
 
     // Verify the ciphertext.
-    ASSERT_TRUE(ReadRawDataOfFile(fd, fs_info_.raw_blk_device, data_size,
+    ASSERT_TRUE(ReadRawDataOfFile(fd, fs_info_, data_size,
                                   &file_info.actual_ciphertext));
     FscryptIV iv;
     memset(&iv, 0, sizeof(iv));
@@ -1102,9 +1136,12 @@
   std::vector<uint8_t> enc_key, sw_secret;
   if (!CreateAndSetHwWrappedKey(&enc_key, &sw_secret)) return;
 
+  int skip_flags = GetSkipFlagsForInoBasedEncryption();
+  if (kFilesystemBlockSize != getpagesize())
+    skip_flags |= kSkipIfInlineEncryptionNotUsable;
+
   if (!SetEncryptionPolicy(FSCRYPT_MODE_AES_256_XTS, FSCRYPT_MODE_AES_256_CTS,
-                           FSCRYPT_POLICY_FLAG_IV_INO_LBLK_32,
-                           GetSkipFlagsForInoBasedEncryption()))
+                           FSCRYPT_POLICY_FLAG_IV_INO_LBLK_32, skip_flags))
     return;
 
   TestFileInfo file_info;
@@ -1274,7 +1311,11 @@
 //
 // Note, this test will be flaky if the kernel is missing commit 093f0bac32b
 // ("f2fs: change fiemap way in printing compression chunk").
-TEST_F(FBEPolicyTest, TestF2fsCompression) {
+//
+// This test is currently disabled because the test is still flaky even with the
+// above fix, and it hasn't been able to be root-caused.  TODO(b/329449658):
+// root cause the issue and re-enable the test.
+TEST_F(FBEPolicyTest, DISABLED_TestF2fsCompression) {
   if (skip_test_) return;
 
   // Currently, only f2fs supports compression+encryption.
@@ -1435,10 +1476,8 @@
   std::vector<uint8_t> zeroes(kTestFileBytes, 0);
   std::vector<uint8_t> ciphertext_1;
   std::vector<uint8_t> ciphertext_2;
-  ASSERT_TRUE(WriteTestFile(zeroes, path_1, fs_info.raw_blk_device, nullptr,
-                            &ciphertext_1));
-  ASSERT_TRUE(WriteTestFile(zeroes, path_2, fs_info.raw_blk_device, nullptr,
-                            &ciphertext_2));
+  ASSERT_TRUE(WriteTestFile(zeroes, path_1, fs_info, nullptr, &ciphertext_1));
+  ASSERT_TRUE(WriteTestFile(zeroes, path_2, fs_info, nullptr, &ciphertext_2));
 
   GTEST_LOG_(INFO) << "Verifying randomness of ciphertext";
 
diff --git a/encryption/metadata_encryption_tests.cpp b/encryption/metadata_encryption_tests.cpp
index 74db200..91fa06f 100644
--- a/encryption/metadata_encryption_tests.cpp
+++ b/encryption/metadata_encryption_tests.cpp
@@ -175,7 +175,7 @@
 
   FilesystemInfo fs_info;
   ASSERT_TRUE(GetFilesystemInfo(kTestMountpoint, &fs_info));
-  raw_blk_device_ = fs_info.raw_blk_device;
+  raw_blk_device_ = fs_info.disk_map[0].raw_blk_device;
 
   dm_->DeleteDevice(test_dm_device_name_.c_str());
 }
@@ -321,8 +321,10 @@
   std::vector<uint8_t> raw_data;
   FilesystemInfo fs_info;
   ASSERT_TRUE(GetFilesystemInfo(mountpoint, &fs_info));
-  ASSERT_TRUE(
-      ReadBlockDevice(fs_info.raw_blk_device, kFilesystemBlockSize, &raw_data));
+  // The first block of the filesystem's main block device should always be
+  // metadata-encrypted.
+  ASSERT_TRUE(ReadBlockDevice(fs_info.disk_map[0].raw_blk_device,
+                              kFilesystemBlockSize, &raw_data));
   ASSERT_TRUE(VerifyDataRandomness(raw_data));
 }
 
diff --git a/encryption/utils.cpp b/encryption/utils.cpp
index b7a0b57..41430f3 100644
--- a/encryption/utils.cpp
+++ b/encryption/utils.cpp
@@ -16,8 +16,12 @@
 
 // Utility functions for VtsKernelEncryptionTest.
 
+#include <fstream>
+
 #include <LzmaLib.h>
+#include <android-base/parseint.h>
 #include <android-base/properties.h>
+#include <android-base/strings.h>
 #include <android-base/unique_fd.h>
 #include <errno.h>
 #include <ext4_utils/ext4.h>
@@ -33,6 +37,9 @@
 #include "Keymaster.h"
 #include "vts_kernel_encryption.h"
 
+using android::base::ParseInt;
+using android::base::Split;
+using android::base::StartsWith;
 using namespace android::dm;
 
 namespace android {
@@ -137,33 +144,8 @@
   return true;
 }
 
-// Gets the block device and type of the filesystem mounted on |mountpoint|.
-// This block device is the one on which the filesystem is directly located.  In
-// the case of device-mapper that means something like /dev/mapper/dm-5, not the
-// underlying device like /dev/block/by-name/userdata.
-static bool GetFsBlockDeviceAndType(const std::string &mountpoint,
-                                    std::string *fs_blk_device,
-                                    std::string *fs_type) {
-  std::unique_ptr<FILE, int (*)(FILE *)> mnts(setmntent("/proc/mounts", "re"),
-                                              endmntent);
-  if (!mnts) {
-    ADD_FAILURE() << "Failed to open /proc/mounts" << Errno();
-    return false;
-  }
-  struct mntent *mnt;
-  while ((mnt = getmntent(mnts.get())) != nullptr) {
-    if (mnt->mnt_dir == mountpoint) {
-      *fs_blk_device = mnt->mnt_fsname;
-      *fs_type = mnt->mnt_type;
-      return true;
-    }
-  }
-  ADD_FAILURE() << "No /proc/mounts entry found for " << mountpoint;
-  return false;
-}
-
-// Gets the UUID of the filesystem of type |fs_type| that's located on
-// |fs_blk_device|.
+// Gets the UUID of the filesystem that uses |fs_blk_device| as its main block
+// device. |fs_type| gives the filesystem type.
 //
 // Unfortunately there's no kernel API to get the UUID; instead we have to read
 // it from the filesystem superblock.
@@ -219,12 +201,13 @@
   return true;
 }
 
-// Gets the raw block device of the filesystem that is mounted from
-// |fs_blk_device|.  By "raw block device" we mean a block device from which we
-// can read the encrypted file contents and filesystem metadata.  When metadata
-// encryption is disabled, this is simply |fs_blk_device|.  When metadata
-// encryption is enabled, then |fs_blk_device| is a dm-default-key device and
-// the "raw block device" is the parent of this dm-default-key device.
+// Gets the raw block device corresponding to |fs_blk_device| that is one of a
+// filesystem's mounted block devices. By "raw block device" we mean a block
+// device from which we can read the encrypted file contents and filesystem
+// metadata.  When metadata encryption is disabled, this is simply
+// |fs_blk_device|.  When metadata encryption is enabled, then |fs_blk_device|
+// is a dm-default-key device and the "raw block device" is the parent of this
+// dm-default-key device.
 //
 // We don't just use the block device listed in the fstab, because (a) it can be
 // a logical partition name which needs extra code to map to a block device, and
@@ -281,21 +264,109 @@
   return true;
 }
 
+// Gets information about a filesystem's block devices
+static bool GetFsBlockDeviceList(FilesystemInfo *fs_info,
+                                 const std::string &mnt_fsname) {
+  // Add a default block device
+  DiskMapEntry map_entry;
+  map_entry.start_blkaddr = 0;
+  map_entry.end_blkaddr = INT64_MAX - 1;
+  map_entry.fs_blk_device = mnt_fsname;
+
+  if (!GetRawBlockDevice(map_entry.fs_blk_device, &map_entry.raw_blk_device)) {
+    ADD_FAILURE() << "Broken block device path of the default disk";
+    return false;
+  }
+  fs_info->disk_map.push_back(map_entry);
+
+  if (fs_info->type != "f2fs") return true;
+
+  // This requires a kernel patch, f238eff95f48 ("f2fs: add a proc entry show
+  // disk layout"), merged in v6.9
+  static constexpr std::string_view kDevBlockPrefix("/dev/block/");
+  const std::string proc_path = "/proc/fs/f2fs/" +
+                                mnt_fsname.substr(kDevBlockPrefix.length()) +
+                                "/disk_map";
+  std::ifstream proc_fs(proc_path.c_str());
+  if (!proc_fs.is_open()) {
+    GTEST_LOG_(INFO) << proc_path
+                     << " does not exist (expected on pre-6.9 kernels)";
+    return true;
+  }
+
+  std::string line;
+  bool first_device = true;
+  while (std::getline(proc_fs, line)) {
+    if (!android::base::StartsWith(line, "Disk: ")) {
+      continue;
+    }
+    if (first_device) {
+      fs_info->disk_map.erase(fs_info->disk_map.begin());
+      first_device = false;
+    }
+    DiskMapEntry map_entry;
+    std::vector<std::string> data = Split(line, "\t ");
+    if (!ParseInt(data[3], &map_entry.start_blkaddr)) {
+      ADD_FAILURE() << "Broken first block address in the address range";
+      return false;
+    }
+    if (!ParseInt(data[5], &map_entry.end_blkaddr)) {
+      ADD_FAILURE() << "Broken last block address in the address range";
+      return false;
+    }
+    map_entry.fs_blk_device = data[7];
+    if (!GetRawBlockDevice(map_entry.fs_blk_device,
+                           &map_entry.raw_blk_device)) {
+      ADD_FAILURE() << "Broken block device path in the disk map entry";
+      return false;
+    }
+    fs_info->disk_map.push_back(map_entry);
+  }
+  return true;
+}
+
+// Gets the block device list and type of the filesystem mounted on
+// |mountpoint|. The block device list has all the block device information
+// along with the address space ranges configured by the mounted filesystem.
+static bool GetFsBlockDeviceListAndType(const std::string &mountpoint,
+                                        FilesystemInfo *fs_info) {
+  std::unique_ptr<FILE, int (*)(FILE *)> mnts(setmntent("/proc/mounts", "re"),
+                                              endmntent);
+  if (!mnts) {
+    ADD_FAILURE() << "Failed to open /proc/mounts" << Errno();
+    return false;
+  }
+  struct mntent *mnt;
+  while ((mnt = getmntent(mnts.get())) != nullptr) {
+    if (mnt->mnt_dir == mountpoint) {
+      fs_info->type = mnt->mnt_type;
+      return GetFsBlockDeviceList(fs_info, mnt->mnt_fsname);
+    }
+  }
+  ADD_FAILURE() << "No /proc/mounts entry found for " << mountpoint;
+  return false;
+}
+
 // Gets information about the filesystem mounted on |mountpoint|.
-bool GetFilesystemInfo(const std::string &mountpoint, FilesystemInfo *info) {
-  if (!GetFsBlockDeviceAndType(mountpoint, &info->fs_blk_device, &info->type))
+bool GetFilesystemInfo(const std::string &mountpoint, FilesystemInfo *fs_info) {
+  if (!GetFsBlockDeviceListAndType(mountpoint, fs_info)) return false;
+
+  // This disk_map[0] always indicates the main block device which the
+  // filesystem contains its superblock.
+  if (!GetFilesystemUuid(fs_info->disk_map[0].fs_blk_device, fs_info->type,
+                         &fs_info->uuid))
     return false;
 
-  if (!GetFilesystemUuid(info->fs_blk_device, info->type, &info->uuid))
-    return false;
+  GTEST_LOG_(INFO) << " Filesystem mounted on " << mountpoint
+                   << " has type: " << fs_info->type << ", UUID is "
+                   << BytesToHex(fs_info->uuid.bytes);
 
-  if (!GetRawBlockDevice(info->fs_blk_device, &info->raw_blk_device))
-    return false;
-
-  GTEST_LOG_(INFO) << info->fs_blk_device << " is mounted on " << mountpoint
-                   << " with type " << info->type << "; UUID is "
-                   << BytesToHex(info->uuid.bytes) << ", raw block device is "
-                   << info->raw_blk_device;
+  for (const DiskMapEntry &map_entry : fs_info->disk_map) {
+    GTEST_LOG_(INFO) << "Block device: " << map_entry.fs_blk_device << " ("
+                     << map_entry.raw_blk_device << ") ranging from "
+                     << map_entry.start_blkaddr << " to "
+                     << map_entry.end_blkaddr;
+  }
   return true;
 }
 
diff --git a/encryption/vts_kernel_encryption.h b/encryption/vts_kernel_encryption.h
index bf45719..bd3b620 100644
--- a/encryption/vts_kernel_encryption.h
+++ b/encryption/vts_kernel_encryption.h
@@ -110,11 +110,27 @@
   uint8_t bytes[kFilesystemUuidSize];
 };
 
-struct FilesystemInfo {
+struct DiskMapEntry {
   std::string fs_blk_device;
+  std::string raw_blk_device;
+  int64_t start_blkaddr;
+  int64_t end_blkaddr;
+};
+
+struct FilesystemInfo {
   std::string type;
   FilesystemUuid uuid;
-  std::string raw_blk_device;
+
+  // The filesystem's block devices in sorted order of filesystem block address.
+  // The covered addresses are guaranteed to be contiguous and non-overlapping.
+  // The first device, starting at address 0, is the filesystem's "main" block
+  // device.
+  // Note, the disk_map's end_blkaddr is inclusive like below:
+  // [disk number]   [start_blkaddr]   [end_blkaddr]
+  // 0               0                 X - 1
+  // 1               X                 Y - 1
+  // 2               Y                 Z
+  std::vector<DiskMapEntry> disk_map;
 };
 
 bool GetFilesystemInfo(const std::string &mountpoint, FilesystemInfo *info);
diff --git a/fuse_bpf/vts_kernel_fuse_bpf_test.py b/fuse_bpf/vts_kernel_fuse_bpf_test.py
index 0f6a911..111fcc5 100644
--- a/fuse_bpf/vts_kernel_fuse_bpf_test.py
+++ b/fuse_bpf/vts_kernel_fuse_bpf_test.py
@@ -38,7 +38,9 @@
         except:
             pass
         out_running, err, return_code = self.dut.Execute("getprop ro.fuse.bpf.is_running")
-        self.assertTrue(first_api_level < 34 or out_running.strip() == "true",
+        # Legacy devices that are using sdcardfs are unable to simply swap to fuse-bpf
+        out_sdcardfs, err, return_code = self.dut.Execute("mount | grep \"type sdcardfs\"")
+        self.assertTrue(first_api_level < 34 or out_sdcardfs.strip() != "" or out_running.strip() == "true",
                            "fuse-bpf is disabled")
 
 
diff --git a/gki/Android.bp b/gki/Android.bp
index 77c654a..5e803c3 100644
--- a/gki/Android.bp
+++ b/gki/Android.bp
@@ -50,6 +50,31 @@
 }
 
 cc_test {
+    name: "vts_eol_enforcement_test",
+    test_suites: [
+        "device-tests",
+        "vts",
+    ],
+    srcs: [
+        "eol_enforcement_test.cpp",
+    ],
+    defaults: [
+        "libvintf_static_user_defaults",
+    ],
+    static_libs: [
+        "libbase",
+        "libkver",
+        "libtinyxml2",
+        "libvintf",
+    ],
+    cflags: [
+        "-Wall",
+        "-Werror",
+    ],
+    test_config: "eol_enforcement_test.xml",
+}
+
+cc_test {
     name: "vts_generic_boot_image_test",
     require_root: true,
 
@@ -87,7 +112,6 @@
     ],
     static_libs: [
         "libbase",
-        "libc++fs",
         "libgmock",
         "libkver",
         "liblz4",
@@ -98,3 +122,8 @@
         "libstorage_literals_headers",
     ],
 }
+
+filegroup {
+    name: "WtsDlkmPartitionTestCasesSrc",
+    srcs: ["vts_dlkm_partition_test.cpp"],
+}
diff --git a/gki/eol_enforcement_test.cpp b/gki/eol_enforcement_test.cpp
new file mode 100644
index 0000000..4724b33
--- /dev/null
+++ b/gki/eol_enforcement_test.cpp
@@ -0,0 +1,197 @@
+/*
+ * Copyright (C) 2024 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 <chrono>
+#include <cstdint>
+#include <format>
+#include <limits>
+#include <regex>
+#include <sstream>
+
+#include <android-base/file.h>
+#include <android-base/parseint.h>
+#include <gtest/gtest.h>
+#include <kver/kernel_release.h>
+#include <tinyxml2.h>
+#include <vintf/Version.h>
+#include <vintf/VintfObject.h>
+
+using android::vintf::KernelVersion;
+using android::vintf::Level;
+using android::vintf::RuntimeInfo;
+using android::vintf::Version;
+using android::vintf::VintfObject;
+
+namespace {
+
+const std::string kernel_lifetimes_config_path =
+    "/system/etc/kernel/kernel-lifetimes.xml";
+
+bool parseDate(std::string_view date_string,
+               std::chrono::year_month_day& date) {
+  const std::regex date_regex("(\\d\\d\\d\\d)-(\\d\\d)-(\\d\\d)");
+  std::cmatch date_match;
+  if (!std::regex_match(date_string.data(), date_match, date_regex)) {
+    return false;
+  }
+
+  uint32_t year, month, day;
+  android::base::ParseUint(date_match[1].str(), &year);
+  android::base::ParseUint(date_match[2].str(), &month);
+  android::base::ParseUint(date_match[3].str(), &day);
+  date = std::chrono::year_month_day(std::chrono::year(year),
+                                     std::chrono::month(month),
+                                     std::chrono::day(day));
+  return true;
+}
+
+KernelVersion parseKernelVersion(std::string_view kernel_version_string) {
+  const std::regex kernel_version_regex("(\\d+)\\.(\\d+)\\.(\\d+)");
+  std::cmatch kernel_version_match;
+  if (!std::regex_match(kernel_version_string.data(), kernel_version_match,
+                        kernel_version_regex)) {
+    return {};
+  }
+
+  uint32_t v, mj, mi;
+  android::base::ParseUint(kernel_version_match[1].str(), &v);
+  android::base::ParseUint(kernel_version_match[2].str(), &mj);
+  android::base::ParseUint(kernel_version_match[3].str(), &mi);
+  return KernelVersion(v, mj, mi);
+}
+
+}  // namespace
+
+class EolEnforcementTest : public testing::Test {
+ public:
+  virtual void SetUp() override {
+    // Get current date.
+    today = std::chrono::year_month_day(std::chrono::floor<std::chrono::days>(
+        std::chrono::system_clock::now()));
+
+    // Get runtime info.
+    auto vintf = VintfObject::GetInstance();
+    ASSERT_NE(vintf, nullptr);
+    runtime_info = vintf->getRuntimeInfo(RuntimeInfo::FetchFlag::CPU_VERSION |
+                                         RuntimeInfo::FetchFlag::CONFIG_GZ);
+    ASSERT_NE(runtime_info, nullptr);
+  }
+
+  bool isReleaseEol(std::string_view date) const;
+
+  std::chrono::year_month_day today;
+  std::shared_ptr<const RuntimeInfo> runtime_info;
+};
+
+bool EolEnforcementTest::isReleaseEol(std::string_view date_string) const {
+  std::chrono::year_month_day date;
+  if (!parseDate(date_string, date)) {
+    ADD_FAILURE() << "Failed to parse date string: " << date_string;
+  }
+  return today > date;
+}
+
+TEST_F(EolEnforcementTest, KernelNotEol) {
+  ASSERT_GE(runtime_info->kernelVersion().dropMinor(), (Version{4, 14}))
+      << "Kernel versions below 4.14 are EOL";
+
+  std::string kernel_lifetimes_content;
+  ASSERT_TRUE(android::base::ReadFileToString(kernel_lifetimes_config_path,
+                                              &kernel_lifetimes_content))
+      << "Failed to read approved OGKI builds config at "
+      << kernel_lifetimes_config_path;
+
+  tinyxml2::XMLDocument kernel_lifetimes_xml;
+  const auto xml_error =
+      kernel_lifetimes_xml.Parse(kernel_lifetimes_content.c_str());
+  ASSERT_EQ(xml_error, tinyxml2::XMLError::XML_SUCCESS)
+      << "Failed to parse approved builds config: "
+      << tinyxml2::XMLDocument::ErrorIDToName(xml_error);
+
+  const auto kernel_version = runtime_info->kernelVersion();
+  std::string branch_name;
+  if (kernel_version.dropMinor() < Version{5, 4}) {
+    branch_name = std::format("android-{}.{}", kernel_version.version,
+                              kernel_version.majorRev);
+  } else if (kernel_version.dropMinor() == Version{5, 4} &&
+             VintfObject::GetInstance()->getKernelLevel() == Level::R) {
+    // Kernel release string on Android 11 is not GKI compatible.
+    branch_name = "android11-5.4";
+  } else {
+    const auto kernel_release = android::kver::KernelRelease::Parse(
+        android::vintf::VintfObject::GetRuntimeInfo()->osRelease(),
+        /* allow_suffix = */ true);
+    ASSERT_TRUE(kernel_release.has_value())
+        << "Failed to parse the kernel release string";
+    branch_name =
+        std::format("android{}-{}.{}", kernel_release->android_release(),
+                    kernel_version.version, kernel_version.majorRev);
+  }
+
+  tinyxml2::XMLElement* branch_element = nullptr;
+  const auto kernels_element = kernel_lifetimes_xml.RootElement();
+  for (auto branch = kernels_element->FirstChildElement("branch"); branch;
+       branch = branch->NextSiblingElement("branch")) {
+    if (branch->Attribute("name", branch_name.c_str())) {
+      branch_element = branch;
+      break;
+    }
+  }
+  ASSERT_NE(branch_element, nullptr)
+      << "Branch '" << branch_name << "' not found in approved builds config";
+
+  // Test against branch EOL is there are no releases for the branch.
+  if (const auto no_releases = branch_element->FirstChildElement("no-releases");
+      no_releases != nullptr) {
+    std::chrono::year_month_day eol;
+    ASSERT_TRUE(parseDate(branch_element->Attribute("eol"), eol))
+        << "Failed to parse branch '" << branch_name
+        << "' EOL date: " << branch_element->Attribute("eol");
+    EXPECT_GE(eol, today);
+    return;
+  }
+
+  // Test against kernel release EOL.
+  const auto lts_versions = branch_element->FirstChildElement("lts-versions");
+  const auto release_version =
+      std::format("{}.{}.{}", kernel_version.version, kernel_version.majorRev,
+                  kernel_version.minorRev);
+  tinyxml2::XMLElement* latest_release = nullptr;
+  KernelVersion latest_kernel_version;
+  for (auto release = lts_versions->FirstChildElement("release"); release;
+       release = release->NextSiblingElement("release")) {
+    if (release->Attribute("version", release_version.c_str())) {
+      EXPECT_FALSE(isReleaseEol(release->Attribute("eol")));
+      return;
+    } else if (auto kernel_version =
+                   parseKernelVersion(release->Attribute("version"));
+               latest_release == nullptr ||
+               kernel_version > latest_kernel_version) {
+      latest_release = release;
+      latest_kernel_version = kernel_version;
+    }
+  }
+
+  // If current kernel version is newer than the latest kernel version found in
+  // the config, then this might be a kernel release which is yet to get a
+  // release config. Test against the latest kernel release version if this is
+  // the case.
+  if (kernel_version > latest_kernel_version) {
+    EXPECT_FALSE(isReleaseEol(latest_release->Attribute("eol")));
+  } else {
+    FAIL() << "Kernel release '" << release_version << "' is not recognised";
+  }
+}
diff --git a/gki/eol_enforcement_test.xml b/gki/eol_enforcement_test.xml
new file mode 100644
index 0000000..54a252c
--- /dev/null
+++ b/gki/eol_enforcement_test.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2024 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.
+-->
+<configuration description="Config for vts_eol_enforcement_test">
+    <target_preparer class="com.android.tradefed.targetprep.WaitForDeviceDatetimePreparer"/>
+    <target_preparer class="com.android.tradefed.targetprep.RootTargetPreparer"/>
+    <target_preparer class="com.android.tradefed.targetprep.PushFilePreparer">
+        <option name="cleanup" value="true"/>
+        <option name="push" value="vts_eol_enforcement_test->/data/local/tmp/vts_eol_enforcement_test"/>
+    </target_preparer>
+    <test class="com.android.tradefed.testtype.GTest">
+        <option name="native-test-device-path" value="/data/local/tmp"/>
+        <option name="module-name" value="vts_eol_enforcement_test"/>
+    </test>
+</configuration>
diff --git a/linux_kselftest/OWNERS b/linux_kselftest/OWNERS
deleted file mode 100644
index e32ce0e..0000000
--- a/linux_kselftest/OWNERS
+++ /dev/null
@@ -1,5 +0,0 @@
-# Bug component: 391836
[email protected]
[email protected]
[email protected]
[email protected]
diff --git a/linux_kselftest/TEST_MAPPING b/linux_kselftest/TEST_MAPPING
deleted file mode 100644
index 30d3833..0000000
--- a/linux_kselftest/TEST_MAPPING
+++ /dev/null
@@ -1,60 +0,0 @@
-{
-  "presubmit": [
-    {
-      "name": "vts_linux_kselftest_arm_32"
-    },
-    {
-      "name": "vts_linux_kselftest_arm_64"
-    },
-    {
-      "name": "vts_linux_kselftest_riscv_64"
-    },
-    {
-      "name": "vts_linux_kselftest_x86_32",
-      "options": [
-        {
-          // TODO(b/191663053)
-          "exclude-filter": "x86_single_step_syscall_x86_32"
-        }
-      ]
-    },
-    {
-      "name": "vts_linux_kselftest_x86_64",
-      "options": [
-        {
-          // TODO(b/191663053)
-          "exclude-filter": "x86_single_step_syscall_x86_64"
-        }
-      ]
-    }
-  ],
-  "kernel-presubmit": [
-    {
-      "name": "vts_linux_kselftest_arm_32"
-    },
-    {
-      "name": "vts_linux_kselftest_arm_64"
-    },
-    {
-      "name": "vts_linux_kselftest_riscv_64"
-    },
-    {
-      "name": "vts_linux_kselftest_x86_32",
-      "options": [
-        {
-          // TODO(b/191663053)
-          "exclude-filter": "x86_single_step_syscall_x86_32"
-        }
-      ]
-    },
-    {
-      "name": "vts_linux_kselftest_x86_64",
-      "options": [
-        {
-          // TODO(b/191663053)
-          "exclude-filter": "x86_single_step_syscall_x86_64"
-        }
-      ]
-    }
-  ]
-}
diff --git a/linux_kselftest/testcases/Android.bp b/linux_kselftest/testcases/Android.bp
deleted file mode 100644
index eef39d0..0000000
--- a/linux_kselftest/testcases/Android.bp
+++ /dev/null
@@ -1,69 +0,0 @@
-//
-// Copyright (C) 2020 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.
-//
-
-package {
-    default_applicable_licenses: ["Android-Apache-2.0"],
-}
-
-sh_test {
-    name: "vts_linux_kselftest_arm_64",
-    src: "phony_kselftest_arm64.sh",
-    test_suites: [
-        "general-tests",
-        "vts"
-    ],
-    test_config: "vts_linux_kselftest_arm_64.xml",
-}
-
-sh_test {
-    name: "vts_linux_kselftest_arm_32",
-    src: "phony_kselftest_arm.sh",
-    test_suites: [
-        "general-tests",
-        "vts"
-    ],
-    test_config: "vts_linux_kselftest_arm_32.xml",
-}
-
-sh_test {
-    name: "vts_linux_kselftest_x86_64",
-    src: "phony_kselftest_x86_64.sh",
-    test_suites: [
-        "general-tests",
-        "vts"
-    ],
-    test_config: "vts_linux_kselftest_x86_64.xml",
-}
-
-sh_test {
-    name: "vts_linux_kselftest_x86_32",
-    src: "phony_kselftest_x86.sh",
-    test_suites: [
-        "general-tests",
-        "vts"
-    ],
-    test_config: "vts_linux_kselftest_x86_32.xml",
-}
-
-sh_test {
-    name: "vts_linux_kselftest_riscv_64",
-    src: "phony_kselftest_riscv64.sh",
-    test_suites: [
-        "general-tests",
-        "vts"
-    ],
-    test_config: "vts_linux_kselftest_riscv_64.xml",
-}
diff --git a/linux_kselftest/testcases/OWNERS b/linux_kselftest/testcases/OWNERS
deleted file mode 100644
index 1f6a131..0000000
--- a/linux_kselftest/testcases/OWNERS
+++ /dev/null
@@ -1,5 +0,0 @@
-# Bug component: 391836
[email protected]
[email protected]
[email protected]
-
diff --git a/linux_kselftest/testcases/phony_kselftest_arm.sh b/linux_kselftest/testcases/phony_kselftest_arm.sh
deleted file mode 100755
index e69de29..0000000
--- a/linux_kselftest/testcases/phony_kselftest_arm.sh
+++ /dev/null
diff --git a/linux_kselftest/testcases/phony_kselftest_arm64.sh b/linux_kselftest/testcases/phony_kselftest_arm64.sh
deleted file mode 100755
index e69de29..0000000
--- a/linux_kselftest/testcases/phony_kselftest_arm64.sh
+++ /dev/null
diff --git a/linux_kselftest/testcases/phony_kselftest_riscv64.sh b/linux_kselftest/testcases/phony_kselftest_riscv64.sh
deleted file mode 100755
index e69de29..0000000
--- a/linux_kselftest/testcases/phony_kselftest_riscv64.sh
+++ /dev/null
diff --git a/linux_kselftest/testcases/phony_kselftest_x86.sh b/linux_kselftest/testcases/phony_kselftest_x86.sh
deleted file mode 100755
index e69de29..0000000
--- a/linux_kselftest/testcases/phony_kselftest_x86.sh
+++ /dev/null
diff --git a/linux_kselftest/testcases/phony_kselftest_x86_64.sh b/linux_kselftest/testcases/phony_kselftest_x86_64.sh
deleted file mode 100755
index e69de29..0000000
--- a/linux_kselftest/testcases/phony_kselftest_x86_64.sh
+++ /dev/null
diff --git a/linux_kselftest/testcases/vts_linux_kselftest_arm_32.xml b/linux_kselftest/testcases/vts_linux_kselftest_arm_32.xml
deleted file mode 100644
index 45e4ce33..0000000
--- a/linux_kselftest/testcases/vts_linux_kselftest_arm_32.xml
+++ /dev/null
@@ -1,60 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2020 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.
--->
-<!DOCTYPE configuration [
-    <!ENTITY ktest_dir "/data/local/tmp/vts_kernel_kselftest_tests/DATA/nativetest/linux-kselftest">
-]>
-<configuration description="Runs vts_linux_kselftest.">
-    <target_preparer class="com.android.tradefed.targetprep.RootTargetPreparer" />
-    <target_preparer class="com.android.tradefed.targetprep.StopServicesSetup" />
-
-    <object type="module_controller" class="com.android.tradefed.testtype.suite.module.KernelTestModuleController" >
-        <option name="arch" value="arm"/>
-    </object>
-
-    <target_preparer class="com.android.tradefed.targetprep.PushFilePreparer">
-        <option name="cleanup" value="true" />
-        <option name="push" value="vts_kernel_kselftest_tests->/data/local/tmp/vts_kernel_kselftest_tests" />
-    </target_preparer>
-
-    <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
-        <option name="run-command" value='find &ktest_dir; -type f | xargs grep -l -e "bin/sh" -e "bin/bash" | xargs sed -i -e "s?/bin/echo?echo?" -i -e "s?#!/bin/sh?#!/system/bin/sh?" -i -e "s?#!/bin/bash?#!/system/bin/sh?"' />
-    </target_preparer>
-
-    <test class="com.android.tradefed.testtype.binary.KernelTargetTest" >
-        <option name="exit-code-skip" value="4" />
-        <option name="skip-binary-check" value="true" />
-        <option name="test-command-line" key="binderfs_arm_32" value="chmod 755 &ktest_dir;/filesystems/binderfs/binderfs_test; cd &ktest_dir;/filesystems/binderfs; ./binderfs_test" />
-        <option name="test-command-line" key="capabilities_test_execve_arm_32" value="chmod 755 &ktest_dir;/capabilities/test_execve; cd &ktest_dir;/capabilities; ./test_execve" />
-        <option name="test-command-line" key="futex_functional_run.sh_arm_32" value="chmod 755 &ktest_dir;/futex/functional/run.sh; cd &ktest_dir;/futex/functional; USE_COLOR=0 ./run.sh" />
-        <option name="test-command-line" key="kcmp_kcmp_test_arm_32" value="chmod 755 &ktest_dir;/kcmp/kcmp_test; cd &ktest_dir;/kcmp; ./kcmp_test" />
-        <option name="test-command-line" key="net_reuseaddr_conflict_arm_32" value="chmod 755 &ktest_dir;/net/reuseaddr_conflict; cd &ktest_dir;/net; ./reuseaddr_conflict" />
-        <option name="test-command-line" key="net_socket_arm_32" value="chmod 755 &ktest_dir;/net/socket; cd &ktest_dir;/net; ./socket" />
-        <option name="test-command-line" key="rtc_rtctest_arm_32" value="chmod 755 &ktest_dir;/rtc/rtctest; cd &ktest_dir;/rtc; ./rtctest" />
-        <option name="test-command-line" key="seccomp_seccomp_bpf_arm_32" value="chmod 755 &ktest_dir;/seccomp/seccomp_bpf; cd &ktest_dir;/seccomp; ./seccomp_bpf" />
-        <option name="test-command-line" key="size_get_size_arm_32" value="chmod 755 &ktest_dir;/size/get_size; cd &ktest_dir;/size; ./get_size" />
-        <option name="test-command-line" key="splice_default_file_splice_read.sh_arm_32" value="chmod 755 &ktest_dir;/splice/default_file_splice_read.sh; cd &ktest_dir;/splice; ./default_file_splice_read.sh" />
-        <option name="test-command-line" key="timers_inconsistency-check_arm_32" value="chmod 755 &ktest_dir;/timers/inconsistency-check; cd &ktest_dir;/timers; ./inconsistency-check" />
-        <option name="test-command-line" key="timers_nanosleep_arm_32" value="chmod 755 &ktest_dir;/timers/nanosleep; cd &ktest_dir;/timers; ./nanosleep" />
-        <option name="test-command-line" key="timers_nsleep-lat_arm_32" value="chmod 755 &ktest_dir;/timers/nsleep-lat; cd &ktest_dir;/timers; ./nsleep-lat" />
-        <option name="test-command-line" key="timers_posix_timers_arm_32" value="chmod 755 &ktest_dir;/timers/posix_timers; cd &ktest_dir;/timers; ./posix_timers" />
-        <option name="test-command-line" key="timers_raw_skew_arm_32" value="chmod 755 &ktest_dir;/timers/raw_skew; cd &ktest_dir;/timers; ./raw_skew" />
-        <option name="test-command-line" key="timers_set-tai_arm_32" value="chmod 755 &ktest_dir;/timers/set-tai; cd &ktest_dir;/timers; ./set-tai" />
-        <option name="test-command-line" key="timers_set-timer-lat_arm_32" value="chmod 755 &ktest_dir;/timers/set-timer-lat; cd &ktest_dir;/timers; ./set-timer-lat" />
-        <option name="test-command-line" key="timers_threadtest_arm_32" value="chmod 755 &ktest_dir;/timers/threadtest; cd &ktest_dir;/timers; ./threadtest" />
-        <option name="test-command-line" key="timers_valid-adjtimex_arm_32" value="chmod 755 &ktest_dir;/timers/valid-adjtimex; cd &ktest_dir;/timers; ./valid-adjtimex" />
-        <option name="test-command-line" key="vm_mremap_dontunmap_arm_32" value="chmod 755 &ktest_dir;/vm/mremap_dontunmap; cd &ktest_dir;/vm; ./mremap_dontunmap" />
-        <option name="test-command-line" key="vm_userfaultfd_anon_arm_32" value="chmod 755 &ktest_dir;/vm/userfaultfd; cd &ktest_dir;/vm; ./userfaultfd anon 32 99" />
-        <option name="test-command-line" key="vm_userfaultfd_shmem_arm_32" value="chmod 755 &ktest_dir;/vm/userfaultfd; cd &ktest_dir;/vm; ./userfaultfd shmem 32 99" />
-    </test>
-</configuration>
-
diff --git a/linux_kselftest/testcases/vts_linux_kselftest_arm_64.xml b/linux_kselftest/testcases/vts_linux_kselftest_arm_64.xml
deleted file mode 100644
index be1c8e4..0000000
--- a/linux_kselftest/testcases/vts_linux_kselftest_arm_64.xml
+++ /dev/null
@@ -1,69 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2020 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.
--->
-<!DOCTYPE configuration [
-    <!ENTITY ktest_dir "/data/local/tmp/vts_kernel_kselftest_tests/DATA/nativetest64/linux-kselftest">
-]>
-<configuration description="Runs vts_linux_kselftest.">
-    <target_preparer class="com.android.tradefed.targetprep.RootTargetPreparer" />
-    <target_preparer class="com.android.tradefed.targetprep.StopServicesSetup" />
-
-    <object type="module_controller" class="com.android.tradefed.testtype.suite.module.KernelTestModuleController" >
-        <option name="arch" value="arm64"/>
-    </object>
-
-    <target_preparer class="com.android.tradefed.targetprep.PushFilePreparer">
-        <option name="cleanup" value="true" />
-        <option name="push" value="vts_kernel_kselftest_tests->/data/local/tmp/vts_kernel_kselftest_tests" />
-    </target_preparer>
-
-    <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
-        <option name="run-command" value='find &ktest_dir; -type f | xargs grep -l -e "bin/sh" -e "bin/bash" | xargs sed -i -e "s?/bin/echo?echo?" -i -e "s?#!/bin/sh?#!/system/bin/sh?" -i -e "s?#!/bin/bash?#!/system/bin/sh?"' />
-    </target_preparer>
-
-    <test class="com.android.tradefed.testtype.binary.KernelTargetTest" >
-        <option name="exit-code-skip" value="4" />
-        <option name="skip-binary-check" value="true" />
-        <option name="test-command-line" key="binderfs_arm_64" value="chmod 755 &ktest_dir;/filesystems/binderfs/binderfs_test; cd &ktest_dir;/filesystems/binderfs; ./binderfs_test" />
-        <option name="test-command-line" key="breakpoints_breakpoint_test_arm64_arm_64" value="chmod 755 &ktest_dir;/breakpoints/breakpoint_test_arm64; cd &ktest_dir;/breakpoints; ./breakpoint_test_arm64" />
-        <option name="test-command-line" key="capabilities_test_execve_arm_64" value="chmod 755 &ktest_dir;/capabilities/test_execve; cd &ktest_dir;/capabilities; ./test_execve" />
-        <option name="test-command-line" key="futex_functional_run.sh_arm_64" value="chmod 755 &ktest_dir;/futex/functional/run.sh; cd &ktest_dir;/futex/functional; USE_COLOR=0 ./run.sh" />
-        <option name="test-command-line" key="kcmp_kcmp_test_arm_64" value="chmod 755 &ktest_dir;/kcmp/kcmp_test; cd &ktest_dir;/kcmp; ./kcmp_test" />
-        <option name="test-command-line" key="kvm_pvm_wipe_mem_arm_64" value="chmod 755 &ktest_dir;/kvm/aarch64/pvm_wipe_mem; cd &ktest_dir;/kvm/aarch64; ./pvm_wipe_mem" />
-        <option name="test-command-line" key="net_psock_tpacket_arm_64" value="chmod 755 &ktest_dir;/net/psock_tpacket; cd &ktest_dir;/net; ./psock_tpacket" />
-        <option name="test-command-line" key="net_reuseaddr_conflict_arm_64" value="chmod 755 &ktest_dir;/net/reuseaddr_conflict; cd &ktest_dir;/net; ./reuseaddr_conflict" />
-        <option name="test-command-line" key="net_socket_arm_64" value="chmod 755 &ktest_dir;/net/socket; cd &ktest_dir;/net; ./socket" />
-        <option name="test-command-line" key="ptrace_peeksiginfo_arm_64" value="chmod 755 &ktest_dir;/ptrace/peeksiginfo; cd &ktest_dir;/ptrace; ./peeksiginfo" />
-        <option name="test-command-line" key="rtc_rtctest_arm_64" value="chmod 755 &ktest_dir;/rtc/rtctest; cd &ktest_dir;/rtc; ./rtctest" />
-        <option name="test-command-line" key="seccomp_seccomp_bpf_arm_64" value="chmod 755 &ktest_dir;/seccomp/seccomp_bpf; cd &ktest_dir;/seccomp; ./seccomp_bpf" />
-        <option name="test-command-line" key="size_get_size_arm_64" value="chmod 755 &ktest_dir;/size/get_size; cd &ktest_dir;/size; ./get_size" />
-        <option name="test-command-line" key="splice_default_file_splice_read.sh_arm_64" value="chmod 755 &ktest_dir;/splice/default_file_splice_read.sh; cd &ktest_dir;/splice; ./default_file_splice_read.sh" />
-        <option name="test-command-line" key="timers_inconsistency-check_arm_64" value="chmod 755 &ktest_dir;/timers/inconsistency-check; cd &ktest_dir;/timers; ./inconsistency-check" />
-        <option name="test-command-line" key="timers_nanosleep_arm_64" value="chmod 755 &ktest_dir;/timers/nanosleep; cd &ktest_dir;/timers; ./nanosleep" />
-        <option name="test-command-line" key="timers_nsleep-lat_arm_64" value="chmod 755 &ktest_dir;/timers/nsleep-lat; cd &ktest_dir;/timers; ./nsleep-lat" />
-        <option name="test-command-line" key="timers_posix_timers_arm_64" value="chmod 755 &ktest_dir;/timers/posix_timers; cd &ktest_dir;/timers; ./posix_timers" />
-        <option name="test-command-line" key="timers_raw_skew_arm_64" value="chmod 755 &ktest_dir;/timers/raw_skew; cd &ktest_dir;/timers; ./raw_skew" />
-        <option name="test-command-line" key="timers_set-tai_arm_64" value="chmod 755 &ktest_dir;/timers/set-tai; cd &ktest_dir;/timers; ./set-tai" />
-        <option name="test-command-line" key="timers_set-timer-lat_arm_64" value="chmod 755 &ktest_dir;/timers/set-timer-lat; cd &ktest_dir;/timers; ./set-timer-lat" />
-        <option name="test-command-line" key="timers_threadtest_arm_64" value="chmod 755 &ktest_dir;/timers/threadtest; cd &ktest_dir;/timers; ./threadtest" />
-        <option name="test-command-line" key="timers_valid-adjtimex_arm_64" value="chmod 755 &ktest_dir;/timers/valid-adjtimex; cd &ktest_dir;/timers; ./valid-adjtimex" />
-        <option name="test-command-line" key="vDSO_kselftest_vdso_test_abi_arm_64" value="chmod 755 &ktest_dir;/vDSO/kselftest_vdso_test_abi; cd &ktest_dir;/vDSO; ./kselftest_vdso_test_abi" />
-        <option name="test-command-line" key="vDSO_kselftest_vdso_test_clock_getres_arm_64" value="chmod 755 &ktest_dir;/vDSO/kselftest_vdso_test_clock_getres; cd &ktest_dir;/vDSO; ./kselftest_vdso_test_clock_getres" />
-        <option name="test-command-line" key="vDSO_kselftest_vdso_test_getcpu_arm_64" value="chmod 755 &ktest_dir;/vDSO/kselftest_vdso_test_getcpu; cd &ktest_dir;/vDSO; ./kselftest_vdso_test_getcpu" />
-        <option name="test-command-line" key="vDSO_kselftest_vdso_test_gettimeofday_arm_64" value="chmod 755 &ktest_dir;/vDSO/kselftest_vdso_test_gettimeofday; cd &ktest_dir;/vDSO; ./kselftest_vdso_test_gettimeofday" />
-        <option name="test-command-line" key="vm_mremap_dontunmap_arm_64" value="chmod 755 &ktest_dir;/vm/mremap_dontunmap; cd &ktest_dir;/vm; ./mremap_dontunmap" />
-        <option name="test-command-line" key="vm_mremap_test_arm_64" value="chmod 755 &ktest_dir;/vm/mremap_test; cd &ktest_dir;/vm; ./mremap_test" />
-        <option name="test-command-line" key="vm_userfaultfd_anon_arm_64" value="chmod 755 &ktest_dir;/vm/userfaultfd; cd &ktest_dir;/vm; ./userfaultfd anon 32 99" />
-        <option name="test-command-line" key="vm_userfaultfd_shmem_arm_64" value="chmod 755 &ktest_dir;/vm/userfaultfd; cd &ktest_dir;/vm; ./userfaultfd shmem 32 99" />
-    </test>
-</configuration>
-
diff --git a/linux_kselftest/testcases/vts_linux_kselftest_riscv_64.xml b/linux_kselftest/testcases/vts_linux_kselftest_riscv_64.xml
deleted file mode 100644
index 6339073..0000000
--- a/linux_kselftest/testcases/vts_linux_kselftest_riscv_64.xml
+++ /dev/null
@@ -1,57 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2020 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.
--->
-<!DOCTYPE configuration [
-    <!ENTITY ktest_dir "/data/local/tmp/vts_kernel_tests/DATA/nativetest64/linux-kselftest">
-]>
-<configuration description="Runs vts_linux_kselftest.">
-    <target_preparer class="com.android.tradefed.targetprep.RootTargetPreparer" />
-    <target_preparer class="com.android.tradefed.targetprep.StopServicesSetup" />
-
-    <object type="module_controller" class="com.android.tradefed.testtype.suite.module.KernelTestModuleController" >
-        <option name="arch" value="riscv64"/>
-    </object>
-
-    <target_preparer class="com.android.tradefed.targetprep.PushFilePreparer">
-        <option name="cleanup" value="true" />
-        <option name="push" value="vts_kernel_tests->/data/local/tmp/vts_kernel_tests" />
-    </target_preparer>
-
-    <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
-        <option name="run-command" value='find &ktest_dir; -type f | xargs grep -l -e "bin/sh" -e "bin/bash" | xargs sed -i -e "s?/bin/echo?echo?" -i -e "s?#!/bin/sh?#!/system/bin/sh?" -i -e "s?#!/bin/bash?#!/system/bin/sh?"' />
-    </target_preparer>
-
-    <test class="com.android.tradefed.testtype.binary.ExecutableTargetTest" >
-        <option name="test-command-line" key="capabilities_test_execve_riscv_64" value="chmod 755 &ktest_dir;/capabilities/test_execve; cd &ktest_dir;/capabilities; ./test_execve" />
-        <option name="test-command-line" key="futex_functional_run.sh_riscv_64" value="chmod 755 &ktest_dir;/futex/functional/run.sh; cd &ktest_dir;/futex/functional; ./run.sh" />
-        <option name="test-command-line" key="kcmp_kcmp_test_riscv_64" value="chmod 755 &ktest_dir;/kcmp/kcmp_test; cd &ktest_dir;/kcmp; ./kcmp_test" />
-        <option name="test-command-line" key="net_psock_tpacket_riscv_64" value="chmod 755 &ktest_dir;/net/psock_tpacket; cd &ktest_dir;/net; ./psock_tpacket" />
-        <option name="test-command-line" key="net_reuseaddr_conflict_riscv_64" value="chmod 755 &ktest_dir;/net/reuseaddr_conflict; cd &ktest_dir;/net; ./reuseaddr_conflict" />
-        <option name="test-command-line" key="net_socket_riscv_64" value="chmod 755 &ktest_dir;/net/socket; cd &ktest_dir;/net; ./socket" />
-        <option name="test-command-line" key="ptrace_peeksiginfo_riscv_64" value="chmod 755 &ktest_dir;/ptrace/peeksiginfo; cd &ktest_dir;/ptrace; ./peeksiginfo" />
-        <option name="test-command-line" key="rtc_rtctest_riscv_64" value="chmod 755 &ktest_dir;/rtc/rtctest; cd &ktest_dir;/rtc; ./rtctest" />
-        <option name="test-command-line" key="seccomp_seccomp_bpf_riscv_64" value="chmod 755 &ktest_dir;/seccomp/seccomp_bpf; cd &ktest_dir;/seccomp; ./seccomp_bpf" />
-        <option name="test-command-line" key="size_get_size_riscv_64" value="chmod 755 &ktest_dir;/size/get_size; cd &ktest_dir;/size; ./get_size" />
-        <option name="test-command-line" key="splice_default_file_splice_read.sh_riscv_64" value="chmod 755 &ktest_dir;/splice/default_file_splice_read.sh; cd &ktest_dir;/splice; ./default_file_splice_read.sh" />
-        <option name="test-command-line" key="timers_inconsistency-check_riscv_64" value="chmod 755 &ktest_dir;/timers/inconsistency-check; cd &ktest_dir;/timers; ./inconsistency-check" />
-        <option name="test-command-line" key="timers_nanosleep_riscv_64" value="chmod 755 &ktest_dir;/timers/nanosleep; cd &ktest_dir;/timers; ./nanosleep" />
-        <option name="test-command-line" key="timers_nsleep-lat_riscv_64" value="chmod 755 &ktest_dir;/timers/nsleep-lat; cd &ktest_dir;/timers; ./nsleep-lat" />
-        <option name="test-command-line" key="timers_posix_timers_riscv_64" value="chmod 755 &ktest_dir;/timers/posix_timers; cd &ktest_dir;/timers; ./posix_timers" />
-        <option name="test-command-line" key="timers_raw_skew_riscv_64" value="chmod 755 &ktest_dir;/timers/raw_skew; cd &ktest_dir;/timers; ./raw_skew" />
-        <option name="test-command-line" key="timers_set-tai_riscv_64" value="chmod 755 &ktest_dir;/timers/set-tai; cd &ktest_dir;/timers; ./set-tai" />
-        <option name="test-command-line" key="timers_set-timer-lat_riscv_64" value="chmod 755 &ktest_dir;/timers/set-timer-lat; cd &ktest_dir;/timers; ./set-timer-lat" />
-        <option name="test-command-line" key="timers_threadtest_riscv_64" value="chmod 755 &ktest_dir;/timers/threadtest; cd &ktest_dir;/timers; ./threadtest" />
-        <option name="test-command-line" key="timers_valid-adjtimex_riscv_64" value="chmod 755 &ktest_dir;/timers/valid-adjtimex; cd &ktest_dir;/timers; ./valid-adjtimex" />
-        <option name="test-command-line" key="vDSO_kselftest_vdso_test_riscv_64" value="chmod 755 &ktest_dir;/vDSO/kselftest_vdso_test; cd &ktest_dir;/vDSO; ./kselftest_vdso_test" />
-    </test>
-</configuration>
-
diff --git a/linux_kselftest/testcases/vts_linux_kselftest_x86_32.xml b/linux_kselftest/testcases/vts_linux_kselftest_x86_32.xml
deleted file mode 100644
index 8b24dff..0000000
--- a/linux_kselftest/testcases/vts_linux_kselftest_x86_32.xml
+++ /dev/null
@@ -1,75 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2020 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.
--->
-<!DOCTYPE configuration [
-    <!ENTITY ktest_dir "/data/local/tmp/vts_kernel_kselftest_tests/DATA/nativetest/linux-kselftest">
-]>
-<configuration description="Runs vts_linux_kselftest.">
-    <target_preparer class="com.android.tradefed.targetprep.RootTargetPreparer" />
-    <target_preparer class="com.android.tradefed.targetprep.StopServicesSetup" />
-
-    <object type="module_controller" class="com.android.tradefed.testtype.suite.module.KernelTestModuleController" >
-        <option name="arch" value="x86"/>
-    </object>
-
-    <target_preparer class="com.android.tradefed.targetprep.PushFilePreparer">
-        <option name="cleanup" value="true" />
-        <option name="push-file" key="vts_kernel_kselftest_tests" value="/data/local/tmp/vts_kernel_kselftest_tests" />
-        <option name="skip-abi-filtering" value="true" />
-    </target_preparer>
-
-    <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
-        <option name="run-command" value='find &ktest_dir; -type f | xargs grep -l -e "bin/sh" -e "bin/bash" | xargs sed -i -e "s?/bin/echo?echo?" -i -e "s?#!/bin/sh?#!/system/bin/sh?" -i -e "s?#!/bin/bash?#!/system/bin/sh?"' />
-    </target_preparer>
-
-    <test class="com.android.tradefed.testtype.binary.KernelTargetTest" >
-        <option name="exit-code-skip" value="4" />
-        <option name="skip-binary-check" value="true" />
-        <option name="test-command-line" key="binderfs_x86_32" value="chmod 755 &ktest_dir;/filesystems/binderfs/binderfs_test; cd &ktest_dir;/filesystems/binderfs; ./binderfs_test" />
-        <option name="test-command-line" key="capabilities_test_execve_x86_32" value="chmod 755 &ktest_dir;/capabilities/test_execve; cd &ktest_dir;/capabilities; ./test_execve" />
-        <option name="test-command-line" key="futex_functional_run.sh_x86_32" value="chmod 755 &ktest_dir;/futex/functional/run.sh; cd &ktest_dir;/futex/functional; USE_COLOR=0 ./run.sh" />
-        <option name="test-command-line" key="kcmp_kcmp_test_x86_32" value="chmod 755 &ktest_dir;/kcmp/kcmp_test; cd &ktest_dir;/kcmp; ./kcmp_test" />
-        <option name="test-command-line" key="net_reuseaddr_conflict_x86_32" value="chmod 755 &ktest_dir;/net/reuseaddr_conflict; cd &ktest_dir;/net; ./reuseaddr_conflict" />
-        <option name="test-command-line" key="net_socket_x86_32" value="chmod 755 &ktest_dir;/net/socket; cd &ktest_dir;/net; ./socket" />
-        <option name="test-command-line" key="rtc_rtctest_x86_32" value="chmod 755 &ktest_dir;/rtc/rtctest; cd &ktest_dir;/rtc; ./rtctest" />
-        <option name="test-command-line" key="seccomp_seccomp_bpf_x86_32" value="chmod 755 &ktest_dir;/seccomp/seccomp_bpf; cd &ktest_dir;/seccomp; ./seccomp_bpf" />
-        <option name="test-command-line" key="size_get_size_x86_32" value="chmod 755 &ktest_dir;/size/get_size; cd &ktest_dir;/size; ./get_size" />
-        <option name="test-command-line" key="splice_default_file_splice_read.sh_x86_32" value="chmod 755 &ktest_dir;/splice/default_file_splice_read.sh; cd &ktest_dir;/splice; ./default_file_splice_read.sh" />
-        <option name="test-command-line" key="timers_inconsistency-check_x86_32" value="chmod 755 &ktest_dir;/timers/inconsistency-check; cd &ktest_dir;/timers; ./inconsistency-check" />
-        <option name="test-command-line" key="timers_nanosleep_x86_32" value="chmod 755 &ktest_dir;/timers/nanosleep; cd &ktest_dir;/timers; ./nanosleep" />
-        <option name="test-command-line" key="timers_nsleep-lat_x86_32" value="chmod 755 &ktest_dir;/timers/nsleep-lat; cd &ktest_dir;/timers; ./nsleep-lat" />
-        <option name="test-command-line" key="timers_posix_timers_x86_32" value="chmod 755 &ktest_dir;/timers/posix_timers; cd &ktest_dir;/timers; ./posix_timers" />
-        <option name="test-command-line" key="timers_raw_skew_x86_32" value="chmod 755 &ktest_dir;/timers/raw_skew; cd &ktest_dir;/timers; ./raw_skew" />
-        <option name="test-command-line" key="timers_set-tai_x86_32" value="chmod 755 &ktest_dir;/timers/set-tai; cd &ktest_dir;/timers; ./set-tai" />
-        <option name="test-command-line" key="timers_set-timer-lat_x86_32" value="chmod 755 &ktest_dir;/timers/set-timer-lat; cd &ktest_dir;/timers; ./set-timer-lat" />
-        <option name="test-command-line" key="timers_threadtest_x86_32" value="chmod 755 &ktest_dir;/timers/threadtest; cd &ktest_dir;/timers; ./threadtest" />
-        <option name="test-command-line" key="timers_valid-adjtimex_x86_32" value="chmod 755 &ktest_dir;/timers/valid-adjtimex; cd &ktest_dir;/timers; ./valid-adjtimex" />
-        <option name="test-command-line" key="x86_single_step_syscall_x86_32" value="chmod 755 &ktest_dir;/x86/single_step_syscall; cd &ktest_dir;/x86; ./single_step_syscall" />
-        <option name="test-command-line" key="x86_sysret_ss_attrs_x86_32" value="chmod 755 &ktest_dir;/x86/sysret_ss_attrs; cd &ktest_dir;/x86; ./sysret_ss_attrs" />
-        <option name="test-command-line" key="x86_syscall_nt_x86_32" value="chmod 755 &ktest_dir;/x86/syscall_nt; cd &ktest_dir;/x86; ./syscall_nt" />
-        <option name="test-command-line" key="x86_ptrace_syscall_x86_32" value="chmod 755 &ktest_dir;/x86/ptrace_syscall; cd &ktest_dir;/x86; ./ptrace_syscall" />
-        <option name="test-command-line" key="x86_test_mremap_vdso_x86_32" value="chmod 755 &ktest_dir;/x86/test_mremap_vdso; cd &ktest_dir;/x86; ./test_mremap_vdso" />
-        <option name="test-command-line" key="x86_check_initial_reg_state_x86_32" value="chmod 755 &ktest_dir;/x86/check_initial_reg_state; cd &ktest_dir;/x86; ./check_initial_reg_state" />
-        <option name="test-command-line" key="x86_ldt_gdt_x86_32" value="chmod 755 &ktest_dir;/x86/ldt_gdt; cd &ktest_dir;/x86; ./ldt_gdt" />
-        <option name="test-command-line" key="x86_syscall_arg_fault_x86_32" value="chmod 755 &ktest_dir;/x86/syscall_arg_fault; cd &ktest_dir;/x86; ./syscall_arg_fault" />
-        <option name="test-command-line" key="x86_test_syscall_vdso_x86_32" value="chmod 755 &ktest_dir;/x86/test_syscall_vdso; cd &ktest_dir;/x86; ./test_syscall_vdso" />
-        <option name="test-command-line" key="x86_unwind_vdso_x86_32" value="chmod 755 &ktest_dir;/x86/unwind_vdso; cd &ktest_dir;/x86; ./unwind_vdso" />
-        <option name="test-command-line" key="x86_test_FCMOV_x86_32" value="chmod 755 &ktest_dir;/x86/test_FCMOV; cd &ktest_dir;/x86; ./test_FCMOV" />
-        <option name="test-command-line" key="x86_test_FCOMI_x86_32" value="chmod 755 &ktest_dir;/x86/test_FCOMI; cd &ktest_dir;/x86; ./test_FCOMI" />
-        <option name="test-command-line" key="x86_test_FISTTP_x86_32" value="chmod 755 &ktest_dir;/x86/test_FISTTP; cd &ktest_dir;/x86; ./test_FISTTP" />
-        <option name="test-command-line" key="x86_vdso_restorer_x86_32" value="chmod 755 &ktest_dir;/x86/vdso_restorer; cd &ktest_dir;/x86; ./vdso_restorer" />
-        <option name="test-command-line" key="vm_mremap_dontunmap_x86_32" value="chmod 755 &ktest_dir;/vm/mremap_dontunmap; cd &ktest_dir;/vm; ./mremap_dontunmap" />
-        <option name="test-command-line" key="vm_userfaultfd_anon_x86_32" value="chmod 755 &ktest_dir;/vm/userfaultfd; cd &ktest_dir;/vm; ./userfaultfd anon 32 99" />
-        <option name="test-command-line" key="vm_userfaultfd_shmem_x86_32" value="chmod 755 &ktest_dir;/vm/userfaultfd; cd &ktest_dir;/vm; ./userfaultfd shmem 32 99" />
-    </test>
-</configuration>
-
diff --git a/linux_kselftest/testcases/vts_linux_kselftest_x86_64.xml b/linux_kselftest/testcases/vts_linux_kselftest_x86_64.xml
deleted file mode 100644
index 9dd513c..0000000
--- a/linux_kselftest/testcases/vts_linux_kselftest_x86_64.xml
+++ /dev/null
@@ -1,74 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2020 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.
--->
-<!DOCTYPE configuration [
-    <!ENTITY ktest_dir "/data/local/tmp/vts_kernel_kselftest_tests/DATA/nativetest64/linux-kselftest">
-]>
-<configuration description="Runs vts_linux_kselftest.">
-    <target_preparer class="com.android.tradefed.targetprep.RootTargetPreparer" />
-    <target_preparer class="com.android.tradefed.targetprep.StopServicesSetup" />
-
-    <object type="module_controller" class="com.android.tradefed.testtype.suite.module.KernelTestModuleController" >
-        <option name="arch" value="x86_64"/>
-    </object>
-
-    <target_preparer class="com.android.tradefed.targetprep.PushFilePreparer">
-        <option name="cleanup" value="true" />
-        <option name="push-file" key="vts_kernel_kselftest_tests" value="/data/local/tmp/vts_kernel_kselftest_tests" />
-        <option name="skip-abi-filtering" value="true" />
-    </target_preparer>
-
-    <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
-        <option name="run-command" value='find &ktest_dir; -type f | xargs grep -l -e "bin/sh" -e "bin/bash" | xargs sed -i -e "s?/bin/echo?echo?" -i -e "s?#!/bin/sh?#!/system/bin/sh?" -i -e "s?#!/bin/bash?#!/system/bin/sh?"' />
-    </target_preparer>
-
-    <test class="com.android.tradefed.testtype.binary.KernelTargetTest" >
-        <option name="exit-code-skip" value="4" />
-        <option name="skip-binary-check" value="true" />
-        <option name="test-command-line" key="binderfs_x86_64" value="chmod 755 &ktest_dir;/filesystems/binderfs/binderfs_test; cd &ktest_dir;/filesystems/binderfs; ./binderfs_test" />
-        <option name="test-command-line" key="capabilities_test_execve_x86_64" value="chmod 755 &ktest_dir;/capabilities/test_execve; cd &ktest_dir;/capabilities; ./test_execve" />
-        <option name="test-command-line" key="futex_functional_run.sh_x86_64" value="chmod 755 &ktest_dir;/futex/functional/run.sh; cd &ktest_dir;/futex/functional; USE_COLOR=0 ./run.sh" />
-        <option name="test-command-line" key="kcmp_kcmp_test_x86_64" value="chmod 755 &ktest_dir;/kcmp/kcmp_test; cd &ktest_dir;/kcmp; ./kcmp_test" />
-        <option name="test-command-line" key="net_psock_tpacket_x86_64" value="chmod 755 &ktest_dir;/net/psock_tpacket; cd &ktest_dir;/net; ./psock_tpacket" />
-        <option name="test-command-line" key="net_reuseaddr_conflict_x86_64" value="chmod 755 &ktest_dir;/net/reuseaddr_conflict; cd &ktest_dir;/net; ./reuseaddr_conflict" />
-        <option name="test-command-line" key="net_socket_x86_64" value="chmod 755 &ktest_dir;/net/socket; cd &ktest_dir;/net; ./socket" />
-        <option name="test-command-line" key="ptrace_peeksiginfo_x86_64" value="chmod 755 &ktest_dir;/ptrace/peeksiginfo; cd &ktest_dir;/ptrace; ./peeksiginfo" />
-        <option name="test-command-line" key="rtc_rtctest_x86_64" value="chmod 755 &ktest_dir;/rtc/rtctest; cd &ktest_dir;/rtc; ./rtctest" />
-        <option name="test-command-line" key="seccomp_seccomp_bpf_x86_64" value="chmod 755 &ktest_dir;/seccomp/seccomp_bpf; cd &ktest_dir;/seccomp; ./seccomp_bpf" />
-        <option name="test-command-line" key="size_get_size_x86_64" value="chmod 755 &ktest_dir;/size/get_size; cd &ktest_dir;/size; ./get_size" />
-        <option name="test-command-line" key="splice_default_file_splice_read.sh_x86_64" value="chmod 755 &ktest_dir;/splice/default_file_splice_read.sh; cd &ktest_dir;/splice; ./default_file_splice_read.sh" />
-        <option name="test-command-line" key="timers_inconsistency-check_x86_64" value="chmod 755 &ktest_dir;/timers/inconsistency-check; cd &ktest_dir;/timers; ./inconsistency-check" />
-        <option name="test-command-line" key="timers_nanosleep_x86_64" value="chmod 755 &ktest_dir;/timers/nanosleep; cd &ktest_dir;/timers; ./nanosleep" />
-        <option name="test-command-line" key="timers_nsleep-lat_x86_64" value="chmod 755 &ktest_dir;/timers/nsleep-lat; cd &ktest_dir;/timers; ./nsleep-lat" />
-        <option name="test-command-line" key="timers_posix_timers_x86_64" value="chmod 755 &ktest_dir;/timers/posix_timers; cd &ktest_dir;/timers; ./posix_timers" />
-        <option name="test-command-line" key="timers_raw_skew_x86_64" value="chmod 755 &ktest_dir;/timers/raw_skew; cd &ktest_dir;/timers; ./raw_skew" />
-        <option name="test-command-line" key="timers_set-tai_x86_64" value="chmod 755 &ktest_dir;/timers/set-tai; cd &ktest_dir;/timers; ./set-tai" />
-        <option name="test-command-line" key="timers_set-timer-lat_x86_64" value="chmod 755 &ktest_dir;/timers/set-timer-lat; cd &ktest_dir;/timers; ./set-timer-lat" />
-        <option name="test-command-line" key="timers_threadtest_x86_64" value="chmod 755 &ktest_dir;/timers/threadtest; cd &ktest_dir;/timers; ./threadtest" />
-        <option name="test-command-line" key="timers_valid-adjtimex_x86_64" value="chmod 755 &ktest_dir;/timers/valid-adjtimex; cd &ktest_dir;/timers; ./valid-adjtimex" />
-        <option name="test-command-line" key="vDSO_kselftest_vdso_test_abi_x86_64" value="chmod 755 &ktest_dir;/vDSO/kselftest_vdso_test_abi; cd &ktest_dir;/vDSO; ./kselftest_vdso_test_abi" />
-        <option name="test-command-line" key="vDSO_kselftest_vdso_test_clock_getres_x86_64" value="chmod 755 &ktest_dir;/vDSO/kselftest_vdso_test_clock_getres; cd &ktest_dir;/vDSO; ./kselftest_vdso_test_clock_getres" />
-        <option name="test-command-line" key="vDSO_kselftest_vdso_test_getcpu_x86_64" value="chmod 755 &ktest_dir;/vDSO/kselftest_vdso_test_getcpu; cd &ktest_dir;/vDSO; ./kselftest_vdso_test_getcpu" />
-        <option name="test-command-line" key="vDSO_kselftest_vdso_test_gettimeofday_x86_64" value="chmod 755 &ktest_dir;/vDSO/kselftest_vdso_test_gettimeofday; cd &ktest_dir;/vDSO; ./kselftest_vdso_test_gettimeofday" />
-        <option name="test-command-line" key="x86_single_step_syscall_x86_64" value="chmod 755 &ktest_dir;/x86/single_step_syscall; cd &ktest_dir;/x86; ./single_step_syscall" />
-        <option name="test-command-line" key="x86_syscall_nt_x86_64" value="chmod 755 &ktest_dir;/x86/syscall_nt; cd &ktest_dir;/x86; ./syscall_nt" />
-        <option name="test-command-line" key="x86_ptrace_syscall_x86_64" value="chmod 755 &ktest_dir;/x86/ptrace_syscall; cd &ktest_dir;/x86; ./ptrace_syscall" />
-        <option name="test-command-line" key="x86_test_mremap_vdso_x86_64" value="chmod 755 &ktest_dir;/x86/test_mremap_vdso; cd &ktest_dir;/x86; ./test_mremap_vdso" />
-        <option name="test-command-line" key="x86_check_initial_reg_state_x86_64" value="chmod 755 &ktest_dir;/x86/check_initial_reg_state; cd &ktest_dir;/x86; ./check_initial_reg_state" />
-        <option name="test-command-line" key="x86_ldt_gdt_x86_64" value="chmod 755 &ktest_dir;/x86/ldt_gdt; cd &ktest_dir;/x86; ./ldt_gdt" />
-        <option name="test-command-line" key="vm_mremap_dontunmap_x86_64" value="chmod 755 &ktest_dir;/vm/mremap_dontunmap; cd &ktest_dir;/vm; ./mremap_dontunmap" />
-        <option name="test-command-line" key="vm_mremap_test_x86_64" value="chmod 755 &ktest_dir;/vm/mremap_test; cd &ktest_dir;/vm; ./mremap_test" />
-        <option name="test-command-line" key="vm_userfaultfd_anon_x86_64" value="chmod 755 &ktest_dir;/vm/userfaultfd; cd &ktest_dir;/vm; ./userfaultfd anon 32 99" />
-        <option name="test-command-line" key="vm_userfaultfd_shmem_x86_64" value="chmod 755 &ktest_dir;/vm/userfaultfd; cd &ktest_dir;/vm; ./userfaultfd shmem 32 99" />
-    </test>
-</configuration>
-
diff --git a/loop/TEST_MAPPING b/loop/TEST_MAPPING
new file mode 100644
index 0000000..f443dfc
--- /dev/null
+++ b/loop/TEST_MAPPING
@@ -0,0 +1,12 @@
+{
+  "postsubmit": [
+    {
+      "name": "vts_kernel_loopconfig_test"
+    }
+  ],
+  "kernel-presubmit": [
+    {
+      "name": "vts_kernel_loopconfig_test"
+    }
+  ]
+}
diff --git a/ltp/OWNERS b/ltp/OWNERS
index df9e29c..66f12c4 100644
--- a/ltp/OWNERS
+++ b/ltp/OWNERS
@@ -3,4 +3,3 @@
 [email protected]
 [email protected]
 [email protected]
[email protected]
diff --git a/ltp/TEST_MAPPING b/ltp/TEST_MAPPING
new file mode 100644
index 0000000..621dd29
--- /dev/null
+++ b/ltp/TEST_MAPPING
@@ -0,0 +1,1050 @@
+{
+  "presubmit": [
+    {
+      "name": "vts_ltp_test_arm",
+      "options": [
+        {
+          // vts_slow_ltp_tests_arm
+          "exclude-filter": "controllers.memcg_regression_32bit"
+        },
+        {
+          "exclude-filter": "cve.cve-2011-0999_32bit"
+        },
+        {
+          "exclude-filter": "cve.cve-2015-7550_32bit"
+        },
+        {
+          "exclude-filter": "cve.cve-2016-7117_32bit"
+        },
+        {
+          "exclude-filter": "cve.cve-2017-2671_32bit"
+        },
+        {
+          "exclude-filter": "dio.dio15_32bit"
+        },
+        {
+          "exclude-filter": "dio.dio16_32bit"
+        },
+        {
+          "exclude-filter": "dio.dio17_32bit"
+        },
+        {
+          "exclude-filter": "dio.dio19_32bit"
+        },
+        {
+          "exclude-filter": "dio.dio20_32bit"
+        },
+        {
+          "exclude-filter": "dio.dio21_32bit"
+        },
+        {
+          "exclude-filter": "dio.dio23_32bit"
+        },
+        {
+          "exclude-filter": "dio.dio24_32bit"
+        },
+        {
+          "exclude-filter": "dio.dio25_32bit"
+        },
+        {
+          "exclude-filter": "dio.dio27_32bit"
+        },
+        {
+          "exclude-filter": "dio.dio28_32bit"
+        },
+        {
+          "exclude-filter": "fs.fs_di_32bit"
+        },
+        {
+          "exclude-filter": "fs.fs_fill_32bit"
+        },
+        {
+          "exclude-filter": "fs.fs_inod01_32bit"
+        },
+        {
+          "exclude-filter": "fs.linker01_32bit"
+        },
+        {
+          "exclude-filter": "mm.mmapstress01_32bit"
+        },
+        {
+          "exclude-filter": "mm.mmapstress06_32bit"
+        },
+        {
+          "exclude-filter": "mm.mmapstress09_32bit"
+        },
+        {
+          "exclude-filter": "mm.mtest06_32bit"
+        },
+        {
+          "exclude-filter": "mm.mtest06_32bit"
+        },
+        {
+          "exclude-filter": "nptl.nptl01_32bit"
+        },
+        {
+          "exclude-filter": "pty.pty01_32bit"
+        },
+        {
+          "exclude-filter": "sched.hackbench01_32bit"
+        },
+        {
+          "exclude-filter": "sched.hackbench02_32bit"
+        },
+        {
+          "exclude-filter": "syscalls.copy_file_range01_32bit"
+        },
+        {
+          "exclude-filter": "syscalls.fallocate05_32bit"
+        },
+        {
+          "exclude-filter": "syscalls.fcntl15_32bit"
+        },
+        {
+          "exclude-filter": "syscalls.fcntl15_64_32bit"
+        },
+        {
+          "exclude-filter": "syscalls.gettimeofday02_32bit"
+        },
+        {
+          "exclude-filter": "syscalls.inotify09_32bit"
+        },
+        {
+          "exclude-filter": "syscalls.keyctl02_32bit"
+        },
+        {
+          "exclude-filter": "syscalls.kill02_32bit"
+        },
+        {
+          "exclude-filter": "syscalls.mkdir09_32bit"
+        },
+        {
+          "exclude-filter": "syscalls.readahead02_32bit"
+        },
+        {
+          "exclude-filter": "syscalls.waitid01_32bit"
+        }
+      ]
+    },
+    {
+      "name": "vts_ltp_test_arm_64",
+      "options": [
+        {
+          // vts_slow_ltp_tests_arm
+          "exclude-filter": "controllers.memcg_regression_64bit"
+        },
+        {
+          "exclude-filter": "cve.cve-2011-0999_64bit"
+        },
+        {
+          "exclude-filter": "cve.cve-2015-7550_64bit"
+        },
+        {
+          "exclude-filter": "cve.cve-2016-7117_64bit"
+        },
+        {
+          "exclude-filter": "cve.cve-2017-2671_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio15_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio16_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio17_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio19_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio20_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio21_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio23_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio24_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio25_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio27_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio28_64bit"
+        },
+        {
+          "exclude-filter": "fs.fs_di_64bit"
+        },
+        {
+          "exclude-filter": "fs.fs_fill_64bit"
+        },
+        {
+          "exclude-filter": "fs.fs_inod01_64bit"
+        },
+        {
+          "exclude-filter": "fs.linker01_64bit"
+        },
+        {
+          "exclude-filter": "mm.mmapstress01_64bit"
+        },
+        {
+          "exclude-filter": "mm.mmapstress06_64bit"
+        },
+        {
+          "exclude-filter": "mm.mmapstress09_64bit"
+        },
+        {
+          "exclude-filter": "nptl.nptl01_64bit"
+        },
+        {
+          "exclude-filter": "pty.pty01_64bit"
+        },
+        {
+          "exclude-filter": "sched.hackbench01_64bit"
+        },
+        {
+          "exclude-filter": "sched.hackbench02_64bit"
+        },
+        {
+          "exclude-filter": "syscalls.copy_file_range01_64bit"
+        },
+        {
+          "exclude-filter": "syscalls.fallocate05_64bit"
+        },
+        {
+          "exclude-filter": "syscalls.fcntl15_64_64bit"
+        },
+        {
+          "exclude-filter": "syscalls.fcntl15_64bit"
+        },
+        {
+          "exclude-filter": "syscalls.gettimeofday02_64bit"
+        },
+        {
+          "exclude-filter": "syscalls.inotify09_64bit"
+        },
+        {
+          "exclude-filter": "syscalls.keyctl02_64bit"
+        },
+        {
+          "exclude-filter": "syscalls.kill02_64bit"
+        },
+        {
+          "exclude-filter": "syscalls.mkdir09_64bit"
+        },
+        {
+          "exclude-filter": "syscalls.readahead02_64bit"
+        },
+        {
+          "exclude-filter": "syscalls.waitid01_64bit"
+        }
+      ]
+    },
+    {
+      "name": "vts_ltp_test_x86",
+      "options": [
+        {
+          // vts_slow_ltp_tests_x86
+          "exclude-filter": "controllers.memcg_regression_32bit"
+        },
+        {
+          "exclude-filter": "cve.cve-2011-0999_32bit"
+        },
+        {
+          "exclude-filter": "cve.cve-2015-7550_32bit"
+        },
+        {
+          "exclude-filter": "cve.cve-2016-7117_32bit"
+        },
+        {
+          "exclude-filter": "cve.cve-2017-2671_32bit"
+        },
+        {
+          "exclude-filter": "dio.dio15_32bit"
+        },
+        {
+          "exclude-filter": "dio.dio16_32bit"
+        },
+        {
+          "exclude-filter": "dio.dio17_32bit"
+        },
+        {
+          "exclude-filter": "dio.dio19_32bit"
+        },
+        {
+          "exclude-filter": "dio.dio20_32bit"
+        },
+        {
+          "exclude-filter": "dio.dio21_32bit"
+        },
+        {
+          "exclude-filter": "dio.dio23_32bit"
+        },
+        {
+          "exclude-filter": "dio.dio24_32bit"
+        },
+        {
+          "exclude-filter": "dio.dio25_32bit"
+        },
+        {
+          "exclude-filter": "dio.dio27_32bit"
+        },
+        {
+          "exclude-filter": "dio.dio28_32bit"
+        },
+        {
+          "exclude-filter": "fs.fs_di_32bit"
+        },
+        {
+          "exclude-filter": "fs.fs_fill_32bit"
+        },
+        {
+          "exclude-filter": "fs.fs_inod01_32bit"
+        },
+        {
+          "exclude-filter": "fs.linker01_32bit"
+        },
+        {
+          "exclude-filter": "mm.mmapstress01_32bit"
+        },
+        {
+          "exclude-filter": "mm.mmapstress06_32bit"
+        },
+        {
+          "exclude-filter": "mm.mmapstress09_32bit"
+        },
+        {
+          "exclude-filter": "mm.mtest06_32bit"
+        },
+        {
+          "exclude-filter": "nptl.nptl01_32bit"
+        },
+        {
+          "exclude-filter": "pty.pty01_32bit"
+        },
+        {
+          "exclude-filter": "sched.hackbench01_32bit"
+        },
+        {
+          "exclude-filter": "sched.hackbench02_32bit"
+        },
+        {
+          "exclude-filter": "syscalls.clock_nanosleep02_32bit"
+        },
+        {
+          "exclude-filter": "syscalls.copy_file_range01_32bit"
+        },
+        {
+          "exclude-filter": "syscalls.fallocate05_32bit"
+        },
+        {
+          "exclude-filter": "syscalls.fcntl15_32bit"
+        },
+        {
+          "exclude-filter": "syscalls.gettimeofday02_32bit"
+        },
+        {
+          "exclude-filter": "syscalls.inotify09_32bit"
+        },
+        {
+          "exclude-filter": "syscalls.keyctl02_32bit"
+        },
+        {
+          "exclude-filter": "syscalls.kill02_32bit"
+        },
+        {
+          "exclude-filter": "syscalls.mkdir09_32bit"
+        },
+        {
+          "exclude-filter": "syscalls.nanosleep01_32bit"
+        },
+        {
+          "exclude-filter": "syscalls.poll02_32bit"
+        },
+        {
+          "exclude-filter": "syscalls.readahead02_32bit"
+        },
+        {
+          "exclude-filter": "syscalls.select04_32bit"
+        },
+        {
+          "exclude-filter": "syscalls.waitid01_32bit"
+        }
+      ]
+    },
+    {
+      "name": "vts_ltp_test_x86_64",
+      "options": [
+        {
+          // vts_slow_ltp_tests_x86
+          "exclude-filter": "cve.cve-2011-0999_64bit"
+        },
+        {
+          "exclude-filter": "cve.cve-2015-7550_64bit"
+        },
+        {
+          "exclude-filter": "cve.cve-2016-7117_64bit"
+        },
+        {
+          "exclude-filter": "cve.cve-2017-2671_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio01_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio02_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio03_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio04_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio05_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio06_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio07_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio08_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio09_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio10_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio11_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio12_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio13_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio14_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio15_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio16_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio17_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio18_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio19_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio20_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio21_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio22_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio23_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio24_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio25_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio26_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio27_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio28_64bit"
+        },
+        {
+          "exclude-filter": "fs.fs_fill_64bit"
+        },
+        {
+          "exclude-filter": "fs.fs_inod01_64bit"
+        },
+        {
+          "exclude-filter": "fs.linker01_64bit"
+        },
+        {
+          "exclude-filter": "mm.mmapstress06_64bit"
+        },
+        {
+          "exclude-filter": "mm.mtest06_64bit"
+        },
+        {
+          "exclude-filter": "nptl.nptl01_64bit"
+        },
+        {
+          "exclude-filter": "sched.hackbench01_64bit"
+        },
+        {
+          "exclude-filter": "sched.hackbench02_64bit"
+        },
+        {
+          "exclude-filter": "syscalls.clock_nanosleep02_64bit"
+        },
+        {
+          "exclude-filter": "syscalls.inotify09_64bit"
+        },
+        {
+          "exclude-filter": "syscalls.keyctl02_64bit"
+        },
+        {
+          "exclude-filter": "syscalls.nanosleep01_64bit"
+        },
+        {
+          "exclude-filter": "syscalls.poll02_64bit"
+        },
+        {
+          "exclude-filter": "syscalls.select04_64bit"
+        }
+      ]
+    }
+  ],
+  "kernel-presubmit": [
+    {
+      "name": "vts_ltp_test_arm",
+      "options": [
+        {
+          // vts_slow_ltp_tests_arm
+          "exclude-filter": "controllers.memcg_regression_32bit"
+        },
+        {
+          "exclude-filter": "cve.cve-2011-0999_32bit"
+        },
+        {
+          "exclude-filter": "cve.cve-2015-7550_32bit"
+        },
+        {
+          "exclude-filter": "cve.cve-2016-7117_32bit"
+        },
+        {
+          "exclude-filter": "cve.cve-2017-2671_32bit"
+        },
+        {
+          "exclude-filter": "dio.dio15_32bit"
+        },
+        {
+          "exclude-filter": "dio.dio16_32bit"
+        },
+        {
+          "exclude-filter": "dio.dio17_32bit"
+        },
+        {
+          "exclude-filter": "dio.dio19_32bit"
+        },
+        {
+          "exclude-filter": "dio.dio20_32bit"
+        },
+        {
+          "exclude-filter": "dio.dio21_32bit"
+        },
+        {
+          "exclude-filter": "dio.dio23_32bit"
+        },
+        {
+          "exclude-filter": "dio.dio24_32bit"
+        },
+        {
+          "exclude-filter": "dio.dio25_32bit"
+        },
+        {
+          "exclude-filter": "dio.dio27_32bit"
+        },
+        {
+          "exclude-filter": "dio.dio28_32bit"
+        },
+        {
+          "exclude-filter": "fs.fs_di_32bit"
+        },
+        {
+          "exclude-filter": "fs.fs_fill_32bit"
+        },
+        {
+          "exclude-filter": "fs.fs_inod01_32bit"
+        },
+        {
+          "exclude-filter": "fs.linker01_32bit"
+        },
+        {
+          "exclude-filter": "mm.mmapstress01_32bit"
+        },
+        {
+          "exclude-filter": "mm.mmapstress06_32bit"
+        },
+        {
+          "exclude-filter": "mm.mmapstress09_32bit"
+        },
+        {
+          "exclude-filter": "mm.mtest06_32bit"
+        },
+        {
+          "exclude-filter": "mm.mtest06_32bit"
+        },
+        {
+          "exclude-filter": "nptl.nptl01_32bit"
+        },
+        {
+          "exclude-filter": "pty.pty01_32bit"
+        },
+        {
+          "exclude-filter": "sched.hackbench01_32bit"
+        },
+        {
+          "exclude-filter": "sched.hackbench02_32bit"
+        },
+        {
+          "exclude-filter": "syscalls.copy_file_range01_32bit"
+        },
+        {
+          "exclude-filter": "syscalls.fallocate05_32bit"
+        },
+        {
+          "exclude-filter": "syscalls.fcntl15_32bit"
+        },
+        {
+          "exclude-filter": "syscalls.fcntl15_64_32bit"
+        },
+        {
+          "exclude-filter": "syscalls.gettimeofday02_32bit"
+        },
+        {
+          "exclude-filter": "syscalls.inotify09_32bit"
+        },
+        {
+          "exclude-filter": "syscalls.keyctl02_32bit"
+        },
+        {
+          "exclude-filter": "syscalls.kill02_32bit"
+        },
+        {
+          "exclude-filter": "syscalls.mkdir09_32bit"
+        },
+        {
+          "exclude-filter": "syscalls.readahead02_32bit"
+        },
+        {
+          "exclude-filter": "syscalls.waitid01_32bit"
+        }
+      ]
+    },
+    {
+      "name": "vts_ltp_test_arm_64",
+      "options": [
+        {
+          // vts_slow_ltp_tests_arm
+          "exclude-filter": "controllers.memcg_regression_64bit"
+        },
+        {
+          "exclude-filter": "cve.cve-2011-0999_64bit"
+        },
+        {
+          "exclude-filter": "cve.cve-2015-7550_64bit"
+        },
+        {
+          "exclude-filter": "cve.cve-2016-7117_64bit"
+        },
+        {
+          "exclude-filter": "cve.cve-2017-2671_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio15_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio16_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio17_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio19_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio20_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio21_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio23_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio24_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio25_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio27_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio28_64bit"
+        },
+        {
+          "exclude-filter": "fs.fs_di_64bit"
+        },
+        {
+          "exclude-filter": "fs.fs_fill_64bit"
+        },
+        {
+          "exclude-filter": "fs.fs_inod01_64bit"
+        },
+        {
+          "exclude-filter": "fs.linker01_64bit"
+        },
+        {
+          "exclude-filter": "mm.mmapstress01_64bit"
+        },
+        {
+          "exclude-filter": "mm.mmapstress06_64bit"
+        },
+        {
+          "exclude-filter": "mm.mmapstress09_64bit"
+        },
+        {
+          "exclude-filter": "nptl.nptl01_64bit"
+        },
+        {
+          "exclude-filter": "pty.pty01_64bit"
+        },
+        {
+          "exclude-filter": "sched.hackbench01_64bit"
+        },
+        {
+          "exclude-filter": "sched.hackbench02_64bit"
+        },
+        {
+          "exclude-filter": "syscalls.copy_file_range01_64bit"
+        },
+        {
+          "exclude-filter": "syscalls.fallocate05_64bit"
+        },
+        {
+          "exclude-filter": "syscalls.fcntl15_64_64bit"
+        },
+        {
+          "exclude-filter": "syscalls.fcntl15_64bit"
+        },
+        {
+          "exclude-filter": "syscalls.gettimeofday02_64bit"
+        },
+        {
+          "exclude-filter": "syscalls.inotify09_64bit"
+        },
+        {
+          "exclude-filter": "syscalls.keyctl02_64bit"
+        },
+        {
+          "exclude-filter": "syscalls.kill02_64bit"
+        },
+        {
+          "exclude-filter": "syscalls.mkdir09_64bit"
+        },
+        {
+          "exclude-filter": "syscalls.readahead02_64bit"
+        },
+        {
+          "exclude-filter": "syscalls.waitid01_64bit"
+        }
+      ]
+    },
+    {
+      "name": "vts_ltp_test_x86",
+      "options": [
+        {
+          // vts_slow_ltp_tests_x86
+          "exclude-filter": "controllers.memcg_regression_32bit"
+        },
+        {
+          "exclude-filter": "cve.cve-2011-0999_32bit"
+        },
+        {
+          "exclude-filter": "cve.cve-2015-7550_32bit"
+        },
+        {
+          "exclude-filter": "cve.cve-2016-7117_32bit"
+        },
+        {
+          "exclude-filter": "cve.cve-2017-2671_32bit"
+        },
+        {
+          "exclude-filter": "dio.dio15_32bit"
+        },
+        {
+          "exclude-filter": "dio.dio16_32bit"
+        },
+        {
+          "exclude-filter": "dio.dio17_32bit"
+        },
+        {
+          "exclude-filter": "dio.dio19_32bit"
+        },
+        {
+          "exclude-filter": "dio.dio20_32bit"
+        },
+        {
+          "exclude-filter": "dio.dio21_32bit"
+        },
+        {
+          "exclude-filter": "dio.dio23_32bit"
+        },
+        {
+          "exclude-filter": "dio.dio24_32bit"
+        },
+        {
+          "exclude-filter": "dio.dio25_32bit"
+        },
+        {
+          "exclude-filter": "dio.dio27_32bit"
+        },
+        {
+          "exclude-filter": "dio.dio28_32bit"
+        },
+        {
+          "exclude-filter": "fs.fs_di_32bit"
+        },
+        {
+          "exclude-filter": "fs.fs_fill_32bit"
+        },
+        {
+          "exclude-filter": "fs.fs_inod01_32bit"
+        },
+        {
+          "exclude-filter": "fs.linker01_32bit"
+        },
+        {
+          "exclude-filter": "mm.mmapstress01_32bit"
+        },
+        {
+          "exclude-filter": "mm.mmapstress06_32bit"
+        },
+        {
+          "exclude-filter": "mm.mmapstress09_32bit"
+        },
+        {
+          "exclude-filter": "mm.mtest06_32bit"
+        },
+        {
+          "exclude-filter": "nptl.nptl01_32bit"
+        },
+        {
+          "exclude-filter": "pty.pty01_32bit"
+        },
+        {
+          "exclude-filter": "sched.hackbench01_32bit"
+        },
+        {
+          "exclude-filter": "sched.hackbench02_32bit"
+        },
+        {
+          "exclude-filter": "syscalls.clock_nanosleep02_32bit"
+        },
+        {
+          "exclude-filter": "syscalls.copy_file_range01_32bit"
+        },
+        {
+          "exclude-filter": "syscalls.fallocate05_32bit"
+        },
+        {
+          "exclude-filter": "syscalls.fcntl15_32bit"
+        },
+        {
+          "exclude-filter": "syscalls.gettimeofday02_32bit"
+        },
+        {
+          "exclude-filter": "syscalls.inotify09_32bit"
+        },
+        {
+          "exclude-filter": "syscalls.keyctl02_32bit"
+        },
+        {
+          "exclude-filter": "syscalls.kill02_32bit"
+        },
+        {
+          "exclude-filter": "syscalls.mkdir09_32bit"
+        },
+        {
+          "exclude-filter": "syscalls.nanosleep01_32bit"
+        },
+        {
+          "exclude-filter": "syscalls.poll02_32bit"
+        },
+        {
+          "exclude-filter": "syscalls.readahead02_32bit"
+        },
+        {
+          "exclude-filter": "syscalls.select04_32bit"
+        },
+        {
+          "exclude-filter": "syscalls.waitid01_32bit"
+        }
+      ]
+    },
+    {
+      "name": "vts_ltp_test_x86_64",
+      "options": [
+        {
+          // vts_slow_ltp_tests_x86
+          "exclude-filter": "cve.cve-2011-0999_64bit"
+        },
+        {
+          "exclude-filter": "cve.cve-2015-7550_64bit"
+        },
+        {
+          "exclude-filter": "cve.cve-2016-7117_64bit"
+        },
+        {
+          "exclude-filter": "cve.cve-2017-2671_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio01_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio02_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio03_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio04_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio05_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio06_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio07_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio08_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio09_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio10_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio11_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio12_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio13_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio14_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio15_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio16_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio17_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio18_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio19_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio20_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio21_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio22_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio23_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio24_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio25_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio26_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio27_64bit"
+        },
+        {
+          "exclude-filter": "dio.dio28_64bit"
+        },
+        {
+          "exclude-filter": "fs.fs_fill_64bit"
+        },
+        {
+          "exclude-filter": "fs.fs_inod01_64bit"
+        },
+        {
+          "exclude-filter": "fs.linker01_64bit"
+        },
+        {
+          "exclude-filter": "mm.mmapstress06_64bit"
+        },
+        {
+          "exclude-filter": "mm.mtest06_64bit"
+        },
+        {
+          "exclude-filter": "nptl.nptl01_64bit"
+        },
+        {
+          "exclude-filter": "sched.hackbench01_64bit"
+        },
+        {
+          "exclude-filter": "sched.hackbench02_64bit"
+        },
+        {
+          "exclude-filter": "syscalls.clock_nanosleep02_64bit"
+        },
+        {
+          "exclude-filter": "syscalls.inotify09_64bit"
+        },
+        {
+          "exclude-filter": "syscalls.keyctl02_64bit"
+        },
+        {
+          "exclude-filter": "syscalls.nanosleep01_64bit"
+        },
+        {
+          "exclude-filter": "syscalls.poll02_64bit"
+        },
+        {
+          "exclude-filter": "syscalls.select04_64bit"
+        }
+      ]
+    }
+  ]
+}
diff --git a/ltp/testcase/Android.bp b/ltp/testcase/Android.bp
index a4aec2a..2f06c08 100644
--- a/ltp/testcase/Android.bp
+++ b/ltp/testcase/Android.bp
@@ -31,12 +31,8 @@
 genrule {
     name: "ltp_config_arm_64",
     out: ["vts_ltp_test_arm_64.xml"],
-    tool_files: [
-        "tools/gen_ltp_config.py",
-        "tools/**/*.py",
-        "tools/template/template.xml",
-    ],
-    cmd: "export ANDROID_BUILD_TOP=$$(pwd) && python3 $(location tools/gen_ltp_config.py) --arch arm --bitness 64 --low-mem False --hwasan False $(out)",
+    tools: ["gen_ltp_config"],
+    cmd: "$(location gen_ltp_config) --arch arm --bitness 64 --low-mem False --hwasan False $(out)",
 }
 
 sh_test {
@@ -52,12 +48,8 @@
 genrule {
     name: "ltp_config_arm_64_lowmem",
     out: ["vts_ltp_test_arm_64_lowmem.xml"],
-    tool_files: [
-        "tools/gen_ltp_config.py",
-        "tools/**/*.py",
-        "tools/template/template.xml",
-    ],
-    cmd: "export ANDROID_BUILD_TOP=$$(pwd) && python3 $(location tools/gen_ltp_config.py) --arch arm --bitness 64 --low-mem True --hwasan False $(out)",
+    tools: ["gen_ltp_config"],
+    cmd: "$(location gen_ltp_config) --arch arm --bitness 64 --low-mem True --hwasan False $(out)",
 }
 
 sh_test {
@@ -73,12 +65,8 @@
 genrule {
     name: "ltp_config_arm_64_hwasan",
     out: ["vts_ltp_test_arm_64_hwasan.xml"],
-    tool_files: [
-        "tools/gen_ltp_config.py",
-        "tools/**/*.py",
-        "tools/template/template.xml",
-    ],
-    cmd: "export ANDROID_BUILD_TOP=$$(pwd) && python3 $(location tools/gen_ltp_config.py) --arch arm --bitness 64 --low-mem False --hwasan True $(out)",
+    tools: ["gen_ltp_config"],
+    cmd: "$(location gen_ltp_config) --arch arm --bitness 64 --low-mem False --hwasan True $(out)",
 }
 
 sh_test {
@@ -94,12 +82,8 @@
 genrule {
     name: "ltp_config_arm_64_lowmem_hwasan",
     out: ["vts_ltp_test_arm_64_lowmem_hwasan.xml"],
-    tool_files: [
-        "tools/gen_ltp_config.py",
-        "tools/**/*.py",
-        "tools/template/template.xml",
-    ],
-    cmd: "export ANDROID_BUILD_TOP=$$(pwd) && python3 $(location tools/gen_ltp_config.py) --arch arm --bitness 64 --low-mem True --hwasan True $(out)",
+    tools: ["gen_ltp_config"],
+    cmd: "$(location gen_ltp_config) --arch arm --bitness 64 --low-mem True --hwasan True $(out)",
 }
 
 sh_test {
@@ -115,12 +99,8 @@
 genrule {
     name: "ltp_config_arm",
     out: ["vts_ltp_test_arm.xml"],
-    tool_files: [
-        "tools/gen_ltp_config.py",
-        "tools/**/*.py",
-        "tools/template/template.xml",
-    ],
-    cmd: "export ANDROID_BUILD_TOP=$$(pwd) && python3 $(location tools/gen_ltp_config.py) --arch arm --bitness 32 --low-mem False --hwasan False $(out)",
+    tools: ["gen_ltp_config"],
+    cmd: "$(location gen_ltp_config) --arch arm --bitness 32 --low-mem False --hwasan False $(out)",
 }
 
 sh_test {
@@ -136,12 +116,8 @@
 genrule {
     name: "ltp_config_arm_lowmem",
     out: ["vts_ltp_test_arm_lowmem.xml"],
-    tool_files: [
-        "tools/gen_ltp_config.py",
-        "tools/**/*.py",
-        "tools/template/template.xml",
-    ],
-    cmd: "export ANDROID_BUILD_TOP=$$(pwd) && python3 $(location tools/gen_ltp_config.py) --arch arm --bitness 32 --low-mem True --hwasan False $(out)",
+    tools: ["gen_ltp_config"],
+    cmd: "$(location gen_ltp_config) --arch arm --bitness 32 --low-mem True --hwasan False $(out)",
 }
 
 sh_test {
@@ -154,12 +130,8 @@
 genrule {
     name: "ltp_config_riscv_64",
     out: ["vts_ltp_test_riscv_64.xml"],
-    tool_files: [
-        "tools/gen_ltp_config.py",
-        "tools/**/*.py",
-        "tools/template/template.xml",
-    ],
-    cmd: "export ANDROID_BUILD_TOP=$$(pwd) && python3 $(location tools/gen_ltp_config.py) --arch riscv --bitness 64 --low-mem False --hwasan False $(out)",
+    tools: ["gen_ltp_config"],
+    cmd: "$(location gen_ltp_config) --arch riscv --bitness 64 --low-mem False --hwasan False $(out)",
 }
 
 sh_test {
@@ -175,12 +147,8 @@
 genrule {
     name: "ltp_config_x86_64",
     out: ["vts_ltp_test_x86_64.xml"],
-    tool_files: [
-        "tools/gen_ltp_config.py",
-        "tools/**/*.py",
-        "tools/template/template.xml",
-    ],
-    cmd: "export ANDROID_BUILD_TOP=$$(pwd) && python3 $(location tools/gen_ltp_config.py) --arch x86 --bitness 64 --low-mem False --hwasan False $(out)",
+    tools: ["gen_ltp_config"],
+    cmd: "$(location gen_ltp_config) --arch x86 --bitness 64 --low-mem False --hwasan False $(out)",
 }
 
 sh_test {
@@ -196,10 +164,6 @@
 genrule {
     name: "ltp_config_x86",
     out: ["vts_ltp_test_x86.xml"],
-    tool_files: [
-        "tools/gen_ltp_config.py",
-        "tools/**/*.py",
-        "tools/template/template.xml",
-    ],
-    cmd: "export ANDROID_BUILD_TOP=$$(pwd) && python3 $(location tools/gen_ltp_config.py) --arch x86 --bitness 32 --low-mem False --hwasan False $(out)",
+    tools: ["gen_ltp_config"],
+    cmd: "$(location gen_ltp_config) --arch x86 --bitness 32 --low-mem False --hwasan False $(out)",
 }
diff --git a/ltp/testcase/tools/Android.bp b/ltp/testcase/tools/Android.bp
index 032610d..3d443a9 100644
--- a/ltp/testcase/tools/Android.bp
+++ b/ltp/testcase/tools/Android.bp
@@ -32,3 +32,22 @@
         }
     },
 }
+
+python_binary_host {
+    name: "gen_ltp_config",
+    main: "gen_ltp_config.py",
+    srcs: [
+        "**/*.py",
+    ],
+    data: [
+        "template/template.xml",
+        ":ltp_gen_bp_file",
+        ":ltp_disabled_tests",
+        ":ltp_runtests",
+    ],
+    version: {
+        py3: {
+            embedded_launcher: true,
+        }
+    },
+}
diff --git a/ltp/testcase/tools/configs/disabled_tests.py b/ltp/testcase/tools/configs/disabled_tests.py
index 9f8fc89..750261b 100644
--- a/ltp/testcase/tools/configs/disabled_tests.py
+++ b/ltp/testcase/tools/configs/disabled_tests.py
@@ -57,14 +57,6 @@
     'syscalls.epoll_pwait01_64bit',  # b/277586905
     'syscalls.epoll_pwait04_32bit',  # b/241310858
     'syscalls.epoll_pwait04_64bit',  # b/241310858
-    'syscalls.fcntl34_32bit',  # b/278714055
-    'syscalls.fcntl34_64_32bit',  # b/278714055
-    'syscalls.fcntl36_32bit',  # b/278714055
-    'syscalls.fcntl36_64_32bit',  # b/278714055
-    'syscalls.ftruncate04_32bit',  # b/198611142
-    'syscalls.ftruncate04_64_32bit',  # b/198611142
-    'syscalls.ftruncate04_64_64bit',  # b/198611142
-    'syscalls.ftruncate04_64bit',  # b/198611142
     'syscalls.inotify07_32bit',  # b/191773884
     'syscalls.inotify07_64bit',  # b/191773884
     'syscalls.inotify08_32bit',  # b/191748474
@@ -103,6 +95,8 @@
     'syscalls.semctl09_64bit',  # b/191227035
     'syscalls.setpgid02_32bit',  # b/276300873
     'syscalls.setpgid02_64bit',  # b/276300873
+    'syscalls.splice07_32bit',  # b/328315662
+    'syscalls.splice07_64bit',  # b/328315662
     'syscalls.statx07_32bit',  # b/191236106
     'syscalls.statx07_64bit',  # b/191236106
 }
diff --git a/ltp/testcase/tools/configs/stable_tests.py b/ltp/testcase/tools/configs/stable_tests.py
index 8fba499..ef0ffff 100644
--- a/ltp/testcase/tools/configs/stable_tests.py
+++ b/ltp/testcase/tools/configs/stable_tests.py
@@ -648,6 +648,8 @@
     'syscalls.abort01_64bit': False,
     'syscalls.accept01_32bit': True,
     'syscalls.accept01_64bit': True,
+    'syscalls.accept03_32bit': False,
+    'syscalls.accept03_64bit': False,
     'syscalls.accept4_01_32bit': True,
     'syscalls.accept4_01_64bit': True,
     'syscalls.access01_32bit': True,
@@ -1054,6 +1056,8 @@
     'syscalls.fchmod07_64bit': True,
     'syscalls.fchmodat01_32bit': True,
     'syscalls.fchmodat01_64bit': True,
+    'syscalls.fchmodat02_32bit': True,
+    'syscalls.fchmodat02_64bit': True,
     'syscalls.fchown01_16_32bit': False,
     'syscalls.fchown01_16_64bit': False,
     'syscalls.fchown01_32bit': True,
@@ -1194,12 +1198,16 @@
     'syscalls.fcntl33_64_32bit': True,
     'syscalls.fcntl33_64_64bit': True,
     'syscalls.fcntl33_64bit': True,
+    'syscalls.fcntl34_32bit': True,
+    'syscalls.fcntl34_64_32bit': True,
     'syscalls.fcntl34_64_64bit': True,
     'syscalls.fcntl34_64bit': True,
     'syscalls.fcntl35_32bit': True,
     'syscalls.fcntl35_64_32bit': True,
     'syscalls.fcntl35_64_64bit': True,
     'syscalls.fcntl35_64bit': True,
+    'syscalls.fcntl36_32bit': True,
+    'syscalls.fcntl36_64_32bit': True,
     'syscalls.fcntl36_64_64bit': True,
     'syscalls.fcntl36_64bit': True,
     'syscalls.fcntl37_32bit': True,
@@ -1328,6 +1336,10 @@
     'syscalls.ftruncate03_64_32bit': True,
     'syscalls.ftruncate03_64_64bit': True,
     'syscalls.ftruncate03_64bit': True,
+    'syscalls.ftruncate04_32bit': False,
+    'syscalls.ftruncate04_64bit': False,
+    'syscalls.ftruncate04_64_32bit': False,
+    'syscalls.ftruncate04_64_64bit': False,
     'syscalls.futex_cmp_requeue02_32bit': True,
     'syscalls.futex_cmp_requeue02_64bit': True,
     'syscalls.futex_wait01_32bit': True,
@@ -1494,6 +1506,8 @@
     'syscalls.getsockopt02_64bit': True,
     'syscalls.gettid01_32bit': True,
     'syscalls.gettid01_64bit': True,
+    'syscalls.gettid02_32bit': True,
+    'syscalls.gettid02_64bit': True,
     'syscalls.gettimeofday01_32bit': True,
     'syscalls.gettimeofday01_64bit': True,
     'syscalls.gettimeofday02_32bit': True,
@@ -2032,6 +2046,8 @@
     'syscalls.pipe13_64bit': True,
     'syscalls.pipe14_32bit': True,
     'syscalls.pipe14_64bit': True,
+    'syscalls.pipe15_32bit': True,
+    'syscalls.pipe15_64bit': True,
     'syscalls.pipe2_01_32bit': True,
     'syscalls.pipe2_01_64bit': True,
     'syscalls.pipe2_02_32bit': True,
@@ -2138,6 +2154,8 @@
     'syscalls.ptrace04_64bit': False,
     'syscalls.ptrace05_32bit': True,
     'syscalls.ptrace05_64bit': True,
+    'syscalls.ptrace06_32bit': True,
+    'syscalls.ptrace06_64bit': True,
     'syscalls.ptrace10_32bit': False,
     'syscalls.ptrace10_64bit': False,
     'syscalls.ptrace11_32bit': True,
@@ -2372,6 +2390,8 @@
     'syscalls.sched_setscheduler02_64bit': True,
     'syscalls.sched_setscheduler03_32bit': True,
     'syscalls.sched_setscheduler03_64bit': True,
+    'syscalls.sched_setscheduler04_32bit': True,
+    'syscalls.sched_setscheduler04_64bit': True,
     'syscalls.sched_yield01_32bit': True,
     'syscalls.sched_yield01_64bit': True,
     'syscalls.select01_32bit': True,
@@ -2727,6 +2747,8 @@
     'syscalls.splice04_64bit': True,
     'syscalls.splice05_32bit': True,
     'syscalls.splice05_64bit': True,
+    'syscalls.splice06_32bit': False,
+    'syscalls.splice06_64bit': False,
     'syscalls.ssetmask01_32bit': False,
     'syscalls.ssetmask01_64bit': False,
     'syscalls.stat01_32bit': True,
diff --git a/ltp/testcase/tools/gen_ltp_config.py b/ltp/testcase/tools/gen_ltp_config.py
index 59fc150..0da59d4 100755
--- a/ltp/testcase/tools/gen_ltp_config.py
+++ b/ltp/testcase/tools/gen_ltp_config.py
@@ -17,16 +17,13 @@
 import argparse
 import os
 import sys
-from distutils.util import strtobool
 
 import ltp_test_cases
 from common import filter_utils
 
-def run(android_build_top: str, arch: str, n_bit: int, is_low_mem: bool, is_hwasan: bool, run_staging: bool, output_file: str):
+def run(arch: str, n_bit: int, is_low_mem: bool, is_hwasan: bool, run_staging: bool, output_file: str):
 
-    android_build_top = android_build_top
-    ltp_tests = ltp_test_cases.LtpTestCases(
-        android_build_top, None)
+    ltp_tests = ltp_test_cases.LtpTestCases(None)
 
     test_filter = filter_utils.Filter()
     ltp_tests.GenConfig(
@@ -72,14 +69,12 @@
                             default="False",
                             help="Run all the tests, except from the disabled ones")
     arg_parser.add_argument('output_file_path',
-                            nargs=1,
                             help="Path for the output file")
     args = arg_parser.parse_args()
 
-    run(android_build_top=os.environ['ANDROID_BUILD_TOP'],
-        arch=args.arch,
+    run(arch=args.arch,
         n_bit=str(args.bitness),
-        is_low_mem=strtobool(args.is_low_mem),
-        is_hwasan=strtobool(args.is_hwasan),
-        run_staging=strtobool(args.run_staging),
-        output_file=args.output_file_path[0])
+        is_low_mem=args.is_low_mem == 'True',
+        is_hwasan=args.is_hwasan == 'True',
+        run_staging=args.run_staging == 'True',
+        output_file=args.output_file_path)
diff --git a/ltp/testcase/tools/ltp_configs.py b/ltp/testcase/tools/ltp_configs.py
index cd3f4fb..dfd22ab 100644
--- a/ltp/testcase/tools/ltp_configs.py
+++ b/ltp/testcase/tools/ltp_configs.py
@@ -19,15 +19,6 @@
 import ltp_enums
 
 VTS_LTP_OUTPUT = os.path.join('DATA', 'nativetest', 'ltp')
-LTP_RUNTEST_DIR = 'external/ltp/runtest'
-# The bp file that contains all binaries of ltp
-LTP_GEN_BINARY_BP = 'external/ltp/gen.bp'
-
-LTP_DISABLED_BUILD_TESTS_CONFIG_PATH = 'external/ltp/android/tools/disabled_tests.txt'
-# Directory for the template of the test config.
-LTP_CONFIG_TEMPLATE_DIR = 'test/vts-testcase/kernel/ltp/testcase/tools/template'
-# The file name of the config template file
-LTP_CONFIG_TEMPLATE_FILE_NAME = 'template.xml'
 
 # Environment paths for ltp test cases
 # string, ltp build root directory on target
@@ -92,7 +83,6 @@
     'can',
     'cap_bounds',
     'commands',
-    'connectors',
     'containers',
     'controllers',
     'cpuhotplug',
@@ -103,7 +93,6 @@
     'fs',
     'fs_bind',
     'fs_perms_simple',
-    'fsx',
     'hugetlb',
     'hyperthreading',
     'input',
@@ -126,7 +115,6 @@
     'can',
     'cap_bounds',
     'commands',
-    'connectors',
     'containers',
     'cpuhotplug',
     'cve',
@@ -136,7 +124,6 @@
     'fs',
     'fs_bind',
     'fs_perms_simple',
-    'fsx',
     'hugetlb',
     'hyperthreading',
     'input',
diff --git a/ltp/testcase/tools/ltp_test_cases.py b/ltp/testcase/tools/ltp_test_cases.py
index 25451ec..07682eb 100644
--- a/ltp/testcase/tools/ltp_test_cases.py
+++ b/ltp/testcase/tools/ltp_test_cases.py
@@ -16,6 +16,8 @@
 
 import os
 import logging
+import pkgutil
+from importlib import resources
 
 import ltp_configs
 import ltp_enums
@@ -39,8 +41,7 @@
         _ltp_config_lines: list of string: the context of the generated config
     """
 
-    def __init__(self, android_build_top: str, filter_func: Callable):
-        self._android_build_top = android_build_top
+    def __init__(self, filter_func: Callable):
         self._filter_func = filter_func
         self._ltp_tests_filter = filter_utils.Filter(
             set(stable_tests.STABLE_TESTS.keys()),
@@ -77,10 +78,8 @@
         Returns:
             String.
         """
-        file_name = ltp_configs.LTP_CONFIG_TEMPLATE_FILE_NAME
-        file_path = os.path.join(self._android_build_top, ltp_configs.LTP_CONFIG_TEMPLATE_DIR, file_name)
-        with open(file_path, 'r') as f:
-            return f.read()
+        # This gets bundled into the gen_ltp_config tool during the build
+        return pkgutil.get_data('template', 'template.xml').decode()
 
     def GetKernelModuleControllerOption(self, arch: str, n_bit: int, is_low_mem: bool = False, is_hwasan: bool = False) -> str:
         """Get the Option of KernelModuleController.
@@ -116,8 +115,7 @@
         Args:
             command: String, the test command
         """
-        gen_bp_path = os.path.join(self._android_build_top, ltp_configs.LTP_GEN_BINARY_BP)
-        for line in open(gen_bp_path, 'r'):
+        for line in pkgutil.get_data('android.tools', 'gen.bp').decode().splitlines():
             line = line.strip()
             if not line or line.startswith('#'):
                 continue
@@ -263,25 +261,6 @@
         with open(output_file, 'w') as f:
             f.write(config_lines)
 
-    def ReadCommentedTxt(self, filepath: str) -> Optional[Set[str]]:
-        '''Read a lines of a file that are not commented by #.
-
-        Args:
-            filepath: string, path of file to read
-
-        Returns:
-            A set of string representing non-commented lines in given file
-        '''
-        if not filepath:
-            logging.error('Invalid file path')
-            return None
-
-        with open(filepath, 'r') as f:
-            lines_gen = (line.strip() for line in f)
-            return set(
-                line for line in lines_gen
-                if line and not line.startswith('#'))
-
     def GenerateLtpTestCases(self, testsuite: str, disabled_tests_list: List[str]) -> List[str]:
         '''Generate test cases for each ltp test suite.
 
@@ -291,11 +270,8 @@
         Returns:
             A list of string
         '''
-        testsuite_script = os.path.join(self._android_build_top,
-                                        ltp_configs.LTP_RUNTEST_DIR, testsuite)
-
         result = []
-        for line in open(testsuite_script, 'r'):
+        for line in pkgutil.get_data('runtest', testsuite).decode().splitlines():
             line = line.strip()
             if not line or line.startswith('#'):
                 continue
@@ -318,9 +294,11 @@
         Returns:
             A list of string
         '''
-        disabled_tests_path = os.path.join(
-            self._android_build_top, ltp_configs.LTP_DISABLED_BUILD_TESTS_CONFIG_PATH)
-        disabled_tests_list = self.ReadCommentedTxt(disabled_tests_path)
+        disabled_tests_list = pkgutil.get_data('android.tools', 'disabled_tests.txt').decode().splitlines()
+        disabled_tests_list = [line.strip() for line in disabled_tests_list]
+        disabled_tests_list = set(
+            line for line in disabled_tests_list
+            if line and not line.startswith('#'))
 
         result = []
         for testsuite in scenario_groups:
diff --git a/page_size_16kb/OWNERS b/page_size_16kb/OWNERS
deleted file mode 100644
index 392e306..0000000
--- a/page_size_16kb/OWNERS
+++ /dev/null
@@ -1,4 +0,0 @@
-# Bug component: 1261834
[email protected]
[email protected]
[email protected]
diff --git a/page_size_16kb/vendor_elf_alignment_test.sh b/page_size_16kb/vendor_elf_alignment_test.sh
deleted file mode 100755
index 0d6802d..0000000
--- a/page_size_16kb/vendor_elf_alignment_test.sh
+++ /dev/null
@@ -1,121 +0,0 @@
-#!/bin/bash
-
-# Copyright (C) 2023 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.
-
-# Check that vendor ELF files have the required 16KB [or 64KB] load segment
-# alignment on devices.
-
-# Requirement added in U (34)
-MIN_VENDOR_API_LEVEL=34
-
-DEFAULT_VENDOR_API_LEVEL=0
-
-# Default to 64KB max page size unless otherwise specified.
-DEFAULT_MAX_PAGE_SIZE=65536
-
-# Device is only low RAM if explicitly stated
-DEFAULT_CONFIG_LOW_RAM=false
-
-fail() { #msg
-    echo "FAILED: $1"
-    exit 1
-}
-
-pass() { #msg
-    echo "PASSED: $1"
-    exit 0
-}
-
-skip() { #msg
-    echo "SKIPPED: $1"
-    exit 0
-}
-
-# Skip test if vendor API level < U (34)
-vendor_api_level="$(adb shell getprop ro.vendor.api_level $DEFAULT_VENDOR_API_LEVEL)"
-if [ "$vendor_api_level" -lt "$MIN_VENDOR_API_LEVEL" ]; then
-    skip "Vendor API level ($vendor_api_level) < Min vendor API level ($MIN_VENDOR_API_LEVEL)"
-fi
-
-# Android Go and other low RAM devices do not support larger than 4KB page size
-config_low_ram="$(adb shell getprop ro.config.low_ram $DEFAULT_CONFIG_LOW_RAM)"
-if [ "$config_low_ram" != "$DEFAULT_CONFIG_LOW_RAM" ]; then
-    skip "Low RAM devices only support 4096 max page size"
-fi
-
-# Some devices may choose to opt out of 64KB max page size support
-max_page_size="$(adb shell getprop ro.product.cpu.pagesize.max $DEFAULT_MAX_PAGE_SIZE)"
-if [ $max_page_size -lt $DEFAULT_MAX_PAGE_SIZE ]; then
-    skip "Device only supports $max_page_size max page size"
-fi
-
-
-unaligned_elfs=()
-
-get_unaligned_elfs() {
-    adb shell '
-        # Find all vendor ELF files
-        paths=()
-        for i in `find /vendor -type f -exec file {} \; | grep ELF | awk -F: "{ print \\$1 }"`; do
-            paths+=( $i )
-        done
-
-        unaligned=()
-        for path in "${paths[@]}"; do
-            load_alignment=$( readelf -l $path | grep LOAD | head -n1 | awk "{ print \$NF }" )
-
-            # Require 64KB alignment for future proofing. Android uses sparse files so
-            # the real disk space impact is not significant.
-            if [ "$load_alignment" != "0x10000" ]; then
-                unaligned+=( $path )
-            fi
-        done
-
-        echo "${unaligned[@]}"'
-}
-
-print_unaligned_elfs() { # arr_unaligned_elfs
-    elfs=("$@")
-
-    echo ""
-    echo "=== Unaligned vendor ELF files found ==="
-    echo ""
-    for elf in ${elfs[@]}; do
-        echo "    $elf"
-    done
-    echo ""
-    echo "Please rebuild the above artifacts with 64KB aligned load segments."
-    echo ""
-    echo "    This can be done by specifying the following linker flag:"
-    echo "        -Wl,-z,max-page-size=65536"
-    echo ""
-    echo "This is required in devices with Vendor API Level >= $MIN_VENDOR_API_LEVEL"
-    echo ""
-}
-
-# @VsrTest = 3.3-005
-vendor_elf_alignment_test() {
-    unaligned_elfs+=( $(get_unaligned_elfs) )
-    nr_unaligned="${#unaligned_elfs[@]}"
-
-    if [ "$nr_unaligned" == "0" ]; then
-        pass "All vendor ELF files have the required load segment alignment"
-    else
-        print_unaligned_elfs "${unaligned_elfs[@]}"
-        fail "Vendor ELF files with unaligned load segments found"
-    fi
-}
-
-vendor_elf_alignment_test
diff --git a/page_size_16kb/vendor_elf_alignment_test.xml b/page_size_16kb/vendor_elf_alignment_test.xml
deleted file mode 100644
index 7c372c1..0000000
--- a/page_size_16kb/vendor_elf_alignment_test.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2023 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.
--->
-
-<configuration description="64KB Vendor ELF Alignment Test">
-    <target_preparer class="com.android.tradefed.targetprep.RootTargetPreparer" />
-    <test class="com.android.tradefed.testtype.binary.ExecutableHostTest" >
-        <option name="binary" value="vendor_elf_alignment_test" />
-        <option name="per-binary-timeout" value="5m" />
-    </test>
-</configuration>
diff --git a/pagesize_16kb/.clang-format b/pagesize_16kb/.clang-format
new file mode 120000
index 0000000..0457b53
--- /dev/null
+++ b/pagesize_16kb/.clang-format
@@ -0,0 +1 @@
+../../../../build/soong/scripts/system-clang-format
\ No newline at end of file
diff --git a/page_size_16kb/Android.bp b/pagesize_16kb/Android.bp
similarity index 66%
rename from page_size_16kb/Android.bp
rename to pagesize_16kb/Android.bp
index 5188807..0c3b6c3 100644
--- a/page_size_16kb/Android.bp
+++ b/pagesize_16kb/Android.bp
@@ -15,14 +15,34 @@
 //
 
 package {
+    default_team: "trendy_team_android_kernel",
     default_applicable_licenses: ["Android-Apache-2.0"],
 }
 
-sh_test {
-    name: "vendor_elf_alignment_test",
-    src: "vendor_elf_alignment_test.sh",
+cc_test {
+    name: "Vts16KPageSizeTest",
+    require_root: true,
     test_suites: [
         "general-tests",
+        "vts",
+        "device-tests",
     ],
-    test_config: "vendor_elf_alignment_test.xml",
+
+    srcs: [
+        "Vts16KPageSizeTest.cpp",
+    ],
+
+    static_libs: [
+        "libelf64",
+    ],
+
+    shared_libs: [
+        "libbase",
+        "liblog",
+    ],
+
+    cflags: [
+        "-Wall",
+        "-Werror",
+    ],
 }
diff --git a/pagesize_16kb/OWNERS b/pagesize_16kb/OWNERS
new file mode 100644
index 0000000..192a75b
--- /dev/null
+++ b/pagesize_16kb/OWNERS
@@ -0,0 +1,6 @@
+# Bug component: 1261834
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
diff --git a/pagesize_16kb/TEST_MAPPING b/pagesize_16kb/TEST_MAPPING
new file mode 100644
index 0000000..c8eedfe
--- /dev/null
+++ b/pagesize_16kb/TEST_MAPPING
@@ -0,0 +1,7 @@
+{
+  "presubmit": [
+    {
+      "name": "Vts16KPageSizeTest"
+    }
+  ]
+}
diff --git a/pagesize_16kb/Vts16KPageSizeTest.cpp b/pagesize_16kb/Vts16KPageSizeTest.cpp
new file mode 100644
index 0000000..be4184b
--- /dev/null
+++ b/pagesize_16kb/Vts16KPageSizeTest.cpp
@@ -0,0 +1,134 @@
+/*
+ * Copyright (C) 2023 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 <android-base/properties.h>
+#include <android/api-level.h>
+#include <elf.h>
+#include <gtest/gtest.h>
+#include <libelf64/parse.h>
+
+class Vts16KPageSizeTest : public ::testing::Test {
+  protected:
+    static int VendorApiLevel() {
+        // "ro.vendor.api_level" is added in Android T.
+        // Undefined indicates S or below
+        return android::base::GetIntProperty("ro.vendor.api_level", __ANDROID_API_S__);
+    }
+
+    static bool NoBionicPageSizeMacroProperty() {
+        // "ro.product.build.no_bionic_page_size_macro" was added in Android V and is
+        // set to true when Android is build with PRODUCT_NO_BIONIC_PAGE_SIZE_MACRO := true.
+        return android::base::GetBoolProperty("ro.product.build.no_bionic_page_size_macro", false);
+    }
+
+    static std::string Architecture() { return android::base::GetProperty("ro.bionic.arch", ""); }
+
+    static ssize_t MaxPageSize(const std::string& filepath) {
+        ssize_t maxPageSize = -1;
+
+        android::elf64::Elf64Binary elf;
+
+        if (!android::elf64::Elf64Parser::ParseElfFile(filepath, elf)) {
+            return -1;
+        }
+
+        for (int i = 0; i < elf.phdrs.size(); i++) {
+            Elf64_Phdr phdr = elf.phdrs[i];
+
+            if ((phdr.p_type != PT_LOAD) || !(phdr.p_type & PF_X)) {
+                continue;
+            }
+
+            maxPageSize = phdr.p_align;
+            break;
+        }
+
+        return maxPageSize;
+    }
+
+    static void SetUpTestSuite() {
+        if (VendorApiLevel() < __ANDROID_API_V__) {
+            GTEST_SKIP() << "16kB support is only required on V and later releases.";
+        }
+    }
+
+    /*
+     * x86_64 also needs to be at least 16KB aligned, since Android
+     * supports page size emulation in x86_64 for app development.
+     */
+    size_t RequiredMaxPageSize() {
+        if (mArch == "arm64" || mArch == "aarch64" || mArch == "x86_64") {
+            return 0x4000;
+        } else {
+            return 0x1000;
+        }
+    }
+
+    const std::string mArch = Architecture();
+};
+
+/**
+ * Checks the max-page-size of init against the architecture's
+ * required max-page-size.
+ *
+ * Note: a more comprehensive version of this test exists in
+ * elf_alignment_test. This has turned out to be a canary test
+ * to give visibility on this when checking all 16K tests.
+ */
+// @VsrTest = 3.14.1
+TEST_F(Vts16KPageSizeTest, InitMaxPageSizeTest) {
+    constexpr char initPath[] = "/system/bin/init";
+
+    ssize_t expectedMaxPageSize = RequiredMaxPageSize();
+    ASSERT_NE(expectedMaxPageSize, -1)
+            << "Failed to get required max page size for arch: " << mArch;
+
+    ssize_t initMaxPageSize = MaxPageSize(initPath);
+    ASSERT_NE(initMaxPageSize, -1) << "Failed to get max page size of ELF: " << initPath;
+
+    ASSERT_EQ(initMaxPageSize % expectedMaxPageSize, 0)
+            << "ELF " << initPath << " with page size " << initMaxPageSize
+            << " was not built with the required max-page-size " << expectedMaxPageSize;
+}
+
+/**
+ * Checks if the vendor's build was compiled with the define
+ * PRODUCT_NO_BIONIC_PAGE_SIZE_MACRO based on the product property
+ * ro.product.build.no_bionic_page_size_macro.
+ */
+// @VsrTest = 3.14.2
+TEST_F(Vts16KPageSizeTest, NoBionicPageSizeMacro) {
+    /**
+     * TODO(b/315034809): switch to error when final decision is made.
+     */
+    if (!NoBionicPageSizeMacroProperty())
+        GTEST_SKIP() << "Device was not built with: PRODUCT_NO_BIONIC_PAGE_SIZE_MACRO := true";
+}
+
+/**
+ * Checks if the device has page size which was set using TARGET_BOOTS_16K
+ */
+TEST_F(Vts16KPageSizeTest, ProductPageSize) {
+    // We can't set the default value to be 4096 since device which will have 16KB page size and
+    // doesn't set TARGET_BOOTS_16K, won't have this property and will fail the test.
+    int requiredPageSize = android::base::GetIntProperty("ro.product.page_size", 0);
+    if (requiredPageSize != 0) {
+        int currentPageSize = getpagesize();
+        ASSERT_EQ(requiredPageSize, currentPageSize);
+    } else {
+        GTEST_SKIP() << "Device was not built with option TARGET_BOOTS_16K = true";
+    }
+}
diff --git a/sdcardfs/src/com/android/sdcardfs/vts/SdcardfsTest.java b/sdcardfs/src/com/android/sdcardfs/vts/SdcardfsTest.java
index 83d0d13..1574a8d 100644
--- a/sdcardfs/src/com/android/sdcardfs/vts/SdcardfsTest.java
+++ b/sdcardfs/src/com/android/sdcardfs/vts/SdcardfsTest.java
@@ -17,6 +17,7 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
 
+import com.android.tradefed.device.DeviceNotAvailableException;
 import com.android.tradefed.log.LogUtil.CLog;
 import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
 import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test;
@@ -33,8 +34,17 @@
 
     private static final int MIN_KERNEL_MAJOR = 5;
     private static final int MIN_KERNEL_MINOR = 4;
+    private static final int MIN_FIRST_API_LEVEL = 30; // Android 11
 
-    private boolean should_run(String str) {
+    private boolean should_run(String str) throws DeviceNotAvailableException {
+        String result = getDevice().getProperty("ro.product.first_api_level");
+        if (result != null && !result.isEmpty()) {
+            int first_api_level = Integer.parseInt(result);
+
+            if (first_api_level < MIN_FIRST_API_LEVEL)
+                return false;
+        }
+
         Scanner versionScanner = new Scanner(str).useDelimiter("\\.");
         int major = versionScanner.nextInt();
         int minor = versionScanner.nextInt();
diff --git a/toolchain/Android.bp b/toolchain/Android.bp
index 6999bb6..659c962 100644
--- a/toolchain/Android.bp
+++ b/toolchain/Android.bp
@@ -28,10 +28,11 @@
     ],
     static_libs: [
         "libgmock",
+        "libkver",
     ],
     test_suites: [
         "device-tests",
-        "vts"
+        "vts",
     ],
     require_root: true,
     auto_gen_config: true,
diff --git a/toolchain/vts_kernel_toolchain.cpp b/toolchain/vts_kernel_toolchain.cpp
index a491914..bb72b3c 100644
--- a/toolchain/vts_kernel_toolchain.cpp
+++ b/toolchain/vts_kernel_toolchain.cpp
@@ -21,6 +21,7 @@
 #include <android/api-level.h>
 #include <gmock/gmock.h>
 #include <gtest/gtest.h>
+#include <kver/kernel_release.h>
 
 namespace android {
 namespace kernel {
@@ -77,5 +78,26 @@
   ASSERT_THAT(version_, ::testing::HasSubstr(needle));
 }
 
+// @VsrTest = 3.4.2
+TEST_F(KernelVersionTest, IsKleaf) {
+  constexpr uint64_t kMinAndroidRelease = 15;  // Android 15
+  const auto kernel_release =
+      android::kver::KernelRelease::Parse(version_, /* allow_suffix = */ true);
+  if (!kernel_release.has_value()) {
+    GTEST_SKIP()
+        << "The test only applies to android" << kMinAndroidRelease
+        << " or later kernels. The kernel release string does not have the"
+        << " GKI kernel release format: " << version_;
+  }
+  if (kernel_release->android_release() < kMinAndroidRelease) {
+    GTEST_SKIP() << "The test only applies to android" << kMinAndroidRelease
+                 << " or later kernels. This kernel declares android"
+                 << kernel_release->android_release() << ": " << version_;
+  }
+  ASSERT_THAT(version_, ::testing::HasSubstr("kleaf@"))
+      << "android" << kernel_release->android_release()
+      << " kernel is required to be built with Kleaf.";
+}
+
 }  // namespace kernel
 }  // namespace android