prl-tools: 12.2.1-41615 -> 17.1.4-51567
Install Parallel Tools updated for version 17 of Parallels for macOS. This fixes clipboard sharing, so that copy and paste works between the host macOS and the guest NixOS VM. Support for guests on M1 Apple Silicon-based Macs (aarch64-linux) is also added. Co-authored-by: Paul Smith <paulsmith@gmail.com> Co-authored-by: Weijia Wang <9713184+wegank@users.noreply.github.com>
This commit is contained in:
parent
0a9f100d77
commit
f41fc22111
@ -34,7 +34,8 @@ in
|
|||||||
package = mkOption {
|
package = mkOption {
|
||||||
type = types.nullOr types.package;
|
type = types.nullOr types.package;
|
||||||
default = config.boot.kernelPackages.prl-tools;
|
default = config.boot.kernelPackages.prl-tools;
|
||||||
defaultText = literalExpression "config.boot.kernelPackages.prl-tools";
|
defaultText = "config.boot.kernelPackages.prl-tools";
|
||||||
|
example = literalExpression "config.boot.kernelPackages.prl-tools";
|
||||||
description = ''
|
description = ''
|
||||||
Defines which package to use for prl-tools. Override to change the version.
|
Defines which package to use for prl-tools. Override to change the version.
|
||||||
'';
|
'';
|
||||||
@ -44,27 +45,6 @@ in
|
|||||||
};
|
};
|
||||||
|
|
||||||
config = mkIf config.hardware.parallels.enable {
|
config = mkIf config.hardware.parallels.enable {
|
||||||
services.xserver = {
|
|
||||||
drivers = singleton
|
|
||||||
{ name = "prlvideo"; modules = [ prl-tools ]; };
|
|
||||||
|
|
||||||
screenSection = ''
|
|
||||||
Option "NoMTRR"
|
|
||||||
'';
|
|
||||||
|
|
||||||
config = ''
|
|
||||||
Section "InputClass"
|
|
||||||
Identifier "prlmouse"
|
|
||||||
MatchIsPointer "on"
|
|
||||||
MatchTag "prlmouse"
|
|
||||||
Driver "prlmouse"
|
|
||||||
EndSection
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
hardware.opengl.package = prl-tools;
|
|
||||||
hardware.opengl.package32 = pkgs.pkgsi686Linux.linuxPackages.prl-tools.override { libsOnly = true; kernel = null; };
|
|
||||||
hardware.opengl.setLdLibraryPath = true;
|
|
||||||
|
|
||||||
services.udev.packages = [ prl-tools ];
|
services.udev.packages = [ prl-tools ];
|
||||||
|
|
||||||
@ -72,37 +52,44 @@ in
|
|||||||
|
|
||||||
boot.extraModulePackages = [ prl-tools ];
|
boot.extraModulePackages = [ prl-tools ];
|
||||||
|
|
||||||
boot.kernelModules = [ "prl_tg" "prl_eth" "prl_fs" "prl_fs_freeze" ];
|
boot.kernelModules = [ "prl_fs" "prl_fs_freeze" "prl_tg" ]
|
||||||
|
++ optional (pkgs.stdenv.hostPlatform.system == "aarch64-linux") "prl_notifier";
|
||||||
|
|
||||||
services.timesyncd.enable = false;
|
services.timesyncd.enable = false;
|
||||||
|
|
||||||
systemd.services.prltoolsd = {
|
systemd.services.prltoolsd = {
|
||||||
description = "Parallels Tools' service";
|
description = "Parallels Tools Service";
|
||||||
wantedBy = [ "multi-user.target" ];
|
wantedBy = [ "multi-user.target" ];
|
||||||
|
path = [ prl-tools ];
|
||||||
serviceConfig = {
|
serviceConfig = {
|
||||||
ExecStart = "${prl-tools}/bin/prltoolsd -f";
|
ExecStart = "${prl-tools}/bin/prltoolsd -f";
|
||||||
PIDFile = "/var/run/prltoolsd.pid";
|
PIDFile = "/var/run/prltoolsd.pid";
|
||||||
|
WorkingDirectory = "${prl-tools}/bin";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
systemd.services.prlfsmountd = mkIf config.hardware.parallels.autoMountShares {
|
systemd.services.prlfsmountd = mkIf config.hardware.parallels.autoMountShares {
|
||||||
description = "Parallels Shared Folders Daemon";
|
description = "Parallels Guest File System Sharing Tool";
|
||||||
wantedBy = [ "multi-user.target" ];
|
wantedBy = [ "multi-user.target" ];
|
||||||
|
path = [ prl-tools ];
|
||||||
serviceConfig = rec {
|
serviceConfig = rec {
|
||||||
ExecStart = "${prl-tools}/sbin/prlfsmountd ${PIDFile}";
|
ExecStart = "${prl-tools}/sbin/prlfsmountd ${PIDFile}";
|
||||||
ExecStartPre = "${pkgs.coreutils}/bin/mkdir -p /media";
|
ExecStartPre = "${pkgs.coreutils}/bin/mkdir -p /media";
|
||||||
ExecStopPost = "${prl-tools}/sbin/prlfsmountd -u";
|
ExecStopPost = "${prl-tools}/sbin/prlfsmountd -u";
|
||||||
PIDFile = "/run/prlfsmountd.pid";
|
PIDFile = "/run/prlfsmountd.pid";
|
||||||
|
WorkingDirectory = "${prl-tools}/bin";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
systemd.services.prlshprint = {
|
systemd.services.prlshprint = {
|
||||||
description = "Parallels Shared Printer Tool";
|
description = "Parallels Printing Tool";
|
||||||
wantedBy = [ "multi-user.target" ];
|
wantedBy = [ "multi-user.target" ];
|
||||||
bindsTo = [ "cups.service" ];
|
bindsTo = [ "cups.service" ];
|
||||||
|
path = [ prl-tools ];
|
||||||
serviceConfig = {
|
serviceConfig = {
|
||||||
Type = "forking";
|
Type = "forking";
|
||||||
ExecStart = "${prl-tools}/bin/prlshprint";
|
ExecStart = "${prl-tools}/bin/prlshprint";
|
||||||
|
WorkingDirectory = "${prl-tools}/bin";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -110,43 +97,47 @@ in
|
|||||||
prlcc = {
|
prlcc = {
|
||||||
description = "Parallels Control Center";
|
description = "Parallels Control Center";
|
||||||
wantedBy = [ "graphical-session.target" ];
|
wantedBy = [ "graphical-session.target" ];
|
||||||
|
path = [ prl-tools ];
|
||||||
serviceConfig = {
|
serviceConfig = {
|
||||||
ExecStart = "${prl-tools}/bin/prlcc";
|
ExecStart = "${prl-tools}/bin/prlcc";
|
||||||
|
WorkingDirectory = "${prl-tools}/bin";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
prldnd = {
|
prldnd = {
|
||||||
description = "Parallels Control Center";
|
description = "Parallels Drag And Drop Tool";
|
||||||
wantedBy = [ "graphical-session.target" ];
|
wantedBy = [ "graphical-session.target" ];
|
||||||
|
path = [ prl-tools ];
|
||||||
serviceConfig = {
|
serviceConfig = {
|
||||||
ExecStart = "${prl-tools}/bin/prldnd";
|
ExecStart = "${prl-tools}/bin/prldnd";
|
||||||
};
|
WorkingDirectory = "${prl-tools}/bin";
|
||||||
};
|
|
||||||
prl_wmouse_d = {
|
|
||||||
description = "Parallels Walking Mouse Daemon";
|
|
||||||
wantedBy = [ "graphical-session.target" ];
|
|
||||||
serviceConfig = {
|
|
||||||
ExecStart = "${prl-tools}/bin/prl_wmouse_d";
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
prlcp = {
|
prlcp = {
|
||||||
description = "Parallels CopyPaste Tool";
|
description = "Parallels Copy Paste Tool";
|
||||||
wantedBy = [ "graphical-session.target" ];
|
wantedBy = [ "graphical-session.target" ];
|
||||||
|
path = [ prl-tools ];
|
||||||
serviceConfig = {
|
serviceConfig = {
|
||||||
ExecStart = "${prl-tools}/bin/prlcp";
|
ExecStart = "${prl-tools}/bin/prlcp";
|
||||||
|
Restart = "always";
|
||||||
|
WorkingDirectory = "${prl-tools}/bin";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
prlsga = {
|
prlsga = {
|
||||||
description = "Parallels Shared Guest Applications Tool";
|
description = "Parallels Shared Guest Applications Tool";
|
||||||
wantedBy = [ "graphical-session.target" ];
|
wantedBy = [ "graphical-session.target" ];
|
||||||
|
path = [ prl-tools ];
|
||||||
serviceConfig = {
|
serviceConfig = {
|
||||||
ExecStart = "${prl-tools}/bin/prlsga";
|
ExecStart = "${prl-tools}/bin/prlsga";
|
||||||
|
WorkingDirectory = "${prl-tools}/bin";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
prlshprof = {
|
prlshprof = {
|
||||||
description = "Parallels Shared Profile Tool";
|
description = "Parallels Shared Profile Tool";
|
||||||
wantedBy = [ "graphical-session.target" ];
|
wantedBy = [ "graphical-session.target" ];
|
||||||
|
path = [ prl-tools ];
|
||||||
serviceConfig = {
|
serviceConfig = {
|
||||||
ExecStart = "${prl-tools}/bin/prlshprof";
|
ExecStart = "${prl-tools}/bin/prlshprof";
|
||||||
|
WorkingDirectory = "${prl-tools}/bin";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -1,50 +1,59 @@
|
|||||||
{ stdenv, lib, makeWrapper, p7zip
|
{ stdenv, lib, makeWrapper, p7zip
|
||||||
, gawk, util-linux, xorg, glib, dbus-glib, zlib
|
, gawk, util-linux, xorg, glib, dbus-glib, zlib, bbe, bash, timetrap, netcat, cups
|
||||||
, kernel ? null, libsOnly ? false
|
, kernel ? null, libsOnly ? false
|
||||||
, undmg, fetchurl
|
, fetchurl, undmg, perl, autoPatchelfHook
|
||||||
}:
|
}:
|
||||||
|
|
||||||
assert (!libsOnly) -> kernel != null;
|
assert (!libsOnly) -> kernel != null;
|
||||||
|
assert lib.elem stdenv.hostPlatform.system [ "x86_64-linux" "i686-linux" "aarch64-linux" ];
|
||||||
|
|
||||||
let xorgFullVer = lib.getVersion xorg.xorgserver;
|
|
||||||
xorgVer = lib.versions.majorMinor xorgFullVer;
|
|
||||||
x64 = if stdenv.hostPlatform.system == "x86_64-linux" then true
|
|
||||||
else if stdenv.hostPlatform.system == "i686-linux" then false
|
|
||||||
else throw "Parallels Tools for Linux only support {x86-64,i686}-linux targets";
|
|
||||||
in
|
|
||||||
stdenv.mkDerivation rec {
|
stdenv.mkDerivation rec {
|
||||||
version = "${prl_major}.2.1-41615";
|
version = "17.1.4-51567";
|
||||||
prl_major = "12";
|
|
||||||
pname = "prl-tools";
|
pname = "prl-tools";
|
||||||
|
|
||||||
# We download the full distribution to extract prl-tools-lin.iso from
|
# We download the full distribution to extract prl-tools-lin.iso from
|
||||||
# => ${dmg}/Parallels\ Desktop.app/Contents/Resources/Tools/prl-tools-lin.iso
|
# => ${dmg}/Parallels\ Desktop.app/Contents/Resources/Tools/prl-tools-lin.iso
|
||||||
src = fetchurl {
|
src = fetchurl {
|
||||||
url = "https://download.parallels.com/desktop/v${prl_major}/${version}/ParallelsDesktop-${version}.dmg";
|
url = "https://download.parallels.com/desktop/v${lib.versions.major version}/${version}/ParallelsDesktop-${version}.dmg";
|
||||||
sha256 = "1jwzwif69qlhmfky9kigjaxpxfj0lyrl1iyrpqy4iwqvajdgbbym";
|
sha256 = "sha256-gjLxQOTFuVghv1Bj+zfbNW97q1IN2rurSnPQi13gzRA=";
|
||||||
};
|
};
|
||||||
|
|
||||||
hardeningDisable = [ "pic" "format" ];
|
hardeningDisable = [ "pic" "format" ];
|
||||||
|
|
||||||
# also maybe python2 to generate xorg.conf
|
nativeBuildInputs = [ p7zip undmg perl bbe autoPatchelfHook ]
|
||||||
nativeBuildInputs = [ p7zip undmg ] ++ lib.optionals (!libsOnly) [ makeWrapper ] ++ kernel.moduleBuildDependencies;
|
++ lib.optionals (!libsOnly) [ makeWrapper ] ++ kernel.moduleBuildDependencies;
|
||||||
|
|
||||||
|
buildInputs = with xorg; [ libXrandr libXext libX11 libXcomposite libXinerama ]
|
||||||
|
++ lib.optionals (!libsOnly) [ libXi glib dbus-glib zlib ];
|
||||||
|
|
||||||
|
runtimeDependencies = [ glib xorg.libXrandr ];
|
||||||
|
|
||||||
inherit libsOnly;
|
inherit libsOnly;
|
||||||
|
|
||||||
unpackPhase = ''
|
unpackPhase = ''
|
||||||
undmg "${src}"
|
undmg "${src}"
|
||||||
|
|
||||||
export sourceRoot=prl-tools-build
|
export sourceRoot=prl-tools-build
|
||||||
7z x "Parallels Desktop.app/Contents/Resources/Tools/prl-tools-lin.iso" -o$sourceRoot
|
7z x "Parallels Desktop.app/Contents/Resources/Tools/prl-tools-lin${lib.optionalString stdenv.isAarch64 "-arm"}.iso" -o$sourceRoot
|
||||||
if test -z "$libsOnly"; then
|
if test -z "$libsOnly"; then
|
||||||
( cd $sourceRoot/kmods; tar -xaf prl_mod.tar.gz )
|
( cd $sourceRoot/kmods; tar -xaf prl_mod.tar.gz )
|
||||||
fi
|
fi
|
||||||
( cd $sourceRoot/tools; tar -xaf prltools${if x64 then ".x64" else ""}.tar.gz )
|
|
||||||
'';
|
'';
|
||||||
|
|
||||||
kernelVersion = if libsOnly then "" else lib.getName kernel.name;
|
patches = lib.optionals (lib.versionAtLeast kernel.version "5.18") [ ./prl-tools.patch ];
|
||||||
kernelDir = if libsOnly then "" else "${kernel.dev}/lib/modules/${kernelVersion}";
|
|
||||||
scriptPath = lib.concatStringsSep ":" (lib.optionals (!libsOnly) [ "${util-linux}/bin" "${gawk}/bin" ]);
|
kernelVersion = lib.optionalString (!libsOnly) kernel.modDirVersion;
|
||||||
|
kernelDir = lib.optionalString (!libsOnly) "${kernel.dev}/lib/modules/${kernelVersion}";
|
||||||
|
|
||||||
|
libPath = lib.concatStringsSep ":" [ "${glib.out}/lib" "${xorg.libXrandr}/lib" ];
|
||||||
|
|
||||||
|
scriptPath = lib.concatStringsSep ":" (lib.optionals (!libsOnly) [
|
||||||
|
"${util-linux}/bin"
|
||||||
|
"${gawk}/bin"
|
||||||
|
"${bash}/bin"
|
||||||
|
"${timetrap}/bin"
|
||||||
|
"${netcat}/bin"
|
||||||
|
"${cups}/sbin"
|
||||||
|
]);
|
||||||
|
|
||||||
buildPhase = ''
|
buildPhase = ''
|
||||||
if test -z "$libsOnly"; then
|
if test -z "$libsOnly"; then
|
||||||
@ -57,112 +66,80 @@ stdenv.mkDerivation rec {
|
|||||||
SRC=$kernelDir/build \
|
SRC=$kernelDir/build \
|
||||||
KVER=$kernelVersion
|
KVER=$kernelVersion
|
||||||
)
|
)
|
||||||
|
|
||||||
# Xorg config (maybe would be useful for other versions)
|
|
||||||
#python2 installer/xserver-config.py xorg ${xorgVer} /dev/null parallels.conf
|
|
||||||
fi
|
fi
|
||||||
'';
|
'';
|
||||||
|
|
||||||
libPath = with xorg;
|
|
||||||
lib.makeLibraryPath ([ stdenv.cc.cc libXrandr libXext libX11 libXcomposite libXinerama ]
|
|
||||||
++ lib.optionals (!libsOnly) [ libXi glib dbus-glib zlib ]);
|
|
||||||
|
|
||||||
|
|
||||||
installPhase = ''
|
installPhase = ''
|
||||||
if test -z "$libsOnly"; then
|
if test -z "$libsOnly"; then
|
||||||
( # kernel modules
|
( # kernel modules
|
||||||
cd kmods
|
cd kmods
|
||||||
mkdir -p $out/lib/modules/${kernelVersion}/extra
|
mkdir -p $out/lib/modules/${kernelVersion}/extra
|
||||||
cp prl_eth/pvmnet/prl_eth.ko $out/lib/modules/${kernelVersion}/extra
|
|
||||||
cp prl_tg/Toolgate/Guest/Linux/prl_tg/prl_tg.ko $out/lib/modules/${kernelVersion}/extra
|
|
||||||
cp prl_fs/SharedFolders/Guest/Linux/prl_fs/prl_fs.ko $out/lib/modules/${kernelVersion}/extra
|
cp prl_fs/SharedFolders/Guest/Linux/prl_fs/prl_fs.ko $out/lib/modules/${kernelVersion}/extra
|
||||||
cp prl_fs_freeze/Snapshot/Guest/Linux/prl_freeze/prl_fs_freeze.ko $out/lib/modules/${kernelVersion}/extra
|
cp prl_fs_freeze/Snapshot/Guest/Linux/prl_freeze/prl_fs_freeze.ko $out/lib/modules/${kernelVersion}/extra
|
||||||
|
cp prl_tg/Toolgate/Guest/Linux/prl_tg/prl_tg.ko $out/lib/modules/${kernelVersion}/extra
|
||||||
|
${lib.optionalString stdenv.isAarch64
|
||||||
|
"cp prl_notifier/Installation/lnx/prl_notifier/prl_notifier.ko $out/lib/modules/${kernelVersion}/extra"}
|
||||||
)
|
)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
( # tools
|
( # tools
|
||||||
cd tools
|
cd tools/tools${if stdenv.isAarch64 then "-arm64" else if stdenv.isx86_64 then "64" else "32"}
|
||||||
mkdir -p $out/lib
|
mkdir -p $out/lib
|
||||||
|
|
||||||
if test -z "$libsOnly"; then
|
if test -z "$libsOnly"; then
|
||||||
|
# prltoolsd contains hardcoded /bin/bash path
|
||||||
|
# we're lucky because it uses only -c command
|
||||||
|
# => replace to /bin/sh
|
||||||
|
bbe -e "s:/bin/bash:/bin/sh\x00\x00:" -o bin/prltoolsd.tmp bin/prltoolsd
|
||||||
|
rm -f bin/prltoolsd
|
||||||
|
mv bin/prltoolsd.tmp bin/prltoolsd
|
||||||
|
|
||||||
# install binaries
|
# install binaries
|
||||||
for i in bin/* sbin/prl_nettool sbin/prl_snapshot; do
|
for i in bin/* sbin/prl_nettool sbin/prl_snapshot; do
|
||||||
|
# also patch binaries to replace /usr/bin/XXX to XXX
|
||||||
|
# here a two possible cases:
|
||||||
|
# 1. it is uses as null terminated string and should be truncated by null;
|
||||||
|
# 2. it is uses inside shell script and should be truncated by space.
|
||||||
|
for p in bin/* sbin/prl_nettool sbin/prl_snapshot sbin/prlfsmountd; do
|
||||||
|
p=$(basename $p)
|
||||||
|
bbe -e "s:/usr/bin/$p\x00:./$p\x00\x00\x00\x00\x00\x00\x00\x00:" -o $i.tmp $i
|
||||||
|
bbe -e "s:/usr/sbin/$p\x00:./$p\x00\x00\x00\x00\x00\x00\x00\x00 :" -o $i $i.tmp
|
||||||
|
bbe -e "s:/usr/bin/$p:$p :" -o $i.tmp $i
|
||||||
|
bbe -e "s:/usr/sbin/$p:$p :" -o $i $i.tmp
|
||||||
|
done
|
||||||
|
|
||||||
install -Dm755 $i $out/$i
|
install -Dm755 $i $out/$i
|
||||||
done
|
done
|
||||||
# other binaries
|
|
||||||
for i in xorg.7.1/usr/bin/*; do
|
install -Dm755 ../../tools/prlfsmountd.sh $out/sbin/prlfsmountd
|
||||||
cp $i $out/bin
|
for f in $out/bin/* $out/sbin/*; do
|
||||||
|
wrapProgram $f \
|
||||||
|
--prefix LD_LIBRARY_PATH ':' "$libPath" \
|
||||||
|
--prefix PATH ':' "$scriptPath"
|
||||||
done
|
done
|
||||||
|
|
||||||
for i in $out/bin/* $out/sbin/*; do
|
for i in lib/libPrl*.0.0; do
|
||||||
patchelf \
|
|
||||||
--interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" \
|
|
||||||
--set-rpath "$out/lib:$libPath" \
|
|
||||||
$i || true
|
|
||||||
done
|
|
||||||
|
|
||||||
mkdir -p $out/bin
|
|
||||||
install -Dm755 ../installer/prlfsmountd.sh $out/sbin/prlfsmountd
|
|
||||||
wrapProgram $out/sbin/prlfsmountd \
|
|
||||||
--prefix PATH ':' "$scriptPath"
|
|
||||||
|
|
||||||
for i in lib/*.a; do
|
|
||||||
cp $i $out/lib
|
cp $i $out/lib
|
||||||
|
ln -s $out/$i $out/''${i%.0.0}
|
||||||
done
|
done
|
||||||
|
|
||||||
for i in xorg.7.1/usr/lib/libprl_wmouse_watcher.*; do
|
mkdir -p $out/share/man/man8
|
||||||
cp $i $out/lib
|
install -Dm644 ../mount.prl_fs.8 $out/share/man/man8
|
||||||
done
|
|
||||||
|
|
||||||
mkdir -p $out/lib/udev/rules.d
|
substituteInPlace ../99prltoolsd-hibernate \
|
||||||
for i in *.rules; do
|
--replace "/bin/bash" "${bash}/bin/bash"
|
||||||
sed 's,/bin/bash,${stdenv.shell},g' $i > $out/lib/udev/rules.d/$i
|
|
||||||
done
|
|
||||||
|
|
||||||
(
|
mkdir -p $out/etc/pm/sleep.d
|
||||||
cd xorg.${xorgVer}
|
install -Dm644 ../99prltoolsd-hibernate $out/etc/pm/sleep.d
|
||||||
# Install the X modules.
|
|
||||||
(
|
|
||||||
cd x-server/modules
|
|
||||||
for i in */*; do
|
|
||||||
install -Dm755 $i $out/lib/xorg/modules/$i
|
|
||||||
done
|
|
||||||
)
|
|
||||||
(
|
|
||||||
cd usr/lib
|
|
||||||
libGLXname=$(echo libglx.so*)
|
|
||||||
install -Dm755 $libGLXname $out/lib/xorg/modules/extensions/$libGLXname
|
|
||||||
ln -s $libGLXname $out/lib/xorg/modules/extensions/libglx.so
|
|
||||||
ln -s $libGLXname $out/lib/xorg/modules/extensions/libglx.so.1
|
|
||||||
)
|
|
||||||
)
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
for i in xorg.7.1/usr/lib/libGL.*; do
|
|
||||||
cp $i $out/lib
|
|
||||||
done
|
|
||||||
|
|
||||||
cd $out
|
|
||||||
find -name \*.so\* -type f -exec \
|
|
||||||
patchelf --set-rpath "$out/lib:$libPath" {} \;
|
|
||||||
|
|
||||||
cd lib
|
|
||||||
libGLname=$(echo libGL.so*)
|
|
||||||
ln -s $libGLname libGL.so
|
|
||||||
ln -s $libGLname libGL.so.1
|
|
||||||
)
|
)
|
||||||
'';
|
'';
|
||||||
|
|
||||||
dontStrip = true;
|
|
||||||
dontPatchELF = true;
|
|
||||||
|
|
||||||
meta = with lib; {
|
meta = with lib; {
|
||||||
description = "Parallels Tools for Linux guests";
|
description = "Parallels Tools for Linux guests";
|
||||||
homepage = "https://parallels.com";
|
homepage = "https://parallels.com";
|
||||||
platforms = [ "i686-linux" "x86_64-linux" ];
|
platforms = platforms.linux;
|
||||||
license = licenses.unfree;
|
license = licenses.unfree;
|
||||||
# I was making this package blindly and requesting testing from the real user,
|
maintainers = with maintainers; [ catap wegank ];
|
||||||
# so I can't even test it by myself and won't provide future updates.
|
|
||||||
maintainers = with maintainers; [ abbradar ];
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
143
pkgs/os-specific/linux/prl-tools/prl-tools.patch
Normal file
143
pkgs/os-specific/linux/prl-tools/prl-tools.patch
Normal file
@ -0,0 +1,143 @@
|
|||||||
|
diff -puNr prl-tools-build/kmods/prl_tg/Toolgate/Guest/Linux/prl_tg/prltg.c prl-tools-build/kmods/prl_tg/Toolgate/Guest/Linux/prl_tg/prltg.c
|
||||||
|
--- prl-tools-build/kmods/prl_tg/Toolgate/Guest/Linux/prl_tg/prltg.c
|
||||||
|
+++ prl-tools-build/kmods/prl_tg/Toolgate/Guest/Linux/prl_tg/prltg.c
|
||||||
|
@@ -382,7 +382,7 @@ static int prl_tg_initialize(struct tg_d
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
/* Set DMA ability. Only lower 4G is possible to address */
|
||||||
|
- rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(64));
|
||||||
|
+ rc = dma_set_mask(&pdev->dev, DMA_BIT_MASK(64));
|
||||||
|
if (rc) {
|
||||||
|
printk(KERN_ERR "no usable DMA configuration\n");
|
||||||
|
goto err_out;
|
||||||
|
diff -puNr prl-tools-build/kmods/prl_tg/Toolgate/Guest/Linux/prl_tg/prltg_call.c prl-tools-build/kmods/prl_tg/Toolgate/Guest/Linux/prl_tg/prltg_call.c
|
||||||
|
--- prl-tools-build/kmods/prl_tg/Toolgate/Guest/Linux/prl_tg/prltg_call.c
|
||||||
|
+++ prl-tools-build/kmods/prl_tg/Toolgate/Guest/Linux/prl_tg/prltg_call.c
|
||||||
|
@@ -76,7 +76,7 @@ static int tg_req_map_internal(struct TG
|
||||||
|
uple->p[i] = vmalloc_to_page(mem);
|
||||||
|
page_cache_get(uple->p[i]);
|
||||||
|
|
||||||
|
- dst->RequestPages[i] = pci_map_page(pdev, uple->p[i], 0, PAGE_SIZE, DMA_BIDIRECTIONAL) >> PAGE_SHIFT;
|
||||||
|
+ dst->RequestPages[i] = dma_map_page(&pdev->dev, uple->p[i], 0, PAGE_SIZE, DMA_BIDIRECTIONAL) >> PAGE_SHIFT;
|
||||||
|
if (!dst->RequestPages[i]) {
|
||||||
|
page_cache_release(uple->p[i]);
|
||||||
|
goto err;
|
||||||
|
@@ -88,7 +88,7 @@ static int tg_req_map_internal(struct TG
|
||||||
|
|
||||||
|
err:
|
||||||
|
for (i = 0; i < uple->count; i++) {
|
||||||
|
- pci_unmap_page(pdev, dst->RequestPages[i] << PAGE_SHIFT, PAGE_SIZE, DMA_BIDIRECTIONAL);
|
||||||
|
+ dma_unmap_page(&pdev->dev, dst->RequestPages[i] << PAGE_SHIFT, PAGE_SIZE, DMA_BIDIRECTIONAL);
|
||||||
|
page_cache_release(uple->p[i]);
|
||||||
|
}
|
||||||
|
kfree(uple);
|
||||||
|
@@ -129,7 +129,7 @@ static TG_PAGED_BUFFER *tg_req_map_user_
|
||||||
|
pfn = (u64 *)dbuf - 1;
|
||||||
|
|
||||||
|
for (; npages > 0; npages--, mapped++) {
|
||||||
|
- dma_addr_t addr = pci_map_page(pdev, uple->p[npages-1], 0, PAGE_SIZE, DMA_BIDIRECTIONAL);
|
||||||
|
+ dma_addr_t addr = dma_map_page(&pdev->dev, uple->p[npages-1], 0, PAGE_SIZE, DMA_BIDIRECTIONAL);
|
||||||
|
|
||||||
|
if (!addr) {
|
||||||
|
DPRINTK("[3] %d < %d \n", got, npages);
|
||||||
|
@@ -144,7 +144,7 @@ static TG_PAGED_BUFFER *tg_req_map_user_
|
||||||
|
|
||||||
|
err_unmap:
|
||||||
|
for (i = 0; i < mapped; i++, pfn++)
|
||||||
|
- pci_unmap_page(pdev, *pfn << PAGE_SHIFT, PAGE_SIZE, DMA_BIDIRECTIONAL);
|
||||||
|
+ dma_unmap_page(&pdev->dev, *pfn << PAGE_SHIFT, PAGE_SIZE, DMA_BIDIRECTIONAL);
|
||||||
|
|
||||||
|
err_put:
|
||||||
|
for(i = 0; i < got; i++)
|
||||||
|
@@ -176,7 +176,7 @@ static TG_PAGED_BUFFER *tg_req_map_kerne
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
- addr = pci_map_page(pdev, page, 0, PAGE_SIZE, DMA_BIDIRECTIONAL);
|
||||||
|
+ addr = dma_map_page(&pdev->dev, page, 0, PAGE_SIZE, DMA_BIDIRECTIONAL);
|
||||||
|
if (!addr) {
|
||||||
|
DPRINTK("[2] va:%p can't map\n", buffer);
|
||||||
|
goto err;
|
||||||
|
@@ -189,7 +189,7 @@ static TG_PAGED_BUFFER *tg_req_map_kerne
|
||||||
|
|
||||||
|
err:
|
||||||
|
for (; i > 0; i--, pfn--)
|
||||||
|
- pci_unmap_page(pdev, *pfn << PAGE_SHIFT, PAGE_SIZE, DMA_BIDIRECTIONAL);
|
||||||
|
+ dma_unmap_page(&pdev->dev, *pfn << PAGE_SHIFT, PAGE_SIZE, DMA_BIDIRECTIONAL);
|
||||||
|
|
||||||
|
return ERR_PTR(-ENOMEM);
|
||||||
|
}
|
||||||
|
@@ -203,7 +203,7 @@ static inline int tg_req_unmap_internal(
|
||||||
|
dst->RequestSize + ~PAGE_MASK) >> PAGE_SHIFT;
|
||||||
|
|
||||||
|
for (i = 0; i < count; i++)
|
||||||
|
- pci_unmap_page(req->dev->pci_dev, dst->RequestPages[i] << PAGE_SHIFT, PAGE_SIZE, DMA_BIDIRECTIONAL);
|
||||||
|
+ dma_unmap_page(&req->dev->pci_dev->dev, dst->RequestPages[i] << PAGE_SHIFT, PAGE_SIZE, DMA_BIDIRECTIONAL);
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
@@ -264,7 +264,7 @@ static void tg_req_unmap_pages(struct TG
|
||||||
|
|
||||||
|
pfn = (u64 *)(dbuf + 1);
|
||||||
|
for (; npages > 0; npages--, pfn++)
|
||||||
|
- pci_unmap_page(pdev, (*pfn) << PAGE_SHIFT, PAGE_SIZE, DMA_BIDIRECTIONAL);
|
||||||
|
+ dma_unmap_page(&pdev->dev, (*pfn) << PAGE_SHIFT, PAGE_SIZE, DMA_BIDIRECTIONAL);
|
||||||
|
|
||||||
|
dbuf = (TG_PAGED_BUFFER *)pfn;
|
||||||
|
}
|
||||||
|
@@ -374,7 +374,7 @@ static int tg_req_submit(struct TG_PENDI
|
||||||
|
* also no any offset inside page needed.
|
||||||
|
*/
|
||||||
|
req->pg = vmalloc_to_page(dst);
|
||||||
|
- req->phys = pci_map_page(dev->pci_dev, vmalloc_to_page(dst), 0, PAGE_SIZE, DMA_BIDIRECTIONAL);
|
||||||
|
+ req->phys = dma_map_page(&dev->pci_dev->dev, vmalloc_to_page(dst), 0, PAGE_SIZE, DMA_BIDIRECTIONAL);
|
||||||
|
if (!req->phys) {
|
||||||
|
DPRINTK("Can not allocate memory for DMA mapping\n");
|
||||||
|
goto out;
|
||||||
|
@@ -405,7 +405,7 @@ static int tg_req_submit(struct TG_PENDI
|
||||||
|
out:
|
||||||
|
if (ret != TG_STATUS_PENDING) {
|
||||||
|
page_cache_release(req->pg);
|
||||||
|
- pci_unmap_page(dev->pci_dev, req->phys, PAGE_SIZE, DMA_BIDIRECTIONAL);
|
||||||
|
+ dma_unmap_page(&dev->pci_dev->dev, req->phys, PAGE_SIZE, DMA_BIDIRECTIONAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
DPRINTK("EXIT\n");
|
||||||
|
@@ -460,7 +460,7 @@ out_wait:
|
||||||
|
wait_for_completion(&req->waiting);
|
||||||
|
out:
|
||||||
|
page_cache_release(req->pg);
|
||||||
|
- pci_unmap_page(dev->pci_dev, req->phys, PAGE_SIZE, DMA_BIDIRECTIONAL);
|
||||||
|
+ dma_unmap_page(&dev->pci_dev->dev, req->phys, PAGE_SIZE, DMA_BIDIRECTIONAL);
|
||||||
|
DPRINTK("EXIT\n");
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
diff -puNr prl-tools-build/kmods/prl_fs/SharedFolders/Guest/Linux/prl_fs/inode.c prl-tools-build/kmods/prl_fs/SharedFolders/Guest/Linux/prl_fs/inode.c
|
||||||
|
--- prl-tools-build/kmods/prl_fs/SharedFolders/Guest/Linux/prl_fs/inode.c
|
||||||
|
+++ prl-tools-build/kmods/prl_fs/SharedFolders/Guest/Linux/prl_fs/inode.c
|
||||||
|
@@ -16,6 +16,7 @@
|
||||||
|
#include <linux/pagemap.h>
|
||||||
|
#include <linux/namei.h>
|
||||||
|
#include <linux/cred.h>
|
||||||
|
+#include <linux/writeback.h>
|
||||||
|
|
||||||
|
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 40)) && \
|
||||||
|
(LINUX_VERSION_CODE < KERNEL_VERSION(3, 0, 0))
|
||||||
|
@@ -57,7 +58,7 @@ unsigned long *prlfs_dfl( struct dentry
|
||||||
|
}
|
||||||
|
|
||||||
|
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 9, 0)
|
||||||
|
-#define prl_uaccess_kernel() uaccess_kernel()
|
||||||
|
+#define prl_uaccess_kernel() (false)
|
||||||
|
#else
|
||||||
|
#define prl_uaccess_kernel() segment_eq(get_fs(), KERNEL_DS)
|
||||||
|
#endif
|
||||||
|
@@ -954,7 +955,7 @@ static const struct address_space_operat
|
||||||
|
.writepage = prlfs_writepage,
|
||||||
|
.write_begin = simple_write_begin,
|
||||||
|
.write_end = prlfs_write_end,
|
||||||
|
- .set_page_dirty = __set_page_dirty_nobuffers,
|
||||||
|
+ .dirty_folio = filemap_dirty_folio,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
@ -431,8 +431,7 @@ in {
|
|||||||
|
|
||||||
phc-intel = if lib.versionAtLeast kernel.version "4.10" then callPackage ../os-specific/linux/phc-intel { } else null;
|
phc-intel = if lib.versionAtLeast kernel.version "4.10" then callPackage ../os-specific/linux/phc-intel { } else null;
|
||||||
|
|
||||||
# Disable for kernels 4.15 and above due to compatibility issues
|
prl-tools = callPackage ../os-specific/linux/prl-tools { };
|
||||||
prl-tools = if lib.versionOlder kernel.version "4.15" then callPackage ../os-specific/linux/prl-tools { } else null;
|
|
||||||
|
|
||||||
sch_cake = callPackage ../os-specific/linux/sch_cake { };
|
sch_cake = callPackage ../os-specific/linux/sch_cake { };
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user