summary refs log tree commit diff
path: root/pkgs/os-specific/linux/chromium-os
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/os-specific/linux/chromium-os')
-rw-r--r--pkgs/os-specific/linux/chromium-os/common-mk/0001-common-mk-don-t-leak-source-absolute-paths.patch207
-rw-r--r--pkgs/os-specific/linux/chromium-os/common-mk/0002-common-mk-.gn-don-t-hardcode-env-path.patch23
-rw-r--r--pkgs/os-specific/linux/chromium-os/common-mk/default.nix122
-rw-r--r--pkgs/os-specific/linux/chromium-os/crosvm/VIRTIO_NET_F_MAC.patch278
-rw-r--r--pkgs/os-specific/linux/chromium-os/crosvm/default-seccomp-policy-dir.diff15
-rw-r--r--pkgs/os-specific/linux/chromium-os/crosvm/default.nix85
-rw-r--r--pkgs/os-specific/linux/chromium-os/dbus-properties/default.nix9
-rw-r--r--pkgs/os-specific/linux/chromium-os/default.nix64
-rw-r--r--pkgs/os-specific/linux/chromium-os/libqmi/default.nix28
-rw-r--r--pkgs/os-specific/linux/chromium-os/minigbm/default.nix28
-rw-r--r--pkgs/os-specific/linux/chromium-os/modem-manager/default.nix33
-rw-r--r--pkgs/os-specific/linux/chromium-os/modem-manager/next.nix25
-rw-r--r--pkgs/os-specific/linux/chromium-os/modp_b64/default.nix23
-rw-r--r--pkgs/os-specific/linux/chromium-os/protofiles/default.nix34
-rw-r--r--pkgs/os-specific/linux/chromium-os/sommelier/0005-sommelier-don-t-leak-source-absolute-paths.patch25
-rw-r--r--pkgs/os-specific/linux/chromium-os/sommelier/0006-Revert-Revert-vm_tools-sommelier-Switch-to-the-stabl.patch1840
-rw-r--r--pkgs/os-specific/linux/chromium-os/sommelier/default.nix37
-rwxr-xr-xpkgs/os-specific/linux/chromium-os/update.py131
-rw-r--r--pkgs/os-specific/linux/chromium-os/upstream-info.json72
-rw-r--r--pkgs/os-specific/linux/chromium-os/vm_protos/0003-common-mk-add-goproto_library-source_relative-opt.patch48
-rw-r--r--pkgs/os-specific/linux/chromium-os/vm_protos/0004-vm_tools-proto-set-go_package-correctly.patch102
-rw-r--r--pkgs/os-specific/linux/chromium-os/vm_protos/default.nix41
22 files changed, 0 insertions, 3270 deletions
diff --git a/pkgs/os-specific/linux/chromium-os/common-mk/0001-common-mk-don-t-leak-source-absolute-paths.patch b/pkgs/os-specific/linux/chromium-os/common-mk/0001-common-mk-don-t-leak-source-absolute-paths.patch
deleted file mode 100644
index c2e33dbde66..00000000000
--- a/pkgs/os-specific/linux/chromium-os/common-mk/0001-common-mk-don-t-leak-source-absolute-paths.patch
+++ /dev/null
@@ -1,207 +0,0 @@
-From ae0c98ed2715c685b0cb97ac6e5d65101168b625 Mon Sep 17 00:00:00 2001
-From: Alyssa Ross <hi@alyssa.is>
-Date: Sun, 24 Nov 2019 16:56:11 +0000
-Subject: [PATCH 1/6] common-mk: don't leak source-absolute paths
-
-Source-absolute paths like //vm_tools/whatever were being leaked to
-subprocesses, which of course didn't know how to understand them.
-With this patch, source-absolute paths are only used to tell GN the
-outputs, and normal Unix paths are passed to subprocesses.
----
- common-mk/external_dependencies/BUILD.gn    |  3 ++-
- common-mk/mojom_bindings_generator.gni      | 12 ++++++------
- common-mk/mojom_type_mappings_generator.gni |  2 +-
- common-mk/pkg_config.gni                    |  3 ++-
- common-mk/proto_library.gni                 | 19 ++++++++++---------
- 5 files changed, 21 insertions(+), 18 deletions(-)
-
-diff --git a/common-mk/external_dependencies/BUILD.gn b/common-mk/external_dependencies/BUILD.gn
-index 2581d31ac8..2ead288006 100644
---- a/common-mk/external_dependencies/BUILD.gn
-+++ b/common-mk/external_dependencies/BUILD.gn
-@@ -45,6 +45,7 @@ genxml2cpp("dbus-proxies") {
- action("cloud_policy_proto_generator") {
-   policy_resources_dir = "${sysroot}/usr/share/policy_resources"
-   proto_out_dir = "${target_gen_dir}/proto"
-+  cloud_policy_protobuf_dir = rebase_path(proto_out_dir)
-   policy_tools_dir = "${sysroot}/usr/share/policy_tools"
- 
-   script = "${policy_tools_dir}/generate_policy_source.py"
-@@ -54,7 +55,7 @@ action("cloud_policy_proto_generator") {
-   ]
-   outputs = [ "${proto_out_dir}/cloud_policy.proto" ]
-   args = [
--    "--cloud-policy-protobuf=${proto_out_dir}/cloud_policy.proto",
-+    "--cloud-policy-protobuf=${cloud_policy_protobuf_dir}/cloud_policy.proto",
-     "--chrome-version-file=${policy_resources_dir}/VERSION",
-     "--target-platform=chromeos",
-     "--policy-templates-file=${policy_resources_dir}/policy_templates.json",
-diff --git a/common-mk/mojom_bindings_generator.gni b/common-mk/mojom_bindings_generator.gni
-index 038c20ed36..205d7d3037 100644
---- a/common-mk/mojom_bindings_generator.gni
-+++ b/common-mk/mojom_bindings_generator.gni
-@@ -100,7 +100,7 @@ template("generate_mojom_bindings_gen") {
-     args = [
-       "mkdir",
-       "-p",
--      mojo_templates_dir,
-+      rebase_path(mojo_templates_dir),
-     ]
-   }
- 
-@@ -116,7 +116,7 @@ template("generate_mojom_bindings_gen") {
-     args = [
-       "--use_bundled_pylibs",
-       "-o",
--      mojo_templates_dir,
-+      rebase_path(mojo_templates_dir),
-       "precompile",
-     ]
-     deps = [ ":${mojo_templates_dir_action_name}" ]
-@@ -143,7 +143,7 @@ template("generate_mojom_bindings_gen") {
-     args = [
-       "--mojom-file-list={{response_file_name}}",
-       "--output-root",
--      _mojo_output_base,
-+      rebase_path(_mojo_output_base),
-       "--input-root",
-       mojo_root,  # Mojo depth.
-       "--input-root",
-@@ -188,11 +188,11 @@ template("generate_mojom_bindings_gen") {
-              mojom_bindings_generator,
-              "--use_bundled_pylibs",
-              "--output_dir",
--             _mojo_output_base,
-+             rebase_path(_mojo_output_base),
-              "generate",
-              "--filelist={{response_file_name}}",
-              "--bytecode_path",
--             mojo_templates_dir,
-+             rebase_path(mojo_templates_dir),
-              "-I",
-              mojo_root,  # Mojo include path.
-              "-d",
-@@ -216,7 +216,7 @@ template("generate_mojom_bindings_gen") {
-       foreach(typemap, invoker.typemaps) {
-         args += [
-           "--typemap",
--          typemap,
-+          rebase_path(typemap),
-         ]
-       }
-     }
-diff --git a/common-mk/mojom_type_mappings_generator.gni b/common-mk/mojom_type_mappings_generator.gni
-index ff09397111..959a8b6ca9 100644
---- a/common-mk/mojom_type_mappings_generator.gni
-+++ b/common-mk/mojom_type_mappings_generator.gni
-@@ -21,7 +21,7 @@ template("generate_mojom_type_mappings") {
-     outputs = [ "$target_gen_dir/${target_name}_typemapping" ]
-     args = [
-              "--output",
--             "$target_gen_dir/${target_name}_typemapping",
-+             rebase_path("$target_gen_dir/${target_name}_typemapping"),
-            ] + rebase_path(sources, root_build_dir)
-   }
- }
-diff --git a/common-mk/pkg_config.gni b/common-mk/pkg_config.gni
-index b2c58845d4..31d3f4ab51 100644
---- a/common-mk/pkg_config.gni
-+++ b/common-mk/pkg_config.gni
-@@ -81,7 +81,8 @@ template("generate_pkg_config") {
-     if (!defined(output_name)) {
-       output_name = name
-     }
--    outputs = [ "${target_out_dir}/${output_name}.pc" ]
-+    lib_path = "${target_out_dir}/${output_name}.pc"
-+    outputs = [ lib_path ]
- 
-     script = "//common-mk/generate-pc.py"
-     args = [ "--output" ] + rebase_path(outputs) + [ "--name=" + name ]
-diff --git a/common-mk/proto_library.gni b/common-mk/proto_library.gni
-index e64aedabe0..fb9fb4231d 100644
---- a/common-mk/proto_library.gni
-+++ b/common-mk/proto_library.gni
-@@ -56,7 +56,7 @@ template("proto_library") {
- 
-     cc_dir = "${root_gen_dir}/${proto_out_dir}"
-     proto_in_dir = rebase_path(proto_in_dir)
--    proto_out_dir = rebase_path(proto_out_dir)
-+    proto_out_dir = rebase_path(cc_dir)
- 
-     proto_lib_dirs = [
-       proto_in_dir,
-@@ -96,10 +96,9 @@ template("proto_library") {
-     }
-     outputs = []
-     if (gen_python) {
--      python_dir = "${root_gen_dir}/${proto_out_dir}/py"
-       args += [
-         "--python_out",
--        "${python_dir}",
-+        "${proto_out_dir}/py",
-       ]
-       foreach(source, sources) {
-         source = rebase_path(source, proto_in_dir)
-@@ -109,19 +108,19 @@ template("proto_library") {
-     }
-     if (gen_grpc) {
-       if (gen_grpc_gmock) {
--        args += [ "--grpc_out=generate_mock_code=true:${cc_dir}" ]
-+        args += [ "--grpc_out=generate_mock_code=true:${proto_out_dir}" ]
-         foreach(source, sources) {
-           source = rebase_path(source, proto_in_dir)
-           source = string_replace(source, ".proto", "")
-           outputs += [ "${cc_dir}/${source}_mock.grpc.pb.h" ]
-         }
-       } else {
--        args += [ "--grpc_out=${cc_dir}" ]
-+        args += [ "--grpc_out=${proto_out_dir}" ]
-       }
-       grpc_cpp_plugin = "/usr/bin/grpc_cpp_plugin"
-       args += [
-         "--plugin=protoc-gen-grpc=${grpc_cpp_plugin}",
--        "--cpp_out=${gen_cpp_mode}${cc_dir}",
-+        "--cpp_out=${gen_cpp_mode}${proto_out_dir}",
-       ]
-       foreach(source, sources) {
-         source = rebase_path(source, proto_in_dir)
-@@ -135,7 +134,7 @@ template("proto_library") {
-       }
-     }
-     if (!gen_grpc && !gen_python) {
--      args += [ "--cpp_out=${gen_cpp_mode}${cc_dir}" ]
-+      args += [ "--cpp_out=${gen_cpp_mode}${proto_out_dir}" ]
-       foreach(source, sources) {
-         source = rebase_path(source, proto_in_dir)
-         source = string_replace(source, ".proto", "")
-@@ -238,7 +237,9 @@ template("goproto_library") {
-     # otherwise file descriptor var name will conflict.
-     # cf) https://github.com/golang/protobuf/issues/109
- 
-+    cc_dir = "${root_gen_dir}/${proto_out_dir}"
-     proto_in_dir = rebase_path(invoker.proto_in_dir)
-+    proto_out_dir = rebase_path(cc_dir)
- 
-     # Build protoc command line to run.
-     script = "//common-mk/file_generator_wrapper.py"
-@@ -278,7 +279,7 @@ template("goproto_library") {
-       "--go_out",
- 
-       # go_out_prefix can be empty, so we can always add a colon here.
--      "${go_out_prefix}:${root_gen_dir}/${proto_out_dir}",
-+      "${go_out_prefix}:${proto_out_dir}",
-     ]
-     foreach(source, sources) {
-       args += [ rebase_path(source) ]
-@@ -288,7 +289,7 @@ template("goproto_library") {
-     outputs = []
-     foreach(source, invoker.sources) {
-       name = get_path_info(source, "name")
--      outputs += [ "${root_gen_dir}/${proto_out_dir}/${name}.pb.go" ]
-+      outputs += [ "${cc_dir}/${name}.pb.go" ]
-     }
-   }
- }
--- 
-2.32.0
-
diff --git a/pkgs/os-specific/linux/chromium-os/common-mk/0002-common-mk-.gn-don-t-hardcode-env-path.patch b/pkgs/os-specific/linux/chromium-os/common-mk/0002-common-mk-.gn-don-t-hardcode-env-path.patch
deleted file mode 100644
index a6ac5b1e9ac..00000000000
--- a/pkgs/os-specific/linux/chromium-os/common-mk/0002-common-mk-.gn-don-t-hardcode-env-path.patch
+++ /dev/null
@@ -1,23 +0,0 @@
-From 7d33bcd724ec79d00281c2752f9642be25782370 Mon Sep 17 00:00:00 2001
-From: Alyssa Ross <hi@alyssa.is>
-Date: Sun, 24 Nov 2019 17:20:46 +0000
-Subject: [PATCH 2/6] common-mk: .gn: don't hardcode env path
-
-This is needlessly non-portable.
----
- .gn | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/.gn b/.gn
-index e7dba8c91c..e29fcd61ee 100644
---- a/.gn
-+++ b/.gn
-@@ -7,4 +7,4 @@ root = "//common-mk/gn_root/:"
- 
- # This makes all scripts run by gn respect the shebang setting of the script.
- # Otherwise, the default is to always use `python`.
--script_executable = "/usr/bin/env"
-+script_executable = "env"
--- 
-2.32.0
-
diff --git a/pkgs/os-specific/linux/chromium-os/common-mk/default.nix b/pkgs/os-specific/linux/chromium-os/common-mk/default.nix
deleted file mode 100644
index d617401138f..00000000000
--- a/pkgs/os-specific/linux/chromium-os/common-mk/default.nix
+++ /dev/null
@@ -1,122 +0,0 @@
-{ stdenv, lib, fetchFromGitiles, upstreamInfo, gn, pkgconfig, python3, ninja
-# , libchrome
-}:
-
-{ platformSubdir
-
-# Mandatory, unlike in mkDerivation, because Google doesn't provide
-# install tasks and just does that in their ebuilds.
-, installPhase
-
-# src allows an out-of-tree (i.e., out-of-platform2) package to be
-# built with common-mk.  patches will be applied to `src` -- to patch
-# platform2 itself use platform2Patches.
-, src ? null, platform2Patches ? []
-
-# gnArgs allows structured data (attribute sets) to be serialized and
-# passed to gn, unlike gnFlags provided by gn's setupHook, which is a
-# flat list of strings.
-, gnArgs ? {}, gnFlags ? [], use ? {}
-
-, postUnpack ? "", prePatch ? "", postPatch ? ""
-, nativeBuildInputs ? []
-, meta ? {}
-, ... } @ args:
-
-let
-  platform2 = fetchFromGitiles upstreamInfo.components."src/platform2";
-
-  attrsToGnList = lib.mapAttrsToList (name: value: "${name}=${toGn value}");
-
-  toGn = value:
-    if lib.isAttrs value then
-      "{${lib.concatStringsSep " " (attrsToGnList value)}}"
-    else
-      builtins.toJSON value;
-in
-
-stdenv.mkDerivation ({
-  pname = lib.last (lib.splitString "/" platformSubdir);
-  inherit (upstreamInfo) version;
-
-  srcs = [ platform2 ] ++ lib.optional (src != null) src;
-  sourceRoot = "platform2";
-
-  postUnpack = lib.optionalString (src != null) ''
-    ln -s ../${src.name} $sourceRoot/${platformSubdir}
-    chmod -R +w ${src.name}
-  '' + postUnpack;
-
-  prePatch = ''
-    pushd ${platformSubdir}
-  '' + prePatch;
-
-  postPatch = ''
-    popd
-    ${lib.concatMapStrings (patch: ''
-      echo applying patch ${patch}
-      patch -p1 < ${patch} 
-    '') ([
-      ./0001-common-mk-don-t-leak-source-absolute-paths.patch
-      ./0002-common-mk-.gn-don-t-hardcode-env-path.patch
-    ] ++ platform2Patches)}
-
-    patchShebangs common-mk
-  '' + (lib.optionalString (!stdenv.cc.isClang) ''
-    substituteInPlace common-mk/BUILD.gn \
-        --replace '"-Wno-c99-designator",' "" \
-        --replace '"-Wstring-compare",' "" \
-        --replace '"-Wstring-plus-int",' "" \
-        --replace '"-Wxor-used-as-pow",' "" \
-        --replace '"-Wunreachable-code-return",' ""
-  '') + postPatch;
-
-  nativeBuildInputs = [ gn pkgconfig python3 ninja ] ++ nativeBuildInputs;
-
-  gnFlags = (attrsToGnList ({
-    ar = "ar";
-    cc = "cc";
-    cxx = "c++";
-    # libbase_ver = libchrome.version;
-    libdir = placeholder "out";
-    pkg_config = "pkg-config";
-    platform2_root = ".";
-    platform_subdir = platformSubdir;
-    use = {
-      amd64 = stdenv.targetPlatform.isx86_64;
-      arm = stdenv.targetPlatform.isAarch32 || stdenv.targetPlatform.isAarch64;
-      asan = false;
-      coverage = false;
-      cros_host = false;
-      crypto = false;
-      dbus = false;
-      device_mapper = false;
-      fuzzer = false;
-      mojo = false;
-      profiling = false;
-      tcmalloc = false;
-      test = false;
-      timers = false;
-      udev = false;
-    } // use;
-  } // gnArgs)) ++ gnFlags;
-
-  passthru.updateScript = ../update.py;
-
-  meta = {
-    homepage =
-      if src == null then
-        "${platform2.meta.homepage}/+/HEAD/${platformSubdir}"
-      else
-        src.meta.homepage;
-    platform = lib.platforms.linux;
-  } // lib.optionalAttrs (src == null) {
-    license = lib.licenses.bsd3;
-  } // meta;
-} // (builtins.removeAttrs args [
-  "src"
-  "gnArgs" "gnFlags" "use"
-  "postUnpack" "prePatch" "postPatch"
-  "nativeBuildInputs"
-  "meta"
-]))
diff --git a/pkgs/os-specific/linux/chromium-os/crosvm/VIRTIO_NET_F_MAC.patch b/pkgs/os-specific/linux/chromium-os/crosvm/VIRTIO_NET_F_MAC.patch
deleted file mode 100644
index 80cab56b1f8..00000000000
--- a/pkgs/os-specific/linux/chromium-os/crosvm/VIRTIO_NET_F_MAC.patch
+++ /dev/null
@@ -1,278 +0,0 @@
-From 2b5a83bd9e2c1c9642773c1daf785d03f95f33a3 Mon Sep 17 00:00:00 2001
-From: Alyssa Ross <hi@alyssa.is>
-Date: Sun, 27 Sep 2020 15:34:02 +0000
-Subject: [PATCH crosvm v3] crosvm: support setting guest MAC from tap-fd
-
-This adds a mac= option to crosvm's --tap-fd option.  The virtio-net
-driver in the guest will read the desired MAC from virtio
-configuration space.
-
-See the documentation for VIRTIO_NET_F_MAC in the Virtio spec[1].
-
-[1]: https://docs.oasis-open.org/virtio/virtio/v1.1/virtio-v1.1.html
-
-Thanks-to: Puck Meerburg <puck@puckipedia.com>
-Reviewed-by: Cole Helbling <cole.e.helbling@outlook.com>
-Message-Id: <20210517185700.3591932-1-hi@alyssa.is>
----
- devices/src/virtio/net.rs | 20 ++++++++++--
- src/crosvm.rs             |  8 +++--
- src/linux.rs              | 19 +++++++-----
- src/main.rs               | 64 +++++++++++++++++++++++++++++++--------
- 4 files changed, 88 insertions(+), 23 deletions(-)
-
-diff --git a/devices/src/virtio/net.rs b/devices/src/virtio/net.rs
-index b88dc44ae..b7489eb2b 100644
---- a/devices/src/virtio/net.rs
-+++ b/devices/src/virtio/net.rs
-@@ -419,6 +419,7 @@ where
- }
- 
- pub struct Net<T: TapT> {
-+    mac_address: Option<MacAddress>,
-     queue_sizes: Box<[u16]>,
-     workers_kill_evt: Vec<Event>,
-     kill_evts: Vec<Event>,
-@@ -439,6 +440,7 @@ where
-         ip_addr: Ipv4Addr,
-         netmask: Ipv4Addr,
-         mac_addr: MacAddress,
-+        guest_mac_addr: Option<MacAddress>,
-         vq_pairs: u16,
-     ) -> Result<Net<T>, NetError> {
-         let multi_queue = vq_pairs > 1;
-@@ -450,12 +452,17 @@ where
- 
-         tap.enable().map_err(NetError::TapEnable)?;
- 
--        Net::from(base_features, tap, vq_pairs)
-+        Net::with_tap(base_features, tap, vq_pairs, guest_mac_addr)
-     }
- 
-     /// Creates a new virtio network device from a tap device that has already been
-     /// configured.
--    pub fn from(base_features: u64, tap: T, vq_pairs: u16) -> Result<Net<T>, NetError> {
-+    pub fn with_tap(
-+        base_features: u64,
-+        tap: T,
-+        vq_pairs: u16,
-+        mac_address: Option<MacAddress>,
-+    ) -> Result<Net<T>, NetError> {
-         let taps = tap.into_mq_taps(vq_pairs).map_err(NetError::TapOpen)?;
- 
-         // This would also validate a tap created by Self::new(), but that's a good thing as it
-@@ -488,7 +495,12 @@ where
-             workers_kill_evt.push(worker_kill_evt);
-         }
- 
-+        if mac_address.is_some() {
-+            avail_features |= 1 << virtio_net::VIRTIO_NET_F_MAC;
-+        }
-+
-         Ok(Net {
-+            mac_address,
-             queue_sizes: vec![QUEUE_SIZE; (vq_pairs * 2 + 1) as usize].into_boxed_slice(),
-             workers_kill_evt,
-             kill_evts,
-@@ -503,6 +515,10 @@ where
-         let vq_pairs = self.queue_sizes.len() as u16 / 2;
- 
-         VirtioNetConfig {
-+            mac: self
-+                .mac_address
-+                .map(|m| m.octets())
-+                .unwrap_or_else(Default::default),
-             max_vq_pairs: Le16::from(vq_pairs),
-             // Other field has meaningful value when the corresponding feature
-             // is enabled, but all these features aren't supported now.
-diff --git a/src/crosvm.rs b/src/crosvm.rs
-index eededc02e..62b3019db 100644
---- a/src/crosvm.rs
-+++ b/src/crosvm.rs
-@@ -191,6 +191,10 @@ impl Default for SharedDir {
-     }
- }
- 
-+pub struct TapFdOption {
-+    pub mac: Option<net_util::MacAddress>,
-+}
-+
- /// Aggregate of all configurable options for a running VM.
- pub struct Config {
-     pub kvm_device_path: PathBuf,
-@@ -217,7 +221,7 @@ pub struct Config {
-     pub mac_address: Option<net_util::MacAddress>,
-     pub net_vq_pairs: Option<u16>,
-     pub vhost_net: bool,
--    pub tap_fd: Vec<RawFd>,
-+    pub tap_fd: BTreeMap<RawFd, TapFdOption>,
-     pub cid: Option<u64>,
-     pub wayland_socket_paths: BTreeMap<String, PathBuf>,
-     pub wayland_dmabuf: bool,
-@@ -291,7 +295,7 @@ impl Default for Config {
-             mac_address: None,
-             net_vq_pairs: None,
-             vhost_net: false,
--            tap_fd: Vec::new(),
-+            tap_fd: BTreeMap::new(),
-             cid: None,
-             #[cfg(feature = "gpu")]
-             gpu_parameters: None,
-diff --git a/src/linux.rs b/src/linux.rs
-index ba2d28f96..e9601478a 100644
---- a/src/linux.rs
-+++ b/src/linux.rs
-@@ -60,8 +60,8 @@ use vm_memory::{GuestAddress, GuestMemory};
- #[cfg(all(target_arch = "x86_64", feature = "gdb"))]
- use crate::gdb::{gdb_thread, GdbStub};
- use crate::{
--    Config, DiskOption, Executable, SharedDir, SharedDirKind, TouchDeviceOption, VhostUserFsOption,
--    VhostUserOption,
-+    Config, DiskOption, Executable, SharedDir, SharedDirKind, TapFdOption, TouchDeviceOption,
-+    VhostUserFsOption, VhostUserOption,
- };
- use arch::{
-     self, LinuxArch, RunnableLinuxVm, SerialHardware, SerialParameters, VcpuAffinity,
-@@ -763,7 +763,11 @@ fn create_balloon_device(cfg: &Config, tube: Tube) -> DeviceResult {
-     })
- }
- 
--fn create_tap_net_device(cfg: &Config, tap_fd: RawDescriptor) -> DeviceResult {
-+fn create_tap_net_device(
-+    cfg: &Config,
-+    tap_fd: RawDescriptor,
-+    options: &TapFdOption,
-+) -> DeviceResult {
-     // Safe because we ensure that we get a unique handle to the fd.
-     let tap = unsafe {
-         Tap::from_raw_descriptor(
-@@ -779,7 +783,8 @@ fn create_tap_net_device(cfg: &Config, tap_fd: RawDescriptor) -> DeviceResult {
-         vq_pairs = 1;
-     }
-     let features = virtio::base_features(cfg.protected_vm);
--    let dev = virtio::Net::from(features, tap, vq_pairs).map_err(Error::NetDeviceNew)?;
-+    let dev =
-+        virtio::Net::with_tap(features, tap, vq_pairs, options.mac).map_err(Error::NetDeviceNew)?;
- 
-     Ok(VirtioDeviceStub {
-         dev: Box::new(dev),
-@@ -814,7 +819,7 @@ fn create_net_device(
-         .map_err(Error::VhostNetDeviceNew)?;
-         Box::new(dev) as Box<dyn VirtioDevice>
-     } else {
--        let dev = virtio::Net::<Tap>::new(features, host_ip, netmask, mac_address, vq_pairs)
-+        let dev = virtio::Net::<Tap>::new(features, host_ip, netmask, mac_address, None, vq_pairs)
-             .map_err(Error::NetDeviceNew)?;
-         Box::new(dev) as Box<dyn VirtioDevice>
-     };
-@@ -1445,8 +1450,8 @@ fn create_virtio_devices(
-     devs.push(create_balloon_device(cfg, balloon_device_tube)?);
- 
-     // We checked above that if the IP is defined, then the netmask is, too.
--    for tap_fd in &cfg.tap_fd {
--        devs.push(create_tap_net_device(cfg, *tap_fd)?);
-+    for (tap_fd, options) in &cfg.tap_fd {
-+        devs.push(create_tap_net_device(cfg, *tap_fd, options)?);
-     }
- 
-     if let (Some(host_ip), Some(netmask), Some(mac_address)) =
-diff --git a/src/main.rs b/src/main.rs
-index ab62f2543..e1188a86c 100644
---- a/src/main.rs
-+++ b/src/main.rs
-@@ -20,13 +20,15 @@ use arch::{
-     set_default_serial_parameters, Pstore, SerialHardware, SerialParameters, SerialType,
-     VcpuAffinity,
- };
--use base::{debug, error, getpid, info, kill_process_group, reap_child, syslog, warn};
-+use base::{
-+    debug, error, getpid, info, kill_process_group, reap_child, syslog, warn, RawDescriptor,
-+};
- #[cfg(feature = "direct")]
- use crosvm::DirectIoOption;
- use crosvm::{
-     argument::{self, print_help, set_arguments, Argument},
--    platform, BindMount, Config, DiskOption, Executable, GidMap, SharedDir, TouchDeviceOption,
--    VhostUserFsOption, VhostUserOption, DISK_ID_LEN,
-+    platform, BindMount, Config, DiskOption, Executable, GidMap, SharedDir, TapFdOption,
-+    TouchDeviceOption, VhostUserFsOption, VhostUserOption, DISK_ID_LEN,
- };
- #[cfg(feature = "gpu")]
- use devices::virtio::gpu::{GpuMode, GpuParameters};
-@@ -1460,17 +1462,55 @@ fn set_argument(cfg: &mut Config, name: &str, value: Option<&str>) -> argument::
-         }
-         "vhost-net" => cfg.vhost_net = true,
-         "tap-fd" => {
--            cfg.tap_fd.push(
--                value
--                    .unwrap()
--                    .parse()
--                    .map_err(|_| argument::Error::InvalidValue {
-+            let mut components = value.unwrap().split(',');
-+
-+            let fd: RawDescriptor =
-+                components
-+                    .next()
-+                    .and_then(|x| x.parse().ok())
-+                    .ok_or_else(|| argument::Error::InvalidValue {
-                         value: value.unwrap().to_owned(),
-                         expected: String::from(
-                             "this value for `tap-fd` must be an unsigned integer",
-                         ),
--                    })?,
--            );
-+                    })?;
-+
-+            let mut mac = None;
-+            for c in components {
-+                let mut kv = c.splitn(2, '=');
-+                let (kind, value) = match (kv.next(), kv.next()) {
-+                    (Some(kind), Some(value)) => (kind, value),
-+                    _ => {
-+                        return Err(argument::Error::InvalidValue {
-+                            value: c.to_owned(),
-+                            expected: String::from("option must be of the form `kind=value`"),
-+                        })
-+                    }
-+                };
-+                match kind {
-+                    "mac" => {
-+                        mac = Some(value.parse().map_err(|_| argument::Error::InvalidValue {
-+                            value: value.to_owned(),
-+                            expected: String::from(
-+                                "`mac` needs to be in the form \"XX:XX:XX:XX:XX:XX\"",
-+                            ),
-+                        })?)
-+                    }
-+                    _ => {
-+                        return Err(argument::Error::InvalidValue {
-+                            value: kind.to_owned(),
-+                            expected: String::from("unrecognized option"),
-+                        })
-+                    }
-+                }
-+            }
-+            if cfg.tap_fd.contains_key(&fd) {
-+                return Err(argument::Error::TooManyArguments(format!(
-+                    "TAP FD already used: '{}'",
-+                    name
-+                )));
-+            }
-+            cfg.tap_fd.insert(fd, TapFdOption { mac });
-         }
-         #[cfg(feature = "gpu")]
-         "gpu" => {
-@@ -1907,8 +1947,8 @@ writeback=BOOL - Indicates whether the VM can use writeback caching (default: fa
-           Argument::value("plugin-gid-map-file", "PATH", "Path to the file listing supplemental GIDs that should be mapped in plugin jail.  Can be given more than once."),
-           Argument::flag("vhost-net", "Use vhost for networking."),
-           Argument::value("tap-fd",
--                          "fd",
--                          "File descriptor for configured tap device. A different virtual network card will be added each time this argument is given."),
-+                          "FD[,mac=MAC]",
-+                          "File descriptor for configured tap device. A different virtual network card will be added each time this argument is given. MAC is the MAC address that will be set in the guest."),
-           #[cfg(feature = "gpu")]
-           Argument::flag_or_value("gpu",
-                                   "[width=INT,height=INT]",
--- 
-2.31.1
-
diff --git a/pkgs/os-specific/linux/chromium-os/crosvm/default-seccomp-policy-dir.diff b/pkgs/os-specific/linux/chromium-os/crosvm/default-seccomp-policy-dir.diff
deleted file mode 100644
index f1aa50ee102..00000000000
--- a/pkgs/os-specific/linux/chromium-os/crosvm/default-seccomp-policy-dir.diff
+++ /dev/null
@@ -1,15 +0,0 @@
-diff --git a/src/crosvm.rs b/src/crosvm.rs
-index b7055df..5989c87 100644
---- a/src/crosvm.rs
-+++ b/src/crosvm.rs
-@@ -141,7 +141,9 @@ impl Default for Config {
-             x_display: None,
-             shared_dirs: Vec::new(),
-             sandbox: !cfg!(feature = "default-no-sandbox"),
--            seccomp_policy_dir: PathBuf::from(SECCOMP_POLICY_DIR),
-+            seccomp_policy_dir: PathBuf::from(
-+                option_env!("DEFAULT_SECCOMP_POLICY_DIR").unwrap_or(SECCOMP_POLICY_DIR),
-+            ),
-             seccomp_log_failures: false,
-             cras_audio: false,
-             cras_capture: false,
diff --git a/pkgs/os-specific/linux/chromium-os/crosvm/default.nix b/pkgs/os-specific/linux/chromium-os/crosvm/default.nix
deleted file mode 100644
index 25fa4e2d937..00000000000
--- a/pkgs/os-specific/linux/chromium-os/crosvm/default.nix
+++ /dev/null
@@ -1,85 +0,0 @@
-{ stdenv, lib, rustPlatform, fetchFromGitiles, upstreamInfo
-, pkg-config, minigbm, minijail, wayland, wayland-protocols, dtc, libusb1
-, libcap, linux
-}:
-
-let
-  arch = with stdenv.hostPlatform;
-    if isAarch64 then "arm"
-    else if isx86_64 then "x86_64"
-    else throw "no seccomp policy files available for host platform";
-
-  getSrc = path: fetchFromGitiles upstreamInfo.components.${path};
-  srcs = lib.genAttrs [
-    "src/aosp/external/minijail"
-    "src/platform/crosvm"
-    "src/platform2"
-    "src/third_party/adhd"
-    "src/third_party/rust-vmm/vhost"
-  ] getSrc;
-in
-
-  rustPlatform.buildRustPackage rec {
-    pname = "crosvm";
-    inherit (upstreamInfo) version;
-
-    unpackPhase = ''
-      runHook preUnpack
-
-      ${lib.concatStringsSep "\n" (lib.mapAttrsToList (path: src: ''
-        mkdir -p ${dirOf path}
-        pushd ${dirOf path}
-        unpackFile ${src}
-        popd
-      '') srcs)}
-
-      chmod -R u+w -- "$sourceRoot"
-
-      runHook postUnpack
-    '';
-
-    sourceRoot = "src/platform/crosvm";
-
-    patches = [
-      ./default-seccomp-policy-dir.diff
-      ./VIRTIO_NET_F_MAC.patch
-    ];
-
-    cargoSha256 = "1yhxw19niqwipi1fbrskrpvhs915lrs8sdcpknmqd9izq67r3a06";
-
-    nativeBuildInputs = [ pkg-config wayland ];
-
-    buildInputs = [ dtc libcap libusb1 minigbm minijail wayland wayland-protocols ];
-
-    postPatch = ''
-      sed -i "s|/usr/share/policy/crosvm/|$out/share/policy/|g" \
-             seccomp/*/*.policy
-    '';
-
-    preBuild = ''
-      export DEFAULT_SECCOMP_POLICY_DIR=$out/share/policy
-    '';
-
-    postInstall = ''
-      mkdir -p $out/share/policy/
-      cp seccomp/${arch}/* $out/share/policy/
-    '';
-
-    CROSVM_CARGO_TEST_KERNEL_BINARY =
-      lib.optionalString (stdenv.buildPlatform == stdenv.hostPlatform)
-        "${linux}/${stdenv.hostPlatform.linux-kernel.target}";
-
-    passthru = {
-      inherit srcs;
-      src = srcs.${sourceRoot};
-      updateScript = ../update.py;
-    };
-
-    meta = with lib; {
-      description = "A secure virtual machine monitor for KVM";
-      homepage = "https://chromium.googlesource.com/chromiumos/platform/crosvm/";
-      maintainers = with maintainers; [ qyliss ];
-      license = licenses.bsd3;
-      platforms = [ "aarch64-linux" "x86_64-linux" ];
-    };
-  }
diff --git a/pkgs/os-specific/linux/chromium-os/dbus-properties/default.nix b/pkgs/os-specific/linux/chromium-os/dbus-properties/default.nix
deleted file mode 100644
index e95ef4a9aa8..00000000000
--- a/pkgs/os-specific/linux/chromium-os/dbus-properties/default.nix
+++ /dev/null
@@ -1,9 +0,0 @@
-{ runCommand, chromiumos-overlay }:
-
-runCommand "dbus-properties" {
-  passthru.updateScript = ../update.py;
-} ''
-  mkdir -p $out/share/dbus-1/interfaces
-  cp ${chromiumos-overlay}/sys-apps/dbus/files/org.freedesktop.DBus.Properties.xml \
-      $out/share/dbus-1/interfaces
-''
diff --git a/pkgs/os-specific/linux/chromium-os/default.nix b/pkgs/os-specific/linux/chromium-os/default.nix
deleted file mode 100644
index efdf600756f..00000000000
--- a/pkgs/os-specific/linux/chromium-os/default.nix
+++ /dev/null
@@ -1,64 +0,0 @@
-{ lib, newScope, fetchFromGitiles, symlinkJoin
-, kernelPatches, libqmi, linux_5_4, makeLinuxHeaders, modemmanager
-}:
-
-let
-  self = with self; {
-    callPackage = newScope self;
-
-    upstreamInfo = lib.importJSON ./upstream-info.json;
-
-    chromiumos-overlay = (fetchFromGitiles
-      upstreamInfo.components."src/third_party/chromiumos-overlay") // {
-        passthru.updateScript = ./update.py;
-      };
-
-    common-mk = callPackage ./common-mk { };
-
-    crosvm = callPackage ./crosvm { };
-
-    dbus-properties = callPackage ./dbus-properties { };
-
-    dbus-interfaces = symlinkJoin {
-      name = "dbus-interfaces";
-      paths = [ dbus-properties self.modemmanager modemmanager-next ];
-      passthru.updateScript = ./update.py;
-    };
-
-    libqmi = callPackage ./libqmi {
-      inherit libqmi;
-    };
-
-    linux_5_4 = callPackage ../kernel/linux-cros.nix {
-      kernelPatches =
-        lib.remove kernelPatches.rtl8761b_support linux_5_4.kernelPatches;
-    };
-
-    linux = self.linux_5_4;
-
-    linuxHeaders = (makeLinuxHeaders {
-      inherit (linux) version src patches;
-    });
-
-    minigbm = callPackage ./minigbm { };
-
-    modemmanager = callPackage ./modem-manager {
-      inherit modemmanager;
-    };
-
-    modemmanager-next = callPackage ./modem-manager/next.nix {
-      inherit modemmanager;
-    };
-
-    modp_b64 = callPackage ./modp_b64 { };
-
-    protofiles = callPackage ./protofiles { };
-
-    sommelier = callPackage ./sommelier { };
-
-    vm_protos = callPackage ./vm_protos { };
-  };
-
-in self // (with self; {
-  inherit (upstreamInfo) version;
-})
diff --git a/pkgs/os-specific/linux/chromium-os/libqmi/default.nix b/pkgs/os-specific/linux/chromium-os/libqmi/default.nix
deleted file mode 100644
index b96b5224b57..00000000000
--- a/pkgs/os-specific/linux/chromium-os/libqmi/default.nix
+++ /dev/null
@@ -1,28 +0,0 @@
-{ libqmi, lib, fetchFromGitiles, upstreamInfo
-, autoreconfHook, autoconf-archive, gtk-doc, docbook-xsl-nons
-}:
-
-libqmi.overrideAttrs (
-  { configureFlags ? [], nativeBuildInputs ? [], passthru ? {}, meta ? {}, ... }:
-  {
-    pname = "libqmi-unstable";
-    version = "2019-12-16";
-
-    src = fetchFromGitiles upstreamInfo.components."src/third_party/libqmi";
-
-    nativeBuildInputs = nativeBuildInputs ++
-      [ autoreconfHook autoconf-archive gtk-doc docbook-xsl-nons ];
-
-    # ModemManager tests fail with QRTR in Chromium OS 91.
-    # Will hopefully be fixed in CrOS 92.
-    configureFlags = configureFlags ++ [ "--enable-gtk-doc" "--disable-qrtr" ];
-
-    passthru = passthru // {
-      updateScript = ../update.py;
-    };
-
-    meta = with lib; meta // {
-      maintainers = with maintainers; [ qyliss ];
-    };
-  }
-)
diff --git a/pkgs/os-specific/linux/chromium-os/minigbm/default.nix b/pkgs/os-specific/linux/chromium-os/minigbm/default.nix
deleted file mode 100644
index 6c532a4deb2..00000000000
--- a/pkgs/os-specific/linux/chromium-os/minigbm/default.nix
+++ /dev/null
@@ -1,28 +0,0 @@
-{ stdenv, lib, fetchFromGitiles, upstreamInfo, pkg-config, libdrm }:
-
-stdenv.mkDerivation {
-  name = "minigbm";
-  inherit (upstreamInfo) version;
-
-  src = fetchFromGitiles upstreamInfo.components."src/platform/minigbm";
-
-  nativeBuildInputs = [ pkg-config ];
-  buildInputs = [ libdrm ];
-
-  patchPhase = ''
-    substituteInPlace Makefile --replace /usr/include $out/include
-  '';
-
-  buildFlags = [ "ECHO=echo" "PKG_CONFIG=pkg-config" ];
-  installFlags = [ "LIBDIR=$(out)/lib" ];
-
-  enableParallelBuilding = true;
-
-  meta = with lib; {
-    description = "GBM implementation for Chromium";
-    homepage = "https://chromium.googlesource.com/chromiumos/platform/minigbm/";
-    maintainers = with maintainers; [ qyliss ];
-    license = licenses.bsd3;
-    platforms = platforms.linux;
-  };
-}
diff --git a/pkgs/os-specific/linux/chromium-os/modem-manager/default.nix b/pkgs/os-specific/linux/chromium-os/modem-manager/default.nix
deleted file mode 100644
index f1d6cbdd465..00000000000
--- a/pkgs/os-specific/linux/chromium-os/modem-manager/default.nix
+++ /dev/null
@@ -1,33 +0,0 @@
-{ modemmanager, lib, fetchFromGitiles
-, autoreconfHook, libtool, intltool, libxslt, dbus_glib, chromiumos-overlay
-}:
-
-modemmanager.overrideAttrs (
-  { pname, nativeBuildInputs ? [], buildInputs ? [], postInstall ? "", meta ? {}
-  , ... }:
-  {
-    pname = "${pname}-chromiumos-unstable";
-    version = "2012-04-10";
-
-    src = fetchFromGitiles {
-      url = "https://chromium.googlesource.com/chromiumos/third_party/modemmanager";
-      rev = "657324d1abfd446b0319e4c51bd30cf4967eccf4";
-      sha256 = "12wlak8zx914zix4vv5a8sl0nyi58v7593h4gjchgv3i8ysgj9ah";
-    };
-
-    patches = [];
-
-    nativeBuildInputs = nativeBuildInputs ++ [ autoreconfHook libtool intltool libxslt ];
-    buildInputs = buildInputs ++ [ dbus_glib ];
-
-    preAutoreconf = ''
-      intltoolize
-    '';
-
-    NIX_CFLAGS_COMPILE = [ "-Wno-error" ];
-
-    meta = with lib; meta // {
-      maintainers = with maintainers; [ qyliss ];
-    };
-  }
-)
diff --git a/pkgs/os-specific/linux/chromium-os/modem-manager/next.nix b/pkgs/os-specific/linux/chromium-os/modem-manager/next.nix
deleted file mode 100644
index d008470b682..00000000000
--- a/pkgs/os-specific/linux/chromium-os/modem-manager/next.nix
+++ /dev/null
@@ -1,25 +0,0 @@
-{ modemmanager, lib, fetchFromGitiles, upstreamInfo
-, autoreconfHook, autoconf-archive, gtk-doc, libqmi, libxslt
-}:
-
-(modemmanager.override { inherit libqmi; }).overrideAttrs (
-  { pname, nativeBuildInputs ? [], passthru ? {}, meta ? {}, ... }:
-  {
-    pname = "${pname}-chromiumos-next-unstable";
-    version = "2019-10-17";
-
-    src = fetchFromGitiles
-      upstreamInfo.components."src/third_party/modemmanager-next";
-
-    nativeBuildInputs = nativeBuildInputs ++
-      [ autoreconfHook autoconf-archive gtk-doc libxslt ];
-
-    passthru = passthru // {
-      updateScript = ../update.py;
-    };
-
-    meta = with lib; meta // {
-      maintainers = with maintainers; [ qyliss ];
-    };
-  }
-)
diff --git a/pkgs/os-specific/linux/chromium-os/modp_b64/default.nix b/pkgs/os-specific/linux/chromium-os/modp_b64/default.nix
deleted file mode 100644
index 557769336ce..00000000000
--- a/pkgs/os-specific/linux/chromium-os/modp_b64/default.nix
+++ /dev/null
@@ -1,23 +0,0 @@
-{ common-mk, lib, fetchFromGitiles, upstreamInfo }:
-
-common-mk {
-  platformSubdir = "modp_b64";
-
-  src = fetchFromGitiles upstreamInfo.components."src/third_party/modp_b64";
-
-  installPhase = ''
-    mkdir -p $out/lib
-    install -m 0644 libmodp_b64.a $out/lib
-
-    mkdir $out/include
-    cp -r ../../modp_b64/modp_b64 $out/include
-  '';
-
-  meta = with lib; {
-    description = "High performance base64 encoder/decoder";
-    homepage = "https://github.com/client9/stringencoders";
-    license = licenses.bsd3;
-    maintainers = with maintainers; [ qyliss ];
-    platform = platforms.all;
-  };
-}
diff --git a/pkgs/os-specific/linux/chromium-os/protofiles/default.nix b/pkgs/os-specific/linux/chromium-os/protofiles/default.nix
deleted file mode 100644
index de8ecbb6963..00000000000
--- a/pkgs/os-specific/linux/chromium-os/protofiles/default.nix
+++ /dev/null
@@ -1,34 +0,0 @@
-{ stdenv, lib, fetchFromGitiles, chromiumos-overlay, python2 }:
-
-stdenv.mkDerivation rec {
-  pname = "protofiles";
-  version = "0.0.36";
-
-  src = fetchFromGitiles {
-    url = "https://chromium.googlesource.com/chromium/src/components/policy";
-    rev = "72e354e16600a8999c85528147dcf762f31a4b78";
-    sha256 = "11v7n8d0ma426ba3i6q82k0vj0m5l1hx49waffivplpn0c92bm94";
-  };
-
-  buildInputs = [ python2 ];
-
-  installPhase = ''
-    mkdir -p $out/include/proto $out/share/protofiles \
-        $out/share/policy_resources $out/share/policy_tools
-
-    install -m 0644 proto/*.proto $out/include/proto
-    ln -s $out/include/proto/*.proto $out/share/protofiles
-    install -m 0644 resources/policy_templates.json $out/share/policy_resources
-    install -m 0644 ${chromiumos-overlay}/chromeos-base/protofiles/files/VERSION \
-      $out/share/policy_resources
-
-    install tools/generate_policy_source.py $out/share/policy_tools
-  '';
-
-  meta = with lib; {
-    inherit (src.meta) homepage;
-    license = licenses.bsd3;
-    maintainers = with maintainers; [ qyliss ];
-    platform = platforms.all;
-  };
-}
diff --git a/pkgs/os-specific/linux/chromium-os/sommelier/0005-sommelier-don-t-leak-source-absolute-paths.patch b/pkgs/os-specific/linux/chromium-os/sommelier/0005-sommelier-don-t-leak-source-absolute-paths.patch
deleted file mode 100644
index d40ff8f022c..00000000000
--- a/pkgs/os-specific/linux/chromium-os/sommelier/0005-sommelier-don-t-leak-source-absolute-paths.patch
+++ /dev/null
@@ -1,25 +0,0 @@
-From 04bdfd44bbaa9f619d3ff03cad3273c46493396e Mon Sep 17 00:00:00 2001
-From: Alyssa Ross <hi@alyssa.is>
-Date: Sun, 1 Dec 2019 17:04:04 +0000
-Subject: [PATCH 5/6] sommelier: don't leak source-absolute paths
-
----
- vm_tools/sommelier/wayland_protocol.gni | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/vm_tools/sommelier/wayland_protocol.gni b/vm_tools/sommelier/wayland_protocol.gni
-index f894adf81d..28bb5a006b 100644
---- a/vm_tools/sommelier/wayland_protocol.gni
-+++ b/vm_tools/sommelier/wayland_protocol.gni
-@@ -42,7 +42,7 @@ template("wayland_protocol_library") {
-         "wayland-scanner",
-         g.subcommand,
-         "{{source}}",
--        output_file,
-+        rebase_path(output_file),
-       ]
-     }
-   }
--- 
-2.32.0
-
diff --git a/pkgs/os-specific/linux/chromium-os/sommelier/0006-Revert-Revert-vm_tools-sommelier-Switch-to-the-stabl.patch b/pkgs/os-specific/linux/chromium-os/sommelier/0006-Revert-Revert-vm_tools-sommelier-Switch-to-the-stabl.patch
deleted file mode 100644
index c7b1eeafc0d..00000000000
--- a/pkgs/os-specific/linux/chromium-os/sommelier/0006-Revert-Revert-vm_tools-sommelier-Switch-to-the-stabl.patch
+++ /dev/null
@@ -1,1840 +0,0 @@
-From e97193872755e44aae51dd88e9323d8a069a40ca Mon Sep 17 00:00:00 2001
-From: Alyssa Ross <hi@alyssa.is>
-Date: Fri, 2 Apr 2021 17:55:55 +0000
-Subject: [PATCH 6/6] Revert "Revert "vm_tools: sommelier: Switch to the stable
- version of xdg-shell""
-
-This reverts commit 32050c0ea6c00c16999915856b40a6a6b8b41bb9.
----
- vm_tools/sommelier/BUILD.gn                   |   2 +-
- vm_tools/sommelier/meson.build                |   2 +-
- ...dg-shell-unstable-v6.xml => xdg-shell.xml} | 435 +++++++++++++-----
- vm_tools/sommelier/sommelier-xdg-shell.cc     | 217 +++++----
- vm_tools/sommelier/sommelier.cc               | 210 +++++----
- vm_tools/sommelier/sommelier.h                |   8 +-
- 6 files changed, 535 insertions(+), 339 deletions(-)
- rename vm_tools/sommelier/protocol/{xdg-shell-unstable-v6.xml => xdg-shell.xml} (71%)
-
-diff --git a/vm_tools/sommelier/BUILD.gn b/vm_tools/sommelier/BUILD.gn
-index 52df0e3403..fe543138ef 100644
---- a/vm_tools/sommelier/BUILD.gn
-+++ b/vm_tools/sommelier/BUILD.gn
-@@ -49,7 +49,7 @@ wayland_protocol_library("sommelier-protocol") {
-     "protocol/relative-pointer-unstable-v1.xml",
-     "protocol/text-input-unstable-v1.xml",
-     "protocol/viewporter.xml",
--    "protocol/xdg-shell-unstable-v6.xml",
-+    "protocol/xdg-shell.xml",
-   ]
- }
- 
-diff --git a/vm_tools/sommelier/meson.build b/vm_tools/sommelier/meson.build
-index 088e3e173f..86bcced912 100644
---- a/vm_tools/sommelier/meson.build
-+++ b/vm_tools/sommelier/meson.build
-@@ -58,7 +58,7 @@ wl_protocols = [
-     'protocol/relative-pointer-unstable-v1.xml',
-     'protocol/text-input-unstable-v1.xml',
-     'protocol/viewporter.xml',
--    'protocol/xdg-shell-unstable-v6.xml',
-+    'protocol/xdg-shell.xml',
- ]
- 
- wl_outs = []
-diff --git a/vm_tools/sommelier/protocol/xdg-shell-unstable-v6.xml b/vm_tools/sommelier/protocol/xdg-shell.xml
-similarity index 71%
-rename from vm_tools/sommelier/protocol/xdg-shell-unstable-v6.xml
-rename to vm_tools/sommelier/protocol/xdg-shell.xml
-index 1c0f92452b..f7377a713c 100644
---- a/vm_tools/sommelier/protocol/xdg-shell-unstable-v6.xml
-+++ b/vm_tools/sommelier/protocol/xdg-shell.xml
-@@ -1,11 +1,13 @@
- <?xml version="1.0" encoding="UTF-8"?>
--<protocol name="xdg_shell_unstable_v6">
-+<protocol name="xdg_shell">
- 
-   <copyright>
-     Copyright © 2008-2013 Kristian Høgsberg
-     Copyright © 2013      Rafael Antognolli
-     Copyright © 2013      Jasper St. Pierre
-     Copyright © 2010-2013 Intel Corporation
-+    Copyright © 2015-2017 Samsung Electronics Co., Ltd
-+    Copyright © 2015-2017 Red Hat Inc.
- 
-     Permission is hereby granted, free of charge, to any person obtaining a
-     copy of this software and associated documentation files (the "Software"),
-@@ -27,18 +29,19 @@
-     DEALINGS IN THE SOFTWARE.
-   </copyright>
- 
--  <interface name="zxdg_shell_v6" version="1">
-+  <interface name="xdg_wm_base" version="3">
-     <description summary="create desktop-style surfaces">
--      xdg_shell allows clients to turn a wl_surface into a "real window"
--      which can be dragged, resized, stacked, and moved around by the
--      user. Everything about this interface is suited towards traditional
--      desktop environments.
-+      The xdg_wm_base interface is exposed as a global object enabling clients
-+      to turn their wl_surfaces into windows in a desktop environment. It
-+      defines the basic functionality needed for clients and the compositor to
-+      create windows that can be dragged, resized, maximized, etc, as well as
-+      creating transient windows such as popup menus.
-     </description>
- 
-     <enum name="error">
-       <entry name="role" value="0" summary="given wl_surface has another role"/>
-       <entry name="defunct_surfaces" value="1"
--	     summary="xdg_shell was destroyed before children"/>
-+	     summary="xdg_wm_base was destroyed before children"/>
-       <entry name="not_the_topmost_popup" value="2"
- 	     summary="the client tried to map or destroy a non-topmost popup"/>
-       <entry name="invalid_popup_parent" value="3"
-@@ -50,11 +53,11 @@
-     </enum>
- 
-     <request name="destroy" type="destructor">
--      <description summary="destroy xdg_shell">
--	Destroy this xdg_shell object.
-+      <description summary="destroy xdg_wm_base">
-+	Destroy this xdg_wm_base object.
- 
--	Destroying a bound xdg_shell object while there are surfaces
--	still alive created by this xdg_shell object instance is illegal
-+	Destroying a bound xdg_wm_base object while there are surfaces
-+	still alive created by this xdg_wm_base object instance is illegal
- 	and will result in a protocol error.
-       </description>
-     </request>
-@@ -65,7 +68,7 @@
- 	surfaces relative to some parent surface. See the interface description
- 	and xdg_surface.get_popup for details.
-       </description>
--      <arg name="id" type="new_id" interface="zxdg_positioner_v6"/>
-+      <arg name="id" type="new_id" interface="xdg_positioner"/>
-     </request>
- 
-     <request name="get_xdg_surface">
-@@ -82,14 +85,14 @@
- 	See the documentation of xdg_surface for more details about what an
- 	xdg_surface is and how it is used.
-       </description>
--      <arg name="id" type="new_id" interface="zxdg_surface_v6"/>
-+      <arg name="id" type="new_id" interface="xdg_surface"/>
-       <arg name="surface" type="object" interface="wl_surface"/>
-     </request>
- 
-     <request name="pong">
-       <description summary="respond to a ping event">
- 	A client must respond to a ping event with a pong request or
--	the client may be deemed unresponsive. See xdg_shell.ping.
-+	the client may be deemed unresponsive. See xdg_wm_base.ping.
-       </description>
-       <arg name="serial" type="uint" summary="serial of the ping event"/>
-     </request>
-@@ -98,7 +101,7 @@
-       <description summary="check if the client is alive">
- 	The ping event asks the client if it's still alive. Pass the
- 	serial specified in the event back to the compositor by sending
--	a "pong" request back with the specified serial. See xdg_shell.ping.
-+	a "pong" request back with the specified serial. See xdg_wm_base.pong.
- 
- 	Compositors can use this to determine if the client is still
- 	alive. It's unspecified what will happen if the client doesn't
-@@ -106,13 +109,13 @@
- 	try to respond in a reasonable amount of time.
- 
- 	A compositor is free to ping in any way it wants, but a client must
--	always respond to any xdg_shell object it created.
-+	always respond to any xdg_wm_base object it created.
-       </description>
-       <arg name="serial" type="uint" summary="pass this to the pong request"/>
-     </event>
-   </interface>
- 
--  <interface name="zxdg_positioner_v6" version="1">
-+  <interface name="xdg_positioner" version="3">
-     <description summary="child surface positioner">
-       The xdg_positioner provides a collection of rules for the placement of a
-       child surface relative to a parent surface. Rules can be defined to ensure
-@@ -162,13 +165,13 @@
- 	Specify the anchor rectangle within the parent surface that the child
- 	surface will be placed relative to. The rectangle is relative to the
- 	window geometry as defined by xdg_surface.set_window_geometry of the
--	parent surface. The rectangle must be at least 1x1 large.
-+	parent surface.
- 
- 	When the xdg_positioner object is used to position a child surface, the
- 	anchor rectangle may not extend outside the window geometry of the
- 	positioned child's parent surface.
- 
--	If a zero or negative size is set the invalid_input error is raised.
-+	If a negative size is set the invalid_input error is raised.
-       </description>
-       <arg name="x" type="int" summary="x position of anchor rectangle"/>
-       <arg name="y" type="int" summary="y position of anchor rectangle"/>
-@@ -176,63 +179,54 @@
-       <arg name="height" type="int" summary="height of anchor rectangle"/>
-     </request>
- 
--    <enum name="anchor" bitfield="true">
--      <entry name="none" value="0"
--	     summary="the center of the anchor rectangle"/>
--      <entry name="top" value="1"
--	     summary="the top edge of the anchor rectangle"/>
--      <entry name="bottom" value="2"
--	     summary="the bottom edge of the anchor rectangle"/>
--      <entry name="left" value="4"
--	     summary="the left edge of the anchor rectangle"/>
--      <entry name="right" value="8"
--	     summary="the right edge of the anchor rectangle"/>
-+    <enum name="anchor">
-+      <entry name="none" value="0"/>
-+      <entry name="top" value="1"/>
-+      <entry name="bottom" value="2"/>
-+      <entry name="left" value="3"/>
-+      <entry name="right" value="4"/>
-+      <entry name="top_left" value="5"/>
-+      <entry name="bottom_left" value="6"/>
-+      <entry name="top_right" value="7"/>
-+      <entry name="bottom_right" value="8"/>
-     </enum>
- 
-     <request name="set_anchor">
--      <description summary="set anchor rectangle anchor edges">
--	Defines a set of edges for the anchor rectangle. These are used to
--	derive an anchor point that the child surface will be positioned
--	relative to. If two orthogonal edges are specified (e.g. 'top' and
--	'left'), then the anchor point will be the intersection of the edges
--	(e.g. the top left position of the rectangle); otherwise, the derived
--	anchor point will be centered on the specified edge, or in the center of
--	the anchor rectangle if no edge is specified.
--
--	If two parallel anchor edges are specified (e.g. 'left' and 'right'),
--	the invalid_input error is raised.
-+      <description summary="set anchor rectangle anchor">
-+	Defines the anchor point for the anchor rectangle. The specified anchor
-+	is used derive an anchor point that the child surface will be
-+	positioned relative to. If a corner anchor is set (e.g. 'top_left' or
-+	'bottom_right'), the anchor point will be at the specified corner;
-+	otherwise, the derived anchor point will be centered on the specified
-+	edge, or in the center of the anchor rectangle if no edge is specified.
-       </description>
-       <arg name="anchor" type="uint" enum="anchor"
--	   summary="bit mask of anchor edges"/>
-+	   summary="anchor"/>
-     </request>
- 
--    <enum name="gravity" bitfield="true">
--      <entry name="none" value="0"
--	     summary="center over the anchor edge"/>
--      <entry name="top" value="1"
--	     summary="position above the anchor edge"/>
--      <entry name="bottom" value="2"
--	     summary="position below the anchor edge"/>
--      <entry name="left" value="4"
--	     summary="position to the left of the anchor edge"/>
--      <entry name="right" value="8"
--	     summary="position to the right of the anchor edge"/>
-+    <enum name="gravity">
-+      <entry name="none" value="0"/>
-+      <entry name="top" value="1"/>
-+      <entry name="bottom" value="2"/>
-+      <entry name="left" value="3"/>
-+      <entry name="right" value="4"/>
-+      <entry name="top_left" value="5"/>
-+      <entry name="bottom_left" value="6"/>
-+      <entry name="top_right" value="7"/>
-+      <entry name="bottom_right" value="8"/>
-     </enum>
- 
-     <request name="set_gravity">
-       <description summary="set child surface gravity">
- 	Defines in what direction a surface should be positioned, relative to
--	the anchor point of the parent surface. If two orthogonal gravities are
--	specified (e.g. 'bottom' and 'right'), then the child surface will be
--	placed in the specified direction; otherwise, the child surface will be
--	centered over the anchor point on any axis that had no gravity
--	specified.
--
--	If two parallel gravities are specified (e.g. 'left' and 'right'), the
--	invalid_input error is raised.
-+	the anchor point of the parent surface. If a corner gravity is
-+	specified (e.g. 'bottom_right' or 'top_left'), then the child surface
-+	will be placed towards the specified gravity; otherwise, the child
-+	surface will be centered over the anchor point on any axis that had no
-+	gravity specified.
-       </description>
-       <arg name="gravity" type="uint" enum="gravity"
--	   summary="bit mask of gravity directions"/>
-+	   summary="gravity direction"/>
-     </request>
- 
-     <enum name="constraint_adjustment" bitfield="true">
-@@ -252,7 +246,7 @@
-       <entry name="none" value="0">
- 	<description summary="don't move the child surface when constrained">
- 	  Don't alter the surface position even if it is constrained on some
--	  axis, for example partially outside the edge of a monitor.
-+	  axis, for example partially outside the edge of an output.
- 	</description>
-       </entry>
-       <entry name="slide_x" value="1">
-@@ -304,6 +298,10 @@
- 	  surface is constrained, the gravity is 'bottom' and the anchor is
- 	  'bottom', change the gravity to 'top' and the anchor to 'top'.
- 
-+	  The adjusted position is calculated given the original anchor
-+	  rectangle and offset, but with the new flipped anchor and gravity
-+	  values.
-+
- 	  If the adjusted position also ends up being constrained, the resulting
- 	  position of the flip_y adjustment will be the one before the
- 	  adjustment.
-@@ -359,9 +357,49 @@
-       <arg name="x" type="int" summary="surface position x offset"/>
-       <arg name="y" type="int" summary="surface position y offset"/>
-     </request>
-+
-+    <!-- Version 3 additions -->
-+
-+    <request name="set_reactive" since="3">
-+      <description summary="continuously reconstrain the surface">
-+	When set reactive, the surface is reconstrained if the conditions used
-+	for constraining changed, e.g. the parent window moved.
-+
-+	If the conditions changed and the popup was reconstrained, an
-+	xdg_popup.configure event is sent with updated geometry, followed by an
-+	xdg_surface.configure event.
-+      </description>
-+    </request>
-+
-+    <request name="set_parent_size" since="3">
-+      <description summary="">
-+	Set the parent window geometry the compositor should use when
-+	positioning the popup. The compositor may use this information to
-+	determine the future state the popup should be constrained using. If
-+	this doesn't match the dimension of the parent the popup is eventually
-+	positioned against, the behavior is undefined.
-+
-+	The arguments are given in the surface-local coordinate space.
-+      </description>
-+      <arg name="parent_width" type="int"
-+	   summary="future window geometry width of parent"/>
-+      <arg name="parent_height" type="int"
-+	   summary="future window geometry height of parent"/>
-+    </request>
-+
-+    <request name="set_parent_configure" since="3">
-+      <description summary="set parent configure this is a response to">
-+	Set the serial of a xdg_surface.configure event this positioner will be
-+	used in response to. The compositor may use this information together
-+	with set_parent_size to determine what future state the popup should be
-+	constrained using.
-+      </description>
-+      <arg name="serial" type="uint"
-+	   summary="serial of parent configure event"/>
-+    </request>
-   </interface>
- 
--  <interface name="zxdg_surface_v6" version="1">
-+  <interface name="xdg_surface" version="3">
-     <description summary="desktop user interface surface base interface">
-       An interface that may be implemented by a wl_surface, for
-       implementations that provide a desktop-style user interface.
-@@ -388,11 +426,25 @@
-       manipulate a buffer prior to the first xdg_surface.configure call must
-       also be treated as errors.
- 
--      For a surface to be mapped by the compositor, the following conditions
--      must be met: (1) the client has assigned a xdg_surface based role to the
--      surface, (2) the client has set and committed the xdg_surface state and
--      the role dependent state to the surface and (3) the client has committed a
--      buffer to the surface.
-+      After creating a role-specific object and setting it up, the client must
-+      perform an initial commit without any buffer attached. The compositor
-+      will reply with an xdg_surface.configure event. The client must
-+      acknowledge it and is then allowed to attach a buffer to map the surface.
-+
-+      Mapping an xdg_surface-based role surface is defined as making it
-+      possible for the surface to be shown by the compositor. Note that
-+      a mapped surface is not guaranteed to be visible once it is mapped.
-+
-+      For an xdg_surface to be mapped by the compositor, the following
-+      conditions must be met:
-+      (1) the client has assigned an xdg_surface-based role to the surface
-+      (2) the client has set and committed the xdg_surface state and the
-+	  role-dependent state to the surface
-+      (3) the client has committed a buffer to the surface
-+
-+      A newly-unmapped surface is considered to have met condition (1) out
-+      of the 3 required conditions for mapping a surface if its role surface
-+      has not been destroyed.
-     </description>
- 
-     <enum name="error">
-@@ -416,20 +468,23 @@
- 	See the documentation of xdg_toplevel for more details about what an
- 	xdg_toplevel is and how it is used.
-       </description>
--      <arg name="id" type="new_id" interface="zxdg_toplevel_v6"/>
-+      <arg name="id" type="new_id" interface="xdg_toplevel"/>
-     </request>
- 
-     <request name="get_popup">
-       <description summary="assign the xdg_popup surface role">
--	This creates an xdg_popup object for the given xdg_surface and gives the
--	associated wl_surface the xdg_popup role.
-+	This creates an xdg_popup object for the given xdg_surface and gives
-+	the associated wl_surface the xdg_popup role.
-+
-+	If null is passed as a parent, a parent surface must be specified using
-+	some other protocol, before committing the initial state.
- 
- 	See the documentation of xdg_popup for more details about what an
- 	xdg_popup is and how it is used.
-       </description>
--      <arg name="id" type="new_id" interface="zxdg_popup_v6"/>
--      <arg name="parent" type="object" interface="zxdg_surface_v6"/>
--      <arg name="positioner" type="object" interface="zxdg_positioner_v6"/>
-+      <arg name="id" type="new_id" interface="xdg_popup"/>
-+      <arg name="parent" type="object" interface="xdg_surface" allow-null="true"/>
-+      <arg name="positioner" type="object" interface="xdg_positioner"/>
-     </request>
- 
-     <request name="set_window_geometry">
-@@ -442,6 +497,11 @@
- 	The window geometry is double buffered, and will be applied at the
- 	time wl_surface.commit of the corresponding wl_surface is called.
- 
-+	When maintaining a position, the compositor should treat the (x, y)
-+	coordinate of the window geometry as the top left corner of the window.
-+	A client changing the (x, y) window geometry coordinate should in
-+	general not alter the position of the window.
-+
- 	Once the window geometry of the surface is set, it is not possible to
- 	unset it, and it will remain the same until set_window_geometry is
- 	called again, even if a new subsurface or buffer is attached.
-@@ -511,36 +571,57 @@
-       </description>
-       <arg name="serial" type="uint" summary="serial of the configure event"/>
-     </event>
-+
-   </interface>
- 
--  <interface name="zxdg_toplevel_v6" version="1">
-+  <interface name="xdg_toplevel" version="3">
-     <description summary="toplevel surface">
-       This interface defines an xdg_surface role which allows a surface to,
-       among other things, set window-like properties such as maximize,
-       fullscreen, and minimize, set application-specific metadata like title and
-       id, and well as trigger user interactive operations such as interactive
-       resize and move.
-+
-+      Unmapping an xdg_toplevel means that the surface cannot be shown
-+      by the compositor until it is explicitly mapped again.
-+      All active operations (e.g., move, resize) are canceled and all
-+      attributes (e.g. title, state, stacking, ...) are discarded for
-+      an xdg_toplevel surface when it is unmapped. The xdg_toplevel returns to
-+      the state it had right after xdg_surface.get_toplevel. The client
-+      can re-map the toplevel by perfoming a commit without any buffer
-+      attached, waiting for a configure event and handling it as usual (see
-+      xdg_surface description).
-+
-+      Attaching a null buffer to a toplevel unmaps the surface.
-     </description>
- 
-     <request name="destroy" type="destructor">
-       <description summary="destroy the xdg_toplevel">
--	Unmap and destroy the window. The window will be effectively
--	hidden from the user's point of view, and all state like
--	maximization, fullscreen, and so on, will be lost.
-+	This request destroys the role surface and unmaps the surface;
-+	see "Unmapping" behavior in interface section for details.
-       </description>
-     </request>
- 
-     <request name="set_parent">
-       <description summary="set the parent of this surface">
--	Set the "parent" of this surface. This window should be stacked
--	above a parent. The parent surface must be mapped as long as this
--	surface is mapped.
-+	Set the "parent" of this surface. This surface should be stacked
-+	above the parent surface and all other ancestor surfaces.
- 
- 	Parent windows should be set on dialogs, toolboxes, or other
- 	"auxiliary" surfaces, so that the parent is raised when the dialog
- 	is raised.
-+
-+	Setting a null parent for a child window removes any parent-child
-+	relationship for the child. Setting a null parent for a window which
-+	currently has no parent is a no-op.
-+
-+	If the parent is unmapped then its children are managed as
-+	though the parent of the now-unmapped parent has become the
-+	parent of this surface. If no parent exists for the now-unmapped
-+	parent then the children are managed as though they have no
-+	parent surface.
-       </description>
--      <arg name="parent" type="object" interface="zxdg_toplevel_v6" allow-null="true"/>
-+      <arg name="parent" type="object" interface="xdg_toplevel" allow-null="true"/>
-     </request>
- 
-     <request name="set_title">
-@@ -573,6 +654,9 @@
- 	For example, "org.freedesktop.FooViewer" where the .desktop file is
- 	"org.freedesktop.FooViewer.desktop".
- 
-+	Like other properties, a set_app_id request can be sent after the
-+	xdg_toplevel has been mapped to update the property.
-+
- 	See the desktop-entry specification [0] for more details on
- 	application identifiers and how they relate to well-known D-Bus
- 	names and .desktop files.
-@@ -676,7 +760,7 @@
-       </description>
-       <arg name="seat" type="object" interface="wl_seat" summary="the wl_seat of the user event"/>
-       <arg name="serial" type="uint" summary="the serial of the user event"/>
--      <arg name="edges" type="uint" summary="which edge or corner is being dragged"/>
-+      <arg name="edges" type="uint" enum="resize_edge" summary="which edge or corner is being dragged"/>
-     </request>
- 
-     <enum name="state">
-@@ -693,12 +777,18 @@
- 	<description summary="the surface is maximized">
- 	  The surface is maximized. The window geometry specified in the configure
- 	  event must be obeyed by the client.
-+
-+	  The client should draw without shadow or other
-+	  decoration outside of the window geometry.
- 	</description>
-       </entry>
-       <entry name="fullscreen" value="2" summary="the surface is fullscreen">
- 	<description summary="the surface is fullscreen">
--	  The surface is fullscreen. The window geometry specified in the configure
--	  event must be obeyed by the client.
-+	  The surface is fullscreen. The window geometry specified in the
-+	  configure event is a maximum; the client cannot resize beyond it. For
-+	  a surface to cover the whole fullscreened area, the geometry
-+	  dimensions must be obeyed by the client. For more details, see
-+	  xdg_toplevel.set_fullscreen.
- 	</description>
-       </entry>
-       <entry name="resizing" value="3" summary="the surface is being resized">
-@@ -716,6 +806,30 @@
- 	  keyboard or pointer focus.
- 	</description>
-       </entry>
-+      <entry name="tiled_left" value="5" since="2">
-+	<description summary="the surface is tiled">
-+	  The window is currently in a tiled layout and the left edge is
-+	  considered to be adjacent to another part of the tiling grid.
-+	</description>
-+      </entry>
-+      <entry name="tiled_right" value="6" since="2">
-+	<description summary="the surface is tiled">
-+	  The window is currently in a tiled layout and the right edge is
-+	  considered to be adjacent to another part of the tiling grid.
-+	</description>
-+      </entry>
-+      <entry name="tiled_top" value="7" since="2">
-+	<description summary="the surface is tiled">
-+	  The window is currently in a tiled layout and the top edge is
-+	  considered to be adjacent to another part of the tiling grid.
-+	</description>
-+      </entry>
-+      <entry name="tiled_bottom" value="8" since="2">
-+	<description summary="the surface is tiled">
-+	  The window is currently in a tiled layout and the bottom edge is
-+	  considered to be adjacent to another part of the tiling grid.
-+	</description>
-+      </entry>
-     </enum>
- 
-     <request name="set_max_size">
-@@ -805,12 +919,11 @@
- 	Maximize the surface.
- 
- 	After requesting that the surface should be maximized, the compositor
--	will respond by emitting a configure event with the "maximized" state
--	and the required window geometry. The client should then update its
--	content, drawing it in a maximized state, i.e. without shadow or other
--	decoration outside of the window geometry. The client must also
--	acknowledge the configure when committing the new content (see
--	ack_configure).
-+	will respond by emitting a configure event. Whether this configure
-+	actually sets the window maximized is subject to compositor policies.
-+	The client must then update its content, drawing in the configured
-+	state. The client must also acknowledge the configure when committing
-+	the new content (see ack_configure).
- 
- 	It is up to the compositor to decide how and where to maximize the
- 	surface, for example which output and what region of the screen should
-@@ -818,6 +931,10 @@
- 
- 	If the surface was already maximized, the compositor will still emit
- 	a configure event with the "maximized" state.
-+
-+	If the surface is in a fullscreen state, this request has no direct
-+	effect. It may alter the state the surface is returned to when
-+	unmaximized unless overridden by the compositor.
-       </description>
-     </request>
- 
-@@ -826,13 +943,13 @@
- 	Unmaximize the surface.
- 
- 	After requesting that the surface should be unmaximized, the compositor
--	will respond by emitting a configure event without the "maximized"
--	state. If available, the compositor will include the window geometry
--	dimensions the window had prior to being maximized in the configure
--	request. The client must then update its content, drawing it in a
--	regular state, i.e. potentially with shadow, etc. The client must also
--	acknowledge the configure when committing the new content (see
--	ack_configure).
-+	will respond by emitting a configure event. Whether this actually
-+	un-maximizes the window is subject to compositor policies.
-+	If available and applicable, the compositor will include the window
-+	geometry dimensions the window had prior to being maximized in the
-+	configure event. The client must then update its content, drawing it in
-+	the configured state. The client must also acknowledge the configure
-+	when committing the new content (see ack_configure).
- 
- 	It is up to the compositor to position the surface after it was
- 	unmaximized; usually the position the surface had before maximizing, if
-@@ -840,24 +957,63 @@
- 
- 	If the surface was already not maximized, the compositor will still
- 	emit a configure event without the "maximized" state.
-+
-+	If the surface is in a fullscreen state, this request has no direct
-+	effect. It may alter the state the surface is returned to when
-+	unmaximized unless overridden by the compositor.
-       </description>
-     </request>
- 
-     <request name="set_fullscreen">
--      <description summary="set the window as fullscreen on a monitor">
-+      <description summary="set the window as fullscreen on an output">
- 	Make the surface fullscreen.
- 
--	You can specify an output that you would prefer to be fullscreen.
--	If this value is NULL, it's up to the compositor to choose which
--	display will be used to map this surface.
-+	After requesting that the surface should be fullscreened, the
-+	compositor will respond by emitting a configure event. Whether the
-+	client is actually put into a fullscreen state is subject to compositor
-+	policies. The client must also acknowledge the configure when
-+	committing the new content (see ack_configure).
-+
-+	The output passed by the request indicates the client's preference as
-+	to which display it should be set fullscreen on. If this value is NULL,
-+	it's up to the compositor to choose which display will be used to map
-+	this surface.
- 
- 	If the surface doesn't cover the whole output, the compositor will
- 	position the surface in the center of the output and compensate with
--	black borders filling the rest of the output.
-+	with border fill covering the rest of the output. The content of the
-+	border fill is undefined, but should be assumed to be in some way that
-+	attempts to blend into the surrounding area (e.g. solid black).
-+
-+	If the fullscreened surface is not opaque, the compositor must make
-+	sure that other screen content not part of the same surface tree (made
-+	up of subsurfaces, popups or similarly coupled surfaces) are not
-+	visible below the fullscreened surface.
-       </description>
-       <arg name="output" type="object" interface="wl_output" allow-null="true"/>
-     </request>
--    <request name="unset_fullscreen" />
-+
-+    <request name="unset_fullscreen">
-+      <description summary="unset the window as fullscreen">
-+	Make the surface no longer fullscreen.
-+
-+	After requesting that the surface should be unfullscreened, the
-+	compositor will respond by emitting a configure event.
-+	Whether this actually removes the fullscreen state of the client is
-+	subject to compositor policies.
-+
-+	Making a surface unfullscreen sets states for the surface based on the following:
-+	* the state(s) it may have had before becoming fullscreen
-+	* any state(s) decided by the compositor
-+	* any state(s) requested by the client while the surface was fullscreen
-+
-+	The compositor may include the previous window geometry dimensions in
-+	the configure event, if applicable.
-+
-+	The client must also acknowledge the configure when committing the new
-+	content (see ack_configure).
-+      </description>
-+    </request>
- 
-     <request name="set_minimized">
-       <description summary="set the window as minimized">
-@@ -913,7 +1069,7 @@
-     </event>
-   </interface>
- 
--  <interface name="zxdg_popup_v6" version="1">
-+  <interface name="xdg_popup" version="3">
-     <description summary="short-lived, popup surfaces for menus">
-       A popup surface is a short-lived, temporary surface. It can be used to
-       implement for example menus, popovers, tooltips and other similar user
-@@ -931,21 +1087,12 @@
-       surface of their own is clicked should dismiss the popup using the destroy
-       request.
- 
--      The parent surface must have either the xdg_toplevel or xdg_popup surface
--      role.
--
-       A newly created xdg_popup will be stacked on top of all previously created
-       xdg_popup surfaces associated with the same xdg_toplevel.
- 
-       The parent of an xdg_popup must be mapped (see the xdg_surface
-       description) before the xdg_popup itself.
- 
--      The x and y arguments passed when creating the popup object specify
--      where the top left of the popup should be placed, relative to the
--      local surface coordinates of the parent surface. See
--      xdg_surface.get_popup. An xdg_popup must intersect with or be at least
--      partially adjacent to its parent surface.
--
-       The client must call wl_surface.commit on the corresponding wl_surface
-       for the xdg_popup state to take effect.
-     </description>
-@@ -1023,6 +1170,11 @@
- 	The x and y arguments represent the position the popup was placed at
- 	given the xdg_positioner rule, relative to the upper left corner of the
- 	window geometry of the parent surface.
-+
-+	For version 2 or older, the configure event for an xdg_popup is only
-+	ever sent once for the initial configuration. Starting with version 3,
-+	it may be sent again if the popup is setup with an xdg_positioner with
-+	set_reactive requested, or in response to xdg_popup.reposition requests.
-       </description>
-       <arg name="x" type="int"
- 	   summary="x position relative to parent surface window geometry"/>
-@@ -1040,5 +1192,58 @@
-       </description>
-     </event>
- 
-+    <!-- Version 3 additions -->
-+
-+    <request name="reposition" since="3">
-+      <description summary="recalculate the popup's location">
-+	Reposition an already-mapped popup. The popup will be placed given the
-+	details in the passed xdg_positioner object, and a
-+	xdg_popup.repositioned followed by xdg_popup.configure and
-+	xdg_surface.configure will be emitted in response. Any parameters set
-+	by the previous positioner will be discarded.
-+
-+	The passed token will be sent in the corresponding
-+	xdg_popup.repositioned event. The new popup position will not take
-+	effect until the corresponding configure event is acknowledged by the
-+	client. See xdg_popup.repositioned for details. The token itself is
-+	opaque, and has no other special meaning.
-+
-+	If multiple reposition requests are sent, the compositor may skip all
-+	but the last one.
-+
-+	If the popup is repositioned in response to a configure event for its
-+	parent, the client should send an xdg_positioner.set_parent_configure
-+	and possibly a xdg_positioner.set_parent_size request to allow the
-+	compositor to properly constrain the popup.
-+
-+	If the popup is repositioned together with a parent that is being
-+	resized, but not in response to a configure event, the client should
-+	send a xdg_positioner.set_parent_size request.
-+      </description>
-+      <arg name="positioner" type="object" interface="xdg_positioner"/>
-+      <arg name="token" type="uint" summary="reposition request token"/>
-+    </request>
-+
-+    <event name="repositioned" since="3">
-+      <description summary="signal the completion of a repositioned request">
-+	The repositioned event is sent as part of a popup configuration
-+	sequence, together with xdg_popup.configure and lastly
-+	xdg_surface.configure to notify the completion of a reposition request.
-+
-+	The repositioned event is to notify about the completion of a
-+	xdg_popup.reposition request. The token argument is the token passed
-+	in the xdg_popup.reposition request.
-+
-+	Immediately after this event is emitted, xdg_popup.configure and
-+	xdg_surface.configure will be sent with the updated size and position,
-+	as well as a new configure serial.
-+
-+	The client should optionally update the content of the popup, but must
-+	acknowledge the new popup configuration for the new position to take
-+	effect. See xdg_surface.ack_configure for details.
-+      </description>
-+      <arg name="token" type="uint" summary="reposition request token"/>
-+    </event>
-+
-   </interface>
- </protocol>
-diff --git a/vm_tools/sommelier/sommelier-xdg-shell.cc b/vm_tools/sommelier/sommelier-xdg-shell.cc
-index 91744a67e3..45b8eeb93e 100644
---- a/vm_tools/sommelier/sommelier-xdg-shell.cc
-+++ b/vm_tools/sommelier/sommelier-xdg-shell.cc
-@@ -7,37 +7,37 @@
- #include <assert.h>
- #include <stdlib.h>
- 
--#include "xdg-shell-unstable-v6-client-protocol.h"  // NOLINT(build/include_directory)
--#include "xdg-shell-unstable-v6-server-protocol.h"  // NOLINT(build/include_directory)
-+#include "xdg-shell-client-protocol.h"  // NOLINT(build/include_directory)
-+#include "xdg-shell-server-protocol.h"  // NOLINT(build/include_directory)
- 
- struct sl_host_xdg_shell {
-   struct sl_context* ctx;
-   struct wl_resource* resource;
--  struct zxdg_shell_v6* proxy;
-+  struct xdg_wm_base* proxy;
- };
- 
- struct sl_host_xdg_surface {
-   struct sl_context* ctx;
-   struct wl_resource* resource;
--  struct zxdg_surface_v6* proxy;
-+  struct xdg_surface* proxy;
- };
- 
- struct sl_host_xdg_toplevel {
-   struct sl_context* ctx;
-   struct wl_resource* resource;
--  struct zxdg_toplevel_v6* proxy;
-+  struct xdg_toplevel* proxy;
- };
- 
- struct sl_host_xdg_popup {
-   struct sl_context* ctx;
-   struct wl_resource* resource;
--  struct zxdg_popup_v6* proxy;
-+  struct xdg_popup* proxy;
- };
- 
- struct sl_host_xdg_positioner {
-   struct sl_context* ctx;
-   struct wl_resource* resource;
--  struct zxdg_positioner_v6* proxy;
-+  struct xdg_positioner* proxy;
- };
- 
- static void sl_xdg_positioner_destroy(struct wl_client* client,
-@@ -53,7 +53,7 @@ static void sl_xdg_positioner_set_size(struct wl_client* client,
-       static_cast<sl_host_xdg_positioner*>(wl_resource_get_user_data(resource));
-   double scale = host->ctx->scale;
- 
--  zxdg_positioner_v6_set_size(host->proxy, width / scale, height / scale);
-+  xdg_positioner_set_size(host->proxy, width / scale, height / scale);
- }
- 
- static void sl_xdg_positioner_set_anchor_rect(struct wl_client* client,
-@@ -72,7 +72,7 @@ static void sl_xdg_positioner_set_anchor_rect(struct wl_client* client,
-   x2 = (x + width) / scale;
-   y2 = (y + height) / scale;
- 
--  zxdg_positioner_v6_set_anchor_rect(host->proxy, x1, y1, x2 - x1, y2 - y1);
-+  xdg_positioner_set_anchor_rect(host->proxy, x1, y1, x2 - x1, y2 - y1);
- }
- 
- static void sl_xdg_positioner_set_anchor(struct wl_client* client,
-@@ -81,7 +81,7 @@ static void sl_xdg_positioner_set_anchor(struct wl_client* client,
-   struct sl_host_xdg_positioner* host =
-       static_cast<sl_host_xdg_positioner*>(wl_resource_get_user_data(resource));
- 
--  zxdg_positioner_v6_set_anchor(host->proxy, anchor);
-+  xdg_positioner_set_anchor(host->proxy, anchor);
- }
- 
- static void sl_xdg_positioner_set_gravity(struct wl_client* client,
-@@ -90,7 +90,7 @@ static void sl_xdg_positioner_set_gravity(struct wl_client* client,
-   struct sl_host_xdg_positioner* host =
-       static_cast<sl_host_xdg_positioner*>(wl_resource_get_user_data(resource));
- 
--  zxdg_positioner_v6_set_gravity(host->proxy, gravity);
-+  xdg_positioner_set_gravity(host->proxy, gravity);
- }
- 
- static void sl_xdg_positioner_set_constraint_adjustment(
-@@ -100,8 +100,7 @@ static void sl_xdg_positioner_set_constraint_adjustment(
-   struct sl_host_xdg_positioner* host =
-       static_cast<sl_host_xdg_positioner*>(wl_resource_get_user_data(resource));
- 
--  zxdg_positioner_v6_set_constraint_adjustment(host->proxy,
--                                               constraint_adjustment);
-+  xdg_positioner_set_constraint_adjustment(host->proxy, constraint_adjustment);
- }  // NOLINT(whitespace/indent)
- 
- static void sl_xdg_positioner_set_offset(struct wl_client* client,
-@@ -112,24 +111,23 @@ static void sl_xdg_positioner_set_offset(struct wl_client* client,
-       static_cast<sl_host_xdg_positioner*>(wl_resource_get_user_data(resource));
-   double scale = host->ctx->scale;
- 
--  zxdg_positioner_v6_set_offset(host->proxy, x / scale, y / scale);
-+  xdg_positioner_set_offset(host->proxy, x / scale, y / scale);
- }
- 
--static const struct zxdg_positioner_v6_interface
--    sl_xdg_positioner_implementation = {
--        sl_xdg_positioner_destroy,
--        sl_xdg_positioner_set_size,
--        sl_xdg_positioner_set_anchor_rect,
--        sl_xdg_positioner_set_anchor,
--        sl_xdg_positioner_set_gravity,
--        sl_xdg_positioner_set_constraint_adjustment,
--        sl_xdg_positioner_set_offset};
-+static const struct xdg_positioner_interface sl_xdg_positioner_implementation =
-+    {sl_xdg_positioner_destroy,
-+     sl_xdg_positioner_set_size,
-+     sl_xdg_positioner_set_anchor_rect,
-+     sl_xdg_positioner_set_anchor,
-+     sl_xdg_positioner_set_gravity,
-+     sl_xdg_positioner_set_constraint_adjustment,
-+     sl_xdg_positioner_set_offset};
- 
- static void sl_destroy_host_xdg_positioner(struct wl_resource* resource) {
-   struct sl_host_xdg_positioner* host =
-       static_cast<sl_host_xdg_positioner*>(wl_resource_get_user_data(resource));
- 
--  zxdg_positioner_v6_destroy(host->proxy);
-+  xdg_positioner_destroy(host->proxy);
-   wl_resource_set_user_data(resource, NULL);
-   free(host);
- }
-@@ -148,20 +146,20 @@ static void sl_xdg_popup_grab(struct wl_client* client,
-   struct sl_host_seat* host_seat =
-       static_cast<sl_host_seat*>(wl_resource_get_user_data(seat_resource));
- 
--  zxdg_popup_v6_grab(host->proxy, host_seat->proxy, serial);
-+  xdg_popup_grab(host->proxy, host_seat->proxy, serial);
- }  // NOLINT(whitespace/indent)
- 
--static const struct zxdg_popup_v6_interface sl_xdg_popup_implementation = {
-+static const struct xdg_popup_interface sl_xdg_popup_implementation = {
-     sl_xdg_popup_destroy, sl_xdg_popup_grab};
- 
- static void sl_xdg_popup_configure(void* data,
--                                   struct zxdg_popup_v6* xdg_popup,
-+                                   struct xdg_popup* xdg_popup,
-                                    int32_t x,
-                                    int32_t y,
-                                    int32_t width,
-                                    int32_t height) {
-   struct sl_host_xdg_popup* host =
--      static_cast<sl_host_xdg_popup*>(zxdg_popup_v6_get_user_data(xdg_popup));
-+      static_cast<sl_host_xdg_popup*>(xdg_popup_get_user_data(xdg_popup));
-   double scale = host->ctx->scale;
-   int32_t x1, y1, x2, y2;
- 
-@@ -170,25 +168,24 @@ static void sl_xdg_popup_configure(void* data,
-   x2 = (x + width) * scale;
-   y2 = (y + height) * scale;
- 
--  zxdg_popup_v6_send_configure(host->resource, x1, y1, x2 - x1, y2 - y1);
-+  xdg_popup_send_configure(host->resource, x1, y1, x2 - x1, y2 - y1);
- }
- 
--static void sl_xdg_popup_popup_done(void* data,
--                                    struct zxdg_popup_v6* xdg_popup) {
-+static void sl_xdg_popup_popup_done(void* data, struct xdg_popup* xdg_popup) {
-   struct sl_host_xdg_popup* host =
--      static_cast<sl_host_xdg_popup*>(zxdg_popup_v6_get_user_data(xdg_popup));
-+      static_cast<sl_host_xdg_popup*>(xdg_popup_get_user_data(xdg_popup));
- 
--  zxdg_popup_v6_send_popup_done(host->resource);
-+  xdg_popup_send_popup_done(host->resource);
- }
- 
--static const struct zxdg_popup_v6_listener sl_xdg_popup_listener = {
-+static const struct xdg_popup_listener sl_xdg_popup_listener = {
-     sl_xdg_popup_configure, sl_xdg_popup_popup_done};
- 
- static void sl_destroy_host_xdg_popup(struct wl_resource* resource) {
-   struct sl_host_xdg_popup* host =
-       static_cast<sl_host_xdg_popup*>(wl_resource_get_user_data(resource));
- 
--  zxdg_popup_v6_destroy(host->proxy);
-+  xdg_popup_destroy(host->proxy);
-   wl_resource_set_user_data(resource, NULL);
-   free(host);
- }
-@@ -208,8 +205,7 @@ static void sl_xdg_toplevel_set_parent(struct wl_client* client,
-                             wl_resource_get_user_data(parent_resource))
-                       : NULL;
- 
--  zxdg_toplevel_v6_set_parent(host->proxy,
--                              host_parent ? host_parent->proxy : NULL);
-+  xdg_toplevel_set_parent(host->proxy, host_parent ? host_parent->proxy : NULL);
- }
- 
- static void sl_xdg_toplevel_set_title(struct wl_client* client,
-@@ -218,7 +214,7 @@ static void sl_xdg_toplevel_set_title(struct wl_client* client,
-   struct sl_host_xdg_toplevel* host =
-       static_cast<sl_host_xdg_toplevel*>(wl_resource_get_user_data(resource));
- 
--  zxdg_toplevel_v6_set_title(host->proxy, title);
-+  xdg_toplevel_set_title(host->proxy, title);
- }
- 
- static void sl_xdg_toplevel_set_app_id(struct wl_client* client,
-@@ -227,7 +223,7 @@ static void sl_xdg_toplevel_set_app_id(struct wl_client* client,
-   struct sl_host_xdg_toplevel* host =
-       static_cast<sl_host_xdg_toplevel*>(wl_resource_get_user_data(resource));
- 
--  zxdg_toplevel_v6_set_app_id(host->proxy, app_id);
-+  xdg_toplevel_set_app_id(host->proxy, app_id);
- }
- 
- static void sl_xdg_toplevel_show_window_menu(struct wl_client* client,
-@@ -243,7 +239,7 @@ static void sl_xdg_toplevel_show_window_menu(struct wl_client* client,
-           ? static_cast<sl_host_seat*>(wl_resource_get_user_data(seat_resource))
-           : NULL;
- 
--  zxdg_toplevel_v6_show_window_menu(
-+  xdg_toplevel_show_window_menu(
-       host->proxy, host_seat ? host_seat->proxy : NULL, serial, x, y);
- }  // NOLINT(whitespace/indent)
- 
-@@ -258,8 +254,7 @@ static void sl_xdg_toplevel_move(struct wl_client* client,
-           ? static_cast<sl_host_seat*>(wl_resource_get_user_data(seat_resource))
-           : NULL;
- 
--  zxdg_toplevel_v6_move(host->proxy, host_seat ? host_seat->proxy : NULL,
--                        serial);
-+  xdg_toplevel_move(host->proxy, host_seat ? host_seat->proxy : NULL, serial);
- }  // NOLINT(whitespace/indent)
- 
- static void sl_xdg_toplevel_resize(struct wl_client* client,
-@@ -274,8 +269,8 @@ static void sl_xdg_toplevel_resize(struct wl_client* client,
-           ? static_cast<sl_host_seat*>(wl_resource_get_user_data(seat_resource))
-           : NULL;
- 
--  zxdg_toplevel_v6_resize(host->proxy, host_seat ? host_seat->proxy : NULL,
--                          serial, edges);
-+  xdg_toplevel_resize(host->proxy, host_seat ? host_seat->proxy : NULL, serial,
-+                      edges);
- }  // NOLINT(whitespace/indent)
- 
- static void sl_xdg_toplevel_set_max_size(struct wl_client* client,
-@@ -285,7 +280,7 @@ static void sl_xdg_toplevel_set_max_size(struct wl_client* client,
-   struct sl_host_xdg_toplevel* host =
-       static_cast<sl_host_xdg_toplevel*>(wl_resource_get_user_data(resource));
- 
--  zxdg_toplevel_v6_set_max_size(host->proxy, width, height);
-+  xdg_toplevel_set_max_size(host->proxy, width, height);
- }
- 
- static void sl_xdg_toplevel_set_min_size(struct wl_client* client,
-@@ -295,7 +290,7 @@ static void sl_xdg_toplevel_set_min_size(struct wl_client* client,
-   struct sl_host_xdg_toplevel* host =
-       static_cast<sl_host_xdg_toplevel*>(wl_resource_get_user_data(resource));
- 
--  zxdg_toplevel_v6_set_min_size(host->proxy, width, height);
-+  xdg_toplevel_set_min_size(host->proxy, width, height);
- }
- 
- static void sl_xdg_toplevel_set_maximized(struct wl_client* client,
-@@ -303,7 +298,7 @@ static void sl_xdg_toplevel_set_maximized(struct wl_client* client,
-   struct sl_host_xdg_toplevel* host =
-       static_cast<sl_host_xdg_toplevel*>(wl_resource_get_user_data(resource));
- 
--  zxdg_toplevel_v6_set_maximized(host->proxy);
-+  xdg_toplevel_set_maximized(host->proxy);
- }
- 
- static void sl_xdg_toplevel_unset_maximized(struct wl_client* client,
-@@ -311,7 +306,7 @@ static void sl_xdg_toplevel_unset_maximized(struct wl_client* client,
-   struct sl_host_xdg_toplevel* host =
-       static_cast<sl_host_xdg_toplevel*>(wl_resource_get_user_data(resource));
- 
--  zxdg_toplevel_v6_unset_maximized(host->proxy);
-+  xdg_toplevel_unset_maximized(host->proxy);
- }
- 
- static void sl_xdg_toplevel_set_fullscreen(
-@@ -325,8 +320,8 @@ static void sl_xdg_toplevel_set_fullscreen(
-                             wl_resource_get_user_data(output_resource))
-                       : NULL;
- 
--  zxdg_toplevel_v6_set_fullscreen(host->proxy,
--                                  host_output ? host_output->proxy : NULL);
-+  xdg_toplevel_set_fullscreen(host->proxy,
-+                              host_output ? host_output->proxy : NULL);
- }  // NOLINT(whitespace/indent)
- 
- static void sl_xdg_toplevel_unset_fullscreen(struct wl_client* client,
-@@ -334,7 +329,7 @@ static void sl_xdg_toplevel_unset_fullscreen(struct wl_client* client,
-   struct sl_host_xdg_toplevel* host =
-       static_cast<sl_host_xdg_toplevel*>(wl_resource_get_user_data(resource));
- 
--  zxdg_toplevel_v6_unset_fullscreen(host->proxy);
-+  xdg_toplevel_unset_fullscreen(host->proxy);
- }
- 
- static void sl_xdg_toplevel_set_minimized(struct wl_client* client,
-@@ -342,47 +337,47 @@ static void sl_xdg_toplevel_set_minimized(struct wl_client* client,
-   struct sl_host_xdg_toplevel* host =
-       static_cast<sl_host_xdg_toplevel*>(wl_resource_get_user_data(resource));
- 
--  zxdg_toplevel_v6_set_minimized(host->proxy);
-+  xdg_toplevel_set_minimized(host->proxy);
- }
- 
--static const struct zxdg_toplevel_v6_interface sl_xdg_toplevel_implementation =
--    {sl_xdg_toplevel_destroy,          sl_xdg_toplevel_set_parent,
--     sl_xdg_toplevel_set_title,        sl_xdg_toplevel_set_app_id,
--     sl_xdg_toplevel_show_window_menu, sl_xdg_toplevel_move,
--     sl_xdg_toplevel_resize,           sl_xdg_toplevel_set_max_size,
--     sl_xdg_toplevel_set_min_size,     sl_xdg_toplevel_set_maximized,
--     sl_xdg_toplevel_unset_maximized,  sl_xdg_toplevel_set_fullscreen,
--     sl_xdg_toplevel_unset_fullscreen, sl_xdg_toplevel_set_minimized};
-+static const struct xdg_toplevel_interface sl_xdg_toplevel_implementation = {
-+    sl_xdg_toplevel_destroy,          sl_xdg_toplevel_set_parent,
-+    sl_xdg_toplevel_set_title,        sl_xdg_toplevel_set_app_id,
-+    sl_xdg_toplevel_show_window_menu, sl_xdg_toplevel_move,
-+    sl_xdg_toplevel_resize,           sl_xdg_toplevel_set_max_size,
-+    sl_xdg_toplevel_set_min_size,     sl_xdg_toplevel_set_maximized,
-+    sl_xdg_toplevel_unset_maximized,  sl_xdg_toplevel_set_fullscreen,
-+    sl_xdg_toplevel_unset_fullscreen, sl_xdg_toplevel_set_minimized};
- 
- static void sl_xdg_toplevel_configure(void* data,
--                                      struct zxdg_toplevel_v6* xdg_toplevel,
-+                                      struct xdg_toplevel* xdg_toplevel,
-                                       int32_t width,
-                                       int32_t height,
-                                       struct wl_array* states) {
-   struct sl_host_xdg_toplevel* host = static_cast<sl_host_xdg_toplevel*>(
--      zxdg_toplevel_v6_get_user_data(xdg_toplevel));
-+      xdg_toplevel_get_user_data(xdg_toplevel));
-   double scale = host->ctx->scale;
- 
--  zxdg_toplevel_v6_send_configure(host->resource, width * scale, height * scale,
--                                  states);
-+  xdg_toplevel_send_configure(host->resource, width * scale, height * scale,
-+                              states);
- }
- 
- static void sl_xdg_toplevel_close(void* data,
--                                  struct zxdg_toplevel_v6* xdg_toplevel) {
-+                                  struct xdg_toplevel* xdg_toplevel) {
-   struct sl_host_xdg_toplevel* host = static_cast<sl_host_xdg_toplevel*>(
--      zxdg_toplevel_v6_get_user_data(xdg_toplevel));
-+      xdg_toplevel_get_user_data(xdg_toplevel));
- 
--  zxdg_toplevel_v6_send_close(host->resource);
-+  xdg_toplevel_send_close(host->resource);
- }
- 
--static const struct zxdg_toplevel_v6_listener sl_xdg_toplevel_listener = {
-+static const struct xdg_toplevel_listener sl_xdg_toplevel_listener = {
-     sl_xdg_toplevel_configure, sl_xdg_toplevel_close};
- 
- static void sl_destroy_host_xdg_toplevel(struct wl_resource* resource) {
-   struct sl_host_xdg_toplevel* host =
-       static_cast<sl_host_xdg_toplevel*>(wl_resource_get_user_data(resource));
- 
--  zxdg_toplevel_v6_destroy(host->proxy);
-+  xdg_toplevel_destroy(host->proxy);
-   wl_resource_set_user_data(resource, NULL);
-   free(host);
- }
-@@ -403,14 +398,14 @@ static void sl_xdg_surface_get_toplevel(struct wl_client* client,
- 
-   host_xdg_toplevel->ctx = host->ctx;
-   host_xdg_toplevel->resource =
--      wl_resource_create(client, &zxdg_toplevel_v6_interface, 1, id);
-+      wl_resource_create(client, &xdg_toplevel_interface, 1, id);
-   wl_resource_set_implementation(
-       host_xdg_toplevel->resource, &sl_xdg_toplevel_implementation,
-       host_xdg_toplevel, sl_destroy_host_xdg_toplevel);
--  host_xdg_toplevel->proxy = zxdg_surface_v6_get_toplevel(host->proxy);
--  zxdg_toplevel_v6_set_user_data(host_xdg_toplevel->proxy, host_xdg_toplevel);
--  zxdg_toplevel_v6_add_listener(host_xdg_toplevel->proxy,
--                                &sl_xdg_toplevel_listener, host_xdg_toplevel);
-+  host_xdg_toplevel->proxy = xdg_surface_get_toplevel(host->proxy);
-+  xdg_toplevel_set_user_data(host_xdg_toplevel->proxy, host_xdg_toplevel);
-+  xdg_toplevel_add_listener(host_xdg_toplevel->proxy, &sl_xdg_toplevel_listener,
-+                            host_xdg_toplevel);
- }
- 
- static void sl_xdg_surface_get_popup(struct wl_client* client,
-@@ -421,7 +416,7 @@ static void sl_xdg_surface_get_popup(struct wl_client* client,
-   struct sl_host_xdg_surface* host =
-       static_cast<sl_host_xdg_surface*>(wl_resource_get_user_data(resource));
-   struct sl_host_xdg_surface* host_parent = static_cast<sl_host_xdg_surface*>(
--      wl_resource_get_user_data(parent_resource));
-+      parent_resource ? wl_resource_get_user_data(parent_resource) : NULL);
-   struct sl_host_xdg_positioner* host_positioner =
-       static_cast<sl_host_xdg_positioner*>(
-           wl_resource_get_user_data(positioner_resource));
-@@ -431,15 +426,16 @@ static void sl_xdg_surface_get_popup(struct wl_client* client,
- 
-   host_xdg_popup->ctx = host->ctx;
-   host_xdg_popup->resource =
--      wl_resource_create(client, &zxdg_popup_v6_interface, 1, id);
-+      wl_resource_create(client, &xdg_popup_interface, 1, id);
-   wl_resource_set_implementation(host_xdg_popup->resource,
-                                  &sl_xdg_popup_implementation, host_xdg_popup,
-                                  sl_destroy_host_xdg_popup);
--  host_xdg_popup->proxy = zxdg_surface_v6_get_popup(
--      host->proxy, host_parent->proxy, host_positioner->proxy);
--  zxdg_popup_v6_set_user_data(host_xdg_popup->proxy, host_xdg_popup);
--  zxdg_popup_v6_add_listener(host_xdg_popup->proxy, &sl_xdg_popup_listener,
--                             host_xdg_popup);
-+  host_xdg_popup->proxy = xdg_surface_get_popup(
-+      host->proxy, host_parent ? host_parent->proxy : NULL,
-+      host_positioner->proxy);
-+  xdg_popup_set_user_data(host_xdg_popup->proxy, host_xdg_popup);
-+  xdg_popup_add_listener(host_xdg_popup->proxy, &sl_xdg_popup_listener,
-+                         host_xdg_popup);
- }  // NOLINT(whitespace/indent)
- 
- static void sl_xdg_surface_set_window_geometry(struct wl_client* client,
-@@ -458,7 +454,7 @@ static void sl_xdg_surface_set_window_geometry(struct wl_client* client,
-   x2 = (x + width) / scale;
-   y2 = (y + height) / scale;
- 
--  zxdg_surface_v6_set_window_geometry(host->proxy, x1, y1, x2 - x1, y2 - y1);
-+  xdg_surface_set_window_geometry(host->proxy, x1, y1, x2 - x1, y2 - y1);
- }
- 
- static void sl_xdg_surface_ack_configure(struct wl_client* client,
-@@ -467,31 +463,31 @@ static void sl_xdg_surface_ack_configure(struct wl_client* client,
-   struct sl_host_xdg_surface* host =
-       static_cast<sl_host_xdg_surface*>(wl_resource_get_user_data(resource));
- 
--  zxdg_surface_v6_ack_configure(host->proxy, serial);
-+  xdg_surface_ack_configure(host->proxy, serial);
- }
- 
--static const struct zxdg_surface_v6_interface sl_xdg_surface_implementation = {
-+static const struct xdg_surface_interface sl_xdg_surface_implementation = {
-     sl_xdg_surface_destroy, sl_xdg_surface_get_toplevel,
-     sl_xdg_surface_get_popup, sl_xdg_surface_set_window_geometry,
-     sl_xdg_surface_ack_configure};
- 
- static void sl_xdg_surface_configure(void* data,
--                                     struct zxdg_surface_v6* xdg_surface,
-+                                     struct xdg_surface* xdg_surface,
-                                      uint32_t serial) {
-   struct sl_host_xdg_surface* host = static_cast<sl_host_xdg_surface*>(
--      zxdg_surface_v6_get_user_data(xdg_surface));
-+      xdg_surface_get_user_data(xdg_surface));
- 
--  zxdg_surface_v6_send_configure(host->resource, serial);
-+  xdg_surface_send_configure(host->resource, serial);
- }
- 
--static const struct zxdg_surface_v6_listener sl_xdg_surface_listener = {
-+static const struct xdg_surface_listener sl_xdg_surface_listener = {
-     sl_xdg_surface_configure};
- 
- static void sl_destroy_host_xdg_surface(struct wl_resource* resource) {
-   struct sl_host_xdg_surface* host =
-       static_cast<sl_host_xdg_surface*>(wl_resource_get_user_data(resource));
- 
--  zxdg_surface_v6_destroy(host->proxy);
-+  xdg_surface_destroy(host->proxy);
-   wl_resource_set_user_data(resource, NULL);
-   free(host);
- }
-@@ -513,13 +509,12 @@ static void sl_xdg_shell_create_positioner(struct wl_client* client,
- 
-   host_xdg_positioner->ctx = host->ctx;
-   host_xdg_positioner->resource =
--      wl_resource_create(client, &zxdg_positioner_v6_interface, 1, id);
-+      wl_resource_create(client, &xdg_positioner_interface, 1, id);
-   wl_resource_set_implementation(
-       host_xdg_positioner->resource, &sl_xdg_positioner_implementation,
-       host_xdg_positioner, sl_destroy_host_xdg_positioner);
--  host_xdg_positioner->proxy = zxdg_shell_v6_create_positioner(host->proxy);
--  zxdg_positioner_v6_set_user_data(host_xdg_positioner->proxy,
--                                   host_xdg_positioner);
-+  host_xdg_positioner->proxy = xdg_wm_base_create_positioner(host->proxy);
-+  xdg_positioner_set_user_data(host_xdg_positioner->proxy, host_xdg_positioner);
- }
- 
- static void sl_xdg_shell_get_xdg_surface(struct wl_client* client,
-@@ -536,15 +531,15 @@ static void sl_xdg_shell_get_xdg_surface(struct wl_client* client,
- 
-   host_xdg_surface->ctx = host->ctx;
-   host_xdg_surface->resource =
--      wl_resource_create(client, &zxdg_surface_v6_interface, 1, id);
-+      wl_resource_create(client, &xdg_surface_interface, 1, id);
-   wl_resource_set_implementation(host_xdg_surface->resource,
-                                  &sl_xdg_surface_implementation,
-                                  host_xdg_surface, sl_destroy_host_xdg_surface);
-   host_xdg_surface->proxy =
--      zxdg_shell_v6_get_xdg_surface(host->proxy, host_surface->proxy);
--  zxdg_surface_v6_set_user_data(host_xdg_surface->proxy, host_xdg_surface);
--  zxdg_surface_v6_add_listener(host_xdg_surface->proxy,
--                               &sl_xdg_surface_listener, host_xdg_surface);
-+      xdg_wm_base_get_xdg_surface(host->proxy, host_surface->proxy);
-+  xdg_surface_set_user_data(host_xdg_surface->proxy, host_xdg_surface);
-+  xdg_surface_add_listener(host_xdg_surface->proxy, &sl_xdg_surface_listener,
-+                           host_xdg_surface);
-   host_surface->has_role = 1;
- }
- 
-@@ -554,30 +549,30 @@ static void sl_xdg_shell_pong(struct wl_client* client,
-   struct sl_host_xdg_shell* host =
-       static_cast<sl_host_xdg_shell*>(wl_resource_get_user_data(resource));
- 
--  zxdg_shell_v6_pong(host->proxy, serial);
-+  xdg_wm_base_pong(host->proxy, serial);
- }
- 
--static const struct zxdg_shell_v6_interface sl_xdg_shell_implementation = {
-+static const struct xdg_wm_base_interface sl_xdg_shell_implementation = {
-     sl_xdg_shell_destroy, sl_xdg_shell_create_positioner,
-     sl_xdg_shell_get_xdg_surface, sl_xdg_shell_pong};
- 
- static void sl_xdg_shell_ping(void* data,
--                              struct zxdg_shell_v6* xdg_shell,
-+                              struct xdg_wm_base* xdg_shell,
-                               uint32_t serial) {
-   struct sl_host_xdg_shell* host =
--      static_cast<sl_host_xdg_shell*>(zxdg_shell_v6_get_user_data(xdg_shell));
-+      static_cast<sl_host_xdg_shell*>(xdg_wm_base_get_user_data(xdg_shell));
- 
--  zxdg_shell_v6_send_ping(host->resource, serial);
-+  xdg_wm_base_send_ping(host->resource, serial);
- }
- 
--static const struct zxdg_shell_v6_listener sl_xdg_shell_listener = {
-+static const struct xdg_wm_base_listener sl_xdg_shell_listener = {
-     sl_xdg_shell_ping};
- 
- static void sl_destroy_host_xdg_shell(struct wl_resource* resource) {
-   struct sl_host_xdg_shell* host =
-       static_cast<sl_host_xdg_shell*>(wl_resource_get_user_data(resource));
- 
--  zxdg_shell_v6_destroy(host->proxy);
-+  xdg_wm_base_destroy(host->proxy);
-   wl_resource_set_user_data(resource, NULL);
-   free(host);
- }
-@@ -591,17 +586,17 @@ static void sl_bind_host_xdg_shell(struct wl_client* client,
-       static_cast<sl_host_xdg_shell*>(malloc(sizeof(*host)));
-   assert(host);
-   host->ctx = ctx;
--  host->resource = wl_resource_create(client, &zxdg_shell_v6_interface, 1, id);
-+  host->resource = wl_resource_create(client, &xdg_wm_base_interface, 1, id);
-   wl_resource_set_implementation(host->resource, &sl_xdg_shell_implementation,
-                                  host, sl_destroy_host_xdg_shell);
--  host->proxy = static_cast<zxdg_shell_v6*>(
-+  host->proxy = static_cast<xdg_wm_base*>(
-       wl_registry_bind(wl_display_get_registry(ctx->display),
--                       ctx->xdg_shell->id, &zxdg_shell_v6_interface, 1));
--  zxdg_shell_v6_set_user_data(host->proxy, host);
--  zxdg_shell_v6_add_listener(host->proxy, &sl_xdg_shell_listener, host);
-+                       ctx->xdg_shell->id, &xdg_wm_base_interface, 1));
-+  xdg_wm_base_set_user_data(host->proxy, host);
-+  xdg_wm_base_add_listener(host->proxy, &sl_xdg_shell_listener, host);
- }
- 
- struct sl_global* sl_xdg_shell_global_create(struct sl_context* ctx) {
--  return sl_global_create(ctx, &zxdg_shell_v6_interface, 1, ctx,
-+  return sl_global_create(ctx, &xdg_wm_base_interface, 1, ctx,
-                           sl_bind_host_xdg_shell);
- }
-diff --git a/vm_tools/sommelier/sommelier.cc b/vm_tools/sommelier/sommelier.cc
-index 2833e52a61..8f53b3b65b 100644
---- a/vm_tools/sommelier/sommelier.cc
-+++ b/vm_tools/sommelier/sommelier.cc
-@@ -39,7 +39,7 @@
- #include "relative-pointer-unstable-v1-client-protocol.h"  // NOLINT(build/include_directory)
- #include "text-input-unstable-v1-client-protocol.h"  // NOLINT(build/include_directory)
- #include "viewporter-client-protocol.h"  // NOLINT(build/include_directory)
--#include "xdg-shell-unstable-v6-client-protocol.h"  // NOLINT(build/include_directory)
-+#include "xdg-shell-client-protocol.h"  // NOLINT(build/include_directory)
- 
- #define errno_assert(rv)                                          \
-   {                                                               \
-@@ -372,13 +372,13 @@ void sl_sync_point_destroy(struct sl_sync_point* sync_point) {
- }
- 
- static void sl_internal_xdg_shell_ping(void* data,
--                                       struct zxdg_shell_v6* xdg_shell,
-+                                       struct xdg_wm_base* xdg_shell,
-                                        uint32_t serial) {
-   TRACE_EVENT("shell", "sl_internal_xdg_shell_ping");
--  zxdg_shell_v6_pong(xdg_shell, serial);
-+  xdg_wm_base_pong(xdg_shell, serial);
- }
- 
--static const struct zxdg_shell_v6_listener sl_internal_xdg_shell_listener = {
-+static const struct xdg_wm_base_listener sl_internal_xdg_shell_listener = {
-     sl_internal_xdg_shell_ping};
- 
- static void sl_send_configure_notify(struct sl_window* window) {
-@@ -549,8 +549,8 @@ int sl_process_pending_configure_acks(struct sl_window* window,
-   }
- 
-   if (window->xdg_surface) {
--    zxdg_surface_v6_ack_configure(window->xdg_surface,
--                                  window->pending_config.serial);
-+    xdg_surface_ack_configure(window->xdg_surface,
-+                              window->pending_config.serial);
-   }
-   window->pending_config.serial = 0;
- 
-@@ -567,11 +567,12 @@ void sl_commit(struct sl_window* window, struct sl_host_surface* host_surface) {
-   }
- }
- 
--static void sl_internal_xdg_surface_configure(
--    void* data, struct zxdg_surface_v6* xdg_surface, uint32_t serial) {
-+static void sl_internal_xdg_surface_configure(void* data,
-+                                              struct xdg_surface* xdg_surface,
-+                                              uint32_t serial) {
-   TRACE_EVENT("surface", "sl_internal_xdg_surface_configure");
-   struct sl_window* window =
--      static_cast<sl_window*>(zxdg_surface_v6_get_user_data(xdg_surface));
-+      static_cast<sl_window*>(xdg_surface_get_user_data(xdg_surface));
- 
-   window->next_config.serial = serial;
-   if (!window->pending_config.serial) {
-@@ -589,18 +590,18 @@ static void sl_internal_xdg_surface_configure(
-   }
- }
- 
--static const struct zxdg_surface_v6_listener sl_internal_xdg_surface_listener =
--    {sl_internal_xdg_surface_configure};
-+static const struct xdg_surface_listener sl_internal_xdg_surface_listener = {
-+    sl_internal_xdg_surface_configure};
- 
- static void sl_internal_xdg_toplevel_configure(
-     void* data,
--    struct zxdg_toplevel_v6* xdg_toplevel,
-+    struct xdg_toplevel* xdg_toplevel,
-     int32_t width,
-     int32_t height,
-     struct wl_array* states) {
-   TRACE_EVENT("other", "sl_internal_xdg_toplevel_configure");
-   struct sl_window* window =
--      static_cast<sl_window*>(zxdg_toplevel_v6_get_user_data(xdg_toplevel));
-+      static_cast<sl_window*>(xdg_toplevel_get_user_data(xdg_toplevel));
-   int activated = 0;
-   uint32_t* state;
-   int i = 0;
-@@ -630,24 +631,24 @@ static void sl_internal_xdg_toplevel_configure(
- 
-   window->allow_resize = 1;
-   sl_array_for_each(state, states) {
--    if (*state == ZXDG_TOPLEVEL_V6_STATE_FULLSCREEN) {
-+    if (*state == XDG_TOPLEVEL_STATE_FULLSCREEN) {
-       window->allow_resize = 0;
-       window->next_config.states[i++] =
-           window->ctx->atoms[ATOM_NET_WM_STATE_FULLSCREEN].value;
-     }
--    if (*state == ZXDG_TOPLEVEL_V6_STATE_MAXIMIZED) {
-+    if (*state == XDG_TOPLEVEL_STATE_MAXIMIZED) {
-       window->allow_resize = 0;
-       window->next_config.states[i++] =
-           window->ctx->atoms[ATOM_NET_WM_STATE_MAXIMIZED_VERT].value;
-       window->next_config.states[i++] =
-           window->ctx->atoms[ATOM_NET_WM_STATE_MAXIMIZED_HORZ].value;
-     }
--    if (*state == ZXDG_TOPLEVEL_V6_STATE_ACTIVATED) {
-+    if (*state == XDG_TOPLEVEL_STATE_ACTIVATED) {
-       activated = 1;
-       window->next_config.states[i++] =
-           window->ctx->atoms[ATOM_NET_WM_STATE_FOCUSED].value;
-     }
--    if (*state == ZXDG_TOPLEVEL_V6_STATE_RESIZING)
-+    if (*state == XDG_TOPLEVEL_STATE_RESIZING)
-       window->allow_resize = 0;
-   }
- 
-@@ -662,11 +663,11 @@ static void sl_internal_xdg_toplevel_configure(
-   window->next_config.states_length = i;
- }
- 
--static void sl_internal_xdg_toplevel_close(
--    void* data, struct zxdg_toplevel_v6* xdg_toplevel) {
-+static void sl_internal_xdg_toplevel_close(void* data,
-+                                           struct xdg_toplevel* xdg_toplevel) {
-   TRACE_EVENT("other", "sl_internal_xdg_toplevel_close");
-   struct sl_window* window =
--      static_cast<sl_window*>(zxdg_toplevel_v6_get_user_data(xdg_toplevel));
-+      static_cast<sl_window*>(xdg_toplevel_get_user_data(xdg_toplevel));
-   xcb_client_message_event_t event = {};
-   event.response_type = XCB_CLIENT_MESSAGE;
-   event.format = 32;
-@@ -679,21 +680,20 @@ static void sl_internal_xdg_toplevel_close(
-                  XCB_EVENT_MASK_NO_EVENT, (const char*)&event);
- }
- 
--static const struct zxdg_toplevel_v6_listener
--    sl_internal_xdg_toplevel_listener = {sl_internal_xdg_toplevel_configure,
--                                         sl_internal_xdg_toplevel_close};
-+static const struct xdg_toplevel_listener sl_internal_xdg_toplevel_listener = {
-+    sl_internal_xdg_toplevel_configure, sl_internal_xdg_toplevel_close};
- 
- static void sl_internal_xdg_popup_configure(void* data,
--                                            struct zxdg_popup_v6* xdg_popup,
-+                                            struct xdg_popup* xdg_popup,
-                                             int32_t x,
-                                             int32_t y,
-                                             int32_t width,
-                                             int32_t height) {}
- 
- static void sl_internal_xdg_popup_done(void* data,
--                                       struct zxdg_popup_v6* zxdg_popup_v6) {}
-+                                       struct xdg_popup* xdg_popup) {}
- 
--static const struct zxdg_popup_v6_listener sl_internal_xdg_popup_listener = {
-+static const struct xdg_popup_listener sl_internal_xdg_popup_listener = {
-     sl_internal_xdg_popup_configure, sl_internal_xdg_popup_done};
- 
- static void sl_window_set_wm_state(struct sl_window* window, int state) {
-@@ -765,15 +765,15 @@ void sl_window_update(struct sl_window* window) {
-       window->aura_surface = NULL;
-     }
-     if (window->xdg_toplevel) {
--      zxdg_toplevel_v6_destroy(window->xdg_toplevel);
-+      xdg_toplevel_destroy(window->xdg_toplevel);
-       window->xdg_toplevel = NULL;
-     }
-     if (window->xdg_popup) {
--      zxdg_popup_v6_destroy(window->xdg_popup);
-+      xdg_popup_destroy(window->xdg_popup);
-       window->xdg_popup = NULL;
-     }
-     if (window->xdg_surface) {
--      zxdg_surface_v6_destroy(window->xdg_surface);
-+      xdg_surface_destroy(window->xdg_surface);
-       window->xdg_surface = NULL;
-     }
-     window->realized = 0;
-@@ -849,11 +849,11 @@ void sl_window_update(struct sl_window* window) {
-   }
- 
-   if (!window->xdg_surface) {
--    window->xdg_surface = zxdg_shell_v6_get_xdg_surface(
--        ctx->xdg_shell->internal, host_surface->proxy);
--    zxdg_surface_v6_set_user_data(window->xdg_surface, window);
--    zxdg_surface_v6_add_listener(window->xdg_surface,
--                                 &sl_internal_xdg_surface_listener, window);
-+    window->xdg_surface = xdg_wm_base_get_xdg_surface(ctx->xdg_shell->internal,
-+                                                      host_surface->proxy);
-+    xdg_surface_set_user_data(window->xdg_surface, window);
-+    xdg_surface_add_listener(window->xdg_surface,
-+                             &sl_internal_xdg_surface_listener, window);
-   }
- 
-   if (ctx->aura_shell) {
-@@ -888,50 +888,46 @@ void sl_window_update(struct sl_window* window) {
-   // window is closed.
-   if (ctx->xwayland || !parent) {
-     if (!window->xdg_toplevel) {
--      window->xdg_toplevel = zxdg_surface_v6_get_toplevel(window->xdg_surface);
--      zxdg_toplevel_v6_set_user_data(window->xdg_toplevel, window);
--      zxdg_toplevel_v6_add_listener(window->xdg_toplevel,
--                                    &sl_internal_xdg_toplevel_listener, window);
-+      window->xdg_toplevel = xdg_surface_get_toplevel(window->xdg_surface);
-+      xdg_toplevel_set_user_data(window->xdg_toplevel, window);
-+      xdg_toplevel_add_listener(window->xdg_toplevel,
-+                                &sl_internal_xdg_toplevel_listener, window);
-     }
-     if (parent)
--      zxdg_toplevel_v6_set_parent(window->xdg_toplevel, parent->xdg_toplevel);
-+      xdg_toplevel_set_parent(window->xdg_toplevel, parent->xdg_toplevel);
-     if (window->name)
--      zxdg_toplevel_v6_set_title(window->xdg_toplevel, window->name);
-+      xdg_toplevel_set_title(window->xdg_toplevel, window->name);
-     if (window->size_flags & P_MIN_SIZE) {
--      zxdg_toplevel_v6_set_min_size(window->xdg_toplevel,
--                                    window->min_width / ctx->scale,
--                                    window->min_height / ctx->scale);
-+      xdg_toplevel_set_min_size(window->xdg_toplevel,
-+                                window->min_width / ctx->scale,
-+                                window->min_height / ctx->scale);
-     }
-     if (window->size_flags & P_MAX_SIZE) {
--      zxdg_toplevel_v6_set_max_size(window->xdg_toplevel,
--                                    window->max_width / ctx->scale,
--                                    window->max_height / ctx->scale);
-+      xdg_toplevel_set_max_size(window->xdg_toplevel,
-+                                window->max_width / ctx->scale,
-+                                window->max_height / ctx->scale);
-     }
-     if (window->maximized) {
--      zxdg_toplevel_v6_set_maximized(window->xdg_toplevel);
-+      xdg_toplevel_set_maximized(window->xdg_toplevel);
-     }
-   } else if (!window->xdg_popup) {
--    struct zxdg_positioner_v6* positioner;
-+    struct xdg_positioner* positioner;
- 
--    positioner = zxdg_shell_v6_create_positioner(ctx->xdg_shell->internal);
-+    positioner = xdg_wm_base_create_positioner(ctx->xdg_shell->internal);
-     assert(positioner);
--    zxdg_positioner_v6_set_anchor(
--        positioner,
--        ZXDG_POSITIONER_V6_ANCHOR_TOP | ZXDG_POSITIONER_V6_ANCHOR_LEFT);
--    zxdg_positioner_v6_set_gravity(
--        positioner,
--        ZXDG_POSITIONER_V6_GRAVITY_BOTTOM | ZXDG_POSITIONER_V6_GRAVITY_RIGHT);
--    zxdg_positioner_v6_set_anchor_rect(
--        positioner, (window->x - parent->x) / ctx->scale,
--        (window->y - parent->y) / ctx->scale, 1, 1);
-+    xdg_positioner_set_anchor(positioner, XDG_POSITIONER_ANCHOR_TOP_LEFT);
-+    xdg_positioner_set_gravity(positioner, XDG_POSITIONER_GRAVITY_BOTTOM_RIGHT);
-+    xdg_positioner_set_anchor_rect(positioner,
-+                                   (window->x - parent->x) / ctx->scale,
-+                                   (window->y - parent->y) / ctx->scale, 1, 1);
- 
--    window->xdg_popup = zxdg_surface_v6_get_popup(
--        window->xdg_surface, parent->xdg_surface, positioner);
--    zxdg_popup_v6_set_user_data(window->xdg_popup, window);
--    zxdg_popup_v6_add_listener(window->xdg_popup,
--                               &sl_internal_xdg_popup_listener, window);
-+    window->xdg_popup = xdg_surface_get_popup(window->xdg_surface,
-+                                              parent->xdg_surface, positioner);
-+    xdg_popup_set_user_data(window->xdg_popup, window);
-+    xdg_popup_add_listener(window->xdg_popup, &sl_internal_xdg_popup_listener,
-+                           window);
- 
--    zxdg_positioner_v6_destroy(positioner);
-+    xdg_positioner_destroy(positioner);
-   }
- 
-   if ((window->size_flags & (US_POSITION | P_POSITION)) && parent &&
-@@ -1332,7 +1328,7 @@ static void sl_registry_handler(void* data,
-       data_device_manager->host_global =
-           sl_data_device_manager_global_create(ctx);
-     }
--  } else if (strcmp(interface, "zxdg_shell_v6") == 0) {
-+  } else if (strcmp(interface, "xdg_wm_base") == 0) {
-     struct sl_xdg_shell* xdg_shell =
-         static_cast<sl_xdg_shell*>(malloc(sizeof(struct sl_xdg_shell)));
-     assert(xdg_shell);
-@@ -1343,10 +1339,10 @@ static void sl_registry_handler(void* data,
-     assert(!ctx->xdg_shell);
-     ctx->xdg_shell = xdg_shell;
-     if (ctx->xwayland) {
--      xdg_shell->internal = static_cast<zxdg_shell_v6*>(
--          wl_registry_bind(registry, id, &zxdg_shell_v6_interface, 1));
--      zxdg_shell_v6_add_listener(xdg_shell->internal,
--                                 &sl_internal_xdg_shell_listener, NULL);
-+      xdg_shell->internal = static_cast<xdg_wm_base*>(
-+          wl_registry_bind(registry, id, &xdg_wm_base_interface, 1));
-+      xdg_wm_base_add_listener(xdg_shell->internal,
-+                               &sl_internal_xdg_shell_listener, NULL);
-     } else {
-       xdg_shell->host_global = sl_xdg_shell_global_create(ctx);
-     }
-@@ -1479,7 +1475,7 @@ static void sl_registry_remover(void* data,
-     if (ctx->xdg_shell->host_global)
-       sl_global_destroy(ctx->xdg_shell->host_global);
-     if (ctx->xdg_shell->internal)
--      zxdg_shell_v6_destroy(ctx->xdg_shell->internal);
-+      xdg_wm_base_destroy(ctx->xdg_shell->internal);
-     free(ctx->xdg_shell);
-     ctx->xdg_shell = NULL;
-     return;
-@@ -1656,11 +1652,11 @@ static void sl_destroy_window(struct sl_window* window) {
-   }
- 
-   if (window->xdg_popup)
--    zxdg_popup_v6_destroy(window->xdg_popup);
-+    xdg_popup_destroy(window->xdg_popup);
-   if (window->xdg_toplevel)
--    zxdg_toplevel_v6_destroy(window->xdg_toplevel);
-+    xdg_toplevel_destroy(window->xdg_toplevel);
-   if (window->xdg_surface)
--    zxdg_surface_v6_destroy(window->xdg_surface);
-+    xdg_surface_destroy(window->xdg_surface);
-   if (window->aura_surface)
-     zaura_surface_destroy(window->aura_surface);
- 
-@@ -2124,15 +2120,15 @@ static void sl_handle_configure_request(struct sl_context* ctx,
-   // that matching contents will arrive.
-   if (window->xdg_toplevel) {
-     if (window->pending_config.serial) {
--      zxdg_surface_v6_ack_configure(window->xdg_surface,
--                                    window->pending_config.serial);
-+      xdg_surface_ack_configure(window->xdg_surface,
-+                                window->pending_config.serial);
-       window->pending_config.serial = 0;
-       window->pending_config.mask = 0;
-       window->pending_config.states_length = 0;
-     }
-     if (window->next_config.serial) {
--      zxdg_surface_v6_ack_configure(window->xdg_surface,
--                                    window->next_config.serial);
-+      xdg_surface_ack_configure(window->xdg_surface,
-+                                window->next_config.serial);
-       window->next_config.serial = 0;
-       window->next_config.mask = 0;
-       window->next_config.states_length = 0;
-@@ -2253,23 +2249,23 @@ static void sl_handle_configure_notify(struct sl_context* ctx,
- static uint32_t sl_resize_edge(int net_wm_moveresize_size) {
-   switch (net_wm_moveresize_size) {
-     case NET_WM_MOVERESIZE_SIZE_TOPLEFT:
--      return ZXDG_TOPLEVEL_V6_RESIZE_EDGE_TOP_LEFT;
-+      return XDG_TOPLEVEL_RESIZE_EDGE_TOP_LEFT;
-     case NET_WM_MOVERESIZE_SIZE_TOP:
--      return ZXDG_TOPLEVEL_V6_RESIZE_EDGE_TOP;
-+      return XDG_TOPLEVEL_RESIZE_EDGE_TOP;
-     case NET_WM_MOVERESIZE_SIZE_TOPRIGHT:
--      return ZXDG_TOPLEVEL_V6_RESIZE_EDGE_TOP_RIGHT;
-+      return XDG_TOPLEVEL_RESIZE_EDGE_TOP_RIGHT;
-     case NET_WM_MOVERESIZE_SIZE_RIGHT:
--      return ZXDG_TOPLEVEL_V6_RESIZE_EDGE_RIGHT;
-+      return XDG_TOPLEVEL_RESIZE_EDGE_RIGHT;
-     case NET_WM_MOVERESIZE_SIZE_BOTTOMRIGHT:
--      return ZXDG_TOPLEVEL_V6_RESIZE_EDGE_BOTTOM_RIGHT;
-+      return XDG_TOPLEVEL_RESIZE_EDGE_BOTTOM_RIGHT;
-     case NET_WM_MOVERESIZE_SIZE_BOTTOM:
--      return ZXDG_TOPLEVEL_V6_RESIZE_EDGE_BOTTOM;
-+      return XDG_TOPLEVEL_RESIZE_EDGE_BOTTOM;
-     case NET_WM_MOVERESIZE_SIZE_BOTTOMLEFT:
--      return ZXDG_TOPLEVEL_V6_RESIZE_EDGE_BOTTOM_LEFT;
-+      return XDG_TOPLEVEL_RESIZE_EDGE_BOTTOM_LEFT;
-     case NET_WM_MOVERESIZE_SIZE_LEFT:
--      return ZXDG_TOPLEVEL_V6_RESIZE_EDGE_LEFT;
-+      return XDG_TOPLEVEL_RESIZE_EDGE_LEFT;
-     default:
--      return ZXDG_TOPLEVEL_V6_RESIZE_EDGE_NONE;
-+      return XDG_TOPLEVEL_RESIZE_EDGE_NONE;
-   }
- }
- 
-@@ -2368,16 +2364,16 @@ static void sl_handle_client_message(struct sl_context* ctx,
-         return;
- 
-       if (event->data.data32[2] == NET_WM_MOVERESIZE_MOVE) {
--        zxdg_toplevel_v6_move(window->xdg_toplevel, seat->proxy,
--                              seat->seat->last_serial);
-+        xdg_toplevel_move(window->xdg_toplevel, seat->proxy,
-+                          seat->seat->last_serial);
-       } else {
-         uint32_t edge = sl_resize_edge(event->data.data32[2]);
- 
--        if (edge == ZXDG_TOPLEVEL_V6_RESIZE_EDGE_NONE)
-+        if (edge == XDG_TOPLEVEL_RESIZE_EDGE_NONE)
-           return;
- 
--        zxdg_toplevel_v6_resize(window->xdg_toplevel, seat->proxy,
--                                seat->seat->last_serial, edge);
-+        xdg_toplevel_resize(window->xdg_toplevel, seat->proxy,
-+                            seat->seat->last_serial, edge);
-       }
-     }
-   } else if (event->type == ctx->atoms[ATOM_NET_WM_STATE].value) {
-@@ -2398,9 +2394,9 @@ static void sl_handle_client_message(struct sl_context* ctx,
-                     "action", net_wm_state_to_string(action), "window->name",
-                     window->name);
-         if (action == NET_WM_STATE_ADD)
--          zxdg_toplevel_v6_set_fullscreen(window->xdg_toplevel, NULL);
-+          xdg_toplevel_set_fullscreen(window->xdg_toplevel, NULL);
-         else if (action == NET_WM_STATE_REMOVE)
--          zxdg_toplevel_v6_unset_fullscreen(window->xdg_toplevel);
-+          xdg_toplevel_unset_fullscreen(window->xdg_toplevel);
-       }
- 
-       if (changed[ATOM_NET_WM_STATE_MAXIMIZED_VERT] &&
-@@ -2411,9 +2407,9 @@ static void sl_handle_client_message(struct sl_context* ctx,
-             "action", net_wm_state_to_string(action), "window->name",
-             window->name);
-         if (action == NET_WM_STATE_ADD)
--          zxdg_toplevel_v6_set_maximized(window->xdg_toplevel);
-+          xdg_toplevel_set_maximized(window->xdg_toplevel);
-         else if (action == NET_WM_STATE_REMOVE)
--          zxdg_toplevel_v6_unset_maximized(window->xdg_toplevel);
-+          xdg_toplevel_unset_maximized(window->xdg_toplevel);
-       }
-     }
-   } else if (event->type == ctx->atoms[ATOM_WM_CHANGE_STATE].value &&
-@@ -2422,7 +2418,7 @@ static void sl_handle_client_message(struct sl_context* ctx,
-     TRACE_EVENT("x11wm", "XCB_CLIENT_MESSAGE: WM_STATE_ICONIC (minimize)",
-                 "window->name", window ? window->name : "<unknown>");
-     if (window && window->xdg_toplevel) {
--      zxdg_toplevel_v6_set_minimized(window->xdg_toplevel);
-+      xdg_toplevel_set_minimized(window->xdg_toplevel);
-     }
-   }
- }
-@@ -2435,7 +2431,7 @@ static void sl_handle_focus_in(struct sl_context* ctx,
-     // window was realized.
-     struct sl_window* parent = sl_lookup_window(ctx, window->transient_for);
-     if (parent && parent->xdg_toplevel && window->xdg_toplevel)
--      zxdg_toplevel_v6_set_parent(window->xdg_toplevel, parent->xdg_toplevel);
-+      xdg_toplevel_set_parent(window->xdg_toplevel, parent->xdg_toplevel);
-   }
- }
- 
-@@ -2744,9 +2740,9 @@ static void sl_handle_property_notify(struct sl_context* ctx,
-       return;
- 
-     if (window->name) {
--      zxdg_toplevel_v6_set_title(window->xdg_toplevel, window->name);
-+      xdg_toplevel_set_title(window->xdg_toplevel, window->name);
-     } else {
--      zxdg_toplevel_v6_set_title(window->xdg_toplevel, "");
-+      xdg_toplevel_set_title(window->xdg_toplevel, "");
-     }
-   } else if (event->atom == XCB_ATOM_WM_CLASS) {
-     struct sl_window* window = sl_lookup_window(ctx, event->window);
-@@ -2802,19 +2798,19 @@ static void sl_handle_property_notify(struct sl_context* ctx,
-       return;
- 
-     if (window->size_flags & P_MIN_SIZE) {
--      zxdg_toplevel_v6_set_min_size(window->xdg_toplevel,
--                                    window->min_width / ctx->scale,
--                                    window->min_height / ctx->scale);
-+      xdg_toplevel_set_min_size(window->xdg_toplevel,
-+                                window->min_width / ctx->scale,
-+                                window->min_height / ctx->scale);
-     } else {
--      zxdg_toplevel_v6_set_min_size(window->xdg_toplevel, 0, 0);
-+      xdg_toplevel_set_min_size(window->xdg_toplevel, 0, 0);
-     }
- 
-     if (window->size_flags & P_MAX_SIZE) {
--      zxdg_toplevel_v6_set_max_size(window->xdg_toplevel,
--                                    window->max_width / ctx->scale,
--                                    window->max_height / ctx->scale);
-+      xdg_toplevel_set_max_size(window->xdg_toplevel,
-+                                window->max_width / ctx->scale,
-+                                window->max_height / ctx->scale);
-     } else {
--      zxdg_toplevel_v6_set_max_size(window->xdg_toplevel, 0, 0);
-+      xdg_toplevel_set_max_size(window->xdg_toplevel, 0, 0);
-     }
-   } else if (event->atom == XCB_ATOM_WM_HINTS) {
-     struct sl_window* window = sl_lookup_window(ctx, event->window);
-diff --git a/vm_tools/sommelier/sommelier.h b/vm_tools/sommelier/sommelier.h
-index 79bcf6a3b3..d3157cd8a9 100644
---- a/vm_tools/sommelier/sommelier.h
-+++ b/vm_tools/sommelier/sommelier.h
-@@ -400,7 +400,7 @@ struct sl_xdg_shell {
-   struct sl_context* ctx;
-   uint32_t id;
-   struct sl_global* host_global;
--  struct zxdg_shell_v6* internal;
-+  struct xdg_wm_base* internal;
- };
- 
- struct sl_aura_shell {
-@@ -500,9 +500,9 @@ struct sl_window {
-   int max_height;
-   struct sl_config next_config;
-   struct sl_config pending_config;
--  struct zxdg_surface_v6* xdg_surface;
--  struct zxdg_toplevel_v6* xdg_toplevel;
--  struct zxdg_popup_v6* xdg_popup;
-+  struct xdg_surface* xdg_surface;
-+  struct xdg_toplevel* xdg_toplevel;
-+  struct xdg_popup* xdg_popup;
-   struct zaura_surface* aura_surface;
-   struct wl_list link;
- };
--- 
-2.32.0
-
diff --git a/pkgs/os-specific/linux/chromium-os/sommelier/default.nix b/pkgs/os-specific/linux/chromium-os/sommelier/default.nix
deleted file mode 100644
index b45ab330c34..00000000000
--- a/pkgs/os-specific/linux/chromium-os/sommelier/default.nix
+++ /dev/null
@@ -1,37 +0,0 @@
-{ common-mk, lib
-, abseil-cpp, mesa, grpc, openssl, libdrm, xlibs, protobuf, wayland
-, libxkbcommon, vm_protos, linuxHeaders, c-ares, zlib
-}:
-
-common-mk {
-  platformSubdir = "vm_tools/sommelier";
-
-  platform2Patches = [
-    ./0005-sommelier-don-t-leak-source-absolute-paths.patch
-    ./0006-Revert-Revert-vm_tools-sommelier-Switch-to-the-stabl.patch
-  ];
-
-  buildInputs = [
-    abseil-cpp mesa grpc openssl libdrm protobuf wayland libxkbcommon vm_protos
-    linuxHeaders c-ares zlib
-  ] ++ (with xlibs; [ pixman libxcb libX11 ]);
-
-  gnArgs.use_demos = false;
-
-  NIX_CFLAGS_COMPILE = [
-    "-Wno-error=sign-compare"
-    "-Wno-error=stringop-truncation"
-    "-Wno-error=class-memaccess"
-    "-Wno-error=maybe-uninitialized"
-  ];
-
-  installPhase = ''
-    mkdir -p $out/bin
-    install sommelier $out/bin
-  '';
-
-  meta = with lib; {
-    description = "Nested Wayland compositor with support for X11 forwarding";
-    maintainers = with maintainers; [ qyliss ];
-  };
-}
diff --git a/pkgs/os-specific/linux/chromium-os/update.py b/pkgs/os-specific/linux/chromium-os/update.py
deleted file mode 100755
index 5852d4a3069..00000000000
--- a/pkgs/os-specific/linux/chromium-os/update.py
+++ /dev/null
@@ -1,131 +0,0 @@
-#! /usr/bin/env nix-shell
-#! nix-shell -i python -p "python3.withPackages (ps: with ps; [ lxml ])"
-
-import base64
-import json
-import subprocess
-from codecs import iterdecode
-from os import scandir
-from os.path import dirname, splitext
-from lxml import etree
-from lxml.etree import HTMLParser
-from re import MULTILINE, fullmatch, match, search
-from urllib.request import urlopen
-
-# ChromiumOS components used in Nixpkgs
-component_paths = [
-    'src/aosp/external/minijail',
-    'src/platform/crosvm',
-    'src/platform/minigbm',
-    'src/platform2',
-    'src/third_party/adhd',
-    'src/third_party/chromiumos-overlay',
-    'src/third_party/kernel/v5.4',
-    'src/third_party/libqmi',
-    'src/third_party/modemmanager-next',
-    'src/third_party/modp_b64',
-    'src/third_party/rust-vmm/vhost',
-]
-
-git_root = 'https://chromium.googlesource.com/'
-manifest_versions = f'{git_root}chromiumos/manifest-versions'
-buildspecs_url = f'{manifest_versions}/+/refs/heads/master/full/buildspecs/'
-
-# CrOS version numbers look like this:
-# [<chrome-major-version>.]<tip-build>.<branch-build>.<branch-branch-build>
-#
-# As far as I can tell, branches are where internal Google
-# modifications are added to turn Chromium OS into Chrome OS, and
-# branch branches are used for fixes for specific devices.  So for
-# Chromium OS they will always be 0.  This is a best guess, and is not
-# documented.
-with urlopen('https://cros-updates-serving.appspot.com/') as resp:
-    document = etree.parse(resp, HTMLParser())
-
-    # bgcolor="lightgreen" is set on the most up-to-date version for
-    # each channel, so find a lightgreen cell in the "Stable" column.
-    (platform_version, chrome_version) = document.xpath("""
-        (//table[@id="cros-updates"]/tr/td[1 + count(
-            //table[@id="cros-updates"]/thead/tr[1]/th[text() = "Stable"]
-            /preceding-sibling::*)
-        ][@bgcolor="lightgreen"])[1]/text()
-    """)
-
-chrome_major_version = match(r'\d+', chrome_version)[0]
-chromeos_tip_build = match(r'\d+', platform_version)[0]
-
-# Find the most recent buildspec for the stable Chrome version and
-# Chromium OS build number.  Its branch build and branch branch build
-# numbers will (almost?) certainly be 0.  It will then end with an rc
-# number -- presumably these are release candidates, one of which
-# becomes the final release.  Presumably the one with the highest rc
-# number.
-with urlopen(f'{buildspecs_url}{chrome_major_version}/?format=TEXT') as resp:
-    listing = base64.decodebytes(resp.read()).decode('utf-8')
-    buildspecs = [(line.split('\t', 1)[1]) for line in listing.splitlines()]
-    buildspecs = [s for s in buildspecs if s.startswith(chromeos_tip_build)]
-    buildspecs.sort(reverse=True)
-    buildspec = splitext(buildspecs[0])[0]
-
-components = {}
-
-# Read the buildspec, and extract the git revisions for each component.
-with urlopen(f'{buildspecs_url}{chrome_major_version}/{buildspec}.xml?format=TEXT') as resp:
-    xml = base64.decodebytes(resp.read())
-    root = etree.fromstring(xml)
-
-    default_remote = root.find('default').get('remote')
-    remotes = {}
-    for remote in root.findall('remote'):
-        remotes[remote.get('name')] = remote.get('fetch')
-
-    for project in root.findall('project'):
-        name = project.get('name')
-        path = project.get('path')
-        remote_name = project.get('remote') or default_remote
-        remote = remotes[remote_name]
-
-        components[path] = {
-            'revision': project.get('revision'),
-            'url': f'{remote}/{name}',
-        }
-
-# Initialize the data that will be output from this script.  Leave the
-# rc number in buildspec so nobody else is subject to the same level
-# of confusion I have been.
-data = {'version': f'{chrome_major_version}.{buildspec}', 'components': {}}
-
-paths = {}
-
-# Fill in the 'components' dictionary with the output from
-# nix-prefetch-git, which can be passed straight to fetchGit when
-# imported by Nix.
-for path in component_paths:
-    name = path.split('/')[-1]
-    url = components[path]['url']
-    rev = components[path]['revision']
-    tarball = f'{url}/+archive/{rev}.tar.gz'
-    output = subprocess.check_output(['nix-prefetch-url', '--print-path', '--unpack', '--name', name, tarball])
-    (sha256, store_path) = output.decode('utf-8').splitlines()
-    paths[path] = store_path
-    data['components'][path] = {
-        'name': name,
-        'url': url,
-        'rev': rev,
-        'sha256': sha256,
-    }
-
-# Get the version number of the kernel.
-kernel = paths['src/third_party/kernel/v5.4']
-makefile = open(f'{kernel}/Makefile').read()
-version = search(r'^VERSION = (.+)$', makefile, MULTILINE)[1]
-patchlevel = search(r'^PATCHLEVEL = (.*?)$', makefile, MULTILINE)[1]
-sublevel = search(r'^SUBLEVEL = (.*?)$', makefile, MULTILINE)[1]
-extra = search(r'^EXTRAVERSION =[ \t]*(.*?)$', makefile, MULTILINE)[1]
-full_ver = '.'.join(filter(None, [version, patchlevel, sublevel])) + extra
-data['components']['src/third_party/kernel/v5.4']['version'] = full_ver
-
-# Finally, write the output.
-with open(dirname(__file__) + '/upstream-info.json', 'w') as out:
-    json.dump(data, out, indent=2)
-    out.write('\n')
diff --git a/pkgs/os-specific/linux/chromium-os/upstream-info.json b/pkgs/os-specific/linux/chromium-os/upstream-info.json
deleted file mode 100644
index f23948d9cb4..00000000000
--- a/pkgs/os-specific/linux/chromium-os/upstream-info.json
+++ /dev/null
@@ -1,72 +0,0 @@
-{
-  "version": "91.13904.0.0-rc2",
-  "components": {
-    "src/aosp/external/minijail": {
-      "name": "minijail",
-      "url": "https://android.googlesource.com/platform/external/minijail",
-      "rev": "4f830bddad22ccbb5862a866efd9931393a4b83b",
-      "sha256": "044ll9jmanjlv6ibb8n77nsqifsb1iqck3bgkyix43i3yqamlq5h"
-    },
-    "src/platform/crosvm": {
-      "name": "crosvm",
-      "url": "https://chromium.googlesource.com/chromiumos/platform/crosvm",
-      "rev": "401340ee7fa81db720a4f7a9476b6eea133e5b64",
-      "sha256": "0wbfprqqm0hqhypdb0x90bqn65kv0f3vpibr84p3paby6hmx14y2"
-    },
-    "src/platform/minigbm": {
-      "name": "minigbm",
-      "url": "https://chromium.googlesource.com/chromiumos/platform/minigbm",
-      "rev": "231913e75751498902132c825d5b8567684e3b8d",
-      "sha256": "03wcdwd4l0wg9k6z9nnqim2wqqddlmppa49v6bkry7mhmiar1jc9"
-    },
-    "src/platform2": {
-      "name": "platform2",
-      "url": "https://chromium.googlesource.com/chromiumos/platform2",
-      "rev": "1fcefaa166e868069ad1b81091333ff75e0657f6",
-      "sha256": "1p4rcq53qz35sfbqldmcnjz5ikjxppdw1xcb348zn8n3hnb6vmqf"
-    },
-    "src/third_party/adhd": {
-      "name": "adhd",
-      "url": "https://chromium.googlesource.com/chromiumos/third_party/adhd",
-      "rev": "3624a4296888926a21462bfd499d4ba91268046b",
-      "sha256": "0flph3fagyl21dbwpdvhhizwnhbrgll87yfpq1i00xzr0c9xc1cc"
-    },
-    "src/third_party/chromiumos-overlay": {
-      "name": "chromiumos-overlay",
-      "url": "https://chromium.googlesource.com/chromiumos/overlays/chromiumos-overlay",
-      "rev": "f5b0e4767c2e5f8caa899127c8b3060fda2a3694",
-      "sha256": "1vpfccb0ikqa1xh6m0wizbxcaick2arki7d76sacz8qgrxinq8mn"
-    },
-    "src/third_party/kernel/v5.4": {
-      "name": "v5.4",
-      "url": "https://chromium.googlesource.com/chromiumos/third_party/kernel",
-      "rev": "15178e41cf17cd7ce9f9a087bcb0677eaa57f82b",
-      "sha256": "0cwvxm5bx0xs80l2rq3dqj88445qdhiqxp1999ix1gcc8awvwzdb",
-      "version": "5.4.109"
-    },
-    "src/third_party/libqmi": {
-      "name": "libqmi",
-      "url": "https://chromium.googlesource.com/chromiumos/third_party/libqmi",
-      "rev": "d9def40a2e068fd7e961aa0a4c699cf62cb8672c",
-      "sha256": "0grf510l85p32hc8gn7ks12ma0c2s3gnk76dyq62kmrvfb43ijzm"
-    },
-    "src/third_party/modemmanager-next": {
-      "name": "modemmanager-next",
-      "url": "https://chromium.googlesource.com/chromiumos/third_party/modemmanager-next",
-      "rev": "2de7877b2662d64c162434a7d3fb89d43f24b913",
-      "sha256": "027pnj92kidfgrzfpgwz18pl7gjgxi128il6wx1s8jdxsk2m00jc"
-    },
-    "src/third_party/modp_b64": {
-      "name": "modp_b64",
-      "url": "https://chromium.googlesource.com/aosp/platform/external/modp_b64",
-      "rev": "269b6fb8401617b85e2dff7ae8a7b0f97613e2cd",
-      "sha256": "1mc5w70svgj7rq49r6lxkw9ix6q09dxrw0lamx3hn8anq5q8y532"
-    },
-    "src/third_party/rust-vmm/vhost": {
-      "name": "vhost",
-      "url": "https://chromium.googlesource.com/chromiumos/third_party/rust-vmm/vhost",
-      "rev": "98298cb96972c20e05bffed58861456b48328d43",
-      "sha256": "0ym5cmnaifn3ywcidvqmbswmsxqi0zw6gx88gfqfq0p5jis8vjhi"
-    }
-  }
-}
diff --git a/pkgs/os-specific/linux/chromium-os/vm_protos/0003-common-mk-add-goproto_library-source_relative-opt.patch b/pkgs/os-specific/linux/chromium-os/vm_protos/0003-common-mk-add-goproto_library-source_relative-opt.patch
deleted file mode 100644
index e921abd8032..00000000000
--- a/pkgs/os-specific/linux/chromium-os/vm_protos/0003-common-mk-add-goproto_library-source_relative-opt.patch
+++ /dev/null
@@ -1,48 +0,0 @@
-From 211eea8e623c9e9beb61f38720c718f080bae883 Mon Sep 17 00:00:00 2001
-From: Alyssa Ross <hi@alyssa.is>
-Date: Mon, 28 Jun 2021 17:10:46 +0000
-Subject: [PATCH 3/6] common-mk: add goproto_library source_relative opt
-
-We need this for the go_package changes in protoc-gen-go 1.5.x.  If we
-didn't use source-relative paths, the full module path would be
-repeated in the output location, so we'd get paths like
-src/chromiumos/vm_tools/vm_crash/chromiumos/vm_tools/vm_crash/vm_crash.pb.go.
-
-To avoid the duplication, we either need to set source_relative, or
-set proto_out_dir to just go/src.  The latter isn't workable, because
-then everything two libraries that both use common.proto will both
-generate outputs called "go/src/common.pb.go", which will upset GN.
-
-Reviewed-by: Cole Helbling <cole.e.helbling@outlook.com>
----
- common-mk/proto_library.gni | 7 +++++++
- 1 file changed, 7 insertions(+)
-
-diff --git a/common-mk/proto_library.gni b/common-mk/proto_library.gni
-index fb9fb4231d..23645a134f 100644
---- a/common-mk/proto_library.gni
-+++ b/common-mk/proto_library.gni
-@@ -225,6 +225,9 @@ template("proto_library") {
- #   proto_lib_dirs (optional)
- #       Directories to search for protos a proto file depends on.
- #       proto_in_dir and "${sysroot}/usr/share/proto" are added by default.
-+#   source_relative (optional)
-+#       If true, the output file is placed in the same relative directory as the
-+#       input file (but under proto_out_dir).
- template("goproto_library") {
-   action(target_name) {
-     forward_variables_from(invoker,
-@@ -254,6 +257,10 @@ template("goproto_library") {
- 
-     go_plugin_parameters = []
- 
-+    if (defined(invoker.source_relative) && invoker.source_relative) {
-+      go_plugin_parameters += [ "paths=source_relative" ]
-+    }
-+
-     if (defined(invoker.gen_grpc) && invoker.gen_grpc) {
-       go_plugin_parameters += [ "plugins=grpc" ]
-     }
--- 
-2.32.0
-
diff --git a/pkgs/os-specific/linux/chromium-os/vm_protos/0004-vm_tools-proto-set-go_package-correctly.patch b/pkgs/os-specific/linux/chromium-os/vm_protos/0004-vm_tools-proto-set-go_package-correctly.patch
deleted file mode 100644
index d77bcf2bdef..00000000000
--- a/pkgs/os-specific/linux/chromium-os/vm_protos/0004-vm_tools-proto-set-go_package-correctly.patch
+++ /dev/null
@@ -1,102 +0,0 @@
-From fae12c5b06864c0a9687320735c9bed9219c30c8 Mon Sep 17 00:00:00 2001
-From: Alyssa Ross <hi@alyssa.is>
-Date: Wed, 16 Jun 2021 16:09:01 +0000
-Subject: [PATCH 4/6] vm_tools: proto: set go_package correctly
-
-protoc-gen-go 1.5.x has become a lot stricter about this.  We have to
-use import_mapping for common.proto because it ends up being included
-in multiple Go libraries.  I'm not sure why it needs to be built once
-per library, but that's the way it works.
-
-Reviewed-by: Cole Helbling <cole.e.helbling@outlook.com>
----
- vm_tools/proto/BUILD.gn       | 5 +++++
- vm_tools/proto/tremplin.proto | 2 +-
- vm_tools/proto/vm_crash.proto | 2 +-
- vm_tools/proto/vm_guest.proto | 1 +
- vm_tools/proto/vm_host.proto  | 1 +
- 5 files changed, 9 insertions(+), 2 deletions(-)
-
-diff --git a/vm_tools/proto/BUILD.gn b/vm_tools/proto/BUILD.gn
-index 79c9b94c9f..aadc40165c 100644
---- a/vm_tools/proto/BUILD.gn
-+++ b/vm_tools/proto/BUILD.gn
-@@ -60,6 +60,8 @@ goproto_library("vm-crash-gorpcs") {
-   proto_in_dir = "./"
-   proto_out_dir = "go/src/chromiumos/vm_tools/vm_crash"
-   gen_grpc = true
-+  source_relative = true
-+  import_mapping = [ "common.proto=chromiumos/vm_tools/vm_crash" ]
-   sources = [
-     "${proto_in_dir}/common.proto",
-     "${proto_in_dir}/vm_crash.proto",
-@@ -97,6 +99,7 @@ goproto_library("tremplin-gorpcs") {
-   proto_in_dir = "./"
-   proto_out_dir = "go/src/chromiumos/vm_tools/tremplin_proto"
-   gen_grpc = true
-+  source_relative = true
-   sources = [ "${proto_in_dir}/tremplin.proto" ]
- }
- 
-@@ -120,6 +123,8 @@ goproto_library("vm-gorpcs") {
-   proto_in_dir = "./"
-   proto_out_dir = "go/src/chromiumos/vm_tools/vm_rpc"
-   gen_grpc = true
-+  source_relative = true
-+  import_mapping = [ "common.proto=chromiumos/vm_tools/vm_rpc" ]
-   sources = [
-     "${proto_in_dir}/common.proto",
-     "${proto_in_dir}/vm_guest.proto",
-diff --git a/vm_tools/proto/tremplin.proto b/vm_tools/proto/tremplin.proto
-index aac76f7a9e..e6a7bbed0e 100644
---- a/vm_tools/proto/tremplin.proto
-+++ b/vm_tools/proto/tremplin.proto
-@@ -8,7 +8,7 @@ option cc_enable_arenas = true;
- 
- // This file defines services for tremplin, the container springboard service.
- package vm_tools.tremplin;
--option go_package = "tremplin_proto";
-+option go_package = "chromiumos/vm_tools/tremplin_proto";
- 
- // This needs to be duplicated because the gyp rule for building
- // go code makes it difficult to have imports.
-diff --git a/vm_tools/proto/vm_crash.proto b/vm_tools/proto/vm_crash.proto
-index 6e4f62fe13..3cd4279989 100644
---- a/vm_tools/proto/vm_crash.proto
-+++ b/vm_tools/proto/vm_crash.proto
-@@ -7,7 +7,7 @@ syntax = "proto3";
- option cc_enable_arenas = true;
- 
- package vm_tools.cicerone;
--option go_package = "vm_crash";
-+option go_package = "chromiumos/vm_tools/vm_crash";
- 
- import "common.proto";
- 
-diff --git a/vm_tools/proto/vm_guest.proto b/vm_tools/proto/vm_guest.proto
-index 86f11d0812..d0946078d5 100644
---- a/vm_tools/proto/vm_guest.proto
-+++ b/vm_tools/proto/vm_guest.proto
-@@ -8,6 +8,7 @@ option cc_enable_arenas = true;
- 
- // This file defines services that will be running in the guest VM.
- package vm_tools;
-+option go_package = "chromiumos/vm_tools/vm_rpc";
- 
- import "common.proto";
- import "google/protobuf/timestamp.proto";
-diff --git a/vm_tools/proto/vm_host.proto b/vm_tools/proto/vm_host.proto
-index a8bd066f61..19759b0271 100644
---- a/vm_tools/proto/vm_host.proto
-+++ b/vm_tools/proto/vm_host.proto
-@@ -8,6 +8,7 @@ option cc_enable_arenas = true;
- 
- // This file defines services that will be running on the host for the VM.
- package vm_tools;
-+option go_package = "chromiumos/vm_tools/vm_rpc";
- 
- import "common.proto";
- 
--- 
-2.32.0
-
diff --git a/pkgs/os-specific/linux/chromium-os/vm_protos/default.nix b/pkgs/os-specific/linux/chromium-os/vm_protos/default.nix
deleted file mode 100644
index cded9c988b3..00000000000
--- a/pkgs/os-specific/linux/chromium-os/vm_protos/default.nix
+++ /dev/null
@@ -1,41 +0,0 @@
-{ common-mk, lib, go-protobuf, grpc, openssl, protobuf }:
-
-common-mk {
-  pname = "vm_protos";
-  platformSubdir = "vm_tools/proto";
-
-  nativeBuildInputs = [ go-protobuf ];
-  buildInputs = [ grpc openssl protobuf ];
-
-  platform2Patches = [
-    ./0003-common-mk-add-goproto_library-source_relative-opt.patch
-    ./0004-vm_tools-proto-set-go_package-correctly.patch
-  ];
-
-  NIX_CFLAGS_COMPILE = [
-    "-Wno-error=array-bounds"
-    "-Wno-error=deprecated-declarations"
-  ];
-
-  postPatch = ''
-    substituteInPlace common-mk/proto_library.gni \
-        --replace /usr/bin/grpc_cpp_plugin ${grpc}/bin/grpc_cpp_plugin
-  '';
-
-  installPhase = ''
-    mkdir -p $out/lib/pkgconfig
-    install -m 644 ../../vm_tools/proto/vm_protos.pc $out/lib/pkgconfig
-
-    headerPath=include/vm_protos/proto_bindings
-    mkdir -p $out/$headerPath
-    install -m 644 gen/$headerPath/*.h $out/$headerPath
-
-    install -m 644 *.a $out/lib
-  '';
-
-  meta = with lib; {
-    description = "Protobuf definitions for Chromium OS system VMs";
-    maintainers = with maintainers; [ qyliss ];
-    platform = platforms.all;
-  };
-}