Merge pull request #179582 from catap/prl-tools
This commit is contained in:
commit
04a5c30245
4 changed files with 238 additions and 128 deletions
|
@ -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 a new issue