In a different attempt, I also hand crafted a libvirt XML config, taking pieces from the working XML config on KVM and combining it with Xen's config. This was unsuccessful, the disk kept showing up as lsi or ata0.
[Sat, 18 Jun 2016 10:37:56 virt-manager 6712] DEBUG (guest:429) XML fetched from libvirt object:
<domain type='xen' id='68'>
<name>testvm</name>
<uuid>6d5aec78-d898-4d20-9580-332e967417a1</uuid>
<memory unit='KiB'>524288</memory>
<currentMemory unit='KiB'>524288</currentMemory>
<vcpu placement='static'>1</vcpu>
<os>
<type arch='x86_64' machine='xenfv'>hvm</type>
<loader type='rom'>/usr/lib/xen/boot/hvmloader</loader>
<boot dev='hd'/>
<bootmenu enable='yes'/>
</os>
<features>
<acpi/>
<apic/>
<pae/>
</features>
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>restart</on_crash>
<devices>
<emulator>/usr/lib/xen/bin/qemu-system-i386</emulator>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/home/micah/testvm.qcow2'/>
<backingStore/>
<target dev='sda' bus='sata'/>
<address type='drive' controller='0' bus='0' target='0' unit='0'/>
</disk>
<controller type='sata' index='0'/>
<interface type='bridge'>
<mac address='00:16:3e:65:b6:01'/>
<source bridge='virbr0'/>
<target dev='vif68.0-emu'/>
<model type='e1000'/>
</interface>
<serial type='pty'>
<target port='0'/>
</serial>
<console type='pty'>
<target type='serial' port='0'/>
</console>
<input type='mouse' bus='ps2'/>
<input type='keyboard' bus='ps2'/>
<graphics type='vnc' port='5900' autoport='yes' keymap='en-us'/>
<video>
<model type='cirrus' vram='8192' heads='1' primary='yes'/>
</video>
</devices>
</domain>
[Sat, 18 Jun 2016 10:37:56 virt-manager 6712] DEBUG (create:2278) Install completed
[Sat, 18 Jun 2016 10:37:56 virt-manager 6712] DEBUG (connection:1050) domain=testvm status=Running added
[Sat, 18 Jun 2016 10:37:56 virt-manager 6712] DEBUG (connection:1044) New domain=testvm requested, but it's already tracked.
[Sat, 18 Jun 2016 10:37:56 virt-manager 6712] DEBUG (create:205) Closing new vm wizard
[Sat, 18 Jun 2016 10:37:56 virt-manager 6712] DEBUG (details:645) Closing VM details: <vmmDomainVirtinst object at 0x7f57b8147c80 (virtManager+domain+vmmDomainVirtinst at 0x563dcb29fc00)>
[Sat, 18 Jun 2016 10:37:56 virt-manager 6712] DEBUG (create:2215) User closed customize window, closing wizard
[Sat, 18 Jun 2016 10:37:56 virt-manager 6712] DEBUG (details:609) Showing VM details: <vmmDomain object at 0x7f57b80c1cd0 (virtManager+domain+vmmDomain at 0x563dcdac86c0)>
[Sat, 18 Jun 2016 10:37:56 virt-manager 6712] DEBUG (engine:401) window counter incremented to 2
[Sat, 18 Jun 2016 10:37:56 virt-manager 6712] DEBUG (console:663) Starting connect process for proto=vnc trans=ssh connhost=xendev0 connuser=root connport= gaddr=127.0.0.1 gport=5900 gtlsport=None gsocket=None
[Sat, 18 Jun 2016 10:37:56 virt-manager 6712] DEBUG (sshtunnels:253) Pre-generated ssh command for ginfo: ssh -l root xendev0 sh -c 'nc -q 2>&1 | grep "requires an argument" >/dev/null;if [ $? -eq 0 ] ; then CMD="nc -q 0 127.0.0.1 5900";else CMD="nc 127.0.0.1 5900";fi;eval "$CMD";'
[Sat, 18 Jun 2016 10:37:56 virt-manager 6712] DEBUG (sshtunnels:277) Generated tunnel fd=21 for viewer
[Sat, 18 Jun 2016 10:37:56 virt-manager 6712] DEBUG (sshtunnels:202) Opened tunnel PID=6761 ERRFD=19
[Sat, 18 Jun 2016 10:37:58 virt-manager 6712] DEBUG (console:781) Viewer connected