Merge "Reland "shipping level 31, target-level 6""
diff --git a/common/frontend/socket_vsock_proxy/main.cpp b/common/frontend/socket_vsock_proxy/main.cpp
index ee781ff..2eebc7f 100644
--- a/common/frontend/socket_vsock_proxy/main.cpp
+++ b/common/frontend/socket_vsock_proxy/main.cpp
@@ -49,15 +49,15 @@
     }
   }
 
-  ssize_t SendAll(const std::vector<char>& packet) {
+  ssize_t SendAll(const char* packet, ssize_t length) {
     ssize_t written{};
-    while (written < static_cast<ssize_t>(packet.size())) {
+    while (written < length) {
       if (!socket_->IsOpen()) {
         return -1;
       }
       auto just_written =
-          socket_->Send(packet.data() + written,
-                        packet.size() - written, MSG_NOSIGNAL);
+          socket_->Send(packet + written,
+                        length - written, MSG_NOSIGNAL);
       if (just_written <= 0) {
         LOG(INFO) << "Couldn't write to client: "
                   << strerror(socket_->GetErrno());
@@ -82,13 +82,14 @@
   SocketReceiver(const SocketReceiver&&) = delete;
   SocketReceiver& operator=(const SocketReceiver&) = delete;
 
-  // *packet will be empty if Read returns 0 or error
-  void Recv(std::vector<char>* packet) {
-    auto size = socket_->Read(packet->data(), packet->size());
+  // return value will be 0 if Read returns 0 or error
+  ssize_t Recv(char* packet, ssize_t length) {
+    auto size = socket_->Read(packet, length);
     if (size < 0) {
       size = 0;
     }
-    packet->resize(size);
+
+    return size;
   }
 
  private:
@@ -97,10 +98,11 @@
 
 void SocketToVsock(SocketReceiver socket_receiver,
                    SocketSender vsock_sender) {
+  char packet[kMaxPacketSize] = {};
+
   while (true) {
-    std::vector<char> packet(kMaxPacketSize, '\0');
-    socket_receiver.Recv(&packet);
-    if (packet.empty() || vsock_sender.SendAll(packet) < 0) {
+    ssize_t length = socket_receiver.Recv(packet, kMaxPacketSize);
+    if (length == 0 || vsock_sender.SendAll(packet, length) < 0) {
       break;
     }
   }
@@ -109,13 +111,14 @@
 
 void VsockToSocket(SocketSender socket_sender,
                    SocketReceiver vsock_receiver) {
-  std::vector<char> packet(kMaxPacketSize, '\0');
+  char packet[kMaxPacketSize] = {};
+
   while (true) {
-    vsock_receiver.Recv(&packet);
-    if (packet.empty()) {
+    ssize_t length = vsock_receiver.Recv(packet, kMaxPacketSize);
+    if (length == 0) {
       break;
     }
-    if (socket_sender.SendAll(packet) < 0) {
+    if (socket_sender.SendAll(packet, length) < 0) {
       break;
     }
   }
diff --git a/shared/sepolicy/vendor/file_contexts b/shared/sepolicy/vendor/file_contexts
index 0256dc9..d209c85 100644
--- a/shared/sepolicy/vendor/file_contexts
+++ b/shared/sepolicy/vendor/file_contexts
@@ -2,13 +2,20 @@
 # Devices
 #
 
-# crosvm block devices
+# crosvm (x86) block devices
 /dev/block/pci/pci0000:00/0000:00:01\.0/by-name/boot u:object_r:boot_block_device:s0
 /dev/block/pci/pci0000:00/0000:00:01\.0/by-name/metadata u:object_r:metadata_block_device:s0
 /dev/block/pci/pci0000:00/0000:00:01\.0/by-name/misc u:object_r:misc_block_device:s0
 /dev/block/pci/pci0000:00/0000:00:01\.0/by-name/super u:object_r:super_block_device:s0
 /dev/block/pci/pci0000:00/0000:00:01\.0/by-name/userdata u:object_r:userdata_block_device:s0
 /dev/block/pci/pci0000:00/0000:00:01\.0/by-name/cache u:object_r:cache_block_device:s0
+# crosvm (arm64) block devices
+/dev/block/platform/10000.pci/by-name/boot u:object_r:boot_block_device:s0
+/dev/block/platform/10000.pci/by-name/metadata u:object_r:metadata_block_device:s0
+/dev/block/platform/10000.pci/by-name/misc u:object_r:misc_block_device:s0
+/dev/block/platform/10000.pci/by-name/super u:object_r:super_block_device:s0
+/dev/block/platform/10000.pci/by-name/userdata u:object_r:userdata_block_device:s0
+/dev/block/platform/10000.pci/by-name/cache u:object_r:cache_block_device:s0
 # qemu block devices
 /dev/block/pci/pci0000:00/0000:00:03\.0/by-name/boot u:object_r:boot_block_device:s0
 /dev/block/pci/pci0000:00/0000:00:03\.0/by-name/metadata u:object_r:metadata_block_device:s0
diff --git a/shared/sepolicy/vendor/genfs_contexts b/shared/sepolicy/vendor/genfs_contexts
index 36a5a07..5ac5257 100644
--- a/shared/sepolicy/vendor/genfs_contexts
+++ b/shared/sepolicy/vendor/genfs_contexts
@@ -1,19 +1,30 @@
-genfscon sysfs /bus/iio/devices u:object_r:sysfs_iio_devices:s0
-genfscon sysfs /devices/pnp0/00:00/rtc  u:object_r:sysfs_rtc:s0 # qemu x86 virtual rtc
-genfscon sysfs /devices/platform/2000.rtc/rtc  u:object_r:sysfs_rtc:s0 # crosvm arm64 virtual rtc
-genfscon sysfs /devices/platform/rtc-test.0/rtc/rtc0/hctosys u:object_r:sysfs_rtc:s0
-genfscon sysfs /devices/platform/rtc-test.1/rtc/rtc1/hctosys u:object_r:sysfs_rtc:s0
-genfscon sysfs /devices/platform/rtc-test.2/rtc/rtc2/hctosys u:object_r:sysfs_rtc:s0
-genfscon sysfs /devices/pci0000:00/0000:00:04.0/virtio2/net u:object_r:sysfs_net:s0 # qemu buried_eth0 & wlan0
-genfscon sysfs /devices/pci0000:00/0000:00:05.0/virtio3/net u:object_r:sysfs_net:s0 # qemu rmnet0
-genfscon sysfs /devices/pci0000:00/0000:00:07.0/virtio6/net u:object_r:sysfs_net:s0 # crosvm buried_eth0 & wlan0
-genfscon sysfs /devices/pci0000:00/0000:00:08.0/virtio7/net u:object_r:sysfs_net:s0 # crosvm rmnet0
+# crosvm (x86)
+genfscon sysfs /devices/pci0000:00/0000:00:07.0/virtio6/net u:object_r:sysfs_net:s0 # buried_eth0 & wlan0
+genfscon sysfs /devices/pci0000:00/0000:00:08.0/virtio7/net u:object_r:sysfs_net:s0 # rmnet0
 genfscon sysfs /devices/pci0000:00/0000:00:0a.0/device u:object_r:sysfs_gpu:s0
 genfscon sysfs /devices/pci0000:00/0000:00:0a.0/subsystem_device u:object_r:sysfs_gpu:s0
 genfscon sysfs /devices/pci0000:00/0000:00:0a.0/subsystem_vendor u:object_r:sysfs_gpu:s0
 genfscon sysfs /devices/pci0000:00/0000:00:0a.0/uevent u:object_r:sysfs_gpu:s0
 genfscon sysfs /devices/pci0000:00/0000:00:0a.0/vendor u:object_r:sysfs_gpu:s0
+genfscon sysfs /devices/pnp0/00:00/rtc  u:object_r:sysfs_rtc:s0 # also used by qemu
+# crosvm (arm64)
+genfscon sysfs /devices/platform/10000.pci/pci0000:00/0000:00:07.0/virtio6/net u:object_r:sysfs_net:s0 # buried_eth0 & wlan0
+genfscon sysfs /devices/platform/10000.pci/pci0000:00/0000:00:08.0/virtio7/net u:object_r:sysfs_net:s0 # rmnet0
+genfscon sysfs /devices/platform/10000.pci/pci0000:00/0000:00:0a.0/device u:object_r:sysfs_gpu:s0
+genfscon sysfs /devices/platform/10000.pci/pci0000:00/0000:00:0a.0/subsystem_device u:object_r:sysfs_gpu:s0
+genfscon sysfs /devices/platform/10000.pci/pci0000:00/0000:00:0a.0/subsystem_vendor u:object_r:sysfs_gpu:s0
+genfscon sysfs /devices/platform/10000.pci/pci0000:00/0000:00:0a.0/uevent u:object_r:sysfs_gpu:s0
+genfscon sysfs /devices/platform/10000.pci/pci0000:00/0000:00:0a.0/vendor u:object_r:sysfs_gpu:s0
+genfscon sysfs /devices/platform/2000.rtc/rtc  u:object_r:sysfs_rtc:s0
+# qemu (x86)
+genfscon sysfs /devices/pci0000:00/0000:00:04.0/virtio2/net u:object_r:sysfs_net:s0 # buried_eth0 & wlan0
+genfscon sysfs /devices/pci0000:00/0000:00:05.0/virtio3/net u:object_r:sysfs_net:s0 # rmnet0
 
+# common on all platforms / vm managers
+genfscon sysfs /bus/iio/devices u:object_r:sysfs_iio_devices:s0
+genfscon sysfs /devices/platform/rtc-test.0/rtc/rtc0/hctosys u:object_r:sysfs_rtc:s0
+genfscon sysfs /devices/platform/rtc-test.1/rtc/rtc1/hctosys u:object_r:sysfs_rtc:s0
+genfscon sysfs /devices/platform/rtc-test.2/rtc/rtc2/hctosys u:object_r:sysfs_rtc:s0
 # TODO(b/148802006): Work around core policy sysfs_wakeup label not working
 # All kernels
 genfscon sysfs /devices/platform/rtc-test.1/wakeup/wakeup0  u:object_r:sysfs_wakeup:s0