# HG changeset patch
# User awilliam@xxxxxxxxxxx
# Node ID 79afceca906517b24cf9a94264a7f7ff97d9f458
# Parent 91169603a8e8dded9eba6cb6c3421b5d58a85a97
# Parent 0bb18319b8a0ee957ea9307ac3d9e40c31b456d4
merge with xen-unstable.hg
---
extras/mini-os/include/hypercall-x86_32.h
| 326
extras/mini-os/include/hypercall-x86_64.h
| 326
extras/mini-os/include/os.h
| 561 -
extras/mini-os/include/spinlock.h
| 121
extras/mini-os/include/traps.h
| 73
extras/mini-os/traps.c
| 229
tools/ioemu/patches/qemu-fix-write-to-disk-synchronous
| 66
tools/libxc/xc_ppc_linux_build.c
| 414
xen/arch/x86/audit.c
| 984 --
xen/arch/x86/shadow.c
| 4199 ---------
xen/arch/x86/shadow32.c
| 3782 --------
xen/arch/x86/shadow_guest32.c
| 16
xen/arch/x86/shadow_guest32pae.c
| 16
xen/arch/x86/shadow_public.c
| 2138 ----
xen/include/asm-x86/shadow_64.h
| 587 -
xen/include/asm-x86/shadow_ops.h
| 138
xen/include/asm-x86/shadow_public.h
| 61
.hgignore
| 17
buildconfigs/Rules.mk
| 8
docs/src/user.tex
| 13
extras/mini-os/Makefile
| 53
extras/mini-os/arch/x86/traps.c
| 229
extras/mini-os/console/xencons_ring.c
| 8
extras/mini-os/include/hypervisor.h
| 3
extras/mini-os/include/types.h
| 4
extras/mini-os/include/x86/os.h
| 561 +
extras/mini-os/include/x86/spinlock.h
| 121
extras/mini-os/include/x86/traps.h
| 73
extras/mini-os/include/x86/x86_32/hypercall-x86_32.h
| 326
extras/mini-os/include/x86/x86_64/hypercall-x86_64.h
| 326
linux-2.6-xen-sparse/arch/i386/kernel/cpu/mtrr/main-xen.c
| 2
linux-2.6-xen-sparse/arch/i386/kernel/io_apic-xen.c
| 2
linux-2.6-xen-sparse/arch/i386/kernel/setup-xen.c
| 55
linux-2.6-xen-sparse/arch/i386/kernel/swiotlb.c
| 2
linux-2.6-xen-sparse/arch/i386/kernel/time-xen.c
| 8
linux-2.6-xen-sparse/arch/i386/kernel/vmlinux.lds.S
| 12
linux-2.6-xen-sparse/arch/i386/mm/init-xen.c
| 2
linux-2.6-xen-sparse/arch/i386/mm/ioremap-xen.c
| 9
linux-2.6-xen-sparse/arch/i386/pci/irq-xen.c
| 6
linux-2.6-xen-sparse/arch/ia64/dig/setup.c
| 110
linux-2.6-xen-sparse/arch/ia64/kernel/setup.c
| 7
linux-2.6-xen-sparse/arch/ia64/xen/hypervisor.c
| 2
linux-2.6-xen-sparse/arch/x86_64/kernel/entry-xen.S
| 12
linux-2.6-xen-sparse/arch/x86_64/kernel/setup-xen.c
| 74
linux-2.6-xen-sparse/arch/x86_64/mm/init-xen.c
| 8
linux-2.6-xen-sparse/drivers/char/tpm/tpm_xen.c
| 8
linux-2.6-xen-sparse/drivers/xen/Kconfig
| 2
linux-2.6-xen-sparse/drivers/xen/balloon/balloon.c
| 35
linux-2.6-xen-sparse/drivers/xen/blkback/blkback.c
| 4
linux-2.6-xen-sparse/drivers/xen/blkback/common.h
| 8
linux-2.6-xen-sparse/drivers/xen/blkback/xenbus.c
| 12
linux-2.6-xen-sparse/drivers/xen/blkfront/blkfront.c
| 3
linux-2.6-xen-sparse/drivers/xen/blktap/blktap.c
| 12
linux-2.6-xen-sparse/drivers/xen/blktap/common.h
| 4
linux-2.6-xen-sparse/drivers/xen/blktap/xenbus.c
| 5
linux-2.6-xen-sparse/drivers/xen/console/console.c
| 14
linux-2.6-xen-sparse/drivers/xen/console/xencons_ring.c
| 8
linux-2.6-xen-sparse/drivers/xen/core/cpu_hotplug.c
| 2
linux-2.6-xen-sparse/drivers/xen/core/evtchn.c
| 3
linux-2.6-xen-sparse/drivers/xen/core/gnttab.c
| 54
linux-2.6-xen-sparse/drivers/xen/core/reboot.c
| 3
linux-2.6-xen-sparse/drivers/xen/core/skbuff.c
| 3
linux-2.6-xen-sparse/drivers/xen/core/smpboot.c
| 20
linux-2.6-xen-sparse/drivers/xen/netback/common.h
| 9
linux-2.6-xen-sparse/drivers/xen/netback/loopback.c
| 2
linux-2.6-xen-sparse/drivers/xen/netback/netback.c
| 382
linux-2.6-xen-sparse/drivers/xen/netback/xenbus.c
| 39
linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c
| 682 -
linux-2.6-xen-sparse/drivers/xen/pciback/xenbus.c
| 1
linux-2.6-xen-sparse/drivers/xen/pcifront/xenbus.c
| 1
linux-2.6-xen-sparse/drivers/xen/privcmd/privcmd.c
| 12
linux-2.6-xen-sparse/drivers/xen/tpmback/xenbus.c
| 6
linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_client.c
| 2
linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_comms.c
| 15
linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_comms.h
| 2
linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_dev.c
| 6
linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c
| 147
linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_xs.c
| 10
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/hypercall.h
| 29
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/hypervisor.h
| 15
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/maddr.h
| 160
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/page.h
| 129
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/pgtable-2level.h
| 1
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/pgtable-3level.h
| 12
linux-2.6-xen-sparse/include/asm-ia64/hypervisor.h
| 2
linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/hypercall.h
| 29
linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/maddr.h
| 139
linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/page.h
| 122
linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/pgtable.h
| 22
linux-2.6-xen-sparse/include/xen/balloon.h
| 10
linux-2.6-xen-sparse/include/xen/hvm.h
| 24
linux-2.6-xen-sparse/include/xen/xenbus.h
| 3
linux-2.6-xen-sparse/mm/memory.c
| 5
linux-2.6-xen-sparse/net/core/dev.c
| 10
patches/linux-2.6.16.13/net-gso-4-kill-warnon.patch
| 28
patches/linux-2.6.16.13/series
| 22
patches/linux-2.6.16.13/x86-put-note-sections-into-a-pt_note-segment-in-vmlinux.patch
| 70
patches/linux-2.6.16.13/x86_64-put-note-sections-into-a-pt_note-segment-in-vmlinux.patch
| 47
tools/blktap/lib/Makefile
| 2
tools/examples/xen-network-common.sh
| 1
tools/examples/xend-config.sxp
| 2
tools/examples/xmexample.hvm
| 8
tools/examples/xmexample.vti
| 4
tools/firmware/acpi/acpi_fadt.h
| 3
tools/firmware/hvmloader/Makefile
| 8
tools/firmware/hvmloader/hvmloader.c
| 22
tools/firmware/hvmloader/hypercall.h
| 2
tools/firmware/hvmloader/smbios.c
| 606 +
tools/firmware/hvmloader/smbios.h
| 38
tools/firmware/hvmloader/smbios_types.h
| 182
tools/firmware/hvmloader/util.c
| 80
tools/firmware/hvmloader/util.h
| 12
tools/firmware/rombios/apmbios.S
| 3
tools/firmware/rombios/rombios.c
| 45
tools/firmware/vmxassist/head.S
| 5
tools/firmware/vmxassist/setup.c
| 8
tools/firmware/vmxassist/util.h
| 20
tools/firmware/vmxassist/vm86.c
| 103
tools/firmware/vmxassist/vmxassist.ld
| 12
tools/ioemu/Makefile.target
| 1
tools/ioemu/block-bochs.c
| 2
tools/ioemu/block-cloop.c
| 2
tools/ioemu/block-cow.c
| 2
tools/ioemu/block-qcow.c
| 2
tools/ioemu/block-vmdk.c
| 2
tools/ioemu/block.c
| 2
tools/ioemu/hw/ide.c
| 17
tools/ioemu/hw/pc.c
| 72
tools/ioemu/hw/piix4acpi.c
| 4
tools/ioemu/hw/piix_pci.c
| 2
tools/ioemu/hw/xen_platform.c
| 138
tools/ioemu/patches/acpi-poweroff-support
| 2
tools/ioemu/patches/acpi-support
| 50
tools/ioemu/patches/acpi-timer-support
| 6
tools/ioemu/patches/domain-destroy
| 8
tools/ioemu/patches/domain-reset
| 10
tools/ioemu/patches/domain-timeoffset
| 12
tools/ioemu/patches/hypervisor-pit
| 6
tools/ioemu/patches/ide-hd-multithread
| 2
tools/ioemu/patches/ioemu-ia64
| 45
tools/ioemu/patches/qemu-allow-disable-sdl
| 2
tools/ioemu/patches/qemu-bootorder
| 124
tools/ioemu/patches/qemu-daemonize
| 16
tools/ioemu/patches/qemu-fix-memset-args
| 2
tools/ioemu/patches/qemu-tunable-ide-write-cache
| 39
tools/ioemu/patches/serial-non-block
| 2
tools/ioemu/patches/series
| 5
tools/ioemu/patches/shadow-vram
| 4
tools/ioemu/patches/shared-vram
| 14
tools/ioemu/patches/support-xm-console
| 2
tools/ioemu/patches/vnc-access-monitor-vt
| 2
tools/ioemu/patches/vnc-cleanup
| 4
tools/ioemu/patches/vnc-display-find-unused
| 10
tools/ioemu/patches/vnc-fixes
| 10
tools/ioemu/patches/vnc-start-vncviewer
| 10
tools/ioemu/patches/vnc-title-domain-name
| 2
tools/ioemu/patches/xen-mm
| 36
tools/ioemu/patches/xen-platform-device
| 37
tools/ioemu/patches/xen-support-buffered-ioreqs
| 26
tools/ioemu/patches/xenstore-block-device-config
| 23
tools/ioemu/patches/xenstore-write-vnc-port
| 10
tools/ioemu/target-i386-dm/exec-dm.c
| 6
tools/ioemu/vl.c
| 95
tools/ioemu/vl.h
| 11
tools/libaio/src/Makefile
| 7
tools/libxc/Makefile
| 7
tools/libxc/ia64/xc_ia64_linux_restore.c
| 4
tools/libxc/powerpc64/Makefile
| 1
tools/libxc/powerpc64/xc_linux_build.c
| 408
tools/libxc/xc_domain.c
| 13
tools/libxc/xc_evtchn.c
| 11
tools/libxc/xc_hvm_build.c
| 212
tools/libxc/xc_linux.c
| 30
tools/libxc/xc_linux_build.c
| 22
tools/libxc/xc_linux_restore.c
| 7
tools/libxc/xc_linux_save.c
| 26
tools/libxc/xenctrl.h
| 9
tools/misc/xc_shadow.c
| 2
tools/python/xen/lowlevel/xc/xc.c
| 184
tools/python/xen/util/xmlrpclib2.py
| 12
tools/python/xen/web/httpserver.py
| 7
tools/python/xen/xend/XendCheckpoint.py
| 4
tools/python/xen/xend/XendDomain.py
| 24
tools/python/xen/xend/XendDomainInfo.py
| 59
tools/python/xen/xend/XendLogging.py
| 28
tools/python/xen/xend/XendNode.py
| 6
tools/python/xen/xend/image.py
| 29
tools/python/xen/xend/server/DevController.py
| 22
tools/python/xen/xend/server/XMLRPCServer.py
| 4
tools/python/xen/xend/server/blkif.py
| 19
tools/python/xen/xm/create.py
| 9
tools/python/xen/xm/main.py
| 82
tools/xcutils/xc_restore.c
| 23
tools/xcutils/xc_save.c
| 28
tools/xenmon/Makefile
| 10
tools/xenmon/xenbaked.c
| 19
tools/xenstore/Makefile
| 2
tools/xenstore/xs.c
| 22
tools/xentrace/Makefile
| 4
tools/xentrace/xentrace.c
| 21
tools/xm-test/lib/XmTestLib/XenDevice.py
| 1
unmodified_drivers/linux-2.6/Makefile
| 6
unmodified_drivers/linux-2.6/README
| 7
unmodified_drivers/linux-2.6/blkfront/Kbuild
| 5
unmodified_drivers/linux-2.6/mkbuildtree
| 49
unmodified_drivers/linux-2.6/netfront/Kbuild
| 4
unmodified_drivers/linux-2.6/overrides.mk
| 12
unmodified_drivers/linux-2.6/platform-pci/Kbuild
| 7
unmodified_drivers/linux-2.6/platform-pci/evtchn.c
| 173
unmodified_drivers/linux-2.6/platform-pci/platform-pci.c
| 271
unmodified_drivers/linux-2.6/platform-pci/platform-pci.h
| 45
unmodified_drivers/linux-2.6/platform-pci/xen_support.c
| 43
unmodified_drivers/linux-2.6/xenbus/Kbuild
| 10
xen/Rules.mk
| 6
xen/acm/acm_core.c
| 4
xen/acm/acm_simple_type_enforcement_hooks.c
| 28
xen/arch/ia64/Rules.mk
| 1
xen/arch/ia64/vmx/mmio.c
| 2
xen/arch/ia64/vmx/vlsapic.c
| 2
xen/arch/ia64/vmx/vmx_init.c
| 5
xen/arch/ia64/vmx/vmx_vcpu.c
| 2
xen/arch/ia64/xen/domain.c
| 25
xen/arch/ia64/xen/hyperprivop.S
| 2
xen/arch/ia64/xen/mm.c
| 26
xen/arch/ia64/xen/vcpu.c
| 2
xen/arch/ia64/xen/xenasm.S
| 2
xen/arch/powerpc/Makefile
| 7
xen/arch/powerpc/boot_of.c
| 57
xen/arch/powerpc/dom0_ops.c
| 43
xen/arch/powerpc/domain.c
| 42
xen/arch/powerpc/domain_build.c
| 6
xen/arch/powerpc/htab.c
| 13
xen/arch/powerpc/mm.c
| 20
xen/arch/powerpc/of_handler/devtree.c
| 2
xen/arch/powerpc/ofd_fixup.c
| 8
xen/arch/powerpc/papr/xlate.c
| 2
xen/arch/powerpc/powerpc64/ppc970.c
| 12
xen/arch/powerpc/setup.c
| 41
xen/arch/powerpc/usercopy.c
| 4
xen/arch/x86/Makefile
| 16
xen/arch/x86/Rules.mk
| 1
xen/arch/x86/acpi/boot.c
| 2
xen/arch/x86/apic.c
| 12
xen/arch/x86/boot/x86_32.S
| 28
xen/arch/x86/cpu/amd.c
| 2
xen/arch/x86/cpu/cyrix.c
| 2
xen/arch/x86/cpu/transmeta.c
| 2
xen/arch/x86/delay.c
| 14
xen/arch/x86/dmi_scan.c
| 10
xen/arch/x86/dom0_ops.c
| 4
xen/arch/x86/domain.c
| 127
xen/arch/x86/domain_build.c
| 32
xen/arch/x86/e820.c
| 12
xen/arch/x86/extable.c
| 4
xen/arch/x86/genapic/bigsmp.c
| 2
xen/arch/x86/genapic/es7000.h
| 4
xen/arch/x86/genapic/probe.c
| 2
xen/arch/x86/hvm/hvm.c
| 130
xen/arch/x86/hvm/i8254.c
| 2
xen/arch/x86/hvm/i8259.c
| 15
xen/arch/x86/hvm/intercept.c
| 2
xen/arch/x86/hvm/io.c
| 31
xen/arch/x86/hvm/platform.c
| 12
xen/arch/x86/hvm/svm/emulate.c
| 4
xen/arch/x86/hvm/svm/instrlen.c
| 2
xen/arch/x86/hvm/svm/intr.c
| 61
xen/arch/x86/hvm/svm/svm.c
| 1084 +-
xen/arch/x86/hvm/svm/vmcb.c
| 226
xen/arch/x86/hvm/svm/x86_32/exits.S
| 12
xen/arch/x86/hvm/svm/x86_64/exits.S
| 23
xen/arch/x86/hvm/vioapic.c
| 18
xen/arch/x86/hvm/vlapic.c
| 70
xen/arch/x86/hvm/vmx/io.c
| 98
xen/arch/x86/hvm/vmx/vmcs.c
| 31
xen/arch/x86/hvm/vmx/vmx.c
| 310
xen/arch/x86/hvm/vmx/x86_32/exits.S
| 4
xen/arch/x86/hvm/vmx/x86_64/exits.S
| 4
xen/arch/x86/i387.c
| 2
xen/arch/x86/io_apic.c
| 2
xen/arch/x86/irq.c
| 87
xen/arch/x86/microcode.c
| 4
xen/arch/x86/mm.c
| 1142 --
xen/arch/x86/mpparse.c
| 2
xen/arch/x86/nmi.c
| 8
xen/arch/x86/oprofile/nmi_int.c
| 4
xen/arch/x86/oprofile/op_model_p4.c
| 2
xen/arch/x86/oprofile/xenoprof.c
| 6
xen/arch/x86/setup.c
| 70
xen/arch/x86/shadow2-common.c
| 3406 +++++++
xen/arch/x86/shadow2.c
| 4492 +++++++++
xen/arch/x86/smpboot.c
| 2
xen/arch/x86/traps.c
| 78
xen/arch/x86/x86_32/asm-offsets.c
| 1
xen/arch/x86/x86_32/domain_page.c
| 66
xen/arch/x86/x86_32/entry.S
| 105
xen/arch/x86/x86_32/mm.c
| 12
xen/arch/x86/x86_32/traps.c
| 9
xen/arch/x86/x86_64/asm-offsets.c
| 1
xen/arch/x86/x86_64/entry.S
| 50
xen/arch/x86/x86_64/mm.c
| 13
xen/arch/x86/x86_64/traps.c
| 18
xen/common/acm_ops.c
| 1
xen/common/dom0_ops.c
| 9
xen/common/domain.c
| 8
xen/common/elf.c
| 1
xen/common/grant_table.c
| 301
xen/common/keyhandler.c
| 48
xen/common/memory.c
| 3
xen/common/rangeset.c
| 1
xen/common/sched_bvt.c
| 3
xen/common/sched_credit.c
| 2
xen/common/sched_sedf.c
| 22
xen/common/schedule.c
| 5
xen/common/timer.c
| 6
xen/common/trace.c
| 1
xen/drivers/Makefile
| 1
xen/drivers/char/console.c
| 239
xen/drivers/char/serial.c
| 1
xen/drivers/video/Makefile
| 4
xen/drivers/video/font.h
| 22
xen/drivers/video/font_8x14.c
| 4118 ++++++++
xen/drivers/video/font_8x16.c
| 4630 ++++++++++
xen/drivers/video/font_8x8.c
| 2582 +++++
xen/drivers/video/vga.c
| 690 +
xen/include/acm/acm_core.h
| 2
xen/include/asm-ia64/config.h
| 2
xen/include/asm-ia64/domain.h
| 2
xen/include/asm-ia64/event.h
| 2
xen/include/asm-ia64/linux-null/asm/desc.h
| 1
xen/include/asm-ia64/linux-null/asm/ia32.h
| 1
xen/include/asm-ia64/linux-null/asm/mman.h
| 1
xen/include/asm-ia64/linux-null/asm/module.h
| 1
xen/include/asm-ia64/linux-null/asm/pdb.h
| 1
xen/include/asm-ia64/linux-null/asm/ptrace_offsets.h
| 1
xen/include/asm-ia64/linux-null/asm/semaphore.h
| 1
xen/include/asm-ia64/linux-null/asm/serial.h
| 1
xen/include/asm-ia64/linux-null/asm/sn/arch.h
| 1
xen/include/asm-ia64/linux-null/asm/sn/geo.h
| 1
xen/include/asm-ia64/linux-null/asm/sn/nodepda.h
| 1
xen/include/asm-ia64/linux-null/asm/sn/sn_cpuid.h
| 1
xen/include/asm-ia64/linux-null/asm/ustack.h
| 1
xen/include/asm-ia64/linux-null/linux/bootmem.h
| 1
xen/include/asm-ia64/linux-null/linux/cpu.h
| 1
xen/include/asm-ia64/linux-null/linux/device.h
| 1
xen/include/asm-ia64/linux-null/linux/file.h
| 1
xen/include/asm-ia64/linux-null/linux/ioport.h
| 1
xen/include/asm-ia64/linux-null/linux/kallsyms.h
| 1
xen/include/asm-ia64/linux-null/linux/kernel_stat.h
| 1
xen/include/asm-ia64/linux-null/linux/mmzone.h
| 1
xen/include/asm-ia64/linux-null/linux/module.h
| 1
xen/include/asm-ia64/linux-null/linux/page-flags.h
| 1
xen/include/asm-ia64/linux-null/linux/proc_fs.h
| 1
xen/include/asm-ia64/linux-null/linux/profile.h
| 1
xen/include/asm-ia64/linux-null/linux/ptrace.h
| 1
xen/include/asm-ia64/linux-null/linux/random.h
| 1
xen/include/asm-ia64/linux-null/linux/rtc.h
| 1
xen/include/asm-ia64/linux-null/linux/seq_file.h
| 1
xen/include/asm-ia64/linux-null/linux/serial.h
| 1
xen/include/asm-ia64/linux-null/linux/serial_core.h
| 1
xen/include/asm-ia64/linux-null/linux/signal.h
| 1
xen/include/asm-ia64/linux-null/linux/slab.h
| 1
xen/include/asm-ia64/linux-null/linux/smp_lock.h
| 1
xen/include/asm-ia64/linux-null/linux/swap.h
| 1
xen/include/asm-ia64/linux-null/linux/threads.h
| 1
xen/include/asm-ia64/linux-null/linux/tty.h
| 1
xen/include/asm-ia64/linux-null/linux/workqueue.h
| 1
xen/include/asm-ia64/linux-xen/asm/ptrace.h
| 3
xen/include/asm-ia64/privop_stat.h
| 2
xen/include/asm-ia64/vcpu.h
| 3
xen/include/asm-ia64/vmx_platform.h
| 1
xen/include/asm-ia64/vmx_vpd.h
| 2
xen/include/asm-powerpc/config.h
| 1
xen/include/asm-powerpc/domain.h
| 13
xen/include/asm-powerpc/grant_table.h
| 2
xen/include/asm-powerpc/htab.h
| 8
xen/include/asm-powerpc/mm.h
| 4
xen/include/asm-powerpc/processor.h
| 1
xen/include/asm-powerpc/shadow.h
| 15
xen/include/asm-x86/acpi.h
| 2
xen/include/asm-x86/bitops.h
| 18
xen/include/asm-x86/config.h
| 24
xen/include/asm-x86/domain.h
| 116
xen/include/asm-x86/e820.h
| 31
xen/include/asm-x86/genapic.h
| 8
xen/include/asm-x86/grant_table.h
| 4
xen/include/asm-x86/hvm/domain.h
| 1
xen/include/asm-x86/hvm/hvm.h
| 37
xen/include/asm-x86/hvm/io.h
| 1
xen/include/asm-x86/hvm/support.h
| 15
xen/include/asm-x86/hvm/svm/svm.h
| 52
xen/include/asm-x86/hvm/svm/vmcb.h
| 32
xen/include/asm-x86/hvm/vcpu.h
| 13
xen/include/asm-x86/hvm/vioapic.h
| 5
xen/include/asm-x86/hvm/vmx/vmcs.h
| 3
xen/include/asm-x86/hvm/vmx/vmx.h
| 74
xen/include/asm-x86/io.h
| 1
xen/include/asm-x86/mach-es7000/mach_mpparse.h
| 2
xen/include/asm-x86/mach-generic/mach_mpparse.h
| 4
xen/include/asm-x86/mm.h
| 197
xen/include/asm-x86/msr.h
| 6
xen/include/asm-x86/page-guest32.h
| 7
xen/include/asm-x86/page.h
| 45
xen/include/asm-x86/perfc.h
| 12
xen/include/asm-x86/perfc_defn.h
| 53
xen/include/asm-x86/processor.h
| 59
xen/include/asm-x86/shadow.h
| 1791 ---
xen/include/asm-x86/shadow2-multi.h
| 116
xen/include/asm-x86/shadow2-private.h
| 593 +
xen/include/asm-x86/shadow2-types.h
| 705 +
xen/include/asm-x86/shadow2.h
| 626 +
xen/include/asm-x86/string.h
| 2
xen/include/asm-x86/system.h
| 4
xen/include/asm-x86/uaccess.h
| 6
xen/include/asm-x86/x86_32/page-2level.h
| 1
xen/include/asm-x86/x86_32/page-3level.h
| 3
xen/include/asm-x86/x86_64/page.h
| 5
xen/include/public/arch-ia64.h
| 8
xen/include/public/arch-powerpc.h
| 6
xen/include/public/arch-x86_32.h
| 29
xen/include/public/arch-x86_64.h
| 29
xen/include/public/dom0_ops.h
| 77
xen/include/public/grant_table.h
| 47
xen/include/public/hvm/e820.h
| 32
xen/include/public/hvm/hvm_info_table.h
| 2
xen/include/public/xen-compat.h
| 23
xen/include/public/xen.h
| 82
xen/include/xen/console.h
| 3
xen/include/xen/domain_page.h
| 37
xen/include/xen/gdbstub.h
| 10
xen/include/xen/keyhandler.h
| 6
xen/include/xen/lib.h
| 6
xen/include/xen/list.h
| 12
xen/include/xen/mm.h
| 7
xen/include/xen/sched.h
| 2
xen/include/xen/vga.h
| 24
435 files changed, 32246 insertions(+), 20570 deletions(-)
diff -r 91169603a8e8 -r 79afceca9065 .hgignore
--- a/.hgignore Tue Aug 22 14:45:49 2006 -0600
+++ b/.hgignore Wed Aug 23 11:11:27 2006 -0600
@@ -151,7 +151,7 @@
^tools/vtpm_manager/manager/vtpm_managerd$
^tools/xcutils/xc_restore$
^tools/xcutils/xc_save$
-^tools/xenmon/setmask$
+^tools/xenmon/xentrace_setmask$
^tools/xenmon/xenbaked$
^tools/xenstat/xentop/xentop$
^tools/xenstore/testsuite/tmp/.*$
@@ -172,7 +172,7 @@
^tools/xenstore/xs_tdb_dump$
^tools/xenstore/xs_test$
^tools/xenstore/xs_watch_stress$
-^tools/xentrace/setsize$
+^tools/xentrace/xentrace_setsize$
^tools/xentrace/tbctl$
^tools/xentrace/xenctx$
^tools/xentrace/xentrace$
@@ -197,7 +197,12 @@
^xen/xen$
^xen/xen-syms$
^xen/xen\..*$
-^xen/arch/ppc/dom0\.bin$
-^xen/arch/ppc/asm-offsets\.s$
-^xen/arch/ppc/firmware
-^xen/arch/ppc/firmware_image
+^xen/arch/powerpc/dom0\.bin$
+^xen/arch/powerpc/asm-offsets\.s$
+^xen/arch/powerpc/firmware$
+^xen/arch/powerpc/firmware_image$
+^xen/arch/powerpc/xen\.lds$
+^unmodified_drivers/linux-2.6/\.tmp_versions
+^unmodified_drivers/linux-2.6/.*\.cmd$
+^unmodified_drivers/linux-2.6/.*\.ko$
+^unmodified_drivers/linux-2.6/.*\.mod\.c$
diff -r 91169603a8e8 -r 79afceca9065 buildconfigs/Rules.mk
--- a/buildconfigs/Rules.mk Tue Aug 22 14:45:49 2006 -0600
+++ b/buildconfigs/Rules.mk Wed Aug 23 11:11:27 2006 -0600
@@ -63,8 +63,12 @@ ref-%/.valid-ref: pristine-%/.valid-pris
set -e
rm -rf $(@D)
cp -al $(<D) $(@D)
- if [ -d patches/$* ] ; then \
- for i in patches/$*/*.patch ; do patch -d $(@D) -p1 <$$i || exit 1
; done ; \
+ if [ -d patches/$* ] ; then \
+ echo Applying patches from patches/$*... ; \
+ for i in $$(cat patches/$*/series) ; do \
+ echo ... $$i ; \
+ patch -d $(@D) -p1 --quiet <patches/$*/$$i || exit 1 ; \
+ done ; \
fi
touch $@ # update timestamp to avoid rebuild
endif
diff -r 91169603a8e8 -r 79afceca9065 docs/src/user.tex
--- a/docs/src/user.tex Tue Aug 22 14:45:49 2006 -0600
+++ b/docs/src/user.tex Wed Aug 23 11:11:27 2006 -0600
@@ -1089,6 +1089,9 @@ The \path{xm list} command also supports
The \path{xm list} command also supports a long output format when the
\path{-l} switch is used. This outputs the full details of the
running domains in \xend's SXP configuration format.
+
+If you want to know how long your domains have been running for, then
+you can use the \verb_# xm uptime_ command.
You can get access to the console of a particular domain using
@@ -3126,8 +3129,8 @@ editing \path{grub.conf}.
\item [ console=$<$specifier list$>$ ] Specify the destination for Xen
console I/O. This is a comma-separated list of, for example:
\begin{description}
- \item[ vga ] Use VGA console (only until domain 0 boots, unless {\bf
- vga[keep] } is specified).
+ \item[ vga ] Use VGA console (until domain 0 boots, unless {\bf
+ vga=keep } is specified).
\item[ com1 ] Use serial port com1.
\item[ com2H ] Use serial port com2. Transmitted chars will have the
MSB set. Received chars must have MSB set.
@@ -3138,6 +3141,12 @@ editing \path{grub.conf}.
subsystems (e.g.\ console and debugger). Sharing is controlled by
MSB of each transmitted/received character. [NB. Default for this
option is `com1,vga']
+\item [ vga=$<$options$>$ ] This is a comma-separated list of options:
+ \begin{description}
+ \item[ text-$<$mode$>$ ] Select text-mode resolution, where mode is
+ one of 80x25, 80x28, 80x30, 80x34, 80x43, 80x50, 80x60.
+ \item[ keep ] Keep the VGA console even after domain 0 boots.
+ \end{description}
\item [ sync\_console ] Force synchronous console output. This is
useful if you system fails unexpectedly before it has sent all
available output to the console. In most cases Xen will
diff -r 91169603a8e8 -r 79afceca9065 extras/mini-os/Makefile
--- a/extras/mini-os/Makefile Tue Aug 22 14:45:49 2006 -0600
+++ b/extras/mini-os/Makefile Wed Aug 23 11:11:27 2006 -0600
@@ -11,26 +11,54 @@ CFLAGS := -fno-builtin -Wall -Werror -Wr
CFLAGS := -fno-builtin -Wall -Werror -Wredundant-decls -Wno-format
CFLAGS += -Wstrict-prototypes -Wnested-externs -Wpointer-arith -Winline
-override CPPFLAGS := -Iinclude $(CPPFLAGS)
ASFLAGS = -D__ASSEMBLY__
LDLIBS = -L. -lminios
LDFLAGS := -N -T minios-$(TARGET_ARCH).lds
+# For possible special source directories.
+EXTRA_SRC =
+# For possible special header directories.
+EXTRA_INC =
+
+# Standard name for architecture specific subdirectories.
+TARGET_ARCH_DIR = $(TARGET_ARCH)
+# This is used for architecture specific links.
+ARCH_LINKS =
+
ifeq ($(TARGET_ARCH),x86_32)
CFLAGS += -m32 -march=i686
LDFLAGS += -m elf_i386
+TARGET_ARCH_DIR = x86
+EXTRA_INC += $(TARGET_ARCH_DIR)/$(TARGET_ARCH)
+EXTRA_SRC += arch/$(EXTRA_INC)
endif
ifeq ($(TARGET_ARCH)$(pae),x86_32y)
CFLAGS += -DCONFIG_X86_PAE=1
ASFLAGS += -DCONFIG_X86_PAE=1
+TARGET_ARCH_DIR = x86
+EXTRA_INC += $(TARGET_ARCH_DIR)/$(TARGET_ARCH)
+EXTRA_SRC += arch/$(EXTRA_INC)
endif
ifeq ($(TARGET_ARCH),x86_64)
CFLAGS += -m64 -mno-red-zone -fpic -fno-reorder-blocks
CFLAGS += -fno-asynchronous-unwind-tables
LDFLAGS += -m elf_x86_64
+TARGET_ARCH_DIR = x86
+EXTRA_INC += $(TARGET_ARCH_DIR)/$(TARGET_ARCH)
+EXTRA_SRC += arch/$(EXTRA_INC)
+endif
+
+ifeq ($(TARGET_ARCH),ia64)
+CFLAGS += -mfixed-range=f12-f15,f32-f127
+ASFLAGS += -x assembler-with-cpp -ansi -Wall
+ASFLAGS += -mfixed-range=f12-f15,f32-f127
+ARCH_LINKS = IA64_LINKS # Special link on ia64 needed
+define arch_links
+[ -e include/ia64/asm-xsi-offsets.h ] || ln -sf
../../../../xen/include/asm-ia64/asm-xsi-offsets.h
include/ia64/asm-xsi-offsets.h
+endef
endif
ifeq ($(debug),y)
@@ -39,6 +67,10 @@ CFLAGS += -O3
CFLAGS += -O3
endif
+# Add the special header directories to the include paths.
+extra_incl := $(foreach dir,$(EXTRA_INC),-Iinclude/$(dir))
+override CPPFLAGS := -Iinclude $(CPPFLAGS) -Iinclude/$(TARGET_ARCH_DIR)
$(extra_incl)
+
TARGET := mini-os
HEAD := $(TARGET_ARCH).o
@@ -46,15 +78,32 @@ OBJS += $(patsubst %.c,%.o,$(wildcard li
OBJS += $(patsubst %.c,%.o,$(wildcard lib/*.c))
OBJS += $(patsubst %.c,%.o,$(wildcard xenbus/*.c))
OBJS += $(patsubst %.c,%.o,$(wildcard console/*.c))
+OBJS += $(patsubst %.S,%.o,$(wildcard arch/$(TARGET_ARCH_DIR)/*.S))
+OBJS += $(patsubst %.c,%.o,$(wildcard arch/$(TARGET_ARCH_DIR)/*.c))
+# For special wanted source directories.
+extra_objs := $(foreach dir,$(EXTRA_SRC),$(patsubst %.c,%.o,$(wildcard
$(dir)/*.c)))
+OBJS += $(extra_objs)
+extra_objs := $(foreach dir,$(EXTRA_SRC),$(patsubst %.S,%.o,$(wildcard
$(dir)/*.S)))
+OBJS += $(extra_objs)
HDRS := $(wildcard include/*.h)
HDRS += $(wildcard include/xen/*.h)
+HDRS += $(wildcard include/$(TARGET_ARCH_DIR)/*.h)
+# For special wanted header directories.
+extra_heads := $(foreach dir,$(EXTRA_INC),$(wildcard $(dir)/*.h))
+HDRS += $(extra_heads)
.PHONY: default
default: $(TARGET)
+# Create special architecture specific links.
+ifneq ($(ARCH_LINKS),)
+$(ARCH_LINKS):
+ $(arch_links)
+endif
+
.PHONY: links
-links:
+links: $(ARCH_LINKS)
[ -e include/xen ] || ln -sf ../../../xen/include/public include/xen
libminios.a: links $(OBJS) $(HEAD)
diff -r 91169603a8e8 -r 79afceca9065 extras/mini-os/console/xencons_ring.c
--- a/extras/mini-os/console/xencons_ring.c Tue Aug 22 14:45:49 2006 -0600
+++ b/extras/mini-os/console/xencons_ring.c Wed Aug 23 11:11:27 2006 -0600
@@ -14,13 +14,13 @@
static inline struct xencons_interface *xencons_interface(void)
{
- return mfn_to_virt(start_info.console_mfn);
+ return mfn_to_virt(start_info.console.domU.mfn);
}
static inline void notify_daemon(void)
{
/* Use evtchn: this is called early, before irq is set up. */
- notify_remote_via_evtchn(start_info.console_evtchn);
+ notify_remote_via_evtchn(start_info.console.domU.evtchn);
}
int xencons_ring_send_no_notify(const char *data, unsigned len)
@@ -80,10 +80,10 @@ int xencons_ring_init(void)
{
int err;
- if (!start_info.console_evtchn)
+ if (!start_info.console.domU.evtchn)
return 0;
- err = bind_evtchn(start_info.console_evtchn, handle_input,
+ err = bind_evtchn(start_info.console.domU.evtchn, handle_input,
NULL);
if (err <= 0) {
printk("XEN console request chn bind failed %i\n", err);
diff -r 91169603a8e8 -r 79afceca9065 extras/mini-os/include/hypervisor.h
--- a/extras/mini-os/include/hypervisor.h Tue Aug 22 14:45:49 2006 -0600
+++ b/extras/mini-os/include/hypervisor.h Wed Aug 23 11:11:27 2006 -0600
@@ -7,6 +7,7 @@
* Copyright (c) 2002, K A Fraser
* Copyright (c) 2005, Grzegorz Milos
* Updates: Aravindh Puthiyaparambil <aravindh.puthiyaparambil@xxxxxxxxxx>
+ * Updates: Dietmar Hahn <dietmar.hahn@xxxxxxxxxxxxxxxxxxx> for ia64
*/
#ifndef _HYPERVISOR_H_
@@ -19,6 +20,8 @@
#include <hypercall-x86_32.h>
#elif defined(__x86_64__)
#include <hypercall-x86_64.h>
+#elif defined(__ia64__)
+#include <hypercall-ia64.h>
#else
#error "Unsupported architecture"
#endif
diff -r 91169603a8e8 -r 79afceca9065 extras/mini-os/include/types.h
--- a/extras/mini-os/include/types.h Tue Aug 22 14:45:49 2006 -0600
+++ b/extras/mini-os/include/types.h Wed Aug 23 11:11:27 2006 -0600
@@ -29,7 +29,7 @@ typedef unsigned int u32;
#ifdef __i386__
typedef signed long long s64;
typedef unsigned long long u64;
-#elif defined(__x86_64__)
+#elif defined(__x86_64__) || defined(__ia64__)
typedef signed long s64;
typedef unsigned long u64;
#endif
@@ -49,7 +49,7 @@ typedef struct { unsigned long pte_low,
typedef struct { unsigned long pte_low, pte_high; } pte_t;
#endif /* CONFIG_X86_PAE */
-#elif defined(__x86_64__)
+#elif defined(__x86_64__) || defined(__ia64__)
typedef long quad_t;
typedef unsigned long u_quad_t;
typedef unsigned long uintptr_t;
diff -r 91169603a8e8 -r 79afceca9065
linux-2.6-xen-sparse/arch/i386/kernel/cpu/mtrr/main-xen.c
--- a/linux-2.6-xen-sparse/arch/i386/kernel/cpu/mtrr/main-xen.c Tue Aug 22
14:45:49 2006 -0600
+++ b/linux-2.6-xen-sparse/arch/i386/kernel/cpu/mtrr/main-xen.c Wed Aug 23
11:11:27 2006 -0600
@@ -178,7 +178,7 @@ static int __init mtrr_init(void)
{
struct cpuinfo_x86 *c = &boot_cpu_data;
- if (!(xen_start_info->flags & SIF_PRIVILEGED))
+ if (!is_initial_xendomain())
return -ENODEV;
if ((!cpu_has(c, X86_FEATURE_MTRR)) &&
diff -r 91169603a8e8 -r 79afceca9065
linux-2.6-xen-sparse/arch/i386/kernel/io_apic-xen.c
--- a/linux-2.6-xen-sparse/arch/i386/kernel/io_apic-xen.c Tue Aug 22
14:45:49 2006 -0600
+++ b/linux-2.6-xen-sparse/arch/i386/kernel/io_apic-xen.c Wed Aug 23
11:11:27 2006 -0600
@@ -2480,7 +2480,7 @@ static int __init io_apic_bug_finalize(v
{
if(sis_apic_bug == -1)
sis_apic_bug = 0;
- if (xen_start_info->flags & SIF_INITDOMAIN) {
+ if (is_initial_xendomain()) {
dom0_op_t op = { .cmd = DOM0_PLATFORM_QUIRK };
op.u.platform_quirk.quirk_id = sis_apic_bug ?
QUIRK_IOAPIC_BAD_REGSEL : QUIRK_IOAPIC_GOOD_REGSEL;
diff -r 91169603a8e8 -r 79afceca9065
linux-2.6-xen-sparse/arch/i386/kernel/setup-xen.c
--- a/linux-2.6-xen-sparse/arch/i386/kernel/setup-xen.c Tue Aug 22 14:45:49
2006 -0600
+++ b/linux-2.6-xen-sparse/arch/i386/kernel/setup-xen.c Wed Aug 23 11:11:27
2006 -0600
@@ -184,7 +184,6 @@ static struct resource code_resource = {
.flags = IORESOURCE_BUSY | IORESOURCE_MEM
};
-#ifdef CONFIG_XEN_PRIVILEGED_GUEST
static struct resource system_rom_resource = {
.name = "System ROM",
.start = 0xf0000,
@@ -240,7 +239,6 @@ static struct resource video_rom_resourc
.end = 0xc7fff,
.flags = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM
};
-#endif
static struct resource video_ram_resource = {
.name = "Video RAM area",
@@ -299,7 +297,6 @@ static struct resource standard_io_resou
#define STANDARD_IO_RESOURCES \
(sizeof standard_io_resources / sizeof standard_io_resources[0])
-#ifdef CONFIG_XEN_PRIVILEGED_GUEST
#define romsignature(x) (*(unsigned short *)(x) == 0xaa55)
static int __init romchecksum(unsigned char *rom, unsigned long length)
@@ -317,9 +314,11 @@ static void __init probe_roms(void)
unsigned char *rom;
int i;
+#ifdef CONFIG_XEN
/* Nothing to do if not running in dom0. */
- if (!(xen_start_info->flags & SIF_INITDOMAIN))
+ if (!is_initial_xendomain())
return;
+#endif
/* video rom */
upper = adapter_rom_resources[0].start;
@@ -379,7 +378,6 @@ static void __init probe_roms(void)
start = adapter_rom_resources[i++].end & ~2047UL;
}
}
-#endif
/*
* Point at the empty zero page to start with. We map the real shared_info
@@ -1359,9 +1357,7 @@ legacy_init_iomem_resources(struct e820e
{
int i;
-#if defined(CONFIG_XEN_PRIVILEGED_GUEST) || !defined(CONFIG_XEN)
probe_roms();
-#endif
for (i = 0; i < nr_map; i++) {
struct resource *res;
@@ -1458,7 +1454,7 @@ static void __init register_memory(void)
int i;
/* Nothing to do if not running in dom0. */
- if (!(xen_start_info->flags & SIF_INITDOMAIN)) {
+ if (!is_initial_xendomain()) {
legacy_init_iomem_resources(e820.map, e820.nr_map,
&code_resource, &data_resource);
return;
@@ -1618,7 +1614,7 @@ void __init setup_arch(char **cmdline_p)
/* Force a quick death if the kernel panics (not domain 0). */
extern int panic_timeout;
- if (!panic_timeout && !(xen_start_info->flags & SIF_INITDOMAIN))
+ if (!panic_timeout && !is_initial_xendomain())
panic_timeout = 1;
/* Register a call for panic conditions. */
@@ -1661,7 +1657,7 @@ void __init setup_arch(char **cmdline_p)
}
bootloader_type = LOADER_TYPE;
- if (xen_start_info->flags & SIF_INITDOMAIN) {
+ if (is_initial_xendomain()) {
/* This is drawn from a dump from vgacon:startup in
* standard Linux. */
screen_info.orig_video_mode = 3;
@@ -1670,6 +1666,35 @@ void __init setup_arch(char **cmdline_p)
screen_info.orig_video_cols = 80;
screen_info.orig_video_ega_bx = 3;
screen_info.orig_video_points = 16;
+ if (xen_start_info->console.dom0.info_size >=
+ sizeof(struct dom0_vga_console_info)) {
+ const struct dom0_vga_console_info *info =
+ (struct dom0_vga_console_info *)(
+ (char *)xen_start_info +
+ xen_start_info->console.dom0.info_off);
+ screen_info.orig_video_mode = info->txt_mode;
+ screen_info.orig_video_isVGA = info->video_type;
+ screen_info.orig_video_lines = info->video_height;
+ screen_info.orig_video_cols = info->video_width;
+ screen_info.orig_video_points = info->txt_points;
+ screen_info.lfb_width = info->video_width;
+ screen_info.lfb_height = info->video_height;
+ screen_info.lfb_depth = info->lfb_depth;
+ screen_info.lfb_base = info->lfb_base;
+ screen_info.lfb_size = info->lfb_size;
+ screen_info.lfb_linelength = info->lfb_linelen;
+ screen_info.red_size = info->red_size;
+ screen_info.red_pos = info->red_pos;
+ screen_info.green_size = info->green_size;
+ screen_info.green_pos = info->green_pos;
+ screen_info.blue_size = info->blue_size;
+ screen_info.blue_pos = info->blue_pos;
+ screen_info.rsvd_size = info->rsvd_size;
+ screen_info.rsvd_pos = info->rsvd_pos;
+ }
+ screen_info.orig_y = screen_info.orig_video_lines - 1;
+ xen_start_info->console.domU.mfn = 0;
+ xen_start_info->console.domU.evtchn = 0;
} else
screen_info.orig_video_isVGA = 0;
@@ -1788,7 +1813,7 @@ void __init setup_arch(char **cmdline_p)
}
#endif
- if (xen_start_info->flags & SIF_INITDOMAIN)
+ if (is_initial_xendomain())
dmi_scan_machine();
#ifdef CONFIG_X86_GENERICARCH
@@ -1805,7 +1830,7 @@ void __init setup_arch(char **cmdline_p)
#endif
#ifdef CONFIG_ACPI
- if (!(xen_start_info->flags & SIF_INITDOMAIN)) {
+ if (!is_initial_xendomain()) {
printk(KERN_INFO "ACPI in unprivileged domain disabled\n");
acpi_disabled = 1;
acpi_ht = 0;
@@ -1831,11 +1856,7 @@ void __init setup_arch(char **cmdline_p)
register_memory();
- if (xen_start_info->flags & SIF_INITDOMAIN) {
- if (!(xen_start_info->flags & SIF_PRIVILEGED))
- panic("Xen granted us console access "
- "but not privileged status");
-
+ if (is_initial_xendomain()) {
#ifdef CONFIG_VT
#if defined(CONFIG_VGA_CONSOLE)
if (!efi_enabled ||
diff -r 91169603a8e8 -r 79afceca9065
linux-2.6-xen-sparse/arch/i386/kernel/swiotlb.c
--- a/linux-2.6-xen-sparse/arch/i386/kernel/swiotlb.c Tue Aug 22 14:45:49
2006 -0600
+++ b/linux-2.6-xen-sparse/arch/i386/kernel/swiotlb.c Wed Aug 23 11:11:27
2006 -0600
@@ -199,7 +199,7 @@ swiotlb_init(void)
swiotlb = 1;
} else if ((swiotlb_force != -1) &&
is_running_on_xen() &&
- (xen_start_info->flags & SIF_INITDOMAIN)) {
+ is_initial_xendomain()) {
/* Domain 0 always has a swiotlb. */
ram_end = HYPERVISOR_memory_op(XENMEM_maximum_ram_page, NULL);
if (ram_end <= 0x7ffff)
diff -r 91169603a8e8 -r 79afceca9065
linux-2.6-xen-sparse/arch/i386/kernel/time-xen.c
--- a/linux-2.6-xen-sparse/arch/i386/kernel/time-xen.c Tue Aug 22 14:45:49
2006 -0600
+++ b/linux-2.6-xen-sparse/arch/i386/kernel/time-xen.c Wed Aug 23 11:11:27
2006 -0600
@@ -470,8 +470,7 @@ int do_settimeofday(struct timespec *tv)
sec = tv->tv_sec;
__normalize_time(&sec, &nsec);
- if ((xen_start_info->flags & SIF_INITDOMAIN) &&
- !independent_wallclock) {
+ if (is_initial_xendomain() && !independent_wallclock) {
op.cmd = DOM0_SETTIME;
op.u.settime.secs = sec;
op.u.settime.nsecs = nsec;
@@ -502,8 +501,7 @@ static void sync_xen_wallclock(unsigned
s64 nsec;
dom0_op_t op;
- if (!ntp_synced() || independent_wallclock ||
- !(xen_start_info->flags & SIF_INITDOMAIN))
+ if (!ntp_synced() || independent_wallclock || !is_initial_xendomain())
return;
write_seqlock_irq(&xtime_lock);
@@ -532,7 +530,7 @@ static int set_rtc_mmss(unsigned long no
WARN_ON(irqs_disabled());
- if (independent_wallclock || !(xen_start_info->flags & SIF_INITDOMAIN))
+ if (independent_wallclock || !is_initial_xendomain())
return 0;
/* gets recalled with irq locally disabled */
diff -r 91169603a8e8 -r 79afceca9065
linux-2.6-xen-sparse/arch/i386/kernel/vmlinux.lds.S
--- a/linux-2.6-xen-sparse/arch/i386/kernel/vmlinux.lds.S Tue Aug 22
14:45:49 2006 -0600
+++ b/linux-2.6-xen-sparse/arch/i386/kernel/vmlinux.lds.S Wed Aug 23
11:11:27 2006 -0600
@@ -12,6 +12,12 @@ OUTPUT_ARCH(i386)
OUTPUT_ARCH(i386)
ENTRY(phys_startup_32)
jiffies = jiffies_64;
+
+PHDRS {
+ text PT_LOAD FLAGS(5); /* R_E */
+ data PT_LOAD FLAGS(7); /* RWE */
+ note PT_NOTE FLAGS(4); /* R__ */
+}
SECTIONS
{
. = __KERNEL_START;
@@ -25,7 +31,7 @@ SECTIONS
KPROBES_TEXT
*(.fixup)
*(.gnu.warning)
- } = 0x9090
+ } :text = 0x9090
_etext = .; /* End of text section */
@@ -47,7 +53,7 @@ SECTIONS
.data : AT(ADDR(.data) - LOAD_OFFSET) { /* Data */
*(.data)
CONSTRUCTORS
- }
+ } :data
. = ALIGN(4096);
__nosave_begin = .;
@@ -154,4 +160,6 @@ SECTIONS
STABS_DEBUG
DWARF_DEBUG
+
+ NOTES
}
diff -r 91169603a8e8 -r 79afceca9065
linux-2.6-xen-sparse/arch/i386/mm/init-xen.c
--- a/linux-2.6-xen-sparse/arch/i386/mm/init-xen.c Tue Aug 22 14:45:49
2006 -0600
+++ b/linux-2.6-xen-sparse/arch/i386/mm/init-xen.c Wed Aug 23 11:11:27
2006 -0600
@@ -566,7 +566,7 @@ void __init paging_init(void)
/* Setup mapping of lower 1st MB */
for (i = 0; i < NR_FIX_ISAMAPS; i++)
- if (xen_start_info->flags & SIF_PRIVILEGED)
+ if (is_initial_xendomain())
set_fixmap(FIX_ISAMAP_BEGIN - i, i * PAGE_SIZE);
else
__set_fixmap(FIX_ISAMAP_BEGIN - i,
diff -r 91169603a8e8 -r 79afceca9065
linux-2.6-xen-sparse/arch/i386/mm/ioremap-xen.c
--- a/linux-2.6-xen-sparse/arch/i386/mm/ioremap-xen.c Tue Aug 22 14:45:49
2006 -0600
+++ b/linux-2.6-xen-sparse/arch/i386/mm/ioremap-xen.c Wed Aug 23 11:11:27
2006 -0600
@@ -121,7 +121,7 @@ int direct_remap_pfn_range(struct vm_are
domid_t domid)
{
/* Same as remap_pfn_range(). */
- vma->vm_flags |= VM_IO | VM_RESERVED;
+ vma->vm_flags |= VM_IO | VM_RESERVED | VM_PFNMAP;
if (domid == DOMID_SELF)
return -EINVAL;
@@ -245,7 +245,7 @@ void __iomem * __ioremap(unsigned long p
/*
* Don't remap the low PCI/ISA area, it's always mapped..
*/
- if (xen_start_info->flags & SIF_PRIVILEGED &&
+ if (is_initial_xendomain() &&
phys_addr >= ISA_START_ADDRESS && last_addr < ISA_END_ADDRESS)
return (void __iomem *) isa_bus_to_virt(phys_addr);
@@ -282,9 +282,6 @@ void __iomem * __ioremap(unsigned long p
area->phys_addr = phys_addr;
addr = (void __iomem *) area->addr;
flags |= _PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_ACCESSED;
-#ifdef __x86_64__
- flags |= _PAGE_USER;
-#endif
if (__direct_remap_pfn_range(&init_mm, (unsigned long)addr,
phys_addr>>PAGE_SHIFT,
size, __pgprot(flags), domid)) {
@@ -425,7 +422,7 @@ void __init *bt_ioremap(unsigned long ph
/*
* Don't remap the low PCI/ISA area, it's always mapped..
*/
- if (xen_start_info->flags & SIF_PRIVILEGED &&
+ if (is_initial_xendomain() &&
phys_addr >= ISA_START_ADDRESS && last_addr < ISA_END_ADDRESS)
return isa_bus_to_virt(phys_addr);
diff -r 91169603a8e8 -r 79afceca9065
linux-2.6-xen-sparse/arch/i386/pci/irq-xen.c
--- a/linux-2.6-xen-sparse/arch/i386/pci/irq-xen.c Tue Aug 22 14:45:49
2006 -0600
+++ b/linux-2.6-xen-sparse/arch/i386/pci/irq-xen.c Wed Aug 23 11:11:27
2006 -0600
@@ -95,7 +95,10 @@ static struct irq_routing_table * __init
u8 *addr;
struct irq_routing_table *rt;
-#ifdef CONFIG_XEN_PRIVILEGED_GUEST
+#ifdef CONFIG_XEN
+ if (!is_initial_xendomain())
+ return NULL;
+#endif
if (pirq_table_addr) {
rt = pirq_check_routing_table((u8 *)
isa_bus_to_virt(pirq_table_addr));
if (rt)
@@ -107,7 +110,6 @@ static struct irq_routing_table * __init
if (rt)
return rt;
}
-#endif
return NULL;
}
diff -r 91169603a8e8 -r 79afceca9065
linux-2.6-xen-sparse/arch/ia64/kernel/setup.c
--- a/linux-2.6-xen-sparse/arch/ia64/kernel/setup.c Tue Aug 22 14:45:49
2006 -0600
+++ b/linux-2.6-xen-sparse/arch/ia64/kernel/setup.c Wed Aug 23 11:11:27
2006 -0600
@@ -545,12 +545,7 @@ setup_arch (char **cmdline_p)
"flags=0x%x\n", s->arch.start_info_pfn,
xen_start_info->nr_pages, xen_start_info->flags);
- /* xen_start_info isn't setup yet, get the flags manually */
- if (xen_start_info->flags & SIF_INITDOMAIN) {
- if (!(xen_start_info->flags & SIF_PRIVILEGED))
- panic("Xen granted us console access "
- "but not privileged status");
- } else {
+ if (!is_initial_xendomain()) {
extern int console_use_vt;
conswitchp = NULL;
console_use_vt = 0;
diff -r 91169603a8e8 -r 79afceca9065
linux-2.6-xen-sparse/arch/ia64/xen/hypervisor.c
--- a/linux-2.6-xen-sparse/arch/ia64/xen/hypervisor.c Tue Aug 22 14:45:49
2006 -0600
+++ b/linux-2.6-xen-sparse/arch/ia64/xen/hypervisor.c Wed Aug 23 11:11:27
2006 -0600
@@ -82,7 +82,7 @@ ia64_xenmem_reservation_op(unsigned long
// of a non-privileged domain,
if ((op == XENMEM_increase_reservation ||
op == XENMEM_populate_physmap) &&
- !(xen_start_info->flags & SIF_PRIVILEGED) &&
+ !is_initial_xendomain() &&
reservation.extent_order > 0)
return ret;
}
diff -r 91169603a8e8 -r 79afceca9065
linux-2.6-xen-sparse/arch/x86_64/kernel/entry-xen.S
--- a/linux-2.6-xen-sparse/arch/x86_64/kernel/entry-xen.S Tue Aug 22
14:45:49 2006 -0600
+++ b/linux-2.6-xen-sparse/arch/x86_64/kernel/entry-xen.S Wed Aug 23
11:11:27 2006 -0600
@@ -271,7 +271,7 @@ sysret_careful:
CFI_RESTORE_STATE
bt $TIF_NEED_RESCHED,%edx
jnc sysret_signal
- XEN_BLOCK_EVENTS(%rsi)
+ XEN_UNBLOCK_EVENTS(%rsi)
pushq %rdi
CFI_ADJUST_CFA_OFFSET 8
call schedule
@@ -295,7 +295,7 @@ 1: movl $_TIF_NEED_RESCHED,%edi
1: movl $_TIF_NEED_RESCHED,%edi
/* Use IRET because user could have changed frame. This
works because ptregscall_common has called FIXUP_TOP_OF_STACK. */
- cli
+ XEN_BLOCK_EVENTS(%rsi)
jmp int_with_check
badsys:
@@ -377,7 +377,7 @@ int_careful:
call schedule
popq %rdi
CFI_ADJUST_CFA_OFFSET -8
- cli
+ XEN_BLOCK_EVENTS(%rsi)
jmp int_with_check
/* handle signals and tracing -- both require a full stack frame */
@@ -395,7 +395,7 @@ int_very_careful:
popq %rdi
CFI_ADJUST_CFA_OFFSET -8
andl $~(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SINGLESTEP),%edi
- cli
+ XEN_BLOCK_EVENTS(%rsi)
jmp int_restore_rest
int_signal:
@@ -407,7 +407,7 @@ 1: movl $_TIF_NEED_RESCHED,%edi
1: movl $_TIF_NEED_RESCHED,%edi
int_restore_rest:
RESTORE_REST
- cli
+ XEN_BLOCK_EVENTS(%rsi)
jmp int_with_check
CFI_ENDPROC
@@ -535,8 +535,8 @@ retint_careful:
call schedule
popq %rdi
CFI_ADJUST_CFA_OFFSET -8
+ GET_THREAD_INFO(%rcx)
XEN_BLOCK_EVENTS(%rsi)
- GET_THREAD_INFO(%rcx)
/* cli */
jmp retint_check
diff -r 91169603a8e8 -r 79afceca9065
linux-2.6-xen-sparse/arch/x86_64/kernel/setup-xen.c
--- a/linux-2.6-xen-sparse/arch/x86_64/kernel/setup-xen.c Tue Aug 22
14:45:49 2006 -0600
+++ b/linux-2.6-xen-sparse/arch/x86_64/kernel/setup-xen.c Wed Aug 23
11:11:27 2006 -0600
@@ -189,7 +189,6 @@ struct resource code_resource = {
#define IORESOURCE_ROM (IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM)
-#if defined(CONFIG_XEN_PRIVILEGED_GUEST) || !defined(CONFIG_XEN)
static struct resource system_rom_resource = {
.name = "System ROM",
.start = 0xf0000,
@@ -218,19 +217,16 @@ static struct resource adapter_rom_resou
{ .name = "Adapter ROM", .start = 0, .end = 0,
.flags = IORESOURCE_ROM }
};
-#endif
#define ADAPTER_ROM_RESOURCES \
(sizeof adapter_rom_resources / sizeof adapter_rom_resources[0])
-#if defined(CONFIG_XEN_PRIVILEGED_GUEST) || !defined(CONFIG_XEN)
static struct resource video_rom_resource = {
.name = "Video ROM",
.start = 0xc0000,
.end = 0xc7fff,
.flags = IORESOURCE_ROM,
};
-#endif
static struct resource video_ram_resource = {
.name = "Video RAM area",
@@ -239,7 +235,6 @@ static struct resource video_ram_resourc
.flags = IORESOURCE_RAM,
};
-#if defined(CONFIG_XEN_PRIVILEGED_GUEST) || !defined(CONFIG_XEN)
#define romsignature(x) (*(unsigned short *)(x) == 0xaa55)
static int __init romchecksum(unsigned char *rom, unsigned long length)
@@ -256,6 +251,12 @@ static void __init probe_roms(void)
unsigned long start, length, upper;
unsigned char *rom;
int i;
+
+#ifdef CONFIG_XEN
+ /* Nothing to do if not running in dom0. */
+ if (!is_initial_xendomain())
+ return;
+#endif
/* video rom */
upper = adapter_rom_resources[0].start;
@@ -315,7 +316,6 @@ static void __init probe_roms(void)
start = adapter_rom_resources[i++].end & ~2047UL;
}
}
-#endif
static __init void parse_cmdline_early (char ** cmdline_p)
{
@@ -625,11 +625,8 @@ void __init setup_arch(char **cmdline_p)
void __init setup_arch(char **cmdline_p)
{
unsigned long kernel_end;
-
-#if defined(CONFIG_XEN_PRIVILEGED_GUEST)
struct e820entry *machine_e820;
struct xen_memory_map memmap;
-#endif
#ifdef CONFIG_XEN
/* Register a call for panic conditions. */
@@ -639,7 +636,7 @@ void __init setup_arch(char **cmdline_p)
kernel_end = 0; /* dummy */
screen_info = SCREEN_INFO;
- if (xen_start_info->flags & SIF_INITDOMAIN) {
+ if (is_initial_xendomain()) {
/* This is drawn from a dump from vgacon:startup in
* standard Linux. */
screen_info.orig_video_mode = 3;
@@ -648,6 +645,35 @@ void __init setup_arch(char **cmdline_p)
screen_info.orig_video_cols = 80;
screen_info.orig_video_ega_bx = 3;
screen_info.orig_video_points = 16;
+ if (xen_start_info->console.dom0.info_size >=
+ sizeof(struct dom0_vga_console_info)) {
+ const struct dom0_vga_console_info *info =
+ (struct dom0_vga_console_info *)(
+ (char *)xen_start_info +
+ xen_start_info->console.dom0.info_off);
+ screen_info.orig_video_mode = info->txt_mode;
+ screen_info.orig_video_isVGA = info->video_type;
+ screen_info.orig_video_lines = info->video_height;
+ screen_info.orig_video_cols = info->video_width;
+ screen_info.orig_video_points = info->txt_points;
+ screen_info.lfb_width = info->video_width;
+ screen_info.lfb_height = info->video_height;
+ screen_info.lfb_depth = info->lfb_depth;
+ screen_info.lfb_base = info->lfb_base;
+ screen_info.lfb_size = info->lfb_size;
+ screen_info.lfb_linelength = info->lfb_linelen;
+ screen_info.red_size = info->red_size;
+ screen_info.red_pos = info->red_pos;
+ screen_info.green_size = info->green_size;
+ screen_info.green_pos = info->green_pos;
+ screen_info.blue_size = info->blue_size;
+ screen_info.blue_pos = info->blue_pos;
+ screen_info.rsvd_size = info->rsvd_size;
+ screen_info.rsvd_pos = info->rsvd_pos;
+ }
+ screen_info.orig_y = screen_info.orig_video_lines - 1;
+ xen_start_info->console.domU.mfn = 0;
+ xen_start_info->console.domU.evtchn = 0;
} else
screen_info.orig_video_isVGA = 0;
@@ -860,8 +886,7 @@ void __init setup_arch(char **cmdline_p)
}
- if ( ! (xen_start_info->flags & SIF_INITDOMAIN))
- {
+ if (!is_initial_xendomain()) {
acpi_disabled = 1;
#ifdef CONFIG_ACPI
acpi_ht = 0;
@@ -908,9 +933,9 @@ void __init setup_arch(char **cmdline_p)
* Request address space for all standard RAM and ROM resources
* and also for regions reported as reserved by the e820.
*/
-#if defined(CONFIG_XEN_PRIVILEGED_GUEST)
probe_roms();
- if (xen_start_info->flags & SIF_INITDOMAIN) {
+#ifdef CONFIG_XEN
+ if (is_initial_xendomain()) {
machine_e820 = alloc_bootmem_low_pages(PAGE_SIZE);
memmap.nr_entries = E820MAX;
@@ -919,14 +944,9 @@ void __init setup_arch(char **cmdline_p)
BUG_ON(HYPERVISOR_memory_op(XENMEM_machine_memory_map,
&memmap));
e820_reserve_resources(machine_e820, memmap.nr_entries);
- } else if (!(xen_start_info->flags & SIF_INITDOMAIN))
- e820_reserve_resources(e820.map, e820.nr_map);
-#elif defined(CONFIG_XEN)
+ } else
+#endif
e820_reserve_resources(e820.map, e820.nr_map);
-#else
- probe_roms();
- e820_reserve_resources(e820.map, e820.nr_map);
-#endif
request_resource(&iomem_resource, &video_ram_resource);
@@ -937,12 +957,12 @@ void __init setup_arch(char **cmdline_p)
request_resource(&ioport_resource, &standard_io_resources[i]);
}
-#if defined(CONFIG_XEN_PRIVILEGED_GUEST)
- if (xen_start_info->flags & SIF_INITDOMAIN) {
+#ifdef CONFIG_XEN
+ if (is_initial_xendomain()) {
e820_setup_gap(machine_e820, memmap.nr_entries);
free_bootmem(__pa(machine_e820), PAGE_SIZE);
}
-#elif !defined(CONFIG_XEN)
+#else
e820_setup_gap(e820.map, e820.nr_map);
#endif
@@ -957,11 +977,7 @@ void __init setup_arch(char **cmdline_p)
set_iopl.iopl = 1;
HYPERVISOR_physdev_op(PHYSDEVOP_set_iopl, &set_iopl);
- if (xen_start_info->flags & SIF_INITDOMAIN) {
- if (!(xen_start_info->flags & SIF_PRIVILEGED))
- panic("Xen granted us console access "
- "but not privileged status");
-
+ if (is_initial_xendomain()) {
#ifdef CONFIG_VT
#if defined(CONFIG_VGA_CONSOLE)
conswitchp = &vga_con;
diff -r 91169603a8e8 -r 79afceca9065
linux-2.6-xen-sparse/arch/x86_64/mm/init-xen.c
--- a/linux-2.6-xen-sparse/arch/x86_64/mm/init-xen.c Tue Aug 22 14:45:49
2006 -0600
+++ b/linux-2.6-xen-sparse/arch/x86_64/mm/init-xen.c Wed Aug 23 11:11:27
2006 -0600
@@ -529,7 +529,7 @@ void __init xen_init_pt(void)
mk_kernel_pgd(__pa_symbol(level3_kernel_pgt));
level3_kernel_pgt[pud_index(__START_KERNEL_map)] =
__pud(__pa_symbol(level2_kernel_pgt) |
- _KERNPG_TABLE | _PAGE_USER);
+ _KERNPG_TABLE);
memcpy((void *)level2_kernel_pgt, page, PAGE_SIZE);
early_make_page_readonly(init_level4_pgt,
@@ -578,7 +578,7 @@ void __init extend_init_mapping(unsigned
pte_page = alloc_static_page(&phys);
early_make_page_readonly(
pte_page, XENFEAT_writable_page_tables);
- set_pmd(pmd, __pmd(phys | _KERNPG_TABLE | _PAGE_USER));
+ set_pmd(pmd, __pmd(phys | _KERNPG_TABLE));
} else {
addr = page[pmd_index(va)];
addr_to_page(addr, pte_page);
@@ -587,7 +587,7 @@ void __init extend_init_mapping(unsigned
if (pte_none(*pte)) {
new_pte = pfn_pte(
(va - __START_KERNEL_map) >> PAGE_SHIFT,
- __pgprot(_KERNPG_TABLE | _PAGE_USER));
+ __pgprot(_KERNPG_TABLE));
xen_l1_entry_update(pte, new_pte);
}
va += PAGE_SIZE;
@@ -789,7 +789,7 @@ void __init paging_init(void)
/* Setup mapping of lower 1st MB */
for (i = 0; i < NR_FIX_ISAMAPS; i++)
- if (xen_start_info->flags & SIF_PRIVILEGED)
+ if (is_initial_xendomain())
set_fixmap(FIX_ISAMAP_BEGIN - i, i * PAGE_SIZE);
else
__set_fixmap(FIX_ISAMAP_BEGIN - i,
diff -r 91169603a8e8 -r 79afceca9065
linux-2.6-xen-sparse/drivers/char/tpm/tpm_xen.c
--- a/linux-2.6-xen-sparse/drivers/char/tpm/tpm_xen.c Tue Aug 22 14:45:49
2006 -0600
+++ b/linux-2.6-xen-sparse/drivers/char/tpm/tpm_xen.c Wed Aug 23 11:11:27
2006 -0600
@@ -343,7 +343,6 @@ static void backend_changed(struct xenbu
case XenbusStateInitialising:
case XenbusStateInitWait:
case XenbusStateInitialised:
- case XenbusStateUnknown:
break;
case XenbusStateConnected:
@@ -354,10 +353,10 @@ static void backend_changed(struct xenbu
tpmif_set_connected_state(tp, 0);
break;
+ case XenbusStateUnknown:
case XenbusStateClosed:
- if (tp->is_suspended == 0) {
+ if (tp->is_suspended == 0)
device_unregister(&dev->dev);
- }
xenbus_switch_state(dev, XenbusStateClosed);
break;
}
@@ -718,9 +717,8 @@ static int __init tpmif_init(void)
long rc = 0;
struct tpm_private *tp;
- if ((xen_start_info->flags & SIF_INITDOMAIN)) {
+ if (is_initial_xendomain())
return -EPERM;
- }
tp = tpm_private_get();
if (!tp) {
diff -r 91169603a8e8 -r 79afceca9065 linux-2.6-xen-sparse/drivers/xen/Kconfig
--- a/linux-2.6-xen-sparse/drivers/xen/Kconfig Tue Aug 22 14:45:49 2006 -0600
+++ b/linux-2.6-xen-sparse/drivers/xen/Kconfig Wed Aug 23 11:11:27 2006 -0600
@@ -13,7 +13,7 @@ if XEN
if XEN
config XEN_INTERFACE_VERSION
hex
- default 0x00030202
+ default 0x00030203
menu "XEN"
diff -r 91169603a8e8 -r 79afceca9065
linux-2.6-xen-sparse/drivers/xen/balloon/balloon.c
--- a/linux-2.6-xen-sparse/drivers/xen/balloon/balloon.c Tue Aug 22
14:45:49 2006 -0600
+++ b/linux-2.6-xen-sparse/drivers/xen/balloon/balloon.c Wed Aug 23
11:11:27 2006 -0600
@@ -76,7 +76,7 @@ static unsigned long target_pages;
static unsigned long target_pages;
/* We increase/decrease in batches which fit in a page */
-static unsigned long frame_list[PAGE_SIZE / sizeof(unsigned long)];
+static unsigned long frame_list[PAGE_SIZE / sizeof(unsigned long)];
/* VM /proc information for memory */
extern unsigned long totalram_pages;
@@ -440,20 +440,16 @@ static int balloon_read(char *page, char
"Requested target: %8lu kB\n"
"Low-mem balloon: %8lu kB\n"
"High-mem balloon: %8lu kB\n"
+ "Driver pages: %8lu kB\n"
"Xen hard limit: ",
PAGES2KB(current_pages), PAGES2KB(target_pages),
- PAGES2KB(balloon_low), PAGES2KB(balloon_high));
-
- if (hard_limit != ~0UL) {
- len += sprintf(
- page + len,
- "%8lu kB (inc. %8lu kB driver headroom)\n",
- PAGES2KB(hard_limit), PAGES2KB(driver_pages));
- } else {
- len += sprintf(
- page + len,
- " ??? kB\n");
- }
+ PAGES2KB(balloon_low), PAGES2KB(balloon_high),
+ PAGES2KB(driver_pages));
+
+ if (hard_limit != ~0UL)
+ len += sprintf(page + len, "%8lu kB\n", PAGES2KB(hard_limit));
+ else
+ len += sprintf(page + len, " ??? kB\n");
*eof = 1;
return len;
@@ -610,8 +606,21 @@ void balloon_dealloc_empty_page_range(
schedule_work(&balloon_worker);
}
+void balloon_release_driver_page(struct page *page)
+{
+ unsigned long flags;
+
+ balloon_lock(flags);
+ balloon_append(page);
+ driver_pages--;
+ balloon_unlock(flags);
+
+ schedule_work(&balloon_worker);
+}
+
EXPORT_SYMBOL_GPL(balloon_update_driver_allowance);
EXPORT_SYMBOL_GPL(balloon_alloc_empty_page_range);
EXPORT_SYMBOL_GPL(balloon_dealloc_empty_page_range);
+EXPORT_SYMBOL_GPL(balloon_release_driver_page);
MODULE_LICENSE("Dual BSD/GPL");
diff -r 91169603a8e8 -r 79afceca9065
linux-2.6-xen-sparse/drivers/xen/blkback/blkback.c
--- a/linux-2.6-xen-sparse/drivers/xen/blkback/blkback.c Tue Aug 22
14:45:49 2006 -0600
+++ b/linux-2.6-xen-sparse/drivers/xen/blkback/blkback.c Wed Aug 23
11:11:27 2006 -0600
@@ -341,7 +341,7 @@ static void dispatch_rw_block_io(blkif_t
blkif_request_t *req,
pending_req_t *pending_req)
{
- extern void ll_rw_block(int rw, int nr, struct buffer_head * bhs[]);
+ extern void ll_rw_block(int rw, int nr, struct buffer_head * bhs[]);
int operation = (req->operation == BLKIF_OP_WRITE) ? WRITE : READ;
struct gnttab_map_grant_ref map[BLKIF_MAX_SEGMENTS_PER_REQUEST];
struct phys_req preq;
@@ -409,7 +409,7 @@ static void dispatch_rw_block_io(blkif_t
DPRINTK("access denied: %s of [%llu,%llu] on dev=%04x\n",
operation == READ ? "read" : "write",
preq.sector_number,
- preq.sector_number + preq.nr_sects, preq.dev);
+ preq.sector_number + preq.nr_sects, preq.dev);
goto fail_flush;
}
diff -r 91169603a8e8 -r 79afceca9065
linux-2.6-xen-sparse/drivers/xen/blkback/common.h
--- a/linux-2.6-xen-sparse/drivers/xen/blkback/common.h Tue Aug 22 14:45:49
2006 -0600
+++ b/linux-2.6-xen-sparse/drivers/xen/blkback/common.h Wed Aug 23 11:11:27
2006 -0600
@@ -55,9 +55,9 @@ struct vbd {
unsigned char type; /* VDISK_xxx */
u32 pdevice; /* phys device that this vbd maps to */
struct block_device *bdev;
-};
+};
-struct backend_info;
+struct backend_info;
typedef struct blkif_st {
/* Unique identifier for this interface. */
@@ -72,7 +72,7 @@ typedef struct blkif_st {
/* The VBD attached to this interface. */
struct vbd vbd;
/* Back pointer to the backend_info. */
- struct backend_info *be;
+ struct backend_info *be;
/* Private fields. */
spinlock_t blk_ring_lock;
atomic_t refcnt;
@@ -122,7 +122,7 @@ struct phys_req {
blkif_sector_t sector_number;
};
-int vbd_translate(struct phys_req *req, blkif_t *blkif, int operation);
+int vbd_translate(struct phys_req *req, blkif_t *blkif, int operation);
void blkif_interface_init(void);
diff -r 91169603a8e8 -r 79afceca9065
linux-2.6-xen-sparse/drivers/xen/blkback/xenbus.c
--- a/linux-2.6-xen-sparse/drivers/xen/blkback/xenbus.c Tue Aug 22 14:45:49
2006 -0600
+++ b/linux-2.6-xen-sparse/drivers/xen/blkback/xenbus.c Wed Aug 23 11:11:27
2006 -0600
@@ -194,7 +194,7 @@ static int blkback_probe(struct xenbus_d
}
/* setup back pointer */
- be->blkif->be = be;
+ be->blkif->be = be;
err = xenbus_watch_path2(dev, dev->nodename, "physical-device",
&be->backend_watch, backend_changed);
@@ -287,7 +287,7 @@ static void backend_changed(struct xenbu
}
/* We're potentially connected now */
- update_blkif_status(be->blkif);
+ update_blkif_status(be->blkif);
}
}
@@ -305,6 +305,11 @@ static void frontend_changed(struct xenb
switch (frontend_state) {
case XenbusStateInitialising:
+ if (dev->state == XenbusStateClosing) {
+ printk("%s: %s: prepare for reconnect\n",
+ __FUNCTION__, dev->nodename);
+ xenbus_switch_state(dev, XenbusStateInitWait);
+ }
break;
case XenbusStateInitialised:
@@ -326,12 +331,11 @@ static void frontend_changed(struct xenb
xenbus_switch_state(dev, XenbusStateClosing);
break;
+ case XenbusStateUnknown:
case XenbusStateClosed:
device_unregister(&dev->dev);
break;
- case XenbusStateUnknown:
- case XenbusStateInitWait:
default:
xenbus_dev_fatal(dev, -EINVAL, "saw state %d at frontend",
frontend_state);
diff -r 91169603a8e8 -r 79afceca9065
linux-2.6-xen-sparse/drivers/xen/blkfront/blkfront.c
--- a/linux-2.6-xen-sparse/drivers/xen/blkfront/blkfront.c Tue Aug 22
14:45:49 2006 -0600
+++ b/linux-2.6-xen-sparse/drivers/xen/blkfront/blkfront.c Wed Aug 23
11:11:27 2006 -0600
@@ -46,6 +46,7 @@
#include <xen/interface/grant_table.h>
#include <xen/gnttab.h>
#include <asm/hypervisor.h>
+#include <asm/maddr.h>
#define BLKIF_STATE_DISCONNECTED 0
#define BLKIF_STATE_CONNECTED 1
@@ -255,10 +256,10 @@ static void backend_changed(struct xenbu
DPRINTK("blkfront:backend_changed.\n");
switch (backend_state) {
- case XenbusStateUnknown:
case XenbusStateInitialising:
case XenbusStateInitWait:
case XenbusStateInitialised:
+ case XenbusStateUnknown:
case XenbusStateClosed:
break;
diff -r 91169603a8e8 -r 79afceca9065
linux-2.6-xen-sparse/drivers/xen/blktap/blktap.c
--- a/linux-2.6-xen-sparse/drivers/xen/blktap/blktap.c Tue Aug 22 14:45:49
2006 -0600
+++ b/linux-2.6-xen-sparse/drivers/xen/blktap/blktap.c Wed Aug 23 11:11:27
2006 -0600
@@ -157,7 +157,7 @@ typedef unsigned int PEND_RING_IDX;
typedef unsigned int PEND_RING_IDX;
static inline int MASK_PEND_IDX(int i) {
- return (i & (MAX_PENDING_REQS-1));
+ return (i & (MAX_PENDING_REQS-1));
}
static inline unsigned int RTN_PEND_IDX(pending_req_t *req, int idx) {
@@ -754,7 +754,7 @@ static int req_increase(void)
if (!pending_reqs[mmap_alloc] || !pending_addrs[mmap_alloc]) {
kfree(pending_reqs[mmap_alloc]);
kfree(pending_addrs[mmap_alloc]);
- WPRINTK("%s: out of memory\n", __FUNCTION__);
+ WPRINTK("%s: out of memory\n", __FUNCTION__);
ret = -ENOMEM;
goto done;
}
@@ -1051,7 +1051,7 @@ static int blktap_read_ufe_ring(int idx)
unsigned long kvaddr, uvaddr;
struct page **map = info->vma->vm_private_data;
struct page *pg;
- int offset;
+ int offset;
uvaddr = MMAP_VADDR(info->user_vstart, usr_idx, j);
kvaddr = MMAP_VADDR(mmap_start[mmap_idx].start,
@@ -1063,7 +1063,7 @@ static int blktap_read_ufe_ring(int idx)
>> PAGE_SHIFT;
map[offset] = NULL;
}
- fast_flush_area(pending_req, pending_idx, usr_idx, idx);
+ fast_flush_area(pending_req, pending_idx, usr_idx, idx);
make_response(blkif, pending_req->id, resp->operation,
resp->status);
info->idx_map[usr_idx] = INVALID_REQ;
@@ -1118,7 +1118,7 @@ static int do_block_io_op(blkif_t *blkif
"ring does not exist!\n");
print_dbug = 0; /*We only print this message once*/
}
- return 1;
+ return 1;
}
info = tapfds[blkif->dev_num];
@@ -1185,7 +1185,7 @@ static void dispatch_rw_block_io(blkif_t
blkif_request_t *req,
pending_req_t *pending_req)
{
- extern void ll_rw_block(int rw, int nr, struct buffer_head * bhs[]);
+ extern void ll_rw_block(int rw, int nr, struct buffer_head * bhs[]);
int op, operation = (req->operation == BLKIF_OP_WRITE) ? WRITE : READ;
struct gnttab_map_grant_ref map[BLKIF_MAX_SEGMENTS_PER_REQUEST*2];
unsigned int nseg;
diff -r 91169603a8e8 -r 79afceca9065
linux-2.6-xen-sparse/drivers/xen/blktap/common.h
--- a/linux-2.6-xen-sparse/drivers/xen/blktap/common.h Tue Aug 22 14:45:49
2006 -0600
+++ b/linux-2.6-xen-sparse/drivers/xen/blktap/common.h Wed Aug 23 11:11:27
2006 -0600
@@ -49,7 +49,7 @@
#define WPRINTK(fmt, args...) printk(KERN_WARNING "blk_tap: " fmt, ##args)
-struct backend_info;
+struct backend_info;
typedef struct blkif_st {
/* Unique identifier for this interface. */
@@ -62,7 +62,7 @@ typedef struct blkif_st {
blkif_back_ring_t blk_ring;
struct vm_struct *blk_ring_area;
/* Back pointer to the backend_info. */
- struct backend_info *be;
+ struct backend_info *be;
/* Private fields. */
spinlock_t blk_ring_lock;
atomic_t refcnt;
diff -r 91169603a8e8 -r 79afceca9065
linux-2.6-xen-sparse/drivers/xen/blktap/xenbus.c
--- a/linux-2.6-xen-sparse/drivers/xen/blktap/xenbus.c Tue Aug 22 14:45:49
2006 -0600
+++ b/linux-2.6-xen-sparse/drivers/xen/blktap/xenbus.c Wed Aug 23 11:11:27
2006 -0600
@@ -174,7 +174,7 @@ static int blktap_probe(struct xenbus_de
}
/* setup back pointer */
- be->blkif->be = be;
+ be->blkif->be = be;
be->blkif->sectors = 0;
/* set a watch on disk info, waiting for userspace to update details*/
@@ -267,12 +267,11 @@ static void tap_frontend_changed(struct
xenbus_switch_state(dev, XenbusStateClosing);
break;
+ case XenbusStateUnknown:
case XenbusStateClosed:
device_unregister(&dev->dev);
break;
- case XenbusStateUnknown:
- case XenbusStateInitWait:
default:
xenbus_dev_fatal(dev, -EINVAL, "saw state %d at frontend",
frontend_state);
diff -r 91169603a8e8 -r 79afceca9065
linux-2.6-xen-sparse/drivers/xen/console/console.c
--- a/linux-2.6-xen-sparse/drivers/xen/console/console.c Tue Aug 22
14:45:49 2006 -0600
+++ b/linux-2.6-xen-sparse/drivers/xen/console/console.c Wed Aug 23
11:11:27 2006 -0600
@@ -178,7 +178,7 @@ static struct tty_driver *kcons_device(s
static struct console kcons_info = {
.device = kcons_device,
- .flags = CON_PRINTBUFFER,
+ .flags = CON_PRINTBUFFER | CON_ENABLED,
.index = -1,
};
@@ -188,12 +188,10 @@ static int __init xen_console_init(void)
if (!is_running_on_xen())
return __RETCODE;
- if (xen_start_info->flags & SIF_INITDOMAIN) {
+ if (is_initial_xendomain()) {
if (xc_mode == XC_DEFAULT)
xc_mode = XC_SERIAL;
kcons_info.write = kcons_write_dom0;
- if (xc_mode == XC_SERIAL)
- kcons_info.flags |= CON_ENABLED;
} else {
if (xc_mode == XC_DEFAULT)
xc_mode = XC_TTY;
@@ -249,7 +247,7 @@ void xencons_force_flush(void)
int sz;
/* Emergency console is synchronous, so there's nothing to flush. */
- if (xen_start_info->flags & SIF_INITDOMAIN)
+ if (is_initial_xendomain())
return;
/* Spin until console data is flushed through to the daemon. */
@@ -320,7 +318,7 @@ static void __xencons_tx_flush(void)
int sent, sz, work_done = 0;
if (x_char) {
- if (xen_start_info->flags & SIF_INITDOMAIN)
+ if (is_initial_xendomain())
kcons_write_dom0(NULL, &x_char, 1);
else
while (x_char)
@@ -334,7 +332,7 @@ static void __xencons_tx_flush(void)
sz = wp - wc;
if (sz > (wbuf_size - WBUF_MASK(wc)))
sz = wbuf_size - WBUF_MASK(wc);
- if (xen_start_info->flags & SIF_INITDOMAIN) {
+ if (is_initial_xendomain()) {
kcons_write_dom0(NULL, &wbuf[WBUF_MASK(wc)], sz);
wc += sz;
} else {
@@ -624,7 +622,7 @@ static int __init xencons_init(void)
return rc;
}
- if (xen_start_info->flags & SIF_INITDOMAIN) {
+ if (is_initial_xendomain()) {
xencons_priv_irq = bind_virq_to_irqhandler(
VIRQ_CONSOLE,
0,
diff -r 91169603a8e8 -r 79afceca9065
linux-2.6-xen-sparse/drivers/xen/console/xencons_ring.c
--- a/linux-2.6-xen-sparse/drivers/xen/console/xencons_ring.c Tue Aug 22
14:45:49 2006 -0600
+++ b/linux-2.6-xen-sparse/drivers/xen/console/xencons_ring.c Wed Aug 23
11:11:27 2006 -0600
@@ -52,13 +52,13 @@ static int xencons_irq;
static inline struct xencons_interface *xencons_interface(void)
{
- return mfn_to_virt(xen_start_info->console_mfn);
+ return mfn_to_virt(xen_start_info->console.domU.mfn);
}
static inline void notify_daemon(void)
{
/* Use evtchn: this is called early, before irq is set up. */
- notify_remote_via_evtchn(xen_start_info->console_evtchn);
+ notify_remote_via_evtchn(xen_start_info->console.domU.evtchn);
}
int xencons_ring_send(const char *data, unsigned len)
@@ -116,11 +116,11 @@ int xencons_ring_init(void)
unbind_from_irqhandler(xencons_irq, NULL);
xencons_irq = 0;
- if (!xen_start_info->console_evtchn)
+ if (!xen_start_info->console.domU.evtchn)
return 0;
err = bind_evtchn_to_irqhandler(
- xen_start_info->console_evtchn,
+ xen_start_info->console.domU.evtchn,
handle_input, 0, "xencons", NULL);
if (err <= 0) {
printk(KERN_ERR "XEN console request irq failed %i\n", err);
diff -r 91169603a8e8 -r 79afceca9065
linux-2.6-xen-sparse/drivers/xen/core/cpu_hotplug.c
--- a/linux-2.6-xen-sparse/drivers/xen/core/cpu_hotplug.c Tue Aug 22
14:45:49 2006 -0600
+++ b/linux-2.6-xen-sparse/drivers/xen/core/cpu_hotplug.c Wed Aug 23
11:11:27 2006 -0600
@@ -92,7 +92,7 @@ static int setup_cpu_watcher(struct noti
.flags = XBWF_new_thread };
(void)register_xenbus_watch(&cpu_watch);
- if (!(xen_start_info->flags & SIF_INITDOMAIN)) {
+ if (!is_initial_xendomain()) {
for_each_cpu(i)
vcpu_hotplug(i);
printk(KERN_INFO "Brought up %ld CPUs\n",
diff -r 91169603a8e8 -r 79afceca9065
linux-2.6-xen-sparse/drivers/xen/core/evtchn.c
--- a/linux-2.6-xen-sparse/drivers/xen/core/evtchn.c Tue Aug 22 14:45:49
2006 -0600
+++ b/linux-2.6-xen-sparse/drivers/xen/core/evtchn.c Wed Aug 23 11:11:27
2006 -0600
@@ -840,8 +840,7 @@ void __init xen_init_IRQ(void)
#ifdef RTC_IRQ
/* If not domain 0, force our RTC driver to fail its probe. */
- if ((i == RTC_IRQ) &&
- !(xen_start_info->flags & SIF_INITDOMAIN))
+ if ((i == RTC_IRQ) && !is_initial_xendomain())
continue;
#endif
diff -r 91169603a8e8 -r 79afceca9065
linux-2.6-xen-sparse/drivers/xen/core/gnttab.c
--- a/linux-2.6-xen-sparse/drivers/xen/core/gnttab.c Tue Aug 22 14:45:49
2006 -0600
+++ b/linux-2.6-xen-sparse/drivers/xen/core/gnttab.c Wed Aug 23 11:11:27
2006 -0600
@@ -41,6 +41,8 @@
#include <asm/pgtable.h>
#include <asm/uaccess.h>
#include <asm/synch_bitops.h>
+#include <asm/io.h>
+#include <xen/interface/memory.h>
/* External tools reserve first few grant table entries. */
#define NR_RESERVED_ENTRIES 8
@@ -350,6 +352,8 @@ void gnttab_cancel_free_callback(struct
}
EXPORT_SYMBOL_GPL(gnttab_cancel_free_callback);
+#ifdef CONFIG_XEN
+
#ifndef __ia64__
static int map_pte_fn(pte_t *pte, struct page *pmd_page,
unsigned long addr, void *data)
@@ -410,17 +414,53 @@ int gnttab_resume(void)
int gnttab_suspend(void)
{
-
#ifndef __ia64__
apply_to_page_range(&init_mm, (unsigned long)shared,
PAGE_SIZE * NR_GRANT_FRAMES,
unmap_pte_fn, NULL);
#endif
-
- return 0;
-}
-
-static int __init gnttab_init(void)
+ return 0;
+}
+
+#else /* !CONFIG_XEN */
+
+#include <platform-pci.h>
+
+int gnttab_resume(void)
+{
+ unsigned long frames;
+ struct xen_add_to_physmap xatp;
+ unsigned int i;
+
+ frames = alloc_xen_mmio(PAGE_SIZE * NR_GRANT_FRAMES);
+
+ for (i = 0; i < NR_GRANT_FRAMES; i++) {
+ xatp.domid = DOMID_SELF;
+ xatp.idx = i;
+ xatp.space = XENMAPSPACE_grant_table;
+ xatp.gpfn = (frames >> PAGE_SHIFT) + i;
+ if (HYPERVISOR_memory_op(XENMEM_add_to_physmap, &xatp))
+ BUG();
+ }
+
+ shared = ioremap(frames, PAGE_SIZE * NR_GRANT_FRAMES);
+ if (shared == NULL) {
+ printk("error to ioremap gnttab share frames\n");
+ return -1;
+ }
+
+ return 0;
+}
+
+int gnttab_suspend(void)
+{
+ iounmap(shared);
+ return 0;
+}
+
+#endif /* !CONFIG_XEN */
+
+int __init gnttab_init(void)
{
int i;
@@ -439,4 +479,6 @@ static int __init gnttab_init(void)
return 0;
}
+#ifdef CONFIG_XEN
core_initcall(gnttab_init);
+#endif
diff -r 91169603a8e8 -r 79afceca9065
linux-2.6-xen-sparse/drivers/xen/core/reboot.c
--- a/linux-2.6-xen-sparse/drivers/xen/core/reboot.c Tue Aug 22 14:45:49
2006 -0600
+++ b/linux-2.6-xen-sparse/drivers/xen/core/reboot.c Wed Aug 23 11:11:27
2006 -0600
@@ -106,7 +106,8 @@ static void pre_suspend(void)
clear_fixmap(FIX_SHARED_INFO);
xen_start_info->store_mfn = mfn_to_pfn(xen_start_info->store_mfn);
- xen_start_info->console_mfn = mfn_to_pfn(xen_start_info->console_mfn);
+ xen_start_info->console.domU.mfn =
+ mfn_to_pfn(xen_start_info->console.domU.mfn);
}
static void post_suspend(void)
diff -r 91169603a8e8 -r 79afceca9065
linux-2.6-xen-sparse/drivers/xen/core/skbuff.c
--- a/linux-2.6-xen-sparse/drivers/xen/core/skbuff.c Tue Aug 22 14:45:49
2006 -0600
+++ b/linux-2.6-xen-sparse/drivers/xen/core/skbuff.c Wed Aug 23 11:11:27
2006 -0600
@@ -121,8 +121,7 @@ static int __init skbuff_init(void)
for (order = 0; order <= MAX_SKBUFF_ORDER; order++) {
size = PAGE_SIZE << order;
sprintf(name[order], "xen-skb-%lu", size);
- if (is_running_on_xen() &&
- (xen_start_info->flags & SIF_PRIVILEGED))
+ if (is_running_on_xen() && is_initial_xendomain())
skbuff_order_cachep[order] = kmem_cache_create(
name[order], size, size, 0,
skbuff_ctor, skbuff_dtor);
diff -r 91169603a8e8 -r 79afceca9065
linux-2.6-xen-sparse/drivers/xen/core/smpboot.c
--- a/linux-2.6-xen-sparse/drivers/xen/core/smpboot.c Tue Aug 22 14:45:49
2006 -0600
+++ b/linux-2.6-xen-sparse/drivers/xen/core/smpboot.c Wed Aug 23 11:11:27
2006 -0600
@@ -255,7 +255,14 @@ void __init smp_prepare_cpus(unsigned in
xen_smp_intr_init(0);
- for_each_cpu_mask (cpu, cpu_possible_map) {
+ /* Restrict the possible_map according to max_cpus. */
+ while ((num_possible_cpus() > 1) && (num_possible_cpus() > max_cpus)) {
+ for (cpu = NR_CPUS-1; !cpu_isset(cpu, cpu_possible_map); cpu--)
+ continue;
+ cpu_clear(cpu, cpu_possible_map);
+ }
+
+ for_each_cpu (cpu) {
if (cpu == 0)
continue;
@@ -266,7 +273,8 @@ void __init smp_prepare_cpus(unsigned in
#endif
gdt_descr->address = get_zeroed_page(GFP_KERNEL);
if (unlikely(!gdt_descr->address)) {
- printk(KERN_CRIT "CPU%d failed to allocate GDT\n", cpu);
+ printk(KERN_CRIT "CPU%d failed to allocate GDT\n",
+ cpu);
continue;
}
gdt_descr->size = GDT_SIZE;
@@ -294,7 +302,7 @@ void __init smp_prepare_cpus(unsigned in
irq_ctx_init(cpu);
#ifdef CONFIG_HOTPLUG_CPU
- if (xen_start_info->flags & SIF_INITDOMAIN)
+ if (is_initial_xendomain())
cpu_set(cpu, cpu_present_map);
#else
cpu_set(cpu, cpu_present_map);
@@ -304,12 +312,6 @@ void __init smp_prepare_cpus(unsigned in
}
init_xenbus_allowed_cpumask();
-
- /* Currently, Xen gives no dynamic NUMA/HT info. */
- for (cpu = 1; cpu < NR_CPUS; cpu++) {
- cpu_sibling_map[cpu] = cpumask_of_cpu(cpu);
- cpu_core_map[cpu] = cpumask_of_cpu(cpu);
- }
#ifdef CONFIG_X86_IO_APIC
/*
diff -r 91169603a8e8 -r 79afceca9065
linux-2.6-xen-sparse/drivers/xen/netback/common.h
--- a/linux-2.6-xen-sparse/drivers/xen/netback/common.h Tue Aug 22 14:45:49
2006 -0600
+++ b/linux-2.6-xen-sparse/drivers/xen/netback/common.h Wed Aug 23 11:11:27
2006 -0600
@@ -64,9 +64,9 @@ typedef struct netif_st {
/* Physical parameters of the comms window. */
grant_handle_t tx_shmem_handle;
- grant_ref_t tx_shmem_ref;
+ grant_ref_t tx_shmem_ref;
grant_handle_t rx_shmem_handle;
- grant_ref_t rx_shmem_ref;
+ grant_ref_t rx_shmem_ref;
unsigned int evtchn;
unsigned int irq;
@@ -78,7 +78,10 @@ typedef struct netif_st {
/* Set of features that can be turned on in dev->features. */
int features;
- int can_queue;
+
+ /* Internal feature information. */
+ int can_queue:1; /* can queue packets for receiver? */
+ int copying_receiver:1; /* copy packets to receiver? */
/* Allow netif_be_start_xmit() to peek ahead in the rx request ring. */
RING_IDX rx_req_cons_peek;
diff -r 91169603a8e8 -r 79afceca9065
linux-2.6-xen-sparse/drivers/xen/netback/loopback.c
--- a/linux-2.6-xen-sparse/drivers/xen/netback/loopback.c Tue Aug 22
14:45:49 2006 -0600
+++ b/linux-2.6-xen-sparse/drivers/xen/netback/loopback.c Wed Aug 23
11:11:27 2006 -0600
@@ -218,7 +218,7 @@ static int __init make_loopback(int i)
return err;
}
-static void __init clean_loopback(int i)
+static void __exit clean_loopback(int i)
{
struct net_device *dev1, *dev2;
char dev_name[IFNAMSIZ];
diff -r 91169603a8e8 -r 79afceca9065
linux-2.6-xen-sparse/drivers/xen/netback/netback.c
--- a/linux-2.6-xen-sparse/drivers/xen/netback/netback.c Tue Aug 22
14:45:49 2006 -0600
+++ b/linux-2.6-xen-sparse/drivers/xen/netback/netback.c Wed Aug 23
11:11:27 2006 -0600
@@ -43,6 +43,7 @@ struct netbk_rx_meta {
struct netbk_rx_meta {
skb_frag_t frag;
int id;
+ int copy:1;
};
static void netif_idx_release(u16 pending_idx);
@@ -68,13 +69,11 @@ static struct timer_list net_timer;
#define MAX_PENDING_REQS 256
static struct sk_buff_head rx_queue;
-static multicall_entry_t rx_mcl[NET_RX_RING_SIZE+1];
-static mmu_update_t rx_mmu[NET_RX_RING_SIZE];
-static gnttab_transfer_t grant_rx_op[NET_RX_RING_SIZE];
-static unsigned char rx_notify[NR_IRQS];
static unsigned long mmap_vstart;
#define MMAP_VADDR(_req) (mmap_vstart + ((_req) * PAGE_SIZE))
+
+static void *rx_mmap_area;
#define PKT_PROT_LEN 64
@@ -147,6 +146,31 @@ static inline int is_xen_skb(struct sk_b
return (cp == skbuff_cachep);
}
+/*
+ * We can flip without copying the packet unless:
+ * 1. The data is not allocated from our special cache; or
+ * 2. The main data area is shared; or
+ * 3. One or more fragments are shared; or
+ * 4. There are chained fragments.
+ */
+static inline int is_flippable_skb(struct sk_buff *skb)
+{
+ int frag;
+
+ if (!is_xen_skb(skb) || skb_cloned(skb))
+ return 0;
+
+ for (frag = 0; frag < skb_shinfo(skb)->nr_frags; frag++) {
+ if (page_count(skb_shinfo(skb)->frags[frag].page) > 1)
+ return 0;
+ }
+
+ if (skb_shinfo(skb)->frag_list != NULL)
+ return 0;
+
+ return 1;
+}
+
static struct sk_buff *netbk_copy_skb(struct sk_buff *skb)
{
struct skb_shared_info *ninfo;
@@ -156,6 +180,8 @@ static struct sk_buff *netbk_copy_skb(st
int len;
int headlen;
+ BUG_ON(skb_shinfo(skb)->frag_list != NULL);
+
nskb = alloc_skb(SKB_MAX_HEAD(0), GFP_ATOMIC);
if (unlikely(!nskb))
goto err;
@@ -254,13 +280,11 @@ int netif_be_start_xmit(struct sk_buff *
goto drop;
}
- /*
- * We do not copy the packet unless:
- * 1. The data is shared; or
- * 2. The data is not allocated from our special cache.
- * 3. The data is fragmented.
- */
- if (skb_cloned(skb) || skb_is_nonlinear(skb) || !is_xen_skb(skb)) {
+ /* Copy the packet here if it's destined for a flipping
+ interface but isn't flippable (e.g. extra references to
+ data)
+ */
+ if (!netif->copying_receiver && !is_flippable_skb(skb)) {
struct sk_buff *nskb = netbk_copy_skb(skb);
if ( unlikely(nskb == NULL) )
goto drop;
@@ -306,7 +330,7 @@ static void xen_network_done_notify(void
/*
* Add following to poll() function in NAPI driver (Tigon3 is example):
* if ( xen_network_done() )
- * tg3_enable_ints(tp);
+ * tg3_enable_ints(tp);
*/
int xen_network_done(void)
{
@@ -314,66 +338,113 @@ int xen_network_done(void)
}
#endif
-static u16 netbk_gop_frag(netif_t *netif, struct page *page, int count, int i)
-{
- multicall_entry_t *mcl = rx_mcl + count;
- mmu_update_t *mmu = rx_mmu + count;
- gnttab_transfer_t *gop = grant_rx_op + count;
+struct netrx_pending_operations {
+ unsigned trans_prod, trans_cons;
+ unsigned mmu_prod, mmu_cons;
+ unsigned mcl_prod, mcl_cons;
+ unsigned copy_prod, copy_cons;
+ unsigned meta_prod, meta_cons;
+ mmu_update_t *mmu;
+ gnttab_transfer_t *trans;
+ gnttab_copy_t *copy;
+ multicall_entry_t *mcl;
+ struct netbk_rx_meta *meta;
+};
+
+/* Set up the grant operations for this fragment. If it's a flipping
+ interface, we also set up the unmap request from here. */
+static u16 netbk_gop_frag(netif_t *netif, struct netbk_rx_meta *meta,
+ int i, struct netrx_pending_operations *npo,
+ struct page *page, unsigned long size,
+ unsigned long offset)
+{
+ mmu_update_t *mmu;
+ gnttab_transfer_t *gop;
+ gnttab_copy_t *copy_gop;
+ multicall_entry_t *mcl;
netif_rx_request_t *req;
unsigned long old_mfn, new_mfn;
old_mfn = virt_to_mfn(page_address(page));
- if (!xen_feature(XENFEAT_auto_translated_physmap)) {
- new_mfn = alloc_mfn();
-
- /*
- * Set the new P2M table entry before reassigning
- * the old data page. Heed the comment in
- * pgtable-2level.h:pte_page(). :-)
- */
- set_phys_to_machine(page_to_pfn(page), new_mfn);
-
- MULTI_update_va_mapping(mcl, (unsigned long)page_address(page),
- pfn_pte_ma(new_mfn, PAGE_KERNEL), 0);
-
- mmu->ptr = ((maddr_t)new_mfn << PAGE_SHIFT) |
- MMU_MACHPHYS_UPDATE;
- mmu->val = page_to_pfn(page);
- }
-
req = RING_GET_REQUEST(&netif->rx, netif->rx.req_cons + i);
- gop->mfn = old_mfn;
- gop->domid = netif->domid;
- gop->ref = req->gref;
+ if (netif->copying_receiver) {
+ /* The fragment needs to be copied rather than
+ flipped. */
+ meta->copy = 1;
+ copy_gop = npo->copy + npo->copy_prod++;
+ copy_gop->source.domid = DOMID_SELF;
+ copy_gop->source.offset = offset;
+ copy_gop->source.u.gmfn = old_mfn;
+ copy_gop->dest.domid = netif->domid;
+ copy_gop->dest.offset = 0;
+ copy_gop->dest.u.ref = req->gref;
+ copy_gop->len = size;
+ copy_gop->flags = GNTCOPY_dest_gref;
+ } else {
+ meta->copy = 0;
+ if (!xen_feature(XENFEAT_auto_translated_physmap)) {
+ new_mfn = alloc_mfn();
+
+ /*
+ * Set the new P2M table entry before
+ * reassigning the old data page. Heed the
+ * comment in pgtable-2level.h:pte_page(). :-)
+ */
+ set_phys_to_machine(page_to_pfn(page), new_mfn);
+
+ mcl = npo->mcl + npo->mcl_prod++;
+ MULTI_update_va_mapping(mcl,
+ (unsigned long)page_address(page),
+ pfn_pte_ma(new_mfn, PAGE_KERNEL),
+ 0);
+
+ mmu = npo->mmu + npo->mmu_prod++;
+ mmu->ptr = ((maddr_t)new_mfn << PAGE_SHIFT) |
+ MMU_MACHPHYS_UPDATE;
+ mmu->val = page_to_pfn(page);
+ }
+
+ gop = npo->trans + npo->trans_prod++;
+ gop->mfn = old_mfn;
+ gop->domid = netif->domid;
+ gop->ref = req->gref;
+ }
return req->id;
}
-static void netbk_gop_skb(struct sk_buff *skb, struct netbk_rx_meta *meta,
- int count)
+static void netbk_gop_skb(struct sk_buff *skb,
+ struct netrx_pending_operations *npo)
{
netif_t *netif = netdev_priv(skb->dev);
int nr_frags = skb_shinfo(skb)->nr_frags;
int i;
int extra;
-
- meta[count].frag.page_offset = skb_shinfo(skb)->gso_type;
- meta[count].frag.size = skb_shinfo(skb)->gso_size;
- extra = !!meta[count].frag.size + 1;
+ struct netbk_rx_meta *head_meta, *meta;
+
+ head_meta = npo->meta + npo->meta_prod++;
+ head_meta->frag.page_offset = skb_shinfo(skb)->gso_type;
+ head_meta->frag.size = skb_shinfo(skb)->gso_size;
+ extra = !!head_meta->frag.size + 1;
for (i = 0; i < nr_frags; i++) {
- meta[++count].frag = skb_shinfo(skb)->frags[i];
- meta[count].id = netbk_gop_frag(netif, meta[count].frag.page,
- count, i + extra);
+ meta = npo->meta + npo->meta_prod++;
+ meta->frag = skb_shinfo(skb)->frags[i];
+ meta->id = netbk_gop_frag(netif, meta, i + extra, npo,
+ meta->frag.page,
+ meta->frag.size,
+ meta->frag.page_offset);
}
/*
* This must occur at the end to ensure that we don't trash
* skb_shinfo until we're done.
*/
- meta[count - nr_frags].id = netbk_gop_frag(netif,
- virt_to_page(skb->data),
- count - nr_frags, 0);
+ head_meta->id = netbk_gop_frag(netif, head_meta, 0, npo,
+ virt_to_page(skb->data),
+ skb_headlen(skb),
+ offset_in_page(skb->data));
+
netif->rx.req_cons += nr_frags + extra;
}
@@ -385,32 +456,48 @@ static inline void netbk_free_pages(int
put_page(meta[i].frag.page);
}
-static int netbk_check_gop(int nr_frags, domid_t domid, int count)
-{
- multicall_entry_t *mcl = rx_mcl + count;
- gnttab_transfer_t *gop = grant_rx_op + count;
+/* This is a twin to netbk_gop_skb. Assume that netbk_gop_skb was
+ used to set up the operations on the top of
+ netrx_pending_operations, which have since been done. Check that
+ they didn't give any errors and advance over them. */
+static int netbk_check_gop(int nr_frags, domid_t domid,
+ struct netrx_pending_operations *npo)
+{
+ multicall_entry_t *mcl;
+ gnttab_transfer_t *gop;
+ gnttab_copy_t *copy_op;
int status = NETIF_RSP_OKAY;
int i;
for (i = 0; i <= nr_frags; i++) {
- if (!xen_feature(XENFEAT_auto_translated_physmap)) {
- /* The update_va_mapping() must not fail. */
- BUG_ON(mcl->result != 0);
- mcl++;
- }
-
- /* Check the reassignment error code. */
- if (gop->status != 0) {
- DPRINTK("Bad status %d from grant transfer to DOM%u\n",
- gop->status, domid);
- /*
- * Page no longer belongs to us unless GNTST_bad_page,
- * but that should be a fatal error anyway.
- */
- BUG_ON(gop->status == GNTST_bad_page);
- status = NETIF_RSP_ERROR;
- }
- gop++;
+ if (npo->meta[npo->meta_cons + i].copy) {
+ copy_op = npo->copy + npo->copy_cons++;
+ if (copy_op->status != GNTST_okay) {
+ DPRINTK("Bad status %d from copy to DOM%d.\n",
+ gop->status, domid);
+ status = NETIF_RSP_ERROR;
+ }
+ } else {
+ if (!xen_feature(XENFEAT_auto_translated_physmap)) {
+ mcl = npo->mcl + npo->mcl_cons++;
+ /* The update_va_mapping() must not fail. */
+ BUG_ON(mcl->result != 0);
+ }
+
+ gop = npo->trans + npo->trans_cons++;
+ /* Check the reassignment error code. */
+ if (gop->status != 0) {
+ DPRINTK("Bad status %d from grant transfer to
DOM%u\n",
+ gop->status, domid);
+ /*
+ * Page no longer belongs to us unless
+ * GNTST_bad_page, but that should be
+ * a fatal error anyway.
+ */
+ BUG_ON(gop->status == GNTST_bad_page);
+ status = NETIF_RSP_ERROR;
+ }
+ }
}
return status;
@@ -420,23 +507,27 @@ static void netbk_add_frag_responses(net
struct netbk_rx_meta *meta, int nr_frags)
{
int i;
+ unsigned long offset;
for (i = 0; i < nr_frags; i++) {
int id = meta[i].id;
int flags = (i == nr_frags - 1) ? 0 : NETRXF_more_data;
- make_rx_response(netif, id, status, meta[i].frag.page_offset,
+ if (meta[i].copy)
+ offset = 0;
+ else
+ offset = meta[i].frag.page_offset;
+ make_rx_response(netif, id, status, offset,
meta[i].frag.size, flags);
}
}
static void net_rx_action(unsigned long unused)
{
- netif_t *netif = NULL;
+ netif_t *netif = NULL;
s8 status;
u16 id, irq, flags;
netif_rx_response_t *resp;
- struct netif_extra_info *extra;
multicall_entry_t *mcl;
struct sk_buff_head rxq;
struct sk_buff *skb;
@@ -444,13 +535,26 @@ static void net_rx_action(unsigned long
int ret;
int nr_frags;
int count;
+ unsigned long offset;
/*
* Putting hundreds of bytes on the stack is considered rude.
* Static works because a tasklet can only be on one CPU at any time.
*/
+ static multicall_entry_t rx_mcl[NET_RX_RING_SIZE+3];
+ static mmu_update_t rx_mmu[NET_RX_RING_SIZE];
+ static gnttab_transfer_t grant_trans_op[NET_RX_RING_SIZE];
+ static gnttab_copy_t grant_copy_op[NET_RX_RING_SIZE];
+ static unsigned char rx_notify[NR_IRQS];
static u16 notify_list[NET_RX_RING_SIZE];
static struct netbk_rx_meta meta[NET_RX_RING_SIZE];
+
+ struct netrx_pending_operations npo = {
+ mmu: rx_mmu,
+ trans: grant_trans_op,
+ copy: grant_copy_op,
+ mcl: rx_mcl,
+ meta: meta};
skb_queue_head_init(&rxq);
@@ -471,7 +575,7 @@ static void net_rx_action(unsigned long
break;
}
- netbk_gop_skb(skb, meta, count);
+ netbk_gop_skb(skb, &npo);
count += nr_frags + 1;
@@ -482,43 +586,74 @@ static void net_rx_action(unsigned long
break;
}
- if (!count)
- return;
-
- if (!xen_feature(XENFEAT_auto_translated_physmap)) {
- mcl = rx_mcl + count;
-
+ if (npo.mcl_prod &&
+ !xen_feature(XENFEAT_auto_translated_physmap)) {
+ mcl = npo.mcl + npo.mcl_prod++;
+
+ BUG_ON(mcl[-1].op != __HYPERVISOR_update_va_mapping);
mcl[-1].args[MULTI_UVMFLAGS_INDEX] = UVMF_TLB_FLUSH|UVMF_ALL;
mcl->op = __HYPERVISOR_mmu_update;
mcl->args[0] = (unsigned long)rx_mmu;
- mcl->args[1] = count;
+ mcl->args[1] = npo.mmu_prod;
mcl->args[2] = 0;
mcl->args[3] = DOMID_SELF;
-
- ret = HYPERVISOR_multicall(rx_mcl, count + 1);
- BUG_ON(ret != 0);
- }
-
- ret = HYPERVISOR_grant_table_op(GNTTABOP_transfer, grant_rx_op, count);
+ }
+
+ if (npo.trans_prod) {
+ mcl = npo.mcl + npo.mcl_prod++;
+ mcl->op = __HYPERVISOR_grant_table_op;
+ mcl->args[0] = GNTTABOP_transfer;
+ mcl->args[1] = (unsigned long)grant_trans_op;
+ mcl->args[2] = npo.trans_prod;
+ }
+
+ if (npo.copy_prod) {
+ mcl = npo.mcl + npo.mcl_prod++;
+ mcl->op = __HYPERVISOR_grant_table_op;
+ mcl->args[0] = GNTTABOP_copy;
+ mcl->args[1] = (unsigned long)grant_copy_op;
+ mcl->args[2] = npo.copy_prod;
+ }
+
+ /* Nothing to do? */
+ if (!npo.mcl_prod)
+ return;
+
+ BUG_ON(npo.copy_prod > NET_RX_RING_SIZE);
+ BUG_ON(npo.mmu_prod > NET_RX_RING_SIZE);
+ BUG_ON(npo.trans_prod > NET_RX_RING_SIZE);
+ BUG_ON(npo.mcl_prod > NET_RX_RING_SIZE+3);
+ BUG_ON(npo.meta_prod > NET_RX_RING_SIZE);
+
+ ret = HYPERVISOR_multicall(npo.mcl, npo.mcl_prod);
BUG_ON(ret != 0);
- count = 0;
while ((skb = __skb_dequeue(&rxq)) != NULL) {
nr_frags = *(int *)skb->cb;
- atomic_set(&(skb_shinfo(skb)->dataref), 1);
- skb_shinfo(skb)->nr_frags = 0;
- skb_shinfo(skb)->frag_list = NULL;
-
netif = netdev_priv(skb->dev);
+ /* We can't rely on skb_release_data to release the
+ pages used by fragments for us, since it tries to
+ touch the pages in the fraglist. If we're in
+ flipping mode, that doesn't work. In copying mode,
+ we still have access to all of the pages, and so
+ it's safe to let release_data deal with it. */
+ /* (Freeing the fragments is safe since we copy
+ non-linear skbs destined for flipping interfaces) */
+ if (!netif->copying_receiver) {
+ atomic_set(&(skb_shinfo(skb)->dataref), 1);
+ skb_shinfo(skb)->frag_list = NULL;
+ skb_shinfo(skb)->nr_frags = 0;
+ netbk_free_pages(nr_frags, meta + npo.meta_cons + 1);
+ }
+
netif->stats.tx_bytes += skb->len;
netif->stats.tx_packets++;
- netbk_free_pages(nr_frags, meta + count + 1);
- status = netbk_check_gop(nr_frags, netif->domid, count);
-
- id = meta[count].id;
+ status = netbk_check_gop(nr_frags, netif->domid, &npo);
+
+ id = meta[npo.meta_cons].id;
flags = nr_frags ? NETRXF_more_data : 0;
if (skb->ip_summed == CHECKSUM_HW) /* local packet? */
@@ -526,34 +661,32 @@ static void net_rx_action(unsigned long
else if (skb->proto_data_valid) /* remote but checksummed? */
flags |= NETRXF_data_validated;
- resp = make_rx_response(netif, id, status,
- offset_in_page(skb->data),
+ if (meta[npo.meta_cons].copy)
+ offset = 0;
+ else
+ offset = offset_in_page(skb->data);
+ resp = make_rx_response(netif, id, status, offset,
skb_headlen(skb), flags);
- extra = NULL;
-
- if (meta[count].frag.size) {
+ if (meta[npo.meta_cons].frag.size) {
struct netif_extra_info *gso =
(struct netif_extra_info *)
RING_GET_RESPONSE(&netif->rx,
netif->rx.rsp_prod_pvt++);
- if (extra)
- extra->flags |= XEN_NETIF_EXTRA_FLAG_MORE;
- else
- resp->flags |= NETRXF_extra_info;
-
- gso->u.gso.size = meta[count].frag.size;
+ resp->flags |= NETRXF_extra_info;
+
+ gso->u.gso.size = meta[npo.meta_cons].frag.size;
gso->u.gso.type = XEN_NETIF_GSO_TYPE_TCPV4;
gso->u.gso.pad = 0;
gso->u.gso.features = 0;
gso->type = XEN_NETIF_EXTRA_TYPE_GSO;
gso->flags = 0;
- extra = gso;
- }
-
- netbk_add_frag_responses(netif, status, meta + count + 1,
+ }
+
+ netbk_add_frag_responses(netif, status,
+ meta + npo.meta_cons + 1,
nr_frags);
RING_PUSH_RESPONSES_AND_CHECK_NOTIFY(&netif->rx, ret);
@@ -569,7 +702,7 @@ static void net_rx_action(unsigned long
netif_put(netif);
dev_kfree_skb(skb);
- count += nr_frags + 1;
+ npo.meta_cons += nr_frags + 1;
}
while (notify_nr != 0) {
@@ -1029,7 +1162,7 @@ static void net_tx_action(unsigned long
if (unlikely(txreq.size < ETH_HLEN)) {
DPRINTK("Bad packet size: %d\n", txreq.size);
netbk_tx_err(netif, &txreq, i);
- continue;
+ continue;
}
/* No crossing a page as the payload mustn't fragment. */
@@ -1085,6 +1218,9 @@ static void net_tx_action(unsigned long
skb_shinfo(skb)->nr_frags++;
skb_shinfo(skb)->frags[0].page =
(void *)(unsigned long)pending_idx;
+ } else {
+ /* Discriminate from any valid pending_idx value. */
+ skb_shinfo(skb)->frags[0].page = (void *)~0UL;
}
__skb_queue_tail(&tx_queue, skb);
@@ -1185,6 +1321,12 @@ static void netif_page_release(struct pa
set_page_count(page, 1);
netif_idx_release(pending_idx);
+}
+
+static void netif_rx_page_release(struct page *page)
+{
+ /* Ready for next use. */
+ set_page_count(page, 1);
}
irqreturn_t netif_be_int(int irq, void *dev_id, struct pt_regs *regs)
@@ -1317,6 +1459,16 @@ static int __init netback_init(void)
SetPageForeign(page, netif_page_release);
}
+ page = balloon_alloc_empty_page_range(NET_RX_RING_SIZE);
+ BUG_ON(page == NULL);
+ rx_mmap_area = pfn_to_kaddr(page_to_pfn(page));
+
+ for (i = 0; i < NET_RX_RING_SIZE; i++) {
+ page = virt_to_page(rx_mmap_area + (i * PAGE_SIZE));
+ set_page_count(page, 1);
+ SetPageForeign(page, netif_rx_page_release);
+ }
+
pending_cons = 0;
pending_prod = MAX_PENDING_REQS;
for (i = 0; i < MAX_PENDING_REQS; i++)
diff -r 91169603a8e8 -r 79afceca9065
linux-2.6-xen-sparse/drivers/xen/netback/xenbus.c
--- a/linux-2.6-xen-sparse/drivers/xen/netback/xenbus.c Tue Aug 22 14:45:49
2006 -0600
+++ b/linux-2.6-xen-sparse/drivers/xen/netback/xenbus.c Wed Aug 23 11:11:27
2006 -0600
@@ -108,6 +108,12 @@ static int netback_probe(struct xenbus_d
goto abort_transaction;
}
+ err = xenbus_printf(xbt, dev->nodename, "feature-rx-copy",
"%d", 1);
+ if (err) {
+ message = "writing feature-copying";
+ goto abort_transaction;
+ }
+
err = xenbus_transaction_end(xbt, 0);
} while (err == -EAGAIN);
@@ -228,10 +234,25 @@ static void frontend_changed(struct xenb
switch (frontend_state) {
case XenbusStateInitialising:
+ if (dev->state == XenbusStateClosing) {
+ printk("%s: %s: prepare for reconnect\n",
+ __FUNCTION__, dev->nodename);
+ if (be->netif) {
+ netif_disconnect(be->netif);
+ be->netif = NULL;
+ }
+ xenbus_switch_state(dev, XenbusStateInitWait);
+ }
+ break;
+
case XenbusStateInitialised:
break;
case XenbusStateConnected:
+ if (!be->netif) {
+ /* reconnect: setup be->netif */
+ backend_changed(&be->backend_watch, NULL, 0);
+ }
maybe_connect(be);
break;
@@ -239,14 +260,13 @@ static void frontend_changed(struct xenb
xenbus_switch_state(dev, XenbusStateClosing);
break;
+ case XenbusStateUnknown:
case XenbusStateClosed:
if (be->netif != NULL)
kobject_uevent(&dev->dev.kobj, KOBJ_OFFLINE);
device_unregister(&dev->dev);
break;
- case XenbusStateUnknown:
- case XenbusStateInitWait:
default:
xenbus_dev_fatal(dev, -EINVAL, "saw state %d at frontend",
frontend_state);
@@ -349,7 +369,7 @@ static int connect_rings(struct backend_
{
struct xenbus_device *dev = be->dev;
unsigned long tx_ring_ref, rx_ring_ref;
- unsigned int evtchn;
+ unsigned int evtchn, rx_copy;
int err;
int val;
@@ -365,6 +385,19 @@ static int connect_rings(struct backend_
dev->otherend);
return err;
}
+
+ err = xenbus_scanf(XBT_NIL, dev->otherend, "request-rx-copy", "%u",
+ &rx_copy);
+ if (err == -ENOENT) {
+ err = 0;
+ rx_copy = 0;
+ }
+ if (err < 0) {
+ xenbus_dev_fatal(dev, err, "reading %s/request-rx-copy",
+ dev->otherend);
+ return err;
+ }
+ be->netif->copying_receiver = !!rx_copy;
if (xenbus_scanf(XBT_NIL, dev->otherend, "feature-rx-notify", "%d",
&val) < 0)
diff -r 91169603a8e8 -r 79afceca9065
linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c
--- a/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c Tue Aug 22
14:45:49 2006 -0600
+++ b/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c Wed Aug 23
11:11:27 2006 -0600
@@ -58,12 +58,27 @@
#include <xen/interface/memory.h>
#include <xen/balloon.h>
#include <asm/page.h>
+#include <asm/maddr.h>
#include <asm/uaccess.h>
#include <xen/interface/grant_table.h>
#include <xen/gnttab.h>
#define RX_COPY_THRESHOLD 256
+/* If we don't have GSO, fake things up so that we never try to use it. */
+#ifndef NETIF_F_GSO
+#define netif_needs_gso(dev, skb) 0
+#define dev_disable_gso_features(dev) ((void)0)
+#else
+#define HAVE_GSO 1
+static inline void dev_disable_gso_features(struct net_device *dev)
+{
+ /* Turn off all GSO bits except ROBUST. */
+ dev->features &= (1 << NETIF_F_GSO_SHIFT) - 1;
+ dev->features |= NETIF_F_GSO_ROBUST;
+}
+#endif
+
#define GRANT_INVALID_REF 0
#define NET_TX_RING_SIZE __RING_SIZE((struct netif_tx_sring *)0, PAGE_SIZE)
@@ -83,6 +98,7 @@ struct netfront_info {
unsigned int handle;
unsigned int evtchn, irq;
+ unsigned int copying_receiver;
/* Receive-ring batched refills. */
#define RX_MIN_TARGET 8
@@ -171,7 +187,7 @@ static inline grant_ref_t xennet_get_rx_
static int talk_to_backend(struct xenbus_device *, struct netfront_info *);
static int setup_device(struct xenbus_device *, struct netfront_info *);
-static struct net_device *create_netdev(int, struct xenbus_device *);
+static struct net_device *create_netdev(int, int, struct xenbus_device *);
static void netfront_closing(struct xenbus_device *);
@@ -213,6 +229,7 @@ static int __devinit netfront_probe(stru
struct net_device *netdev;
struct netfront_info *info;
unsigned int handle;
+ unsigned feature_rx_copy;
err = xenbus_scanf(XBT_NIL, dev->nodename, "handle", "%u", &handle);
if (err != 1) {
@@ -220,7 +237,22 @@ static int __devinit netfront_probe(stru
return err;
}
- netdev = create_netdev(handle, dev);
+#ifndef CONFIG_XEN
+ err = xenbus_scanf(XBT_NIL, dev->otherend, "feature-rx-copy", "%u",
+ &feature_rx_copy);
+ if (err != 1) {
+ xenbus_dev_fatal(dev, err, "reading feature-rx-copy");
+ return err;
+ }
+ if (!feature_rx_copy) {
+ xenbus_dev_fatal(dev, 0, "need a copy-capable backend");
+ return -EINVAL;
+ }
+#else
+ feature_rx_copy = 0;
+#endif
+
+ netdev = create_netdev(handle, feature_rx_copy, dev);
if (IS_ERR(netdev)) {
err = PTR_ERR(netdev);
xenbus_dev_fatal(dev, err, "creating netdev");
@@ -326,6 +358,13 @@ again:
goto abort_transaction;
}
+ err = xenbus_printf(xbt, dev->nodename, "request-rx-copy", "%u",
+ info->copying_receiver);
+ if (err) {
+ message = "writing request-rx-copy";
+ goto abort_transaction;
+ }
+
err = xenbus_printf(xbt, dev->nodename, "feature-rx-notify", "%d", 1);
if (err) {
message = "writing feature-rx-notify";
@@ -338,11 +377,13 @@ again:
goto abort_transaction;
}
+#ifdef HAVE_GSO
err = xenbus_printf(xbt, dev->nodename, "feature-gso-tcpv4", "%d", 1);
if (err) {
message = "writing feature-gso-tcpv4";
goto abort_transaction;
}
+#endif
err = xenbus_transaction_end(xbt, 0);
if (err) {
@@ -415,7 +456,8 @@ static int setup_device(struct xenbus_de
memcpy(netdev->dev_addr, info->mac, ETH_ALEN);
err = bind_evtchn_to_irqhandler(info->evtchn, netif_int,
- SA_SAMPLE_RANDOM, netdev->name, netdev);
+ SA_SAMPLE_RANDOM, netdev->name,
+ netdev);
if (err < 0)
goto fail;
info->irq = err;
@@ -494,11 +536,14 @@ static int network_open(struct net_devic
memset(&np->stats, 0, sizeof(np->stats));
- network_alloc_rx_buffers(dev);
- np->rx.sring->rsp_event = np->rx.rsp_cons + 1;
-
- if (RING_HAS_UNCONSUMED_RESPONSES(&np->rx))
- netif_rx_schedule(dev);
+ spin_lock(&np->rx_lock);
+ if (netif_carrier_ok(dev)) {
+ network_alloc_rx_buffers(dev);
+ np->rx.sring->rsp_event = np->rx.rsp_cons + 1;
+ if (RING_HAS_UNCONSUMED_RESPONSES(&np->rx))
+ netif_rx_schedule(dev);
+ }
+ spin_unlock(&np->rx_lock);
netif_start_queue(dev);
@@ -527,8 +572,7 @@ static void network_tx_buf_gc(struct net
struct netfront_info *np = netdev_priv(dev);
struct sk_buff *skb;
- if (unlikely(!netif_carrier_ok(dev)))
- return;
+ BUG_ON(!netif_carrier_ok(dev));
do {
prod = np->tx.sring->rsp_prod;
@@ -597,6 +641,8 @@ static void network_alloc_rx_buffers(str
grant_ref_t ref;
unsigned long pfn;
void *vaddr;
+ int nr_flips;
+ netif_rx_request_t *req;
if (unlikely(!netif_carrier_ok(dev)))
return;
@@ -609,9 +655,14 @@ static void network_alloc_rx_buffers(str
*/
batch_target = np->rx_target - (req_prod - np->rx.rsp_cons);
for (i = skb_queue_len(&np->rx_batch); i < batch_target; i++) {
- /* Allocate an skb and a page. */
- skb = __dev_alloc_skb(RX_COPY_THRESHOLD,
- GFP_ATOMIC | __GFP_NOWARN);
+ /*
+ * Allocate an skb and a page. Do not use __dev_alloc_skb as
+ * that will allocate page-sized buffers which is not
+ * necessary here.
+ * 16 bytes added as necessary headroom for netif_receive_skb.
+ */
+ skb = alloc_skb(RX_COPY_THRESHOLD + 16,
+ GFP_ATOMIC | __GFP_NOWARN);
if (unlikely(!skb))
goto no_skb;
@@ -628,6 +679,7 @@ no_skb:
break;
}
+ skb_reserve(skb, 16); /* mimic dev_alloc_skb() */
skb_shinfo(skb)->frags[0].page = page;
skb_shinfo(skb)->nr_frags = 1;
__skb_queue_tail(&np->rx_batch, skb);
@@ -646,7 +698,7 @@ no_skb:
np->rx_target = np->rx_max_target;
refill:
- for (i = 0; ; i++) {
+ for (nr_flips = i = 0; ; i++) {
if ((skb = __skb_dequeue(&np->rx_batch)) == NULL)
break;
@@ -657,7 +709,6 @@ no_skb:
BUG_ON(np->rx_skbs[id]);
np->rx_skbs[id] = skb;
- RING_GET_REQUEST(&np->rx, req_prod + i)->id = id;
ref = gnttab_claim_grant_reference(&np->gref_rx_head);
BUG_ON((signed short)ref < 0);
np->grant_rx_ref[id] = ref;
@@ -665,49 +716,68 @@ no_skb:
pfn = page_to_pfn(skb_shinfo(skb)->frags[0].page);
vaddr = page_address(skb_shinfo(skb)->frags[0].page);
- gnttab_grant_foreign_transfer_ref(ref,
- np->xbdev->otherend_id, pfn);
- RING_GET_REQUEST(&np->rx, req_prod + i)->gref = ref;
- np->rx_pfn_array[i] = pfn_to_mfn(pfn);
+ req = RING_GET_REQUEST(&np->rx, req_prod + i);
+ if (!np->copying_receiver) {
+ gnttab_grant_foreign_transfer_ref(ref,
+
np->xbdev->otherend_id,
+ pfn);
+ np->rx_pfn_array[nr_flips] = pfn_to_mfn(pfn);
+ if (!xen_feature(XENFEAT_auto_translated_physmap)) {
+ /* Remove this page before passing
+ * back to Xen. */
+ set_phys_to_machine(pfn, INVALID_P2M_ENTRY);
+ MULTI_update_va_mapping(np->rx_mcl+i,
+ (unsigned long)vaddr,
+ __pte(0), 0);
+ }
+ nr_flips++;
+ } else {
+ gnttab_grant_foreign_access_ref(ref,
+ np->xbdev->otherend_id,
+ pfn,
+ 0);
+ }
+
+ req->id = id;
+ req->gref = ref;
+ }
+
+ if ( nr_flips != 0 ) {
+ /* Tell the ballon driver what is going on. */
+ balloon_update_driver_allowance(i);
+
+ set_xen_guest_handle(reservation.extent_start,
+ np->rx_pfn_array);
+ reservation.nr_extents = nr_flips;
+ reservation.extent_order = 0;
+ reservation.address_bits = 0;
+ reservation.domid = DOMID_SELF;
if (!xen_feature(XENFEAT_auto_translated_physmap)) {
- /* Remove this page before passing back to Xen. */
- set_phys_to_machine(pfn, INVALID_P2M_ENTRY);
- MULTI_update_va_mapping(np->rx_mcl+i,
- (unsigned long)vaddr,
- __pte(0), 0);
+ /* After all PTEs have been zapped, flush the TLB. */
+ np->rx_mcl[i-1].args[MULTI_UVMFLAGS_INDEX] =
+ UVMF_TLB_FLUSH|UVMF_ALL;
+
+ /* Give away a batch of pages. */
+ np->rx_mcl[i].op = __HYPERVISOR_memory_op;
+ np->rx_mcl[i].args[0] = XENMEM_decrease_reservation;
+ np->rx_mcl[i].args[1] = (unsigned long)&reservation;
+
+ /* Zap PTEs and give away pages in one big
+ * multicall. */
+ (void)HYPERVISOR_multicall(np->rx_mcl, i+1);
+
+ /* Check return status of HYPERVISOR_memory_op(). */
+ if (unlikely(np->rx_mcl[i].result != i))
+ panic("Unable to reduce memory reservation\n");
+ } else {
+ if (HYPERVISOR_memory_op(XENMEM_decrease_reservation,
+ &reservation) != i)
+ panic("Unable to reduce memory reservation\n");
}
- }
-
- /* Tell the ballon driver what is going on. */
- balloon_update_driver_allowance(i);
-
- set_xen_guest_handle(reservation.extent_start, np->rx_pfn_array);
- reservation.nr_extents = i;
- reservation.extent_order = 0;
- reservation.address_bits = 0;
- reservation.domid = DOMID_SELF;
-
- if (!xen_feature(XENFEAT_auto_translated_physmap)) {
- /* After all PTEs have been zapped, flush the TLB. */
- np->rx_mcl[i-1].args[MULTI_UVMFLAGS_INDEX] =
- UVMF_TLB_FLUSH|UVMF_ALL;
-
- /* Give away a batch of pages. */
- np->rx_mcl[i].op = __HYPERVISOR_memory_op;
- np->rx_mcl[i].args[0] = XENMEM_decrease_reservation;
- np->rx_mcl[i].args[1] = (unsigned long)&reservation;
-
- /* Zap PTEs and give away pages in one big multicall. */
- (void)HYPERVISOR_multicall(np->rx_mcl, i+1);
-
- /* Check return status of HYPERVISOR_memory_op(). */
- if (unlikely(np->rx_mcl[i].result != i))
- panic("Unable to reduce memory reservation\n");
- } else
- if (HYPERVISOR_memory_op(XENMEM_decrease_reservation,
- &reservation) != i)
- panic("Unable to reduce memory reservation\n");
+ } else {
+ wmb();
+ }
/* Above is a suitable barrier to ensure backend will see requests. */
np->rx.req_prod_pvt = req_prod + i;
@@ -834,9 +904,12 @@ static int network_start_xmit(struct sk_
if (skb->ip_summed == CHECKSUM_HW) /* local packet? */
tx->flags |= NETTXF_csum_blank | NETTXF_data_validated;
+#ifdef CONFIG_XEN
if (skb->proto_data_valid) /* remote but checksummed? */
tx->flags |= NETTXF_data_validated;
-
+#endif
+
+#ifdef HAVE_GSO
if (skb_shinfo(skb)->gso_size) {
struct netif_extra_info *gso = (struct netif_extra_info *)
RING_GET_REQUEST(&np->tx, ++i);
@@ -855,6 +928,7 @@ static int network_start_xmit(struct sk_
gso->flags = 0;
extra = gso;
}
+#endif
np->tx.req_prod_pvt = i + 1;
@@ -890,12 +964,15 @@ static irqreturn_t netif_int(int irq, vo
unsigned long flags;
spin_lock_irqsave(&np->tx_lock, flags);
- network_tx_buf_gc(dev);
+
+ if (likely(netif_carrier_ok(dev))) {
+ network_tx_buf_gc(dev);
+ /* Under tx_lock: protects access to rx shared-ring indexes. */
+ if (RING_HAS_UNCONSUMED_RESPONSES(&np->rx))
+ netif_rx_schedule(dev);
+ }
+
spin_unlock_irqrestore(&np->tx_lock, flags);
-
- if (RING_HAS_UNCONSUMED_RESPONSES(&np->rx) &&
- likely(netif_running(dev)))
- netif_rx_schedule(dev);
return IRQ_HANDLED;
}
@@ -941,8 +1018,10 @@ int xennet_get_extras(struct netfront_in
WPRINTK("Invalid extra type: %d\n",
extra->type);
err = -EINVAL;
- } else
- memcpy(&extras[extra->type - 1], extra, sizeof(*extra));
+ } else {
+ memcpy(&extras[extra->type - 1], extra,
+ sizeof(*extra));
+ }
skb = xennet_get_rx_skb(np, cons);
ref = xennet_get_rx_ref(np, cons);
@@ -955,10 +1034,12 @@ int xennet_get_extras(struct netfront_in
static int xennet_get_responses(struct netfront_info *np,
struct netfront_rx_info *rinfo, RING_IDX rp,
- struct sk_buff_head *list, int count)
-{
- struct mmu_update *mmu = np->rx_mmu + count;
- struct multicall_entry *mcl = np->rx_mcl + count;
+ struct sk_buff_head *list,
+ int *pages_flipped_p)
+{
+ int pages_flipped = *pages_flipped_p;
+ struct mmu_update *mmu;
+ struct multicall_entry *mcl;
struct netif_rx_response *rx = &rinfo->rx;
struct netif_extra_info *extras = rinfo->extras;
RING_IDX cons = np->rx.rsp_cons;
@@ -967,6 +1048,7 @@ static int xennet_get_responses(struct n
int max = MAX_SKB_FRAGS + (rx->status <= RX_COPY_THRESHOLD);
int frags = 1;
int err = 0;
+ unsigned long ret;
if (rx->flags & NETRXF_extra_info) {
err = xennet_get_extras(np, extras, rp);
@@ -982,6 +1064,7 @@ static int xennet_get_responses(struct n
WPRINTK("rx->offset: %x, size: %u\n",
rx->offset, rx->status);
err = -EINVAL;
+ goto next;
}
/*
@@ -995,35 +1078,47 @@ static int xennet_get_responses(struct n
goto next;
}
- /* Memory pressure, insufficient buffer headroom, ... */
- if ((mfn = gnttab_end_foreign_transfer_ref(ref)) == 0) {
- if (net_ratelimit())
- WPRINTK("Unfulfilled rx req (id=%d, st=%d).\n",
- rx->id, rx->status);
- xennet_move_rx_slot(np, skb, ref);
- err = -ENOMEM;
- goto next;
+ if (!np->copying_receiver) {
+ /* Memory pressure, insufficient buffer
+ * headroom, ... */
+ if (!(mfn = gnttab_end_foreign_transfer_ref(ref))) {
+ if (net_ratelimit())
+ WPRINTK("Unfulfilled rx req "
+ "(id=%d, st=%d).\n",
+ rx->id, rx->status);
+ xennet_move_rx_slot(np, skb, ref);
+ err = -ENOMEM;
+ goto next;
+ }
+
+ if (!xen_feature(XENFEAT_auto_translated_physmap)) {
+ /* Remap the page. */
+ struct page *page =
+ skb_shinfo(skb)->frags[0].page;
+ unsigned long pfn = page_to_pfn(page);
+ void *vaddr = page_address(page);
+
+ mcl = np->rx_mcl + pages_flipped;
+ mmu = np->rx_mmu + pages_flipped;
+
+ MULTI_update_va_mapping(mcl,
+ (unsigned long)vaddr,
+ pfn_pte_ma(mfn,
+ PAGE_KERNEL),
+ 0);
+ mmu->ptr = ((maddr_t)mfn << PAGE_SHIFT)
+ | MMU_MACHPHYS_UPDATE;
+ mmu->val = pfn;
+
+ set_phys_to_machine(pfn, mfn);
+ }
+ pages_flipped++;
+ } else {
+ ret = gnttab_end_foreign_access_ref(ref, 0);
+ BUG_ON(!ret);
}
gnttab_release_grant_reference(&np->gref_rx_head, ref);
-
- if (!xen_feature(XENFEAT_auto_translated_physmap)) {
- /* Remap the page. */
- struct page *page = skb_shinfo(skb)->frags[0].page;
- unsigned long pfn = page_to_pfn(page);
- void *vaddr = page_address(page);
-
- MULTI_update_va_mapping(mcl, (unsigned long)vaddr,
- pfn_pte_ma(mfn, PAGE_KERNEL),
- 0);
- mcl++;
- mmu->ptr = ((maddr_t)mfn << PAGE_SHIFT)
- | MMU_MACHPHYS_UPDATE;
- mmu->val = pfn;
- mmu++;
-
- set_phys_to_machine(pfn, mfn);
- }
__skb_queue_tail(list, skb);
@@ -1050,6 +1145,8 @@ next:
err = -E2BIG;
}
+ *pages_flipped_p = pages_flipped;
+
return err;
}
@@ -1084,7 +1181,8 @@ static RING_IDX xennet_fill_frags(struct
return cons;
}
-static int xennet_set_skb_gso(struct sk_buff *skb, struct netif_extra_info
*gso)
+static int xennet_set_skb_gso(struct sk_buff *skb,
+ struct netif_extra_info *gso)
{
if (!gso->u.gso.size) {
if (net_ratelimit())
@@ -1099,6 +1197,7 @@ static int xennet_set_skb_gso(struct sk_
return -EINVAL;
}
+#ifdef HAVE_GSO
skb_shinfo(skb)->gso_size = gso->u.gso.size;
skb_shinfo(skb)->gso_type = SKB_GSO_TCPV4;
@@ -1107,6 +1206,11 @@ static int xennet_set_skb_gso(struct sk_
skb_shinfo(skb)->gso_segs = 0;
return 0;
+#else
+ if (net_ratelimit())
+ WPRINTK("GSO unsupported by this kernel.\n");
+ return -EINVAL;
+#endif
}
static int netif_poll(struct net_device *dev, int *pbudget)
@@ -1124,7 +1228,7 @@ static int netif_poll(struct net_device
struct sk_buff_head tmpq;
unsigned long flags;
unsigned int len;
- int pages_done;
+ int pages_flipped = 0;
int err;
spin_lock(&np->rx_lock);
@@ -1143,14 +1247,14 @@ static int netif_poll(struct net_device
rp = np->rx.sring->rsp_prod;
rmb(); /* Ensure we see queued responses up to 'rp'. */
- for (i = np->rx.rsp_cons, work_done = 0, pages_done = 0;
+ for (i = np->rx.rsp_cons, work_done = 0;
(i != rp) && (work_done < budget);
np->rx.rsp_cons = ++i, work_done++) {
memcpy(rx, RING_GET_RESPONSE(&np->rx, i), sizeof(*rx));
memset(extras, 0, sizeof(extras));
- err = xennet_get_responses(np, &rinfo, rp, &tmpq, pages_done);
- pages_done += skb_queue_len(&tmpq);
+ err = xennet_get_responses(np, &rinfo, rp, &tmpq,
+ &pages_flipped);
if (unlikely(err)) {
err:
@@ -1193,40 +1297,63 @@ err:
}
i = xennet_fill_frags(np, skb, &tmpq);
- skb->truesize += skb->data_len;
+
+ /*
+ * Truesize must approximates the size of true data plus
+ * any supervisor overheads. Adding hypervisor overheads
+ * has been shown to significantly reduce achievable
+ * bandwidth with the default receive buffer size. It is
+ * therefore not wise to account for it here.
+ *
+ * After alloc_skb(RX_COPY_THRESHOLD), truesize is set to
+ * RX_COPY_THRESHOLD + the supervisor overheads. Here, we
+ * add the size of the data pulled in xennet_fill_frags().
+ *
+ * We also adjust for any unused space in the main data
+ * area by subtracting (RX_COPY_THRESHOLD - len). This is
+ * especially important with drivers which split incoming
+ * packets into header and data, using only 66 bytes of
+ * the main data area (see the e1000 driver for example.)
+ * On such systems, without this last adjustement, our
+ * achievable receive throughout using the standard receive
+ * buffer size was cut by 25%(!!!).
+ */
+ skb->truesize += skb->data_len - (RX_COPY_THRESHOLD - len);
skb->len += skb->data_len;
/*
* Old backends do not assert data_validated but we
* can infer it from csum_blank so test both flags.
*/
- if (rx->flags & (NETRXF_data_validated|NETRXF_csum_blank)) {
+ if (rx->flags & (NETRXF_data_validated|NETRXF_csum_blank))
skb->ip_summed = CHECKSUM_UNNECESSARY;
- skb->proto_data_valid = 1;
- } else {
+ else
skb->ip_summed = CHECKSUM_NONE;
- skb->proto_data_valid = 0;
- }
+#ifdef CONFIG_XEN
+ skb->proto_data_valid = (skb->ip_summed != CHECKSUM_NONE);
skb->proto_csum_blank = !!(rx->flags & NETRXF_csum_blank);
-
+#endif
np->stats.rx_packets++;
np->stats.rx_bytes += skb->len;
__skb_queue_tail(&rxq, skb);
}
- /* Some pages are no longer absent... */
- balloon_update_driver_allowance(-pages_done);
-
- /* Do all the remapping work, and M2P updates, in one big hypercall. */
- if (likely(pages_done)) {
- mcl = np->rx_mcl + pages_done;
- mcl->op = __HYPERVISOR_mmu_update;
- mcl->args[0] = (unsigned long)np->rx_mmu;
- mcl->args[1] = pages_done;
- mcl->args[2] = 0;
- mcl->args[3] = DOMID_SELF;
- (void)HYPERVISOR_multicall(np->rx_mcl, pages_done + 1);
+ if (pages_flipped) {
+ /* Some pages are no longer absent... */
+ balloon_update_driver_allowance(-pages_flipped);
+
+ /* Do all the remapping work and M2P updates. */
+ if (!xen_feature(XENFEAT_auto_translated_physmap)) {
+ mcl = np->rx_mcl + pages_flipped;
+ mcl->op = __HYPERVISOR_mmu_update;
+ mcl->args[0] = (unsigned long)np->rx_mmu;
+ mcl->args[1] = pages_flipped;
+ mcl->args[2] = 0;
+ mcl->args[3] = DOMID_SELF;
+ (void)HYPERVISOR_multicall(np->rx_mcl,
+ pages_flipped + 1);
+ }
}
while ((skb = __skb_dequeue(&errq)))
@@ -1277,97 +1404,12 @@ err:
return more_to_do;
}
-
-static int network_close(struct net_device *dev)
-{
- struct netfront_info *np = netdev_priv(dev);
- netif_stop_queue(np->netdev);
- return 0;
-}
-
-
-static struct net_device_stats *network_get_stats(struct net_device *dev)
-{
- struct netfront_info *np = netdev_priv(dev);
- return &np->stats;
-}
-
-static int xennet_change_mtu(struct net_device *dev, int mtu)
-{
- int max = xennet_can_sg(dev) ? 65535 - ETH_HLEN : ETH_DATA_LEN;
-
- if (mtu > max)
- return -EINVAL;
- dev->mtu = mtu;
- return 0;
-}
-
-static int xennet_set_sg(struct net_device *dev, u32 data)
-{
- if (data) {
- struct netfront_info *np = netdev_priv(dev);
- int val;
-
- if (xenbus_scanf(XBT_NIL, np->xbdev->otherend, "feature-sg",
- "%d", &val) < 0)
- val = 0;
- if (!val)
- return -ENOSYS;
- } else if (dev->mtu > ETH_DATA_LEN)
- dev->mtu = ETH_DATA_LEN;
-
- return ethtool_op_set_sg(dev, data);
-}
-
-static int xennet_set_tso(struct net_device *dev, u32 data)
-{
- if (data) {
- struct netfront_info *np = netdev_priv(dev);
- int val;
-
- if (xenbus_scanf(XBT_NIL, np->xbdev->otherend,
- "feature-gso-tcpv4", "%d", &val) < 0)
- val = 0;
- if (!val)
- return -ENOSYS;
- }
-
- return ethtool_op_set_tso(dev, data);
-}
-
-static void xennet_set_features(struct net_device *dev)
-{
- /* Turn off all GSO bits except ROBUST. */
- dev->features &= (1 << NETIF_F_GSO_SHIFT) - 1;
- dev->features |= NETIF_F_GSO_ROBUST;
- xennet_set_sg(dev, 0);
-
- if (!xennet_set_sg(dev, 1))
- xennet_set_tso(dev, 1);
-}
-
-static void network_connect(struct net_device *dev)
-{
- struct netfront_info *np = netdev_priv(dev);
- int i, requeue_idx;
+static void netif_release_tx_bufs(struct netfront_info *np)
+{
struct sk_buff *skb;
- grant_ref_t ref;
-
- xennet_set_features(dev);
-
- spin_lock_irq(&np->tx_lock);
- spin_lock(&np->rx_lock);
-
- /*
- * Recovery procedure:
- * NB. Freelist index entries are always going to be less than
- * PAGE_OFFSET, whereas pointers to skbs will always be equal or
- * greater than PAGE_OFFSET: we use this property to distinguish
- * them.
- */
-
- /* Step 1: Discard all pending TX packet fragments. */
- for (requeue_idx = 0, i = 1; i <= NET_TX_RING_SIZE; i++) {
+ int i;
+
+ for (i = 1; i <= NET_TX_RING_SIZE; i++) {
if ((unsigned long)np->tx_skbs[i] < PAGE_OFFSET)
continue;
@@ -1380,6 +1422,191 @@ static void network_connect(struct net_d
add_id_to_freelist(np->tx_skbs, i);
dev_kfree_skb_irq(skb);
}
+}
+
+static void netif_release_rx_bufs(struct netfront_info *np)
+{
+ struct mmu_update *mmu = np->rx_mmu;
+ struct multicall_entry *mcl = np->rx_mcl;
+ struct sk_buff_head free_list;
+ struct sk_buff *skb;
+ unsigned long mfn;
+ int xfer = 0, noxfer = 0, unused = 0;
+ int id, ref;
+
+ if (np->copying_receiver) {
+ printk("%s: fix me for copying receiver.\n", __FUNCTION__);
+ return;
+ }
+
+ skb_queue_head_init(&free_list);
+
+ spin_lock(&np->rx_lock);
+
+ for (id = 0; id < NET_RX_RING_SIZE; id++) {
+ if ((ref = np->grant_rx_ref[id]) == GRANT_INVALID_REF) {
+ unused++;
+ continue;
+ }
+
+ skb = np->rx_skbs[id];
+ mfn = gnttab_end_foreign_transfer_ref(ref);
+ gnttab_release_grant_reference(&np->gref_rx_head, ref);
+ np->grant_rx_ref[id] = GRANT_INVALID_REF;
+ add_id_to_freelist(np->rx_skbs, id);
+
+ if (0 == mfn) {
+ struct page *page = skb_shinfo(skb)->frags[0].page;
+ balloon_release_driver_page(page);
+ skb_shinfo(skb)->nr_frags = 0;
+ dev_kfree_skb(skb);
+ noxfer++;
+ continue;
+ }
+
+ if (!xen_feature(XENFEAT_auto_translated_physmap)) {
+ /* Remap the page. */
+ struct page *page = skb_shinfo(skb)->frags[0].page;
+ unsigned long pfn = page_to_pfn(page);
+ void *vaddr = page_address(page);
+
+ MULTI_update_va_mapping(mcl, (unsigned long)vaddr,
+ pfn_pte_ma(mfn, PAGE_KERNEL),
+ 0);
+ mcl++;
+ mmu->ptr = ((maddr_t)mfn << PAGE_SHIFT)
+ | MMU_MACHPHYS_UPDATE;
+ mmu->val = pfn;
+ mmu++;
+
+ set_phys_to_machine(pfn, mfn);
+ }
+ __skb_queue_tail(&free_list, skb);
+ xfer++;
+ }
+
+ printk("%s: %d xfer, %d noxfer, %d unused\n",
+ __FUNCTION__, xfer, noxfer, unused);
+
+ if (xfer) {
+ /* Some pages are no longer absent... */
+ balloon_update_driver_allowance(-xfer);
+
+ if (!xen_feature(XENFEAT_auto_translated_physmap)) {
+ /* Do all the remapping work and M2P updates. */
+ mcl->op = __HYPERVISOR_mmu_update;
+ mcl->args[0] = (unsigned long)np->rx_mmu;
+ mcl->args[1] = mmu - np->rx_mmu;
+ mcl->args[2] = 0;
+ mcl->args[3] = DOMID_SELF;
+ mcl++;
+ HYPERVISOR_multicall(np->rx_mcl, mcl - np->rx_mcl);
+ }
+ }
+
+ while ((skb = __skb_dequeue(&free_list)) != NULL)
+ dev_kfree_skb(skb);
+
+ spin_unlock(&np->rx_lock);
+}
+
+static int network_close(struct net_device *dev)
+{
+ struct netfront_info *np = netdev_priv(dev);
+ netif_stop_queue(np->netdev);
+ return 0;
+}
+
+
+static struct net_device_stats *network_get_stats(struct net_device *dev)
+{
+ struct netfront_info *np = netdev_priv(dev);
+ return &np->stats;
+}
+
+static int xennet_change_mtu(struct net_device *dev, int mtu)
+{
+ int max = xennet_can_sg(dev) ? 65535 - ETH_HLEN : ETH_DATA_LEN;
+
+ if (mtu > max)
+ return -EINVAL;
+ dev->mtu = mtu;
+ return 0;
+}
+
+static int xennet_set_sg(struct net_device *dev, u32 data)
+{
+ if (data) {
+ struct netfront_info *np = netdev_priv(dev);
+ int val;
+
+ if (xenbus_scanf(XBT_NIL, np->xbdev->otherend, "feature-sg",
+ "%d", &val) < 0)
+ val = 0;
+ if (!val)
+ return -ENOSYS;
+ } else if (dev->mtu > ETH_DATA_LEN)
+ dev->mtu = ETH_DATA_LEN;
+
+ return ethtool_op_set_sg(dev, data);
+}
+
+static int xennet_set_tso(struct net_device *dev, u32 data)
+{
+#ifdef HAVE_GSO
+ if (data) {
+ struct netfront_info *np = netdev_priv(dev);
+ int val;
+
+ if (xenbus_scanf(XBT_NIL, np->xbdev->otherend,
+ "feature-gso-tcpv4", "%d", &val) < 0)
+ val = 0;
+ if (!val)
+ return -ENOSYS;
+ }
+
+ return ethtool_op_set_tso(dev, data);
+#else
+ return -ENOSYS;
+#endif
+}
+
+static void xennet_set_features(struct net_device *dev)
+{
+ dev_disable_gso_features(dev);
+ xennet_set_sg(dev, 0);
+
+ /* We need checksum offload to enable scatter/gather and TSO. */
+ if (!(dev->features & NETIF_F_IP_CSUM))
+ return;
+
+ if (!xennet_set_sg(dev, 1))
+ xennet_set_tso(dev, 1);
+}
+
+static void network_connect(struct net_device *dev)
+{
+ struct netfront_info *np = netdev_priv(dev);
+ int i, requeue_idx;
+ struct sk_buff *skb;
+ grant_ref_t ref;
+ netif_rx_request_t *req;
+
+ xennet_set_features(dev);
+
+ spin_lock_irq(&np->tx_lock);
+ spin_lock(&np->rx_lock);
+
+ /*
+ * Recovery procedure:
+ * NB. Freelist index entries are always going to be less than
+ * PAGE_OFFSET, whereas pointers to skbs will always be equal or
+ * greater than PAGE_OFFSET: we use this property to distinguish
+ * them.
+ */
+
+ /* Step 1: Discard all pending TX packet fragments. */
+ netif_release_tx_bufs(np);
/* Step 2: Rebuild the RX buffer freelist and the RX ring itself. */
for (requeue_idx = 0, i = 0; i < NET_RX_RING_SIZE; i++) {
@@ -1388,13 +1615,20 @@ static void network_connect(struct net_d
skb = np->rx_skbs[requeue_idx] = xennet_get_rx_skb(np, i);
ref = np->grant_rx_ref[requeue_idx] = xennet_get_rx_ref(np, i);
-
- gnttab_grant_foreign_transfer_ref(
- ref, np->xbdev->otherend_id,
- page_to_pfn(skb_shinfo(skb)->frags->page));
-
- RING_GET_REQUEST(&np->rx, requeue_idx)->gref = ref;
- RING_GET_REQUEST(&np->rx, requeue_idx)->id = requeue_idx;
+ req = RING_GET_REQUEST(&np->rx, requeue_idx);
+
+ if (!np->copying_receiver) {
+ gnttab_grant_foreign_transfer_ref(
+ ref, np->xbdev->otherend_id,
+ page_to_pfn(skb_shinfo(skb)->frags->page));
+ } else {
+ gnttab_grant_foreign_access_ref(
+ ref, np->xbdev->otherend_id,
+ page_to_pfn(skb_shinfo(skb)->frags->page),
+ 0);
+ }
+ req->gref = ref;
+ req->id = requeue_idx;
requeue_idx++;
}
@@ -1419,6 +1653,8 @@ static void netif_uninit(struct net_devi
static void netif_uninit(struct net_device *dev)
{
struct netfront_info *np = netdev_priv(dev);
+ netif_release_tx_bufs(np);
+ netif_release_rx_bufs(np);
gnttab_free_grant_references(np->gref_tx_head);
gnttab_free_grant_references(np->gref_rx_head);
}
@@ -1577,13 +1813,8 @@ static void network_set_multicast_list(s
{
}
-/** Create a network device.
- * @param handle device handle
- * @param val return parameter for created device
- * @return 0 on success, error code otherwise
- */
-static struct net_device * __devinit create_netdev(int handle,
- struct xenbus_device *dev)
+static struct net_device * __devinit
+create_netdev(int handle, int copying_receiver, struct xenbus_device *dev)
{
int i, err = 0;
struct net_device *netdev = NULL;
@@ -1596,9 +1827,10 @@ static struct net_device * __devinit cre
return ERR_PTR(-ENOMEM);
}
- np = netdev_priv(netdev);
- np->handle = handle;
- np->xbdev = dev;
+ np = netdev_priv(netdev);
+ np->handle = handle;
+ np->xbdev = dev;
+ np->copying_receiver = copying_receiver;
netif_carrier_off(netdev);
@@ -1812,7 +2044,7 @@ static int __init netif_init(void)
if (!is_running_on_xen())
return -ENODEV;
- if (xen_start_info->flags & SIF_INITDOMAIN)
+ if (is_initial_xendomain())
return 0;
IPRINTK("Initialising virtual ethernet driver.\n");
diff -r 91169603a8e8 -r 79afceca9065
linux-2.6-xen-sparse/drivers/xen/pciback/xenbus.c
--- a/linux-2.6-xen-sparse/drivers/xen/pciback/xenbus.c Tue Aug 22 14:45:49
2006 -0600
+++ b/linux-2.6-xen-sparse/drivers/xen/pciback/xenbus.c Wed Aug 23 11:11:27
2006 -0600
@@ -181,6 +181,7 @@ static void pciback_frontend_changed(str
xenbus_switch_state(xdev, XenbusStateClosing);
break;
+ case XenbusStateUnknown:
case XenbusStateClosed:
dev_dbg(&xdev->dev, "frontend is gone! unregister device\n");
device_unregister(&xdev->dev);
diff -r 91169603a8e8 -r 79afceca9065
linux-2.6-xen-sparse/drivers/xen/pcifront/xenbus.c
--- a/linux-2.6-xen-sparse/drivers/xen/pcifront/xenbus.c Tue Aug 22
14:45:49 2006 -0600
+++ b/linux-2.6-xen-sparse/drivers/xen/pcifront/xenbus.c Wed Aug 23
11:11:27 2006 -0600
@@ -225,6 +225,7 @@ static void pcifront_backend_changed(str
pcifront_try_disconnect(pdev);
break;
+ case XenbusStateUnknown:
case XenbusStateClosed:
dev_warn(&xdev->dev, "backend went away!\n");
pcifront_try_disconnect(pdev);
diff -r 91169603a8e8 -r 79afceca9065
linux-2.6-xen-sparse/drivers/xen/privcmd/privcmd.c
--- a/linux-2.6-xen-sparse/drivers/xen/privcmd/privcmd.c Tue Aug 22
14:45:49 2006 -0600
+++ b/linux-2.6-xen-sparse/drivers/xen/privcmd/privcmd.c Wed Aug 23
11:11:27 2006 -0600
@@ -108,13 +108,15 @@ static int privcmd_ioctl(struct inode *i
}
break;
-#if defined(CONFIG_XEN_PRIVILEGED_GUEST)
case IOCTL_PRIVCMD_MMAP: {
#define PRIVCMD_MMAP_SZ 32
privcmd_mmap_t mmapcmd;
privcmd_mmap_entry_t msg[PRIVCMD_MMAP_SZ];
privcmd_mmap_entry_t __user *p;
int i, rc;
+
+ if (!is_initial_xendomain())
+ return -EPERM;
if (copy_from_user(&mmapcmd, udata, sizeof(mmapcmd)))
return -EFAULT;
@@ -162,8 +164,11 @@ static int privcmd_ioctl(struct inode *i
privcmd_mmapbatch_t m;
struct vm_area_struct *vma = NULL;
xen_pfn_t __user *p;
- unsigned long addr, mfn;
+ unsigned long addr, mfn;
int i;
+
+ if (!is_initial_xendomain())
+ return -EPERM;
if (copy_from_user(&m, udata, sizeof(m))) {
ret = -EFAULT;
@@ -215,7 +220,6 @@ static int privcmd_ioctl(struct inode *i
break;
}
break;
-#endif
default:
ret = -EINVAL;
@@ -246,7 +250,7 @@ static int capabilities_read(char *page,
int len = 0;
*page = 0;
- if (xen_start_info->flags & SIF_INITDOMAIN)
+ if (is_initial_xendomain())
len = sprintf( page, "control_d\n" );
*eof = 1;
diff -r 91169603a8e8 -r 79afceca9065
linux-2.6-xen-sparse/drivers/xen/tpmback/xenbus.c
--- a/linux-2.6-xen-sparse/drivers/xen/tpmback/xenbus.c Tue Aug 22 14:45:49
2006 -0600
+++ b/linux-2.6-xen-sparse/drivers/xen/tpmback/xenbus.c Wed Aug 23 11:11:27
2006 -0600
@@ -34,7 +34,6 @@ struct backend_info
/* watch front end for changes */
struct xenbus_watch backend_watch;
- enum xenbus_state frontend_state;
};
static void maybe_connect(struct backend_info *be);
@@ -143,8 +142,6 @@ static void frontend_changed(struct xenb
struct backend_info *be = dev->dev.driver_data;
int err;
- be->frontend_state = frontend_state;
-
switch (frontend_state) {
case XenbusStateInitialising:
case XenbusStateInitialised:
@@ -162,13 +159,12 @@ static void frontend_changed(struct xenb
be->instance = -1;
break;
+ case XenbusStateUnknown:
case XenbusStateClosed:
device_unregister(&be->dev->dev);
tpmback_remove(dev);
break;
- case XenbusStateUnknown:
- case XenbusStateInitWait:
default:
xenbus_dev_fatal(dev, -EINVAL,
"saw state %d at frontend",
diff -r 91169603a8e8 -r 79afceca9065
linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_client.c
--- a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_client.c Tue Aug 22
14:45:49 2006 -0600
+++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_client.c Wed Aug 23
11:11:27 2006 -0600
@@ -274,7 +274,7 @@ enum xenbus_state xenbus_read_driver_sta
enum xenbus_state result;
int err = xenbus_gather(XBT_NIL, path, "state", "%d", &result, NULL);
if (err)
- result = XenbusStateClosed;
+ result = XenbusStateUnknown;
return result;
}
diff -r 91169603a8e8 -r 79afceca9065
linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_comms.c
--- a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_comms.c Tue Aug 22
14:45:49 2006 -0600
+++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_comms.c Wed Aug 23
11:11:27 2006 -0600
@@ -47,11 +47,6 @@ static DECLARE_WORK(probe_work, xenbus_p
DECLARE_WAIT_QUEUE_HEAD(xb_waitq);
-static inline struct xenstore_domain_interface *xenstore_domain_interface(void)
-{
- return mfn_to_virt(xen_start_info->store_mfn);
-}
-
static irqreturn_t wake_waiting(int irq, void *unused, struct pt_regs *regs)
{
if (unlikely(xenstored_ready == 0)) {
@@ -90,7 +85,7 @@ static const void *get_input_chunk(XENST
int xb_write(const void *data, unsigned len)
{
- struct xenstore_domain_interface *intf = xenstore_domain_interface();
+ struct xenstore_domain_interface *intf = xen_store_interface;
XENSTORE_RING_IDX cons, prod;
int rc;
@@ -129,7 +124,7 @@ int xb_write(const void *data, unsigned
intf->req_prod += avail;
/* This implies mb() before other side sees interrupt. */
- notify_remote_via_evtchn(xen_start_info->store_evtchn);
+ notify_remote_via_evtchn(xen_store_evtchn);
}
return 0;
@@ -137,7 +132,7 @@ int xb_write(const void *data, unsigned
int xb_read(void *data, unsigned len)
{
- struct xenstore_domain_interface *intf = xenstore_domain_interface();
+ struct xenstore_domain_interface *intf = xen_store_interface;
XENSTORE_RING_IDX cons, prod;
int rc;
@@ -180,7 +175,7 @@ int xb_read(void *data, unsigned len)
pr_debug("Finished read of %i bytes (%i to go)\n", avail, len);
/* Implies mb(): they will see new header. */
- notify_remote_via_evtchn(xen_start_info->store_evtchn);
+ notify_remote_via_evtchn(xen_store_evtchn);
}
return 0;
@@ -195,7 +190,7 @@ int xb_init_comms(void)
unbind_from_irqhandler(xenbus_irq, &xb_waitq);
err = bind_evtchn_to_irqhandler(
- xen_start_info->store_evtchn, wake_waiting,
+ xen_store_evtchn, wake_waiting,
0, "xenbus", &xb_waitq);
if (err <= 0) {
printk(KERN_ERR "XENBUS request irq failed %i\n", err);
diff -r 91169603a8e8 -r 79afceca9065
linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_comms.h
--- a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_comms.h Tue Aug 22
14:45:49 2006 -0600
+++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_comms.h Wed Aug 23
11:11:27 2006 -0600
@@ -39,5 +39,7 @@ int xb_read(void *data, unsigned len);
int xb_read(void *data, unsigned len);
int xs_input_avail(void);
extern wait_queue_head_t xb_waitq;
+extern struct xenstore_domain_interface *xen_store_interface;
+extern int xen_store_evtchn;
#endif /* _XENBUS_COMMS_H */
diff -r 91169603a8e8 -r 79afceca9065
linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_dev.c
--- a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_dev.c Tue Aug 22
14:45:49 2006 -0600
+++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_dev.c Wed Aug 23
11:11:27 2006 -0600
@@ -285,7 +285,7 @@ static int xenbus_dev_open(struct inode
{
struct xenbus_dev_data *u;
- if (xen_start_info->store_evtchn == 0)
+ if (xen_store_evtchn == 0)
return -ENOENT;
nonseekable_open(inode, filp);
@@ -346,7 +346,7 @@ static struct file_operations xenbus_dev
.poll = xenbus_dev_poll,
};
-static int __init
+int __init
xenbus_dev_init(void)
{
xenbus_dev_intf = create_xen_proc_entry("xenbus", 0400);
@@ -355,5 +355,3 @@ xenbus_dev_init(void)
return 0;
}
-
-__initcall(xenbus_dev_init);
diff -r 91169603a8e8 -r 79afceca9065
linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c
--- a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c Tue Aug 22
14:45:49 2006 -0600
+++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c Wed Aug 23
11:11:27 2006 -0600
@@ -45,18 +45,34 @@
#include <asm/io.h>
#include <asm/page.h>
+#include <asm/maddr.h>
#include <asm/pgtable.h>
#include <asm/hypervisor.h>
#include <xen/xenbus.h>
#include <xen/xen_proc.h>
#include <xen/evtchn.h>
#include <xen/features.h>
+#include <xen/hvm.h>
#include "xenbus_comms.h"
+int xen_store_evtchn;
+struct xenstore_domain_interface *xen_store_interface;
+static unsigned long xen_store_mfn;
+
extern struct mutex xenwatch_mutex;
static struct notifier_block *xenstore_chain;
+
+static void wait_for_devices(struct xenbus_driver *xendrv);
+
+static int xenbus_probe_frontend(const char *type, const char *name);
+static int xenbus_uevent_backend(struct device *dev, char **envp,
+ int num_envp, char *buffer, int buffer_size);
+static int xenbus_probe_backend(const char *type, const char *domid);
+
+static int xenbus_dev_probe(struct device *_dev);
+static int xenbus_dev_remove(struct device *_dev);
/* If something in array of ids matches this device, return it. */
static const struct xenbus_device_id *
@@ -166,15 +182,16 @@ static int read_frontend_details(struct
/* Bus type for frontend drivers. */
-static int xenbus_probe_frontend(const char *type, const char *name);
static struct xen_bus_type xenbus_frontend = {
.root = "device",
.levels = 2, /* device/type/<id> */
.get_bus_id = frontend_bus_id,
.probe = xenbus_probe_frontend,
.bus = {
- .name = "xen",
- .match = xenbus_match,
+ .name = "xen",
+ .match = xenbus_match,
+ .probe = xenbus_dev_probe,
+ .remove = xenbus_dev_remove,
},
.dev = {
.bus_id = "xen",
@@ -219,18 +236,17 @@ static int backend_bus_id(char bus_id[BU
return 0;
}
-static int xenbus_uevent_backend(struct device *dev, char **envp,
- int num_envp, char *buffer, int buffer_size);
-static int xenbus_probe_backend(const char *type, const char *domid);
static struct xen_bus_type xenbus_backend = {
.root = "backend",
.levels = 3, /* backend/type/<frontend>/<id> */
.get_bus_id = backend_bus_id,
.probe = xenbus_probe_backend,
.bus = {
- .name = "xen-backend",
- .match = xenbus_match,
- .uevent = xenbus_uevent_backend,
+ .name = "xen-backend",
+ .match = xenbus_match,
+ .probe = xenbus_dev_probe,
+ .remove = xenbus_dev_remove,
+ .uevent = xenbus_uevent_backend,
},
.dev = {
.bus_id = "xen-backend",
@@ -397,8 +413,6 @@ static int xenbus_register_driver_common
drv->driver.name = drv->name;
drv->driver.bus = &bus->bus;
drv->driver.owner = drv->owner;
- drv->driver.probe = xenbus_dev_probe;
- drv->driver.remove = xenbus_dev_remove;
mutex_lock(&xenwatch_mutex);
ret = driver_register(&drv->driver);
@@ -408,9 +422,18 @@ static int xenbus_register_driver_common
int xenbus_register_frontend(struct xenbus_driver *drv)
{
+ int ret;
+
drv->read_otherend_details = read_backend_details;
- return xenbus_register_driver_common(drv, &xenbus_frontend);
+ ret = xenbus_register_driver_common(drv, &xenbus_frontend);
+ if (ret)
+ return ret;
+
+ /* If this driver is loaded as a module wait for devices to attach. */
+ wait_for_devices(drv);
+
+ return 0;
}
EXPORT_SYMBOL_GPL(xenbus_register_frontend);
@@ -829,7 +852,7 @@ static int resume_dev(struct device *dev
printk(KERN_WARNING
"xenbus: resume %s failed: %i\n",
dev->bus_id, err);
- return err;
+ return err;
}
}
@@ -841,7 +864,7 @@ static int resume_dev(struct device *dev
return err;
}
- return 0;
+ return 0;
}
void xenbus_suspend(void)
@@ -917,8 +940,7 @@ static int xsd_kva_mmap(struct file *fil
if ((size > PAGE_SIZE) || (vma->vm_pgoff != 0))
return -EINVAL;
- if (remap_pfn_range(vma, vma->vm_start,
- mfn_to_pfn(xen_start_info->store_mfn),
+ if (remap_pfn_range(vma, vma->vm_start, mfn_to_pfn(xen_store_mfn),
size, vma->vm_page_prot))
return -EAGAIN;
@@ -930,7 +952,7 @@ static int xsd_kva_read(char *page, char
{
int len;
- len = sprintf(page, "0x%p", mfn_to_virt(xen_start_info->store_mfn));
+ len = sprintf(page, "0x%p", xen_store_interface);
*eof = 1;
return len;
}
@@ -940,16 +962,15 @@ static int xsd_port_read(char *page, cha
{
int len;
- len = sprintf(page, "%d", xen_start_info->store_evtchn);
+ len = sprintf(page, "%d", xen_store_evtchn);
*eof = 1;
return len;
}
#endif
-
static int __init xenbus_probe_init(void)
{
- int err = 0, dom0;
+ int err = 0;
unsigned long page = 0;
DPRINTK("");
@@ -964,9 +985,7 @@ static int __init xenbus_probe_init(void
/*
* Domain0 doesn't have a store_evtchn or store_mfn yet.
*/
- dom0 = (xen_start_info->store_evtchn == 0);
-
- if (dom0) {
+ if (is_initial_xendomain()) {
struct evtchn_alloc_unbound alloc_unbound;
/* Allocate page. */
@@ -974,7 +993,7 @@ static int __init xenbus_probe_init(void
if (!page)
return -ENOMEM;
- xen_start_info->store_mfn =
+ xen_store_mfn = xen_start_info->store_mfn =
pfn_to_mfn(virt_to_phys((void *)page) >>
PAGE_SHIFT);
@@ -987,7 +1006,8 @@ static int __init xenbus_probe_init(void
if (err == -ENOSYS)
goto err;
BUG_ON(err);
- xen_start_info->store_evtchn = alloc_unbound.port;
+ xen_store_evtchn = xen_start_info->store_evtchn =
+ alloc_unbound.port;
#ifdef CONFIG_PROC_FS
/* And finally publish the above info in /proc/xen */
@@ -1003,8 +1023,23 @@ static int __init xenbus_probe_init(void
if (xsd_port_intf)
xsd_port_intf->read_proc = xsd_port_read;
#endif
- } else
+ xen_store_interface = mfn_to_virt(xen_store_mfn);
+ } else {
xenstored_ready = 1;
+#ifdef CONFIG_XEN
+ xen_store_evtchn = xen_start_info->store_evtchn;
+ xen_store_mfn = xen_start_info->store_mfn;
+ xen_store_interface = mfn_to_virt(xen_store_mfn);
+#else
+ xen_store_evtchn = hvm_get_parameter(HVM_PARAM_STORE_EVTCHN);
+ xen_store_mfn = hvm_get_parameter(HVM_PARAM_STORE_PFN);
+ xen_store_interface = ioremap(xen_store_mfn << PAGE_SHIFT,
+ PAGE_SIZE);
+#endif
+ }
+
+
+ xenbus_dev_init();
/* Initialize the interface to xenstore. */
err = xs_init();
@@ -1018,7 +1053,7 @@ static int __init xenbus_probe_init(void
device_register(&xenbus_frontend.dev);
device_register(&xenbus_backend.dev);
- if (!dom0)
+ if (!is_initial_xendomain())
xenbus_probe(NULL);
return 0;
@@ -1038,10 +1073,13 @@ static int __init xenbus_probe_init(void
postcore_initcall(xenbus_probe_init);
+MODULE_LICENSE("Dual BSD/GPL");
+
static int is_disconnected_device(struct device *dev, void *data)
{
struct xenbus_device *xendev = to_xenbus_device(dev);
+ struct device_driver *drv = data;
/*
* A device with no driver will never connect. We care only about
@@ -1050,18 +1088,27 @@ static int is_disconnected_device(struct
if (!dev->driver)
return 0;
+ /* Is this search limited to a particular driver? */
+ if (drv && (dev->driver != drv))
+ return 0;
+
return (xendev->state != XenbusStateConnected);
}
-static int exists_disconnected_device(void)
-{
- return bus_for_each_dev(&xenbus_frontend.bus, NULL, NULL,
+static int exists_disconnected_device(struct device_driver *drv)
+{
+ return bus_for_each_dev(&xenbus_frontend.bus, NULL, drv,
is_disconnected_device);
}
static int print_device_status(struct device *dev, void *data)
{
struct xenbus_device *xendev = to_xenbus_device(dev);
+ struct device_driver *drv = data;
+
+ /* Is this operation limited to a particular driver? */
+ if (drv && (dev->driver != drv))
+ return 0;
if (!dev->driver) {
/* Information only: is this too noisy? */
@@ -1075,6 +1122,9 @@ static int print_device_status(struct de
return 0;
}
+
+/* We only wait for device setup after most initcalls have run. */
+static int ready_to_wait_for_devices;
/*
* On a 10 second timeout, wait for all devices currently configured. We need
@@ -1090,20 +1140,31 @@ static int print_device_status(struct de
* boot slightly, but of course needs tools or manual intervention to set up
* those flags correctly.
*/
-static int __init wait_for_devices(void)
+static void wait_for_devices(struct xenbus_driver *xendrv)
{
unsigned long timeout = jiffies + 10*HZ;
-
- if (!is_running_on_xen())
- return -ENODEV;
-
- while (time_before(jiffies, timeout) && exists_disconnected_device())
+ struct device_driver *drv = xendrv ? &xendrv->driver : NULL;
+
+ if (!ready_to_wait_for_devices || !is_running_on_xen())
+ return;
+
+ while (exists_disconnected_device(drv)) {
+ if (time_after(jiffies, timeout))
+ break;
schedule_timeout_interruptible(HZ/10);
-
- bus_for_each_dev(&xenbus_frontend.bus, NULL, NULL,
+ }
+
+ bus_for_each_dev(&xenbus_frontend.bus, NULL, drv,
print_device_status);
-
- return 0;
-}
-
-late_initcall(wait_for_devices);
+}
+
+#ifndef MODULE
+static int __init boot_wait_for_devices(void)
+{
+ ready_to_wait_for_devices = 1;
+ wait_for_devices(NULL);
+ return 0;
+}
+
+late_initcall(boot_wait_for_devices);
+#endif
diff -r 91169603a8e8 -r 79afceca9065
linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_xs.c
--- a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_xs.c Tue Aug 22
14:45:49 2006 -0600
+++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_xs.c Wed Aug 23
11:11:27 2006 -0600
@@ -665,7 +665,17 @@ EXPORT_SYMBOL_GPL(unregister_xenbus_watc
void xs_suspend(void)
{
+ struct xenbus_watch *watch;
+ char token[sizeof(watch) * 2 + 1];
+
down_write(&xs_state.suspend_mutex);
+
+ /* No need for watches_lock: the suspend_mutex is sufficient. */
+ list_for_each_entry(watch, &watches, list) {
+ sprintf(token, "%lX", (long)watch);
+ xs_unwatch(watch->node, token);
+ }
+
mutex_lock(&xs_state.request_mutex);
}
diff -r 91169603a8e8 -r 79afceca9065
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/hypercall.h
--- a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/hypercall.h Tue Aug
22 14:45:49 2006 -0600
+++ b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/hypercall.h Wed Aug
23 11:11:27 2006 -0600
@@ -42,11 +42,21 @@
#define __STR(x) #x
#define STR(x) __STR(x)
+#ifdef CONFIG_XEN
+#define HYPERCALL_STR(name) \
+ "call hypercall_page + ("STR(__HYPERVISOR_##name)" * 32)"
+#else
+#define HYPERCALL_STR(name) \
+ "mov hypercall_stubs,%%eax; " \
+ "add $("STR(__HYPERVISOR_##name)" * 32),%%eax; " \
+ "call *%%eax"
+#endif
+
#define _hypercall0(type, name) \
({ \
long __res; \
asm volatile ( \
- "call hypercall_page + ("STR(__HYPERVISOR_##name)" * 32)"\
+ HYPERCALL_STR(name) \
: "=a" (__res) \
: \
: "memory" ); \
@@ -57,7 +67,7 @@
({ \
long __res, __ign1; \
asm volatile ( \
- "call hypercall_page + ("STR(__HYPERVISOR_##name)" * 32)"\
+ HYPERCALL_STR(name) \
: "=a" (__res), "=b" (__ign1) \
: "1" ((long)(a1)) \
: "memory" ); \
@@ -68,7 +78,7 @@
({ \
long __res, __ign1, __ign2; \
asm volatile ( \
- "call hypercall_page + ("STR(__HYPERVISOR_##name)" * 32)"\
+ HYPERCALL_STR(name) \
: "=a" (__res), "=b" (__ign1), "=c" (__ign2) \
: "1" ((long)(a1)), "2" ((long)(a2)) \
: "memory" ); \
@@ -79,7 +89,7 @@
({ \
long __res, __ign1, __ign2, __ign3; \
asm volatile ( \
- "call hypercall_page + ("STR(__HYPERVISOR_##name)" * 32)"\
+ HYPERCALL_STR(name) \
: "=a" (__res), "=b" (__ign1), "=c" (__ign2), \
"=d" (__ign3) \
: "1" ((long)(a1)), "2" ((long)(a2)), \
@@ -92,7 +102,7 @@
({ \
long __res, __ign1, __ign2, __ign3, __ign4; \
asm volatile ( \
- "call hypercall_page + ("STR(__HYPERVISOR_##name)" * 32)"\
+ HYPERCALL_STR(name) \
: "=a" (__res), "=b" (__ign1), "=c" (__ign2), \
"=d" (__ign3), "=S" (__ign4) \
: "1" ((long)(a1)), "2" ((long)(a2)), \
@@ -105,7 +115,7 @@
({ \
long __res, __ign1, __ign2, __ign3, __ign4, __ign5; \
asm volatile ( \
- "call hypercall_page + ("STR(__HYPERVISOR_##name)" * 32)"\
+ HYPERCALL_STR(name) \
: "=a" (__res), "=b" (__ign1), "=c" (__ign2), \
"=d" (__ign3), "=S" (__ign4), "=D" (__ign5) \
: "1" ((long)(a1)), "2" ((long)(a2)), \
@@ -354,6 +364,13 @@ HYPERVISOR_nmi_op(
return _hypercall2(int, nmi_op, op, arg);
}
+static inline unsigned long
+HYPERVISOR_hvm_op(
+ int op, void *arg)
+{
+ return _hypercall2(unsigned long, hvm_op, op, arg);
+}
+
static inline int
HYPERVISOR_callback_op(
int cmd, void *arg)
diff -r 91169603a8e8 -r 79afceca9065
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/hypervisor.h
--- a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/hypervisor.h Tue Aug
22 14:45:49 2006 -0600
+++ b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/hypervisor.h Wed Aug
23 11:11:27 2006 -0600
@@ -58,6 +58,11 @@ extern shared_info_t *HYPERVISOR_shared_
/* arch/xen/i386/kernel/setup.c */
extern start_info_t *xen_start_info;
+#ifdef CONFIG_XEN_PRIVILEGED_GUEST
+#define is_initial_xendomain() (xen_start_info->flags & SIF_INITDOMAIN)
+#else
+#define is_initial_xendomain() 0
+#endif
/* arch/xen/kernel/evtchn.c */
/* Force a proper event-channel callback from Xen. */
@@ -198,6 +203,16 @@ MULTI_update_va_mapping(
}
static inline void
+MULTI_grant_table_op(multicall_entry_t *mcl, unsigned int cmd,
+ void *uop, unsigned int count)
+{
+ mcl->op = __HYPERVISOR_grant_table_op;
+ mcl->args[0] = cmd;
+ mcl->args[1] = (unsigned long)uop;
+ mcl->args[2] = count;
+}
+
+static inline void
MULTI_update_va_mapping_otherdomain(
multicall_entry_t *mcl, unsigned long va,
pte_t new_val, unsigned long flags, domid_t domid)
diff -r 91169603a8e8 -r 79afceca9065
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/page.h
--- a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/page.h Tue Aug 22
14:45:49 2006 -0600
+++ b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/page.h Wed Aug 23
11:11:27 2006 -0600
@@ -60,123 +60,6 @@
#define clear_user_page(page, vaddr, pg) clear_page(page)
#define copy_user_page(to, from, vaddr, pg) copy_page(to, from)
-/**** MACHINE <-> PHYSICAL CONVERSION MACROS ****/
-#define INVALID_P2M_ENTRY (~0UL)
-#define FOREIGN_FRAME_BIT (1UL<<31)
-#define FOREIGN_FRAME(m) ((m) | FOREIGN_FRAME_BIT)
-
-extern unsigned long *phys_to_machine_mapping;
-
-#undef machine_to_phys_mapping
-extern unsigned long *machine_to_phys_mapping;
-extern unsigned int machine_to_phys_order;
-
-static inline unsigned long pfn_to_mfn(unsigned long pfn)
-{
- if (xen_feature(XENFEAT_auto_translated_physmap))
- return pfn;
- return phys_to_machine_mapping[(unsigned int)(pfn)] &
- ~FOREIGN_FRAME_BIT;
-}
-
-static inline int phys_to_machine_mapping_valid(unsigned long pfn)
-{
- if (xen_feature(XENFEAT_auto_translated_physmap))
- return 1;
- return (phys_to_machine_mapping[pfn] != INVALID_P2M_ENTRY);
-}
-
-static inline unsigned long mfn_to_pfn(unsigned long mfn)
-{
- extern unsigned long max_mapnr;
- unsigned long pfn;
-
- if (xen_feature(XENFEAT_auto_translated_physmap))
- return mfn;
-
- if (unlikely((mfn >> machine_to_phys_order) != 0))
- return max_mapnr;
-
- /* The array access can fail (e.g., device space beyond end of RAM). */
- asm (
- "1: movl %1,%0\n"
- "2:\n"
- ".section .fixup,\"ax\"\n"
- "3: movl %2,%0\n"
- " jmp 2b\n"
- ".previous\n"
- ".section __ex_table,\"a\"\n"
- " .align 4\n"
- " .long 1b,3b\n"
- ".previous"
- : "=r" (pfn)
- : "m" (machine_to_phys_mapping[mfn]), "m" (max_mapnr) );
-
- return pfn;
-}
-
-/*
- * We detect special mappings in one of two ways:
- * 1. If the MFN is an I/O page then Xen will set the m2p entry
- * to be outside our maximum possible pseudophys range.
- * 2. If the MFN belongs to a different domain then we will certainly
- * not have MFN in our p2m table. Conversely, if the page is ours,
- * then we'll have p2m(m2p(MFN))==MFN.
- * If we detect a special mapping then it doesn't have a 'struct page'.
- * We force !pfn_valid() by returning an out-of-range pointer.
- *
- * NB. These checks require that, for any MFN that is not in our reservation,
- * there is no PFN such that p2m(PFN) == MFN. Otherwise we can get confused if
- * we are foreign-mapping the MFN, and the other domain as m2p(MFN) == PFN.
- * Yikes! Various places must poke in INVALID_P2M_ENTRY for safety.
- *
- * NB2. When deliberately mapping foreign pages into the p2m table, you *must*
- * use FOREIGN_FRAME(). This will cause pte_pfn() to choke on it, as we
- * require. In all the cases we care about, the FOREIGN_FRAME bit is
- * masked (e.g., pfn_to_mfn()) so behaviour there is correct.
- */
-static inline unsigned long mfn_to_local_pfn(unsigned long mfn)
-{
- extern unsigned long max_mapnr;
- unsigned long pfn = mfn_to_pfn(mfn);
- if ((pfn < max_mapnr)
- && !xen_feature(XENFEAT_auto_translated_physmap)
- && (phys_to_machine_mapping[pfn] != mfn))
- return max_mapnr; /* force !pfn_valid() */
- return pfn;
-}
-
-static inline void set_phys_to_machine(unsigned long pfn, unsigned long mfn)
-{
- if (xen_feature(XENFEAT_auto_translated_physmap)) {
- BUG_ON(pfn != mfn && mfn != INVALID_P2M_ENTRY);
- return;
- }
- phys_to_machine_mapping[pfn] = mfn;
-}
-
-/* Definitions for machine and pseudophysical addresses. */
-#ifdef CONFIG_X86_PAE
-typedef unsigned long long paddr_t;
-typedef unsigned long long maddr_t;
-#else
-typedef unsigned long paddr_t;
-typedef unsigned long maddr_t;
-#endif
-
-static inline maddr_t phys_to_machine(paddr_t phys)
-{
- maddr_t machine = pfn_to_mfn(phys >> PAGE_SHIFT);
- machine = (machine << PAGE_SHIFT) | (phys & ~PAGE_MASK);
- return machine;
-}
-static inline paddr_t machine_to_phys(maddr_t machine)
-{
- paddr_t phys = mfn_to_pfn(machine >> PAGE_SHIFT);
- phys = (phys << PAGE_SHIFT) | (machine & ~PAGE_MASK);
- return phys;
-}
-
/*
* These are used to make use of C type-checking..
*/
@@ -187,6 +70,8 @@ typedef struct { unsigned long long pmd;
typedef struct { unsigned long long pmd; } pmd_t;
typedef struct { unsigned long long pgd; } pgd_t;
typedef struct { unsigned long long pgprot; } pgprot_t;
+#define pgprot_val(x) ((x).pgprot)
+#include <asm/maddr.h>
#define __pte(x) ({ unsigned long long _x = (x); \
if (_x & 1) _x = phys_to_machine(_x); \
((pte_t) {(unsigned long)(_x), (unsigned long)(_x>>32)}); })
@@ -227,6 +112,8 @@ typedef struct { unsigned long pte_low;
typedef struct { unsigned long pte_low; } pte_t;
typedef struct { unsigned long pgd; } pgd_t;
typedef struct { unsigned long pgprot; } pgprot_t;
+#define pgprot_val(x) ((x).pgprot)
+#include <asm/maddr.h>
#define boot_pte_t pte_t /* or would you rather have a typedef */
#define pte_val(x) (((x).pte_low & 1) ? machine_to_phys((x).pte_low) : \
(x).pte_low)
@@ -252,9 +139,6 @@ static inline unsigned long pgd_val(pgd_
#define HAVE_ARCH_HUGETLB_UNMAPPED_AREA
#endif
-#define pgprot_val(x) ((x).pgprot)
-
-#define __pte_ma(x) ((pte_t) { (x) } )
#define __pgprot(x) ((pgprot_t) { (x) } )
#endif /* !__ASSEMBLY__ */
@@ -323,11 +207,6 @@ extern int page_is_ram(unsigned long pag
((current->personality & READ_IMPLIES_EXEC) ? VM_EXEC : 0 ) | \
VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
-/* VIRT <-> MACHINE conversion */
-#define virt_to_machine(v) (phys_to_machine(__pa(v)))
-#define virt_to_mfn(v) (pfn_to_mfn(__pa(v) >> PAGE_SHIFT))
-#define mfn_to_virt(m) (__va(mfn_to_pfn(m) << PAGE_SHIFT))
-
#define __HAVE_ARCH_GATE_AREA 1
#endif /* __KERNEL__ */
diff -r 91169603a8e8 -r 79afceca9065
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/pgtable-2level.h
--- a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/pgtable-2level.h
Tue Aug 22 14:45:49 2006 -0600
+++ b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/pgtable-2level.h
Wed Aug 23 11:11:27 2006 -0600
@@ -45,7 +45,6 @@
#define pte_none(x) (!(x).pte_low)
#define pfn_pte(pfn, prot) __pte(((pfn) << PAGE_SHIFT) | pgprot_val(prot))
-#define pfn_pte_ma(pfn, prot) __pte_ma(((pfn) << PAGE_SHIFT) |
pgprot_val(prot))
#define pfn_pmd(pfn, prot) __pmd(((pfn) << PAGE_SHIFT) | pgprot_val(prot))
/*
diff -r 91169603a8e8 -r 79afceca9065
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/pgtable-3level.h
--- a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/pgtable-3level.h
Tue Aug 22 14:45:49 2006 -0600
+++ b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/pgtable-3level.h
Wed Aug 23 11:11:27 2006 -0600
@@ -151,18 +151,6 @@ static inline int pte_none(pte_t pte)
extern unsigned long long __supported_pte_mask;
-static inline pte_t pfn_pte_ma(unsigned long page_nr, pgprot_t pgprot)
-{
- pte_t pte;
-
- pte.pte_high = (page_nr >> (32 - PAGE_SHIFT)) | \
- (pgprot_val(pgprot) >> 32);
- pte.pte_high &= (__supported_pte_mask >> 32);
- pte.pte_low = ((page_nr << PAGE_SHIFT) | pgprot_val(pgprot)) & \
- __supported_pte_mask;
- return pte;
-}
-
static inline pte_t pfn_pte(unsigned long page_nr, pgprot_t pgprot)
{
return pfn_pte_ma(pfn_to_mfn(page_nr), pgprot);
diff -r 91169603a8e8 -r 79afceca9065
linux-2.6-xen-sparse/include/asm-ia64/hypervisor.h
--- a/linux-2.6-xen-sparse/include/asm-ia64/hypervisor.h Tue Aug 22
14:45:49 2006 -0600
+++ b/linux-2.6-xen-sparse/include/asm-ia64/hypervisor.h Wed Aug 23
11:11:27 2006 -0600
@@ -58,6 +58,8 @@ extern int running_on_xen;
extern shared_info_t *HYPERVISOR_shared_info;
extern start_info_t *xen_start_info;
+
+#define is_initial_xendomain() (xen_start_info->flags & SIF_INITDOMAIN)
void force_evtchn_callback(void);
diff -r 91169603a8e8 -r 79afceca9065
linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/hypercall.h
--- a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/hypercall.h Tue Aug
22 14:45:49 2006 -0600
+++ b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/hypercall.h Wed Aug
23 11:11:27 2006 -0600
@@ -46,11 +46,21 @@
#define __STR(x) #x
#define STR(x) __STR(x)
+#ifdef CONFIG_XEN
+#define HYPERCALL_STR(name) \
+ "call hypercall_page + ("STR(__HYPERVISOR_##name)" * 32)"
+#else
+#define HYPERCALL_STR(name) \
+ "mov hypercall_stubs,%%rax; " \
+ "add $("STR(__HYPERVISOR_##name)" * 32),%%rax; " \
+ "call *%%rax"
+#endif
+
#define _hypercall0(type, name) \
({ \
long __res; \
asm volatile ( \
- "call hypercall_page + ("STR(__HYPERVISOR_##name)" * 32)"\
+ HYPERCALL_STR(name) \
: "=a" (__res) \
: \
: "memory" ); \
@@ -61,7 +71,7 @@
({ \
long __res, __ign1; \
asm volatile ( \
- "call hypercall_page + ("STR(__HYPERVISOR_##name)" * 32)"\
+ HYPERCALL_STR(name) \
: "=a" (__res), "=D" (__ign1) \
: "1" ((long)(a1)) \
: "memory" ); \
@@ -72,7 +82,7 @@
({ \
long __res, __ign1, __ign2; \
asm volatile ( \
- "call hypercall_page + ("STR(__HYPERVISOR_##name)" * 32)"\
+ HYPERCALL_STR(name) \
: "=a" (__res), "=D" (__ign1), "=S" (__ign2) \
: "1" ((long)(a1)), "2" ((long)(a2)) \
: "memory" ); \
@@ -83,7 +93,7 @@
({ \
long __res, __ign1, __ign2, __ign3; \
asm volatile ( \
- "call hypercall_page + ("STR(__HYPERVISOR_##name)" * 32)"\
+ HYPERCALL_STR(name) \
: "=a" (__res), "=D" (__ign1), "=S" (__ign2), \
"=d" (__ign3) \
: "1" ((long)(a1)), "2" ((long)(a2)), \
@@ -97,7 +107,7 @@
long __res, __ign1, __ign2, __ign3; \
asm volatile ( \
"movq %7,%%r10; " \
- "call hypercall_page + ("STR(__HYPERVISOR_##name)" * 32)"\
+ HYPERCALL_STR(name) \
: "=a" (__res), "=D" (__ign1), "=S" (__ign2), \
"=d" (__ign3) \
: "1" ((long)(a1)), "2" ((long)(a2)), \
@@ -111,7 +121,7 @@
long __res, __ign1, __ign2, __ign3; \
asm volatile ( \
"movq %7,%%r10; movq %8,%%r8; " \
- "call hypercall_page + ("STR(__HYPERVISOR_##name)" * 32)"\
+ HYPERCALL_STR(name) \
: "=a" (__res), "=D" (__ign1), "=S" (__ign2), \
"=d" (__ign3) \
: "1" ((long)(a1)), "2" ((long)(a2)), \
@@ -355,6 +365,13 @@ HYPERVISOR_nmi_op(
return _hypercall2(int, nmi_op, op, arg);
}
+static inline unsigned long
+HYPERVISOR_hvm_op(
+ int op, void *arg)
+{
+ return _hypercall2(unsigned long, hvm_op, op, arg);
+}
+
static inline int
HYPERVISOR_callback_op(
int cmd, void *arg)
diff -r 91169603a8e8 -r 79afceca9065
linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/page.h
--- a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/page.h Tue Aug
22 14:45:49 2006 -0600
+++ b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/page.h Wed Aug
23 11:11:27 2006 -0600
@@ -7,7 +7,6 @@
#include <linux/kernel.h>
#include <linux/types.h>
#include <asm/bug.h>
-#include <xen/features.h>
#endif
#include <xen/interface/xen.h>
#include <xen/foreign_page.h>
@@ -69,6 +68,8 @@
extern unsigned long end_pfn;
+#include <asm/maddr.h>
+
void clear_page(void *);
void copy_page(void *, void *);
@@ -77,118 +78,6 @@ void copy_page(void *, void *);
#define alloc_zeroed_user_highpage(vma, vaddr) alloc_page_vma(GFP_HIGHUSER |
__GFP_ZERO, vma, vaddr)
#define __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE
-
-/**** MACHINE <-> PHYSICAL CONVERSION MACROS ****/
-#define INVALID_P2M_ENTRY (~0UL)
-#define FOREIGN_FRAME_BIT (1UL<<63)
-#define FOREIGN_FRAME(m) ((m) | FOREIGN_FRAME_BIT)
-
-extern unsigned long *phys_to_machine_mapping;
-
-#undef machine_to_phys_mapping
-extern unsigned long *machine_to_phys_mapping;
-extern unsigned int machine_to_phys_order;
-
-static inline unsigned long pfn_to_mfn(unsigned long pfn)
-{
- if (xen_feature(XENFEAT_auto_translated_physmap))
- return pfn;
- return phys_to_machine_mapping[(unsigned int)(pfn)] &
- ~FOREIGN_FRAME_BIT;
-}
-
-static inline int phys_to_machine_mapping_valid(unsigned long pfn)
-{
- if (xen_feature(XENFEAT_auto_translated_physmap))
- return 1;
- return (phys_to_machine_mapping[pfn] != INVALID_P2M_ENTRY);
-}
-
-static inline unsigned long mfn_to_pfn(unsigned long mfn)
-{
- unsigned long pfn;
-
- if (xen_feature(XENFEAT_auto_translated_physmap))
- return mfn;
-
- if (unlikely((mfn >> machine_to_phys_order) != 0))
- return end_pfn;
-
- /* The array access can fail (e.g., device space beyond end of RAM). */
- asm (
- "1: movq %1,%0\n"
- "2:\n"
- ".section .fixup,\"ax\"\n"
- "3: movq %2,%0\n"
- " jmp 2b\n"
- ".previous\n"
- ".section __ex_table,\"a\"\n"
- " .align 8\n"
- " .quad 1b,3b\n"
- ".previous"
- : "=r" (pfn)
- : "m" (machine_to_phys_mapping[mfn]), "m" (end_pfn) );
-
- return pfn;
-}
-
-/*
- * We detect special mappings in one of two ways:
- * 1. If the MFN is an I/O page then Xen will set the m2p entry
- * to be outside our maximum possible pseudophys range.
- * 2. If the MFN belongs to a different domain then we will certainly
- * not have MFN in our p2m table. Conversely, if the page is ours,
- * then we'll have p2m(m2p(MFN))==MFN.
- * If we detect a special mapping then it doesn't have a 'struct page'.
- * We force !pfn_valid() by returning an out-of-range pointer.
- *
- * NB. These checks require that, for any MFN that is not in our reservation,
- * there is no PFN such that p2m(PFN) == MFN. Otherwise we can get confused if
- * we are foreign-mapping the MFN, and the other domain as m2p(MFN) == PFN.
- * Yikes! Various places must poke in INVALID_P2M_ENTRY for safety.
- *
- * NB2. When deliberately mapping foreign pages into the p2m table, you *must*
- * use FOREIGN_FRAME(). This will cause pte_pfn() to choke on it, as we
- * require. In all the cases we care about, the FOREIGN_FRAME bit is
- * masked (e.g., pfn_to_mfn()) so behaviour there is correct.
- */
-static inline unsigned long mfn_to_local_pfn(unsigned long mfn)
-{
- unsigned long pfn = mfn_to_pfn(mfn);
- if ((pfn < end_pfn)
- && !xen_feature(XENFEAT_auto_translated_physmap)
- && (phys_to_machine_mapping[pfn] != mfn))
- return end_pfn; /* force !pfn_valid() */
- return pfn;
-}
-
-
-static inline void set_phys_to_machine(unsigned long pfn, unsigned long mfn)
-{
- if (xen_feature(XENFEAT_auto_translated_physmap)) {
- BUG_ON(pfn != mfn && mfn != INVALID_P2M_ENTRY);
- return;
- }
- phys_to_machine_mapping[pfn] = mfn;
-}
-
-/* Definitions for machine and pseudophysical addresses. */
-typedef unsigned long paddr_t;
-typedef unsigned long maddr_t;
-
-static inline maddr_t phys_to_machine(paddr_t phys)
-{
- maddr_t machine = pfn_to_mfn(phys >> PAGE_SHIFT);
- machine = (machine << PAGE_SHIFT) | (phys & ~PAGE_MASK);
- return machine;
-}
-
-static inline paddr_t machine_to_phys(maddr_t machine)
-{
- paddr_t phys = mfn_to_pfn(machine >> PAGE_SHIFT);
- phys = (phys << PAGE_SHIFT) | (machine & ~PAGE_MASK);
- return phys;
-}
/*
* These are used to make use of C type-checking..
@@ -227,8 +116,6 @@ static inline unsigned long pgd_val(pgd_
}
#define pgprot_val(x) ((x).pgprot)
-
-#define __pte_ma(x) ((pte_t) { (x) } )
static inline pte_t __pte(unsigned long x)
{
@@ -310,11 +197,6 @@ static inline pgd_t __pgd(unsigned long
#define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT)
#define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT)
-/* VIRT <-> MACHINE conversion */
-#define virt_to_machine(v) (phys_to_machine(__pa(v)))
-#define virt_to_mfn(v) (pfn_to_mfn(__pa(v) >> PAGE_SHIFT))
-#define mfn_to_virt(m) (__va(mfn_to_pfn(m) << PAGE_SHIFT))
-
#define VM_DATA_DEFAULT_FLAGS \
(((current->personality & READ_IMPLIES_EXEC) ? VM_EXEC : 0 ) | \
VM_READ | VM_WRITE | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
diff -r 91169603a8e8 -r 79afceca9065
linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/pgtable.h
--- a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/pgtable.h Tue Aug
22 14:45:49 2006 -0600
+++ b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/pgtable.h Wed Aug
23 11:11:27 2006 -0600
@@ -206,7 +206,7 @@ static inline pte_t ptep_get_and_clear_f
#define _PAGE_NX (1UL<<_PAGE_BIT_NX)
#define _PAGE_TABLE (_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | _PAGE_ACCESSED
| _PAGE_DIRTY)
-#define _KERNPG_TABLE _PAGE_TABLE
+#define _KERNPG_TABLE (_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED |
_PAGE_DIRTY)
#define _PAGE_CHG_MASK (PTE_MASK | _PAGE_ACCESSED | _PAGE_DIRTY)
@@ -219,22 +219,21 @@ static inline pte_t ptep_get_and_clear_f
#define PAGE_READONLY __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED |
_PAGE_NX)
#define PAGE_READONLY_EXEC __pgprot(_PAGE_PRESENT | _PAGE_USER |
_PAGE_ACCESSED)
#define __PAGE_KERNEL \
- (_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_ACCESSED | _PAGE_NX |
_PAGE_USER )
+ (_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_ACCESSED | _PAGE_NX)
#define __PAGE_KERNEL_EXEC \
- (_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_ACCESSED | _PAGE_USER )
+ (_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_ACCESSED)
#define __PAGE_KERNEL_NOCACHE \
- (_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_PCD | _PAGE_ACCESSED |
_PAGE_NX | _PAGE_USER )
+ (_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_PCD | _PAGE_ACCESSED |
_PAGE_NX)
#define __PAGE_KERNEL_RO \
- (_PAGE_PRESENT | _PAGE_DIRTY | _PAGE_ACCESSED | _PAGE_NX | _PAGE_USER )
+ (_PAGE_PRESENT | _PAGE_DIRTY | _PAGE_ACCESSED | _PAGE_NX)
#define __PAGE_KERNEL_VSYSCALL \
- (_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED | _PAGE_USER )
+ (_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED)
#define __PAGE_KERNEL_VSYSCALL_NOCACHE \
- (_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED | _PAGE_PCD | _PAGE_USER )
+ (_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED | _PAGE_PCD)
#define __PAGE_KERNEL_LARGE \
- (__PAGE_KERNEL | _PAGE_PSE | _PAGE_USER )
+ (__PAGE_KERNEL | _PAGE_PSE)
#define __PAGE_KERNEL_LARGE_EXEC \
- (__PAGE_KERNEL_EXEC | _PAGE_PSE | _PAGE_USER )
-
+ (__PAGE_KERNEL_EXEC | _PAGE_PSE)
/*
* We don't support GLOBAL page in xenolinux64
@@ -312,7 +311,6 @@ static inline pte_t pfn_pte(unsigned lon
return pte;
}
-#define pfn_pte_ma(pfn, prot) __pte_ma((((pfn) << PAGE_SHIFT) |
pgprot_val(prot)) & __supported_pte_mask)
/*
* The following only work if pte_present() is true.
* Undefined behaviour if not..
@@ -424,7 +422,7 @@ static inline pud_t *pud_offset_k(pgd_t
can temporarily clear it. */
#define pmd_present(x) (pmd_val(x))
#define pmd_clear(xp) do { set_pmd(xp, __pmd(0)); } while (0)
-#define pmd_bad(x) ((pmd_val(x) & (~PAGE_MASK & ~_PAGE_PRESENT))
!= (_KERNPG_TABLE & ~_PAGE_PRESENT))
+#define pmd_bad(x) ((pmd_val(x) & (~PAGE_MASK & ~_PAGE_USER &
~_PAGE_PRESENT)) != (_KERNPG_TABLE & ~_PAGE_PRESENT))
#define pfn_pmd(nr,prot) (__pmd(((nr) << PAGE_SHIFT) | pgprot_val(prot)))
#define pmd_pfn(x) ((pmd_val(x) & __PHYSICAL_MASK) >> PAGE_SHIFT)
diff -r 91169603a8e8 -r 79afceca9065 linux-2.6-xen-sparse/include/xen/balloon.h
--- a/linux-2.6-xen-sparse/include/xen/balloon.h Tue Aug 22 14:45:49
2006 -0600
+++ b/linux-2.6-xen-sparse/include/xen/balloon.h Wed Aug 23 11:11:27
2006 -0600
@@ -38,19 +38,23 @@
* Inform the balloon driver that it should allow some slop for device-driver
* memory activities.
*/
-extern void
+void
balloon_update_driver_allowance(
long delta);
/* Allocate an empty low-memory page range. */
-extern struct page *
+struct page *
balloon_alloc_empty_page_range(
unsigned long nr_pages);
/* Deallocate an empty page range, adding to the balloon. */
-extern void
+void
balloon_dealloc_empty_page_range(
struct page *page, unsigned long nr_pages);
+
+void
+balloon_release_driver_page(
+ struct page *page);
/*
* Prevent the balloon driver from changing the memory reservation during
diff -r 91169603a8e8 -r 79afceca9065 linux-2.6-xen-sparse/include/xen/xenbus.h
--- a/linux-2.6-xen-sparse/include/xen/xenbus.h Tue Aug 22 14:45:49 2006 -0600
+++ b/linux-2.6-xen-sparse/include/xen/xenbus.h Wed Aug 23 11:11:27 2006 -0600
@@ -274,7 +274,7 @@ int xenbus_free_evtchn(struct xenbus_dev
/**
* Return the state of the driver rooted at the given store path, or
- * XenbusStateClosed if no state can be read.
+ * XenbusStateUnknown if no state can be read.
*/
enum xenbus_state xenbus_read_driver_state(const char *path);
@@ -295,5 +295,6 @@ void xenbus_dev_fatal(struct xenbus_devi
void xenbus_dev_fatal(struct xenbus_device *dev, int err, const char *fmt,
...);
+int __init xenbus_dev_init(void);
#endif /* _XEN_XENBUS_H */
diff -r 91169603a8e8 -r 79afceca9065 linux-2.6-xen-sparse/mm/memory.c
--- a/linux-2.6-xen-sparse/mm/memory.c Tue Aug 22 14:45:49 2006 -0600
+++ b/linux-2.6-xen-sparse/mm/memory.c Wed Aug 23 11:11:27 2006 -0600
@@ -390,7 +390,7 @@ struct page *vm_normal_page(struct vm_ar
if (vma->vm_flags & VM_PFNMAP) {
unsigned long off = (addr - vma->vm_start) >> PAGE_SHIFT;
- if (pfn == vma->vm_pgoff + off)
+ if ((pfn == vma->vm_pgoff + off) || !pfn_valid(pfn))
return NULL;
if (!is_cow_mapping(vma->vm_flags))
return NULL;
@@ -405,8 +405,7 @@ struct page *vm_normal_page(struct vm_ar
* Remove this test eventually!
*/
if (unlikely(!pfn_valid(pfn))) {
- if (!(vma->vm_flags & VM_RESERVED))
- print_bad_pte(vma, pte, addr);
+ print_bad_pte(vma, pte, addr);
return NULL;
}
diff -r 91169603a8e8 -r 79afceca9065 linux-2.6-xen-sparse/net/core/dev.c
--- a/linux-2.6-xen-sparse/net/core/dev.c Tue Aug 22 14:45:49 2006 -0600
+++ b/linux-2.6-xen-sparse/net/core/dev.c Wed Aug 23 11:11:27 2006 -0600
@@ -1093,11 +1093,6 @@ int skb_checksum_help(struct sk_buff *sk
goto out_set_summed;
if (unlikely(skb_shinfo(skb)->gso_size)) {
- static int warned;
-
- WARN_ON(!warned);
- warned = 1;
-
/* Let GSO fix up the checksum. */
goto out_set_summed;
}
@@ -1147,11 +1142,6 @@ struct sk_buff *skb_gso_segment(struct s
__skb_pull(skb, skb->mac_len);
if (unlikely(skb->ip_summed != CHECKSUM_HW)) {
- static int warned;
-
- WARN_ON(!warned);
- warned = 1;
-
if (skb_header_cloned(skb) &&
(err = pskb_expand_head(skb, 0, 0, GFP_ATOMIC)))
return ERR_PTR(err);
diff -r 91169603a8e8 -r 79afceca9065 tools/blktap/lib/Makefile
--- a/tools/blktap/lib/Makefile Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/blktap/lib/Makefile Wed Aug 23 11:11:27 2006 -0600
@@ -61,7 +61,7 @@ libblktap.a: $(OBJS)
-o libblktap.so.$(MAJOR).$(MINOR) $^ $(LIBS)
ln -sf libblktap.so.$(MAJOR).$(MINOR) libblktap.so.$(MAJOR)
ln -sf libblktap.so.$(MAJOR) libblktap.so
- ar rc $@ libblktap.so
+ $(AR) rc $@ libblktap.so
.PHONY: TAGS all build clean install libblktap
diff -r 91169603a8e8 -r 79afceca9065 tools/examples/xen-network-common.sh
--- a/tools/examples/xen-network-common.sh Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/examples/xen-network-common.sh Wed Aug 23 11:11:27 2006 -0600
@@ -143,6 +143,7 @@ add_to_bridge () {
# Don't add $dev to $bridge if it's already on a bridge.
if [ -e "/sys/class/net/${bridge}/brif/${dev}" ]; then
+ ip link set ${dev} up || true
return
fi
brctl addif ${bridge} ${dev}
diff -r 91169603a8e8 -r 79afceca9065 tools/examples/xend-config.sxp
--- a/tools/examples/xend-config.sxp Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/examples/xend-config.sxp Wed Aug 23 11:11:27 2006 -0600
@@ -54,7 +54,7 @@
# (xend-relocation-hosts-allow '^localhost$ ^.*\.example\.org$')
#
#(xend-relocation-hosts-allow '')
-(xend-relocation-hosts-allow '^localhost$ ^localhost\.localdomain$')
+(xend-relocation-hosts-allow '^localhost$ ^localhost\\.localdomain$')
# The limit (in kilobytes) on the size of the console buffer
#(console-limit 1024)
diff -r 91169603a8e8 -r 79afceca9065 tools/examples/xmexample.hvm
--- a/tools/examples/xmexample.hvm Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/examples/xmexample.hvm Wed Aug 23 11:11:27 2006 -0600
@@ -26,6 +26,10 @@ builder='hvm'
# memory errors. The domain needs enough memory to boot kernel
# and modules. Allocating less than 32MBs is not recommended.
memory = 128
+
+# Shadow pagetable memory for the domain, in MB.
+# Should be at least 2KB per MB of domain memory, plus a few MB per vcpu.
+shadow_memory = 8
# A name for your domain. All domains must have different names.
name = "ExampleHVMDomain"
@@ -112,7 +116,9 @@ device_model = '/usr/' + arch_libdir + '
#-----------------------------------------------------------------------------
# boot on floppy (a), hard disk (c) or CD-ROM (d)
-#boot=[a|c|d]
+# default: hard disk, cd-rom, floppy
+#boot="cda"
+
#-----------------------------------------------------------------------------
# write to temporary files instead of disk image files
#snapshot=1
diff -r 91169603a8e8 -r 79afceca9065 tools/examples/xmexample.vti
--- a/tools/examples/xmexample.vti Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/examples/xmexample.vti Wed Aug 23 11:11:27 2006 -0600
@@ -66,7 +66,9 @@ device_model = '/usr/' + arch_libdir + '
#-----------------------------------------------------------------------------
# boot on floppy (a), hard disk (c) or CD-ROM (d)
-#boot=[a|c|d]
+# default: hard disk, cd-rom, floppy
+#boot="cda"
+
#-----------------------------------------------------------------------------
# write to temporary files instead of disk image files
#snapshot=1
diff -r 91169603a8e8 -r 79afceca9065 tools/firmware/acpi/acpi_fadt.h
--- a/tools/firmware/acpi/acpi_fadt.h Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/firmware/acpi/acpi_fadt.h Wed Aug 23 11:11:27 2006 -0600
@@ -59,8 +59,7 @@
#define ACPI_PM1A_EVT_BLK_ADDRESS_SPACE_ID ACPI_SYSTEM_IO
#define ACPI_PM1A_EVT_BLK_BIT_WIDTH 0x20
#define ACPI_PM1A_EVT_BLK_BIT_OFFSET 0x00
-//#define ACPI_PM1A_EVT_BLK_ADDRESS 0x000000000000c010
-#define ACPI_PM1A_EVT_BLK_ADDRESS 0x000000000000c040
+#define ACPI_PM1A_EVT_BLK_ADDRESS 0x000000000000c010
//
// PM1B Event Register Block Generic Address Information
diff -r 91169603a8e8 -r 79afceca9065 tools/firmware/hvmloader/Makefile
--- a/tools/firmware/hvmloader/Makefile Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/firmware/hvmloader/Makefile Wed Aug 23 11:11:27 2006 -0600
@@ -31,8 +31,6 @@ DEFINES =-DDEBUG
DEFINES =-DDEBUG
XENINC =-I$(XEN_ROOT)/tools/libxc
-OBJECTS = hvmloader.o acpi_madt.o
-
# Disable PIE/SSP if GCC supports them. They can break us.
CFLAGS += $(call test-gcc-flag,$(CC),-nopie)
CFLAGS += $(call test-gcc-flag,$(CC),-fno-stack-protector)
@@ -42,7 +40,7 @@ CFLAGS += $(DEFINES) -I. $(XENINC) -fno
CFLAGS += $(DEFINES) -I. $(XENINC) -fno-builtin -O2 -msoft-float
LDFLAGS = -m32 -nostdlib -Wl,-N -Wl,-Ttext -Wl,$(LOADADDR)
-SRCS = hvmloader.c acpi_madt.c mp_tables.c util.c
+SRCS = hvmloader.c acpi_madt.c mp_tables.c util.c smbios.c
OBJS = $(patsubst %.c,%.o,$(SRCS))
.PHONY: all
@@ -54,7 +52,7 @@ hvmloader: roms.h $(SRCS)
$(OBJCOPY) hvmloader.tmp hvmloader
rm -f hvmloader.tmp
-roms.h: ../rombios/BIOS-bochs-latest ../vgabios/VGABIOS-lgpl-latest.bin
../vgabios/VGABIOS-lgpl-latest.cirrus.bin ../vmxassist/vmxassist.bin
+roms.h: ../rombios/BIOS-bochs-latest ../vgabios/VGABIOS-lgpl-latest.bin
../vgabios/VGABIOS-lgpl-latest.cirrus.bin ../vmxassist/vmxassist.bin
../acpi/acpi.bin
sh ./mkhex rombios ../rombios/BIOS-bochs-latest > roms.h
sh ./mkhex vgabios_stdvga ../vgabios/VGABIOS-lgpl-latest.bin >> roms.h
sh ./mkhex vgabios_cirrusvga ../vgabios/VGABIOS-lgpl-latest.cirrus.bin
>> roms.h
@@ -64,5 +62,5 @@ roms.h: ../rombios/BIOS-bochs-latest ../
.PHONY: clean
clean:
rm -f roms.h acpi.h
- rm -f hvmloader hvmloader.tmp hvmloader.o $(OBJECTS)
+ rm -f hvmloader hvmloader.tmp hvmloader.o $(OBJS)
diff -r 91169603a8e8 -r 79afceca9065 tools/firmware/hvmloader/hvmloader.c
--- a/tools/firmware/hvmloader/hvmloader.c Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/firmware/hvmloader/hvmloader.c Wed Aug 23 11:11:27 2006 -0600
@@ -25,8 +25,9 @@
#include "../acpi/acpi2_0.h" /* for ACPI_PHYSICAL_ADDRESS */
#include "hypercall.h"
#include "util.h"
+#include "smbios.h"
#include <xen/version.h>
-#include <xen/hvm/hvm_info_table.h>
+#include <xen/hvm/params.h>
/* memory map */
#define HYPERCALL_PHYSICAL_ADDRESS 0x00080000
@@ -116,15 +117,6 @@ check_amd(void)
}
static void
-cpuid(uint32_t idx, uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx)
-{
- __asm__ __volatile__(
- "cpuid"
- : "=a" (*eax), "=b" (*ebx), "=c" (*ecx), "=d" (*edx)
- : "0" (idx) );
-}
-
-static void
wrmsr(uint32_t idx, uint64_t v)
{
__asm__ __volatile__(
@@ -172,7 +164,7 @@ int
int
main(void)
{
- struct hvm_info_table *t = get_hvm_info_table();
+ struct xen_hvm_param hvm_param;
puts("HVM Loader\n");
@@ -180,7 +172,10 @@ main(void)
puts("Loading ROMBIOS ...\n");
memcpy((void *)ROMBIOS_PHYSICAL_ADDRESS, rombios, sizeof(rombios));
- if (t->apic_enabled)
+
+ hvm_param.domid = DOMID_SELF;
+ hvm_param.index = HVM_PARAM_APIC_ENABLED;
+ if (!hypercall_hvm_op(HVMOP_get_param, &hvm_param) && hvm_param.value)
create_mp_tables();
if (cirrus_check()) {
@@ -206,6 +201,9 @@ main(void)
}
}
+ puts("Writing SMBIOS tables ...\n");
+ hvm_write_smbios_tables();
+
if (check_amd()) {
/* AMD implies this is SVM */
puts("SVM go ...\n");
diff -r 91169603a8e8 -r 79afceca9065 tools/firmware/hvmloader/hypercall.h
--- a/tools/firmware/hvmloader/hypercall.h Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/firmware/hvmloader/hypercall.h Wed Aug 23 11:11:27 2006 -0600
@@ -30,6 +30,8 @@
#ifndef __HVMLOADER_HYPERCALL_H__
#define __HVMLOADER_HYPERCALL_H__
+
+#include <xen/xen.h>
/*
* NB. Hypercall address needs to be relative to a linkage symbol for
diff -r 91169603a8e8 -r 79afceca9065 tools/firmware/hvmloader/util.c
--- a/tools/firmware/hvmloader/util.c Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/firmware/hvmloader/util.c Wed Aug 23 11:11:27 2006 -0600
@@ -20,6 +20,7 @@
#include "../acpi/acpi2_0.h" /* for ACPI_PHYSICAL_ADDRESS */
#include "util.h"
+#include <stdint.h>
void outw(uint16_t addr, uint16_t val)
{
@@ -94,3 +95,82 @@ void puts(const char *s)
while (*s)
outb(0xE9, *s++);
}
+
+char *
+strcpy(char *dest, const char *src)
+{
+ char *p = dest;
+ while (*src)
+ *p++ = *src++;
+ *p = 0;
+ return dest;
+}
+
+char *
+strncpy(char *dest, const char *src, unsigned n)
+{
+ int i = 0;
+ char *p = dest;
+
+ /* write non-NUL characters from src into dest until we run
+ out of room in dest or encounter a NUL in src */
+ while (i < n && *src) {
+ *p++ = *src++;
+ ++i;
+ }
+
+ /* pad remaining bytes of dest with NUL bytes */
+ while (i < n) {
+ *p++ = 0;
+ ++i;
+ }
+
+ return dest;
+}
+
+unsigned
+strlen(const char *s)
+{
+ int i = 0;
+ while (*s++)
+ ++i;
+ return i;
+}
+
+void *
+memset(void *s, int c, unsigned n)
+{
+ uint8_t b = (uint8_t) c;
+ uint8_t *p = (uint8_t *)s;
+ int i;
+ for (i = 0; i < n; ++i)
+ *p++ = b;
+ return s;
+}
+
+int
+memcmp(const void *s1, const void *s2, unsigned n)
+{
+ unsigned i;
+ uint8_t *p1 = (uint8_t *) s1;
+ uint8_t *p2 = (uint8_t *) s2;
+
+ for (i = 0; i < n; ++i) {
+ if (p1[i] < p2[i])
+ return -1;
+ else if (p1[i] > p2[i])
+ return 1;
+ }
+
+ return 0;
+}
+
+void
+cpuid(uint32_t idx, uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx)
+{
+ __asm__ __volatile__(
+ "cpuid"
+ : "=a" (*eax), "=b" (*ebx), "=c" (*ecx), "=d" (*edx)
+ : "0" (idx) );
+}
+
diff -r 91169603a8e8 -r 79afceca9065 tools/firmware/hvmloader/util.h
--- a/tools/firmware/hvmloader/util.h Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/firmware/hvmloader/util.h Wed Aug 23 11:11:27 2006 -0600
@@ -8,9 +8,21 @@ void outb(uint16_t addr, uint8_t val);
/* I/O input */
uint8_t inb(uint16_t addr);
+/* Do cpuid instruction, with operation 'idx' */
+void cpuid(uint32_t idx, uint32_t *eax, uint32_t *ebx,
+ uint32_t *ecx, uint32_t *edx);
+
+/* Return number of vcpus. */
+int get_vcpu_nr(void);
+
/* String and memory functions */
int strcmp(const char *cs, const char *ct);
+char *strcpy(char *dest, const char *src);
+char *strncpy(char *dest, const char *src, unsigned n);
+unsigned strlen(const char *s);
+int memcmp(const void *s1, const void *s2, unsigned n);
void *memcpy(void *dest, const void *src, unsigned n);
+void *memset(void *s, int c, unsigned n);
char *itoa(char *a, unsigned int i);
/* Debug output */
diff -r 91169603a8e8 -r 79afceca9065 tools/firmware/rombios/apmbios.S
--- a/tools/firmware/rombios/apmbios.S Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/firmware/rombios/apmbios.S Wed Aug 23 11:11:27 2006 -0600
@@ -225,7 +225,10 @@ APMSYM(05):
APMSYM(05):
cmp al, #0x05
jne APMSYM(07)
+ pushf ; XEN
+ sti ; XEN: OS calls us with ints disabled -- better re-enable here!
hlt
+ popf ; XEN
jmp APMSYM(ok)
;-----------------
diff -r 91169603a8e8 -r 79afceca9065 tools/firmware/rombios/rombios.c
--- a/tools/firmware/rombios/rombios.c Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/firmware/rombios/rombios.c Wed Aug 23 11:11:27 2006 -0600
@@ -9443,6 +9443,43 @@ rom_scan_increment:
mov ds, ax
ret
+#ifdef HVMASSIST
+
+; Copy the SMBIOS entry point over from 0x9f000, where hvmloader left it.
+; The entry point must be somewhere in 0xf0000-0xfffff on a 16-byte boundary,
+; but the tables themeselves can be elsewhere.
+smbios_init:
+ push ax
+ push cx
+ push es
+ push ds
+ push di
+ push si
+
+ mov cx, #0x001f ; 0x1f bytes to copy
+ mov ax, #0xf000
+ mov es, ax ; destination segment is 0xf0000
+ mov di, #smbios_entry_point ; destination offset
+ mov ax, #0x9f00
+ mov ds, ax ; source segment is 0x9f000
+ mov si, #0x0000 ; source offset is 0
+ cld
+ rep
+ movsb
+
+ pop si
+ pop di
+ pop ds
+ pop es
+ pop cx
+ pop ax
+
+ ret
+
+#endif
+
+
+
;; for 'C' strings and other data, insert them here with
;; a the following hack:
;; DATA_SEG_DEFS_HERE
@@ -9724,6 +9761,7 @@ post_default_ints:
#ifdef HVMASSIST
call _copy_e820_table
+ call smbios_init
#endif
call rom_scan
@@ -10538,6 +10576,13 @@ dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;; 768 bytes
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;; 832 bytes
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;; 896 bytes
+
+.align 16
+smbios_entry_point:
+db 0,0,0,0,0,0,0,0 ; 8 bytes
+db 0,0,0,0,0,0,0,0 ; 16 bytes
+db 0,0,0,0,0,0,0,0 ; 24 bytes
+db 0,0,0,0,0,0,0 ; 31 bytes
ASM_END
#else // !HVMASSIST
diff -r 91169603a8e8 -r 79afceca9065 tools/firmware/vmxassist/head.S
--- a/tools/firmware/vmxassist/head.S Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/firmware/vmxassist/head.S Wed Aug 23 11:11:27 2006 -0600
@@ -114,8 +114,6 @@ _start:
#ifdef TEST
xorl %edx, %edx
#endif
- movl %edx, booting_cpu
- movl %ebx, booting_vector
/* clear bss */
cld
@@ -124,6 +122,9 @@ _start:
movl $_ebss, %ecx
subl %edi, %ecx
rep stosb
+
+ movl %edx, booting_cpu
+ movl %ebx, booting_vector
/* make sure we are in a sane world */
clts
diff -r 91169603a8e8 -r 79afceca9065 tools/firmware/vmxassist/setup.c
--- a/tools/firmware/vmxassist/setup.c Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/firmware/vmxassist/setup.c Wed Aug 23 11:11:27 2006 -0600
@@ -56,7 +56,7 @@ struct e820entry e820map[] = {
{ 0x00000000000A0000ULL, 0x0000000000020000ULL, E820_IO },
{ 0x00000000000C0000ULL, 0x0000000000040000ULL, E820_RESERVED },
{ 0x0000000000100000ULL, 0x0000000000000000ULL, E820_RAM },
- { 0x0000000000000000ULL, 0x0000000000001000ULL, E820_SHARED },
+ { 0x0000000000000000ULL, 0x0000000000001000ULL, E820_SHARED_PAGE },
{ 0x0000000000000000ULL, 0x0000000000003000ULL, E820_NVS },
{ 0x0000000000003000ULL, 0x000000000000A000ULL, E820_ACPI },
{ 0x00000000FEC00000ULL, 0x0000000001400000ULL, E820_IO },
@@ -94,13 +94,13 @@ banner(void)
e820map[6].addr = memory_size;
e820map[7].addr += memory_size;
- *LINUX_E820_MAP_NR = sizeof(e820map)/sizeof(e820map[0]);
- memcpy(LINUX_E820_MAP, e820map, sizeof(e820map));
+ *E820_MAP_NR = sizeof(e820map)/sizeof(e820map[0]);
+ memcpy(E820_MAP, e820map, sizeof(e820map));
#endif
printf("Memory size %ld MB\n", memory_size >> 20);
printf("E820 map:\n");
- print_e820_map(LINUX_E820_MAP, *LINUX_E820_MAP_NR);
+ print_e820_map(E820_MAP, *E820_MAP_NR);
printf("\n");
}
diff -r 91169603a8e8 -r 79afceca9065 tools/firmware/vmxassist/util.h
--- a/tools/firmware/vmxassist/util.h Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/firmware/vmxassist/util.h Wed Aug 23 11:11:27 2006 -0600
@@ -23,23 +23,9 @@
#include <stdarg.h>
#include <vm86.h>
-
-#define LINUX_E820_MAP_NR ((unsigned char *)0x901E8)
-#define LINUX_E820_MAP ((struct e820entry *)0x902D0)
-
-#define E820_RAM 1
-#define E820_RESERVED 2
-#define E820_ACPI 3
-#define E820_NVS 4
-#define E820_IO 16
-#define E820_SHARED 17
-
-struct e820entry {
- unsigned long long addr;
- unsigned long long size;
- unsigned long type;
-} __attribute__((packed));
-
+#include <xen/hvm/e820.h>
+#define E820_MAP_NR ((unsigned char *)E820_MAP_PAGE + E820_MAP_NR_OFFSET)
+#define E820_MAP ((struct e820entry *)(E820_MAP_PAGE + E820_MAP_OFFSET))
#define offsetof(type, member) ((unsigned) &((type *)0)->member)
diff -r 91169603a8e8 -r 79afceca9065 tools/firmware/vmxassist/vm86.c
--- a/tools/firmware/vmxassist/vm86.c Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/firmware/vmxassist/vm86.c Wed Aug 23 11:11:27 2006 -0600
@@ -983,7 +983,9 @@ set_mode(struct regs *regs, enum vm86_mo
case VM86_PROTECTED:
if (mode == VM86_REAL_TO_PROTECTED) {
protected_mode(regs);
- break;
+// printf("<VM86_PROTECTED>\n");
+ mode = newmode;
+ return;
} else
panic("unexpected protected mode transition");
break;
@@ -1170,6 +1172,26 @@ inbyte(struct regs *regs, unsigned prefi
return 1;
}
+static void
+pushrm(struct regs *regs, int prefix, unsigned modrm)
+{
+ unsigned n = regs->eip;
+ unsigned addr;
+ unsigned data;
+
+ addr = operand(prefix, regs, modrm);
+
+ if (prefix & DATA32) {
+ data = read32(addr);
+ push32(regs, data);
+ } else {
+ data = read16(addr);
+ push16(regs, data);
+ }
+
+ TRACE((regs, (regs->eip - n) + 1, "push *0x%x", addr));
+}
+
enum { OPC_INVALID, OPC_EMULATED };
/*
@@ -1186,6 +1208,14 @@ opcode(struct regs *regs)
for (;;) {
switch ((opc = fetch8(regs))) {
+ case 0x07:
+ if (prefix & DATA32)
+ regs->ves = pop32(regs);
+ else
+ regs->ves = pop16(regs);
+ TRACE((regs, regs->eip - eip, "pop %%es"));
+ return OPC_EMULATED;
+
case 0x0F: /* two byte opcode */
if (mode == VM86_PROTECTED)
goto invalid;
@@ -1288,6 +1318,22 @@ opcode(struct regs *regs)
return OPC_EMULATED;
case 0x89: /* addr32 mov r16, r/m16 */
+ if (mode == VM86_PROTECTED_TO_REAL) {
+ unsigned modrm = fetch8(regs);
+ unsigned addr = operand(prefix, regs, modrm);
+ unsigned val, r = (modrm >> 3) & 7;
+
+ if (prefix & DATA32) {
+ val = getreg16(regs, r);
+ write32(addr, val);
+ } else {
+ val = getreg32(regs, r);
+ write16(addr, MASK16(val));
+ }
+ TRACE((regs, regs->eip - eip,
+ "mov %%%s, *0x%x", rnames[r], addr));
+ return OPC_EMULATED;
+ }
case 0x8B: /* addr32 mov r/m16, r16 */
if (mode != VM86_REAL && mode != VM86_REAL_TO_PROTECTED)
goto invalid;
@@ -1324,6 +1370,37 @@ opcode(struct regs *regs)
regs->eflags = (regs->eflags & 0xFFFF0000L) |
pop16(regs);
regs->eflags |= EFLAGS_VM;
+ return OPC_EMULATED;
+
+ case 0xA1: /* mov ax, r/m16 */
+ {
+ int addr, data;
+ int seg = segment(prefix, regs, regs->vds);
+ if (prefix & DATA32) {
+ addr = address(regs, seg,
fetch32(regs));
+ data = read32(addr);
+ setreg32(regs, 0, data);
+ } else {
+ addr = address(regs, seg,
fetch16(regs));
+ data = read16(addr);
+ setreg16(regs, 0, data);
+ }
+ TRACE((regs, regs->eip - eip, "mov *0x%x,
%%ax", addr));
+ }
+ return OPC_EMULATED;
+
+ case 0xBB: /* mov bx, imm16 */
+ {
+ int data;
+ if (prefix & DATA32) {
+ data = fetch32(regs);
+ setreg32(regs, 3, data);
+ } else {
+ data = fetch16(regs);
+ setreg16(regs, 3, data);
+ }
+ TRACE((regs, regs->eip - eip, "mov $0x%x,
%%bx", data));
+ }
return OPC_EMULATED;
case 0xC6: /* addr32 movb $imm, r/m8 */
@@ -1380,21 +1457,25 @@ opcode(struct regs *regs)
goto invalid;
case 0xFF: /* jmpl (indirect) */
- if ((mode == VM86_REAL_TO_PROTECTED) ||
- (mode == VM86_PROTECTED_TO_REAL)) {
- unsigned modrm = fetch8(regs);
-
+ {
+ unsigned modrm = fetch8(regs);
switch((modrm >> 3) & 7) {
- case 5:
- jmpl_indirect(regs, prefix, modrm);
- return OPC_INVALID;
+ case 5: /* jmpl (indirect) */
+ if ((mode == VM86_REAL_TO_PROTECTED) ||
+ (mode == VM86_PROTECTED_TO_REAL)) {
+ jmpl_indirect(regs, prefix,
modrm);
+ return OPC_INVALID;
+ }
+ goto invalid;
+
+ case 6: /* push r/m16 */
+ pushrm(regs, prefix, modrm);
+ return OPC_EMULATED;
default:
- break;
+ goto invalid;
}
-
}
- goto invalid;
case 0xEB: /* short jump */
if ((mode == VM86_REAL_TO_PROTECTED) ||
diff -r 91169603a8e8 -r 79afceca9065 tools/firmware/vmxassist/vmxassist.ld
--- a/tools/firmware/vmxassist/vmxassist.ld Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/firmware/vmxassist/vmxassist.ld Wed Aug 23 11:11:27 2006 -0600
@@ -6,27 +6,27 @@ ENTRY(_start)
SECTIONS
{
+ _btext = .;
.text TEXTADDR :
{
- _btext = .;
*(.text)
*(.rodata)
*(.rodata.*)
- _etext = .;
}
+ _etext = .;
+ _bdata = .;
.data :
{
- _bdata = .;
*(.data)
- _edata = .;
}
+ _edata = .;
+ _bbss = .;
.bss :
{
- _bbss = .;
*(.bss)
- _ebss = .;
}
+ _ebss = .;
}
diff -r 91169603a8e8 -r 79afceca9065 tools/ioemu/Makefile.target
--- a/tools/ioemu/Makefile.target Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/ioemu/Makefile.target Wed Aug 23 11:11:27 2006 -0600
@@ -359,6 +359,7 @@ VL_OBJS+= usb-uhci.o
VL_OBJS+= usb-uhci.o
VL_OBJS+= piix4acpi.o
VL_OBJS+= xenstore.o
+VL_OBJS+= xen_platform.o
DEFINES += -DHAS_AUDIO
endif
ifeq ($(TARGET_BASE_ARCH), ppc)
diff -r 91169603a8e8 -r 79afceca9065 tools/ioemu/block-bochs.c
--- a/tools/ioemu/block-bochs.c Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/ioemu/block-bochs.c Wed Aug 23 11:11:27 2006 -0600
@@ -91,7 +91,7 @@ static int bochs_open(BlockDriverState *
int fd, i;
struct bochs_header bochs;
- fd = open(filename, O_RDWR | O_BINARY | O_LARGEFILE | O_SYNC);
+ fd = open(filename, O_RDWR | O_BINARY | O_LARGEFILE);
if (fd < 0) {
fd = open(filename, O_RDONLY | O_BINARY | O_LARGEFILE);
if (fd < 0)
diff -r 91169603a8e8 -r 79afceca9065 tools/ioemu/block-cloop.c
--- a/tools/ioemu/block-cloop.c Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/ioemu/block-cloop.c Wed Aug 23 11:11:27 2006 -0600
@@ -55,7 +55,7 @@ static int cloop_open(BlockDriverState *
BDRVCloopState *s = bs->opaque;
uint32_t offsets_size,max_compressed_block_size=1,i;
- s->fd = open(filename, O_RDONLY | O_BINARY | O_LARGEFILE | O_SYNC);
+ s->fd = open(filename, O_RDONLY | O_BINARY | O_LARGEFILE);
if (s->fd < 0)
return -1;
bs->read_only = 1;
diff -r 91169603a8e8 -r 79afceca9065 tools/ioemu/block-cow.c
--- a/tools/ioemu/block-cow.c Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/ioemu/block-cow.c Wed Aug 23 11:11:27 2006 -0600
@@ -69,7 +69,7 @@ static int cow_open(BlockDriverState *bs
struct cow_header_v2 cow_header;
int64_t size;
- fd = open(filename, O_RDWR | O_BINARY | O_LARGEFILE | O_SYNC);
+ fd = open(filename, O_RDWR | O_BINARY | O_LARGEFILE);
if (fd < 0) {
fd = open(filename, O_RDONLY | O_BINARY | O_LARGEFILE);
if (fd < 0)
diff -r 91169603a8e8 -r 79afceca9065 tools/ioemu/block-qcow.c
--- a/tools/ioemu/block-qcow.c Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/ioemu/block-qcow.c Wed Aug 23 11:11:27 2006 -0600
@@ -95,7 +95,7 @@ static int qcow_open(BlockDriverState *b
int fd, len, i, shift;
QCowHeader header;
- fd = open(filename, O_RDWR | O_BINARY | O_LARGEFILE | O_SYNC);
+ fd = open(filename, O_RDWR | O_BINARY | O_LARGEFILE);
if (fd < 0) {
fd = open(filename, O_RDONLY | O_BINARY | O_LARGEFILE);
if (fd < 0)
diff -r 91169603a8e8 -r 79afceca9065 tools/ioemu/block-vmdk.c
--- a/tools/ioemu/block-vmdk.c Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/ioemu/block-vmdk.c Wed Aug 23 11:11:27 2006 -0600
@@ -96,7 +96,7 @@ static int vmdk_open(BlockDriverState *b
uint32_t magic;
int l1_size;
- fd = open(filename, O_RDWR | O_BINARY | O_LARGEFILE | O_SYNC);
+ fd = open(filename, O_RDWR | O_BINARY | O_LARGEFILE);
if (fd < 0) {
fd = open(filename, O_RDONLY | O_BINARY | O_LARGEFILE);
if (fd < 0)
diff -r 91169603a8e8 -r 79afceca9065 tools/ioemu/block.c
--- a/tools/ioemu/block.c Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/ioemu/block.c Wed Aug 23 11:11:27 2006 -0600
@@ -685,7 +685,7 @@ static int raw_open(BlockDriverState *bs
int rv;
#endif
- fd = open(filename, O_RDWR | O_BINARY | O_LARGEFILE | O_SYNC);
+ fd = open(filename, O_RDWR | O_BINARY | O_LARGEFILE);
if (fd < 0) {
fd = open(filename, O_RDONLY | O_BINARY | O_LARGEFILE);
if (fd < 0)
diff -r 91169603a8e8 -r 79afceca9065 tools/ioemu/hw/ide.c
--- a/tools/ioemu/hw/ide.c Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/ioemu/hw/ide.c Wed Aug 23 11:11:27 2006 -0600
@@ -305,6 +305,7 @@ typedef struct IDEState {
PCIDevice *pci_dev;
struct BMDMAState *bmdma;
int drive_serial;
+ int write_cache;
/* ide regs */
uint8_t feature;
uint8_t error;
@@ -789,6 +790,9 @@ static void ide_sector_write(IDEState *s
}
ide_set_sector(s, sector_num + n);
+ if (!s->write_cache)
+ bdrv_flush(s->bs);
+
#ifdef TARGET_I386
if (win2k_install_hack && ((++s->irq_count % 16) == 0)) {
/* It seems there is a bug in the Windows 2000 installer HDD
@@ -863,6 +867,10 @@ static int ide_write_dma_cb(IDEState *s,
transfer_size -= len;
phys_addr += len;
}
+ /* Ensure the data hit disk before telling the guest OS so. */
+ if (!s->write_cache)
+ bdrv_flush(s->bs);
+
return transfer_size1 - transfer_size;
}
@@ -1672,7 +1680,15 @@ static void ide_ioport_write(void *opaqu
/* XXX: valid for CDROM ? */
switch(s->feature) {
case 0x02: /* write cache enable */
+ s->write_cache = 1;
+ s->status = READY_STAT | SEEK_STAT;
+ ide_set_irq(s);
+ break;
case 0x82: /* write cache disable */
+ s->write_cache = 0;
+ s->status = READY_STAT | SEEK_STAT;
+ ide_set_irq(s);
+ break;
case 0xaa: /* read look-ahead enable */
case 0x55: /* read look-ahead disable */
s->status = READY_STAT | SEEK_STAT;
@@ -2090,6 +2106,7 @@ static void ide_init2(IDEState *ide_stat
s->irq = irq;
s->sector_write_timer = qemu_new_timer(vm_clock,
ide_sector_write_timer_cb, s);
+ s->write_cache = 0;
ide_reset(s);
}
}
diff -r 91169603a8e8 -r 79afceca9065 tools/ioemu/hw/pc.c
--- a/tools/ioemu/hw/pc.c Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/ioemu/hw/pc.c Wed Aug 23 11:11:27 2006 -0600
@@ -158,8 +158,23 @@ static void cmos_init_hd(int type_ofs, i
rtc_set_memory(s, info_ofs + 8, sectors);
}
+static int get_bios_disk(char *boot_device, int index) {
+
+ if (index < strlen(boot_device)) {
+ switch (boot_device[index]) {
+ case 'a':
+ return 0x01; /* floppy */
+ case 'c':
+ return 0x02; /* hard drive */
+ case 'd':
+ return 0x03; /* cdrom */
+ }
+ }
+ return 0x00; /* no device */
+}
+
/* hd_table must contain 4 block drivers */
-static void cmos_init(uint64_t ram_size, int boot_device, BlockDriverState
**hd_table, time_t timeoffset)
+static void cmos_init(uint64_t ram_size, char *boot_device, BlockDriverState
**hd_table, time_t timeoffset)
{
RTCState *s = rtc_state;
int val;
@@ -205,21 +220,14 @@ static void cmos_init(uint64_t ram_size,
rtc_set_memory(s, 0x34, val);
rtc_set_memory(s, 0x35, val >> 8);
- switch(boot_device) {
- case 'a':
- case 'b':
- rtc_set_memory(s, 0x3d, 0x01); /* floppy boot */
- if (!fd_bootchk)
- rtc_set_memory(s, 0x38, 0x01); /* disable signature check */
- break;
- default:
- case 'c':
- rtc_set_memory(s, 0x3d, 0x02); /* hard drive boot */
- break;
- case 'd':
- rtc_set_memory(s, 0x3d, 0x03); /* CD-ROM boot */
- break;
- }
+ if (boot_device == NULL) {
+ /* default to hd, then cd, then floppy. */
+ boot_device = "cda";
+ }
+ rtc_set_memory(s, 0x3d, get_bios_disk(boot_device, 0) |
+ (get_bios_disk(boot_device, 1) << 4));
+ rtc_set_memory(s, 0x38, (get_bios_disk(boot_device, 2) << 4) |
+ (!fd_bootchk ? 0x01 : 0x00));
/* floppy type */
@@ -572,9 +580,6 @@ static int parallel_io[MAX_PARALLEL_PORT
static int parallel_io[MAX_PARALLEL_PORTS] = { 0x378, 0x278, 0x3bc };
static int parallel_irq[MAX_PARALLEL_PORTS] = { 7, 7, 7 };
-/* PIIX4 acpi pci configuration space, func 3 */
-extern void pci_piix4_acpi_init(PCIBus *bus, int devfn);
-
#ifdef HAS_AUDIO
static void audio_init (PCIBus *pci_bus)
{
@@ -620,7 +625,7 @@ static void pc_init_ne2k_isa(NICInfo *nd
#define NOBIOS 1
/* PC hardware initialisation */
-static void pc_init1(uint64_t ram_size, int vga_ram_size, int boot_device,
+static void pc_init1(uint64_t ram_size, int vga_ram_size, char *boot_device,
DisplayState *ds, const char **fd_filename, int snapshot,
const char *kernel_filename, const char *kernel_cmdline,
const char *initrd_filename, time_t timeoffset,
@@ -826,6 +831,9 @@ static void pc_init1(uint64_t ram_size,
}
#endif /* !CONFIG_DM */
+ if (pci_enabled)
+ pci_xen_platform_init(pci_bus);
+
for(i = 0; i < MAX_SERIAL_PORTS; i++) {
if (serial_hds[i]) {
serial_init(&pic_set_irq_new, isa_pic,
@@ -879,15 +887,17 @@ static void pc_init1(uint64_t ram_size,
/* using PIIX4 acpi model */
if (pci_enabled && acpi_enabled)
- pci_piix4_acpi_init(pci_bus, piix3_devfn + 3);
+ pci_piix4_acpi_init(pci_bus, piix3_devfn + 2);
if (pci_enabled && usb_enabled) {
- usb_uhci_init(pci_bus, piix3_devfn + 2);
- }
-
- if (pci_enabled && acpi_enabled && 0) {
+ usb_uhci_init(pci_bus, piix3_devfn + (acpi_enabled ? 3 : 2));
+ }
+
+#ifndef CONFIG_DM
+ if (pci_enabled && acpi_enabled) {
piix4_pm_init(pci_bus, piix3_devfn + 3);
}
+#endif /* !CONFIG_DM */
#if 0
/* ??? Need to figure out some way for the user to
@@ -910,12 +920,14 @@ static void pc_init1(uint64_t ram_size,
/* XXX: should be done in the Bochs BIOS */
if (pci_enabled) {
pci_bios_init();
+#ifndef CONFIG_DM
if (acpi_enabled)
acpi_bios_init();
- }
-}
-
-static void pc_init_pci(uint64_t ram_size, int vga_ram_size, int boot_device,
+#endif /* !CONFIG_DM */
+ }
+}
+
+static void pc_init_pci(uint64_t ram_size, int vga_ram_size, char *boot_device,
DisplayState *ds, const char **fd_filename,
int snapshot,
const char *kernel_filename,
@@ -929,7 +941,7 @@ static void pc_init_pci(uint64_t ram_siz
initrd_filename, timeoffset, 1);
}
-static void pc_init_isa(uint64_t ram_size, int vga_ram_size, int boot_device,
+static void pc_init_isa(uint64_t ram_size, int vga_ram_size, char *boot_device,
DisplayState *ds, const char **fd_filename,
int snapshot,
const char *kernel_filename,
diff -r 91169603a8e8 -r 79afceca9065 tools/ioemu/hw/piix4acpi.c
--- a/tools/ioemu/hw/piix4acpi.c Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/ioemu/hw/piix4acpi.c Wed Aug 23 11:11:27 2006 -0600
@@ -374,13 +374,13 @@ static void acpi_map(PCIDevice *pci_dev,
register_ioport_read(addr + 8, 4, 4, acpiPm1Timer_readl, d);
}
-/* PIIX4 acpi pci configuration space, func 3 */
+/* PIIX4 acpi pci configuration space, func 2 */
void pci_piix4_acpi_init(PCIBus *bus, int devfn)
{
PCIAcpiState *d;
uint8_t *pci_conf;
- /* register a function 3 of PIIX4 */
+ /* register a function 2 of PIIX4 */
d = (PCIAcpiState *)pci_register_device(
bus, "PIIX4 ACPI", sizeof(PCIAcpiState),
devfn, NULL, NULL);
diff -r 91169603a8e8 -r 79afceca9065 tools/ioemu/hw/piix_pci.c
--- a/tools/ioemu/hw/piix_pci.c Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/ioemu/hw/piix_pci.c Wed Aug 23 11:11:27 2006 -0600
@@ -415,7 +415,7 @@ void pci_bios_init(void)
uint8_t elcr[2];
pci_bios_io_addr = 0xc000;
- pci_bios_mem_addr = 0xf0000000;
+ pci_bios_mem_addr = HVM_BELOW_4G_MMIO_START;
/* activate IRQ mappings */
elcr[0] = 0x00;
diff -r 91169603a8e8 -r 79afceca9065 tools/ioemu/patches/acpi-poweroff-support
--- a/tools/ioemu/patches/acpi-poweroff-support Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/ioemu/patches/acpi-poweroff-support Wed Aug 23 11:11:27 2006 -0600
@@ -1,7 +1,7 @@ Index: ioemu/hw/piix4acpi.c
Index: ioemu/hw/piix4acpi.c
===================================================================
---- ioemu.orig/hw/piix4acpi.c 2006-08-06 02:30:29.288761563 +0100
-+++ ioemu/hw/piix4acpi.c 2006-08-06 02:30:42.131331446 +0100
+--- ioemu.orig/hw/piix4acpi.c 2006-08-17 19:50:05.060576667 +0100
++++ ioemu/hw/piix4acpi.c 2006-08-17 19:50:07.563300039 +0100
@@ -45,6 +45,10 @@
#define GBL_RLS (1 << 2)
#define SLP_EN (1 << 13)
diff -r 91169603a8e8 -r 79afceca9065 tools/ioemu/patches/acpi-support
--- a/tools/ioemu/patches/acpi-support Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/ioemu/patches/acpi-support Wed Aug 23 11:11:27 2006 -0600
@@ -1,7 +1,7 @@ Index: ioemu/Makefile.target
Index: ioemu/Makefile.target
===================================================================
---- ioemu.orig/Makefile.target 2006-08-06 02:23:23.000000000 +0100
-+++ ioemu/Makefile.target 2006-08-07 17:38:47.698306442 +0100
+--- ioemu.orig/Makefile.target 2006-08-17 19:49:50.228216099 +0100
++++ ioemu/Makefile.target 2006-08-17 19:50:02.405870095 +0100
@@ -357,6 +357,7 @@
VL_OBJS+= fdc.o mc146818rtc.o serial.o pc.o
VL_OBJS+= cirrus_vga.o mixeng.o parallel.o acpi.o piix_pci.o
@@ -12,39 +12,44 @@ Index: ioemu/Makefile.target
ifeq ($(TARGET_BASE_ARCH), ppc)
Index: ioemu/hw/pc.c
===================================================================
---- ioemu.orig/hw/pc.c 2006-08-06 02:23:45.000000000 +0100
-+++ ioemu/hw/pc.c 2006-08-07 17:42:00.939426374 +0100
-@@ -572,6 +572,9 @@
- static int parallel_io[MAX_PARALLEL_PORTS] = { 0x378, 0x278, 0x3bc };
- static int parallel_irq[MAX_PARALLEL_PORTS] = { 7, 7, 7 };
-
-+/* PIIX4 acpi pci configuration space, func 3 */
-+extern void pci_piix4_acpi_init(PCIBus *bus, int devfn);
-+
- #ifdef HAS_AUDIO
- static void audio_init (PCIBus *pci_bus)
- {
-@@ -874,11 +877,15 @@
+--- ioemu.orig/hw/pc.c 2006-08-17 19:49:59.312212039 +0100
++++ ioemu/hw/pc.c 2006-08-17 19:50:02.406869984 +0100
+@@ -874,13 +874,19 @@
cmos_init(ram_size, boot_device, bs_table, timeoffset);
+ /* using PIIX4 acpi model */
+ if (pci_enabled && acpi_enabled)
-+ pci_piix4_acpi_init(pci_bus, piix3_devfn + 3);
++ pci_piix4_acpi_init(pci_bus, piix3_devfn + 2);
+
if (pci_enabled && usb_enabled) {
- usb_uhci_init(pci_bus, piix3_devfn + 2);
+- usb_uhci_init(pci_bus, piix3_devfn + 2);
++ usb_uhci_init(pci_bus, piix3_devfn + (acpi_enabled ? 3 : 2));
}
-- if (pci_enabled && acpi_enabled) {
-+ if (pci_enabled && acpi_enabled && 0) {
++#ifndef CONFIG_DM
+ if (pci_enabled && acpi_enabled) {
piix4_pm_init(pci_bus, piix3_devfn + 3);
}
++#endif /* !CONFIG_DM */
+
+ #if 0
+ /* ??? Need to figure out some way for the user to
+@@ -903,8 +909,10 @@
+ /* XXX: should be done in the Bochs BIOS */
+ if (pci_enabled) {
+ pci_bios_init();
++#ifndef CONFIG_DM
+ if (acpi_enabled)
+ acpi_bios_init();
++#endif /* !CONFIG_DM */
+ }
+ }
Index: ioemu/hw/piix4acpi.c
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ ioemu/hw/piix4acpi.c 2006-08-07 17:41:41.932577728 +0100
++++ ioemu/hw/piix4acpi.c 2006-08-17 19:50:02.407869874 +0100
@@ -0,0 +1,388 @@
+/*
+ * PIIX4 ACPI controller emulation
@@ -405,13 +410,13 @@ Index: ioemu/hw/piix4acpi.c
+}
+
+
-+/* PIIX4 acpi pci configuration space, func 3 */
++/* PIIX4 acpi pci configuration space, func 2 */
+void pci_piix4_acpi_init(PCIBus *bus, int devfn)
+{
+ PCIAcpiState *d;
+ uint8_t *pci_conf;
+
-+ /* register a function 3 of PIIX4 */
++ /* register a function 2 of PIIX4 */
+ d = (PCIAcpiState *)pci_register_device(
+ bus, "PIIX4 ACPI", sizeof(PCIAcpiState),
+ devfn, NULL, NULL);
@@ -436,8 +441,8 @@ Index: ioemu/hw/piix4acpi.c
+}
Index: ioemu/vl.c
===================================================================
---- ioemu.orig/vl.c 2006-08-06 02:23:45.000000000 +0100
-+++ ioemu/vl.c 2006-08-07 17:41:40.613727012 +0100
+--- ioemu.orig/vl.c 2006-08-17 19:49:59.315211708 +0100
++++ ioemu/vl.c 2006-08-17 19:50:02.410869542 +0100
@@ -156,7 +156,7 @@
#else
#define MAX_CPUS 1
@@ -483,9 +488,9 @@ Index: ioemu/vl.c
}
Index: ioemu/vl.h
===================================================================
---- ioemu.orig/vl.h 2006-08-06 02:23:45.000000000 +0100
-+++ ioemu/vl.h 2006-08-07 17:38:47.847289567 +0100
-@@ -167,6 +167,7 @@
+--- ioemu.orig/vl.h 2006-08-17 19:49:59.316211597 +0100
++++ ioemu/vl.h 2006-08-17 19:50:02.411869432 +0100
+@@ -168,6 +168,7 @@
extern int kqemu_allowed;
extern int win2k_install_hack;
extern int usb_enabled;
@@ -493,10 +498,20 @@ Index: ioemu/vl.h
extern int smp_cpus;
/* XXX: make it dynamic */
+@@ -923,6 +924,9 @@
+ void piix4_pm_init(PCIBus *bus, int devfn);
+ void acpi_bios_init(void);
+
++/* piix4acpi.c */
++extern void pci_piix4_acpi_init(PCIBus *bus, int devfn);
++
+ /* pc.c */
+ extern QEMUMachine pc_machine;
+ extern QEMUMachine isapc_machine;
Index: ioemu/hw/piix_pci.c
===================================================================
---- ioemu.orig/hw/piix_pci.c 2006-08-06 02:29:41.000000000 +0100
-+++ ioemu/hw/piix_pci.c 2006-08-07 17:38:57.480198468 +0100
+--- ioemu.orig/hw/piix_pci.c 2006-08-17 19:38:05.806252180 +0100
++++ ioemu/hw/piix_pci.c 2006-08-17 19:50:02.411869432 +0100
@@ -241,7 +241,7 @@
static uint32_t pci_bios_io_addr;
static uint32_t pci_bios_mem_addr;
diff -r 91169603a8e8 -r 79afceca9065 tools/ioemu/patches/acpi-timer-support
--- a/tools/ioemu/patches/acpi-timer-support Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/ioemu/patches/acpi-timer-support Wed Aug 23 11:11:27 2006 -0600
@@ -1,7 +1,7 @@ Index: ioemu/hw/piix4acpi.c
Index: ioemu/hw/piix4acpi.c
===================================================================
---- ioemu.orig/hw/piix4acpi.c 2006-08-06 02:24:54.262068457 +0100
-+++ ioemu/hw/piix4acpi.c 2006-08-06 02:30:29.288761563 +0100
+--- ioemu.orig/hw/piix4acpi.c 2006-08-17 19:50:02.407869874 +0100
++++ ioemu/hw/piix4acpi.c 2006-08-17 19:50:05.060576667 +0100
@@ -24,31 +24,30 @@
*/
@@ -184,8 +184,8 @@ Index: ioemu/hw/piix4acpi.c
}
-
- /* PIIX4 acpi pci configuration space, func 3 */
- void pci_piix4_acpi_init(PCIBus *bus)
+ /* PIIX4 acpi pci configuration space, func 2 */
+ void pci_piix4_acpi_init(PCIBus *bus, int devfn)
@@ -384,5 +383,5 @@
pci_register_io_region((PCIDevice *)d, 4, 0x10,
PCI_ADDRESS_SPACE_IO, acpi_map);
diff -r 91169603a8e8 -r 79afceca9065 tools/ioemu/patches/domain-destroy
--- a/tools/ioemu/patches/domain-destroy Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/ioemu/patches/domain-destroy Wed Aug 23 11:11:27 2006 -0600
@@ -1,7 +1,7 @@ Index: ioemu/monitor.c
Index: ioemu/monitor.c
===================================================================
---- ioemu.orig/monitor.c 2006-08-08 11:27:48.555190337 +0100
-+++ ioemu/monitor.c 2006-08-08 11:27:53.984584612 +0100
+--- ioemu.orig/monitor.c 2006-08-17 19:37:36.489509621 +0100
++++ ioemu/monitor.c 2006-08-17 19:49:44.491850141 +0100
@@ -308,6 +308,7 @@
static void do_quit(void)
@@ -12,8 +12,8 @@ Index: ioemu/monitor.c
Index: ioemu/target-i386-dm/helper2.c
===================================================================
---- ioemu.orig/target-i386-dm/helper2.c 2006-08-08 11:27:53.063687351
+0100
-+++ ioemu/target-i386-dm/helper2.c 2006-08-08 11:27:54.011581601 +0100
+--- ioemu.orig/target-i386-dm/helper2.c 2006-08-17 19:49:40.116333768
+0100
++++ ioemu/target-i386-dm/helper2.c 2006-08-17 19:49:44.491850141 +0100
@@ -488,5 +488,25 @@
xc_evtchn_notify(xce_handle, ioreq_local_port[send_vcpu]);
}
@@ -42,9 +42,9 @@ Index: ioemu/target-i386-dm/helper2.c
+}
Index: ioemu/vl.h
===================================================================
---- ioemu.orig/vl.h 2006-08-08 11:27:53.067686905 +0100
-+++ ioemu/vl.h 2006-08-08 11:27:54.061576023 +0100
-@@ -1189,4 +1189,7 @@
+--- ioemu.orig/vl.h 2006-08-17 19:49:40.120333326 +0100
++++ ioemu/vl.h 2006-08-17 19:49:44.492850031 +0100
+@@ -1190,4 +1190,7 @@
void kqemu_record_dump(void);
extern char domain_name[];
diff -r 91169603a8e8 -r 79afceca9065 tools/ioemu/patches/domain-reset
--- a/tools/ioemu/patches/domain-reset Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/ioemu/patches/domain-reset Wed Aug 23 11:11:27 2006 -0600
@@ -1,7 +1,7 @@ Index: ioemu/target-i386-dm/helper2.c
Index: ioemu/target-i386-dm/helper2.c
===================================================================
---- ioemu.orig/target-i386-dm/helper2.c 2006-08-08 11:27:45.566523765
+0100
-+++ ioemu/target-i386-dm/helper2.c 2006-08-08 11:27:53.063687351 +0100
+--- ioemu.orig/target-i386-dm/helper2.c 2006-08-17 19:37:36.530505066
+0100
++++ ioemu/target-i386-dm/helper2.c 2006-08-17 19:49:40.116333768 +0100
@@ -127,6 +127,25 @@
/* called from main_cpu_reset */
void cpu_reset(CPUX86State *env)
@@ -41,8 +41,8 @@ Index: ioemu/target-i386-dm/helper2.c
/* Wait up to 10 msec. */
Index: ioemu/vl.c
===================================================================
---- ioemu.orig/vl.c 2006-08-08 11:27:52.994695048 +0100
-+++ ioemu/vl.c 2006-08-08 11:27:53.066687017 +0100
+--- ioemu.orig/vl.c 2006-08-17 19:49:39.442408257 +0100
++++ ioemu/vl.c 2006-08-17 19:49:40.119333436 +0100
@@ -4948,7 +4948,7 @@
} QEMUResetEntry;
@@ -54,9 +54,9 @@ Index: ioemu/vl.c
Index: ioemu/vl.h
===================================================================
---- ioemu.orig/vl.h 2006-08-08 11:27:48.757167803 +0100
-+++ ioemu/vl.h 2006-08-08 11:27:53.067686905 +0100
-@@ -130,6 +130,7 @@
+--- ioemu.orig/vl.h 2006-08-17 19:47:32.680418959 +0100
++++ ioemu/vl.h 2006-08-17 19:49:40.120333326 +0100
+@@ -131,6 +131,7 @@
void qemu_register_reset(QEMUResetHandler *func, void *opaque);
void qemu_system_reset_request(void);
@@ -64,7 +64,7 @@ Index: ioemu/vl.h
void qemu_system_shutdown_request(void);
void qemu_system_powerdown_request(void);
#if !defined(TARGET_SPARC)
-@@ -139,6 +140,8 @@
+@@ -140,6 +141,8 @@
void qemu_system_powerdown(void);
#endif
diff -r 91169603a8e8 -r 79afceca9065 tools/ioemu/patches/domain-timeoffset
--- a/tools/ioemu/patches/domain-timeoffset Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/ioemu/patches/domain-timeoffset Wed Aug 23 11:11:27 2006 -0600
@@ -1,7 +1,7 @@ Index: ioemu/hw/mc146818rtc.c
Index: ioemu/hw/mc146818rtc.c
===================================================================
---- ioemu.orig/hw/mc146818rtc.c 2006-08-09 15:04:17.857242121 +0100
-+++ ioemu/hw/mc146818rtc.c 2006-08-09 15:04:24.588603423 +0100
+--- ioemu.orig/hw/mc146818rtc.c 2006-08-17 19:58:03.222720593 +0100
++++ ioemu/hw/mc146818rtc.c 2006-08-17 19:58:08.528134087 +0100
@@ -178,10 +178,27 @@
}
}
@@ -46,8 +46,8 @@ Index: ioemu/hw/mc146818rtc.c
static void rtc_copy_date(RTCState *s)
Index: ioemu/hw/pc.c
===================================================================
---- ioemu.orig/hw/pc.c 2006-08-09 15:04:24.316629266 +0100
-+++ ioemu/hw/pc.c 2006-08-09 15:04:24.589603328 +0100
+--- ioemu.orig/hw/pc.c 2006-08-17 19:58:08.252164595 +0100
++++ ioemu/hw/pc.c 2006-08-17 19:58:08.529133976 +0100
@@ -159,7 +159,7 @@
}
@@ -117,8 +117,8 @@ Index: ioemu/hw/pc.c
QEMUMachine pc_machine = {
Index: ioemu/vl.c
===================================================================
---- ioemu.orig/vl.c 2006-08-09 15:04:24.457615869 +0100
-+++ ioemu/vl.c 2006-08-09 15:04:24.592603043 +0100
+--- ioemu.orig/vl.c 2006-08-17 19:58:08.395148788 +0100
++++ ioemu/vl.c 2006-08-17 19:58:08.532133645 +0100
@@ -163,6 +163,8 @@
int xc_handle;
@@ -162,7 +162,7 @@ Index: ioemu/vl.c
}
}
}
-@@ -6489,7 +6497,8 @@
+@@ -6507,7 +6515,8 @@
machine->init(ram_size, vga_ram_size, boot_device,
ds, fd_filename, snapshot,
@@ -174,9 +174,9 @@ Index: ioemu/vl.c
if (usb_enabled) {
Index: ioemu/vl.h
===================================================================
---- ioemu.orig/vl.h 2006-08-09 15:04:24.321628791 +0100
-+++ ioemu/vl.h 2006-08-09 15:04:24.593602948 +0100
-@@ -575,7 +575,7 @@
+--- ioemu.orig/vl.h 2006-08-17 19:58:08.257164042 +0100
++++ ioemu/vl.h 2006-08-17 19:58:08.532133645 +0100
+@@ -576,7 +576,7 @@
int boot_device,
DisplayState *ds, const char **fd_filename, int snapshot,
const char *kernel_filename, const char *kernel_cmdline,
diff -r 91169603a8e8 -r 79afceca9065 tools/ioemu/patches/hypervisor-pit
--- a/tools/ioemu/patches/hypervisor-pit Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/ioemu/patches/hypervisor-pit Wed Aug 23 11:11:27 2006 -0600
@@ -1,7 +1,7 @@ Index: ioemu/Makefile.target
Index: ioemu/Makefile.target
===================================================================
---- ioemu.orig/Makefile.target 2006-08-06 02:22:26.380544784 +0100
-+++ ioemu/Makefile.target 2006-08-06 02:23:23.059226607 +0100
+--- ioemu.orig/Makefile.target 2006-08-17 19:49:33.813030472 +0100
++++ ioemu/Makefile.target 2006-08-17 19:49:50.228216099 +0100
@@ -354,7 +354,7 @@
ifeq ($(TARGET_BASE_ARCH), i386)
# Hardware support
@@ -13,8 +13,8 @@ Index: ioemu/Makefile.target
DEFINES += -DHAS_AUDIO
Index: ioemu/hw/pc.c
===================================================================
---- ioemu.orig/hw/pc.c 2006-08-06 02:22:35.588518336 +0100
-+++ ioemu/hw/pc.c 2006-08-06 02:23:07.875919141 +0100
+--- ioemu.orig/hw/pc.c 2006-08-17 19:49:35.507843144 +0100
++++ ioemu/hw/pc.c 2006-08-17 19:49:50.229215988 +0100
@@ -38,7 +38,9 @@
static fdctrl_t *floppy_controller;
@@ -38,8 +38,8 @@ Index: ioemu/hw/pc.c
pic_set_alt_irq_func(isa_pic, ioapic_set_irq, ioapic);
Index: ioemu/vl.c
===================================================================
---- ioemu.orig/vl.c 2006-08-06 02:23:05.216215627 +0100
-+++ ioemu/vl.c 2006-08-06 02:23:07.878918807 +0100
+--- ioemu.orig/vl.c 2006-08-17 19:49:48.566399780 +0100
++++ ioemu/vl.c 2006-08-17 19:49:50.231215767 +0100
@@ -5570,6 +5570,7 @@
#ifdef HAS_AUDIO
diff -r 91169603a8e8 -r 79afceca9065 tools/ioemu/patches/ide-hd-multithread
--- a/tools/ioemu/patches/ide-hd-multithread Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/ioemu/patches/ide-hd-multithread Wed Aug 23 11:11:27 2006 -0600
@@ -1,7 +1,7 @@ Index: ioemu/hw/ide.c
Index: ioemu/hw/ide.c
===================================================================
---- ioemu.orig/hw/ide.c 2006-08-06 02:03:50.520919718 +0100
-+++ ioemu/hw/ide.c 2006-08-06 02:23:41.153209614 +0100
+--- ioemu.orig/hw/ide.c 2006-08-17 19:37:36.267534285 +0100
++++ ioemu/hw/ide.c 2006-08-17 19:49:57.830375828 +0100
@@ -22,6 +22,7 @@
* THE SOFTWARE.
*/
diff -r 91169603a8e8 -r 79afceca9065 tools/ioemu/patches/ioemu-ia64
--- a/tools/ioemu/patches/ioemu-ia64 Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/ioemu/patches/ioemu-ia64 Wed Aug 23 11:11:27 2006 -0600
@@ -1,7 +1,7 @@ Index: ioemu/hw/iommu.c
Index: ioemu/hw/iommu.c
===================================================================
---- ioemu.orig/hw/iommu.c 2006-08-06 01:55:03.240628184 +0100
-+++ ioemu/hw/iommu.c 2006-08-06 02:18:54.843126039 +0100
+--- ioemu.orig/hw/iommu.c 2006-08-17 19:37:36.791476068 +0100
++++ ioemu/hw/iommu.c 2006-08-17 19:48:27.357375720 +0100
@@ -82,7 +82,11 @@
#define IOPTE_VALID 0x00000002 /* IOPTE is valid */
#define IOPTE_WAZ 0x00000001 /* Write as zeros */
@@ -16,8 +16,8 @@ Index: ioemu/hw/iommu.c
Index: ioemu/cpu-all.h
===================================================================
---- ioemu.orig/cpu-all.h 2006-08-06 02:17:09.392881406 +0100
-+++ ioemu/cpu-all.h 2006-08-06 02:18:54.844125928 +0100
+--- ioemu.orig/cpu-all.h 2006-08-17 19:37:36.791476068 +0100
++++ ioemu/cpu-all.h 2006-08-17 19:48:27.358375609 +0100
@@ -835,6 +835,31 @@
:"=m" (*(volatile long *)addr)
:"dIr" (nr));
@@ -52,21 +52,21 @@ Index: ioemu/cpu-all.h
/* memory API */
Index: ioemu/vl.c
===================================================================
---- ioemu.orig/vl.c 2006-08-06 02:18:45.608155528 +0100
-+++ ioemu/vl.c 2006-08-06 02:18:54.847125593 +0100
-@@ -6140,6 +6140,11 @@
- /* init the memory */
- phys_ram_size = ram_size + vga_ram_size + bios_size;
+--- ioemu.orig/vl.c 2006-08-17 19:47:08.538087284 +0100
++++ ioemu/vl.c 2006-08-17 19:57:50.666108706 +0100
+@@ -6144,6 +6144,11 @@
+
+ xc_handle = xc_interface_open();
+#if defined (__ia64__)
+ if (ram_size > MMIO_START)
-+ ram_size += 1 * MEM_G; /* skip 3G-4G MMIO, LEGACY_IO_SPACE etc. */
++ ram_size += 1 * MEM_G; /* skip 3G-4G MMIO, LEGACY_IO_SPACE etc. */
+#endif
+
- #ifdef CONFIG_DM
-
nr_pages = ram_size/PAGE_SIZE;
-@@ -6151,6 +6156,7 @@
+ tmp_nr_pages = nr_pages;
+
+@@ -6161,6 +6166,7 @@
exit(-1);
}
@@ -74,7 +74,7 @@ Index: ioemu/vl.c
if (xc_get_pfn_list(xc_handle, domid, page_array, nr_pages) != nr_pages) {
fprintf(logfile, "xc_get_pfn_list returned error %d\n", errno);
exit(-1);
-@@ -6173,6 +6179,41 @@
+@@ -6191,6 +6197,41 @@
free(page_array);
@@ -100,9 +100,9 @@ Index: ioemu/vl.c
+ }
+
+ if (ram_size > MMIO_START) {
-+ for (i = 0 ; i < MEM_G >> PAGE_SHIFT; i++)
-+ page_array[MMIO_START >> PAGE_SHIFT + i] =
-+ page_array[IO_PAGE_START >> PAGE_SHIFT + 1];
++ for (i = 0 ; i < MEM_G >> PAGE_SHIFT; i++)
++ page_array[MMIO_START >> PAGE_SHIFT + i] =
++ page_array[IO_PAGE_START >> PAGE_SHIFT + 1];
+ }
+
+ phys_ram_base = xc_map_foreign_batch(xc_handle, domid,
@@ -118,8 +118,8 @@ Index: ioemu/vl.c
phys_ram_base = qemu_vmalloc(phys_ram_size);
Index: ioemu/target-i386-dm/exec-dm.c
===================================================================
---- ioemu.orig/target-i386-dm/exec-dm.c 2006-08-06 02:15:01.776108064
+0100
-+++ ioemu/target-i386-dm/exec-dm.c 2006-08-06 02:18:54.848125482 +0100
+--- ioemu.orig/target-i386-dm/exec-dm.c 2006-08-17 19:37:36.792475957
+0100
++++ ioemu/target-i386-dm/exec-dm.c 2006-08-17 19:48:27.361375278 +0100
@@ -341,6 +341,23 @@
return io_mem_read[io_index >> IO_MEM_SHIFT];
}
@@ -144,20 +144,20 @@ Index: ioemu/target-i386-dm/exec-dm.c
/* physical memory access (slow version, mainly for debug) */
#if defined(CONFIG_USER_ONLY)
void cpu_physical_memory_rw(target_phys_addr_t addr, uint8_t *buf,
-@@ -456,6 +473,9 @@
- ptr = phys_ram_base + (pd & TARGET_PAGE_MASK) +
- (addr & ~TARGET_PAGE_MASK);
- memcpy(buf, ptr, l);
+@@ -432,6 +449,9 @@
+ /* RAM case */
+ ptr = phys_ram_base + addr1;
+ memcpy(ptr, buf, l);
+#ifdef __ia64__
+ sync_icache((unsigned long)ptr, l);
+#endif
- } else {
- /* unreported MMIO space */
- memset(buf, 0xff, len);
+ }
+ } else {
+ if (io_index) {
Index: ioemu/exec-all.h
===================================================================
---- ioemu.orig/exec-all.h 2006-08-06 02:14:09.796902750 +0100
-+++ ioemu/exec-all.h 2006-08-06 02:18:54.848125482 +0100
+--- ioemu.orig/exec-all.h 2006-08-17 19:37:36.791476068 +0100
++++ ioemu/exec-all.h 2006-08-17 19:48:27.362375167 +0100
@@ -462,12 +462,13 @@
}
#endif
@@ -177,8 +177,8 @@ Index: ioemu/exec-all.h
Index: ioemu/target-i386-dm/cpu.h
===================================================================
---- ioemu.orig/target-i386-dm/cpu.h 2006-08-06 02:15:01.776108064 +0100
-+++ ioemu/target-i386-dm/cpu.h 2006-08-06 02:18:54.848125482 +0100
+--- ioemu.orig/target-i386-dm/cpu.h 2006-08-17 19:37:36.792475957 +0100
++++ ioemu/target-i386-dm/cpu.h 2006-08-17 19:48:27.362375167 +0100
@@ -80,7 +80,11 @@
/* helper2.c */
int main_loop(void);
@@ -194,7 +194,7 @@ Index: ioemu/ia64_intrinsic.h
Index: ioemu/ia64_intrinsic.h
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ ioemu/ia64_intrinsic.h 2006-08-06 02:18:54.849125370 +0100
++++ ioemu/ia64_intrinsic.h 2006-08-17 19:48:27.363375057 +0100
@@ -0,0 +1,276 @@
+#ifndef IA64_INTRINSIC_H
+#define IA64_INTRINSIC_H
diff -r 91169603a8e8 -r 79afceca9065 tools/ioemu/patches/qemu-allow-disable-sdl
--- a/tools/ioemu/patches/qemu-allow-disable-sdl Tue Aug 22 14:45:49
2006 -0600
+++ b/tools/ioemu/patches/qemu-allow-disable-sdl Wed Aug 23 11:11:27
2006 -0600
@@ -1,7 +1,7 @@ Index: ioemu/configure
Index: ioemu/configure
===================================================================
---- ioemu.orig/configure 2006-08-06 02:15:01.771108621 +0100
-+++ ioemu/configure 2006-08-06 02:42:26.213918476 +0100
+--- ioemu.orig/configure 2006-08-17 19:37:35.772589281 +0100
++++ ioemu/configure 2006-08-17 19:50:24.735401975 +0100
@@ -228,8 +228,6 @@
;;
--enable-cocoa) cocoa="yes" ; coreaudio="yes" ; sdl="no"
diff -r 91169603a8e8 -r 79afceca9065 tools/ioemu/patches/qemu-fix-memset-args
--- a/tools/ioemu/patches/qemu-fix-memset-args Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/ioemu/patches/qemu-fix-memset-args Wed Aug 23 11:11:27 2006 -0600
@@ -1,7 +1,7 @@ Index: ioemu/audio/audio.c
Index: ioemu/audio/audio.c
===================================================================
---- ioemu.orig/audio/audio.c 2006-08-06 02:03:50.013976165 +0100
-+++ ioemu/audio/audio.c 2006-08-06 02:42:28.991609008 +0100
+--- ioemu.orig/audio/audio.c 2006-08-17 19:37:35.755591169 +0100
++++ ioemu/audio/audio.c 2006-08-17 19:50:26.867166346 +0100
@@ -605,11 +605,11 @@
}
diff -r 91169603a8e8 -r 79afceca9065 tools/ioemu/patches/serial-non-block
--- a/tools/ioemu/patches/serial-non-block Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/ioemu/patches/serial-non-block Wed Aug 23 11:11:27 2006 -0600
@@ -1,7 +1,7 @@ Index: ioemu/vl.c
Index: ioemu/vl.c
===================================================================
---- ioemu.orig/vl.c 2006-08-06 02:23:29.827472129 +0100
-+++ ioemu/vl.c 2006-08-06 02:23:36.856688561 +0100
+--- ioemu.orig/vl.c 2006-08-17 19:49:52.162002356 +0100
++++ ioemu/vl.c 2006-08-17 19:49:56.273547905 +0100
@@ -1175,19 +1175,34 @@
static int unix_write(int fd, const uint8_t *buf, int len1)
diff -r 91169603a8e8 -r 79afceca9065 tools/ioemu/patches/series
--- a/tools/ioemu/patches/series Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/ioemu/patches/series Wed Aug 23 11:11:27 2006 -0600
@@ -39,5 +39,8 @@ xenstore-write-vnc-port
xenstore-write-vnc-port
qemu-allow-disable-sdl
qemu-fix-memset-args
-qemu-fix-write-to-disk-synchronous
xen-support-buffered-ioreqs
+qemu-daemonize
+xen-platform-device
+qemu-bootorder
+qemu-tunable-ide-write-cache
diff -r 91169603a8e8 -r 79afceca9065 tools/ioemu/patches/shadow-vram
--- a/tools/ioemu/patches/shadow-vram Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/ioemu/patches/shadow-vram Wed Aug 23 11:11:27 2006 -0600
@@ -1,7 +1,7 @@ Index: ioemu/hw/vga.c
Index: ioemu/hw/vga.c
===================================================================
---- ioemu.orig/hw/vga.c 2006-08-06 02:23:29.824472464 +0100
-+++ ioemu/hw/vga.c 2006-08-06 02:23:33.873021159 +0100
+--- ioemu.orig/hw/vga.c 2006-08-17 19:49:52.159002688 +0100
++++ ioemu/hw/vga.c 2006-08-17 19:49:54.575735565 +0100
@@ -1359,6 +1359,105 @@
}
}
@@ -137,8 +137,8 @@ Index: ioemu/hw/vga.c
s->vram_size = vga_ram_size;
Index: ioemu/hw/vga_int.h
===================================================================
---- ioemu.orig/hw/vga_int.h 2006-08-06 02:23:29.824472464 +0100
-+++ ioemu/hw/vga_int.h 2006-08-06 02:23:33.874021048 +0100
+--- ioemu.orig/hw/vga_int.h 2006-08-17 19:49:52.159002688 +0100
++++ ioemu/hw/vga_int.h 2006-08-17 19:49:54.575735565 +0100
@@ -79,6 +79,7 @@
#define VGA_STATE_COMMON \
diff -r 91169603a8e8 -r 79afceca9065 tools/ioemu/patches/shared-vram
--- a/tools/ioemu/patches/shared-vram Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/ioemu/patches/shared-vram Wed Aug 23 11:11:27 2006 -0600
@@ -1,7 +1,7 @@ Index: ioemu/hw/cirrus_vga.c
Index: ioemu/hw/cirrus_vga.c
===================================================================
---- ioemu.orig/hw/cirrus_vga.c 2006-08-06 01:55:02.822674718 +0100
-+++ ioemu/hw/cirrus_vga.c 2006-08-06 02:23:29.822472686 +0100
+--- ioemu.orig/hw/cirrus_vga.c 2006-08-17 19:37:36.372522620 +0100
++++ ioemu/hw/cirrus_vga.c 2006-08-17 19:49:52.157002909 +0100
@@ -28,6 +28,9 @@
*/
#include "vl.h"
@@ -176,8 +176,8 @@ Index: ioemu/hw/cirrus_vga.c
}
Index: ioemu/hw/pc.c
===================================================================
---- ioemu.orig/hw/pc.c 2006-08-06 02:23:07.875919141 +0100
-+++ ioemu/hw/pc.c 2006-08-06 02:23:29.823472575 +0100
+--- ioemu.orig/hw/pc.c 2006-08-17 19:49:50.229215988 +0100
++++ ioemu/hw/pc.c 2006-08-17 19:49:52.158002799 +0100
@@ -790,14 +790,14 @@
if (cirrus_vga_enabled) {
if (pci_enabled) {
@@ -198,8 +198,8 @@ Index: ioemu/hw/pc.c
Index: ioemu/hw/vga.c
===================================================================
---- ioemu.orig/hw/vga.c 2006-08-06 02:22:46.606290142 +0100
-+++ ioemu/hw/vga.c 2006-08-06 02:23:29.824472464 +0100
+--- ioemu.orig/hw/vga.c 2006-08-17 19:49:37.764593706 +0100
++++ ioemu/hw/vga.c 2006-08-17 19:49:52.159002688 +0100
@@ -1858,6 +1858,7 @@
/* TODO: add vbe support if enabled */
}
@@ -251,8 +251,8 @@ Index: ioemu/hw/vga.c
Index: ioemu/hw/vga_int.h
===================================================================
---- ioemu.orig/hw/vga_int.h 2006-08-06 02:14:09.797902638 +0100
-+++ ioemu/hw/vga_int.h 2006-08-06 02:23:29.824472464 +0100
+--- ioemu.orig/hw/vga_int.h 2006-08-17 19:37:36.372522620 +0100
++++ ioemu/hw/vga_int.h 2006-08-17 19:49:52.159002688 +0100
@@ -169,5 +169,6 @@
unsigned int color0, unsigned int color1,
unsigned int color_xor);
@@ -262,8 +262,8 @@ Index: ioemu/hw/vga_int.h
extern const uint8_t gr_mask[16];
Index: ioemu/vl.c
===================================================================
---- ioemu.orig/vl.c 2006-08-06 02:23:07.878918807 +0100
-+++ ioemu/vl.c 2006-08-06 02:23:29.827472129 +0100
+--- ioemu.orig/vl.c 2006-08-17 19:49:50.231215767 +0100
++++ ioemu/vl.c 2006-08-17 19:49:52.162002356 +0100
@@ -5693,6 +5693,78 @@
#define MAX_NET_CLIENTS 32
@@ -345,9 +345,9 @@ Index: ioemu/vl.c
#ifdef CONFIG_GDBSTUB
Index: ioemu/vl.h
===================================================================
---- ioemu.orig/vl.h 2006-08-06 02:23:02.271543880 +0100
-+++ ioemu/vl.h 2006-08-06 02:23:29.828472018 +0100
-@@ -144,6 +144,13 @@
+--- ioemu.orig/vl.h 2006-08-17 19:49:44.492850031 +0100
++++ ioemu/vl.h 2006-08-17 19:49:52.163002246 +0100
+@@ -145,6 +145,13 @@
void main_loop_wait(int timeout);
diff -r 91169603a8e8 -r 79afceca9065 tools/ioemu/patches/support-xm-console
--- a/tools/ioemu/patches/support-xm-console Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/ioemu/patches/support-xm-console Wed Aug 23 11:11:27 2006 -0600
@@ -1,7 +1,7 @@ Index: ioemu/vl.c
Index: ioemu/vl.c
===================================================================
---- ioemu.orig/vl.c 2006-08-06 02:22:59.254880158 +0100
-+++ ioemu/vl.c 2006-08-06 02:23:05.216215627 +0100
+--- ioemu.orig/vl.c 2006-08-17 19:49:40.119333436 +0100
++++ ioemu/vl.c 2006-08-17 19:49:48.566399780 +0100
@@ -1536,26 +1536,65 @@
return chr;
}
diff -r 91169603a8e8 -r 79afceca9065 tools/ioemu/patches/vnc-access-monitor-vt
--- a/tools/ioemu/patches/vnc-access-monitor-vt Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/ioemu/patches/vnc-access-monitor-vt Wed Aug 23 11:11:27 2006 -0600
@@ -1,7 +1,7 @@ Index: ioemu/vnc.c
Index: ioemu/vnc.c
===================================================================
---- ioemu.orig/vnc.c 2006-08-07 17:44:33.084748631 +0100
-+++ ioemu/vnc.c 2006-08-07 17:44:33.224733389 +0100
+--- ioemu.orig/vnc.c 2006-08-17 19:50:14.623519661 +0100
++++ ioemu/vnc.c 2006-08-17 19:50:15.956372339 +0100
@@ -32,6 +32,10 @@
#include "vnc_keysym.h"
#include "keymaps.c"
diff -r 91169603a8e8 -r 79afceca9065 tools/ioemu/patches/vnc-cleanup
--- a/tools/ioemu/patches/vnc-cleanup Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/ioemu/patches/vnc-cleanup Wed Aug 23 11:11:27 2006 -0600
@@ -1,7 +1,7 @@ Index: ioemu/vnc.c
Index: ioemu/vnc.c
===================================================================
---- ioemu.orig/vnc.c 2006-08-07 17:42:21.888055419 +0100
-+++ ioemu/vnc.c 2006-08-07 17:42:28.001363557 +0100
+--- ioemu.orig/vnc.c 2006-08-17 19:37:36.091553839 +0100
++++ ioemu/vnc.c 2006-08-17 19:50:10.313996001 +0100
@@ -143,13 +143,16 @@
static void vnc_dpy_update(DisplayState *ds, int x, int y, int w, int h)
{
@@ -65,8 +65,8 @@ Index: ioemu/vnc.c
static void vnc_timer_init(VncState *vs)
Index: ioemu/vl.c
===================================================================
---- ioemu.orig/vl.c 2006-08-07 17:42:27.807385506 +0100
-+++ ioemu/vl.c 2006-08-07 17:42:28.004363230 +0100
+--- ioemu.orig/vl.c 2006-08-17 19:50:02.410869542 +0100
++++ ioemu/vl.c 2006-08-17 19:50:10.316995669 +0100
@@ -5120,10 +5120,10 @@
/* XXX: better handling of removal */
for(ioh = first_io_handler; ioh != NULL; ioh = ioh_next) {
diff -r 91169603a8e8 -r 79afceca9065 tools/ioemu/patches/vnc-display-find-unused
--- a/tools/ioemu/patches/vnc-display-find-unused Tue Aug 22 14:45:49
2006 -0600
+++ b/tools/ioemu/patches/vnc-display-find-unused Wed Aug 23 11:11:27
2006 -0600
@@ -1,7 +1,7 @@ Index: ioemu/vnc.c
Index: ioemu/vnc.c
===================================================================
---- ioemu.orig/vnc.c 2006-08-09 14:44:44.721942535 +0100
-+++ ioemu/vnc.c 2006-08-09 14:52:37.262165292 +0100
+--- ioemu.orig/vnc.c 2006-08-17 19:50:15.956372339 +0100
++++ ioemu/vnc.c 2006-08-17 19:50:17.083247783 +0100
@@ -1183,7 +1183,7 @@
}
}
@@ -50,8 +50,8 @@ Index: ioemu/vnc.c
int vnc_start_viewer(int port)
Index: ioemu/vl.c
===================================================================
---- ioemu.orig/vl.c 2006-08-09 14:44:44.721942535 +0100
-+++ ioemu/vl.c 2006-08-09 14:52:06.783905832 +0100
+--- ioemu.orig/vl.c 2006-08-17 19:50:13.152682236 +0100
++++ ioemu/vl.c 2006-08-17 19:50:17.086247452 +0100
@@ -121,6 +121,7 @@
static DisplayState display_state;
int nographic;
@@ -104,7 +104,7 @@ Index: ioemu/vl.c
}
}
}
-@@ -6465,7 +6475,7 @@
+@@ -6483,7 +6493,7 @@
if (nographic) {
dumb_display_init(ds);
} else if (vnc_display != -1) {
@@ -115,9 +115,9 @@ Index: ioemu/vl.c
} else {
Index: ioemu/vl.h
===================================================================
---- ioemu.orig/vl.h 2006-08-09 14:44:44.721942535 +0100
-+++ ioemu/vl.h 2006-08-09 14:52:06.783905832 +0100
-@@ -784,7 +784,7 @@
+--- ioemu.orig/vl.h 2006-08-17 19:50:13.153682125 +0100
++++ ioemu/vl.h 2006-08-17 19:50:17.087247341 +0100
+@@ -785,7 +785,7 @@
void cocoa_display_init(DisplayState *ds, int full_screen);
/* vnc.c */
diff -r 91169603a8e8 -r 79afceca9065 tools/ioemu/patches/vnc-fixes
--- a/tools/ioemu/patches/vnc-fixes Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/ioemu/patches/vnc-fixes Wed Aug 23 11:11:27 2006 -0600
@@ -1,8 +1,8 @@ Index: ioemu/vl.c
Index: ioemu/vl.c
===================================================================
---- ioemu.orig/vl.c 2006-08-07 17:42:28.004363230 +0100
-+++ ioemu/vl.c 2006-08-07 17:43:16.361100898 +0100
-@@ -6516,8 +6516,10 @@
+--- ioemu.orig/vl.c 2006-08-17 19:50:10.316995669 +0100
++++ ioemu/vl.c 2006-08-17 19:50:12.100798502 +0100
+@@ -6534,8 +6534,10 @@
}
}
@@ -17,8 +17,8 @@ Index: ioemu/vl.c
if (use_gdbstub) {
Index: ioemu/vnc.c
===================================================================
---- ioemu.orig/vnc.c 2006-08-07 17:42:28.001363557 +0100
-+++ ioemu/vnc.c 2006-08-07 17:43:33.593225293 +0100
+--- ioemu.orig/vnc.c 2006-08-17 19:50:10.313996001 +0100
++++ ioemu/vnc.c 2006-08-17 19:50:12.101798392 +0100
@@ -3,6 +3,7 @@
*
* Copyright (C) 2006 Anthony Liguori <anthony@xxxxxxxxxxxxx>
@@ -524,9 +524,9 @@ Index: ioemu/vnc.c
}
Index: ioemu/vl.h
===================================================================
---- ioemu.orig/vl.h 2006-08-07 17:42:27.807385506 +0100
-+++ ioemu/vl.h 2006-08-07 17:43:16.361100898 +0100
-@@ -318,6 +318,7 @@
+--- ioemu.orig/vl.h 2006-08-17 19:50:02.411869432 +0100
++++ ioemu/vl.h 2006-08-17 19:50:12.102798281 +0100
+@@ -319,6 +319,7 @@
int is_graphic_console(void);
CharDriverState *text_console_init(DisplayState *ds);
void console_select(unsigned int index);
diff -r 91169603a8e8 -r 79afceca9065 tools/ioemu/patches/vnc-start-vncviewer
--- a/tools/ioemu/patches/vnc-start-vncviewer Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/ioemu/patches/vnc-start-vncviewer Wed Aug 23 11:11:27 2006 -0600
@@ -1,7 +1,7 @@ Index: ioemu/vnc.c
Index: ioemu/vnc.c
===================================================================
---- ioemu.orig/vnc.c 2006-08-07 17:44:32.852773890 +0100
-+++ ioemu/vnc.c 2006-08-07 17:44:32.915767031 +0100
+--- ioemu.orig/vnc.c 2006-08-17 19:50:12.101798392 +0100
++++ ioemu/vnc.c 2006-08-17 19:50:13.149682567 +0100
@@ -1175,3 +1175,25 @@
vnc_dpy_resize(vs->ds, 640, 400);
@@ -30,8 +30,8 @@ Index: ioemu/vnc.c
+}
Index: ioemu/vl.c
===================================================================
---- ioemu.orig/vl.c 2006-08-07 17:44:32.851773999 +0100
-+++ ioemu/vl.c 2006-08-07 17:44:32.918766704 +0100
+--- ioemu.orig/vl.c 2006-08-17 19:50:12.100798502 +0100
++++ ioemu/vl.c 2006-08-17 19:50:13.152682236 +0100
@@ -120,6 +120,7 @@
int bios_size;
static DisplayState display_state;
@@ -82,7 +82,7 @@ Index: ioemu/vl.c
}
}
}
-@@ -6458,6 +6466,8 @@
+@@ -6476,6 +6484,8 @@
dumb_display_init(ds);
} else if (vnc_display != -1) {
vnc_display_init(ds, vnc_display);
@@ -93,9 +93,9 @@ Index: ioemu/vl.c
sdl_display_init(ds, full_screen);
Index: ioemu/vl.h
===================================================================
---- ioemu.orig/vl.h 2006-08-07 17:44:32.853773781 +0100
-+++ ioemu/vl.h 2006-08-07 17:44:32.919766595 +0100
-@@ -785,6 +785,7 @@
+--- ioemu.orig/vl.h 2006-08-17 19:50:12.102798281 +0100
++++ ioemu/vl.h 2006-08-17 19:50:13.153682125 +0100
+@@ -786,6 +786,7 @@
/* vnc.c */
void vnc_display_init(DisplayState *ds, int display);
diff -r 91169603a8e8 -r 79afceca9065 tools/ioemu/patches/vnc-title-domain-name
--- a/tools/ioemu/patches/vnc-title-domain-name Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/ioemu/patches/vnc-title-domain-name Wed Aug 23 11:11:27 2006 -0600
@@ -1,7 +1,7 @@ Index: ioemu/vnc.c
Index: ioemu/vnc.c
===================================================================
---- ioemu.orig/vnc.c 2006-08-07 17:44:32.915767031 +0100
-+++ ioemu/vnc.c 2006-08-07 17:44:33.084748631 +0100
+--- ioemu.orig/vnc.c 2006-08-17 19:50:13.149682567 +0100
++++ ioemu/vnc.c 2006-08-17 19:50:14.623519661 +0100
@@ -1014,6 +1014,7 @@
static int protocol_client_init(VncState *vs, char *data, size_t len)
diff -r 91169603a8e8 -r 79afceca9065 tools/ioemu/patches/xen-mm
--- a/tools/ioemu/patches/xen-mm Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/ioemu/patches/xen-mm Wed Aug 23 11:11:27 2006 -0600
@@ -1,7 +1,7 @@ Index: ioemu/hw/pc.c
Index: ioemu/hw/pc.c
===================================================================
---- ioemu.orig/hw/pc.c 2006-08-06 02:15:39.708879311 +0100
-+++ ioemu/hw/pc.c 2006-08-06 02:18:18.875135656 +0100
+--- ioemu.orig/hw/pc.c 2006-08-17 19:36:00.588166019 +0100
++++ ioemu/hw/pc.c 2006-08-17 19:37:36.704485734 +0100
@@ -646,7 +646,9 @@
}
@@ -25,8 +25,8 @@ Index: ioemu/hw/pc.c
isa_bios_size = bios_size;
Index: ioemu/vl.c
===================================================================
---- ioemu.orig/vl.c 2006-08-06 02:18:12.550840673 +0100
-+++ ioemu/vl.c 2006-08-06 02:18:45.608155528 +0100
+--- ioemu.orig/vl.c 2006-08-17 19:36:00.667157242 +0100
++++ ioemu/vl.c 2006-08-17 19:47:08.538087284 +0100
@@ -158,6 +158,8 @@
int acpi_enabled = 1;
int fd_bootchk = 1;
@@ -40,7 +40,7 @@ Index: ioemu/vl.c
QEMUMachine *machine;
char usb_devices[MAX_USB_CMDLINE][128];
int usb_devices_index;
-+ unsigned long nr_pages;
++ unsigned long nr_pages, tmp_nr_pages, shared_page_nr;
+ xen_pfn_t *page_array;
+ extern void *shared_page;
@@ -60,16 +60,26 @@ Index: ioemu/vl.c
break;
case QEMU_OPTION_l:
{
-@@ -6133,12 +6140,49 @@
+@@ -6133,12 +6140,67 @@
/* init the memory */
phys_ram_size = ram_size + vga_ram_size + bios_size;
+#ifdef CONFIG_DM
+
-+ nr_pages = ram_size/PAGE_SIZE;
+ xc_handle = xc_interface_open();
+
-+ page_array = (xen_pfn_t *)malloc(nr_pages * sizeof(xen_pfn_t));
++ nr_pages = ram_size/PAGE_SIZE;
++ tmp_nr_pages = nr_pages;
++
++#if defined(__i386__) || defined(__x86_64__)
++ if (ram_size > HVM_BELOW_4G_RAM_END) {
++ tmp_nr_pages += HVM_BELOW_4G_MMIO_LENGTH >> PAGE_SHIFT;
++ shared_page_nr = (HVM_BELOW_4G_RAM_END >> PAGE_SHIFT) - 1;
++ } else
++ shared_page_nr = nr_pages - 1;
++#endif
++
++ page_array = (xen_pfn_t *)malloc(tmp_nr_pages * sizeof(xen_pfn_t));
+ if (page_array == NULL) {
+ fprintf(logfile, "malloc returned error %d\n", errno);
+ exit(-1);
@@ -80,20 +90,28 @@ Index: ioemu/vl.c
+ exit(-1);
+ }
+
++ if (ram_size > HVM_BELOW_4G_RAM_END)
++ for (i = 0; i < nr_pages - (HVM_BELOW_4G_RAM_END >> PAGE_SHIFT); i++)
++ page_array[tmp_nr_pages - 1 - i] = page_array[nr_pages - 1 - i];
++
+ phys_ram_base = xc_map_foreign_batch(xc_handle, domid,
+ PROT_READ|PROT_WRITE, page_array,
-+ nr_pages - 1);
-+ if (phys_ram_base == 0) {
-+ fprintf(logfile, "xc_map_foreign_batch returned error %d\n", errno);
++ tmp_nr_pages);
++ if (phys_ram_base == NULL) {
++ fprintf(logfile, "batch map guest memory returned error %d\n", errno);
+ exit(-1);
+ }
+
+ shared_page = xc_map_foreign_range(xc_handle, domid, PAGE_SIZE,
+ PROT_READ|PROT_WRITE,
-+ page_array[nr_pages - 1]);
++ page_array[shared_page_nr]);
++ if (shared_page == NULL) {
++ fprintf(logfile, "map shared IO page returned error %d\n", errno);
++ exit(-1);
++ }
+
-+ fprintf(logfile, "shared page at pfn:%lx, mfn: %"PRIx64"\n", nr_pages - 1,
-+ (uint64_t)(page_array[nr_pages - 1]));
++ fprintf(logfile, "shared page at pfn:%lx, mfn: %"PRIx64"\n",
++ shared_page_nr, (uint64_t)(page_array[shared_page_nr]));
+
+ free(page_array);
+
@@ -110,3 +128,28 @@ Index: ioemu/vl.c
/* we always create the cdrom drive, even if no disk is there */
bdrv_init();
if (cdrom_index >= 0) {
+Index: ioemu/hw/piix_pci.c
+===================================================================
+--- ioemu.orig/hw/piix_pci.c 2006-08-17 19:37:36.189542951 +0100
++++ ioemu/hw/piix_pci.c 2006-08-17 19:38:05.806252180 +0100
+@@ -399,7 +399,7 @@
+ uint8_t elcr[2];
+
+ pci_bios_io_addr = 0xc000;
+- pci_bios_mem_addr = 0xf0000000;
++ pci_bios_mem_addr = HVM_BELOW_4G_MMIO_START;
+
+ /* activate IRQ mappings */
+ elcr[0] = 0x00;
+Index: ioemu/vl.h
+===================================================================
+--- ioemu.orig/vl.h 2006-08-17 19:37:36.529505177 +0100
++++ ioemu/vl.h 2006-08-17 19:47:32.680418959 +0100
+@@ -39,6 +39,7 @@
+ #include <sys/stat.h>
+ #include "xenctrl.h"
+ #include "xs.h"
++#include <xen/hvm/e820.h>
+
+ #ifndef O_LARGEFILE
+ #define O_LARGEFILE 0
diff -r 91169603a8e8 -r 79afceca9065
tools/ioemu/patches/xen-support-buffered-ioreqs
--- a/tools/ioemu/patches/xen-support-buffered-ioreqs Tue Aug 22 14:45:49
2006 -0600
+++ b/tools/ioemu/patches/xen-support-buffered-ioreqs Wed Aug 23 11:11:27
2006 -0600
@@ -1,38 +1,38 @@ Index: ioemu/vl.c
Index: ioemu/vl.c
===================================================================
---- ioemu.orig/vl.c 2006-08-09 15:04:25.583508863 +0100
-+++ ioemu/vl.c 2006-08-09 15:04:26.034465993 +0100
+--- ioemu.orig/vl.c 2006-08-17 19:50:22.277673633 +0100
++++ ioemu/vl.c 2006-08-17 19:55:21.878556486 +0100
@@ -5838,6 +5838,7 @@
- unsigned long nr_pages;
+ unsigned long nr_pages, tmp_nr_pages, shared_page_nr;
xen_pfn_t *page_array;
extern void *shared_page;
+ extern void *buffered_io_page;
char qemu_dm_logfilename[64];
-@@ -6388,12 +6389,17 @@
-
- phys_ram_base = xc_map_foreign_batch(xc_handle, domid,
- PROT_READ|PROT_WRITE, page_array,
-- nr_pages - 1);
-+ nr_pages - 3);
- if (phys_ram_base == 0) {
- fprintf(logfile, "xc_map_foreign_batch returned error %d\n", errno);
- exit(-1);
- }
+@@ -6419,6 +6420,18 @@
+ fprintf(logfile, "shared page at pfn:%lx, mfn: %"PRIx64"\n",
+ shared_page_nr, (uint64_t)(page_array[shared_page_nr]));
+ /* not yet add for IA64 */
+ buffered_io_page = xc_map_foreign_range(xc_handle, domid, PAGE_SIZE,
-+ PROT_READ|PROT_WRITE,
-+ page_array[nr_pages - 3]);
++ PROT_READ|PROT_WRITE,
++ page_array[shared_page_nr - 2]);
++ if (buffered_io_page == NULL) {
++ fprintf(logfile, "map buffered IO page returned error %d\n", errno);
++ exit(-1);
++ }
+
- shared_page = xc_map_foreign_range(xc_handle, domid, PAGE_SIZE,
- PROT_READ|PROT_WRITE,
- page_array[nr_pages - 1]);
++ fprintf(logfile, "buffered io page at pfn:%lx, mfn: %"PRIx64"\n",
++ shared_page_nr - 2, (uint64_t)(page_array[shared_page_nr - 2]));
++
+ free(page_array);
+
+ #elif defined(__ia64__)
Index: ioemu/target-i386-dm/helper2.c
===================================================================
---- ioemu.orig/target-i386-dm/helper2.c 2006-08-09 15:04:24.105649313
+0100
-+++ ioemu/target-i386-dm/helper2.c 2006-08-09 15:04:26.040465422 +0100
+--- ioemu.orig/target-i386-dm/helper2.c 2006-08-17 19:49:44.491850141
+0100
++++ ioemu/target-i386-dm/helper2.c 2006-08-17 19:50:41.490549986 +0100
@@ -76,6 +76,10 @@
shared_iopage_t *shared_page = NULL;
diff -r 91169603a8e8 -r 79afceca9065
tools/ioemu/patches/xenstore-block-device-config
--- a/tools/ioemu/patches/xenstore-block-device-config Tue Aug 22 14:45:49
2006 -0600
+++ b/tools/ioemu/patches/xenstore-block-device-config Wed Aug 23 11:11:27
2006 -0600
@@ -1,7 +1,7 @@ Index: ioemu/Makefile.target
Index: ioemu/Makefile.target
===================================================================
---- ioemu.orig/Makefile.target 2006-08-09 15:04:24.795583755 +0100
-+++ ioemu/Makefile.target 2006-08-09 15:04:25.373528824 +0100
+--- ioemu.orig/Makefile.target 2006-08-17 19:50:02.405870095 +0100
++++ ioemu/Makefile.target 2006-08-17 19:50:18.866050726 +0100
@@ -358,6 +358,7 @@
VL_OBJS+= cirrus_vga.o mixeng.o parallel.o acpi.o piix_pci.o
VL_OBJS+= usb-uhci.o
@@ -13,7 +13,7 @@ Index: ioemu/xenstore.c
Index: ioemu/xenstore.c
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ ioemu/xenstore.c 2006-08-09 15:04:25.374528729 +0100
++++ ioemu/xenstore.c 2006-08-17 19:50:18.867050616 +0100
@@ -0,0 +1,187 @@
+/*
+ * This file is subject to the terms and conditions of the GNU General
@@ -204,8 +204,8 @@ Index: ioemu/xenstore.c
+}
Index: ioemu/vl.c
===================================================================
---- ioemu.orig/vl.c 2006-08-09 15:04:25.312534622 +0100
-+++ ioemu/vl.c 2006-08-09 15:04:25.377528443 +0100
+--- ioemu.orig/vl.c 2006-08-17 19:50:17.086247452 +0100
++++ ioemu/vl.c 2006-08-17 19:50:18.870050284 +0100
@@ -5243,9 +5243,11 @@
"Standard options:\n"
"-M machine select emulated machine (-M ? for list)\n"
@@ -359,7 +359,7 @@ Index: ioemu/vl.c
setvbuf(stdout, NULL, _IOLBF, 0);
-@@ -6417,6 +6448,7 @@
+@@ -6435,6 +6466,7 @@
#endif /* !CONFIG_DM */
@@ -367,7 +367,7 @@ Index: ioemu/vl.c
/* we always create the cdrom drive, even if no disk is there */
bdrv_init();
if (cdrom_index >= 0) {
-@@ -6443,6 +6475,7 @@
+@@ -6461,6 +6493,7 @@
}
}
}
@@ -375,7 +375,7 @@ Index: ioemu/vl.c
/* we always create at least one floppy disk */
fd_table[0] = bdrv_new("fda");
-@@ -6521,6 +6554,8 @@
+@@ -6539,6 +6572,8 @@
}
}
@@ -386,8 +386,8 @@ Index: ioemu/vl.c
kernel_filename, kernel_cmdline, initrd_filename,
Index: ioemu/monitor.c
===================================================================
---- ioemu.orig/monitor.c 2006-08-09 15:04:24.105649313 +0100
-+++ ioemu/monitor.c 2006-08-09 15:04:25.379528253 +0100
+--- ioemu.orig/monitor.c 2006-08-17 19:49:44.491850141 +0100
++++ ioemu/monitor.c 2006-08-17 19:50:18.871050174 +0100
@@ -24,6 +24,7 @@
#include "vl.h"
#include "disas.h"
@@ -416,8 +416,8 @@ Index: ioemu/monitor.c
int i;
Index: ioemu/block.c
===================================================================
---- ioemu.orig/block.c 2006-08-09 15:04:17.487277167 +0100
-+++ ioemu/block.c 2006-08-09 15:04:25.379528253 +0100
+--- ioemu.orig/block.c 2006-08-17 19:37:35.865578948 +0100
++++ ioemu/block.c 2006-08-17 19:50:18.872050063 +0100
@@ -758,6 +758,7 @@
static void raw_close(BlockDriverState *bs)
{
@@ -428,9 +428,9 @@ Index: ioemu/block.c
Index: ioemu/vl.h
===================================================================
---- ioemu.orig/vl.h 2006-08-09 15:04:25.313534527 +0100
-+++ ioemu/vl.h 2006-08-09 15:04:25.380528158 +0100
-@@ -1184,6 +1184,8 @@
+--- ioemu.orig/vl.h 2006-08-17 19:50:17.087247341 +0100
++++ ioemu/vl.h 2006-08-17 19:50:18.872050063 +0100
+@@ -1188,6 +1188,8 @@
void term_print_help(void);
void monitor_readline(const char *prompt, int is_password,
char *buf, int buf_size);
@@ -439,7 +439,7 @@ Index: ioemu/vl.h
/* readline.c */
typedef void ReadLineFunc(void *opaque, const char *str);
-@@ -1196,6 +1198,13 @@
+@@ -1200,6 +1202,13 @@
void readline_start(const char *prompt, int is_password,
ReadLineFunc *readline_func, void *opaque);
@@ -455,8 +455,8 @@ Index: ioemu/vl.h
extern char domain_name[];
Index: ioemu/hw/ide.c
===================================================================
---- ioemu.orig/hw/ide.c 2006-08-09 15:04:24.524609503 +0100
-+++ ioemu/hw/ide.c 2006-08-09 15:04:25.381528063 +0100
+--- ioemu.orig/hw/ide.c 2006-08-17 19:49:57.830375828 +0100
++++ ioemu/hw/ide.c 2006-08-17 19:50:18.874049842 +0100
@@ -1158,6 +1158,7 @@
} else {
ide_atapi_cmd_error(s, SENSE_NOT_READY,
diff -r 91169603a8e8 -r 79afceca9065 tools/ioemu/patches/xenstore-write-vnc-port
--- a/tools/ioemu/patches/xenstore-write-vnc-port Tue Aug 22 14:45:49
2006 -0600
+++ b/tools/ioemu/patches/xenstore-write-vnc-port Wed Aug 23 11:11:27
2006 -0600
@@ -1,7 +1,7 @@ Index: ioemu/xenstore.c
Index: ioemu/xenstore.c
===================================================================
---- ioemu.orig/xenstore.c 2006-08-09 15:04:25.374528729 +0100
-+++ ioemu/xenstore.c 2006-08-09 15:04:25.579509243 +0100
+--- ioemu.orig/xenstore.c 2006-08-17 19:50:18.867050616 +0100
++++ ioemu/xenstore.c 2006-08-17 19:50:22.274673964 +0100
@@ -185,3 +185,31 @@
free(image);
free(vec);
@@ -36,9 +36,9 @@ Index: ioemu/xenstore.c
+}
Index: ioemu/vl.c
===================================================================
---- ioemu.orig/vl.c 2006-08-09 15:04:25.377528443 +0100
-+++ ioemu/vl.c 2006-08-09 15:04:25.583508863 +0100
-@@ -6511,6 +6511,7 @@
+--- ioemu.orig/vl.c 2006-08-17 19:50:18.870050284 +0100
++++ ioemu/vl.c 2006-08-17 19:50:22.277673633 +0100
+@@ -6529,6 +6529,7 @@
vnc_display = vnc_display_init(ds, vnc_display, vncunused);
if (vncviewer)
vnc_start_viewer(vnc_display);
@@ -48,9 +48,9 @@ Index: ioemu/vl.c
sdl_display_init(ds, full_screen);
Index: ioemu/vl.h
===================================================================
---- ioemu.orig/vl.h 2006-08-09 15:04:25.380528158 +0100
-+++ ioemu/vl.h 2006-08-09 15:04:25.584508768 +0100
-@@ -1203,6 +1203,7 @@
+--- ioemu.orig/vl.h 2006-08-17 19:50:18.872050063 +0100
++++ ioemu/vl.h 2006-08-17 19:50:22.278673522 +0100
+@@ -1207,6 +1207,7 @@
int xenstore_fd(void);
void xenstore_process_event(void *opaque);
void xenstore_check_new_media_present(int timeout);
diff -r 91169603a8e8 -r 79afceca9065 tools/ioemu/target-i386-dm/exec-dm.c
--- a/tools/ioemu/target-i386-dm/exec-dm.c Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/ioemu/target-i386-dm/exec-dm.c Wed Aug 23 11:11:27 2006 -0600
@@ -449,6 +449,9 @@ void cpu_physical_memory_rw(target_phys_
/* RAM case */
ptr = phys_ram_base + addr1;
memcpy(ptr, buf, l);
+#ifdef __ia64__
+ sync_icache((unsigned long)ptr, l);
+#endif
}
} else {
if (io_index) {
@@ -473,9 +476,6 @@ void cpu_physical_memory_rw(target_phys_
ptr = phys_ram_base + (pd & TARGET_PAGE_MASK) +
(addr & ~TARGET_PAGE_MASK);
memcpy(buf, ptr, l);
-#ifdef __ia64__
- sync_icache((unsigned long)ptr, l);
-#endif
} else {
/* unreported MMIO space */
memset(buf, 0xff, len);
diff -r 91169603a8e8 -r 79afceca9065 tools/ioemu/vl.c
--- a/tools/ioemu/vl.c Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/ioemu/vl.c Wed Aug 23 11:11:27 2006 -0600
@@ -124,7 +124,7 @@ int vncunused;
int vncunused;
const char* keyboard_layout = NULL;
int64_t ticks_per_sec;
-int boot_device = 'c';
+char *boot_device = NULL;
uint64_t ram_size;
int pit_min_timer_count = 0;
int nb_nics;
@@ -5835,7 +5835,7 @@ int main(int argc, char **argv)
QEMUMachine *machine;
char usb_devices[MAX_USB_CMDLINE][128];
int usb_devices_index;
- unsigned long nr_pages;
+ unsigned long nr_pages, tmp_nr_pages, shared_page_nr;
xen_pfn_t *page_array;
extern void *shared_page;
extern void *buffered_io_page;
@@ -6036,10 +6036,11 @@ int main(int argc, char **argv)
}
break;
case QEMU_OPTION_nographic:
- pstrcpy(monitor_device, sizeof(monitor_device), "stdio");
+ if(!strcmp(monitor_device, "vc"))
+ pstrcpy(monitor_device, sizeof(monitor_device), "null");
if(!strcmp(serial_devices[0], "vc"))
pstrcpy(serial_devices[0], sizeof(serial_devices[0]),
- "stdio");
+ "null");
nographic = 1;
break;
case QEMU_OPTION_kernel:
@@ -6056,14 +6057,14 @@ int main(int argc, char **argv)
break;
#endif /* !CONFIG_DM */
case QEMU_OPTION_boot:
- boot_device = optarg[0];
- if (boot_device != 'a' &&
+ boot_device = strdup(optarg);
+ if (strspn(boot_device, "acd"
#ifdef TARGET_SPARC
- // Network boot
- boot_device != 'n' &&
-#endif
- boot_device != 'c' && boot_device != 'd') {
- fprintf(stderr, "qemu: invalid boot device '%c'\n",
boot_device);
+ "n"
+#endif
+ ) != strlen(boot_device)) {
+ fprintf(stderr, "qemu: invalid boot device in '%s'\n",
+ boot_device);
exit(1);
}
break;
@@ -6327,6 +6328,7 @@ int main(int argc, char **argv)
fd_filename[0] == '\0')
help();
+#if 0
/* boot to cd by default if no hard disk */
if (hd_filename[0] == '\0' && boot_device == 'c') {
if (fd_filename[0] != '\0')
@@ -6334,6 +6336,7 @@ int main(int argc, char **argv)
else
boot_device = 'd';
}
+#endif
#endif /* !CONFIG_DM */
setvbuf(stdout, NULL, _IOLBF, 0);
@@ -6365,17 +6368,27 @@ int main(int argc, char **argv)
/* init the memory */
phys_ram_size = ram_size + vga_ram_size + bios_size;
+#ifdef CONFIG_DM
+
+ xc_handle = xc_interface_open();
+
#if defined (__ia64__)
if (ram_size > MMIO_START)
- ram_size += 1 * MEM_G; /* skip 3G-4G MMIO, LEGACY_IO_SPACE etc. */
-#endif
-
-#ifdef CONFIG_DM
+ ram_size += 1 * MEM_G; /* skip 3G-4G MMIO, LEGACY_IO_SPACE etc. */
+#endif
nr_pages = ram_size/PAGE_SIZE;
- xc_handle = xc_interface_open();
-
- page_array = (xen_pfn_t *)malloc(nr_pages * sizeof(xen_pfn_t));
+ tmp_nr_pages = nr_pages;
+
+#if defined(__i386__) || defined(__x86_64__)
+ if (ram_size > HVM_BELOW_4G_RAM_END) {
+ tmp_nr_pages += HVM_BELOW_4G_MMIO_LENGTH >> PAGE_SHIFT;
+ shared_page_nr = (HVM_BELOW_4G_RAM_END >> PAGE_SHIFT) - 1;
+ } else
+ shared_page_nr = nr_pages - 1;
+#endif
+
+ page_array = (xen_pfn_t *)malloc(tmp_nr_pages * sizeof(xen_pfn_t));
if (page_array == NULL) {
fprintf(logfile, "malloc returned error %d\n", errno);
exit(-1);
@@ -6387,25 +6400,40 @@ int main(int argc, char **argv)
exit(-1);
}
+ if (ram_size > HVM_BELOW_4G_RAM_END)
+ for (i = 0; i < nr_pages - (HVM_BELOW_4G_RAM_END >> PAGE_SHIFT); i++)
+ page_array[tmp_nr_pages - 1 - i] = page_array[nr_pages - 1 - i];
+
phys_ram_base = xc_map_foreign_batch(xc_handle, domid,
PROT_READ|PROT_WRITE, page_array,
- nr_pages - 3);
- if (phys_ram_base == 0) {
- fprintf(logfile, "xc_map_foreign_batch returned error %d\n", errno);
+ tmp_nr_pages);
+ if (phys_ram_base == NULL) {
+ fprintf(logfile, "batch map guest memory returned error %d\n", errno);
exit(-1);
}
+
+ shared_page = xc_map_foreign_range(xc_handle, domid, PAGE_SIZE,
+ PROT_READ|PROT_WRITE,
+ page_array[shared_page_nr]);
+ if (shared_page == NULL) {
+ fprintf(logfile, "map shared IO page returned error %d\n", errno);
+ exit(-1);
+ }
+
+ fprintf(logfile, "shared page at pfn:%lx, mfn: %"PRIx64"\n",
+ shared_page_nr, (uint64_t)(page_array[shared_page_nr]));
/* not yet add for IA64 */
buffered_io_page = xc_map_foreign_range(xc_handle, domid, PAGE_SIZE,
- PROT_READ|PROT_WRITE,
- page_array[nr_pages - 3]);
-
- shared_page = xc_map_foreign_range(xc_handle, domid, PAGE_SIZE,
- PROT_READ|PROT_WRITE,
- page_array[nr_pages - 1]);
-
- fprintf(logfile, "shared page at pfn:%lx, mfn: %"PRIx64"\n", nr_pages - 1,
- (uint64_t)(page_array[nr_pages - 1]));
+ PROT_READ|PROT_WRITE,
+ page_array[shared_page_nr - 2]);
+ if (buffered_io_page == NULL) {
+ fprintf(logfile, "map buffered IO page returned error %d\n", errno);
+ exit(-1);
+ }
+
+ fprintf(logfile, "buffered io page at pfn:%lx, mfn: %"PRIx64"\n",
+ shared_page_nr - 2, (uint64_t)(page_array[shared_page_nr - 2]));
free(page_array);
@@ -6431,9 +6459,9 @@ int main(int argc, char **argv)
}
if (ram_size > MMIO_START) {
- for (i = 0 ; i < MEM_G >> PAGE_SHIFT; i++)
- page_array[MMIO_START >> PAGE_SHIFT + i] =
- page_array[IO_PAGE_START >> PAGE_SHIFT + 1];
+ for (i = 0 ; i < MEM_G >> PAGE_SHIFT; i++)
+ page_array[MMIO_START >> PAGE_SHIFT + i] =
+ page_array[IO_PAGE_START >> PAGE_SHIFT + 1];
}
phys_ram_base = xc_map_foreign_batch(xc_handle, domid,
@@ -6567,6 +6595,7 @@ int main(int argc, char **argv)
ds, fd_filename, snapshot,
kernel_filename, kernel_cmdline, initrd_filename,
timeoffset);
+ free(boot_device);
/* init USB devices */
if (usb_enabled) {
diff -r 91169603a8e8 -r 79afceca9065 tools/ioemu/vl.h
--- a/tools/ioemu/vl.h Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/ioemu/vl.h Wed Aug 23 11:11:27 2006 -0600
@@ -39,6 +39,7 @@
#include <sys/stat.h>
#include "xenctrl.h"
#include "xs.h"
+#include <xen/hvm/e820.h>
#ifndef O_LARGEFILE
#define O_LARGEFILE 0
@@ -574,7 +575,7 @@ int qcow_compress_cluster(BlockDriverSta
#ifndef QEMU_TOOL
typedef void QEMUMachineInitFunc(uint64_t ram_size, int vga_ram_size,
- int boot_device,
+ char *boot_device,
DisplayState *ds, const char **fd_filename, int snapshot,
const char *kernel_filename, const char *kernel_cmdline,
const char *initrd_filename, time_t timeoffset);
@@ -925,6 +926,9 @@ void piix4_pm_init(PCIBus *bus, int devf
void piix4_pm_init(PCIBus *bus, int devfn);
void acpi_bios_init(void);
+/* piix4acpi.c */
+extern void pci_piix4_acpi_init(PCIBus *bus, int devfn);
+
/* pc.c */
extern QEMUMachine pc_machine;
extern QEMUMachine isapc_machine;
@@ -1016,7 +1020,7 @@ void NVRAM_set_crc (m48t59_t *nvram, uin
uint32_t start, uint32_t count);
int PPC_NVRAM_set_params (m48t59_t *nvram, uint16_t NVRAM_size,
const unsigned char *arch,
- uint32_t RAM_size, int boot_device,
+ uint32_t RAM_size, char *boot_device,
uint32_t kernel_image, uint32_t kernel_size,
const char *cmdline,
uint32_t initrd_image, uint32_t initrd_size,
@@ -1205,6 +1209,9 @@ void xenstore_check_new_media_present(in
void xenstore_check_new_media_present(int timeout);
void xenstore_write_vncport(int vnc_display);
+/* xen_platform.c */
+void pci_xen_platform_init(PCIBus *bus);
+
void kqemu_record_dump(void);
diff -r 91169603a8e8 -r 79afceca9065 tools/libaio/src/Makefile
--- a/tools/libaio/src/Makefile Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/libaio/src/Makefile Wed Aug 23 11:11:27 2006 -0600
@@ -1,3 +1,6 @@ prefix=/usr
+XEN_ROOT = ../../..
+include $(XEN_ROOT)/tools/Rules.mk
+
prefix=/usr
includedir=$(prefix)/include
libdir=$(prefix)/lib
@@ -44,8 +47,8 @@ libaio_sobjs := $(patsubst %.c,%.os,$(li
libaio.a: $(libaio_objs)
rm -f libaio.a
- ar r libaio.a $^
- ranlib libaio.a
+ $(AR) r libaio.a $^
+ $(RANLIB) libaio.a
$(libname): $(libaio_sobjs) libaio.map
$(CC) $(SO_CFLAGS) -Wl,--version-script=libaio.map
-Wl,-soname=$(soname) -o $@ $(libaio_sobjs) $(LINK_FLAGS)
diff -r 91169603a8e8 -r 79afceca9065 tools/libxc/Makefile
--- a/tools/libxc/Makefile Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/libxc/Makefile Wed Aug 23 11:11:27 2006 -0600
@@ -29,7 +29,6 @@ GUEST_SRCS-y += xc_load_bin.c
GUEST_SRCS-y += xc_load_bin.c
GUEST_SRCS-y += xc_load_elf.c
GUEST_SRCS-y += xg_private.c
-GUEST_SRCS-$(CONFIG_POWERPC) += xc_ppc_linux_build.c
GUEST_SRCS-$(CONFIG_X86) += xc_linux_build.c
GUEST_SRCS-$(CONFIG_IA64) += xc_linux_build.c
GUEST_SRCS-$(CONFIG_MIGRATE) += xc_linux_restore.c xc_linux_save.c
@@ -100,8 +99,9 @@ TAGS:
.PHONY: clean
clean:
- rm -rf *.a *.so* *.o *.opic *.rpm $(LIB) *~ $(DEPS) xen
- rm -rf ia64/*.o ia64/*.opic
+ rm -rf *.rpm $(LIB) *~ $(DEPS) xen \
+ $(CTRL_LIB_OBJS) $(CTRL_PIC_OBJS) \
+ $(GUEST_LIB_OBJS) $(GUEST_PIC_OBJS)
.PHONY: rpm
rpm: build
@@ -140,3 +140,4 @@ libxenguest.so.$(MAJOR).$(MINOR): $(GUES
$(CC) $(CFLAGS) $(LDFLAGS) -Wl,-soname -Wl,libxenguest.so.$(MAJOR)
-shared -o $@ $^ -lz -lxenctrl
-include $(DEPS)
+
diff -r 91169603a8e8 -r 79afceca9065 tools/libxc/ia64/xc_ia64_linux_restore.c
--- a/tools/libxc/ia64/xc_ia64_linux_restore.c Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/libxc/ia64/xc_ia64_linux_restore.c Wed Aug 23 11:11:27 2006 -0600
@@ -288,8 +288,8 @@ xc_linux_restore(int xc_handle, int io_f
start_info->flags = 0;
*store_mfn = page_array[start_info->store_mfn];
start_info->store_evtchn = store_evtchn;
- *console_mfn = page_array[start_info->console_mfn];
- start_info->console_evtchn = console_evtchn;
+ *console_mfn = page_array[start_info->console.domU.mfn];
+ start_info->console.domU.evtchn = console_evtchn;
munmap(start_info, PAGE_SIZE);
/*
diff -r 91169603a8e8 -r 79afceca9065 tools/libxc/xc_domain.c
--- a/tools/libxc/xc_domain.c Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/libxc/xc_domain.c Wed Aug 23 11:11:27 2006 -0600
@@ -213,21 +213,28 @@ int xc_shadow_control(int xc_handle,
unsigned int sop,
unsigned long *dirty_bitmap,
unsigned long pages,
- xc_shadow_control_stats_t *stats )
+ unsigned long *mb,
+ uint32_t mode,
+ xc_shadow_control_stats_t *stats)
{
int rc;
DECLARE_DOM0_OP;
op.cmd = DOM0_SHADOW_CONTROL;
op.u.shadow_control.domain = (domid_t)domid;
op.u.shadow_control.op = sop;
+ op.u.shadow_control.pages = pages;
+ op.u.shadow_control.mb = mb ? *mb : 0;
+ op.u.shadow_control.mode = mode;
set_xen_guest_handle(op.u.shadow_control.dirty_bitmap, dirty_bitmap);
- op.u.shadow_control.pages = pages;
rc = do_dom0_op(xc_handle, &op);
if ( stats )
memcpy(stats, &op.u.shadow_control.stats,
sizeof(xc_shadow_control_stats_t));
+
+ if ( mb )
+ *mb = op.u.shadow_control.mb;
return (rc == 0) ? op.u.shadow_control.pages : rc;
}
@@ -391,7 +398,7 @@ int xc_domain_memory_populate_physmap(in
if ( err > 0 )
{
- DPRINTF("Failed deallocation for dom %d: %ld pages order %d\n",
+ DPRINTF("Failed allocation for dom %d: %ld pages order %d\n",
domid, nr_extents, extent_order);
errno = EBUSY;
err = -1;
diff -r 91169603a8e8 -r 79afceca9065 tools/libxc/xc_evtchn.c
--- a/tools/libxc/xc_evtchn.c Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/libxc/xc_evtchn.c Wed Aug 23 11:11:27 2006 -0600
@@ -49,14 +49,3 @@ int xc_evtchn_alloc_unbound(int xc_handl
return rc;
}
-
-
-int xc_evtchn_status(int xc_handle,
- uint32_t dom,
- evtchn_port_t port,
- xc_evtchn_status_t *status)
-{
- status->dom = (domid_t)dom;
- status->port = port;
- return do_evtchn_op(xc_handle, EVTCHNOP_status, status, sizeof(*status));
-}
diff -r 91169603a8e8 -r 79afceca9065 tools/libxc/xc_hvm_build.c
--- a/tools/libxc/xc_hvm_build.c Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/libxc/xc_hvm_build.c Wed Aug 23 11:11:27 2006 -0600
@@ -14,29 +14,9 @@
#include <xen/hvm/hvm_info_table.h>
#include <xen/hvm/ioreq.h>
#include <xen/hvm/params.h>
+#include <xen/hvm/e820.h>
#define HVM_LOADER_ENTR_ADDR 0x00100000
-
-#define E820MAX 128
-
-#define E820_RAM 1
-#define E820_RESERVED 2
-#define E820_ACPI 3
-#define E820_NVS 4
-#define E820_IO 16
-#define E820_SHARED_PAGE 17
-#define E820_XENSTORE 18
-#define E820_BUFFERED_IO 19
-
-#define E820_MAP_PAGE 0x00090000
-#define E820_MAP_NR_OFFSET 0x000001E8
-#define E820_MAP_OFFSET 0x000002D0
-
-struct e820entry {
- uint64_t addr;
- uint64_t size;
- uint32_t type;
-} __attribute__((packed));
static int
parseelfimage(
@@ -74,16 +54,26 @@ static void build_e820map(void *e820_pag
{
struct e820entry *e820entry =
(struct e820entry *)(((unsigned char *)e820_page) + E820_MAP_OFFSET);
+ unsigned long long extra_mem_size = 0;
unsigned char nr_map = 0;
- /* XXX: Doesn't work for > 4GB yet */
+ /*
+ * physical address space from HVM_BELOW_4G_RAM_END to 4G is reserved
+ * for PCI devices MMIO. So if HVM has more than HVM_BELOW_4G_RAM_END
+ * RAM, memory beyond HVM_BELOW_4G_RAM_END will go to 4G above.
+ */
+ if ( mem_size > HVM_BELOW_4G_RAM_END ) {
+ extra_mem_size = mem_size - HVM_BELOW_4G_RAM_END;
+ mem_size = HVM_BELOW_4G_RAM_END;
+ }
+
e820entry[nr_map].addr = 0x0;
- e820entry[nr_map].size = 0x9F800;
+ e820entry[nr_map].size = 0x9F000;
e820entry[nr_map].type = E820_RAM;
nr_map++;
- e820entry[nr_map].addr = 0x9F800;
- e820entry[nr_map].size = 0x800;
+ e820entry[nr_map].addr = 0x9F000;
+ e820entry[nr_map].size = 0x1000;
e820entry[nr_map].type = E820_RESERVED;
nr_map++;
@@ -97,53 +87,86 @@ static void build_e820map(void *e820_pag
e820entry[nr_map].type = E820_RESERVED;
nr_map++;
-#define STATIC_PAGES 3
- /* 3 static pages:
- * - ioreq buffer.
- * - xenstore.
- * - shared_page.
- */
+/* ACPI data: 10 pages. */
+#define ACPI_DATA_PAGES 10
+/* ACPI NVS: 3 pages. */
+#define ACPI_NVS_PAGES 3
+/* buffered io page. */
+#define BUFFERED_IO_PAGES 1
+/* xenstore page. */
+#define XENSTORE_PAGES 1
+/* shared io page. */
+#define SHARED_IO_PAGES 1
+/* totally 16 static pages are reserved in E820 table */
/* Most of the ram goes here */
e820entry[nr_map].addr = 0x100000;
- e820entry[nr_map].size = mem_size - 0x100000 - STATIC_PAGES * PAGE_SIZE;
+ e820entry[nr_map].size = mem_size - 0x100000 - PAGE_SIZE *
+ (ACPI_DATA_PAGES +
+ ACPI_NVS_PAGES +
+ BUFFERED_IO_PAGES +
+ XENSTORE_PAGES +
+ SHARED_IO_PAGES);
e820entry[nr_map].type = E820_RAM;
nr_map++;
/* Statically allocated special pages */
+ /* For ACPI data */
+ e820entry[nr_map].addr = mem_size - PAGE_SIZE *
+ (ACPI_DATA_PAGES +
+ ACPI_NVS_PAGES +
+ BUFFERED_IO_PAGES +
+ XENSTORE_PAGES +
+ SHARED_IO_PAGES);
+ e820entry[nr_map].size = PAGE_SIZE * ACPI_DATA_PAGES;
+ e820entry[nr_map].type = E820_ACPI;
+ nr_map++;
+
+ /* For ACPI NVS */
+ e820entry[nr_map].addr = mem_size - PAGE_SIZE *
+ (ACPI_NVS_PAGES +
+ BUFFERED_IO_PAGES +
+ XENSTORE_PAGES +
+ SHARED_IO_PAGES);
+ e820entry[nr_map].size = PAGE_SIZE * ACPI_NVS_PAGES;
+ e820entry[nr_map].type = E820_NVS;
+ nr_map++;
+
/* For buffered IO requests */
- e820entry[nr_map].addr = mem_size - 3 * PAGE_SIZE;
- e820entry[nr_map].size = PAGE_SIZE;
+ e820entry[nr_map].addr = mem_size - PAGE_SIZE *
+ (BUFFERED_IO_PAGES +
+ XENSTORE_PAGES +
+ SHARED_IO_PAGES);
+ e820entry[nr_map].size = PAGE_SIZE * BUFFERED_IO_PAGES;
e820entry[nr_map].type = E820_BUFFERED_IO;
nr_map++;
/* For xenstore */
- e820entry[nr_map].addr = mem_size - 2 * PAGE_SIZE;
- e820entry[nr_map].size = PAGE_SIZE;
+ e820entry[nr_map].addr = mem_size - PAGE_SIZE *
+ (XENSTORE_PAGES +
+ SHARED_IO_PAGES);
+ e820entry[nr_map].size = PAGE_SIZE * XENSTORE_PAGES;
e820entry[nr_map].type = E820_XENSTORE;
nr_map++;
/* Shared ioreq_t page */
- e820entry[nr_map].addr = mem_size - PAGE_SIZE;
- e820entry[nr_map].size = PAGE_SIZE;
+ e820entry[nr_map].addr = mem_size - PAGE_SIZE * SHARED_IO_PAGES;
+ e820entry[nr_map].size = PAGE_SIZE * SHARED_IO_PAGES;
e820entry[nr_map].type = E820_SHARED_PAGE;
- nr_map++;
-
- e820entry[nr_map].addr = mem_size;
- e820entry[nr_map].size = 0x3 * PAGE_SIZE;
- e820entry[nr_map].type = E820_NVS;
- nr_map++;
-
- e820entry[nr_map].addr = mem_size + 0x3 * PAGE_SIZE;
- e820entry[nr_map].size = 0xA * PAGE_SIZE;
- e820entry[nr_map].type = E820_ACPI;
nr_map++;
e820entry[nr_map].addr = 0xFEC00000;
e820entry[nr_map].size = 0x1400000;
e820entry[nr_map].type = E820_IO;
nr_map++;
+
+ if ( extra_mem_size ) {
+ e820entry[nr_map].addr = (1ULL << 32);
+ e820entry[nr_map].size = extra_mem_size;
+ e820entry[nr_map].type = E820_RAM;
+ nr_map++;
+ }
*(((unsigned char *)e820_page) + E820_MAP_NR_OFFSET) = nr_map;
}
@@ -167,7 +190,7 @@ static void set_hvm_info_checksum(struct
*/
static int set_hvm_info(int xc_handle, uint32_t dom,
xen_pfn_t *pfn_list, unsigned int vcpus,
- unsigned int pae, unsigned int acpi, unsigned int apic)
+ unsigned int acpi)
{
char *va_map;
struct hvm_info_table *va_hvm;
@@ -185,16 +208,11 @@ static int set_hvm_info(int xc_handle, u
strncpy(va_hvm->signature, "HVM INFO", 8);
va_hvm->length = sizeof(struct hvm_info_table);
va_hvm->acpi_enabled = acpi;
- va_hvm->apic_enabled = apic;
- va_hvm->pae_enabled = pae;
va_hvm->nr_vcpus = vcpus;
set_hvm_info_checksum(va_hvm);
munmap(va_map, PAGE_SIZE);
-
- xc_set_hvm_param(xc_handle, dom, HVM_PARAM_APIC_ENABLED, apic);
- xc_set_hvm_param(xc_handle, dom, HVM_PARAM_PAE_ENABLED, pae);
return 0;
}
@@ -223,11 +241,7 @@ static int setup_guest(int xc_handle,
struct domain_setup_info dsi;
uint64_t v_end;
- unsigned long shared_page_frame = 0;
- shared_iopage_t *sp;
-
- unsigned long ioreq_buffer_frame = 0;
- void *ioreq_buffer_page;
+ unsigned long shared_page_nr;
memset(&dsi, 0, sizeof(struct domain_setup_info));
@@ -279,21 +293,38 @@ static int setup_guest(int xc_handle,
/* Write the machine->phys table entries. */
for ( count = 0; count < nr_pages; count++ )
{
+ unsigned long gpfn_count_skip;
+
ptr = (unsigned long long)page_array[count] << PAGE_SHIFT;
+
+ gpfn_count_skip = 0;
+
+ /*
+ * physical address space from HVM_BELOW_4G_RAM_END to 4G is reserved
+ * for PCI devices MMIO. So if HVM has more than HVM_BELOW_4G_RAM_END
+ * RAM, memory beyond HVM_BELOW_4G_RAM_END will go to 4G above.
+ */
+ if ( count >= (HVM_BELOW_4G_RAM_END >> PAGE_SHIFT) )
+ gpfn_count_skip = HVM_BELOW_4G_MMIO_LENGTH >> PAGE_SHIFT;
+
if ( xc_add_mmu_update(xc_handle, mmu,
- ptr | MMU_MACHPHYS_UPDATE, count) )
+ ptr | MMU_MACHPHYS_UPDATE,
+ count + gpfn_count_skip) )
goto error_out;
}
- if ( set_hvm_info(xc_handle, dom, page_array, vcpus, pae, acpi, apic) )
+ if ( set_hvm_info(xc_handle, dom, page_array, vcpus, acpi) )
{
ERROR("Couldn't set hvm info for HVM guest.\n");
goto error_out;
}
+
+ xc_set_hvm_param(xc_handle, dom, HVM_PARAM_PAE_ENABLED, pae);
+ xc_set_hvm_param(xc_handle, dom, HVM_PARAM_APIC_ENABLED, apic);
if ( (e820_page = xc_map_foreign_range(
xc_handle, dom, PAGE_SIZE, PROT_READ | PROT_WRITE,
- page_array[E820_MAP_PAGE >> PAGE_SHIFT])) == 0 )
+ page_array[E820_MAP_PAGE >> PAGE_SHIFT])) == NULL )
goto error_out;
memset(e820_page, 0, PAGE_SIZE);
build_e820map(e820_page, v_end);
@@ -302,40 +333,33 @@ static int setup_guest(int xc_handle,
/* shared_info page starts its life empty. */
if ( (shared_info = xc_map_foreign_range(
xc_handle, dom, PAGE_SIZE, PROT_READ | PROT_WRITE,
- shared_info_frame)) == 0 )
- goto error_out;
- memset(shared_info, 0, sizeof(shared_info_t));
+ shared_info_frame)) == NULL )
+ goto error_out;
+ memset(shared_info, 0, PAGE_SIZE);
/* Mask all upcalls... */
for ( i = 0; i < MAX_VIRT_CPUS; i++ )
shared_info->vcpu_info[i].evtchn_upcall_mask = 1;
munmap(shared_info, PAGE_SIZE);
+ if ( v_end > HVM_BELOW_4G_RAM_END )
+ shared_page_nr = (HVM_BELOW_4G_RAM_END >> PAGE_SHIFT) - 1;
+ else
+ shared_page_nr = (v_end >> PAGE_SHIFT) - 1;
+
+ *store_mfn = page_array[shared_page_nr - 1];
+
+ xc_set_hvm_param(xc_handle, dom, HVM_PARAM_STORE_PFN, shared_page_nr - 1);
+ xc_set_hvm_param(xc_handle, dom, HVM_PARAM_STORE_EVTCHN, store_evtchn);
+
/* Paranoia */
- shared_page_frame = page_array[(v_end >> PAGE_SHIFT) - 1];
- if ( (sp = (shared_iopage_t *) xc_map_foreign_range(
- xc_handle, dom, PAGE_SIZE, PROT_READ | PROT_WRITE,
- shared_page_frame)) == 0 )
- goto error_out;
- memset(sp, 0, PAGE_SIZE);
- munmap(sp, PAGE_SIZE);
+ /* clean the shared IO requests page */
+ if ( xc_clear_domain_page(xc_handle, dom, page_array[shared_page_nr]) )
+ goto error_out;
/* clean the buffered IO requests page */
- ioreq_buffer_frame = page_array[(v_end >> PAGE_SHIFT) - 3];
- ioreq_buffer_page = xc_map_foreign_range(xc_handle, dom, PAGE_SIZE,
- PROT_READ | PROT_WRITE,
- ioreq_buffer_frame);
-
- if ( ioreq_buffer_page == NULL )
- goto error_out;
-
- memset(ioreq_buffer_page, 0, PAGE_SIZE);
-
- munmap(ioreq_buffer_page, PAGE_SIZE);
-
- xc_set_hvm_param(xc_handle, dom, HVM_PARAM_STORE_PFN, (v_end >>
PAGE_SHIFT) - 2);
- xc_set_hvm_param(xc_handle, dom, HVM_PARAM_STORE_EVTCHN, store_evtchn);
-
- *store_mfn = page_array[(v_end >> PAGE_SHIFT) - 2];
+ if ( xc_clear_domain_page(xc_handle, dom, page_array[shared_page_nr - 2]) )
+ goto error_out;
+
if ( xc_clear_domain_page(xc_handle, dom, *store_mfn) )
goto error_out;
@@ -416,6 +440,18 @@ static int xc_hvm_build_internal(int xc_
PERROR("Could not get info on domain");
goto error_out;
}
+
+ /* HVM domains must be put into shadow2 mode at the start of day */
+ if ( xc_shadow_control(xc_handle, domid, DOM0_SHADOW_CONTROL_OP_ENABLE,
+ NULL, 0, NULL,
+ DOM0_SHADOW_ENABLE_REFCOUNT |
+ DOM0_SHADOW_ENABLE_TRANSLATE |
+ DOM0_SHADOW_ENABLE_EXTERNAL,
+ NULL) )
+ {
+ PERROR("Could not enable shadow paging for domain.\n");
+ goto error_out;
+ }
memset(ctxt, 0, sizeof(*ctxt));
diff -r 91169603a8e8 -r 79afceca9065 tools/libxc/xc_linux.c
--- a/tools/libxc/xc_linux.c Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/libxc/xc_linux.c Wed Aug 23 11:11:27 2006 -0600
@@ -13,13 +13,43 @@
#include <xen/memory.h>
#include <xen/sys/evtchn.h>
+#include <unistd.h>
+#include <fcntl.h>
int xc_interface_open(void)
{
+ int flags, saved_errno;
int fd = open("/proc/xen/privcmd", O_RDWR);
+
if ( fd == -1 )
+ {
PERROR("Could not obtain handle on privileged command interface");
+ return -1;
+ }
+
+ /* Although we return the file handle as the 'xc handle' the API
+ does not specify / guarentee that this integer is in fact
+ a file handle. Thus we must take responsiblity to ensure
+ it doesn't propagate (ie leak) outside the process */
+ if ( (flags = fcntl(fd, F_GETFD)) < 0 )
+ {
+ PERROR("Could not get file handle flags");
+ goto error;
+ }
+ flags |= FD_CLOEXEC;
+ if ( fcntl(fd, F_SETFD, flags) < 0 )
+ {
+ PERROR("Could not set file handle flags");
+ goto error;
+ }
+
return fd;
+
+ error:
+ saved_errno = errno;
+ close(fd);
+ errno = saved_errno;
+ return -1;
}
int xc_interface_close(int xc_handle)
diff -r 91169603a8e8 -r 79afceca9065 tools/libxc/xc_linux_build.c
--- a/tools/libxc/xc_linux_build.c Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/libxc/xc_linux_build.c Wed Aug 23 11:11:27 2006 -0600
@@ -16,15 +16,11 @@
/* Handy for printing out '0' prepended values at native pointer size */
#define _p(a) ((void *) ((ulong)a))
-#if defined(__i386__)
#define L1_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED)
#define L2_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED|_PAGE_DIRTY|_PAGE_USER)
+#if defined(__i386__)
#define L3_PROT (_PAGE_PRESENT)
-#endif
-
-#if defined(__x86_64__)
-#define L1_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED|_PAGE_USER)
-#define L2_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED|_PAGE_DIRTY|_PAGE_USER)
+#elif defined(__x86_64__)
#define L3_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED|_PAGE_DIRTY|_PAGE_USER)
#define L4_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED|_PAGE_DIRTY|_PAGE_USER)
#endif
@@ -569,8 +565,8 @@ static int setup_guest(int xc_handle,
start_info->flags = flags;
start_info->store_mfn = nr_pages - 2;
start_info->store_evtchn = store_evtchn;
- start_info->console_mfn = nr_pages - 1;
- start_info->console_evtchn = console_evtchn;
+ start_info->console.domU.mfn = nr_pages - 1;
+ start_info->console.domU.evtchn = console_evtchn;
start_info->nr_pages = nr_pages; // FIXME?: nr_pages - 2 ????
bp = (struct xen_ia64_boot_param *)(start_info + 1);
@@ -593,7 +589,7 @@ static int setup_guest(int xc_handle,
xc_handle, dom, PAGE_SIZE, PROT_READ|PROT_WRITE, shared_info_frame);
printf("shared_info = %p, err=%s frame=%lx\n",
shared_info, strerror (errno), shared_info_frame);
- //memset(shared_info, 0, sizeof(shared_info_t));
+ //memset(shared_info, 0, PAGE_SIZE);
/* Mask all upcalls... */
for ( i = 0; i < MAX_VIRT_CPUS; i++ )
shared_info->vcpu_info[i].evtchn_upcall_mask = 1;
@@ -972,7 +968,7 @@ static int setup_guest(int xc_handle,
/* Enable shadow translate mode */
if ( xc_shadow_control(xc_handle, dom,
DOM0_SHADOW_CONTROL_OP_ENABLE_TRANSLATE,
- NULL, 0, NULL) < 0 )
+ NULL, 0, NULL, 0, NULL) < 0 )
{
PERROR("Could not enable translation mode");
goto error_out;
@@ -1047,8 +1043,8 @@ static int setup_guest(int xc_handle,
start_info->mfn_list = vphysmap_start;
start_info->store_mfn = guest_store_mfn;
start_info->store_evtchn = store_evtchn;
- start_info->console_mfn = guest_console_mfn;
- start_info->console_evtchn = console_evtchn;
+ start_info->console.domU.mfn = guest_console_mfn;
+ start_info->console.domU.evtchn = console_evtchn;
if ( initrd->len != 0 )
{
start_info->mod_start = vinitrd_start;
@@ -1064,7 +1060,7 @@ static int setup_guest(int xc_handle,
/* shared_info page starts its life empty. */
shared_info = xc_map_foreign_range(
xc_handle, dom, PAGE_SIZE, PROT_READ|PROT_WRITE, shared_info_frame);
- memset(shared_info, 0, sizeof(shared_info_t));
+ memset(shared_info, 0, PAGE_SIZE);
/* Mask all upcalls... */
for ( i = 0; i < MAX_VIRT_CPUS; i++ )
shared_info->vcpu_info[i].evtchn_upcall_mask = 1;
diff -r 91169603a8e8 -r 79afceca9065 tools/libxc/xc_linux_restore.c
--- a/tools/libxc/xc_linux_restore.c Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/libxc/xc_linux_restore.c Wed Aug 23 11:11:27 2006 -0600
@@ -690,8 +690,9 @@ int xc_linux_restore(int xc_handle, int
start_info->flags = 0;
*store_mfn = start_info->store_mfn = p2m[start_info->store_mfn];
start_info->store_evtchn = store_evtchn;
- *console_mfn = start_info->console_mfn = p2m[start_info->console_mfn];
- start_info->console_evtchn = console_evtchn;
+ start_info->console.domU.mfn = p2m[start_info->console.domU.mfn];
+ start_info->console.domU.evtchn = console_evtchn;
+ *console_mfn = start_info->console.domU.mfn;
munmap(start_info, PAGE_SIZE);
/* Uncanonicalise each GDT frame number. */
@@ -737,7 +738,7 @@ int xc_linux_restore(int xc_handle, int
/* Copy saved contents of shared-info page. No checking needed. */
page = xc_map_foreign_range(
xc_handle, dom, PAGE_SIZE, PROT_WRITE, shared_info_frame);
- memcpy(page, shared_info, sizeof(shared_info_t));
+ memcpy(page, shared_info, PAGE_SIZE);
munmap(page, PAGE_SIZE);
/* Uncanonicalise the pfn-to-mfn table frame-number list. */
diff -r 91169603a8e8 -r 79afceca9065 tools/libxc/xc_linux_save.c
--- a/tools/libxc/xc_linux_save.c Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/libxc/xc_linux_save.c Wed Aug 23 11:11:27 2006 -0600
@@ -338,19 +338,17 @@ static int analysis_phase(int xc_handle,
int i;
xc_shadow_control(xc_handle, domid, DOM0_SHADOW_CONTROL_OP_CLEAN,
- arr, max_pfn, NULL);
+ arr, max_pfn, NULL, 0, NULL);
DPRINTF("#Flush\n");
for ( i = 0; i < 40; i++ ) {
usleep(50000);
now = llgettimeofday();
xc_shadow_control(xc_handle, domid, DOM0_SHADOW_CONTROL_OP_PEEK,
- NULL, 0, &stats);
-
- DPRINTF("now= %lld faults= %" PRId32 " dirty= %" PRId32
- " dirty_net= %" PRId32 " dirty_block= %" PRId32"\n",
+ NULL, 0, NULL, 0, &stats);
+
+ DPRINTF("now= %lld faults= %"PRId32" dirty= %"PRId32"\n",
((now-start)+500)/1000,
- stats.fault_count, stats.dirty_count,
- stats.dirty_net_count, stats.dirty_block_count);
+ stats.fault_count, stats.dirty_count);
}
}
@@ -727,7 +725,7 @@ int xc_linux_save(int xc_handle, int io_
if (xc_shadow_control(xc_handle, dom,
DOM0_SHADOW_CONTROL_OP_ENABLE_LOGDIRTY,
- NULL, 0, NULL ) < 0) {
+ NULL, 0, NULL, 0, NULL) < 0) {
ERR("Couldn't enable shadow mode");
goto out;
}
@@ -879,7 +877,7 @@ int xc_linux_save(int xc_handle, int io_
but this is fast enough for the moment. */
if (!last_iter && xc_shadow_control(
xc_handle, dom, DOM0_SHADOW_CONTROL_OP_PEEK,
- to_skip, max_pfn, NULL) != max_pfn) {
+ to_skip, max_pfn, NULL, 0, NULL) != max_pfn) {
ERR("Error peeking shadow bitmap");
goto out;
}
@@ -1084,8 +1082,9 @@ int xc_linux_save(int xc_handle, int io_
(unsigned long)ctxt.user_regs.edx);
}
- if (xc_shadow_control(xc_handle, dom, DOM0_SHADOW_CONTROL_OP_CLEAN,
- to_send, max_pfn, &stats ) != max_pfn) {
+ if (xc_shadow_control(xc_handle, dom,
+ DOM0_SHADOW_CONTROL_OP_CLEAN, to_send,
+ max_pfn, NULL, 0, &stats) != max_pfn) {
ERR("Error flushing shadow PT");
goto out;
}
@@ -1174,8 +1173,9 @@ int xc_linux_save(int xc_handle, int io_
out:
if (live) {
- if(xc_shadow_control(xc_handle, dom, DOM0_SHADOW_CONTROL_OP_OFF,
- NULL, 0, NULL ) < 0) {
+ if(xc_shadow_control(xc_handle, dom,
+ DOM0_SHADOW_CONTROL_OP_OFF,
+ NULL, 0, NULL, 0, NULL) < 0) {
DPRINTF("Warning - couldn't disable shadow mode");
}
}
diff -r 91169603a8e8 -r 79afceca9065 tools/libxc/xenctrl.h
--- a/tools/libxc/xenctrl.h Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/libxc/xenctrl.h Wed Aug 23 11:11:27 2006 -0600
@@ -323,6 +323,8 @@ int xc_shadow_control(int xc_handle,
unsigned int sop,
unsigned long *dirty_bitmap,
unsigned long pages,
+ unsigned long *mb,
+ uint32_t mode,
xc_shadow_control_stats_t *stats);
int xc_bvtsched_global_set(int xc_handle,
@@ -367,8 +369,6 @@ int xc_sched_credit_domain_get(int xc_ha
uint32_t domid,
struct sched_credit_adjdom *sdom);
-typedef evtchn_status_t xc_evtchn_status_t;
-
/*
* EVENT CHANNEL FUNCTIONS
*/
@@ -386,11 +386,6 @@ int xc_evtchn_alloc_unbound(int xc_handl
int xc_evtchn_alloc_unbound(int xc_handle,
uint32_t dom,
uint32_t remote_dom);
-
-int xc_evtchn_status(int xc_handle,
- uint32_t dom, /* may be DOMID_SELF */
- evtchn_port_t port,
- xc_evtchn_status_t *status);
int xc_physdev_pci_access_modify(int xc_handle,
uint32_t domid,
diff -r 91169603a8e8 -r 79afceca9065 tools/misc/xc_shadow.c
--- a/tools/misc/xc_shadow.c Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/misc/xc_shadow.c Wed Aug 23 11:11:27 2006 -0600
@@ -60,6 +60,8 @@ int main(int argc, char *argv[])
mode,
NULL,
0,
+ NULL,
+ 0,
NULL) < 0 )
{
fprintf(stderr, "Error reseting performance counters: %d (%s)\n",
diff -r 91169603a8e8 -r 79afceca9065 tools/python/xen/lowlevel/xc/xc.c
--- a/tools/python/xen/lowlevel/xc/xc.c Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/python/xen/lowlevel/xc/xc.c Wed Aug 23 11:11:27 2006 -0600
@@ -165,8 +165,8 @@ static PyObject *pyxc_vcpu_setaffinity(X
}
static PyObject *pyxc_domain_setcpuweight(XcObject *self,
- PyObject *args,
- PyObject *kwds)
+ PyObject *args,
+ PyObject *kwds)
{
uint32_t dom;
float cpuweight = 1;
@@ -334,29 +334,29 @@ static PyObject *pyxc_linux_build(XcObje
static char *kwd_list[] = { "dom", "store_evtchn",
"console_evtchn", "image",
- /* optional */
- "ramdisk", "cmdline", "flags",
- "features", NULL };
+ /* optional */
+ "ramdisk", "cmdline", "flags",
+ "features", NULL };
if ( !PyArg_ParseTupleAndKeywords(args, kwds, "iiis|ssis", kwd_list,
&dom, &store_evtchn,
- &console_evtchn, &image,
- /* optional */
- &ramdisk, &cmdline, &flags,
- &features) )
+ &console_evtchn, &image,
+ /* optional */
+ &ramdisk, &cmdline, &flags,
+ &features) )
return NULL;
if ( xc_linux_build(self->xc_handle, dom, image,
ramdisk, cmdline, features, flags,
store_evtchn, &store_mfn,
- console_evtchn, &console_mfn) != 0 ) {
+ console_evtchn, &console_mfn) != 0 ) {
if (!errno)
errno = EINVAL;
return PyErr_SetFromErrno(xc_error);
}
return Py_BuildValue("{s:i,s:i}",
- "store_mfn", store_mfn,
- "console_mfn", console_mfn);
+ "store_mfn", store_mfn,
+ "console_mfn", console_mfn);
}
static PyObject *pyxc_hvm_build(XcObject *self,
@@ -373,16 +373,16 @@ static PyObject *pyxc_hvm_build(XcObject
int apic = 0;
unsigned long store_mfn = 0;
- static char *kwd_list[] = { "dom", "store_evtchn",
- "memsize", "image", "vcpus", "pae", "acpi",
"apic",
- NULL };
+ static char *kwd_list[] = { "dom", "store_evtchn", "memsize", "image",
+ "vcpus", "pae", "acpi", "apic",
+ NULL };
if ( !PyArg_ParseTupleAndKeywords(args, kwds, "iiisiiii", kwd_list,
&dom, &store_evtchn, &memsize,
&image, &vcpus, &pae, &acpi, &apic) )
return NULL;
if ( xc_hvm_build(self->xc_handle, dom, memsize, image,
- vcpus, pae, acpi, apic, store_evtchn, &store_mfn) != 0 )
+ vcpus, pae, acpi, apic, store_evtchn, &store_mfn) != 0 )
return PyErr_SetFromErrno(xc_error);
return Py_BuildValue("{s:i}", "store_mfn", store_mfn);
@@ -484,60 +484,6 @@ static PyObject *pyxc_evtchn_alloc_unbou
return PyInt_FromLong(port);
}
-static PyObject *pyxc_evtchn_status(XcObject *self,
- PyObject *args,
- PyObject *kwds)
-{
- PyObject *dict;
-
- uint32_t dom = DOMID_SELF;
- int port, ret;
- xc_evtchn_status_t status;
-
- static char *kwd_list[] = { "port", "dom", NULL };
-
- if ( !PyArg_ParseTupleAndKeywords(args, kwds, "i|i", kwd_list,
- &port, &dom) )
- return NULL;
-
- ret = xc_evtchn_status(self->xc_handle, dom, port, &status);
- if ( ret != 0 )
- return PyErr_SetFromErrno(xc_error);
-
- switch ( status.status )
- {
- case EVTCHNSTAT_closed:
- dict = Py_BuildValue("{s:s}",
- "status", "closed");
- break;
- case EVTCHNSTAT_unbound:
- dict = Py_BuildValue("{s:s}",
- "status", "unbound");
- break;
- case EVTCHNSTAT_interdomain:
- dict = Py_BuildValue("{s:s,s:i,s:i}",
- "status", "interdomain",
- "dom", status.u.interdomain.dom,
- "port", status.u.interdomain.port);
- break;
- case EVTCHNSTAT_pirq:
- dict = Py_BuildValue("{s:s,s:i}",
- "status", "pirq",
- "irq", status.u.pirq);
- break;
- case EVTCHNSTAT_virq:
- dict = Py_BuildValue("{s:s,s:i}",
- "status", "virq",
- "irq", status.u.virq);
- break;
- default:
- dict = Py_BuildValue("{}");
- break;
- }
-
- return dict;
-}
-
static PyObject *pyxc_physdev_pci_access_modify(XcObject *self,
PyObject *args,
PyObject *kwds)
@@ -613,7 +559,7 @@ static PyObject *pyxc_physinfo(XcObject
{
p+=sprintf(p,"%08x:",info.hw_cap[i]);
if(info.hw_cap[i])
- q=p;
+ q=p;
}
if(q>cpu_cap)
*(q-1)=0;
@@ -718,9 +664,62 @@ static PyObject *pyxc_sedf_domain_get(Xc
"domain", domid,
"period", period,
"slice", slice,
- "latency", latency,
- "extratime", extratime,
+ "latency", latency,
+ "extratime", extratime,
"weight", weight);
+}
+
+static PyObject *pyxc_shadow_control(PyObject *self,
+ PyObject *args,
+ PyObject *kwds)
+{
+ XcObject *xc = (XcObject *)self;
+
+ uint32_t dom;
+ int op=0;
+
+ static char *kwd_list[] = { "dom", "op", NULL };
+
+ if ( !PyArg_ParseTupleAndKeywords(args, kwds, "i|i", kwd_list,
+ &dom, &op) )
+ return NULL;
+
+ if ( xc_shadow_control(xc->xc_handle, dom, op, NULL, 0, NULL, 0, NULL)
+ < 0 )
+ return PyErr_SetFromErrno(xc_error);
+
+ Py_INCREF(zero);
+ return zero;
+}
+
+static PyObject *pyxc_shadow_mem_control(PyObject *self,
+ PyObject *args,
+ PyObject *kwds)
+{
+ XcObject *xc = (XcObject *)self;
+ int op;
+ uint32_t dom;
+ int mbarg = -1;
+ unsigned long mb;
+
+ static char *kwd_list[] = { "dom", "mb", NULL };
+
+ if ( !PyArg_ParseTupleAndKeywords(args, kwds, "i|i", kwd_list,
+ &dom, &mbarg) )
+ return NULL;
+
+ if ( mbarg < 0 )
+ op = DOM0_SHADOW_CONTROL_OP_GET_ALLOCATION;
+ else
+ {
+ mb = mbarg;
+ op = DOM0_SHADOW_CONTROL_OP_SET_ALLOCATION;
+ }
+ if ( xc_shadow_control(xc->xc_handle, dom, op, NULL, 0, &mb, 0, NULL) < 0 )
+ return PyErr_SetFromErrno(xc_error);
+
+ mbarg = mb;
+ return Py_BuildValue("i", mbarg);
}
static PyObject *pyxc_sched_credit_domain_set(XcObject *self,
@@ -782,8 +781,8 @@ static PyObject *pyxc_domain_setmaxmem(X
}
static PyObject *pyxc_domain_memory_increase_reservation(XcObject *self,
- PyObject *args,
- PyObject *kwds)
+ PyObject *args,
+ PyObject *kwds)
{
uint32_t dom;
unsigned long mem_kb;
@@ -800,8 +799,8 @@ static PyObject *pyxc_domain_memory_incr
know what they are doing */
nr_extents = (mem_kb / (XC_PAGE_SIZE/1024)) >> extent_order;
if ( xc_domain_memory_increase_reservation(self->xc_handle, dom,
- nr_extents, extent_order,
- address_bits, NULL) )
+ nr_extents, extent_order,
+ address_bits, NULL) )
return PyErr_SetFromErrno(xc_error);
Py_INCREF(zero);
@@ -1141,21 +1140,6 @@ static PyMethodDef pyxc_methods[] = {
" remote_dom [int]: Remote domain to accept connections from.\n\n"
"Returns: [int] Unbound event-channel port.\n" },
- { "evtchn_status",
- (PyCFunction)pyxc_evtchn_status,
- METH_VARARGS | METH_KEYWORDS, "\n"
- "Query the status of an event channel.\n"
- " dom [int, SELF]: Dom-id of one endpoint of the channel.\n"
- " port [int]: Port-id of one endpoint of the channel.\n\n"
- "Returns: [dict] dictionary is empty on failure.\n"
- " status [str]: 'closed', 'unbound', 'interdomain', 'pirq',"
- " or 'virq'.\n"
- "The following are returned if 'status' is 'interdomain':\n"
- " dom [int]: Dom-id of remote endpoint.\n"
- " port [int]: Port-id of remote endpoint.\n"
- "The following are returned if 'status' is 'pirq' or 'virq':\n"
- " irq [int]: IRQ number.\n" },
-
{ "physdev_pci_access_modify",
(PyCFunction)pyxc_physdev_pci_access_modify,
METH_VARARGS | METH_KEYWORDS, "\n"
@@ -1187,6 +1171,22 @@ static PyMethodDef pyxc_methods[] = {
"Get information about the Xen host\n"
"Returns [dict]: information about Xen"
" [None]: on failure.\n" },
+
+ { "shadow_control",
+ (PyCFunction)pyxc_shadow_control,
+ METH_VARARGS | METH_KEYWORDS, "\n"
+ "Set parameter for shadow pagetable interface\n"
+ " dom [int]: Identifier of domain.\n"
+ " op [int, 0]: operation\n\n"
+ "Returns: [int] 0 on success; -1 on error.\n" },
+
+ { "shadow_mem_control",
+ (PyCFunction)pyxc_shadow_mem_control,
+ METH_VARARGS | METH_KEYWORDS, "\n"
+ "Set or read shadow pagetable memory use\n"
+ " dom [int]: Identifier of domain.\n"
+ " mb [int, -1]: MB of shadow memory this domain should have.\n\n"
+ "Returns: [int] MB of shadow memory in use by this domain.\n" },
{ "domain_setmaxmem",
(PyCFunction)pyxc_domain_setmaxmem,
diff -r 91169603a8e8 -r 79afceca9065 tools/python/xen/util/xmlrpclib2.py
--- a/tools/python/xen/util/xmlrpclib2.py Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/python/xen/util/xmlrpclib2.py Wed Aug 23 11:11:27 2006 -0600
@@ -22,6 +22,7 @@ An enhanced XML-RPC client/server interf
import string
import types
+import fcntl
from httplib import HTTPConnection, HTTP
from xmlrpclib import Transport
@@ -136,6 +137,17 @@ class TCPXMLRPCServer(SocketServer.Threa
logRequests=1):
SimpleXMLRPCServer.__init__(self, addr, requestHandler, logRequests)
+ flags = fcntl.fcntl(self.fileno(), fcntl.F_GETFD)
+ flags |= fcntl.FD_CLOEXEC
+ fcntl.fcntl(self.fileno(), fcntl.F_SETFD, flags)
+
+ def get_request(self):
+ (client, addr) = SimpleXMLRPCServer.get_request(self)
+ flags = fcntl.fcntl(client.fileno(), fcntl.F_GETFD)
+ flags |= fcntl.FD_CLOEXEC
+ fcntl.fcntl(client.fileno(), fcntl.F_SETFD, flags)
+ return (client, addr)
+
def _marshaled_dispatch(self, data, dispatch_method = None):
params, method = xmlrpclib.loads(data)
if False:
diff -r 91169603a8e8 -r 79afceca9065 tools/python/xen/web/httpserver.py
--- a/tools/python/xen/web/httpserver.py Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/python/xen/web/httpserver.py Wed Aug 23 11:11:27 2006 -0600
@@ -24,6 +24,7 @@ from urllib import quote, unquote
from urllib import quote, unquote
import os
import os.path
+import fcntl
from xen.xend import sxp
from xen.xend.Args import ArgError
@@ -294,6 +295,9 @@ class HttpServer:
def bind(self):
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ flags = fcntl.fcntl(self.socket.fileno(), fcntl.F_GETFD)
+ flags |= fcntl.FD_CLOEXEC
+ fcntl.fcntl(self.socket.fileno(), fcntl.F_SETFD, flags)
self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.socket.bind((self.interface, self.port))
@@ -338,3 +342,6 @@ class UnixHttpServer(HttpServer):
def bind(self):
self.socket = unix.bind(self.path)
+ flags = fcntl.fcntl(self.socket.fileno(), fcntl.F_GETFD)
+ flags |= fcntl.FD_CLOEXEC
+ fcntl.fcntl(self.socket.fileno(), fcntl.F_SETFD, flags)
diff -r 91169603a8e8 -r 79afceca9065 tools/python/xen/xend/XendCheckpoint.py
--- a/tools/python/xen/xend/XendCheckpoint.py Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/python/xen/xend/XendCheckpoint.py Wed Aug 23 11:11:27 2006 -0600
@@ -78,7 +78,7 @@ def save(fd, dominfo, network, live, dst
# enabled. Passing "0" simply uses the defaults compiled into
# libxenguest; see the comments and/or code in xc_linux_save() for
# more information.
- cmd = [xen.util.auxbin.pathTo(XC_SAVE), str(xc.handle()), str(fd),
+ cmd = [xen.util.auxbin.pathTo(XC_SAVE), str(fd),
str(dominfo.getDomid()), "0", "0", str(int(live)) ]
log.debug("[xc_save]: %s", string.join(cmd))
@@ -150,7 +150,7 @@ def restore(xd, fd):
balloon.free(xc.pages_to_kib(nr_pfns))
cmd = map(str, [xen.util.auxbin.pathTo(XC_RESTORE),
- xc.handle(), fd, dominfo.getDomid(), nr_pfns,
+ fd, dominfo.getDomid(), nr_pfns,
store_port, console_port])
log.debug("[xc_restore]: %s", string.join(cmd))
diff -r 91169603a8e8 -r 79afceca9065 tools/python/xen/xend/XendDomain.py
--- a/tools/python/xen/xend/XendDomain.py Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/python/xen/xend/XendDomain.py Wed Aug 23 11:11:27 2006 -0600
@@ -532,6 +532,30 @@ class XendDomain:
except Exception, ex:
raise XendError(str(ex))
+ def domain_shadow_control(self, domid, op):
+ """Shadow page control."""
+ dominfo = self.domain_lookup(domid)
+ try:
+ return xc.shadow_control(dominfo.getDomid(), op)
+ except Exception, ex:
+ raise XendError(str(ex))
+
+ def domain_shadow_mem_get(self, domid):
+ """Get shadow pagetable memory allocation."""
+ dominfo = self.domain_lookup(domid)
+ try:
+ return xc.shadow_mem_control(dominfo.getDomid())
+ except Exception, ex:
+ raise XendError(str(ex))
+
+ def domain_shadow_mem_set(self, domid, mb):
+ """Set shadow pagetable memory allocation."""
+ dominfo = self.domain_lookup(domid)
+ try:
+ return xc.shadow_mem_control(dominfo.getDomid(), mb=mb)
+ except Exception, ex:
+ raise XendError(str(ex))
+
def domain_sched_credit_get(self, domid):
"""Get credit scheduler parameters for a domain.
"""
diff -r 91169603a8e8 -r 79afceca9065 tools/python/xen/xend/XendDomainInfo.py
--- a/tools/python/xen/xend/XendDomainInfo.py Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/python/xen/xend/XendDomainInfo.py Wed Aug 23 11:11:27 2006 -0600
@@ -30,6 +30,7 @@ import time
import time
import threading
import os
+import math
import xen.lowlevel.xc
from xen.util import asserts
@@ -126,16 +127,17 @@ VM_CONFIG_PARAMS = [
# don't come out of xc in the same form as they are specified in the config
# file, so those are handled separately.
ROUNDTRIPPING_CONFIG_ENTRIES = [
- ('uuid', str),
- ('vcpus', int),
- ('vcpu_avail', int),
- ('cpu_weight', float),
- ('memory', int),
- ('maxmem', int),
- ('bootloader', str),
+ ('uuid', str),
+ ('vcpus', int),
+ ('vcpu_avail', int),
+ ('cpu_weight', float),
+ ('memory', int),
+ ('shadow_memory', int),
+ ('maxmem', int),
+ ('bootloader', str),
('bootloader_args', str),
- ('features', str),
- ('localtime', int),
+ ('features', str),
+ ('localtime', int),
]
ROUNDTRIPPING_CONFIG_ENTRIES += VM_CONFIG_PARAMS
@@ -146,12 +148,13 @@ ROUNDTRIPPING_CONFIG_ENTRIES += VM_CONFI
# entries written to the store that cannot be reconfigured on-the-fly.
#
VM_STORE_ENTRIES = [
- ('uuid', str),
- ('vcpus', int),
- ('vcpu_avail', int),
- ('memory', int),
- ('maxmem', int),
- ('start_time', float),
+ ('uuid', str),
+ ('vcpus', int),
+ ('vcpu_avail', int),
+ ('memory', int),
+ ('shadow_memory', int),
+ ('maxmem', int),
+ ('start_time', float),
]
VM_STORE_ENTRIES += VM_CONFIG_PARAMS
@@ -572,6 +575,7 @@ class XendDomainInfo:
defaultInfo('vcpu_avail', lambda: (1 << self.info['vcpus']) - 1)
defaultInfo('memory', lambda: 0)
+ defaultInfo('shadow_memory', lambda: 0)
defaultInfo('maxmem', lambda: 0)
defaultInfo('bootloader', lambda: None)
defaultInfo('bootloader_args', lambda: None)
@@ -1272,18 +1276,26 @@ class XendDomainInfo:
# repin domain vcpus if a restricted cpus list is provided
# this is done prior to memory allocation to aide in memory
# distribution for NUMA systems.
- cpus = self.info['cpus']
- if cpus is not None and len(cpus) > 0:
+ if self.info['cpus'] is not None and len(self.info['cpus']) > 0:
for v in range(0, self.info['max_vcpu_id']+1):
- # pincpu takes a list of ints
- cpu = [ int( cpus[v % len(cpus)] ) ]
- xc.vcpu_setaffinity(self.domid, v, cpu)
+ xc.vcpu_setaffinity(self.domid, v, self.info['cpus'])
# set domain maxmem in KiB
xc.domain_setmaxmem(self.domid, self.info['maxmem'] * 1024)
m = self.image.getDomainMemory(self.info['memory'] * 1024)
- balloon.free(m)
+
+ # get the domain's shadow memory requirement
+ sm = int(math.ceil(self.image.getDomainShadowMemory(m) / 1024.0))
+ if self.info['shadow_memory'] > sm:
+ sm = self.info['shadow_memory']
+
+ # Make sure there's enough RAM available for the domain
+ balloon.free(m + sm * 1024)
+
+ # Set up the shadow memory
+ sm = xc.shadow_mem_control(self.domid, mb=sm)
+ self.info['shadow_memory'] = sm
init_reservation = self.info['memory'] * 1024
if os.uname()[4] in ('ia64', 'ppc64'):
@@ -1530,13 +1542,12 @@ class XendDomainInfo:
return self.getDeviceController(dev_type).sxpr(devid)
- def device_configure(self, dev_config, devid):
+ def device_configure(self, dev_config):
"""Configure an existing device.
@param dev_config: device configuration
- @param devid: device id
"""
deviceClass = sxp.name(dev_config)
- self.reconfigureDevice(deviceClass, devid, dev_config)
+ self.reconfigureDevice(deviceClass, None, dev_config)
def pause(self):
diff -r 91169603a8e8 -r 79afceca9065 tools/python/xen/xend/XendLogging.py
--- a/tools/python/xen/xend/XendLogging.py Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/python/xen/xend/XendLogging.py Wed Aug 23 11:11:27 2006 -0600
@@ -21,6 +21,7 @@ import types
import types
import logging
import logging.handlers
+import fcntl
from xen.xend.server import params
@@ -49,6 +50,27 @@ DATE_FORMAT = "%Y-%m-%d %H:%M:%S"
logfilename = None
+class XendRotatingFileHandler(logging.handlers.RotatingFileHandler):
+
+ def __init__(self, fname, mode, maxBytes, backupCount):
+ logging.handlers.RotatingFileHandler.__init__(self, fname, mode,
maxBytes, backupCount)
+ self.setCloseOnExec()
+
+ def doRollover(self):
+ logging.handlers.RotatingFileHandler.doRollover(self)
+ self.setCloseOnExec()
+
+ # NB yes accessing 'self.stream' violates OO encapsulation somewhat,
+ # but python logging API gives no other way to access the file handle
+ # and the entire python logging stack is already full of OO encapsulation
+ # violations. The other alternative is copy-and-paste duplicating the
+ # entire FileHandler, StreamHandler & RotatingFileHandler classes which
+ # is even worse
+ def setCloseOnExec(self):
+ flags = fcntl.fcntl(self.stream.fileno(), fcntl.F_GETFD)
+ flags |= fcntl.FD_CLOEXEC
+ fcntl.fcntl(self.stream.fileno(), fcntl.F_SETFD, flags)
+
def init(filename, level):
"""Initialise logging. Logs to the given filename, and logs to stderr if
@@ -58,9 +80,9 @@ def init(filename, level):
global logfilename
def openFileHandler(fname):
- return logging.handlers.RotatingFileHandler(fname, mode = 'a',
- maxBytes = MAX_BYTES,
- backupCount = BACKUP_COUNT)
+ return XendRotatingFileHandler(fname, mode = 'a',
+ maxBytes = MAX_BYTES,
+ backupCount = BACKUP_COUNT)
# Rather unintuitively, getLevelName will get the number corresponding to
# a level name, as well as getting the name corresponding to a level
diff -r 91169603a8e8 -r 79afceca9065 tools/python/xen/xend/XendNode.py
--- a/tools/python/xen/xend/XendNode.py Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/python/xen/xend/XendNode.py Wed Aug 23 11:11:27 2006 -0600
@@ -46,7 +46,8 @@ class XendNode:
return self.xc.bvtsched_global_get()
def info(self):
- return self.nodeinfo() + self.physinfo() + self.xeninfo()
+ return (self.nodeinfo() + self.physinfo() + self.xeninfo() +
+ self.xendinfo())
def nodeinfo(self):
(sys, host, rel, ver, mch) = os.uname()
@@ -100,6 +101,9 @@ class XendNode:
return [[k, info[k]] for k in ITEM_ORDER]
+ def xendinfo(self):
+ return [['xend_config_format', 2]]
+
def instance():
global inst
diff -r 91169603a8e8 -r 79afceca9065 tools/python/xen/xend/image.py
--- a/tools/python/xen/xend/image.py Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/python/xen/xend/image.py Wed Aug 23 11:11:27 2006 -0600
@@ -153,6 +153,12 @@ class ImageHandler:
mem_kb += 4*1024;
return mem_kb
+ def getDomainShadowMemory(self, mem_kb):
+ """@return The minimum shadow memory required, in KiB, for a domain
+ with mem_kb KiB of RAM."""
+ # PV domains don't need any shadow memory
+ return 0
+
def buildDomain(self):
"""Build the domain. Define in subclass."""
raise NotImplementedError()
@@ -251,7 +257,7 @@ class HVMImageHandler(ImageHandler):
def parseDeviceModelArgs(self, imageConfig, deviceConfig):
dmargs = [ 'boot', 'fda', 'fdb', 'soundhw',
'localtime', 'serial', 'stdvga', 'isa', 'vcpus',
- 'acpi', 'usb', 'usbdevice']
+ 'acpi', 'usb', 'usbdevice']
ret = []
for a in dmargs:
v = sxp.child_value(imageConfig, a)
@@ -305,9 +311,6 @@ class HVMImageHandler(ImageHandler):
def configVNC(self, config):
# Handle graphics library related options
vnc = sxp.child_value(config, 'vnc')
- vncdisplay = sxp.child_value(config, 'vncdisplay',
- int(self.vm.getDomid()))
- vncunused = sxp.child_value(config, 'vncunused')
sdl = sxp.child_value(config, 'sdl')
ret = []
nographic = sxp.child_value(config, 'nographic')
@@ -315,9 +318,12 @@ class HVMImageHandler(ImageHandler):
ret.append('-nographic')
return ret
if vnc:
+ vncdisplay = sxp.child_value(config, 'vncdisplay',
+ int(self.vm.getDomid()))
ret = ret + ['-vnc', '%d' % vncdisplay, '-k', 'en-us']
- if vncunused:
- ret += ['-vncunused']
+ vncunused = sxp.child_value(config, 'vncunused')
+ if vncunused:
+ ret += ['-vncunused']
return ret
def createDeviceModel(self):
@@ -364,6 +370,17 @@ class HVMImageHandler(ImageHandler):
extra_pages = int( math.ceil( extra_mb*1024 / page_kb ))
return mem_kb + extra_pages * page_kb
+ def getDomainShadowMemory(self, mem_kb):
+ """@return The minimum shadow memory required, in KiB, for a domain
+ with mem_kb KiB of RAM."""
+ if os.uname()[4] in ('ia64', 'ppc64'):
+ # Explicit shadow memory is not a concept
+ return 0
+ else:
+ # 1MB per vcpu plus 4Kib/Mib of RAM. This is higher than
+ # the minimum that Xen would allocate if no value were given.
+ return 1024 * self.vm.getVCpuCount() + mem_kb / 256
+
def register_shutdown_watch(self):
""" add xen store watch on control/shutdown """
self.shutdownWatch = xswatch(self.vm.dompath + "/control/shutdown", \
diff -r 91169603a8e8 -r 79afceca9065
tools/python/xen/xend/server/DevController.py
--- a/tools/python/xen/xend/server/DevController.py Tue Aug 22 14:45:49
2006 -0600
+++ b/tools/python/xen/xend/server/DevController.py Wed Aug 23 11:11:27
2006 -0600
@@ -206,15 +206,9 @@ class DevController:
"""
devid = int(devid)
-
- frontpath = self.frontendPath(devid)
- backpath = xstransact.Read(frontpath, "backend")
-
- if backpath:
- xstransact.Write(backpath, 'state', str(xenbusState['Closing']))
- else:
- raise VmError("Device %s not connected" % devid)
-
+
+ self.writeBackend(devid, 'state', str(xenbusState['Closing']))
+
def configurations(self):
return map(self.configuration, self.deviceIDs())
@@ -355,6 +349,16 @@ class DevController:
return map(int, xstransact.List(fe))
+ def writeBackend(self, devid, *args):
+ frontpath = self.frontendPath(devid)
+ backpath = xstransact.Read(frontpath, "backend")
+
+ if backpath:
+ xstransact.Write(backpath, *args)
+ else:
+ raise VmError("Device %s not connected" % devid)
+
+
## private:
def addStoreEntries(self, config, devid, backDetails, frontDetails):
diff -r 91169603a8e8 -r 79afceca9065
tools/python/xen/xend/server/XMLRPCServer.py
--- a/tools/python/xen/xend/server/XMLRPCServer.py Tue Aug 22 14:45:49
2006 -0600
+++ b/tools/python/xen/xend/server/XMLRPCServer.py Wed Aug 23 11:11:27
2006 -0600
@@ -24,6 +24,7 @@ from xen.util.xmlrpclib2 import UnixXMLR
from xen.xend.XendClient import XML_RPC_SOCKET, ERROR_INVALID_DOMAIN
from xen.xend.XendError import *
+from xen.xend.XendLogging import log
from types import ListType
def lookup(domid):
@@ -74,7 +75,8 @@ def get_log():
finally:
f.close()
-methods = ['device_create', 'destroyDevice', 'getDeviceSxprs',
+methods = ['device_create', 'device_configure', 'destroyDevice',
+ 'getDeviceSxprs',
'setMemoryTarget', 'setName', 'setVCpuCount', 'shutdown',
'send_sysrq', 'getVCPUInfo', 'waitForDevices']
diff -r 91169603a8e8 -r 79afceca9065 tools/python/xen/xend/server/blkif.py
--- a/tools/python/xen/xend/server/blkif.py Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/python/xen/xend/server/blkif.py Wed Aug 23 11:11:27 2006 -0600
@@ -13,7 +13,7 @@
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#============================================================================
# Copyright (C) 2004, 2005 Mike Wray <mike.wray@xxxxxx>
-# Copyright (C) 2005 XenSource Ltd
+# Copyright (C) 2005, 2006 XenSource Inc.
#============================================================================
@@ -76,6 +76,23 @@ class BlkifController(DevController):
return (devid, back, front)
+ def reconfigureDevice(self, _, config):
+ """@see DevController.reconfigureDevice"""
+ (devid, new_back, new_front) = self.getDeviceDetails(config)
+
+ (dev, mode) = self.readBackend(devid, 'dev', 'mode')
+ dev_type = self.readFrontend(devid, 'device-type')
+
+ if (dev_type == 'cdrom' and new_front['device-type'] == 'cdrom' and
+ dev == new_back['dev'] and mode == 'r'):
+ self.writeBackend(devid,
+ 'type', new_back['type'],
+ 'params', new_back['params'])
+ else:
+ raise VmError('Refusing to reconfigure device %s:%d to %s' %
+ (self.deviceClass, devid, config))
+
+
def configuration(self, devid):
"""@see DevController.configuration"""
diff -r 91169603a8e8 -r 79afceca9065 tools/python/xen/xm/create.py
--- a/tools/python/xen/xm/create.py Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/python/xen/xm/create.py Wed Aug 23 11:11:27 2006 -0600
@@ -157,6 +157,10 @@ gopts.var('maxmem', val='MEMORY',
gopts.var('maxmem', val='MEMORY',
fn=set_int, default=None,
use="Maximum domain memory in MB.")
+
+gopts.var('shadow_memory', val='MEMORY',
+ fn=set_int, default=0,
+ use="Domain shadow memory in MB.")
gopts.var('cpu', val='CPU',
fn=set_int, default=None,
@@ -666,8 +670,9 @@ def make_config(vals):
if v:
config.append([n, v])
- map(add_conf, ['name', 'memory', 'maxmem', 'restart', 'on_poweroff',
- 'on_reboot', 'on_crash', 'vcpus', 'features'])
+ map(add_conf, ['name', 'memory', 'maxmem', 'shadow_memory',
+ 'restart', 'on_poweroff', 'on_reboot', 'on_crash',
+ 'vcpus', 'features'])
if vals.uuid is not None:
config.append(['uuid', vals.uuid])
diff -r 91169603a8e8 -r 79afceca9065 tools/python/xen/xm/main.py
--- a/tools/python/xen/xm/main.py Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/python/xen/xm/main.py Wed Aug 23 11:11:27 2006 -0600
@@ -31,6 +31,7 @@ warnings.filterwarnings('ignore', catego
warnings.filterwarnings('ignore', category=FutureWarning)
import xmlrpclib
import traceback
+import datetime
import xen.xend.XendProtocol
@@ -70,6 +71,7 @@ shutdown_help ="shutdown <DomId> [-w][-a
shutdown_help ="shutdown <DomId> [-w][-a][-R|-H] Shutdown a domain"
top_help = "top Monitor system and domains in
real-time"
unpause_help = "unpause <DomId> Unpause a paused domain"
+uptime_help = "uptime [-s|--short] [DomId, ...] List uptime for domains"
help_spacer = """
"""
@@ -111,6 +113,8 @@ block_detach_help = """block-detach <Do
or the device name as mounted in the
guest"""
block_list_help = "block-list <DomId> [--long] List virtual block devices
for a domain"
+block_configure_help = """block-configure <DomId> <BackDev> <FrontDev> <Mode>
+ [BackDomId] Change block device configuration"""
network_attach_help = """network-attach <DomID> [script=<script>] [ip=<ip>]
[mac=<mac>]
[bridge=<bridge>] [backend=<backDomID>]
Create a new virtual network device """
@@ -149,6 +153,7 @@ short_command_list = [
"shutdown",
"top",
"unpause",
+ "uptime",
"vcpu-set",
]
@@ -172,6 +177,7 @@ domain_commands = [
"sysrq",
"top",
"unpause",
+ "uptime",
"vcpu-list",
"vcpu-pin",
"vcpu-set",
@@ -195,6 +201,7 @@ device_commands = [
"block-attach",
"block-detach",
"block-list",
+ "block-configure",
"network-attach",
"network-detach",
"network-list",
@@ -412,6 +419,7 @@ def parse_doms_info(info):
'vcpus' : get_info('online_vcpus', int, 0),
'state' : get_info('state', str, '??'),
'cpu_time' : get_info('cpu_time', float, 0),
+ 'up_time' : get_info('up_time', float, -1),
'seclabel' : security.get_security_printlabel(info),
}
@@ -818,6 +826,59 @@ def xm_console(args):
domid = int(sxp.child_value(info, 'domid', '-1'))
console.execConsole(domid)
+def xm_uptime(args):
+ short_mode = 0
+
+ try:
+ (options, params) = getopt.gnu_getopt(args, 's', ['short'])
+ except getopt.GetoptError, opterr:
+ err(opterr)
+ sys.exit(1)
+
+ for (k, v) in options:
+ if k in ['-s', '--short']:
+ short_mode = 1
+
+ doms = getDomains(params)
+
+ if short_mode == 0:
+ print 'Name ID Uptime'
+
+ for dom in doms:
+ d = parse_doms_info(dom)
+ if d['dom'] > 0:
+ uptime = int(round(d['up_time']))
+ else:
+ f=open('/proc/uptime', 'r')
+ upfile = f.read()
+ uptime = int(round(float(upfile.split(' ')[0])))
+ f.close()
+
+ days = int(uptime / 86400)
+ uptime -= (days * 86400)
+ hours = int(uptime / 3600)
+ uptime -= (hours * 3600)
+ minutes = int(uptime / 60)
+ uptime -= (minutes * 60)
+ seconds = uptime
+
+ upstring = ""
+ if days > 0:
+ upstring += str(days) + " day"
+ if days > 1:
+ upstring += "s"
+ upstring += ", "
+ upstring += '%(hours)2d:%(minutes)02d' % vars()
+
+ if short_mode:
+ now = datetime.datetime.now()
+ upstring = now.strftime(" %H:%M:%S") + " up " + upstring
+ upstring += ", " + d['name'] + " (" + str(d['dom']) + ")"
+ else:
+ upstring += ':%(seconds)02d' % vars()
+ upstring = ("%(name)-32s %(dom)3d " % d) + upstring
+
+ print upstring
def xm_top(args):
arg_check(args, "top", 0)
@@ -997,9 +1058,8 @@ def xm_vtpm_list(args):
"%(be-path)-30s "
% ni)
-def xm_block_attach(args):
- arg_check(args, 'block-attach', 4, 5)
-
+
+def parse_block_configuration(args):
dom = args[0]
if args[1].startswith('tap:'):
@@ -1029,7 +1089,21 @@ def xm_block_attach(args):
traceback.print_exc(limit=1)
sys.exit(1)
+ return (dom, vbd)
+
+
+def xm_block_attach(args):
+ arg_check(args, 'block-attach', 4, 5)
+
+ (dom, vbd) = parse_block_configuration(args)
server.xend.domain.device_create(dom, vbd)
+
+
+def xm_block_configure(args):
+ arg_check(args, 'block-configure', 4, 5)
+
+ (dom, vbd) = parse_block_configuration(args)
+ server.xend.domain.device_configure(dom, vbd)
def xm_network_attach(args):
@@ -1117,6 +1191,7 @@ commands = {
"save": xm_save,
"reboot": xm_reboot,
"shutdown": xm_shutdown,
+ "uptime": xm_uptime,
"list": xm_list,
# memory commands
"mem-max": xm_mem_max,
@@ -1142,6 +1217,7 @@ commands = {
"block-attach": xm_block_attach,
"block-detach": xm_block_detach,
"block-list": xm_block_list,
+ "block-configure": xm_block_configure,
# network
"network-attach": xm_network_attach,
"network-detach": xm_network_detach,
diff -r 91169603a8e8 -r 79afceca9065 tools/xcutils/xc_restore.c
--- a/tools/xcutils/xc_restore.c Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/xcutils/xc_restore.c Wed Aug 23 11:11:27 2006 -0600
@@ -12,6 +12,7 @@
#include <stdint.h>
#include <stdio.h>
+#include <xenctrl.h>
#include <xenguest.h>
int
@@ -21,17 +22,20 @@ main(int argc, char **argv)
int ret;
unsigned long store_mfn, console_mfn;
- if (argc != 7)
+ if (argc != 6)
errx(1,
- "usage: %s xcfd iofd domid nr_pfns store_evtchn console_evtchn",
+ "usage: %s iofd domid nr_pfns store_evtchn console_evtchn",
argv[0]);
- xc_fd = atoi(argv[1]);
- io_fd = atoi(argv[2]);
- domid = atoi(argv[3]);
- nr_pfns = atoi(argv[4]);
- store_evtchn = atoi(argv[5]);
- console_evtchn = atoi(argv[6]);
+ xc_fd = xc_interface_open();
+ if (xc_fd < 0)
+ errx(1, "failed to open control interface");
+
+ io_fd = atoi(argv[1]);
+ domid = atoi(argv[2]);
+ nr_pfns = atoi(argv[3]);
+ store_evtchn = atoi(argv[4]);
+ console_evtchn = atoi(argv[5]);
ret = xc_linux_restore(xc_fd, io_fd, domid, nr_pfns, store_evtchn,
&store_mfn, console_evtchn, &console_mfn);
@@ -40,5 +44,8 @@ main(int argc, char **argv)
printf("console-mfn %li\n", console_mfn);
fflush(stdout);
}
+
+ xc_interface_close(xc_fd);
+
return ret;
}
diff -r 91169603a8e8 -r 79afceca9065 tools/xcutils/xc_save.c
--- a/tools/xcutils/xc_save.c Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/xcutils/xc_save.c Wed Aug 23 11:11:27 2006 -0600
@@ -13,8 +13,8 @@
#include <string.h>
#include <stdio.h>
+#include <xenctrl.h>
#include <xenguest.h>
-
/**
* Issue a suspend request through stdout, and receive the acknowledgement
@@ -36,16 +36,24 @@ main(int argc, char **argv)
main(int argc, char **argv)
{
unsigned int xc_fd, io_fd, domid, maxit, max_f, flags;
+ int ret;
- if (argc != 7)
- errx(1, "usage: %s xcfd iofd domid maxit maxf flags", argv[0]);
+ if (argc != 6)
+ errx(1, "usage: %s iofd domid maxit maxf flags", argv[0]);
- xc_fd = atoi(argv[1]);
- io_fd = atoi(argv[2]);
- domid = atoi(argv[3]);
- maxit = atoi(argv[4]);
- max_f = atoi(argv[5]);
- flags = atoi(argv[6]);
+ xc_fd = xc_interface_open();
+ if (xc_fd < 0)
+ errx(1, "failed to open control interface");
- return xc_linux_save(xc_fd, io_fd, domid, maxit, max_f, flags, &suspend);
+ io_fd = atoi(argv[1]);
+ domid = atoi(argv[2]);
+ maxit = atoi(argv[3]);
+ max_f = atoi(argv[4]);
+ flags = atoi(argv[5]);
+
+ ret = xc_linux_save(xc_fd, io_fd, domid, maxit, max_f, flags, &suspend);
+
+ xc_interface_close(xc_fd);
+
+ return ret;
}
diff -r 91169603a8e8 -r 79afceca9065 tools/xenmon/Makefile
--- a/tools/xenmon/Makefile Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/xenmon/Makefile Wed Aug 23 11:11:27 2006 -0600
@@ -25,7 +25,7 @@ CFLAGS += -I $(XEN_LIBXC)
CFLAGS += -I $(XEN_LIBXC)
LDFLAGS += -L $(XEN_LIBXC)
-BIN = setmask xenbaked
+BIN = xentrace_setmask xenbaked
SCRIPTS = xenmon.py
.PHONY: all
@@ -35,10 +35,10 @@ build: $(BIN)
build: $(BIN)
.PHONY: install
-install: xenbaked setmask
+install: build
[ -d $(DESTDIR)$(sbindir) ] || $(INSTALL_DIR) $(DESTDIR)$(sbindir)
$(INSTALL_PROG) xenbaked $(DESTDIR)$(sbindir)/xenbaked
- $(INSTALL_PROG) setmask $(DESTDIR)$(sbindir)/setmask
+ $(INSTALL_PROG) xentrace_setmask $(DESTDIR)$(sbindir)/xentrace_setmask
$(INSTALL_PROG) xenmon.py $(DESTDIR)$(sbindir)/xenmon.py
.PHONY: clean
@@ -48,5 +48,5 @@ clean:
%: %.c Makefile
$(CC) $(CFLAGS) $(LDFLAGS) -lxenctrl -o $@ $<
-
-
+xentrace_%: %.c Makefile
+ $(CC) $(CFLAGS) $(LDFLAGS) -lxenctrl -o $@ $<
diff -r 91169603a8e8 -r 79afceca9065 tools/xenmon/xenbaked.c
--- a/tools/xenmon/xenbaked.c Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/xenmon/xenbaked.c Wed Aug 23 11:11:27 2006 -0600
@@ -444,14 +444,11 @@ struct t_rec **init_rec_ptrs(struct t_bu
*/
unsigned int get_num_cpus(void)
{
- dom0_op_t op;
+ xc_physinfo_t physinfo;
int xc_handle = xc_interface_open();
int ret;
- op.cmd = DOM0_PHYSINFO;
- op.interface_version = DOM0_INTERFACE_VERSION;
-
- ret = xc_dom0_op(xc_handle, &op);
+ ret = xc_physinfo(xc_handle, &physinfo);
if ( ret != 0 )
{
@@ -460,12 +457,12 @@ unsigned int get_num_cpus(void)
}
xc_interface_close(xc_handle);
- opts.cpu_freq = (double)op.u.physinfo.cpu_khz/1000.0;
-
- return (op.u.physinfo.threads_per_core *
- op.u.physinfo.cores_per_socket *
- op.u.physinfo.sockets_per_node *
- op.u.physinfo.nr_nodes);
+ opts.cpu_freq = (double)physinfo.cpu_khz/1000.0;
+
+ return (physinfo.threads_per_core *
+ physinfo.cores_per_socket *
+ physinfo.sockets_per_node *
+ physinfo.nr_nodes);
}
diff -r 91169603a8e8 -r 79afceca9065 tools/xenstore/Makefile
--- a/tools/xenstore/Makefile Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/xenstore/Makefile Wed Aug 23 11:11:27 2006 -0600
@@ -98,7 +98,7 @@ libxenstore.so.$(MAJOR).$(MINOR): xs.opi
$(CC) $(CFLAGS) $(LDFLAGS) -Wl,-soname -Wl,libxenstore.so.$(MAJOR)
-shared -o $@ $^ -lpthread
libxenstore.a: xs.o xs_lib.o
- ar rcs libxenstore.a $^
+ $(AR) rcs libxenstore.a $^
.PHONY: clean
clean: testsuite-clean
diff -r 91169603a8e8 -r 79afceca9065 tools/xenstore/xs.c
--- a/tools/xenstore/xs.c Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/xenstore/xs.c Wed Aug 23 11:11:27 2006 -0600
@@ -101,23 +101,31 @@ static int get_socket(const char *connec
static int get_socket(const char *connect_to)
{
struct sockaddr_un addr;
- int sock, saved_errno;
+ int sock, saved_errno, flags;
sock = socket(PF_UNIX, SOCK_STREAM, 0);
if (sock < 0)
return -1;
+ if ((flags = fcntl(sock, F_GETFD)) < 0)
+ goto error;
+ flags |= FD_CLOEXEC;
+ if (fcntl(sock, F_SETFD, flags) < 0)
+ goto error;
+
addr.sun_family = AF_UNIX;
strcpy(addr.sun_path, connect_to);
- if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) != 0) {
- saved_errno = errno;
- close(sock);
- errno = saved_errno;
- return -1;
- }
+ if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) != 0)
+ goto error;
return sock;
+
+error:
+ saved_errno = errno;
+ close(sock);
+ errno = saved_errno;
+ return -1;
}
static int get_dev(const char *connect_to)
diff -r 91169603a8e8 -r 79afceca9065 tools/xentrace/Makefile
--- a/tools/xentrace/Makefile Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/xentrace/Makefile Wed Aug 23 11:11:27 2006 -0600
@@ -14,7 +14,7 @@ HDRS = $(wildcard *.h)
HDRS = $(wildcard *.h)
OBJS = $(patsubst %.c,%.o,$(wildcard *.c))
-BIN = xentrace setsize
+BIN = xentrace xentrace_setsize
LIBBIN =
SCRIPTS = xentrace_format
MAN1 = $(wildcard *.1)
@@ -58,3 +58,5 @@ clean:
%: %.c $(HDRS) Makefile
$(CC) $(CFLAGS) -o $@ $< -L$(XEN_LIBXC) -lxenctrl
+xentrace_%: %.c $(HDRS) Makefile
+ $(CC) $(CFLAGS) -o $@ $< -L$(XEN_LIBXC) -lxenctrl
diff -r 91169603a8e8 -r 79afceca9065 tools/xentrace/xentrace.c
--- a/tools/xentrace/xentrace.c Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/xentrace/xentrace.c Wed Aug 23 11:11:27 2006 -0600
@@ -55,6 +55,7 @@ typedef struct settings_st {
unsigned long new_data_thresh;
uint32_t evt_mask;
uint32_t cpu_mask;
+ unsigned long tbuf_size;
} settings_t;
settings_t opts;
@@ -111,7 +112,10 @@ static void get_tbufs(unsigned long *mfn
exit(EXIT_FAILURE);
}
- ret = xc_tbuf_enable(xc_handle, DEFAULT_TBUF_SIZE, mfn, size);
+ if(!opts.tbuf_size)
+ opts.tbuf_size = DEFAULT_TBUF_SIZE;
+
+ ret = xc_tbuf_enable(xc_handle, opts.tbuf_size, mfn, size);
if ( ret != 0 )
{
@@ -400,6 +404,15 @@ error_t cmd_parser(int key, char *arg, s
}
break;
+ case 'S': /* set tbuf size (given in pages) */
+ {
+ char *inval;
+ setup->tbuf_size = strtol(arg, &inval, 0);
+ if ( inval == arg )
+ argp_usage(state);
+ }
+ break;
+
case ARGP_KEY_ARG:
{
if ( state->arg_num == 0 )
@@ -438,6 +451,12 @@ const struct argp_option cmd_opts[] =
{ .name = "evt-mask", .key='e', .arg="e",
.doc =
"set evt-mask " },
+
+ { .name = "trace-buf-size", .key='S', .arg="N",
+ .doc =
+ "Set trace buffer size in pages (default " xstr(DEFAULT_TBUF_SIZE) "). "
+ "N.B. that the trace buffer cannot be resized. If it has "
+ "already been set this boot cycle, this argument will be ignored." },
{0}
};
diff -r 91169603a8e8 -r 79afceca9065 tools/xm-test/lib/XmTestLib/XenDevice.py
--- a/tools/xm-test/lib/XmTestLib/XenDevice.py Tue Aug 22 14:45:49 2006 -0600
+++ b/tools/xm-test/lib/XmTestLib/XenDevice.py Wed Aug 23 11:11:27 2006 -0600
@@ -265,6 +265,7 @@ class XenNetDevice(XenDevice):
self.ip = xmtest_netconf.getIP(self.domain.getName(), self.id)
self.addIfconfigCmd()
+ self.config["ip"] = str(self.ip)
# Setup an alias for Dom0
self.dom0_alias_ip = xmtest_netconf.getIP("domain0",
self.domain.getName())
diff -r 91169603a8e8 -r 79afceca9065 xen/Rules.mk
--- a/xen/Rules.mk Tue Aug 22 14:45:49 2006 -0600
+++ b/xen/Rules.mk Wed Aug 23 11:11:27 2006 -0600
@@ -8,6 +8,9 @@ perfc_arrays?= n
perfc_arrays?= n
crash_debug ?= n
+XEN_ROOT=$(BASEDIR)/..
+include $(XEN_ROOT)/Config.mk
+
# Hardcoded configuration implications and dependencies.
# Do this is a neater way if it becomes unwieldy.
ifeq ($(debug),y)
@@ -16,9 +19,6 @@ ifeq ($(perfc_arrays),y)
ifeq ($(perfc_arrays),y)
perfc := y
endif
-
-XEN_ROOT=$(BASEDIR)/..
-include $(XEN_ROOT)/Config.mk
# Set ARCH/SUBARCH appropriately.
override COMPILE_SUBARCH := $(XEN_COMPILE_ARCH)
diff -r 91169603a8e8 -r 79afceca9065 xen/acm/acm_core.c
--- a/xen/acm/acm_core.c Tue Aug 22 14:45:49 2006 -0600
+++ b/xen/acm/acm_core.c Wed Aug 23 11:11:27 2006 -0600
@@ -206,7 +206,7 @@ acm_setup(unsigned int *initrdidx,
for (i = mbi->mods_count-1; i >= 1; i--)
{
struct acm_policy_buffer *pol;
- char *_policy_start;
+ char *_policy_start;
unsigned long _policy_len;
#if defined(__i386__)
_policy_start = (char *)(initial_images_start +
(mod[i].mod_start-mod[0].mod_start));
@@ -342,7 +342,7 @@ acm_init_domain_ssid(domid_t id, ssidref
{
printk("%s: ERROR instantiating individual ssids for domain 0x%02x.\n",
__func__, subj->domain_id);
- acm_free_domain_ssid(ssid);
+ acm_free_domain_ssid(ssid);
put_domain(subj);
return ACM_INIT_SSID_ERROR;
}
diff -r 91169603a8e8 -r 79afceca9065 xen/acm/acm_simple_type_enforcement_hooks.c
--- a/xen/acm/acm_simple_type_enforcement_hooks.c Tue Aug 22 14:45:49
2006 -0600
+++ b/xen/acm/acm_simple_type_enforcement_hooks.c Wed Aug 23 11:11:27
2006 -0600
@@ -86,10 +86,10 @@ int acm_init_ste_policy(void)
/* init stats */
atomic_set(&(ste_bin_pol.ec_eval_count), 0);
- atomic_set(&(ste_bin_pol.ec_denied_count), 0);
+ atomic_set(&(ste_bin_pol.ec_denied_count), 0);
atomic_set(&(ste_bin_pol.ec_cachehit_count), 0);
atomic_set(&(ste_bin_pol.gt_eval_count), 0);
- atomic_set(&(ste_bin_pol.gt_denied_count), 0);
+ atomic_set(&(ste_bin_pol.gt_denied_count), 0);
atomic_set(&(ste_bin_pol.gt_cachehit_count), 0);
return ACM_OK;
}
@@ -100,7 +100,7 @@ ste_init_domain_ssid(void **ste_ssid, ss
ste_init_domain_ssid(void **ste_ssid, ssidref_t ssidref)
{
int i;
- struct ste_ssid *ste_ssidp = xmalloc(struct ste_ssid);
+ struct ste_ssid *ste_ssidp = xmalloc(struct ste_ssid);
traceprintk("%s.\n", __func__);
if (ste_ssidp == NULL)
@@ -309,7 +309,7 @@ ste_set_policy(u8 *buf, u32 buf_size)
sizeof(domaintype_t),
ste_buf->ste_max_ssidrefs*ste_buf->ste_max_types);
- /* 2. now re-calculate sharing decisions based on running domains;
+ /* 2. now re-calculate sharing decisions based on running domains;
* this can fail if new policy is conflicting with sharing of running
domains
* now: reject violating new policy; future: adjust sharing through
revoking sharing */
if (ste_init_state(ste_buf, (domaintype_t *)ssidrefsbuf)) {
@@ -349,11 +349,11 @@ ste_dump_stats(u8 *buf, u16 buf_len)
stats.ec_eval_count = htonl(atomic_read(&ste_bin_pol.ec_eval_count));
stats.gt_eval_count = htonl(atomic_read(&ste_bin_pol.gt_eval_count));
stats.ec_denied_count = htonl(atomic_read(&ste_bin_pol.ec_denied_count));
- stats.gt_denied_count = htonl(atomic_read(&ste_bin_pol.gt_denied_count));
+ stats.gt_denied_count = htonl(atomic_read(&ste_bin_pol.gt_denied_count));
stats.ec_cachehit_count =
htonl(atomic_read(&ste_bin_pol.ec_cachehit_count));
stats.gt_cachehit_count =
htonl(atomic_read(&ste_bin_pol.gt_cachehit_count));
- if (buf_len < sizeof(struct acm_ste_stats_buffer))
+ if (buf_len < sizeof(struct acm_ste_stats_buffer)
return -ENOMEM;
memcpy(buf, &stats, sizeof(struct acm_ste_stats_buffer));
@@ -523,8 +523,8 @@ ste_pre_eventchannel_unbound(domid_t id1
cache_result(subj, obj);
ret = ACM_ACCESS_PERMITTED;
} else {
- atomic_inc(&ste_bin_pol.ec_denied_count);
- ret = ACM_ACCESS_DENIED;
+ atomic_inc(&ste_bin_pol.ec_denied_count);
+ ret = ACM_ACCESS_DENIED;
}
out:
if (obj != NULL)
@@ -569,8 +569,8 @@ ste_pre_eventchannel_interdomain(domid_t
cache_result(subj, obj);
ret = ACM_ACCESS_PERMITTED;
} else {
- atomic_inc(&ste_bin_pol.ec_denied_count);
- ret = ACM_ACCESS_DENIED;
+ atomic_inc(&ste_bin_pol.ec_denied_count);
+ ret = ACM_ACCESS_DENIED;
}
out:
if (obj != NULL)
@@ -599,9 +599,9 @@ ste_pre_grant_map_ref (domid_t id) {
cache_result(subj, obj);
ret = ACM_ACCESS_PERMITTED;
} else {
- atomic_inc(&ste_bin_pol.gt_denied_count);
+ atomic_inc(&ste_bin_pol.gt_denied_count);
printkd("%s: ACCESS DENIED!\n", __func__);
- ret = ACM_ACCESS_DENIED;
+ ret = ACM_ACCESS_DENIED;
}
if (obj != NULL)
put_domain(obj);
@@ -637,8 +637,8 @@ ste_pre_grant_setup (domid_t id) {
cache_result(subj, obj);
ret = ACM_ACCESS_PERMITTED;
} else {
- atomic_inc(&ste_bin_pol.gt_denied_count);
- ret = ACM_ACCESS_DENIED;
+ atomic_inc(&ste_bin_pol.gt_denied_count);
+ ret = ACM_ACCESS_DENIED;
}
if (obj != NULL)
put_domain(obj);
diff -r 91169603a8e8 -r 79afceca9065 xen/arch/ia64/Rules.mk
--- a/xen/arch/ia64/Rules.mk Tue Aug 22 14:45:49 2006 -0600
+++ b/xen/arch/ia64/Rules.mk Wed Aug 23 11:11:27 2006 -0600
@@ -2,6 +2,7 @@
# ia64-specific definitions
HAS_ACPI := y
+HAS_VGA := y
VALIDATE_VT ?= n
no_warns ?= n
diff -r 91169603a8e8 -r 79afceca9065 xen/arch/ia64/vmx/mmio.c
--- a/xen/arch/ia64/vmx/mmio.c Tue Aug 22 14:45:49 2006 -0600
+++ b/xen/arch/ia64/vmx/mmio.c Wed Aug 23 11:11:27 2006 -0600
@@ -33,7 +33,7 @@
#include <public/hvm/ioreq.h>
#include <asm/vmx.h>
#include <public/event_channel.h>
-#include <public/arch-ia64.h>
+#include <public/xen.h>
#include <linux/event.h>
#include <xen/domain.h>
/*
diff -r 91169603a8e8 -r 79afceca9065 xen/arch/ia64/vmx/vlsapic.c
--- a/xen/arch/ia64/vmx/vlsapic.c Tue Aug 22 14:45:49 2006 -0600
+++ b/xen/arch/ia64/vmx/vlsapic.c Wed Aug 23 11:11:27 2006 -0600
@@ -21,7 +21,7 @@
*/
#include <linux/sched.h>
-#include <public/arch-ia64.h>
+#include <public/xen.h>
#include <asm/ia64_int.h>
#include <asm/vcpu.h>
#include <asm/regionreg.h>
diff -r 91169603a8e8 -r 79afceca9065 xen/arch/ia64/vmx/vmx_init.c
--- a/xen/arch/ia64/vmx/vmx_init.c Tue Aug 22 14:45:49 2006 -0600
+++ b/xen/arch/ia64/vmx/vmx_init.c Wed Aug 23 11:11:27 2006 -0600
@@ -41,15 +41,14 @@
#include <asm/vmx_vcpu.h>
#include <xen/lib.h>
#include <asm/vmmu.h>
-#include <public/arch-ia64.h>
+#include <public/xen.h>
#include <public/hvm/ioreq.h>
+#include <public/event_channel.h>
#include <asm/vmx_phy_mode.h>
#include <asm/processor.h>
#include <asm/vmx.h>
#include <xen/mm.h>
-#include <public/arch-ia64.h>
#include <asm/hvm/vioapic.h>
-#include <public/event_channel.h>
#include <xen/event.h>
#include <asm/vlsapic.h>
diff -r 91169603a8e8 -r 79afceca9065 xen/arch/ia64/vmx/vmx_vcpu.c
--- a/xen/arch/ia64/vmx/vmx_vcpu.c Tue Aug 22 14:45:49 2006 -0600
+++ b/xen/arch/ia64/vmx/vmx_vcpu.c Wed Aug 23 11:11:27 2006 -0600
@@ -24,7 +24,7 @@
*/
#include <xen/sched.h>
-#include <public/arch-ia64.h>
+#include <public/xen.h>
#include <asm/ia64_int.h>
#include <asm/vmx_vcpu.h>
#include <asm/regionreg.h>
diff -r 91169603a8e8 -r 79afceca9065 xen/arch/ia64/xen/domain.c
--- a/xen/arch/ia64/xen/domain.c Tue Aug 22 14:45:49 2006 -0600
+++ b/xen/arch/ia64/xen/domain.c Wed Aug 23 11:11:27 2006 -0600
@@ -35,14 +35,13 @@
#include <asm/pgalloc.h>
#include <asm/offsets.h> /* for IA64_THREAD_INFO_SIZE */
#include <asm/vcpu.h> /* for function declarations */
-#include <public/arch-ia64.h>
+#include <public/xen.h>
#include <xen/domain.h>
#include <asm/vmx.h>
#include <asm/vmx_vcpu.h>
#include <asm/vmx_vpd.h>
#include <asm/vmx_phy_mode.h>
#include <asm/vhpt.h>
-#include <public/arch-ia64.h>
#include <asm/tlbflush.h>
#include <asm/regionreg.h>
#include <asm/dom_fw.h>
@@ -665,11 +664,6 @@ int shadow_mode_control(struct domain *d
}
break;
- case DOM0_SHADOW_CONTROL_OP_FLUSH:
- atomic64_set(&d->arch.shadow_fault_count, 0);
- atomic64_set(&d->arch.shadow_dirty_count, 0);
- break;
-
case DOM0_SHADOW_CONTROL_OP_CLEAN:
{
int nbr_longs;
@@ -876,6 +870,7 @@ int construct_dom0(struct domain *d,
{
int i, rc;
start_info_t *si;
+ dom0_vga_console_info_t *ci;
struct vcpu *v = d->vcpu[0];
unsigned long max_pages;
@@ -1012,6 +1007,9 @@ int construct_dom0(struct domain *d,
//if ( initrd_len != 0 )
// memcpy((void *)vinitrd_start, initrd_start, initrd_len);
+ BUILD_BUG_ON(sizeof(start_info_t) + sizeof(dom0_vga_console_info_t) +
+ sizeof(struct ia64_boot_param) > PAGE_SIZE);
+
/* Set up start info area. */
d->shared_info->arch.start_info_pfn = pstart_info >> PAGE_SHIFT;
start_info_page = assign_new_domain_page(d, pstart_info);
@@ -1046,7 +1044,8 @@ int construct_dom0(struct domain *d,
strncpy((char *)si->cmd_line, dom0_command_line, sizeof(si->cmd_line));
si->cmd_line[sizeof(si->cmd_line)-1] = 0;
- bp = (struct ia64_boot_param *)(si + 1);
+ bp = (struct ia64_boot_param *)((unsigned char *)si +
+ sizeof(start_info_t));
bp->command_line = pstart_info + offsetof (start_info_t, cmd_line);
/* We assume console has reached the last line! */
@@ -1060,6 +1059,16 @@ int construct_dom0(struct domain *d,
(PAGE_ALIGN(ia64_boot_param->initrd_size) + 4*1024*1024);
bp->initrd_size = ia64_boot_param->initrd_size;
+ ci = (dom0_vga_console_info_t *)((unsigned char *)si +
+ sizeof(start_info_t) +
+ sizeof(struct ia64_boot_param));
+
+ if (fill_console_start_info(ci)) {
+ si->console.dom0.info_off = sizeof(start_info_t) +
+ sizeof(struct ia64_boot_param);
+ si->console.dom0.info_size = sizeof(dom0_vga_console_info_t);
+ }
+
vcpu_init_regs (v);
vcpu_regs(v)->r28 = bp_mpa;
diff -r 91169603a8e8 -r 79afceca9065 xen/arch/ia64/xen/hyperprivop.S
--- a/xen/arch/ia64/xen/hyperprivop.S Tue Aug 22 14:45:49 2006 -0600
+++ b/xen/arch/ia64/xen/hyperprivop.S Wed Aug 23 11:11:27 2006 -0600
@@ -14,7 +14,7 @@
#include <asm/system.h>
#include <asm/debugger.h>
#include <asm/asm-xsi-offsets.h>
-#include <public/arch-ia64.h>
+#include <public/xen.h>
#define _PAGE_PPN_MASK 0x0003fffffffff000 //asm/pgtable.h doesn't do
assembly
diff -r 91169603a8e8 -r 79afceca9065 xen/arch/ia64/xen/mm.c
--- a/xen/arch/ia64/xen/mm.c Tue Aug 22 14:45:49 2006 -0600
+++ b/xen/arch/ia64/xen/mm.c Wed Aug 23 11:11:27 2006 -0600
@@ -1581,11 +1581,6 @@ void pgtable_quicklist_free(void *pgtabl
free_xenheap_page(pgtable_entry);
}
-void cleanup_writable_pagetable(struct domain *d)
-{
- return;
-}
-
void put_page_type(struct page_info *page)
{
u32 nx, x, y = page->u.inuse.type_info;
@@ -1693,22 +1688,6 @@ int get_page_type(struct page_info *page
{
if ( unlikely((x & PGT_type_mask) != (type & PGT_type_mask) ) )
{
- if ( current->domain == page_get_owner(page) )
- {
- /*
- * This ensures functions like set_gdt() see up-to-date
- * type info without needing to clean up writable p.t.
- * state on the fast path.
- */
- LOCK_BIGLOCK(current->domain);
- cleanup_writable_pagetable(current->domain);
- y = page->u.inuse.type_info;
- UNLOCK_BIGLOCK(current->domain);
- /* Can we make progress now? */
- if ( ((y & PGT_type_mask) == (type & PGT_type_mask)) ||
- ((y & PGT_count_mask) == 0) )
- goto again;
- }
if ( ((x & PGT_type_mask) != PGT_l2_page_table) ||
((type & PGT_type_mask) != PGT_l1_page_table) )
MEM_LOG("Bad type (saw %08x != exp %08x) "
@@ -1768,6 +1747,11 @@ int get_page_type(struct page_info *page
return 1;
}
+int memory_is_conventional_ram(paddr_t p)
+{
+ return (efi_mem_type(p) == EFI_CONVENTIONAL_MEMORY);
+}
+
/*
* Local variables:
* mode: C
diff -r 91169603a8e8 -r 79afceca9065 xen/arch/ia64/xen/vcpu.c
--- a/xen/arch/ia64/xen/vcpu.c Tue Aug 22 14:45:49 2006 -0600
+++ b/xen/arch/ia64/xen/vcpu.c Wed Aug 23 11:11:27 2006 -0600
@@ -7,7 +7,7 @@
*/
#include <linux/sched.h>
-#include <public/arch-ia64.h>
+#include <public/xen.h>
#include <xen/mm.h>
#include <asm/ia64_int.h>
#include <asm/vcpu.h>
diff -r 91169603a8e8 -r 79afceca9065 xen/arch/ia64/xen/xenasm.S
--- a/xen/arch/ia64/xen/xenasm.S Tue Aug 22 14:45:49 2006 -0600
+++ b/xen/arch/ia64/xen/xenasm.S Wed Aug 23 11:11:27 2006 -0600
@@ -11,7 +11,7 @@
#include <asm/pgtable.h>
#include <asm/vhpt.h>
#include <asm/asm-xsi-offsets.h>
-#include <public/arch-ia64.h>
+#include <public/xen.h>
// Change rr7 to the passed value while ensuring
// Xen is mapped into the new region.
diff -r 91169603a8e8 -r 79afceca9065 xen/arch/powerpc/Makefile
--- a/xen/arch/powerpc/Makefile Tue Aug 22 14:45:49 2006 -0600
+++ b/xen/arch/powerpc/Makefile Wed Aug 23 11:11:27 2006 -0600
@@ -49,7 +49,7 @@ PPC_C_WARNINGS += -Wundef -Wmissing-prot
PPC_C_WARNINGS += -Wundef -Wmissing-prototypes -Wmissing-declarations
CFLAGS += $(PPC_C_WARNINGS)
-LINK=0x3000000
+LINK=0x400000
boot32_link_base = $(LINK)
xen_link_offset = 100
xen_link_base = $(patsubst %000,%$(xen_link_offset),$(LINK))
@@ -82,6 +82,11 @@ physdev.o: ../x86/physdev.c
physdev.o: ../x86/physdev.c
HDRS += $(wildcard *.h)
+
+# The first token in the arguments will be silently dropped.
+IMAGENAME = xen
+CMDLINE = ""
+boot_of.o: CFLAGS += -DCMDLINE="\"$(IMAGENAME) $(CMDLINE)\""
start.o: boot/start.S
$(CC) $(CFLAGS) -D__ASSEMBLY__ -c $< -o $@
diff -r 91169603a8e8 -r 79afceca9065 xen/arch/powerpc/boot_of.c
--- a/xen/arch/powerpc/boot_of.c Tue Aug 22 14:45:49 2006 -0600
+++ b/xen/arch/powerpc/boot_of.c Wed Aug 23 11:11:27 2006 -0600
@@ -13,7 +13,7 @@
* along with this program; if not, write to the Free Software
* Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
- * Copyright (C) IBM Corp. 2005
+ * Copyright (C) IBM Corp. 2005, 2006
*
* Authors: Jimi Xenidis <jimix@xxxxxxxxxxxxxx>
*/
@@ -36,6 +36,10 @@ static int of_out;
static int of_out;
static ofdn_t boot_cpu;
static char bootargs[256];
+
+#define COMMAND_LINE_SIZE 512
+static char builtin_cmdline[COMMAND_LINE_SIZE]
+ __attribute__((section("__builtin_cmdline"))) = CMDLINE;
extern struct ns16550_defaults ns16550;
@@ -300,12 +304,11 @@ static int __init of_instance_to_path(in
static int __init of_start_cpu(int cpu, u32 pc, u32 reg)
{
- int rets[1] = { OF_FAILURE };
-
- if ( of_call("start-cpu", 3, 0, rets, cpu, pc, reg) == OF_FAILURE )
- return OF_FAILURE;
-
- return rets[0];
+ int ret;
+
+ ret = of_call("start-cpu", 3, 0, NULL, cpu, pc, reg);
+
+ return ret;
}
static void __init of_test(const char *of_method_name)
@@ -449,8 +452,8 @@ static void boot_of_bootargs(multiboot_i
int rc;
rc = of_getprop(bof_chosen, "bootargs", &bootargs, sizeof (bootargs));
- if (rc == OF_FAILURE) {
- strcpy(bootargs, "xen");
+ if (rc == OF_FAILURE || bootargs[0] == '\0') {
+ strlcpy(bootargs, builtin_cmdline, sizeof(bootargs));
}
mbi->flags |= MBI_CMDLINE;
@@ -756,19 +759,30 @@ static int __init boot_of_serial(void *o
if (n == OF_FAILURE) {
of_panic("instance-to-package of /chosen/stdout: failed\n");
}
-
- /* prune this from the oftree */
- rc = of_package_to_path(n, buf, sizeof(buf));
- if (rc == OF_FAILURE) {
- of_panic("package-to-path of /chosen/stdout: failed\n");
- }
- of_printf("Pruning from devtree: %s\n"
- " since Xen will be using it for console\n", buf);
- rc = ofd_prune_path(oftree, buf);
- if (rc < 0) {
- of_panic("prune path \"%s\" failed\n", buf);
- }
+ /* Prune all serial devices from the device tree, including the
+ * one pointed to by /chosen/stdout, because a guest domain can
+ * initialize them and in so doing corrupt our console output.
+ */
+ for (p = n; p > 0; p = of_getpeer(p)) {
+ char type[32];
+
+ rc = of_package_to_path(p, buf, sizeof(buf));
+ if (rc == OF_FAILURE)
+ of_panic("package-to-path failed\n");
+
+ rc = of_getprop(p, "device_type", type, sizeof (type));
+ if (rc == OF_FAILURE)
+ of_panic("fetching device type failed\n");
+
+ if (strcmp(type, "serial") != 0)
+ continue;
+
+ of_printf("pruning `%s' from devtree\n", buf);
+ rc = ofd_prune_path(oftree, buf);
+ if (rc < 0)
+ of_panic("prune of `%s' failed\n", buf);
+ }
p = of_getparent(n);
if (p == OF_FAILURE) {
@@ -795,7 +809,6 @@ static int __init boot_of_serial(void *o
if (rc == OF_FAILURE) {
of_panic("%s: no location for serial port\n", __func__);
}
- ns16550.io_base = val[1];
ns16550.baud = BAUD_AUTO;
ns16550.data_bits = 8;
diff -r 91169603a8e8 -r 79afceca9065 xen/arch/powerpc/dom0_ops.c
--- a/xen/arch/powerpc/dom0_ops.c Tue Aug 22 14:45:49 2006 -0600
+++ b/xen/arch/powerpc/dom0_ops.c Wed Aug 23 11:11:27 2006 -0600
@@ -40,23 +40,40 @@ long arch_do_dom0_op(struct dom0_op *op,
long ret = 0;
switch (op->cmd) {
- case DOM0_GETMEMLIST: {
- /* XXX 64M hackage */
- const int memsize = (64UL<<20);
- int domain_pfns = memsize>>12;
- int max_pfns = op->u.getmemlist.max_pfns;
- int domid = op->u.getmemlist.domain;
+ case DOM0_GETMEMLIST:
+ {
int i;
+ struct domain *d = find_domain_by_id(op->u.getmemlist.domain);
+ unsigned long max_pfns = op->u.getmemlist.max_pfns;
+ xen_pfn_t mfn;
+ struct list_head *list_ent;
- for (i = 0; (i < max_pfns) && (i < domain_pfns); i++) {
- xen_pfn_t mfn = (((domid + 1) * memsize) >> 12) + i;
- if (copy_to_guest_offset(op->u.getmemlist.buffer, i, &mfn, 1)) {
- ret = -EFAULT;
- break;
+ ret = -EINVAL;
+ if ( d != NULL )
+ {
+ ret = 0;
+
+ spin_lock(&d->page_alloc_lock);
+ list_ent = d->page_list.next;
+ for ( i = 0; (i < max_pfns) && (list_ent != &d->page_list); i++ )
+ {
+ mfn = page_to_mfn(list_entry(
+ list_ent, struct page_info, list));
+ if ( copy_to_guest_offset(op->u.getmemlist.buffer,
+ i, &mfn, 1) )
+ {
+ ret = -EFAULT;
+ break;
+ }
+ list_ent = mfn_to_page(mfn)->list.next;
}
+ spin_unlock(&d->page_alloc_lock);
+
+ op->u.getmemlist.num_pfns = i;
+ copy_to_guest(u_dom0_op, op, 1);
+
+ put_domain(d);
}
- op->u.getmemlist.num_pfns = i;
- copy_to_guest(u_dom0_op, op, 1);
}
break;
diff -r 91169603a8e8 -r 79afceca9065 xen/arch/powerpc/domain.c
--- a/xen/arch/powerpc/domain.c Tue Aug 22 14:45:49 2006 -0600
+++ b/xen/arch/powerpc/domain.c Wed Aug 23 11:11:27 2006 -0600
@@ -73,6 +73,9 @@ unsigned long hypercall_create_continuat
int arch_domain_create(struct domain *d)
{
+ unsigned long rma_base;
+ unsigned long rma_sz;
+ uint htab_order;
if (d->domain_id == IDLE_DOMAIN_ID) {
d->shared_info = (void *)alloc_xenheap_page();
@@ -81,27 +84,44 @@ int arch_domain_create(struct domain *d)
return 0;
}
- /* XXX the hackage... hardcode 64M domains */
- d->arch.rma_base = (64<<20) * (d->domain_id + 1);
- d->arch.rma_size = (64<<20);
-
- printk("clearing RMO: 0x%lx[0x%lx]\n", d->arch.rma_base, d->arch.rma_size);
- memset((void*)d->arch.rma_base, 0, d->arch.rma_size);
-
- htab_alloc(d, LOG_DEFAULT_HTAB_BYTES);
+ d->arch.rma_order = cpu_rma_order();
+ rma_sz = rma_size(d->arch.rma_order);
+
+ /* allocate the real mode area */
+ d->max_pages = 1UL << d->arch.rma_order;
+ d->tot_pages = 0;
+ d->arch.rma_page = alloc_domheap_pages(d, d->arch.rma_order, 0);
+ if (NULL == d->arch.rma_page)
+ return 1;
+ rma_base = page_to_maddr(d->arch.rma_page);
+
+ BUG_ON(rma_base & (rma_sz - 1)); /* check alignment */
+
+ printk("clearing RMO: 0x%lx[0x%lx]\n", rma_base, rma_sz);
+ memset((void *)rma_base, 0, rma_sz);
d->shared_info = (shared_info_t *)
- (rma_addr(&d->arch, RMA_SHARED_INFO) + d->arch.rma_base);
+ (rma_addr(&d->arch, RMA_SHARED_INFO) + rma_base);
d->arch.large_page_sizes = 1;
d->arch.large_page_shift[0] = 24; /* 16 M for 970s */
+ /* FIXME: we need to the the maximum addressible memory for this
+ * domain to calculate this correctly. It should probably be set
+ * by the managment tools */
+ htab_order = d->arch.rma_order - 6; /* (1/64) */
+ if (test_bit(_DOMF_privileged, &d->domain_flags)) {
+ /* bump the htab size of privleged domains */
+ ++htab_order;
+ }
+ htab_alloc(d, htab_order);
+
return 0;
}
void arch_domain_destroy(struct domain *d)
{
- unimplemented();
+ htab_free(d);
}
void machine_halt(void)
@@ -243,7 +263,7 @@ void sync_vcpu_execstate(struct vcpu *v)
void domain_relinquish_resources(struct domain *d)
{
- /* nothing to do? */
+ free_domheap_pages(d->arch.rma_page, d->arch.rma_order);
}
void arch_dump_domain_info(struct domain *d)
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|