Après mes différents articles concernant la carte MSI GT 440, voici un billet sur une carte de la série des GTX 460: Evga GTX 460 SE. Comme toujours le domU utilisé sera un Windows XP 64 bits.

Carte EVGA GTX 460 SE PCI EXPRESS 2.0 GDDR5 auquel on souhaite accéder nativement depuis une machine virtuelle sous Windows XP 32/64 bits.

Kernel 3.1.0-rc9

Profitant du support de Xen en tant que dom0 depuis la version 3.0 du kernel, j'ai donc effectué mes tests sur cette version. Voici mon fichier de configuration

Pour rappel, à partir du noyau 3.1, la gestion pour VGA PassThrough est grandement simplifié.

Concernant le support pour Intel vt-d, on aura les informations suivantes
root@mercury:~# xl dmesg | grep -E '(Intel|virtualisation )'
(XEN) Intel machine check reporting enabled
(XEN) Intel VT-d Snoop Control not enabled.
(XEN) Intel VT-d Dom0 DMA Passthrough not enabled.
(XEN) Intel VT-d Queued Invalidation enabled.
(XEN) Intel VT-d Interrupt Remapping enabled.
(XEN) Intel VT-d Shared EPT tables not enabled.
(XEN) I/O virtualisation enabled
Rappel: il faut que
  • le processeur supporte Vt-d
  • que le support soit activé dans le BIOS.
Pour ce dernier point, on pourra par voir le billet concernant l'activation de VT-d dans la BIOS

Nvflash: Extraction VGA BIOS

On pourrait utiliser nvlfash installé sur une clé USB et booter dessus. Cependant il existe une autre méthode. On procède à l'extraction depuis un domU sous Windows XP avec la carte graphique rattachée au domU MAIS avec gfx_passthru=0. Ainsi la carte graphique apparaît en tant que carte graphique secondaire. Dans mon fichier de configuration, '01:00.0' correspond à ma carte graphique NVIDIA.
builder='hvm'
memory = 3072
shadow_memory = 1024
name = "mercury-xen03"
vcpus='4'
vif = [ 'bridge=eth0,mac=00:14:3e:00:8f:c2' ]
disk = [
		'phy:/dev/xenvg/mercury-xen03-disk-6,xvda,w',		
		'file:/opt/Xen/CD_DVD/WindowsDeveloperPreview-64bit-English.iso,xvdc:cdrom,r',
         ]
boot="cd"
sdl=0
vnc=1
vnclisten="0.0.0.0"
vncconsole=1
vncpasswd=''
acpi=1
apic=1
xen_extended_power_mgmt=1
pae=1
arch='x86_64'
hpet = 1
hap = 1
viridian = 1
monitor=1
serial='pty'
keymap='fr'
soundhw = "all"
audio="on"
ne2000=0
on_poweroff = 'destroy'
on_reboot   = 'restart'
on_crash    = 'restart'
xen_platform_pci=1 
gfx_passthru=0
pci  = [ '01:00.0','00:1a.0','00:1d.0' ]
pci_msitranslate = 1
pci_power_mgmt = 1
  • On installe nvlfash 5.100.0.1 sur le domU
  • On ouvre ensuite une fenêtre DOS et on tape nvlfash --save vgabios-pt.rom
On sera surpris que la carte soit reconnue comme une carte GTS 455 mais il ne faut pas en tenir compte.

Remarque: il faudra bien sûr penser à récupérer le fichier vgabios-pt.rom

Compilation

hg clone -r 23965 http://xenbits.xensource.com/hg/staging/xen-unstable.hg/ xen-test
cd xen-test/tools
make -j4
make clean
cd ..
On télécharge les patchs et on patche
root@mercury:/opt/tmp/xen-test# wget -q http://www.davidgis.fr/download/gfx_patchs_gtx-460-se-evga.tar.bz2
root@mercury:/opt/tmp/xen-test# tar xjf gfx_patchs_gtx-460-se-evga.tar.bz2 
root@mercury:/opt/tmp/xen-test# for file in $(ls gfx_patchs_gtx-460-se-evga/*.patch);do patch -p1 < $file;done
patching file tools/firmware/hvmloader/acpi/dsdt.asl
patching file tools/firmware/hvmloader/hvmloader.c
patching file tools/firmware/hvmloader/Makefile
patching file tools/ioemu-remote/hw/pass-through.c
patching file tools/firmware/hvmloader/pci.c

On copie le fichier vgabios-pt.rom (voir section "Extraction VGA BIOS") à l'endroit requis en n'oubliant pas de le renommer en vgabios-pt.bin

cp /path/to/vgabios-pt.rom tools/firmware/vgabios/vgabios-pt.bin
On compile et on installe
make -j4 xen tools stubdom 
make -j4 install-xen && make -j4 install-tools PYTHON_PREFIX_ARG= && make -j4 install-stubdom

démarrage du domU (PCI Stub)

  • On récupère l'identifiant associé à la carte graphique en utilisant lspci
    root@mercury:~# lspci |grep VGA
    01:00.0 VGA compatible controller: nVidia Corporation Device 0e23 (rev a1)
  • On récupère l'autre identifiant
    root@mercury:~# lspci -n -s 01:00.0
    01:00.0 0300: 10de:0e23 (rev a1)
  • Il ne reste plus qu'à lancer le domU
    root@mercury:~# echo "10de 0e23" > /sys/bus/pci/drivers/pci-stub/new_id
    root@mercury:~# echo "0000:01:00.0" > /sys/bus/pci/devices/0000:01:00.0/driver/unbind
    root@mercury:~# echo "0000:01:00.0" > /sys/bus/pci/drivers/pci-stub/bind
    root@mercury:~#  xl   create /etc/xen/machines/mercury-xen03.cfg

Informations sur le domU

Le pilote NIVIDIA 275.33 (Windows 32/64 bits) convient parfaitement. Voici quelques screenshots en utilisant les logiciels CPU-Z et GPU-Z