diff --git a/dom0/pm-utils/01qubes-swap-pci-devs b/dom0/pm-utils/01qubes-swap-pci-devs new file mode 100755 index 00000000..2922c5b8 --- /dev/null +++ b/dom0/pm-utils/01qubes-swap-pci-devs @@ -0,0 +1,48 @@ +#!/bin/sh + +. "${PM_FUNCTIONS}" + +get_domain_pci_devs() +{ + VM=$1 + TMPFILE=$(mktemp -p /var/run/qubes/) + xm pci-list $VM > $TMPFILE + if grep -i -q vslt $TMPFILE ; then + slt=valid_identifier + else + slt="" + fi + cat $TMPFILE | grep -v domain | sed 's/0x//g'| \ + while read $slt a b c d; do echo $a:$b:$c.$d ; done > /var/run/qubes/$VM.pcidevs + rm -f $TMPFILE +} + +detach_pcis() +{ + NETVM=$(qvm-get-default-netvm) + if [ "X"$NETVM = "X""dom0" -o "X"$NETVM = "X" -o "X"$NETVM = "X""none"] ; then + exit 0 + fi + get_domain_pci_devs $NETVM + for dev in $(cat /var/run/qubes/$NETVM.pcidevs) ; do + xm pci-detach $NETVM $dev + done +} + +attach_pcis() +{ + NETVM=$(qvm-get-default-netvm) + if [ "X"$NETVM = "X""dom0" -o "X"$NETVM = "X" -o "X"$NETVM = "X""none"] ; then + exit 0 + fi + for dev in $(cat /var/run/qubes/$NETVM.pcidevs) ; do + xm pci-attach $NETVM $dev + done +} + + +case "$1" in + resume) attach_pcis ;; + suspend) detach_pcis ;; + *) exit 0 ;; +esac diff --git a/rpm_spec/core-dom0.spec b/rpm_spec/core-dom0.spec index 1d207ddd..f058595a 100644 --- a/rpm_spec/core-dom0.spec +++ b/rpm_spec/core-dom0.spec @@ -115,6 +115,7 @@ cp ../common/iptables $RPM_BUILD_ROOT/etc/sysconfig mkdir -p $RPM_BUILD_ROOT/usr/lib64/pm-utils/sleep.d cp pm-utils/01qubes-sync-vms-clock $RPM_BUILD_ROOT/usr/lib64/pm-utils/sleep.d/ +cp pm-utils/01qubes-swap-pci-devs $RPM_BUILD_ROOT/usr/lib64/pm-utils/sleep.d/ cp pm-utils/02qubes-pause-vms $RPM_BUILD_ROOT/usr/lib64/pm-utils/sleep.d/ %triggerin -- xen-runtime @@ -234,6 +235,7 @@ fi /etc/NetworkManager/dispatcher.d/qubes_nmhook /etc/sysconfig/iptables /usr/lib64/pm-utils/sleep.d/01qubes-sync-vms-clock +/usr/lib64/pm-utils/sleep.d/01qubes-swap-pci-devs /usr/lib64/pm-utils/sleep.d/02qubes-pause-vms /usr/bin/xenstore-watch /usr/bin/qvm-create-default-dvm