ia64/xen-unstable

changeset 6534:23979fb12c49

Merge.
author adsharma@los-vmm.sc.intel.com
date Wed Aug 17 12:33:56 2005 -0800 (2005-08-17)
parents 6a6c4a422780 fbdbe4fc218d
children 84ee014ebd41
files .hgignore Config.mk Makefile buildconfigs/Rules.mk buildconfigs/mk.linux-2.6-xen buildconfigs/mk.linux-2.6-xen0 buildconfigs/mk.linux-2.6-xenU docs/misc/shype4xen_readme.txt docs/src/user.tex linux-2.4-xen-sparse/arch/xen/Makefile linux-2.4-xen-sparse/arch/xen/config.in linux-2.4-xen-sparse/arch/xen/kernel/time.c linux-2.4-xen-sparse/include/asm-xen/bugs.h linux-2.4-xen-sparse/include/asm-xen/fixmap.h linux-2.4-xen-sparse/include/asm-xen/highmem.h linux-2.4-xen-sparse/include/asm-xen/hw_irq.h linux-2.4-xen-sparse/include/asm-xen/io.h linux-2.4-xen-sparse/include/asm-xen/irq.h linux-2.4-xen-sparse/include/asm-xen/mmu_context.h linux-2.4-xen-sparse/include/asm-xen/page.h linux-2.4-xen-sparse/include/asm-xen/pci.h linux-2.4-xen-sparse/include/asm-xen/pgalloc.h linux-2.4-xen-sparse/include/asm-xen/pgtable.h linux-2.4-xen-sparse/include/asm-xen/processor.h linux-2.4-xen-sparse/include/asm-xen/segment.h linux-2.4-xen-sparse/include/asm-xen/smp.h linux-2.4-xen-sparse/include/asm-xen/system.h linux-2.4-xen-sparse/include/asm-xen/vga.h linux-2.4-xen-sparse/include/linux/blk.h linux-2.4-xen-sparse/include/linux/highmem.h linux-2.4-xen-sparse/include/linux/irq.h linux-2.4-xen-sparse/include/linux/mm.h linux-2.4-xen-sparse/include/linux/sched.h linux-2.4-xen-sparse/include/linux/skbuff.h linux-2.4-xen-sparse/include/linux/timer.h linux-2.4-xen-sparse/mkbuildtree linux-2.6-xen-sparse/arch/xen/Kconfig linux-2.6-xen-sparse/arch/xen/configs/xen0_defconfig_x86_32 linux-2.6-xen-sparse/arch/xen/configs/xen0_defconfig_x86_64 linux-2.6-xen-sparse/arch/xen/configs/xenU_defconfig_x86_32 linux-2.6-xen-sparse/arch/xen/configs/xenU_defconfig_x86_64 linux-2.6-xen-sparse/arch/xen/configs/xen_defconfig_x86_32 linux-2.6-xen-sparse/arch/xen/configs/xen_defconfig_x86_64 linux-2.6-xen-sparse/arch/xen/i386/Kconfig linux-2.6-xen-sparse/arch/xen/i386/kernel/Makefile linux-2.6-xen-sparse/arch/xen/i386/kernel/entry.S linux-2.6-xen-sparse/arch/xen/i386/kernel/head.S linux-2.6-xen-sparse/arch/xen/i386/kernel/i386_ksyms.c linux-2.6-xen-sparse/arch/xen/i386/kernel/ioport.c linux-2.6-xen-sparse/arch/xen/i386/kernel/irq.c linux-2.6-xen-sparse/arch/xen/i386/kernel/mpparse.c linux-2.6-xen-sparse/arch/xen/i386/kernel/pci-dma.c linux-2.6-xen-sparse/arch/xen/i386/kernel/process.c linux-2.6-xen-sparse/arch/xen/i386/kernel/setup.c linux-2.6-xen-sparse/arch/xen/i386/kernel/smpboot.c linux-2.6-xen-sparse/arch/xen/i386/kernel/swiotlb.c linux-2.6-xen-sparse/arch/xen/i386/kernel/time.c linux-2.6-xen-sparse/arch/xen/i386/kernel/traps.c linux-2.6-xen-sparse/arch/xen/i386/mm/highmem.c linux-2.6-xen-sparse/arch/xen/i386/mm/hypervisor.c linux-2.6-xen-sparse/arch/xen/i386/mm/init.c linux-2.6-xen-sparse/arch/xen/i386/mm/ioremap.c linux-2.6-xen-sparse/arch/xen/i386/mm/pgtable.c linux-2.6-xen-sparse/arch/xen/i386/pci/irq.c linux-2.6-xen-sparse/arch/xen/kernel/evtchn.c linux-2.6-xen-sparse/arch/xen/kernel/gnttab.c linux-2.6-xen-sparse/arch/xen/kernel/reboot.c linux-2.6-xen-sparse/arch/xen/kernel/skbuff.c linux-2.6-xen-sparse/arch/xen/x86_64/Kconfig linux-2.6-xen-sparse/arch/xen/x86_64/Makefile linux-2.6-xen-sparse/arch/xen/x86_64/kernel/Makefile linux-2.6-xen-sparse/arch/xen/x86_64/kernel/apic.c linux-2.6-xen-sparse/arch/xen/x86_64/kernel/e820.c linux-2.6-xen-sparse/arch/xen/x86_64/kernel/entry.S linux-2.6-xen-sparse/arch/xen/x86_64/kernel/genapic.c linux-2.6-xen-sparse/arch/xen/x86_64/kernel/genapic_xen.c linux-2.6-xen-sparse/arch/xen/x86_64/kernel/head.S linux-2.6-xen-sparse/arch/xen/x86_64/kernel/ioport.c linux-2.6-xen-sparse/arch/xen/x86_64/kernel/irq.c linux-2.6-xen-sparse/arch/xen/x86_64/kernel/pci-nommu.c linux-2.6-xen-sparse/arch/xen/x86_64/kernel/process.c linux-2.6-xen-sparse/arch/xen/x86_64/kernel/setup.c linux-2.6-xen-sparse/arch/xen/x86_64/kernel/setup64.c linux-2.6-xen-sparse/arch/xen/x86_64/kernel/smp.c linux-2.6-xen-sparse/arch/xen/x86_64/kernel/smpboot.c linux-2.6-xen-sparse/arch/xen/x86_64/kernel/traps.c linux-2.6-xen-sparse/arch/xen/x86_64/kernel/xen_entry.S linux-2.6-xen-sparse/arch/xen/x86_64/mm/fault.c linux-2.6-xen-sparse/arch/xen/x86_64/mm/init.c linux-2.6-xen-sparse/arch/xen/x86_64/mm/ioremap.c linux-2.6-xen-sparse/drivers/xen/Makefile linux-2.6-xen-sparse/drivers/xen/balloon/balloon.c linux-2.6-xen-sparse/drivers/xen/blkback/Makefile linux-2.6-xen-sparse/drivers/xen/blkback/blkback.c linux-2.6-xen-sparse/drivers/xen/blkback/common.h linux-2.6-xen-sparse/drivers/xen/blkback/control.c linux-2.6-xen-sparse/drivers/xen/blkback/interface.c linux-2.6-xen-sparse/drivers/xen/blkback/vbd.c linux-2.6-xen-sparse/drivers/xen/blkfront/blkfront.c linux-2.6-xen-sparse/drivers/xen/blkfront/block.h linux-2.6-xen-sparse/drivers/xen/blkfront/vbd.c linux-2.6-xen-sparse/drivers/xen/blktap/blktap.c linux-2.6-xen-sparse/drivers/xen/blktap/blktap.h linux-2.6-xen-sparse/drivers/xen/blktap/blktap_controlmsg.c linux-2.6-xen-sparse/drivers/xen/blktap/blktap_datapath.c linux-2.6-xen-sparse/drivers/xen/blktap/blktap_userdev.c linux-2.6-xen-sparse/drivers/xen/netback/common.h linux-2.6-xen-sparse/drivers/xen/netback/interface.c linux-2.6-xen-sparse/drivers/xen/netback/netback.c linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c linux-2.6-xen-sparse/drivers/xen/privcmd/privcmd.c linux-2.6-xen-sparse/drivers/xen/usbback/common.h linux-2.6-xen-sparse/drivers/xen/usbback/interface.c linux-2.6-xen-sparse/drivers/xen/usbback/usbback.c linux-2.6-xen-sparse/drivers/xen/usbfront/usbfront.c linux-2.6-xen-sparse/drivers/xen/usbfront/xhci.h linux-2.6-xen-sparse/drivers/xen/xenbus/Makefile linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_comms.c linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_comms.h linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_xs.c linux-2.6-xen-sparse/include/asm-generic/pgtable.h linux-2.6-xen-sparse/include/asm-xen/asm-i386/dma-mapping.h linux-2.6-xen-sparse/include/asm-xen/asm-i386/fixmap.h linux-2.6-xen-sparse/include/asm-xen/asm-i386/hypercall.h linux-2.6-xen-sparse/include/asm-xen/asm-i386/kmap_types.h linux-2.6-xen-sparse/include/asm-xen/asm-i386/mach-xen/irq_vectors.h linux-2.6-xen-sparse/include/asm-xen/asm-i386/mmu_context.h linux-2.6-xen-sparse/include/asm-xen/asm-i386/page.h linux-2.6-xen-sparse/include/asm-xen/asm-i386/pci.h linux-2.6-xen-sparse/include/asm-xen/asm-i386/pgalloc.h linux-2.6-xen-sparse/include/asm-xen/asm-i386/pgtable-2level.h linux-2.6-xen-sparse/include/asm-xen/asm-i386/pgtable-3level.h linux-2.6-xen-sparse/include/asm-xen/asm-i386/pgtable.h linux-2.6-xen-sparse/include/asm-xen/asm-i386/scatterlist.h linux-2.6-xen-sparse/include/asm-xen/asm-i386/swiotlb.h linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/dma-mapping.h linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/io.h linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/mach-xen/irq_vectors.h linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/pci.h linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/pgtable.h linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/processor.h linux-2.6-xen-sparse/include/asm-xen/balloon.h linux-2.6-xen-sparse/include/asm-xen/ctrl_if.h linux-2.6-xen-sparse/include/asm-xen/evtchn.h linux-2.6-xen-sparse/include/asm-xen/gnttab.h linux-2.6-xen-sparse/include/asm-xen/hypervisor.h linux-2.6-xen-sparse/include/asm-xen/xenbus.h linux-2.6-xen-sparse/include/linux/highmem.h linux-2.6-xen-sparse/include/linux/mm.h linux-2.6-xen-sparse/kernel/irq/manage.c linux-2.6-xen-sparse/mkbuildtree linux-2.6-xen-sparse/mm/highmem.c linux-2.6-xen-sparse/mm/memory.c patches/linux-2.6.12/patch-2.6.12.5 patches/linux-2.6.12/smp-alts.patch tools/Makefile tools/blktap/blktaplib.c tools/console/client/main.c tools/console/daemon/io.c tools/console/daemon/utils.c tools/debugger/gdb/gdbbuild tools/debugger/libxendebug/xendebug.c tools/debugger/pdb/Domain.ml tools/debugger/pdb/Domain.mli tools/debugger/pdb/Makefile tools/debugger/pdb/PDB.ml tools/debugger/pdb/Process.ml tools/debugger/pdb/Process.mli tools/debugger/pdb/Util.ml tools/debugger/pdb/Xen_domain.ml tools/debugger/pdb/Xen_domain.mli tools/debugger/pdb/debugger.ml tools/debugger/pdb/linux-2.6-module/Makefile tools/debugger/pdb/linux-2.6-module/debug.c tools/debugger/pdb/linux-2.6-module/module.c tools/debugger/pdb/linux-2.6-module/pdb_debug.h tools/debugger/pdb/linux-2.6-module/pdb_module.h tools/debugger/pdb/linux-2.6-patches/Makefile tools/debugger/pdb/linux-2.6-patches/i386_ksyms.patch tools/debugger/pdb/linux-2.6-patches/kdebug.patch tools/debugger/pdb/linux-2.6-patches/makefile.patch tools/debugger/pdb/linux-2.6-patches/ptrace.patch tools/debugger/pdb/linux-2.6-patches/traps.patch tools/debugger/pdb/pdb_caml_domain.c tools/debugger/pdb/pdb_caml_process.c tools/debugger/pdb/pdb_caml_xcs.c tools/debugger/pdb/pdb_caml_xen.h tools/debugger/pdb/readme tools/debugger/pdb/server.ml tools/examples/Makefile tools/examples/network-bridge tools/examples/xend-config.sxp tools/examples/xmexample.vmx tools/firmware/rombios/rombios.c tools/ioemu/hw/pc.c tools/ioemu/hw/pckbd.c tools/ioemu/monitor.c tools/ioemu/target-i386-dm/Makefile tools/ioemu/target-i386-dm/helper2.c tools/ioemu/target-i386-dm/qemu-dm.debug tools/ioemu/vl.c tools/ioemu/vl.h tools/ioemu/vnc.c tools/libxc/Makefile tools/libxc/linux_boot_params.h tools/libxc/xc.h tools/libxc/xc_core.c tools/libxc/xc_domain.c tools/libxc/xc_gnttab.c tools/libxc/xc_linux_build.c tools/libxc/xc_linux_restore.c tools/libxc/xc_linux_save.c tools/libxc/xc_load_elf.c tools/libxc/xc_private.c tools/libxc/xc_private.h tools/libxc/xc_ptrace.c tools/libxc/xc_vmx_build.c tools/misc/Makefile tools/misc/policyprocessor/XmlToBinInterface.java tools/misc/xend tools/python/setup.py tools/python/xen/lowlevel/xc/xc.c tools/python/xen/lowlevel/xs/xs.c tools/python/xen/lowlevel/xu/xu.c tools/python/xen/sv/CreateDomain.py tools/python/xen/sv/DomInfo.py tools/python/xen/sv/GenTabbed.py tools/python/xen/sv/HTMLBase.py tools/python/xen/sv/Main.py tools/python/xen/sv/NodeInfo.py tools/python/xen/sv/RestoreDomain.py tools/python/xen/sv/Wizard.py tools/python/xen/sv/__init__.py tools/python/xen/sv/util.py tools/python/xen/web/SrvBase.py tools/python/xen/web/SrvDir.py tools/python/xen/web/__init__.py tools/python/xen/web/connection.py tools/python/xen/web/httpserver.py tools/python/xen/web/protocol.py tools/python/xen/web/reactor.py tools/python/xen/web/resource.py tools/python/xen/web/static.py tools/python/xen/web/tcp.py tools/python/xen/web/unix.py tools/python/xen/xend/Args.py tools/python/xen/xend/EventServer.py tools/python/xen/xend/PrettyPrint.py tools/python/xen/xend/Vifctl.py tools/python/xen/xend/XendCheckpoint.py tools/python/xen/xend/XendClient.py tools/python/xen/xend/XendDB.py tools/python/xen/xend/XendDmesg.py tools/python/xen/xend/XendDomain.py tools/python/xen/xend/XendDomainInfo.py tools/python/xen/xend/XendError.py tools/python/xen/xend/XendLogging.py tools/python/xen/xend/XendNode.py tools/python/xen/xend/XendProtocol.py tools/python/xen/xend/XendRoot.py tools/python/xen/xend/XendVnet.py tools/python/xen/xend/encode.py tools/python/xen/xend/image.py tools/python/xen/xend/scheduler.py tools/python/xen/xend/server/SrvDaemon.py tools/python/xen/xend/server/SrvDmesg.py tools/python/xen/xend/server/SrvDomain.py tools/python/xen/xend/server/SrvDomainDir.py tools/python/xen/xend/server/SrvNode.py tools/python/xen/xend/server/SrvRoot.py tools/python/xen/xend/server/SrvServer.py tools/python/xen/xend/server/SrvVnetDir.py tools/python/xen/xend/server/SrvXendLog.py tools/python/xen/xend/server/blkif.py tools/python/xen/xend/server/channel.py tools/python/xen/xend/server/controller.py tools/python/xen/xend/server/event.py tools/python/xen/xend/server/messages.py tools/python/xen/xend/server/netif.py tools/python/xen/xend/server/params.py tools/python/xen/xend/server/pciif.py tools/python/xen/xend/server/relocate.py tools/python/xen/xend/sxp.py tools/python/xen/xend/uuid.py tools/python/xen/xend/xenstore/__init__.py tools/python/xen/xend/xenstore/xsnode.py tools/python/xen/xend/xenstore/xsobj.py tools/python/xen/xend/xenstore/xsresource.py tools/python/xen/xm/create.py tools/python/xen/xm/destroy.py tools/python/xen/xm/help.py tools/python/xen/xm/main.py tools/python/xen/xm/migrate.py tools/python/xen/xm/opts.py tools/python/xen/xm/shutdown.py tools/python/xen/xm/sysrq.py tools/security/secpol_tool.c tools/sv/Makefile tools/sv/images/destroy.png tools/sv/images/finish.png tools/sv/images/next.png tools/sv/images/pause.png tools/sv/images/previous.png tools/sv/images/reboot.png tools/sv/images/shutdown.png tools/sv/images/small-destroy.png tools/sv/images/small-pause.png tools/sv/images/small-unpause.png tools/sv/images/unpause.png tools/sv/images/xen.png tools/sv/inc/script.js tools/sv/inc/style.css tools/sv/index.psp tools/xcs/xcs.h tools/xcutils/xc_restore.c tools/xenstore/Makefile tools/xenstore/TODO tools/xenstore/testsuite/test.sh tools/xenstore/utils.c tools/xenstore/utils.h tools/xenstore/xenstored.h tools/xenstore/xenstored_core.c tools/xenstore/xenstored_core.h tools/xenstore/xenstored_domain.c tools/xenstore/xenstored_domain.h tools/xenstore/xenstored_transaction.c tools/xenstore/xenstored_transaction.h tools/xenstore/xenstored_watch.c tools/xenstore/xenstored_watch.h tools/xenstore/xs.c tools/xenstore/xs.h tools/xenstore/xs_lib.c tools/xenstore/xs_lib.h tools/xenstore/xs_random.c tools/xenstore/xs_test.c tools/xentrace/xentrace.c xen/Makefile xen/Rules.mk xen/acm/acm_core.c xen/acm/acm_policy.c xen/arch/ia64/Makefile xen/arch/ia64/Rules.mk xen/arch/ia64/asm-offsets.c xen/arch/ia64/asm-xsi-offsets.c xen/arch/ia64/dom_fw.c xen/arch/ia64/domain.c xen/arch/ia64/grant_table.c xen/arch/ia64/hypercall.c xen/arch/ia64/hyperprivop.S xen/arch/ia64/mmio.c xen/arch/ia64/pal_emul.c xen/arch/ia64/patch/linux-2.6.11/irq_ia64.c xen/arch/ia64/patch/linux-2.6.11/kregs.h xen/arch/ia64/pcdp.c xen/arch/ia64/process.c xen/arch/ia64/regionreg.c xen/arch/ia64/tools/mkbuildtree xen/arch/ia64/vcpu.c xen/arch/ia64/vlsapic.c xen/arch/ia64/vmmu.c xen/arch/ia64/vmx_hypercall.c xen/arch/ia64/vmx_ivt.S xen/arch/ia64/vmx_support.c xen/arch/ia64/vmx_vcpu.c xen/arch/ia64/vmx_virt.c xen/arch/ia64/vtlb.c xen/arch/ia64/xenasm.S xen/arch/ia64/xenmem.c xen/arch/ia64/xenmisc.c xen/arch/ia64/xensetup.c xen/arch/ia64/xentime.c xen/arch/x86/Makefile xen/arch/x86/acpi/boot.c xen/arch/x86/apic.c xen/arch/x86/audit.c xen/arch/x86/cpu/common.c xen/arch/x86/dom0_ops.c xen/arch/x86/domain.c xen/arch/x86/domain_build.c xen/arch/x86/genapic/es7000plat.c xen/arch/x86/i8259.c xen/arch/x86/io_apic.c xen/arch/x86/mm.c xen/arch/x86/mpparse.c xen/arch/x86/setup.c xen/arch/x86/shadow.c xen/arch/x86/shadow32.c xen/arch/x86/shadow_public.c xen/arch/x86/smpboot.c xen/arch/x86/time.c xen/arch/x86/traps.c xen/arch/x86/vmx.c xen/arch/x86/vmx_intercept.c xen/arch/x86/vmx_io.c xen/arch/x86/vmx_platform.c xen/arch/x86/vmx_vmcs.c xen/arch/x86/x86_32/entry.S xen/arch/x86/x86_32/mm.c xen/arch/x86/x86_32/traps.c xen/arch/x86/x86_64/entry.S xen/arch/x86/x86_64/mm.c xen/arch/x86/x86_64/traps.c xen/common/ac_timer.c xen/common/dom0_ops.c xen/common/dom_mem_ops.c xen/common/domain.c xen/common/grant_table.c xen/common/page_alloc.c xen/common/perfc.c xen/common/sched_sedf.c xen/common/schedule.c xen/common/symbols.c xen/common/xmalloc.c xen/drivers/char/console.c xen/drivers/char/ns16550.c xen/include/acm/acm_core.h xen/include/acm/acm_hooks.h xen/include/asm-ia64/config.h xen/include/asm-ia64/domain.h xen/include/asm-ia64/event.h xen/include/asm-ia64/ia64_int.h xen/include/asm-ia64/privop.h xen/include/asm-ia64/regionreg.h xen/include/asm-ia64/regs.h xen/include/asm-ia64/vcpu.h xen/include/asm-ia64/vmx.h xen/include/asm-ia64/vmx_uaccess.h xen/include/asm-ia64/vmx_vcpu.h xen/include/asm-ia64/vmx_vpd.h xen/include/asm-ia64/xensystem.h xen/include/asm-x86/apicdef.h xen/include/asm-x86/config.h xen/include/asm-x86/e820.h xen/include/asm-x86/event.h xen/include/asm-x86/fixmap.h xen/include/asm-x86/genapic.h xen/include/asm-x86/hpet.h xen/include/asm-x86/io.h xen/include/asm-x86/mach-bigsmp/mach_apic.h xen/include/asm-x86/mach-default/mach_apic.h xen/include/asm-x86/mach-es7000/mach_apic.h xen/include/asm-x86/mach-generic/mach_apic.h xen/include/asm-x86/mach-summit/mach_apic.h xen/include/asm-x86/mach-summit/mach_mpparse.h xen/include/asm-x86/mm.h xen/include/asm-x86/page.h xen/include/asm-x86/shadow.h xen/include/asm-x86/shadow_64.h xen/include/asm-x86/shadow_public.h xen/include/asm-x86/time.h xen/include/asm-x86/types.h xen/include/asm-x86/vmx.h xen/include/asm-x86/vmx_virpit.h xen/include/asm-x86/vmx_vmcs.h xen/include/asm-x86/x86_32/uaccess.h xen/include/asm-x86/x86_64/page.h xen/include/public/arch-ia64.h xen/include/public/dom0_ops.h xen/include/public/grant_table.h xen/include/public/io/blkif.h xen/include/public/io/domain_controller.h xen/include/public/io/netif.h xen/include/public/trace.h xen/include/public/xen.h xen/include/xen/ac_timer.h xen/include/xen/domain.h xen/include/xen/event.h xen/include/xen/grant_table.h xen/include/xen/mm.h xen/include/xen/perfc_defn.h xen/include/xen/sched.h xen/include/xen/serial.h xen/include/xen/symbols.h xen/include/xen/time.h xen/include/xen/trace.h xen/tools/Makefile xen/tools/symbols.c
line diff
     1.1 --- a/linux-2.6-xen-sparse/arch/xen/i386/kernel/Makefile	Tue Aug 16 14:27:16 2005 -0800
     1.2 +++ b/linux-2.6-xen-sparse/arch/xen/i386/kernel/Makefile	Wed Aug 17 12:33:56 2005 -0800
     1.3 @@ -44,7 +44,7 @@ c-obj-$(CONFIG_HPET_TIMER) 	+= time_hpet
     1.4  c-obj-$(CONFIG_EFI) 		+= efi.o efi_stub.o
     1.5  c-obj-$(CONFIG_EARLY_PRINTK)	+= early_printk.o
     1.6  c-obj-$(CONFIG_SMP_ALTERNATIVES)+= smpalts.o
     1.7 -c-obj-$(CONFIG_SWIOTLB)		+= swiotlb.o
     1.8 +obj-$(CONFIG_SWIOTLB)		+= swiotlb.o
     1.9  
    1.10  EXTRA_AFLAGS   := -traditional
    1.11  
     2.1 --- a/linux-2.6-xen-sparse/arch/xen/i386/kernel/i386_ksyms.c	Tue Aug 16 14:27:16 2005 -0800
     2.2 +++ b/linux-2.6-xen-sparse/arch/xen/i386/kernel/i386_ksyms.c	Wed Aug 17 12:33:56 2005 -0800
     2.3 @@ -115,9 +115,6 @@ EXPORT_SYMBOL(__copy_from_user_ll);
     2.4  EXPORT_SYMBOL(__copy_to_user_ll);
     2.5  EXPORT_SYMBOL(strnlen_user);
     2.6  
     2.7 -EXPORT_SYMBOL(dma_alloc_coherent);
     2.8 -EXPORT_SYMBOL(dma_free_coherent);
     2.9 -
    2.10  #ifdef CONFIG_PCI
    2.11  EXPORT_SYMBOL(pci_mem_start);
    2.12  #endif
     3.1 --- a/linux-2.6-xen-sparse/arch/xen/i386/kernel/pci-dma.c	Tue Aug 16 14:27:16 2005 -0800
     3.2 +++ b/linux-2.6-xen-sparse/arch/xen/i386/kernel/pci-dma.c	Wed Aug 17 12:33:56 2005 -0800
     3.3 @@ -24,13 +24,14 @@ struct dma_coherent_mem {
     3.4  	unsigned long	*bitmap;
     3.5  };
     3.6  
     3.7 -static void iommu_bug(void)
     3.8 -{
     3.9 -	printk(KERN_ALERT "Fatal DMA error! Please use 'swiotlb=force'\n");
    3.10 -	BUG();
    3.11 -}
    3.12 -
    3.13 -#define IOMMU_BUG_ON(test) do { if (unlikely(test)) iommu_bug(); } while(0)
    3.14 +#define IOMMU_BUG_ON(test)				\
    3.15 +do {							\
    3.16 +	if (unlikely(test)) {				\
    3.17 +		printk(KERN_ALERT "Fatal DMA error! "	\
    3.18 +		       "Please use 'swiotlb=force'\n");	\
    3.19 +		BUG();					\
    3.20 +	}						\
    3.21 +} while (0)
    3.22  
    3.23  int
    3.24  dma_map_sg(struct device *hwdev, struct scatterlist *sg, int nents,
     4.1 --- a/linux-2.6-xen-sparse/arch/xen/i386/mm/hypervisor.c	Tue Aug 16 14:27:16 2005 -0800
     4.2 +++ b/linux-2.6-xen-sparse/arch/xen/i386/mm/hypervisor.c	Wed Aug 17 12:33:56 2005 -0800
     4.3 @@ -35,6 +35,7 @@
     4.4  #include <asm/pgtable.h>
     4.5  #include <asm-xen/hypervisor.h>
     4.6  #include <asm-xen/balloon.h>
     4.7 +#include <linux/module.h>
     4.8  #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
     4.9  #include <linux/percpu.h>
    4.10  #include <asm/tlbflush.h>
    4.11 @@ -352,7 +353,6 @@ void xen_destroy_contiguous_region(unsig
    4.12      balloon_unlock(flags);
    4.13  }
    4.14  
    4.15 -#ifdef CONFIG_XEN_PHYSDEV_ACCESS
    4.16  
    4.17  unsigned long allocate_empty_lowmem_region(unsigned long pages)
    4.18  {
    4.19 @@ -401,4 +401,4 @@ unsigned long allocate_empty_lowmem_regi
    4.20      return vstart;
    4.21  }
    4.22  
    4.23 -#endif /* CONFIG_XEN_PHYSDEV_ACCESS */
    4.24 +EXPORT_SYMBOL(allocate_empty_lowmem_region);
     5.1 --- a/linux-2.6-xen-sparse/arch/xen/kernel/reboot.c	Tue Aug 16 14:27:16 2005 -0800
     5.2 +++ b/linux-2.6-xen-sparse/arch/xen/kernel/reboot.c	Wed Aug 17 12:33:56 2005 -0800
     5.3 @@ -256,19 +256,23 @@ static void shutdown_handler(struct xenb
     5.4      char *str;
     5.5  
     5.6      str = (char *)xenbus_read("control", "shutdown", NULL);
     5.7 -    /* Ignore read errors and recursive shutdown events. */
     5.8 -    if (IS_ERR(str) || !strcmp(str, __stringify(SHUTDOWN_INVALID)))
     5.9 +    /* Ignore read errors. */
    5.10 +    if (IS_ERR(str))
    5.11          return;
    5.12 -
    5.13 -    xenbus_printf("control", "shutdown", "%i", SHUTDOWN_INVALID);
    5.14 +    if (strlen(str) == 0) {
    5.15 +        kfree(str);
    5.16 +        return;
    5.17 +    }
    5.18  
    5.19 -    if (strcmp(str, "poweroff") == 0) {
    5.20 +    xenbus_write("control", "shutdown", "", O_CREAT);
    5.21 +
    5.22 +    if (strcmp(str, "poweroff") == 0)
    5.23          shutting_down = SHUTDOWN_POWEROFF;
    5.24 -    } else if (strcmp(str, "reboot") == 0) {
    5.25 +    else if (strcmp(str, "reboot") == 0)
    5.26          shutting_down = SHUTDOWN_REBOOT;
    5.27 -    } else if (strcmp(str, "suspend") == 0) {
    5.28 +    else if (strcmp(str, "suspend") == 0)
    5.29          shutting_down = SHUTDOWN_SUSPEND;
    5.30 -    } else {
    5.31 +    else {
    5.32          printk("Ignoring shutdown request: %s\n", str);
    5.33          shutting_down = SHUTDOWN_INVALID;
    5.34      }
     6.1 --- a/linux-2.6-xen-sparse/arch/xen/kernel/skbuff.c	Tue Aug 16 14:27:16 2005 -0800
     6.2 +++ b/linux-2.6-xen-sparse/arch/xen/kernel/skbuff.c	Wed Aug 17 12:33:56 2005 -0800
     6.3 @@ -5,8 +5,6 @@
     6.4  #include <linux/kernel.h>
     6.5  #include <linux/sched.h>
     6.6  #include <linux/slab.h>
     6.7 -#include <linux/string.h>
     6.8 -#include <linux/errno.h>
     6.9  #include <linux/netdevice.h>
    6.10  #include <linux/inetdevice.h>
    6.11  #include <linux/etherdevice.h>
    6.12 @@ -14,34 +12,86 @@
    6.13  #include <linux/init.h>
    6.14  #include <asm/io.h>
    6.15  #include <asm/page.h>
    6.16 -
    6.17 -EXPORT_SYMBOL(__dev_alloc_skb);
    6.18 +#include <asm-xen/hypervisor.h>
    6.19  
    6.20  /* Referenced in netback.c. */
    6.21  /*static*/ kmem_cache_t *skbuff_cachep;
    6.22  
    6.23 -/* Size must be cacheline-aligned (alloc_skb uses SKB_DATA_ALIGN). */
    6.24 -#define XEN_SKB_SIZE \
    6.25 -    ((PAGE_SIZE - sizeof(struct skb_shared_info)) & ~(SMP_CACHE_BYTES - 1))
    6.26 +#define MAX_SKBUFF_ORDER 2
    6.27 +static kmem_cache_t *skbuff_order_cachep[MAX_SKBUFF_ORDER + 1];
    6.28  
    6.29  struct sk_buff *__dev_alloc_skb(unsigned int length, int gfp_mask)
    6.30  {
    6.31 -    struct sk_buff *skb;
    6.32 -    skb = alloc_skb_from_cache(skbuff_cachep, length + 16, gfp_mask);
    6.33 -    if ( likely(skb != NULL) )
    6.34 -        skb_reserve(skb, 16);
    6.35 -    return skb;
    6.36 +	struct sk_buff *skb;
    6.37 +	int order;
    6.38 +
    6.39 +	length = SKB_DATA_ALIGN(length + 16);
    6.40 +	order = get_order(length + sizeof(struct skb_shared_info));
    6.41 +	if (order > MAX_SKBUFF_ORDER) {
    6.42 +		printk(KERN_ALERT "Attempt to allocate order %d skbuff. "
    6.43 +		       "Increase MAX_SKBUFF_ORDER.\n", order);
    6.44 +		return NULL;
    6.45 +	}
    6.46 +
    6.47 +	skb = alloc_skb_from_cache(
    6.48 +		skbuff_order_cachep[order], length, gfp_mask);
    6.49 +	if (skb != NULL)
    6.50 +		skb_reserve(skb, 16);
    6.51 +
    6.52 +	return skb;
    6.53  }
    6.54  
    6.55  static void skbuff_ctor(void *buf, kmem_cache_t *cachep, unsigned long unused)
    6.56  {
    6.57 -    scrub_pages(buf, 1);
    6.58 +	int order = 0;
    6.59 +
    6.60 +	while (skbuff_order_cachep[order] != cachep)
    6.61 +		order++;
    6.62 +
    6.63 +	if (order != 0)
    6.64 +		xen_create_contiguous_region((unsigned long)buf, order);
    6.65 +
    6.66 +	scrub_pages(buf, 1 << order);
    6.67 +}
    6.68 +
    6.69 +static void skbuff_dtor(void *buf, kmem_cache_t *cachep, unsigned long unused)
    6.70 +{
    6.71 +	int order = 0;
    6.72 +
    6.73 +	while (skbuff_order_cachep[order] != cachep)
    6.74 +		order++;
    6.75 +
    6.76 +	if (order != 0)
    6.77 +		xen_destroy_contiguous_region((unsigned long)buf, order);
    6.78  }
    6.79  
    6.80  static int __init skbuff_init(void)
    6.81  {
    6.82 -    skbuff_cachep = kmem_cache_create(
    6.83 -        "xen-skb", PAGE_SIZE, PAGE_SIZE, 0, skbuff_ctor, NULL);
    6.84 -    return 0;
    6.85 +	static char name[MAX_SKBUFF_ORDER + 1][20];
    6.86 +	unsigned long size;
    6.87 +	int order;
    6.88 +
    6.89 +	for (order = 0; order <= MAX_SKBUFF_ORDER; order++) {
    6.90 +		size = PAGE_SIZE << order;
    6.91 +		sprintf(name[order], "xen-skb-%lu", size);
    6.92 +		skbuff_order_cachep[order] = kmem_cache_create(
    6.93 +			name[order], size, size, 0, skbuff_ctor, skbuff_dtor);
    6.94 +	}
    6.95 +
    6.96 +	skbuff_cachep = skbuff_order_cachep[0];
    6.97 +
    6.98 +	return 0;
    6.99  }
   6.100  __initcall(skbuff_init);
   6.101 +
   6.102 +EXPORT_SYMBOL(__dev_alloc_skb);
   6.103 +
   6.104 +/*
   6.105 + * Local variables:
   6.106 + *  c-file-style: "linux"
   6.107 + *  indent-tabs-mode: t
   6.108 + *  c-indent-level: 8
   6.109 + *  c-basic-offset: 8
   6.110 + *  tab-width: 8
   6.111 + * End:
   6.112 + */
     7.1 --- a/linux-2.6-xen-sparse/arch/xen/x86_64/mm/fault.c	Tue Aug 16 14:27:16 2005 -0800
     7.2 +++ b/linux-2.6-xen-sparse/arch/xen/x86_64/mm/fault.c	Wed Aug 17 12:33:56 2005 -0800
     7.3 @@ -250,7 +250,11 @@ static int vmalloc_fault(unsigned long a
     7.4  	   happen within a race in page table update. In the later
     7.5  	   case just flush. */
     7.6  
     7.7 -	pgd = pgd_offset(current->mm ?: &init_mm, address);
     7.8 +	/* On Xen the line below does not always work. Needs investigating! */
     7.9 +	/*pgd = pgd_offset(current->mm ?: &init_mm, address);*/
    7.10 +	pgd = (pgd_t *)per_cpu(cur_pgd, smp_processor_id());
    7.11 +	pgd += pgd_index(address);
    7.12 +
    7.13  	pgd_ref = pgd_offset_k(address);
    7.14  	if (pgd_none(*pgd_ref))
    7.15  		return -1;
     8.1 --- a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_comms.h	Tue Aug 16 14:27:16 2005 -0800
     8.2 +++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_comms.h	Wed Aug 17 12:33:56 2005 -0800
     8.3 @@ -1,6 +1,33 @@
     8.4 -/* Private include for xenbus communications. */
     8.5 +/*
     8.6 + * Private include for xenbus communications.
     8.7 + * 
     8.8 + * Copyright (C) 2005 Rusty Russell, IBM Corporation
     8.9 + *
    8.10 + * This file may be distributed separately from the Linux kernel, or
    8.11 + * incorporated into other software packages, subject to the following license:
    8.12 + * 
    8.13 + * Permission is hereby granted, free of charge, to any person obtaining a copy
    8.14 + * of this source file (the "Software"), to deal in the Software without
    8.15 + * restriction, including without limitation the rights to use, copy, modify,
    8.16 + * merge, publish, distribute, sublicense, and/or sell copies of the Software,
    8.17 + * and to permit persons to whom the Software is furnished to do so, subject to
    8.18 + * the following conditions:
    8.19 + * 
    8.20 + * The above copyright notice and this permission notice shall be included in
    8.21 + * all copies or substantial portions of the Software.
    8.22 + * 
    8.23 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    8.24 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    8.25 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    8.26 + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    8.27 + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
    8.28 + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
    8.29 + * IN THE SOFTWARE.
    8.30 + */
    8.31 +
    8.32  #ifndef _XENBUS_COMMS_H
    8.33  #define _XENBUS_COMMS_H
    8.34 +
    8.35  int xs_init(void);
    8.36  int xb_init_comms(void);
    8.37  void xb_suspend_comms(void);
     9.1 --- a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c	Tue Aug 16 14:27:16 2005 -0800
     9.2 +++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c	Wed Aug 17 12:33:56 2005 -0800
     9.3 @@ -309,6 +309,7 @@ void xenbus_suspend(void)
     9.4  void xenbus_resume(void)
     9.5  {
     9.6  	xb_init_comms();
     9.7 +	reregister_xenbus_watches();
     9.8  	up(&xenbus_lock);
     9.9  }
    9.10  
    10.1 --- a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_xs.c	Tue Aug 16 14:27:16 2005 -0800
    10.2 +++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_xs.c	Wed Aug 17 12:33:56 2005 -0800
    10.3 @@ -496,6 +496,18 @@ void unregister_xenbus_watch(struct xenb
    10.4  		       watch->node, err);
    10.5  }
    10.6  
    10.7 +/* Re-register callbacks to all watches. */
    10.8 +void reregister_xenbus_watches(void)
    10.9 +{
   10.10 +	struct xenbus_watch *watch;
   10.11 +	char token[sizeof(watch) * 2 + 1];
   10.12 +
   10.13 +	list_for_each_entry(watch, &watches, list) {
   10.14 +		sprintf(token, "%lX", (long)watch);
   10.15 +		xs_watch(watch->node, token);
   10.16 +	}
   10.17 +}
   10.18 +
   10.19  static int watch_thread(void *unused)
   10.20  {
   10.21  	for (;;) {
    11.1 --- a/linux-2.6-xen-sparse/include/asm-xen/hypervisor.h	Tue Aug 16 14:27:16 2005 -0800
    11.2 +++ b/linux-2.6-xen-sparse/include/asm-xen/hypervisor.h	Wed Aug 17 12:33:56 2005 -0800
    11.3 @@ -137,10 +137,8 @@ void xen_invlpg_mask(cpumask_t *mask, un
    11.4  void xen_create_contiguous_region(unsigned long vstart, unsigned int order);
    11.5  void xen_destroy_contiguous_region(unsigned long vstart, unsigned int order);
    11.6  
    11.7 -#ifdef CONFIG_XEN_PHYSDEV_ACCESS
    11.8  /* Allocate a contiguous empty region of low memory. Return virtual start. */
    11.9  unsigned long allocate_empty_lowmem_region(unsigned long pages);
   11.10 -#endif
   11.11  
   11.12  #include <asm/hypercall.h>
   11.13  
    12.1 --- a/linux-2.6-xen-sparse/include/asm-xen/xenbus.h	Tue Aug 16 14:27:16 2005 -0800
    12.2 +++ b/linux-2.6-xen-sparse/include/asm-xen/xenbus.h	Wed Aug 17 12:33:56 2005 -0800
    12.3 @@ -1,5 +1,3 @@
    12.4 -#ifndef _ASM_XEN_XENBUS_H
    12.5 -#define _ASM_XEN_XENBUS_H
    12.6  /******************************************************************************
    12.7   * xenbus.h
    12.8   *
    12.9 @@ -28,6 +26,10 @@
   12.10   * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
   12.11   * IN THE SOFTWARE.
   12.12   */
   12.13 +
   12.14 +#ifndef _ASM_XEN_XENBUS_H
   12.15 +#define _ASM_XEN_XENBUS_H
   12.16 +
   12.17  #include <linux/device.h>
   12.18  #include <linux/notifier.h>
   12.19  #include <asm/semaphore.h>
   12.20 @@ -119,6 +121,7 @@ void unregister_xenstore_notifier(struct
   12.21  
   12.22  int register_xenbus_watch(struct xenbus_watch *watch);
   12.23  void unregister_xenbus_watch(struct xenbus_watch *watch);
   12.24 +void reregister_xenbus_watches(void);
   12.25  
   12.26  /* Called from xen core code. */
   12.27  void xenbus_suspend(void);
    13.1 --- a/tools/examples/network-bridge	Tue Aug 16 14:27:16 2005 -0800
    13.2 +++ b/tools/examples/network-bridge	Wed Aug 17 12:33:56 2005 -0800
    13.3 @@ -189,7 +189,7 @@ op_start () {
    13.4  	fi
    13.5  	ip link set ${netdev} name p${netdev}
    13.6  	ip link set veth0 name ${netdev}
    13.7 -	ifconfig p${netdev} -arp down
    13.8 +	ifconfig p${netdev} 0.0.0.0 -arp down
    13.9  	ifconfig p${netdev} hw ether fe:ff:ff:ff:ff:ff
   13.10  	ifconfig ${netdev} hw ether ${mac}
   13.11  	add_to_bridge ${bridge} vif0.0
    14.1 --- a/tools/misc/xend	Tue Aug 16 14:27:16 2005 -0800
    14.2 +++ b/tools/misc/xend	Wed Aug 17 12:33:56 2005 -0800
    14.3 @@ -117,11 +117,15 @@ def stop_xcs():
    14.4  	return    
    14.5  
    14.6  def start_xenstored():
    14.7 -    s,o = commands.getstatusoutput("/usr/sbin/xenstored --pid-file=/var/run/xenstore.pid");
    14.8 +    XENSTORED_TRACE = os.getenv("XENSTORED_TRACE")
    14.9 +    cmd = "/usr/sbin/xenstored --pid-file=/var/run/xenstore.pid"
   14.10 +    if XENSTORED_TRACE:
   14.11 +        cmd += " -T /var/log/xenstored-trace.log"
   14.12 +    s,o = commands.getstatusoutput(cmd)
   14.13  
   14.14  def start_consoled():
   14.15      if os.fork() == 0:
   14.16 -        os.execvp('/usr/sbin/xenconsoled', ['/usr/sbin/xenconsoled']);
   14.17 +        os.execvp('/usr/sbin/xenconsoled', ['/usr/sbin/xenconsoled'])
   14.18              
   14.19  def main():
   14.20      try:
    15.1 --- a/tools/python/xen/xend/XendDomain.py	Tue Aug 16 14:27:16 2005 -0800
    15.2 +++ b/tools/python/xen/xend/XendDomain.py	Wed Aug 17 12:33:56 2005 -0800
    15.3 @@ -320,8 +320,7 @@ class XendDomain:
    15.4          @param vmconfig: vm configuration
    15.5          """
    15.6          config = sxp.child_value(vmconfig, 'config')
    15.7 -        uuid = sxp.child_value(vmconfig, 'uuid')
    15.8 -        dominfo = XendDomainInfo.restore(self.dbmap, config, uuid=uuid)
    15.9 +        dominfo = XendDomainInfo.restore(self.dbmap, config)
   15.10          return dominfo
   15.11  
   15.12      def domain_restore(self, src, progress=False):
    16.1 --- a/tools/python/xen/xend/XendDomainInfo.py	Tue Aug 16 14:27:16 2005 -0800
    16.2 +++ b/tools/python/xen/xend/XendDomainInfo.py	Wed Aug 17 12:33:56 2005 -0800
    16.3 @@ -195,19 +195,22 @@ class XendDomainInfo:
    16.4  
    16.5      recreate = classmethod(recreate)
    16.6  
    16.7 -    def restore(cls, parentdb, config, uuid):
    16.8 +    def restore(cls, parentdb, config, uuid=None):
    16.9          """Create a domain and a VM object to do a restore.
   16.10  
   16.11          @param parentdb:  parent db
   16.12          @param config:    domain configuration
   16.13          @param uuid:      uuid to use
   16.14          """
   16.15 +        if not uuid:
   16.16 +            uuid = getUuid()
   16.17          db = parentdb.addChild(uuid)
   16.18          vm = cls(db)
   16.19          ssidref = int(sxp.child_value(config, 'ssidref'))
   16.20          log.debug('restoring with ssidref='+str(ssidref))
   16.21          id = xc.domain_create(ssidref = ssidref)
   16.22          vm.setdom(id)
   16.23 +        vm.clear_shutdown()
   16.24          try:
   16.25              vm.restore = True
   16.26              vm.construct(config)
   16.27 @@ -979,6 +982,11 @@ class XendDomainInfo:
   16.28          if not reason in ['suspend']:
   16.29              self.shutdown_pending = {'start':time.time(), 'reason':reason}
   16.30  
   16.31 +    def clear_shutdown(self):
   16.32 +        db = self.db.addChild("/control")
   16.33 +        db['shutdown'] = ""
   16.34 +        db.saveDB(save=True)
   16.35 +
   16.36      def send_sysrq(self, key=0):
   16.37          db = self.db.addChild("/control");
   16.38          db['sysrq'] = '%c' % key;
    17.1 --- a/tools/python/xen/xm/create.py	Tue Aug 16 14:27:16 2005 -0800
    17.2 +++ b/tools/python/xen/xm/create.py	Wed Aug 17 12:33:56 2005 -0800
    17.3 @@ -380,7 +380,6 @@ def randomMAC():
    17.4  
    17.5      @return: MAC address string
    17.6      """
    17.7 -    random.seed()
    17.8      mac = [ 0xaa, 0x00, 0x00,
    17.9              random.randint(0x00, 0x7f),
   17.10              random.randint(0x00, 0xff),
   17.11 @@ -689,6 +688,7 @@ def balloon_out(dom0_min_mem, opts):
   17.12      del xc
   17.13  
   17.14  def main(argv):
   17.15 +    random.seed()
   17.16      opts = gopts
   17.17      args = opts.parse(argv)
   17.18      if opts.vals.help:
    18.1 --- a/tools/xenstore/xenstored.h	Tue Aug 16 14:27:16 2005 -0800
    18.2 +++ b/tools/xenstore/xenstored.h	Wed Aug 17 12:33:56 2005 -0800
    18.3 @@ -1,21 +1,29 @@
    18.4 -/* 
    18.5 -    Simple prototyle Xen Store Daemon providing simple tree-like database.
    18.6 -    Copyright (C) 2005 Rusty Russell IBM Corporation
    18.7 -
    18.8 -    This program is free software; you can redistribute it and/or modify
    18.9 -    it under the terms of the GNU General Public License as published by
   18.10 -    the Free Software Foundation; either version 2 of the License, or
   18.11 -    (at your option) any later version.
   18.12 +/*
   18.13 + * Simple prototyle Xen Store Daemon providing simple tree-like database.
   18.14 + * Copyright (C) 2005 Rusty Russell IBM Corporation
   18.15 + *
   18.16 + * This file may be distributed separately from the Linux kernel, or
   18.17 + * incorporated into other software packages, subject to the following license:
   18.18 + * 
   18.19 + * Permission is hereby granted, free of charge, to any person obtaining a copy
   18.20 + * of this source file (the "Software"), to deal in the Software without
   18.21 + * restriction, including without limitation the rights to use, copy, modify,
   18.22 + * merge, publish, distribute, sublicense, and/or sell copies of the Software,
   18.23 + * and to permit persons to whom the Software is furnished to do so, subject to
   18.24 + * the following conditions:
   18.25 + * 
   18.26 + * The above copyright notice and this permission notice shall be included in
   18.27 + * all copies or substantial portions of the Software.
   18.28 + * 
   18.29 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
   18.30 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
   18.31 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
   18.32 + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
   18.33 + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
   18.34 + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
   18.35 + * IN THE SOFTWARE.
   18.36 + */
   18.37  
   18.38 -    This program is distributed in the hope that it will be useful,
   18.39 -    but WITHOUT ANY WARRANTY; without even the implied warranty of
   18.40 -    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   18.41 -    GNU General Public License for more details.
   18.42 -
   18.43 -    You should have received a copy of the GNU General Public License
   18.44 -    along with this program; if not, write to the Free Software
   18.45 -    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   18.46 -*/
   18.47  #ifndef _XENSTORED_H
   18.48  #define _XENSTORED_H
   18.49  
    19.1 --- a/xen/arch/ia64/xenmisc.c	Tue Aug 16 14:27:16 2005 -0800
    19.2 +++ b/xen/arch/ia64/xenmisc.c	Wed Aug 17 12:33:56 2005 -0800
    19.3 @@ -280,7 +280,6 @@ void cs01foo(void) {}
    19.4  
    19.5  unsigned long context_switch_count = 0;
    19.6  
    19.7 -// context_switch
    19.8  void context_switch(struct vcpu *prev, struct vcpu *next)
    19.9  {
   19.10  //printk("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
   19.11 @@ -290,22 +289,14 @@ void context_switch(struct vcpu *prev, s
   19.12  //if (prev->domain->domain_id == 0 && next->domain->domain_id == 1) cs01foo();
   19.13  //printk("@@sw %d->%d\n",prev->domain->domain_id,next->domain->domain_id);
   19.14  #ifdef CONFIG_VTI
   19.15 -	unsigned long psr;
   19.16 -	/* Interrupt is enabled after next task is chosen.
   19.17 -	 * So we have to disable it for stack switch.
   19.18 -	 */
   19.19 -	local_irq_save(psr);
   19.20  	vtm_domain_out(prev);
   19.21 -	/* Housekeeping for prev domain */
   19.22 -#endif // CONFIG_VTI
   19.23 -
   19.24 +#endif
   19.25  	context_switch_count++;
   19.26  	switch_to(prev,next,prev);
   19.27  #ifdef CONFIG_VTI
   19.28 -	/* Post-setup for new domain */
   19.29  	 vtm_domain_in(current);
   19.30 -	local_irq_restore(psr);
   19.31 -#endif // CONFIG_VTI
   19.32 +#endif
   19.33 +
   19.34  // leave this debug for now: it acts as a heartbeat when more than
   19.35  // one domain is active
   19.36  {
   19.37 @@ -315,25 +306,27 @@ int id = ((struct vcpu *)current)->domai
   19.38  if (!cnt[id]--) { printk("%x",id); cnt[id] = 500000; }
   19.39  if (!i--) { printk("+",id); i = 1000000; }
   19.40  }
   19.41 -	clear_bit(_VCPUF_running, &prev->vcpu_flags);
   19.42 -	//if (!is_idle_task(next->domain) )
   19.43 -		//send_guest_virq(next, VIRQ_TIMER);
   19.44 +
   19.45  #ifdef CONFIG_VTI
   19.46  	if (VMX_DOMAIN(current))
   19.47  		vmx_load_all_rr(current);
   19.48 -	return;
   19.49 -#else // CONFIG_VTI
   19.50 +#else
   19.51  	if (!is_idle_task(current->domain)) {
   19.52  		load_region_regs(current);
   19.53  		if (vcpu_timer_expired(current)) vcpu_pend_timer(current);
   19.54  	}
   19.55  	if (vcpu_timer_expired(current)) vcpu_pend_timer(current);
   19.56 -#endif // CONFIG_VTI
   19.57 +#endif
   19.58 +}
   19.59 +
   19.60 +void context_switch_finalise(struct vcpu *next)
   19.61 +{
   19.62 +	/* nothing to do */
   19.63  }
   19.64  
   19.65  void continue_running(struct vcpu *same)
   19.66  {
   19.67 -    /* nothing to do */
   19.68 +	/* nothing to do */
   19.69  }
   19.70  
   19.71  void panic_domain(struct pt_regs *regs, const char *fmt, ...)
    20.1 --- a/xen/arch/x86/domain.c	Tue Aug 16 14:27:16 2005 -0800
    20.2 +++ b/xen/arch/x86/domain.c	Wed Aug 17 12:33:56 2005 -0800
    20.3 @@ -48,6 +48,8 @@ boolean_param("noreboot", opt_noreboot);
    20.4  
    20.5  struct percpu_ctxt {
    20.6      struct vcpu *curr_vcpu;
    20.7 +    unsigned int context_not_finalised;
    20.8 +    unsigned int dirty_segment_mask;
    20.9  } __cacheline_aligned;
   20.10  static struct percpu_ctxt percpu_ctxt[NR_CPUS];
   20.11  
   20.12 @@ -541,51 +543,59 @@ void toggle_guest_mode(struct vcpu *v)
   20.13      __r; })
   20.14  
   20.15  #if CONFIG_VMX
   20.16 -#define load_msrs(_p, _n)     if (vmx_switch_on) vmx_load_msrs((_p), (_n))
   20.17 +#define load_msrs(n)     if (vmx_switch_on) vmx_load_msrs(n)
   20.18  #else
   20.19 -#define load_msrs(_p, _n)     ((void)0)
   20.20 +#define load_msrs(n)     ((void)0)
   20.21  #endif 
   20.22  
   20.23 -static void load_segments(struct vcpu *p, struct vcpu *n)
   20.24 +/*
   20.25 + * save_segments() writes a mask of segments which are dirty (non-zero),
   20.26 + * allowing load_segments() to avoid some expensive segment loads and
   20.27 + * MSR writes.
   20.28 + */
   20.29 +#define DIRTY_DS           0x01
   20.30 +#define DIRTY_ES           0x02
   20.31 +#define DIRTY_FS           0x04
   20.32 +#define DIRTY_GS           0x08
   20.33 +#define DIRTY_FS_BASE      0x10
   20.34 +#define DIRTY_GS_BASE_USER 0x20
   20.35 +
   20.36 +static void load_segments(struct vcpu *n)
   20.37  {
   20.38 -    struct vcpu_guest_context *pctxt = &p->arch.guest_context;
   20.39      struct vcpu_guest_context *nctxt = &n->arch.guest_context;
   20.40      int all_segs_okay = 1;
   20.41 +    unsigned int dirty_segment_mask, cpu = smp_processor_id();
   20.42 +
   20.43 +    /* Load and clear the dirty segment mask. */
   20.44 +    dirty_segment_mask = percpu_ctxt[cpu].dirty_segment_mask;
   20.45 +    percpu_ctxt[cpu].dirty_segment_mask = 0;
   20.46  
   20.47      /* Either selector != 0 ==> reload. */
   20.48 -    if ( unlikely(pctxt->user_regs.ds | nctxt->user_regs.ds) )
   20.49 +    if ( unlikely((dirty_segment_mask & DIRTY_DS) | nctxt->user_regs.ds) )
   20.50          all_segs_okay &= loadsegment(ds, nctxt->user_regs.ds);
   20.51  
   20.52      /* Either selector != 0 ==> reload. */
   20.53 -    if ( unlikely(pctxt->user_regs.es | nctxt->user_regs.es) )
   20.54 +    if ( unlikely((dirty_segment_mask & DIRTY_ES) | nctxt->user_regs.es) )
   20.55          all_segs_okay &= loadsegment(es, nctxt->user_regs.es);
   20.56  
   20.57      /*
   20.58       * Either selector != 0 ==> reload.
   20.59       * Also reload to reset FS_BASE if it was non-zero.
   20.60       */
   20.61 -    if ( unlikely(pctxt->user_regs.fs |
   20.62 -                  pctxt->fs_base |
   20.63 +    if ( unlikely((dirty_segment_mask & (DIRTY_FS | DIRTY_FS_BASE)) |
   20.64                    nctxt->user_regs.fs) )
   20.65 -    {
   20.66          all_segs_okay &= loadsegment(fs, nctxt->user_regs.fs);
   20.67 -        if ( pctxt->user_regs.fs ) /* != 0 selector kills fs_base */
   20.68 -            pctxt->fs_base = 0;
   20.69 -    }
   20.70  
   20.71      /*
   20.72       * Either selector != 0 ==> reload.
   20.73       * Also reload to reset GS_BASE if it was non-zero.
   20.74       */
   20.75 -    if ( unlikely(pctxt->user_regs.gs |
   20.76 -                  pctxt->gs_base_user |
   20.77 +    if ( unlikely((dirty_segment_mask & (DIRTY_GS | DIRTY_GS_BASE_USER)) |
   20.78                    nctxt->user_regs.gs) )
   20.79      {
   20.80          /* Reset GS_BASE with user %gs? */
   20.81 -        if ( pctxt->user_regs.gs || !nctxt->gs_base_user )
   20.82 +        if ( (dirty_segment_mask & DIRTY_GS) || !nctxt->gs_base_user )
   20.83              all_segs_okay &= loadsegment(gs, nctxt->user_regs.gs);
   20.84 -        if ( pctxt->user_regs.gs ) /* != 0 selector kills gs_base_user */
   20.85 -            pctxt->gs_base_user = 0;
   20.86      }
   20.87  
   20.88      /* This can only be non-zero if selector is NULL. */
   20.89 @@ -650,7 +660,9 @@ static void load_segments(struct vcpu *p
   20.90  
   20.91  static void save_segments(struct vcpu *v)
   20.92  {
   20.93 -    struct cpu_user_regs *regs = &v->arch.guest_context.user_regs;
   20.94 +    struct vcpu_guest_context *ctxt = &v->arch.guest_context;
   20.95 +    struct cpu_user_regs      *regs = &ctxt->user_regs;
   20.96 +    unsigned int dirty_segment_mask = 0;
   20.97  
   20.98      if ( VMX_DOMAIN(v) )
   20.99          rdmsrl(MSR_SHADOW_GS_BASE, v->arch.arch_vmx.msr_content.shadow_gs);
  20.100 @@ -659,18 +671,34 @@ static void save_segments(struct vcpu *v
  20.101      __asm__ __volatile__ ( "movl %%es,%0" : "=m" (regs->es) );
  20.102      __asm__ __volatile__ ( "movl %%fs,%0" : "=m" (regs->fs) );
  20.103      __asm__ __volatile__ ( "movl %%gs,%0" : "=m" (regs->gs) );
  20.104 -}
  20.105  
  20.106 -static void clear_segments(void)
  20.107 -{
  20.108 -    __asm__ __volatile__ (
  20.109 -        " movl %0,%%ds; "
  20.110 -        " movl %0,%%es; "
  20.111 -        " movl %0,%%fs; "
  20.112 -        " movl %0,%%gs; "
  20.113 -        ""safe_swapgs"  "
  20.114 -        " movl %0,%%gs"
  20.115 -        : : "r" (0) );
  20.116 +    if ( regs->ds )
  20.117 +        dirty_segment_mask |= DIRTY_DS;
  20.118 +
  20.119 +    if ( regs->es )
  20.120 +        dirty_segment_mask |= DIRTY_ES;
  20.121 +
  20.122 +    if ( regs->fs )
  20.123 +    {
  20.124 +        dirty_segment_mask |= DIRTY_FS;
  20.125 +        ctxt->fs_base = 0; /* != 0 selector kills fs_base */
  20.126 +    }
  20.127 +    else if ( ctxt->fs_base )
  20.128 +    {
  20.129 +        dirty_segment_mask |= DIRTY_FS_BASE;
  20.130 +    }
  20.131 +
  20.132 +    if ( regs->gs )
  20.133 +    {
  20.134 +        dirty_segment_mask |= DIRTY_GS;
  20.135 +        ctxt->gs_base_user = 0; /* != 0 selector kills gs_base_user */
  20.136 +    }
  20.137 +    else if ( ctxt->gs_base_user )
  20.138 +    {
  20.139 +        dirty_segment_mask |= DIRTY_GS_BASE_USER;
  20.140 +    }
  20.141 +
  20.142 +    percpu_ctxt[smp_processor_id()].dirty_segment_mask = dirty_segment_mask;
  20.143  }
  20.144  
  20.145  long do_switch_to_user(void)
  20.146 @@ -706,10 +734,9 @@ long do_switch_to_user(void)
  20.147  
  20.148  #elif defined(__i386__)
  20.149  
  20.150 -#define load_segments(_p, _n) ((void)0)
  20.151 -#define load_msrs(_p, _n)     ((void)0)
  20.152 -#define save_segments(_p)     ((void)0)
  20.153 -#define clear_segments()      ((void)0)
  20.154 +#define load_segments(n) ((void)0)
  20.155 +#define load_msrs(n)     ((void)0)
  20.156 +#define save_segments(p) ((void)0)
  20.157  
  20.158  static inline void switch_kernel_stack(struct vcpu *n, unsigned int cpu)
  20.159  {
  20.160 @@ -726,9 +753,9 @@ static inline void switch_kernel_stack(s
  20.161  static void __context_switch(void)
  20.162  {
  20.163      struct cpu_user_regs *stack_regs = guest_cpu_user_regs();
  20.164 -    unsigned int         cpu = smp_processor_id();
  20.165 -    struct vcpu  *p = percpu_ctxt[cpu].curr_vcpu;
  20.166 -    struct vcpu  *n = current;
  20.167 +    unsigned int          cpu = smp_processor_id();
  20.168 +    struct vcpu          *p = percpu_ctxt[cpu].curr_vcpu;
  20.169 +    struct vcpu          *n = current;
  20.170  
  20.171      if ( !is_idle_task(p->domain) )
  20.172      {
  20.173 @@ -786,23 +813,31 @@ static void __context_switch(void)
  20.174  
  20.175  void context_switch(struct vcpu *prev, struct vcpu *next)
  20.176  {
  20.177 -    struct vcpu *realprev;
  20.178 +    unsigned int cpu = smp_processor_id();
  20.179  
  20.180 -    local_irq_disable();
  20.181 +    ASSERT(!local_irq_is_enabled());
  20.182  
  20.183      set_current(next);
  20.184  
  20.185 -    if ( ((realprev = percpu_ctxt[smp_processor_id()].curr_vcpu) == next) || 
  20.186 -         is_idle_task(next->domain) )
  20.187 -    {
  20.188 -        local_irq_enable();
  20.189 -    }
  20.190 -    else
  20.191 +    if ( (percpu_ctxt[cpu].curr_vcpu != next) && !is_idle_task(next->domain) )
  20.192      {
  20.193          __context_switch();
  20.194 +        percpu_ctxt[cpu].context_not_finalised = 1;
  20.195 +    }
  20.196 +}
  20.197  
  20.198 -        local_irq_enable();
  20.199 -        
  20.200 +void context_switch_finalise(struct vcpu *next)
  20.201 +{
  20.202 +    unsigned int cpu = smp_processor_id();
  20.203 +
  20.204 +    ASSERT(local_irq_is_enabled());
  20.205 +
  20.206 +    if ( percpu_ctxt[cpu].context_not_finalised )
  20.207 +    {
  20.208 +        percpu_ctxt[cpu].context_not_finalised = 0;
  20.209 +
  20.210 +        BUG_ON(percpu_ctxt[cpu].curr_vcpu != next);
  20.211 +
  20.212          if ( VMX_DOMAIN(next) )
  20.213          {
  20.214              vmx_restore_msrs(next);
  20.215 @@ -810,19 +845,11 @@ void context_switch(struct vcpu *prev, s
  20.216          else
  20.217          {
  20.218              load_LDT(next);
  20.219 -            load_segments(realprev, next);
  20.220 -            load_msrs(realprev, next);
  20.221 +            load_segments(next);
  20.222 +            load_msrs(next);
  20.223          }
  20.224      }
  20.225  
  20.226 -    /*
  20.227 -     * We do this late on because it doesn't need to be protected by the
  20.228 -     * schedule_lock, and because we want this to be the very last use of
  20.229 -     * 'prev' (after this point, a dying domain's info structure may be freed
  20.230 -     * without warning). 
  20.231 -     */
  20.232 -    clear_bit(_VCPUF_running, &prev->vcpu_flags);
  20.233 -
  20.234      schedule_tail(next);
  20.235      BUG();
  20.236  }
  20.237 @@ -835,12 +862,19 @@ void continue_running(struct vcpu *same)
  20.238  
  20.239  int __sync_lazy_execstate(void)
  20.240  {
  20.241 -    if ( percpu_ctxt[smp_processor_id()].curr_vcpu == current )
  20.242 -        return 0;
  20.243 -    __context_switch();
  20.244 -    load_LDT(current);
  20.245 -    clear_segments();
  20.246 -    return 1;
  20.247 +    unsigned long flags;
  20.248 +    int switch_required;
  20.249 +
  20.250 +    local_irq_save(flags);
  20.251 +
  20.252 +    switch_required = (percpu_ctxt[smp_processor_id()].curr_vcpu != current);
  20.253 +
  20.254 +    if ( switch_required )
  20.255 +        __context_switch();
  20.256 +
  20.257 +    local_irq_restore(flags);
  20.258 +
  20.259 +    return switch_required;
  20.260  }
  20.261  
  20.262  void sync_lazy_execstate_cpu(unsigned int cpu)
    21.1 --- a/xen/arch/x86/vmx.c	Tue Aug 16 14:27:16 2005 -0800
    21.2 +++ b/xen/arch/x86/vmx.c	Wed Aug 17 12:33:56 2005 -0800
    21.3 @@ -65,7 +65,7 @@ static u32 msr_data_index[VMX_MSR_COUNT]
    21.4   * are not modified once set for generic domains, we don't save them, 
    21.5   * but simply reset them to the values set at percpu_traps_init().
    21.6   */
    21.7 -void vmx_load_msrs(struct vcpu *p, struct vcpu *n)
    21.8 +void vmx_load_msrs(struct vcpu *n)
    21.9  {
   21.10      struct msr_state *host_state;
   21.11      host_state = &percpu_msr[smp_processor_id()];
    22.1 --- a/xen/common/schedule.c	Tue Aug 16 14:27:16 2005 -0800
    22.2 +++ b/xen/common/schedule.c	Wed Aug 17 12:33:56 2005 -0800
    22.3 @@ -474,13 +474,14 @@ static void __enter_scheduler(void)
    22.4  
    22.5      set_ac_timer(&schedule_data[cpu].s_timer, now + r_time);
    22.6  
    22.7 -    /* Must be protected by the schedule_lock! */
    22.8 -    set_bit(_VCPUF_running, &next->vcpu_flags);
    22.9 +    if ( unlikely(prev == next) )
   22.10 +    {
   22.11 +        spin_unlock_irq(&schedule_data[cpu].schedule_lock);
   22.12 +        return continue_running(prev);
   22.13 +    }
   22.14  
   22.15 -    spin_unlock_irq(&schedule_data[cpu].schedule_lock);
   22.16 -
   22.17 -    if ( unlikely(prev == next) )
   22.18 -        return continue_running(prev);
   22.19 +    clear_bit(_VCPUF_running, &prev->vcpu_flags);
   22.20 +    set_bit(_VCPUF_running, &next->vcpu_flags);
   22.21  
   22.22      perfc_incrc(sched_ctx);
   22.23  
   22.24 @@ -517,6 +518,10 @@ static void __enter_scheduler(void)
   22.25               next->domain->domain_id, next->vcpu_id);
   22.26  
   22.27      context_switch(prev, next);
   22.28 +
   22.29 +    spin_unlock_irq(&schedule_data[cpu].schedule_lock);
   22.30 +
   22.31 +    context_switch_finalise(next);
   22.32  }
   22.33  
   22.34  /* No locking needed -- pointer comparison is safe :-) */
    23.1 --- a/xen/include/asm-x86/e820.h	Tue Aug 16 14:27:16 2005 -0800
    23.2 +++ b/xen/include/asm-x86/e820.h	Wed Aug 17 12:33:56 2005 -0800
    23.3 @@ -3,7 +3,7 @@
    23.4  
    23.5  #include <asm/page.h>
    23.6  
    23.7 -#define E820MAX	32
    23.8 +#define E820MAX	128
    23.9  
   23.10  #define E820_RAM          1
   23.11  #define E820_RESERVED     2
    24.1 --- a/xen/include/asm-x86/vmx_vmcs.h	Tue Aug 16 14:27:16 2005 -0800
    24.2 +++ b/xen/include/asm-x86/vmx_vmcs.h	Wed Aug 17 12:33:56 2005 -0800
    24.3 @@ -28,10 +28,10 @@ extern int start_vmx(void);
    24.4  extern void stop_vmx(void);
    24.5  
    24.6  #if defined (__x86_64__)
    24.7 -extern void vmx_load_msrs(struct vcpu *p, struct vcpu *n);
    24.8 +extern void vmx_load_msrs(struct vcpu *n);
    24.9  void vmx_restore_msrs(struct vcpu *d);
   24.10  #else
   24.11 -#define vmx_load_msrs(_p, _n)      ((void)0)
   24.12 +#define vmx_load_msrs(_n)          ((void)0)
   24.13  #define vmx_restore_msrs(_v)       ((void)0)
   24.14  #endif
   24.15  
    25.1 --- a/xen/include/xen/sched.h	Tue Aug 16 14:27:16 2005 -0800
    25.2 +++ b/xen/include/xen/sched.h	Wed Aug 17 12:33:56 2005 -0800
    25.3 @@ -258,12 +258,32 @@ extern void sync_lazy_execstate_mask(cpu
    25.4  extern void sync_lazy_execstate_all(void);
    25.5  extern int __sync_lazy_execstate(void);
    25.6  
    25.7 -/* Called by the scheduler to switch to another vcpu. */
    25.8 +/*
    25.9 + * Called by the scheduler to switch to another VCPU. On entry, although
   25.10 + * VCPUF_running is no longer asserted for @prev, its context is still running
   25.11 + * on the local CPU and is not committed to memory. The local scheduler lock
   25.12 + * is therefore still held, and interrupts are disabled, because the local CPU
   25.13 + * is in an inconsistent state.
   25.14 + * 
   25.15 + * The callee must ensure that the local CPU is no longer running in @prev's
   25.16 + * context, and that the context is saved to memory, before returning.
   25.17 + * Alternatively, if implementing lazy context switching, it suffices to ensure
   25.18 + * that invoking __sync_lazy_execstate() will switch and commit @prev's state.
   25.19 + */
   25.20  extern void context_switch(
   25.21      struct vcpu *prev, 
   25.22      struct vcpu *next);
   25.23  
   25.24 -/* Called by the scheduler to continue running the current vcpu. */
   25.25 +/*
   25.26 + * On some architectures (notably x86) it is not possible to entirely load
   25.27 + * @next's context with interrupts disabled. These may implement a function to
   25.28 + * finalise loading the new context after interrupts are re-enabled. This
   25.29 + * function is not given @prev and is not permitted to access it.
   25.30 + */
   25.31 +extern void context_switch_finalise(
   25.32 +    struct vcpu *next);
   25.33 +
   25.34 +/* Called by the scheduler to continue running the current VCPU. */
   25.35  extern void continue_running(
   25.36      struct vcpu *same);
   25.37