[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] merge with xen-unstable.hg
# HG changeset patch # User Isaku Yamahata <yamahata@xxxxxxxxxxxxx> # Date 1216350761 -32400 # Node ID 400e5d4877caacf9a9da96b3fe47e76024e27b44 # Parent eb0fc71cfc72ed15ed35fa17617b7cab32164029 # Parent a8603b2fb786958f8e74e9b6d6356eb1beec5b68 merge with xen-unstable.hg --- stubdom/binutils.patch | 12 stubdom/gcc.patch | 28 tools/firmware/vgabios/vbetables.h | 1282 ----- .hgignore | 7 Config.mk | 8 Makefile | 18 buildconfigs/mk.linux-2.6-tip-latest | 14 buildconfigs/src.git-clone | 60 config/StdGNU.mk | 3 docs/ChangeLog | 3 extras/mini-os/Config.mk | 12 extras/mini-os/Makefile | 4 extras/mini-os/arch/ia64/minios-ia64.lds | 6 extras/mini-os/arch/x86/minios-x86_32.lds | 6 extras/mini-os/arch/x86/minios-x86_64.lds | 6 extras/mini-os/arch/x86/mm.c | 2 extras/mini-os/blkfront.c | 21 extras/mini-os/events.c | 26 extras/mini-os/fbfront.c | 19 extras/mini-os/fs-front.c | 2 extras/mini-os/hypervisor.c | 3 extras/mini-os/include/arch/cc.h | 6 extras/mini-os/include/arch/sys_arch.h | 6 extras/mini-os/include/blkfront.h | 4 extras/mini-os/include/byteswap.h | 2 extras/mini-os/include/console.h | 4 extras/mini-os/include/ctype.h | 5 extras/mini-os/include/err.h | 2 extras/mini-os/include/errno.h | 9 extras/mini-os/include/events.h | 3 extras/mini-os/include/fbfront.h | 2 extras/mini-os/include/fs.h | 4 extras/mini-os/include/hypervisor.h | 4 extras/mini-os/include/ia64/arch_spinlock.h | 2 extras/mini-os/include/ia64/atomic.h | 2 extras/mini-os/include/ia64/efi.h | 2 extras/mini-os/include/ia64/endian.h | 2 extras/mini-os/include/ia64/hypercall-ia64.h | 4 extras/mini-os/include/ia64/os.h | 6 extras/mini-os/include/lib.h | 4 extras/mini-os/include/linux/types.h | 2 extras/mini-os/include/mm.h | 6 extras/mini-os/include/netfront.h | 2 extras/mini-os/include/pcifront.h | 28 extras/mini-os/include/posix/fcntl.h | 11 extras/mini-os/include/posix/limits.h | 41 extras/mini-os/include/posix/sys/mman.h | 3 extras/mini-os/include/posix/sys/select.h | 1 extras/mini-os/include/posix/unistd.h | 5 extras/mini-os/include/sched.h | 9 extras/mini-os/include/semaphore.h | 4 extras/mini-os/include/spinlock.h | 4 extras/mini-os/include/sys/lock.h | 52 extras/mini-os/include/time.h | 2 extras/mini-os/include/types.h | 8 extras/mini-os/include/wait.h | 27 extras/mini-os/include/waittypes.h | 26 extras/mini-os/include/x86/arch_sched.h | 2 extras/mini-os/include/x86/arch_spinlock.h | 4 extras/mini-os/include/x86/os.h | 6 extras/mini-os/include/x86/x86_32/hypercall-x86_32.h | 2 extras/mini-os/include/x86/x86_64/hypercall-x86_64.h | 2 extras/mini-os/include/xmalloc.h | 2 extras/mini-os/kernel.c | 28 extras/mini-os/lib/ctype.c | 2 extras/mini-os/lib/printf.c | 1 extras/mini-os/lib/sys.c | 20 extras/mini-os/lib/xmalloc.c | 4 extras/mini-os/lock.c | 111 extras/mini-os/lwip-net.c | 10 extras/mini-os/main.c | 2 extras/mini-os/minios.mk | 7 extras/mini-os/mm.c | 2 extras/mini-os/netfront.c | 28 extras/mini-os/pcifront.c | 364 + extras/mini-os/sched.c | 6 extras/mini-os/xenbus/xenbus.c | 53 stubdom/Makefile | 261 - stubdom/grub.patches/00cvs | 872 +++ stubdom/grub.patches/99minios | 24 stubdom/grub/Makefile | 10 stubdom/grub/mini-os.c | 4 stubdom/libpci.config.h | 2 stubdom/libpci.config.mak | 5 stubdom/lwip.patch-cvs | 1512 ++++++ stubdom/newlib.patch | 234 stubdom/pciutils.patch | 94 tools/Makefile | 35 tools/blktap/drivers/Makefile | 7 tools/blktap/drivers/blktapctrl.c | 109 tools/blktap/drivers/blktapctrl.h | 23 tools/blktap/drivers/blktapctrl_linux.c | 109 tools/blktap/drivers/block-aio.c | 16 tools/blktap/drivers/block-qcow.c | 22 tools/blktap/drivers/block-ram.c | 16 tools/blktap/drivers/block-sync.c | 18 tools/blktap/drivers/img2qcow.c | 6 tools/blktap/drivers/qcow-create.c | 2 tools/blktap/drivers/qcow2raw.c | 6 tools/blktap/drivers/tapdisk.c | 10 tools/blktap/lib/blktaplib.h | 9 tools/blktap/lib/xenbus.c | 6 tools/console/daemon/io.c | 2 tools/examples/network-bridge | 13 tools/examples/vscsi | 22 tools/examples/vtpm-common.sh | 4 tools/examples/xen-backend.agent | 3 tools/examples/xen-backend.rules | 1 tools/examples/xmexample.hvm | 23 tools/examples/xmexample.vti | 22 tools/examples/xmexample1 | 25 tools/examples/xmexample2 | 24 tools/firmware/hvmloader/acpi/build.c | 8 tools/firmware/hvmloader/config.h | 11 tools/firmware/hvmloader/hvmloader.c | 23 tools/firmware/hvmloader/mp_tables.c | 19 tools/firmware/hvmloader/smp.c | 3 tools/firmware/hvmloader/util.h | 6 tools/firmware/rombios/32bit/tcgbios/tcgbios.c | 4 tools/firmware/rombios/32bit/tcgbios/tpm_drivers.c | 12 tools/firmware/rombios/32bit/util.c | 6 tools/firmware/rombios/rombios.c | 24 tools/firmware/vgabios/ChangeLog | 204 tools/firmware/vgabios/Makefile | 16 tools/firmware/vgabios/README | 28 tools/firmware/vgabios/TODO | 4 tools/firmware/vgabios/biossums.c | 220 tools/firmware/vgabios/clext.c | 24 tools/firmware/vgabios/vbe.c | 516 +- tools/firmware/vgabios/vbe.h | 25 tools/firmware/vgabios/vbe_display_api.txt | 78 tools/firmware/vgabios/vbetables-gen.c | 240 + tools/firmware/vgabios/vgabios.c | 389 + tools/firmware/vgabios/vgatables.h | 528 +- tools/fs-back/fs-backend.c | 7 tools/fs-back/fs-backend.h | 6 tools/fs-back/fs-ops.c | 82 tools/include/xen-sys/MiniOS/privcmd.h | 18 tools/ioemu/Makefile.target | 2 tools/ioemu/hw/e1000.c | 53 tools/ioemu/hw/pass-through.c | 2395 +++++++++- tools/ioemu/hw/pass-through.h | 175 tools/ioemu/hw/pci.c | 35 tools/ioemu/hw/pt-msi.c | 583 -- tools/ioemu/hw/pt-msi.h | 44 tools/ioemu/hw/vga.c | 207 tools/ioemu/hw/xen_platform.c | 98 tools/ioemu/sdl.c | 3 tools/ioemu/target-i386-dm/exec-dm.c | 4 tools/ioemu/vl.c | 5 tools/ioemu/vl.h | 2 tools/ioemu/xenstore.c | 4 tools/libfsimage/ext2fs/fsys_ext2fs.c | 6 tools/libfsimage/fat/fsys_fat.c | 6 tools/libfsimage/iso9660/fsys_iso9660.c | 6 tools/libfsimage/reiserfs/fsys_reiserfs.c | 6 tools/libfsimage/ufs/fsys_ufs.c | 6 tools/libfsimage/zfs/fsys_zfs.c | 6 tools/libxc/xc_domain.c | 63 tools/libxc/xc_minios.c | 1 tools/libxc/xc_misc.c | 30 tools/libxc/xc_private.c | 2 tools/libxc/xenctrl.h | 26 tools/libxc/xg_private.h | 3 tools/misc/xenperf.c | 4 tools/python/xen/lowlevel/acm/acm.c | 2 tools/python/xen/lowlevel/xc/xc.c | 57 tools/python/xen/util/pci.py | 667 ++ tools/python/xen/util/vscsi_util.py | 133 tools/python/xen/xend/XendAPI.py | 20 tools/python/xen/xend/XendCheckpoint.py | 2 tools/python/xen/xend/XendConfig.py | 175 tools/python/xen/xend/XendDPCI.py | 154 tools/python/xen/xend/XendDevices.py | 3 tools/python/xen/xend/XendDomain.py | 3 tools/python/xen/xend/XendDomainInfo.py | 280 - tools/python/xen/xend/XendError.py | 11 tools/python/xen/xend/XendNode.py | 54 tools/python/xen/xend/XendPPCI.py | 158 tools/python/xen/xend/image.py | 2 tools/python/xen/xend/osdep.py | 10 tools/python/xen/xend/server/DevController.py | 8 tools/python/xen/xend/server/XMLRPCServer.py | 9 tools/python/xen/xend/server/pciif.py | 75 tools/python/xen/xend/server/vscsiif.py | 232 tools/python/xen/xm/create.py | 103 tools/python/xen/xm/main.py | 137 tools/xcutils/xc_save.c | 123 tools/xenmon/xenbaked.c | 89 tools/xenstat/xentop/xentop.c | 2 tools/xenstore/talloc.c | 2 tools/xenstore/tdb.c | 4 tools/xenstore/xenstore_client.c | 2 tools/xenstore/xenstored_core.c | 17 tools/xentrace/xenctx.c | 32 tools/xentrace/xentrace.c | 28 tools/xm-test/tests/security-acm/10_security-acm_pol_update.py | 5 xen/arch/ia64/xen/fw_emul.c | 5 xen/arch/x86/acpi/cpu_idle.c | 23 xen/arch/x86/acpi/cpufreq/cpufreq_ondemand.c | 2 xen/arch/x86/cpu/intel.c | 32 xen/arch/x86/cpu/mcheck/Makefile | 3 xen/arch/x86/cpu/mcheck/amd_f10.c | 131 xen/arch/x86/cpu/mcheck/amd_k8.c | 324 + xen/arch/x86/cpu/mcheck/amd_nonfatal.c | 303 + xen/arch/x86/cpu/mcheck/k7.c | 7 xen/arch/x86/cpu/mcheck/mce.c | 566 ++ xen/arch/x86/cpu/mcheck/mce.h | 26 xen/arch/x86/cpu/mcheck/non-fatal.c | 30 xen/arch/x86/cpu/mcheck/x86_mca.h | 72 xen/arch/x86/domain.c | 17 xen/arch/x86/domctl.c | 51 xen/arch/x86/hpet.c | 15 xen/arch/x86/hvm/hvm.c | 142 xen/arch/x86/hvm/mtrr.c | 27 xen/arch/x86/hvm/rtc.c | 65 xen/arch/x86/hvm/svm/svm.c | 6 xen/arch/x86/hvm/svm/vmcb.c | 4 xen/arch/x86/hvm/vlapic.c | 5 xen/arch/x86/hvm/vmx/vmcs.c | 6 xen/arch/x86/hvm/vmx/vmx.c | 21 xen/arch/x86/i8259.c | 7 xen/arch/x86/irq.c | 42 xen/arch/x86/mm/hap/p2m-ept.c | 95 xen/arch/x86/mm/p2m.c | 22 xen/arch/x86/mm/shadow/common.c | 285 - xen/arch/x86/mm/shadow/multi.c | 85 xen/arch/x86/mm/shadow/private.h | 11 xen/arch/x86/msi.c | 228 xen/arch/x86/nmi.c | 4 xen/arch/x86/physdev.c | 30 xen/arch/x86/setup.c | 2 xen/arch/x86/smpboot.c | 4 xen/arch/x86/time.c | 210 xen/arch/x86/traps.c | 125 xen/arch/x86/x86_32/asm-offsets.c | 6 xen/arch/x86/x86_32/entry.S | 36 xen/arch/x86/x86_32/traps.c | 9 xen/arch/x86/x86_64/asm-offsets.c | 6 xen/arch/x86/x86_64/compat/entry.S | 35 xen/arch/x86/x86_64/compat/traps.c | 9 xen/arch/x86/x86_64/entry.S | 35 xen/arch/x86/x86_64/mm.c | 3 xen/arch/x86/x86_64/traps.c | 9 xen/common/domain.c | 10 xen/common/domctl.c | 17 xen/common/event_channel.c | 34 xen/common/hvm/save.c | 6 xen/common/memory.c | 36 xen/common/page_alloc.c | 3 xen/common/sched_sedf.c | 26 xen/common/stop_machine.c | 1 xen/common/version.c | 1 xen/drivers/acpi/reboot.c | 1 xen/drivers/passthrough/Makefile | 1 xen/drivers/passthrough/amd/Makefile | 1 xen/drivers/passthrough/amd/iommu_intr.c | 205 xen/drivers/passthrough/amd/iommu_map.c | 49 xen/drivers/passthrough/amd/pci_amd_iommu.c | 133 xen/drivers/passthrough/io.c | 36 xen/drivers/passthrough/iommu.c | 79 xen/drivers/passthrough/pci.c | 203 xen/drivers/passthrough/vtd/dmar.c | 389 - xen/drivers/passthrough/vtd/dmar.h | 44 xen/drivers/passthrough/vtd/extern.h | 1 xen/drivers/passthrough/vtd/intremap.c | 4 xen/drivers/passthrough/vtd/iommu.c | 481 -- xen/drivers/passthrough/vtd/qinval.c | 4 xen/drivers/passthrough/vtd/utils.c | 75 xen/include/Makefile | 1 xen/include/acpi/cpufreq/processor_perf.h | 2 xen/include/asm-x86/domain.h | 14 xen/include/asm-x86/event.h | 7 xen/include/asm-x86/hvm/hvm.h | 1 xen/include/asm-x86/hvm/support.h | 3 xen/include/asm-x86/hvm/svm/amd-iommu-defs.h | 66 xen/include/asm-x86/hvm/svm/amd-iommu-proto.h | 14 xen/include/asm-x86/hvm/vmx/vmx.h | 4 xen/include/asm-x86/hvm/vpt.h | 4 xen/include/asm-x86/io_apic.h | 4 xen/include/asm-x86/mm.h | 9 xen/include/asm-x86/msi.h | 4 xen/include/asm-x86/msr-index.h | 3 xen/include/asm-x86/mtrr.h | 3 xen/include/asm-x86/perfc_defn.h | 9 xen/include/asm-x86/time.h | 4 xen/include/asm-x86/traps.h | 50 xen/include/public/arch-x86/xen-mca.h | 279 + xen/include/public/arch-x86/xen.h | 4 xen/include/public/domctl.h | 16 xen/include/public/hvm/hvm_op.h | 21 xen/include/public/io/fsif.h | 2 xen/include/public/io/pciif.h | 6 xen/include/public/memory.h | 26 xen/include/public/physdev.h | 11 xen/include/public/xen-compat.h | 2 xen/include/xen/event.h | 12 xen/include/xen/hvm/iommu.h | 5 xen/include/xen/iommu.h | 15 xen/include/xen/pci.h | 42 xen/include/xen/sched.h | 21 xen/include/xen/time.h | 2 xen/include/xsm/xsm.h | 6 xen/xsm/dummy.c | 6 304 files changed, 15866 insertions(+), 4761 deletions(-) diff -r eb0fc71cfc72 -r 400e5d4877ca .hgignore --- a/.hgignore Tue Jul 08 11:41:43 2008 +0900 +++ b/.hgignore Fri Jul 18 12:12:41 2008 +0900 @@ -135,9 +135,8 @@ ^tools/firmware/rombios/_rombios[^/]*_\.c$ ^tools/firmware/rombios/rombios[^/]*\.s$ ^tools/firmware/rombios/32bit/32bitbios_flat\.h$ -^tools/firmware/vmxassist/gen$ -^tools/firmware/vmxassist/offsets\.h$ -^tools/firmware/vmxassist/vmxassist$ +^tools/firmware/vgabios/vbetables-gen$ +^tools/firmware/vgabios/vbetables\.h$ ^tools/flask/loadpolicy/flask-loadpolicy$ ^tools/include/xen/.*$ ^tools/include/xen-foreign/.*\.(c|h|size)$ @@ -248,6 +247,8 @@ ^tools/xm-test/lib/XmTestLib/config.py$ ^tools/xm-test/lib/XmTestReport/xmtest.py$ ^tools/xm-test/tests/.*\.test$ +^tools/ioemu-remote +^tools/ioemu-dir$ ^xen/\.banner.*$ ^xen/BLOG$ ^xen/System.map$ diff -r eb0fc71cfc72 -r 400e5d4877ca Config.mk --- a/Config.mk Tue Jul 08 11:41:43 2008 +0900 +++ b/Config.mk Fri Jul 18 12:12:41 2008 +0900 @@ -78,6 +78,14 @@ FLASK_ENABLE ?= n FLASK_ENABLE ?= n ACM_SECURITY ?= n +QEMU_REMOTE=http://xenbits.xensource.com/git-http/qemu-xen-unstable.git + +# Specify which qemu-dm to use. This may be `ioemu' to use the old +# Mercurial in-tree version, or a local directory, or a git URL. +# CONFIG_QEMU ?= ioemu +# CONFIG_QEMU ?= ../qemu-xen.git +CONFIG_QEMU ?= $(QEMU_REMOTE) + # Optional components XENSTAT_XENTOP ?= y VTPM_TOOLS ?= n diff -r eb0fc71cfc72 -r 400e5d4877ca Makefile --- a/Makefile Tue Jul 08 11:41:43 2008 +0900 +++ b/Makefile Fri Jul 18 12:12:41 2008 +0900 @@ -15,12 +15,13 @@ include buildconfigs/Rules.mk # build and install everything into the standard system directories .PHONY: install -install: install-xen install-kernels install-tools install-docs +install: install-xen install-kernels install-tools install-stubdom install-docs .PHONY: build build: kernels $(MAKE) -C xen build $(MAKE) -C tools build + $(MAKE) -C stubdom build $(MAKE) -C docs build # The test target is for unit tests that can run without an installation. Of @@ -33,7 +34,7 @@ test: # build and install everything into local dist directory .PHONY: dist dist: DESTDIR=$(DISTDIR)/install -dist: dist-xen dist-kernels dist-tools dist-docs +dist: dist-xen dist-kernels dist-tools dist-stubdom dist-docs $(INSTALL_DIR) $(DISTDIR)/check $(INSTALL_DATA) ./COPYING $(DISTDIR) $(INSTALL_DATA) ./README $(DISTDIR) @@ -44,10 +45,11 @@ dist-%: install-% @: # do nothing # Legacy dist targets -.PHONY: xen tools kernels docs +.PHONY: xen tools stubdom kernels docs xen: dist-xen tools: dist-tools kernels: dist-kernels +stubdom: dist-stubdom docs: dist-docs .PHONY: prep-kernels @@ -65,6 +67,10 @@ install-tools: .PHONY: install-kernels install-kernels: for i in $(XKERNELS) ; do $(MAKE) $$i-install || exit 1; done + +.PHONY: install-stubdom +install-stubdom: + $(MAKE) -C stubdom install .PHONY: install-docs install-docs: @@ -102,6 +108,7 @@ clean:: clean:: $(MAKE) -C xen clean $(MAKE) -C tools clean + $(MAKE) -C stubdom crossclean $(MAKE) -C docs clean # clean, but blow away kernel build tree plus tarballs @@ -109,6 +116,7 @@ distclean: distclean: $(MAKE) -C xen distclean $(MAKE) -C tools distclean + $(MAKE) -C stubdom distclean $(MAKE) -C docs distclean rm -rf dist patches/tmp for i in $(ALLKERNELS) ; do $(MAKE) $$i-delete ; done @@ -132,6 +140,7 @@ help: @echo ' install-xen - build and install the Xen hypervisor' @echo ' install-tools - build and install the control tools' @echo ' install-kernels - build and install guest kernels' + @echo ' install-stubdom - build and install the stubdomain images' @echo ' install-docs - build and install user documentation' @echo '' @echo 'Building targets:' @@ -140,6 +149,7 @@ help: @echo ' trees then make dist' @echo ' xen - build and install Xen hypervisor' @echo ' tools - build and install tools' + @echo ' stubdomain - build and install the stubdomain images' @echo ' kernels - build and install guest kernels' @echo ' kbuild - synonym for make kernels' @echo ' docs - build and install user documentation' @@ -214,7 +224,7 @@ linux26: # tboot targets # -TBOOT_TARFILE = tboot-20071128.tar.gz +TBOOT_TARFILE = tboot-20080613.tar.gz TBOOT_BASE_URL = http://downloads.sourceforge.net/tboot .PHONY: build-tboot diff -r eb0fc71cfc72 -r 400e5d4877ca buildconfigs/mk.linux-2.6-tip-latest --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildconfigs/mk.linux-2.6-tip-latest Fri Jul 18 12:12:41 2008 +0900 @@ -0,0 +1,14 @@ +XEN_LINUX_SOURCE ?= git-clone +LINUX_VER ?= 2.6-x86-latest + +IMAGE_TARGET ?= bzImage vmlinux + +XEN_LINUX_CONFIG_UPDATE := buildconfigs/enable-xen-config + +XEN_LINUX_GIT_URL ?= git://git.kernel.org/pub/scm/linux/kernel/git/x86/linux-2.6-tip.git +XEN_LINUX_GIT_REMOTENAME ?= x86 +XEN_LINUX_GIT_REMOTEBRANCH ?= auto-latest + +EXTRAVERSION ?= + +include buildconfigs/mk.linux-2.6-common diff -r eb0fc71cfc72 -r 400e5d4877ca buildconfigs/src.git-clone --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildconfigs/src.git-clone Fri Jul 18 12:12:41 2008 +0900 @@ -0,0 +1,60 @@ +# Mercurial +GIT ?= git + +LINUX_SRCDIR ?= linux-$(LINUX_VER).git + +# The URL of the remote GIT repository +ifeq ($(XEN_LINUX_GIT_URL),) +.ERROR: XEN_LINUX_GIT_URL not specified +endif + +# The name to use for the remote repository +XEN_LINUX_GIT_REMOTENAME ?= origin + +# The branch in the remote repository +ifeq ($(XEN_LINUX_GIT_REMOTEBRANCH),) +.ERROR: XEN_LINUX_GIT_REMOTEBRANCH not specified +endif + +XEN_LINUX_GIT_LOCALBRANCH ?= master + +# Set XEN_LINUX_GITREV to update to a particlar revision. +XEN_LINUX_GITREV ?= + +$(LINUX_SRCDIR)/.valid-src: $(__XEN_LINUX_UPDATE) + @set -e ; if [ -d $(LINUX_SRCDIR) ] && [ ! -d $(GIT_DIR) ] ; then \ + echo "$(LINUX_SRCDIR) exists but is not a git repository." 1>&2 ; \ + false ; \ + fi + + @set -e ; if [ ! -e $(LINUX_SRCDIR)/.git ] ; then \ + mkdir $(LINUX_SRCDIR) ; \ + cd $(LINUX_SRCDIR) ; \ + $(GIT) init-db ; \ + fi + + @set -e ; cd $(LINUX_SRCDIR) ; \ + if ! $(GIT) remote | grep -q $(XEN_LINUX_GIT_REMOTENAME) ; then \ + echo "Adding remote git repository \`$(XEN_LINUX_GIT_URL)' as \`$(XEN_LINUX_GIT_REMOTENAME)'" ; \ + $(GIT) remote add $(XEN_LINUX_GIT_REMOTENAME) $(XEN_LINUX_GIT_URL) ; \ + fi + + @echo "Updating remote \`$(XEN_LINUX_GIT_REMOTENAME)'" + @cd $(LINUX_SRCDIR) && $(GIT) fetch $(XEN_LINUX_GIT_REMOTENAME) + + @set -e ; cd $(LINUX_SRCDIR) ; \ + if ! $(GIT) branch -l | grep -q $(XEN_LINUX_GIT_LOCALBRANCH) ; then \ + $(GIT) branch --track $(XEN_LINUX_GIT_LOCALBRANCH) \ + $(XEN_LINUX_GIT_REMOTENAME)/$(XEN_LINUX_GIT_REMOTEBRANCH) ; \ + $(GIT) checkout ; \ + fi + + @ set -e ; cd $(LINUX_SRCDIR) ; \ + if [ -n "$(XEN_LINUX_GITREV)" ] ; then \ + echo "Updating $(LINUX_SRCDIR) to revision \'$(XEN_LINUX_GITREV)'." ; \ + $(GIT) reset --hard $(XEN_LINUX_GITREV) ; \ + else \ + $(GIT) reset --hard $(XEN_LINUX_GIT_REMOTENAME)/$(XEN_LINUX_GIT_REMOTEBRANCH) ; \ + fi + + touch $@ diff -r eb0fc71cfc72 -r 400e5d4877ca config/StdGNU.mk --- a/config/StdGNU.mk Tue Jul 08 11:41:43 2008 +0900 +++ b/config/StdGNU.mk Fri Jul 18 12:12:41 2008 +0900 @@ -12,6 +12,9 @@ SIZEUTIL = $(CROSS_COMPILE)size MSGFMT = msgfmt MSGMERGE = msgmerge + +# Allow git to be wrappered in the environment +GIT ?= git INSTALL = install INSTALL_DIR = $(INSTALL) -d -m0755 -p diff -r eb0fc71cfc72 -r 400e5d4877ca docs/ChangeLog --- a/docs/ChangeLog Tue Jul 08 11:41:43 2008 +0900 +++ b/docs/ChangeLog Fri Jul 18 12:12:41 2008 +0900 @@ -15,6 +15,9 @@ http://lists.xensource.com/archives/html Xen 3.3 release --------------- + +17974: PHYSDEVOP_manage_pci_add/PHYSDEVOP_manage_pci_remove +http://xenbits.xensource.com/xen-unstable.hg?rev/183ca809e1d7 17903: Add greater than 16 xvd device availability http://xenbits.xensource.com/xen-unstable.hg?rev/0728459b3c8d diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/Config.mk --- a/extras/mini-os/Config.mk Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/Config.mk Fri Jul 18 12:12:41 2008 +0900 @@ -38,20 +38,20 @@ EXTRA_INC = $(ARCH_INC) # This must be before include minios.mk! include $(MINI-OS_ROOT)/$(TARGET_ARCH_DIR)/arch.mk -extra_incl := $(foreach dir,$(EXTRA_INC),-I$(MINI-OS_ROOT)/include/$(dir)) +extra_incl := $(foreach dir,$(EXTRA_INC),-isystem $(CURDIR)/$(MINI-OS_ROOT)/include/$(dir)) -DEF_CPPFLAGS += -I$(MINI-OS_ROOT)/include +DEF_CPPFLAGS += -isystem $(CURDIR)/$(MINI-OS_ROOT)/include DEF_CPPFLAGS += -D__MINIOS__ ifeq ($(libc),y) DEF_CPPFLAGS += -DHAVE_LIBC -DEF_CPPFLAGS += -I$(MINI-OS_ROOT)/include/posix -DEF_CPPFLAGS += -I$(XEN_ROOT)/tools/xenstore +DEF_CPPFLAGS += -isystem $(CURDIR)/$(MINI-OS_ROOT)/include/posix +DEF_CPPFLAGS += -isystem $(CURDIR)/$(XEN_ROOT)/tools/xenstore endif ifneq ($(LWIPDIR),) lwip=y DEF_CPPFLAGS += -DHAVE_LWIP -DEF_CPPFLAGS += -I$(LWIPDIR)/src/include -DEF_CPPFLAGS += -I$(LWIPDIR)/src/include/ipv4 +DEF_CPPFLAGS += -isystem $(LWIPDIR)/src/include +DEF_CPPFLAGS += -isystem $(LWIPDIR)/src/include/ipv4 endif diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/Makefile --- a/extras/mini-os/Makefile Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/Makefile Fri Jul 18 12:12:41 2008 +0900 @@ -55,6 +55,8 @@ endif .PHONY: links links: $(ARCH_LINKS) [ -e include/xen ] || ln -sf ../../../xen/include/public include/xen + [ -e include/mini-os ] || ln -sf . include/mini-os + [ -e include/$(TARGET_ARCH_FAM)/mini-os ] || ln -sf . include/$(TARGET_ARCH_FAM)/mini-os .PHONY: arch_lib arch_lib: @@ -89,7 +91,7 @@ endif endif $(OBJ_DIR)/$(TARGET)_app.o: $(APP_OBJS) app.lds - $(LD) -r -d $(LDFLAGS) $^ $(APP_LDLIBS) --undefined main -o $@ + $(LD) -r -d $(LDFLAGS) -\( $^ -\) $(APP_LDLIBS) --undefined main -o $@ $(OBJ_DIR)/$(TARGET): links $(OBJS) $(OBJ_DIR)/$(TARGET)_app.o arch_lib $(LD) -r $(LDFLAGS) $(HEAD_OBJ) $(OBJ_DIR)/$(TARGET)_app.o $(OBJS) $(LDARCHLIB) $(LDLIBS) -o $@.o diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/arch/ia64/minios-ia64.lds --- a/extras/mini-os/arch/ia64/minios-ia64.lds Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/arch/ia64/minios-ia64.lds Fri Jul 18 12:12:41 2008 +0900 @@ -55,8 +55,8 @@ SECTIONS .ctors : { __CTOR_LIST__ = .; QUAD((__CTOR_END__ - __CTOR_LIST__) / 8 - 2) - *(SORT_BY_NAME(.ctors)) - SORT_BY_NAME(CONSTRUCTORS) + *(.ctors) + CONSTRUCTORS QUAD(0) __CTOR_END__ = .; } @@ -64,7 +64,7 @@ SECTIONS .dtors : { __DTOR_LIST__ = .; QUAD((__DTOR_END__ - __DTOR_LIST__) / 8 - 2) - *(SORT_BY_NAME(.dtors)) + *(.dtors) QUAD(0) __DTOR_END__ = .; } diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/arch/x86/minios-x86_32.lds --- a/extras/mini-os/arch/x86/minios-x86_32.lds Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/arch/x86/minios-x86_32.lds Fri Jul 18 12:12:41 2008 +0900 @@ -31,8 +31,8 @@ SECTIONS .ctors : { __CTOR_LIST__ = .; LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2) - *(SORT_BY_NAME(.ctors)) - SORT_BY_NAME(CONSTRUCTORS) + *(.ctors) + CONSTRUCTORS LONG(0) __CTOR_END__ = .; } @@ -40,7 +40,7 @@ SECTIONS .dtors : { __DTOR_LIST__ = .; LONG((__DTOR_END__ - __DTOR_LIST__) / 4 - 2) - *(SORT_BY_NAME(.dtors)) + *(.dtors) LONG(0) __DTOR_END__ = .; } diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/arch/x86/minios-x86_64.lds --- a/extras/mini-os/arch/x86/minios-x86_64.lds Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/arch/x86/minios-x86_64.lds Fri Jul 18 12:12:41 2008 +0900 @@ -31,8 +31,8 @@ SECTIONS .ctors : { __CTOR_LIST__ = .; QUAD((__CTOR_END__ - __CTOR_LIST__) / 8 - 2) - *(SORT_BY_NAME(.ctors)) - SORT_BY_NAME(CONSTRUCTORS) + *(.ctors) + CONSTRUCTORS QUAD(0) __CTOR_END__ = .; } @@ -40,7 +40,7 @@ SECTIONS .dtors : { __DTOR_LIST__ = .; QUAD((__DTOR_END__ - __DTOR_LIST__) / 8 - 2) - *(SORT_BY_NAME(.dtors)) + *(.dtors) QUAD(0) __DTOR_END__ = .; } diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/arch/x86/mm.c --- a/extras/mini-os/arch/x86/mm.c Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/arch/x86/mm.c Fri Jul 18 12:12:41 2008 +0900 @@ -549,7 +549,7 @@ void arch_init_p2m(unsigned long max_pfn #define L2_P2M_MASK (L2_P2M_ENTRIES - 1) #define L3_P2M_MASK (L3_P2M_ENTRIES - 1) - unsigned long *l1_list, *l2_list, *l3_list; + unsigned long *l1_list = NULL, *l2_list = NULL, *l3_list; unsigned long pfn; l3_list = (unsigned long *)alloc_page(); diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/blkfront.c --- a/extras/mini-os/blkfront.c Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/blkfront.c Fri Jul 18 12:12:41 2008 +0900 @@ -84,7 +84,7 @@ static void free_blkfront(struct blkfron free(dev); } -struct blkfront_dev *init_blkfront(char *nodename, struct blkfront_info *info) +struct blkfront_dev *init_blkfront(char *_nodename, struct blkfront_info *info) { xenbus_transaction_t xbt; char* err; @@ -93,11 +93,9 @@ struct blkfront_dev *init_blkfront(char int retry=0; char* msg; char* c; + char* nodename = _nodename ? _nodename : "device/vbd/768"; struct blkfront_dev *dev; - - if (!nodename) - nodename = "device/vbd/768"; char path[strlen(nodename) + 1 + 10 + 1]; @@ -342,13 +340,14 @@ void blkfront_io(struct blkfront_aiocb * void blkfront_io(struct blkfront_aiocb *aiocbp, int write) { unsigned long flags; + DEFINE_WAIT(w); + ASSERT(!aiocbp->aio_cb); aiocbp->aio_cb = blkfront_aio_cb; blkfront_aio(aiocbp, write); aiocbp->data = NULL; local_irq_save(flags); - DEFINE_WAIT(w); while (1) { blkfront_aio_poll(aiocbp->aio_dev); if (aiocbp->data) @@ -393,6 +392,7 @@ void blkfront_sync(struct blkfront_dev * void blkfront_sync(struct blkfront_dev *dev) { unsigned long flags; + DEFINE_WAIT(w); if (dev->info.mode == O_RDWR) { if (dev->info.barrier == 1) @@ -404,7 +404,6 @@ void blkfront_sync(struct blkfront_dev * /* Note: This won't finish if another thread enqueues requests. */ local_irq_save(flags); - DEFINE_WAIT(w); while (1) { blkfront_aio_poll(dev); if (RING_FREE_REQUESTS(&dev->ring) == RING_SIZE(&dev->ring)) @@ -424,6 +423,7 @@ int blkfront_aio_poll(struct blkfront_de RING_IDX rp, cons; struct blkif_response *rsp; int more; + int nr_consumed; moretodo: #ifdef HAVE_LIBC @@ -437,14 +437,17 @@ moretodo: rmb(); /* Ensure we see queued responses up to 'rp'. */ cons = dev->ring.rsp_cons; - int nr_consumed = 0; + nr_consumed = 0; while ((cons != rp)) { + struct blkfront_aiocb *aiocbp; + int status; + rsp = RING_GET_RESPONSE(&dev->ring, cons); nr_consumed++; - struct blkfront_aiocb *aiocbp = (void*) (uintptr_t) rsp->id; - int status = rsp->status; + aiocbp = (void*) (uintptr_t) rsp->id; + status = rsp->status; if (status != BLKIF_RSP_OKAY) printk("block error %d for op %d\n", status, rsp->operation); diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/events.c --- a/extras/mini-os/events.c Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/events.c Fri Jul 18 12:12:41 2008 +0900 @@ -136,6 +136,23 @@ evtchn_port_t bind_virq(uint32_t virq, e return op.port; } +evtchn_port_t bind_pirq(uint32_t pirq, int will_share, evtchn_handler_t handler, void *data) +{ + evtchn_bind_pirq_t op; + + /* Try to bind the pirq to a port */ + op.pirq = pirq; + op.flags = will_share ? BIND_PIRQ__WILL_SHARE : 0; + + if ( HYPERVISOR_event_channel_op(EVTCHNOP_bind_pirq, &op) != 0 ) + { + printk("Failed to bind physical IRQ %d\n", pirq); + return -1; + } + bind_evtchn(op.port, handler, data); + return op.port; +} + #if defined(__x86_64__) char irqstack[2 * STACK_SIZE]; @@ -190,10 +207,11 @@ int evtchn_alloc_unbound(domid_t pal, ev int evtchn_alloc_unbound(domid_t pal, evtchn_handler_t handler, void *data, evtchn_port_t *port) { + int err; evtchn_alloc_unbound_t op; op.dom = DOMID_SELF; op.remote_dom = pal; - int err = HYPERVISOR_event_channel_op(EVTCHNOP_alloc_unbound, &op); + err = HYPERVISOR_event_channel_op(EVTCHNOP_alloc_unbound, &op); if (err) return err; *port = bind_evtchn(op.port, handler, data); @@ -207,13 +225,15 @@ int evtchn_bind_interdomain(domid_t pal, evtchn_handler_t handler, void *data, evtchn_port_t *local_port) { + int err; + evtchn_port_t port; evtchn_bind_interdomain_t op; op.remote_dom = pal; op.remote_port = remote_port; - int err = HYPERVISOR_event_channel_op(EVTCHNOP_bind_interdomain, &op); + err = HYPERVISOR_event_channel_op(EVTCHNOP_bind_interdomain, &op); if (err) return err; - evtchn_port_t port = op.local_port; + port = op.local_port; *local_port = bind_evtchn(port, handler, data); return err; } diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/fbfront.c --- a/extras/mini-os/fbfront.c Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/fbfront.c Fri Jul 18 12:12:41 2008 +0900 @@ -64,7 +64,7 @@ static void free_kbdfront(struct kbdfron free(dev); } -struct kbdfront_dev *init_kbdfront(char *nodename, int abs_pointer) +struct kbdfront_dev *init_kbdfront(char *_nodename, int abs_pointer) { xenbus_transaction_t xbt; char* err; @@ -72,11 +72,8 @@ struct kbdfront_dev *init_kbdfront(char struct xenkbd_page *s; int retry=0; char* msg; - + char* nodename = _nodename ? _nodename : "device/vkbd/0"; struct kbdfront_dev *dev; - - if (!nodename) - nodename = "device/vkbd/0"; char path[strlen(nodename) + 1 + 10 + 1]; @@ -351,7 +348,7 @@ int fbfront_receive(struct fbfront_dev * return i; } -struct fbfront_dev *init_fbfront(char *nodename, unsigned long *mfns, int width, int height, int depth, int stride, int n) +struct fbfront_dev *init_fbfront(char *_nodename, unsigned long *mfns, int width, int height, int depth, int stride, int n) { xenbus_transaction_t xbt; char* err; @@ -361,9 +358,9 @@ struct fbfront_dev *init_fbfront(char *n char* msg; int i, j; struct fbfront_dev *dev; - - if (!nodename) - nodename = "device/vfb/0"; + int max_pd; + unsigned long mapped; + char* nodename = _nodename ? _nodename : "device/vfb/0"; char path[strlen(nodename) + 1 + 10 + 1]; @@ -392,8 +389,8 @@ struct fbfront_dev *init_fbfront(char *n dev->offset = 0; dev->events = NULL; - const int max_pd = sizeof(s->pd) / sizeof(s->pd[0]); - unsigned long mapped = 0; + max_pd = sizeof(s->pd) / sizeof(s->pd[0]); + mapped = 0; for (i = 0; mapped < n && i < max_pd; i++) { unsigned long *pd = (unsigned long *) alloc_page(); diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/fs-front.c --- a/extras/mini-os/fs-front.c Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/fs-front.c Fri Jul 18 12:12:41 2008 +0900 @@ -3,7 +3,7 @@ * * Frontend driver for FS split device driver. * - * Copyright (c) 2007, Grzegorz Milos, Sun Microsystems, Inc. + * Copyright (c) 2007, Grzegorz Milos, <gm281@xxxxxxxxx>. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/hypervisor.c --- a/extras/mini-os/hypervisor.c Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/hypervisor.c Fri Jul 18 12:12:41 2008 +0900 @@ -72,9 +72,10 @@ void do_hypervisor_callback(struct pt_re void force_evtchn_callback(void) { + int save; vcpu_info_t *vcpu; vcpu = &HYPERVISOR_shared_info->vcpu_info[smp_processor_id()]; - int save = vcpu->evtchn_upcall_mask; + save = vcpu->evtchn_upcall_mask; while (vcpu->evtchn_upcall_pending) { vcpu->evtchn_upcall_mask = 1; diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/arch/cc.h --- a/extras/mini-os/include/arch/cc.h Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/include/arch/cc.h Fri Jul 18 12:12:41 2008 +0900 @@ -10,8 +10,8 @@ #define __LWIP_ARCH_CC_H__ /* Typedefs for the types used by lwip - */ -#include <os.h> -#include <types.h> +#include <mini-os/os.h> +#include <mini-os/types.h> #include <time.h> typedef u8 u8_t; typedef s8 s8_t; @@ -46,7 +46,7 @@ extern void lwip_die(char *fmt, ...); /* If the compiler does not provide memset() this file must include a */ /* definition of it, or include a file which defines it. */ -#include <lib.h> +#include <mini-os/lib.h> /* This file must either include a system-local <errno.h> which defines */ /* the standard *nix error codes, or it should #define LWIP_PROVIDE_ERRNO */ diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/arch/sys_arch.h --- a/extras/mini-os/include/arch/sys_arch.h Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/include/arch/sys_arch.h Fri Jul 18 12:12:41 2008 +0900 @@ -9,9 +9,9 @@ #ifndef __LWIP_ARCH_SYS_ARCH_H__ #define __LWIP_ARCH_SYS_ARCH_H__ -#include <os.h> -#include <xmalloc.h> -#include <semaphore.h> +#include <mini-os/os.h> +#include <mini-os/xmalloc.h> +#include <mini-os/semaphore.h> typedef struct semaphore *sys_sem_t; #define SYS_SEM_NULL ((sys_sem_t) NULL) diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/blkfront.h --- a/extras/mini-os/include/blkfront.h Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/include/blkfront.h Fri Jul 18 12:12:41 2008 +0900 @@ -1,6 +1,6 @@ -#include <wait.h> +#include <mini-os/wait.h> #include <xen/io/blkif.h> -#include <types.h> +#include <mini-os/types.h> struct blkfront_dev; struct blkfront_aiocb { diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/byteswap.h --- a/extras/mini-os/include/byteswap.h Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/include/byteswap.h Fri Jul 18 12:12:41 2008 +0900 @@ -3,7 +3,7 @@ /* Unfortunately not provided by newlib. */ -#include <types.h> +#include <mini-os/types.h> static inline uint16_t bswap_16(uint16_t x) { return diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/console.h --- a/extras/mini-os/include/console.h Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/include/console.h Fri Jul 18 12:12:41 2008 +0900 @@ -36,8 +36,8 @@ #ifndef _LIB_CONSOLE_H_ #define _LIB_CONSOLE_H_ -#include<os.h> -#include<traps.h> +#include<mini-os/os.h> +#include<mini-os/traps.h> #include<stdarg.h> void print(int direct, const char *fmt, va_list args); diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/ctype.h --- a/extras/mini-os/include/ctype.h Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/include/ctype.h Fri Jul 18 12:12:41 2008 +0900 @@ -1,6 +1,9 @@ #ifndef _CTYPE_H #define _CTYPE_H +#ifdef HAVE_LIBC +#include_next <ctype.h> +#else /* * NOTE! This ctype does not handle EOF like the standard C * library is required to. @@ -53,3 +56,5 @@ static inline unsigned char __toupper(un #define toupper(c) __toupper(c) #endif + +#endif diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/err.h --- a/extras/mini-os/include/err.h Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/include/err.h Fri Jul 18 12:12:41 2008 +0900 @@ -1,7 +1,7 @@ #ifndef _ERR_H #define _ERR_H -#include <errno.h> +#include <mini-os/errno.h> /* * Kernel pointers have redundant information, so we can use a diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/errno.h --- a/extras/mini-os/include/errno.h Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/include/errno.h Fri Jul 18 12:12:41 2008 +0900 @@ -1,7 +1,9 @@ #ifndef _ERRNO_H #define _ERRNO_H -#include <errno-base.h> +#include <mini-os/errno-base.h> + +typedef int error_t; #define EDEADLK 35 /* Resource deadlock would occur */ #define ENAMETOOLONG 36 /* File name too long */ @@ -107,8 +109,11 @@ #define EOWNERDEAD 130 /* Owner died */ #define ENOTRECOVERABLE 131 /* State not recoverable */ + +#define EFTYPE 132 /* Inappropriate file type or format */ + #ifdef HAVE_LIBC -#include <sched.h> +#include <mini-os/sched.h> extern int errno; #define ERRNO #define errno (get_current()->reent._errno) diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/events.h --- a/extras/mini-os/include/events.h Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/include/events.h Fri Jul 18 12:12:41 2008 +0900 @@ -19,7 +19,7 @@ #ifndef _EVENTS_H_ #define _EVENTS_H_ -#include<traps.h> +#include<mini-os/traps.h> #include<xen/event_channel.h> typedef void (*evtchn_handler_t)(evtchn_port_t, struct pt_regs *, void *); @@ -27,6 +27,7 @@ typedef void (*evtchn_handler_t)(evtchn_ /* prototypes */ int do_event(evtchn_port_t port, struct pt_regs *regs); evtchn_port_t bind_virq(uint32_t virq, evtchn_handler_t handler, void *data); +evtchn_port_t bind_pirq(uint32_t pirq, int will_share, evtchn_handler_t handler, void *data); evtchn_port_t bind_evtchn(evtchn_port_t port, evtchn_handler_t handler, void *data); void unbind_evtchn(evtchn_port_t port); diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/fbfront.h --- a/extras/mini-os/include/fbfront.h Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/include/fbfront.h Fri Jul 18 12:12:41 2008 +0900 @@ -1,6 +1,6 @@ #include <xen/io/kbdif.h> #include <xen/io/fbif.h> -#include <wait.h> +#include <mini-os/wait.h> /* from <linux/input.h> */ #ifndef BTN_LEFT diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/fs.h --- a/extras/mini-os/include/fs.h Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/include/fs.h Fri Jul 18 12:12:41 2008 +0900 @@ -2,8 +2,8 @@ #define __FS_H__ #include <xen/io/fsif.h> -#include <semaphore.h> -#include <types.h> +#include <mini-os/semaphore.h> +#include <mini-os/types.h> struct fs_import { diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/hypervisor.h --- a/extras/mini-os/include/hypervisor.h Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/include/hypervisor.h Fri Jul 18 12:12:41 2008 +0900 @@ -13,7 +13,7 @@ #ifndef _HYPERVISOR_H_ #define _HYPERVISOR_H_ -#include <types.h> +#include <mini-os/types.h> #include <xen/xen.h> #if defined(__i386__) #include <hypercall-x86_32.h> @@ -24,7 +24,7 @@ #else #error "Unsupported architecture" #endif -#include <traps.h> +#include <mini-os/traps.h> /* * a placeholder for the start of day information passed up from the hypervisor diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/ia64/arch_spinlock.h --- a/extras/mini-os/include/ia64/arch_spinlock.h Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/include/ia64/arch_spinlock.h Fri Jul 18 12:12:41 2008 +0900 @@ -27,7 +27,7 @@ #include "atomic.h" -#define ARCH_SPIN_LOCK_UNLOCKED (spinlock_t) { 0 } +#define ARCH_SPIN_LOCK_UNLOCKED { 0 } #define SPIN_LOCK_UNUSED 0 #define SPIN_LOCK_USED 1 diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/ia64/atomic.h --- a/extras/mini-os/include/ia64/atomic.h Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/include/ia64/atomic.h Fri Jul 18 12:12:41 2008 +0900 @@ -38,7 +38,7 @@ #if !defined(__ASSEMBLY__) -#include <types.h> +#include <mini-os/types.h> /* diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/ia64/efi.h --- a/extras/mini-os/include/ia64/efi.h Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/include/ia64/efi.h Fri Jul 18 12:12:41 2008 +0900 @@ -32,7 +32,7 @@ #ifndef _EFI_H_ #define _EFI_H_ -#include "types.h" +#include <mini-os/types.h> #define EFIWARN(a) (a) diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/ia64/endian.h --- a/extras/mini-os/include/ia64/endian.h Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/include/ia64/endian.h Fri Jul 18 12:12:41 2008 +0900 @@ -26,7 +26,7 @@ #if !defined(_ENDIAN_H_) #define _ENDIAN_H_ -#include "types.h" +#include <mini-os/types.h> #if !defined(__ASSEMBLY__) diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/ia64/hypercall-ia64.h --- a/extras/mini-os/include/ia64/hypercall-ia64.h Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/include/ia64/hypercall-ia64.h Fri Jul 18 12:12:41 2008 +0900 @@ -34,8 +34,8 @@ #ifndef __HYPERCALL_H__ #define __HYPERCALL_H__ -#include "lib.h" /* memcpy() */ -#include "errno.h" /* ENOSYS() */ +#include <mini-os/lib.h> /* memcpy() */ +#include <mini-os/errno.h> /* ENOSYS() */ #include <xen/event_channel.h> #include <xen/sched.h> #include <xen/version.h> diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/ia64/os.h --- a/extras/mini-os/include/ia64/os.h Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/include/ia64/os.h Fri Jul 18 12:12:41 2008 +0900 @@ -27,15 +27,15 @@ #if !defined(__ASSEMBLY__) -#include "types.h" +#include <mini-os/types.h> #include "endian.h" #include "ia64_cpu.h" #include "atomic.h" #include "efi.h" #include "sal.h" #include "pal.h" -#include "hypervisor.h" -#include <kernel.h> +#include <mini-os/hypervisor.h> +#include <mini-os/kernel.h> typedef uint64_t paddr_t; /* Physical address. */ diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/lib.h --- a/extras/mini-os/include/lib.h Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/include/lib.h Fri Jul 18 12:12:41 2008 +0900 @@ -99,13 +99,13 @@ char * strcat(char * dest, const char * char * strcat(char * dest, const char * src); char *strdup(const char *s); #endif -#include <console.h> +#include <mini-os/console.h> #define RAND_MIX 2654435769U int rand(void); -#include <xenbus.h> +#include <mini-os/xenbus.h> #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/linux/types.h --- a/extras/mini-os/include/linux/types.h Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/include/linux/types.h Fri Jul 18 12:12:41 2008 +0900 @@ -1,5 +1,5 @@ #ifndef _LINUX_TYPES_H_ #define _LINUX_TYPES_H_ -#include <types.h> +#include <mini-os/types.h> typedef u64 __u64; #endif /* _LINUX_TYPES_H_ */ diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/mm.h --- a/extras/mini-os/include/mm.h Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/include/mm.h Fri Jul 18 12:12:41 2008 +0900 @@ -35,10 +35,10 @@ #error "Unsupported architecture" #endif -#include <lib.h> +#include <mini-os/lib.h> -#include <arch_limits.h> -#include <arch_mm.h> +#include <mini-os/arch_limits.h> +#include <mini-os/arch_mm.h> #define STACK_SIZE_PAGE_ORDER __STACK_SIZE_PAGE_ORDER #define STACK_SIZE __STACK_SIZE diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/netfront.h --- a/extras/mini-os/include/netfront.h Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/include/netfront.h Fri Jul 18 12:12:41 2008 +0900 @@ -1,4 +1,4 @@ -#include <wait.h> +#include <mini-os/wait.h> #ifdef HAVE_LWIP #include <lwip/netif.h> #endif diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/pcifront.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/extras/mini-os/include/pcifront.h Fri Jul 18 12:12:41 2008 +0900 @@ -0,0 +1,28 @@ +#include <mini-os/types.h> +#include <xen/io/pciif.h> +struct pcifront_dev; +struct pcifront_dev *init_pcifront(char *nodename); +void pcifront_op(struct pcifront_dev *dev, struct xen_pci_op *op); +void pcifront_scan(struct pcifront_dev *dev, void (*fun)(unsigned int domain, unsigned int bus, unsigned slot, unsigned int fun)); +int pcifront_conf_read(struct pcifront_dev *dev, + unsigned int dom, + unsigned int bus, unsigned int slot, unsigned long fun, + unsigned int off, unsigned int size, unsigned int *val); +int pcifront_conf_write(struct pcifront_dev *dev, + unsigned int dom, + unsigned int bus, unsigned int slot, unsigned long fun, + unsigned int off, unsigned int size, unsigned int val); +int pcifront_enable_msi(struct pcifront_dev *dev, + unsigned int dom, + unsigned int bus, unsigned int slot, unsigned long fun); +int pcifront_disable_msi(struct pcifront_dev *dev, + unsigned int dom, + unsigned int bus, unsigned int slot, unsigned long fun); +int pcifront_enable_msix(struct pcifront_dev *dev, + unsigned int dom, + unsigned int bus, unsigned int slot, unsigned long fun, + struct xen_msix_entry *entries, int n); +int pcifront_disable_msix(struct pcifront_dev *dev, + unsigned int dom, + unsigned int bus, unsigned int slot, unsigned long fun); +void shutdown_pcifront(struct pcifront_dev *dev); diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/posix/fcntl.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/extras/mini-os/include/posix/fcntl.h Fri Jul 18 12:12:41 2008 +0900 @@ -0,0 +1,11 @@ +#ifndef _POSIX_FCNTL_H +#define _POSIX_FCNTL_H + +#include_next <fcntl.h> + +#define F_ULOCK 0 +#define F_LOCK 1 +#define F_TLOCK 2 +#define F_TEST 3 + +#endif /* _POSIX_FCNTL_H */ diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/posix/limits.h --- a/extras/mini-os/include/posix/limits.h Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/include/posix/limits.h Fri Jul 18 12:12:41 2008 +0900 @@ -1,9 +1,46 @@ #ifndef _POSIX_LIMITS_H #define _POSIX_LIMITS_H -#include_next <limits.h> -#include <arch_limits.h> +#include <mini-os/arch_limits.h> + +#define CHAR_BIT 8 + +#define SCHAR_MAX 0x7f +#define SCHAR_MIN (-SCHAR_MAX-1) +#define UCHAR_MAX 0xff + +#ifdef __CHAR_UNSIGNED__ +# define CHAR_MIN 0 +# define CHAR_MAX UCHAR_MAX +#else +# define CHAR_MIN SCHAR_MIN +# define CHAR_MAX SCHAR_MAX +#endif + +#define INT_MAX 0x7fffffff +#define INT_MIN (-INT_MAX-1) +#define UINT_MAX 0xffffffff + +#define SHRT_MAX 0x7fff + +#if defined(__x86_64__) || defined(__ia64__) +# define LONG_MAX 0x7fffffffffffffffL +# define ULONG_MAX 0xffffffffffffffffUL +#else +# define LONG_MAX 0x7fffffffL +# define ULONG_MAX 0xffffffffUL +#endif +#define LONG_MIN (-LONG_MAX-1L) + +#define LLONG_MAX 0x7fffffffffffffffLL +#define LLONG_MIN (-LLONG_MAX-1LL) +#define ULLONG_MAX 0xffffffffffffffffULL + +#define LONG_LONG_MIN LLONG_MIN +#define LONG_LONG_MAX LLONG_MAX +#define ULONG_LONG_MAX ULLONG_MAX #define PATH_MAX __PAGE_SIZE +#define PAGE_SIZE __PAGE_SIZE #endif /* _POSIX_LIMITS_H */ diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/posix/sys/mman.h --- a/extras/mini-os/include/posix/sys/mman.h Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/include/posix/sys/mman.h Fri Jul 18 12:12:41 2008 +0900 @@ -9,6 +9,9 @@ #define MAP_PRIVATE 0x02 #define MAP_ANON 0x20 +/* Pages are always resident anyway */ +#define MAP_LOCKED 0x0 + #define MAP_FAILED ((void*)0) void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset); diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/posix/sys/select.h --- a/extras/mini-os/include/posix/sys/select.h Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/include/posix/sys/select.h Fri Jul 18 12:12:41 2008 +0900 @@ -2,6 +2,7 @@ #define _POSIX_SELECT_H #include <sys/time.h> +#include <lwip/sockets.h> int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); #endif /* _POSIX_SELECT_H */ diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/posix/unistd.h --- a/extras/mini-os/include/posix/unistd.h Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/include/posix/unistd.h Fri Jul 18 12:12:41 2008 +0900 @@ -2,11 +2,8 @@ #define _POSIX_UNISTD_H #include_next <unistd.h> -#include <sys/select.h> -#include <arch_limits.h> -#define getpagesize() __PAGE_SIZE - +size_t getpagesize(void); int ftruncate(int fd, off_t length); #endif /* _POSIX_UNISTD_H */ diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/sched.h --- a/extras/mini-os/include/sched.h Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/include/sched.h Fri Jul 18 12:12:41 2008 +0900 @@ -1,9 +1,12 @@ #ifndef __SCHED_H__ #define __SCHED_H__ -#include <list.h> -#include <time.h> -#include <arch_sched.h> +#include <mini-os/list.h> +#include <mini-os/time.h> +#include <mini-os/arch_sched.h> +#ifdef HAVE_LIBC +#include <sys/reent.h> +#endif struct thread { diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/semaphore.h --- a/extras/mini-os/include/semaphore.h Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/include/semaphore.h Fri Jul 18 12:12:41 2008 +0900 @@ -1,8 +1,8 @@ #ifndef _SEMAPHORE_H_ #define _SEMAPHORE_H_ -#include <wait.h> -#include <spinlock.h> +#include <mini-os/wait.h> +#include <mini-os/spinlock.h> /* * Implementation of semaphore in Mini-os is simple, because diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/spinlock.h --- a/extras/mini-os/include/spinlock.h Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/include/spinlock.h Fri Jul 18 12:12:41 2008 +0900 @@ -1,7 +1,7 @@ #ifndef __ASM_SPINLOCK_H #define __ASM_SPINLOCK_H -#include <lib.h> +#include <mini-os/lib.h> /* * Your basic SMP spinlocks, allowing only a single CPU anywhere @@ -12,7 +12,7 @@ typedef struct { } spinlock_t; -#include "arch_spinlock.h" +#include <mini-os/arch_spinlock.h> #define SPINLOCK_MAGIC 0xdead4ead diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/sys/lock.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/extras/mini-os/include/sys/lock.h Fri Jul 18 12:12:41 2008 +0900 @@ -0,0 +1,52 @@ +#ifndef _MINIOS_SYS_LOCK_H_ +#define _MINIOS_SYS_LOCK_H_ + +#ifdef HAVE_LIBC + +/* Due to inclusion loop, we can not include sched.h, so have to hide things */ + +#include <mini-os/waittypes.h> + + +typedef struct { + int busy; + struct wait_queue_head wait; +} _LOCK_T; + +#define __LOCK_INIT(class,lock) \ + class _LOCK_T lock = { .wait = __WAIT_QUEUE_HEAD_INITIALIZER(lock.wait) } +int ___lock_init(_LOCK_T *lock); +int ___lock_acquire(_LOCK_T *lock); +int ___lock_try_acquire(_LOCK_T *lock); +int ___lock_release(_LOCK_T *lock); +int ___lock_close(_LOCK_T *lock); +#define __lock_init(__lock) ___lock_init(&__lock) +#define __lock_acquire(__lock) ___lock_acquire(&__lock) +#define __lock_release(__lock) ___lock_release(&__lock) +#define __lock_try_acquire(__lock) ___lock_try_acquire(&__lock) +#define __lock_close(__lock) 0 + + +typedef struct { + struct thread *owner; + int count; + struct wait_queue_head wait; +} _LOCK_RECURSIVE_T; + +#define __LOCK_INIT_RECURSIVE(class, lock) \ + class _LOCK_RECURSIVE_T lock = { .wait = __WAIT_QUEUE_HEAD_INITIALIZER((lock).wait) } + +int ___lock_init_recursive(_LOCK_RECURSIVE_T *lock); +int ___lock_acquire_recursive(_LOCK_RECURSIVE_T *lock); +int ___lock_try_acquire_recursive(_LOCK_RECURSIVE_T *lock); +int ___lock_release_recursive(_LOCK_RECURSIVE_T *lock); +int ___lock_close_recursive(_LOCK_RECURSIVE_T *lock); +#define __lock_init_recursive(__lock) ___lock_init_recursive(&__lock) +#define __lock_acquire_recursive(__lock) ___lock_acquire_recursive(&__lock) +#define __lock_release_recursive(__lock) ___lock_release_recursive(&__lock) +#define __lock_try_acquire_recursive(__lock) ___lock_try_acquire_recursive(&__lock) +#define __lock_close_recursive(__lock) 0 + +#endif + +#endif /* _MINIOS_SYS_LOCK_H_ */ diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/time.h --- a/extras/mini-os/include/time.h Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/include/time.h Fri Jul 18 12:12:41 2008 +0900 @@ -19,7 +19,7 @@ #ifndef _MINIOS_TIME_H_ #define _MINIOS_TIME_H_ -#include <types.h> +#include <mini-os/types.h> /* * System Time diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/types.h --- a/extras/mini-os/include/types.h Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/include/types.h Fri Jul 18 12:12:41 2008 +0900 @@ -36,9 +36,11 @@ typedef unsigned long u64; #endif /* FreeBSD compat types */ +#ifndef HAVE_LIBC typedef unsigned char u_char; typedef unsigned int u_int; typedef unsigned long u_long; +#endif #ifdef __i386__ typedef long long quad_t; typedef unsigned long long u_quad_t; @@ -79,11 +81,13 @@ typedef u64 uint64_t, uintmax_t; typedef u64 uint64_t, uintmax_t; typedef s64 int64_t, intmax_t; typedef u64 off_t; +#endif +typedef intptr_t ptrdiff_t; -#define INT_MAX ((int)(~0U>>1)) -#define UINT_MAX (~0U) +#ifndef HAVE_LIBC typedef long ssize_t; #endif + #endif /* _TYPES_H_ */ diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/wait.h --- a/extras/mini-os/include/wait.h Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/include/wait.h Fri Jul 18 12:12:41 2008 +0900 @@ -1,30 +1,9 @@ #ifndef __WAIT_H__ #define __WAIT_H__ -#include <sched.h> -#include <list.h> -#include <lib.h> -#include <os.h> - -struct wait_queue -{ - struct thread *thread; - struct list_head thread_list; -}; - -struct wait_queue_head -{ - /* TODO - lock required? */ - struct list_head thread_list; -}; - -#define DECLARE_WAIT_QUEUE_HEAD(name) \ - struct wait_queue_head name = \ - { .thread_list = { &(name).thread_list, &(name).thread_list} } - -#define __WAIT_QUEUE_HEAD_INITIALIZER(name) { \ - .thread_list = { &(name).thread_list, &(name).thread_list } } - +#include <mini-os/sched.h> +#include <mini-os/os.h> +#include <mini-os/waittypes.h> #define DEFINE_WAIT(name) \ struct wait_queue name = { \ diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/waittypes.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/extras/mini-os/include/waittypes.h Fri Jul 18 12:12:41 2008 +0900 @@ -0,0 +1,26 @@ +#ifndef __WAITTYPE_H__ +#define __WAITTYPE_H__ + +#include <mini-os/list.h> + +struct thread; +struct wait_queue +{ + struct thread *thread; + struct list_head thread_list; +}; + +struct wait_queue_head +{ + /* TODO - lock required? */ + struct list_head thread_list; +}; + +#define DECLARE_WAIT_QUEUE_HEAD(name) \ + struct wait_queue_head name = \ + { .thread_list = { &(name).thread_list, &(name).thread_list} } + +#define __WAIT_QUEUE_HEAD_INITIALIZER(name) { \ + .thread_list = { &(name).thread_list, &(name).thread_list } } + +#endif diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/x86/arch_sched.h --- a/extras/mini-os/include/x86/arch_sched.h Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/include/x86/arch_sched.h Fri Jul 18 12:12:41 2008 +0900 @@ -2,7 +2,7 @@ #ifndef __ARCH_SCHED_H__ #define __ARCH_SCHED_H__ -#include <arch_limits.h> +#include "arch_limits.h" static inline struct thread* get_current(void) { diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/x86/arch_spinlock.h --- a/extras/mini-os/include/x86/arch_spinlock.h Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/include/x86/arch_spinlock.h Fri Jul 18 12:12:41 2008 +0900 @@ -3,11 +3,11 @@ #ifndef __ARCH_ASM_SPINLOCK_H #define __ARCH_ASM_SPINLOCK_H -#include <lib.h> +#include <mini-os/lib.h> #include "os.h" -#define ARCH_SPIN_LOCK_UNLOCKED (spinlock_t) { 1 } +#define ARCH_SPIN_LOCK_UNLOCKED { 1 } /* * Simple spin lock operations. There are two variants, one clears IRQ's diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/x86/os.h --- a/extras/mini-os/include/x86/os.h Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/include/x86/os.h Fri Jul 18 12:12:41 2008 +0900 @@ -16,9 +16,9 @@ #ifndef __ASSEMBLY__ -#include <types.h> -#include <hypervisor.h> -#include <kernel.h> +#include <mini-os/types.h> +#include <mini-os/hypervisor.h> +#include <mini-os/kernel.h> #define USED __attribute__ ((used)) diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/x86/x86_32/hypercall-x86_32.h --- a/extras/mini-os/include/x86/x86_32/hypercall-x86_32.h Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/include/x86/x86_32/hypercall-x86_32.h Fri Jul 18 12:12:41 2008 +0900 @@ -33,7 +33,7 @@ #include <xen/xen.h> #include <xen/sched.h> #include <xen/nmi.h> -#include <mm.h> +#include <mini-os/mm.h> #define __STR(x) #x #define STR(x) __STR(x) diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/x86/x86_64/hypercall-x86_64.h --- a/extras/mini-os/include/x86/x86_64/hypercall-x86_64.h Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/include/x86/x86_64/hypercall-x86_64.h Fri Jul 18 12:12:41 2008 +0900 @@ -36,7 +36,7 @@ #include <xen/xen.h> #include <xen/sched.h> -#include <mm.h> +#include <mini-os/mm.h> #define __STR(x) #x #define STR(x) __STR(x) diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/xmalloc.h --- a/extras/mini-os/include/xmalloc.h Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/include/xmalloc.h Fri Jul 18 12:12:41 2008 +0900 @@ -10,6 +10,8 @@ #define xfree(ptr) free(ptr) #else + +#include <limits.h> #define DEFAULT_ALIGN (sizeof(unsigned long)) #define malloc(size) _xmalloc(size, DEFAULT_ALIGN) diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/kernel.c --- a/extras/mini-os/kernel.c Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/kernel.c Fri Jul 18 12:12:41 2008 +0900 @@ -40,6 +40,7 @@ #include <netfront.h> #include <blkfront.h> #include <fbfront.h> +#include <pcifront.h> #include <fs.h> #include <xmalloc.h> #include <fcntl.h> @@ -431,6 +432,29 @@ static void kbdfront_thread(void *p) } } +static struct pcifront_dev *pci_dev; + +static void pcifront_thread(void *p) +{ + void print(unsigned int domain, unsigned int bus, unsigned int slot, unsigned int fun) + { + unsigned int vendor, device, rev, class; + + pcifront_conf_read(pci_dev, domain, bus, slot, fun, 0x00, 2, &vendor); + pcifront_conf_read(pci_dev, domain, bus, slot, fun, 0x02, 2, &device); + pcifront_conf_read(pci_dev, domain, bus, slot, fun, 0x08, 1, &rev); + pcifront_conf_read(pci_dev, domain, bus, slot, fun, 0x0a, 2, &class); + + printk("%04x:%02x:%02x.%02x %04x: %04x:%04x (rev %02x)\n", domain, bus, slot, fun, class, vendor, device, rev); + } + + pci_dev = init_pcifront(NULL); + if (!pci_dev) + return; + printk("PCI devices:\n"); + pcifront_scan(pci_dev, print); +} + static void fs_thread(void *p) { init_fs_frontend(); @@ -446,6 +470,7 @@ __attribute__((weak)) int app_main(start create_thread("blkfront", blkfront_thread, si); create_thread("fbfront", fbfront_thread, si); create_thread("kbdfront", kbdfront_thread, si); + create_thread("pcifront", pcifront_thread, si); create_thread("fs-frontend", fs_thread, si); return 0; } @@ -524,6 +549,9 @@ void stop_kernel(void) if (kbd_dev) shutdown_kbdfront(kbd_dev); + if (pci_dev) + shutdown_pcifront(pci_dev); + /* TODO: fs import */ local_irq_disable(); diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/lib/ctype.c --- a/extras/mini-os/lib/ctype.c Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/lib/ctype.c Fri Jul 18 12:12:41 2008 +0900 @@ -1,3 +1,4 @@ +#ifndef HAVE_LIBC #include <ctype.h> unsigned char _ctype[] = { @@ -25,3 +26,4 @@ _U,_U,_U,_U,_U,_U,_U,_P,_U,_U,_U,_U,_U,_ _U,_U,_U,_U,_U,_U,_U,_P,_U,_U,_U,_U,_U,_U,_U,_L, /* 208-223 */ _L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L, /* 224-239 */ _L,_L,_L,_L,_L,_L,_L,_P,_L,_L,_L,_L,_L,_L,_L,_L}; /* 240-255 */ +#endif diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/lib/printf.c --- a/extras/mini-os/lib/printf.c Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/lib/printf.c Fri Jul 18 12:12:41 2008 +0900 @@ -62,6 +62,7 @@ #include <lib.h> #include <mm.h> #include <ctype.h> +#include <limits.h> /** * simple_strtoul - convert a string to an unsigned long diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/lib/sys.c --- a/extras/mini-os/lib/sys.c Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/lib/sys.c Fri Jul 18 12:12:41 2008 +0900 @@ -733,7 +733,7 @@ static int select_poll(int nfds, fd_set FD_CLR(i, exceptfds); break; case FTYPE_CONSOLE: - if (FD_ISSET(i, writefds)) { + if (FD_ISSET(i, readfds)) { if (xencons_ring_avail()) n++; else @@ -1094,6 +1094,11 @@ int clock_gettime(clockid_t clk_id, stru return 0; } +size_t getpagesize(void) +{ + return PAGE_SIZE; +} + void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset) { unsigned long n = (length + PAGE_SIZE - 1) / PAGE_SIZE; @@ -1185,6 +1190,7 @@ void sparse(unsigned long data, size_t s /* Not supported by FS yet. */ unsupported_function_crash(link); unsupported_function(int, readlink, -1); +unsupported_function_crash(umask); /* We could support that. */ unsupported_function_log(int, chdir, -1); @@ -1207,6 +1213,18 @@ unsupported_function(int, sigaltstack, - unsupported_function(int, sigaltstack, -1); unsupported_function_crash(kill); +/* Unsupported */ +unsupported_function_crash(pipe); +unsupported_function_crash(fork); +unsupported_function_crash(execv); +unsupported_function_crash(execve); +unsupported_function_crash(waitpid); +unsupported_function_crash(wait); +unsupported_function_crash(lockf); +unsupported_function_crash(sysconf); +unsupported_function(int, tcsetattr, -1); +unsupported_function(int, tcgetattr, 0); + /* Linuxish abi for the Caml runtime, don't support */ unsupported_function_log(struct dirent *, readdir64, NULL); unsupported_function_log(int, getrusage, -1); diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/lib/xmalloc.c --- a/extras/mini-os/lib/xmalloc.c Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/lib/xmalloc.c Fri Jul 18 12:12:41 2008 +0900 @@ -139,7 +139,7 @@ static void *xmalloc_whole_pages(size_t void *_xmalloc(size_t size, size_t align) { - struct xmalloc_hdr *i, *hdr = NULL; + struct xmalloc_hdr *i, *tmp, *hdr = NULL; uintptr_t data_begin; size_t hdr_size; /* unsigned long flags; */ @@ -155,7 +155,7 @@ void *_xmalloc(size_t size, size_t align /* Search free list. */ /* spin_lock_irqsave(&freelist_lock, flags); */ - list_for_each_entry( i, &freelist, freelist ) + list_for_each_entry_safe( i, tmp, &freelist, freelist ) { data_begin = align_up((uintptr_t)i + hdr_size, align); diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/lock.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/extras/mini-os/lock.c Fri Jul 18 12:12:41 2008 +0900 @@ -0,0 +1,111 @@ +/* + * locks for newlib + * + * Samuel Thibault <Samuel.Thibault@xxxxxxxxxxxxx>, July 20008 + */ + +#ifdef HAVE_LIBC + +#include <sys/lock.h> +#include <sched.h> +#include <wait.h> + +int ___lock_init(_LOCK_T *lock) +{ + lock->busy = 0; + init_waitqueue_head(&lock->wait); + return 0; +} + +int ___lock_acquire(_LOCK_T *lock) +{ + unsigned long flags; + while(1) { + wait_event(lock->wait, !lock->busy); + local_irq_save(flags); + if (!lock->busy) + break; + local_irq_restore(flags); + } + lock->busy = 1; + local_irq_restore(flags); + return 0; +} + +int ___lock_try_acquire(_LOCK_T *lock) +{ + unsigned long flags; + int ret = -1; + local_irq_save(flags); + if (!lock->busy) { + lock->busy = 1; + ret = 0; + } + local_irq_restore(flags); + return ret; +} + +int ___lock_release(_LOCK_T *lock) +{ + unsigned long flags; + local_irq_save(flags); + lock->busy = 0; + wake_up(&lock->wait); + local_irq_restore(flags); + return 0; +} + + +int ___lock_init_recursive(_LOCK_RECURSIVE_T *lock) +{ + lock->owner = NULL; + init_waitqueue_head(&lock->wait); + return 0; +} + +int ___lock_acquire_recursive(_LOCK_RECURSIVE_T *lock) +{ + unsigned long flags; + if (lock->owner != get_current()) { + while (1) { + wait_event(lock->wait, lock->owner == NULL); + local_irq_save(flags); + if (lock->owner == NULL) + break; + local_irq_restore(flags); + } + lock->owner = get_current(); + local_irq_restore(flags); + } + lock->count++; + return 0; +} + +int ___lock_try_acquire_recursive(_LOCK_RECURSIVE_T *lock) +{ + unsigned long flags; + int ret = -1; + local_irq_save(flags); + if (!lock->owner) { + ret = 0; + lock->owner = get_current(); + lock->count++; + } + local_irq_restore(flags); + return ret; +} + +int ___lock_release_recursive(_LOCK_RECURSIVE_T *lock) +{ + unsigned long flags; + BUG_ON(lock->owner != get_current()); + if (--lock->count) + return 0; + local_irq_save(flags); + lock->owner = NULL; + wake_up(&lock->wait); + local_irq_restore(flags); + return 0; +} + +#endif diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/lwip-net.c --- a/extras/mini-os/lwip-net.c Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/lwip-net.c Fri Jul 18 12:12:41 2008 +0900 @@ -93,6 +93,9 @@ static err_t static err_t low_level_output(struct netif *netif, struct pbuf *p) { + if (!dev) + return ERR_OK; + #ifdef ETH_PAD_SIZE pbuf_header(p, -ETH_PAD_SIZE); /* drop the padding word */ #endif @@ -342,7 +345,7 @@ void start_networking(void) struct ip_addr ipaddr = { htonl(IF_IPADDR) }; struct ip_addr netmask = { htonl(IF_NETMASK) }; struct ip_addr gw = { 0 }; - char *ip; + char *ip = NULL; tprintk("Waiting for network.\n"); @@ -380,5 +383,6 @@ void start_networking(void) /* Shut down the network */ void stop_networking(void) { - shutdown_netfront(dev); -} + if (dev) + shutdown_netfront(dev); +} diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/main.c --- a/extras/mini-os/main.c Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/main.c Fri Jul 18 12:12:41 2008 +0900 @@ -52,6 +52,7 @@ static void call_main(void *p) #ifdef CONFIG_QEMU char *vm; char path[128]; + int domid; #endif int i; @@ -74,7 +75,6 @@ static void call_main(void *p) } /* Fetch argc, argv from XenStore */ - int domid; domid = xenbus_read_integer("target"); if (domid == -1) { printk("Couldn't read target\n"); diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/minios.mk --- a/extras/mini-os/minios.mk Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/minios.mk Fri Jul 18 12:12:41 2008 +0900 @@ -6,13 +6,14 @@ debug = y # Define some default flags. # NB. '-Wcast-qual' is nasty, so I omitted it. -DEF_CFLAGS += -fno-builtin -Wall -Werror -Wredundant-decls -Wno-format +DEF_CFLAGS += -fno-builtin -Wall -Werror -Wredundant-decls -Wno-format -Wno-redundant-decls DEF_CFLAGS += $(call cc-option,$(CC),-fno-stack-protector,) +DEF_CFLAGS += $(call cc-option,$(CC),-fgnu89-inline) DEF_CFLAGS += -Wstrict-prototypes -Wnested-externs -Wpointer-arith -Winline DEF_CPPFLAGS += -D__XEN_INTERFACE_VERSION__=$(XEN_INTERFACE_VERSION) -DEF_ASFLAGS = -D__ASSEMBLY__ -DEF_LDFLAGS = +DEF_ASFLAGS += -D__ASSEMBLY__ +DEF_LDFLAGS += ifeq ($(debug),y) DEF_CFLAGS += -g diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/mm.c --- a/extras/mini-os/mm.c Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/mm.c Fri Jul 18 12:12:41 2008 +0900 @@ -361,6 +361,7 @@ void free_pages(void *pointer, int order } +#ifndef __ia64__ int free_physical_pages(xen_pfn_t *mfns, int n) { struct xen_memory_reservation reservation; @@ -371,6 +372,7 @@ int free_physical_pages(xen_pfn_t *mfns, reservation.domid = DOMID_SELF; return HYPERVISOR_memory_op(XENMEM_decrease_reservation, &reservation); } +#endif #ifdef HAVE_LIBC void *sbrk(ptrdiff_t increment) diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/netfront.c --- a/extras/mini-os/netfront.c Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/netfront.c Fri Jul 18 12:12:41 2008 +0900 @@ -95,8 +95,9 @@ static inline int xennet_rxidx(RING_IDX void network_rx(struct netfront_dev *dev) { - RING_IDX rp,cons; + RING_IDX rp,cons,req_prod; struct netif_rx_response *rx; + int nr_consumed, some, more, i, notify; moretodo: @@ -104,12 +105,13 @@ moretodo: rmb(); /* Ensure we see queued responses up to 'rp'. */ cons = dev->rx.rsp_cons; - int nr_consumed=0; - int some = 0; + nr_consumed = 0; + some = 0; while ((cons != rp) && !some) { struct net_buffer* buf; unsigned char* page; + int id; rx = RING_GET_RESPONSE(&dev->rx, cons); @@ -122,7 +124,7 @@ moretodo: if (rx->status == NETIF_RSP_NULL) continue; - int id = rx->id; + id = rx->id; BUG_ON(id >= NET_TX_RING_SIZE); buf = &dev->rx_buffers[id]; @@ -151,19 +153,15 @@ moretodo: } dev->rx.rsp_cons=cons; - int more; RING_FINAL_CHECK_FOR_RESPONSES(&dev->rx,more); if(more && !some) goto moretodo; - RING_IDX req_prod = dev->rx.req_prod_pvt; - - int i; - netif_rx_request_t *req; + req_prod = dev->rx.req_prod_pvt; for(i=0; i<nr_consumed; i++) { int id = xennet_rxidx(req_prod + i); - req = RING_GET_REQUEST(&dev->rx, req_prod + i); + netif_rx_request_t *req = RING_GET_REQUEST(&dev->rx, req_prod + i); struct net_buffer* buf = &dev->rx_buffers[id]; void* page = buf->page; @@ -178,7 +176,6 @@ moretodo: dev->rx.req_prod_pvt = req_prod + i; - int notify; RING_PUSH_REQUESTS_AND_CHECK_NOTIFY(&dev->rx, notify); if (notify) notify_remote_via_evtchn(dev->evtchn); @@ -199,6 +196,7 @@ void network_tx_buf_gc(struct netfront_d for (cons = dev->tx.rsp_cons; cons != prod; cons++) { struct netif_tx_response *txrsp; + struct net_buffer *buf; txrsp = RING_GET_RESPONSE(&dev->tx, cons); if (txrsp->status == NETIF_RSP_NULL) @@ -209,7 +207,7 @@ void network_tx_buf_gc(struct netfront_d id = txrsp->id; BUG_ON(id >= NET_TX_RING_SIZE); - struct net_buffer* buf = &dev->tx_buffers[id]; + buf = &dev->tx_buffers[id]; gnttab_end_access(buf->gref); buf->gref=GRANT_INVALID_REF; @@ -298,7 +296,7 @@ static void free_netfront(struct netfron free(dev); } -struct netfront_dev *init_netfront(char *nodename, void (*thenetif_rx)(unsigned char* data, int len), unsigned char rawmac[6], char **ip) +struct netfront_dev *init_netfront(char *_nodename, void (*thenetif_rx)(unsigned char* data, int len), unsigned char rawmac[6], char **ip) { xenbus_transaction_t xbt; char* err; @@ -308,11 +306,9 @@ struct netfront_dev *init_netfront(char int retry=0; int i; char* msg; + char* nodename = _nodename ? _nodename : "device/vif/0"; struct netfront_dev *dev; - - if (!nodename) - nodename = "device/vif/0"; char path[strlen(nodename) + 1 + 10 + 1]; diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/pcifront.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/extras/mini-os/pcifront.c Fri Jul 18 12:12:41 2008 +0900 @@ -0,0 +1,364 @@ +/* Minimal PCI driver for Mini-OS. + * Copyright (c) 2007-2008 Samuel Thibault. + * Based on blkfront.c. + */ + +#include <os.h> +#include <xenbus.h> +#include <events.h> +#include <errno.h> +#include <gnttab.h> +#include <xmalloc.h> +#include <wait.h> +#include <pcifront.h> + +#define PCI_DEVFN(slot, func) ((((slot) & 0x1f) << 3) | ((func) & 0x07)) + +DECLARE_WAIT_QUEUE_HEAD(pcifront_queue); + +struct pcifront_dev { + domid_t dom; + + struct xen_pci_sharedinfo *info; + grant_ref_t info_ref; + evtchn_port_t evtchn; + + char *nodename; + char *backend; + + xenbus_event_queue events; +}; + +void pcifront_handler(evtchn_port_t port, struct pt_regs *regs, void *data) +{ + wake_up(&pcifront_queue); +} + +static void free_pcifront(struct pcifront_dev *dev) +{ + mask_evtchn(dev->evtchn); + + free(dev->backend); + + gnttab_end_access(dev->info_ref); + free_page(dev->info); + + unbind_evtchn(dev->evtchn); + + free(dev->nodename); + free(dev); +} + +struct pcifront_dev *init_pcifront(char *_nodename) +{ + xenbus_transaction_t xbt; + char* err; + char* message=NULL; + int retry=0; + char* msg; + char* nodename = _nodename ? _nodename : "device/pci/0"; + + struct pcifront_dev *dev; + + char path[strlen(nodename) + 1 + 10 + 1]; + + printk("******************* PCIFRONT for %s **********\n\n\n", nodename); + + dev = malloc(sizeof(*dev)); + memset(dev, 0, sizeof(*dev)); + dev->nodename = strdup(nodename); + + snprintf(path, sizeof(path), "%s/backend-id", nodename); + dev->dom = xenbus_read_integer(path); + evtchn_alloc_unbound(dev->dom, pcifront_handler, dev, &dev->evtchn); + + dev->info = (struct xen_pci_sharedinfo*) alloc_page(); + memset(dev->info,0,PAGE_SIZE); + + dev->info_ref = gnttab_grant_access(dev->dom,virt_to_mfn(dev->info),0); + + dev->events = NULL; + +again: + err = xenbus_transaction_start(&xbt); + if (err) { + printk("starting transaction\n"); + } + + err = xenbus_printf(xbt, nodename, "pci-op-ref","%u", + dev->info_ref); + if (err) { + message = "writing pci-op-ref"; + goto abort_transaction; + } + err = xenbus_printf(xbt, nodename, + "event-channel", "%u", dev->evtchn); + if (err) { + message = "writing event-channel"; + goto abort_transaction; + } + err = xenbus_printf(xbt, nodename, + "magic", XEN_PCI_MAGIC); + if (err) { + message = "writing magic"; + goto abort_transaction; + } + + err = xenbus_printf(xbt, nodename, "state", "%u", + 3); /* initialised */ + + + err = xenbus_transaction_end(xbt, 0, &retry); + if (retry) { + goto again; + printk("completing transaction\n"); + } + + goto done; + +abort_transaction: + xenbus_transaction_end(xbt, 1, &retry); + goto error; + +done: + + snprintf(path, sizeof(path), "%s/backend", nodename); + msg = xenbus_read(XBT_NIL, path, &dev->backend); + if (msg) { + printk("Error %s when reading the backend path %s\n", msg, path); + goto error; + } + + printk("backend at %s\n", dev->backend); + + { + char path[strlen(dev->backend) + 1 + 5 + 1]; + snprintf(path, sizeof(path), "%s/state", dev->backend); + + xenbus_watch_path_token(XBT_NIL, path, path, &dev->events); + + xenbus_wait_for_value(path, "4", &dev->events); + + xenbus_printf(xbt, nodename, "state", "%u", 4); /* connected */ + } + unmask_evtchn(dev->evtchn); + + printk("**************************\n"); + + return dev; + +error: + free_pcifront(dev); + return NULL; +} + +void pcifront_scan(struct pcifront_dev *dev, void (*func)(unsigned int domain, unsigned int bus, unsigned slot, unsigned int fun)) +{ + char path[strlen(dev->backend) + 1 + 5 + 10 + 1]; + int i, n; + char *s, *msg; + unsigned int domain, bus, slot, fun; + + snprintf(path, sizeof(path), "%s/num_devs", dev->backend); + n = xenbus_read_integer(path); + + for (i = 0; i < n; i++) { + snprintf(path, sizeof(path), "%s/vdev-%d", dev->backend, i); + msg = xenbus_read(XBT_NIL, path, &s); + if (msg) { + printk("Error %s when reading the PCI root name at %s\n", path); + continue; + } + + if (sscanf(s, "%x:%x:%x.%x", &domain, &bus, &slot, &fun) != 4) { + printk("\"%s\" does not look like a PCI device address\n", s); + free(s); + continue; + } + free(s); + + func(domain, bus, slot, fun); + } +} + +void shutdown_pcifront(struct pcifront_dev *dev) +{ + char* err; + char *nodename = dev->nodename; + + char path[strlen(dev->backend) + 1 + 5 + 1]; + + printk("close pci: backend at %s\n",dev->backend); + + snprintf(path, sizeof(path), "%s/state", dev->backend); + err = xenbus_printf(XBT_NIL, nodename, "state", "%u", 5); /* closing */ + xenbus_wait_for_value(path, "5", &dev->events); + + err = xenbus_printf(XBT_NIL, nodename, "state", "%u", 6); + xenbus_wait_for_value(path, "6", &dev->events); + + err = xenbus_printf(XBT_NIL, nodename, "state", "%u", 1); + xenbus_wait_for_value(path, "2", &dev->events); + + xenbus_unwatch_path(XBT_NIL, path); + + snprintf(path, sizeof(path), "%s/info-ref", nodename); + xenbus_rm(XBT_NIL, path); + snprintf(path, sizeof(path), "%s/event-channel", nodename); + xenbus_rm(XBT_NIL, path); + + free_pcifront(dev); +} + + +void pcifront_op(struct pcifront_dev *dev, struct xen_pci_op *op) +{ + dev->info->op = *op; + /* Make sure info is written before the flag */ + wmb(); + set_bit(_XEN_PCIF_active, (void*) &dev->info->flags); + notify_remote_via_evtchn(dev->evtchn); + + wait_event(pcifront_queue, !test_bit(_XEN_PCIF_active, (void*) &dev->info->flags)); + + /* Make sure flag is read before info */ + rmb(); + *op = dev->info->op; +} + +int pcifront_conf_read(struct pcifront_dev *dev, + unsigned int dom, + unsigned int bus, unsigned int slot, unsigned long fun, + unsigned int off, unsigned int size, unsigned int *val) +{ + struct xen_pci_op op; + + memset(&op, 0, sizeof(op)); + + op.cmd = XEN_PCI_OP_conf_read; + op.domain = dom; + op.bus = bus; + op.devfn = PCI_DEVFN(slot, fun); + op.offset = off; + op.size = size; + + pcifront_op(dev, &op); + + if (op.err) + return op.err; + + *val = op.value; + + return 0; +} + +int pcifront_conf_write(struct pcifront_dev *dev, + unsigned int dom, + unsigned int bus, unsigned int slot, unsigned long fun, + unsigned int off, unsigned int size, unsigned int val) +{ + struct xen_pci_op op; + + memset(&op, 0, sizeof(op)); + + op.cmd = XEN_PCI_OP_conf_write; + op.domain = dom; + op.bus = bus; + op.devfn = PCI_DEVFN(slot, fun); + op.offset = off; + op.size = size; + + op.value = val; + + pcifront_op(dev, &op); + + return op.err; +} + +int pcifront_enable_msi(struct pcifront_dev *dev, + unsigned int dom, + unsigned int bus, unsigned int slot, unsigned long fun) +{ + struct xen_pci_op op; + + memset(&op, 0, sizeof(op)); + + op.cmd = XEN_PCI_OP_enable_msi; + op.domain = dom; + op.bus = bus; + op.devfn = PCI_DEVFN(slot, fun); + + pcifront_op(dev, &op); + + if (op.err) + return op.err; + else + return op.value; +} + +int pcifront_disable_msi(struct pcifront_dev *dev, + unsigned int dom, + unsigned int bus, unsigned int slot, unsigned long fun) +{ + struct xen_pci_op op; + + memset(&op, 0, sizeof(op)); + + op.cmd = XEN_PCI_OP_disable_msi; + op.domain = dom; + op.bus = bus; + op.devfn = PCI_DEVFN(slot, fun); + + pcifront_op(dev, &op); + + return op.err; +} + +int pcifront_enable_msix(struct pcifront_dev *dev, + unsigned int dom, + unsigned int bus, unsigned int slot, unsigned long fun, + struct xen_msix_entry *entries, int n) +{ + struct xen_pci_op op; + + if (n > SH_INFO_MAX_VEC) + return XEN_PCI_ERR_op_failed; + + memset(&op, 0, sizeof(op)); + + op.cmd = XEN_PCI_OP_enable_msix; + op.domain = dom; + op.bus = bus; + op.devfn = PCI_DEVFN(slot, fun); + op.value = n; + + memcpy(op.msix_entries, entries, n * sizeof(*entries)); + + pcifront_op(dev, &op); + + if (op.err) + return op.err; + + memcpy(entries, op.msix_entries, n * sizeof(*entries)); + + return 0; +} + + +int pcifront_disable_msix(struct pcifront_dev *dev, + unsigned int dom, + unsigned int bus, unsigned int slot, unsigned long fun) +{ + struct xen_pci_op op; + + memset(&op, 0, sizeof(op)); + + op.cmd = XEN_PCI_OP_disable_msix; + op.domain = dom; + op.bus = bus; + op.devfn = PCI_DEVFN(slot, fun); + + pcifront_op(dev, &op); + + return op.err; +} diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/sched.c --- a/extras/mini-os/sched.c Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/sched.c Fri Jul 18 12:12:41 2008 +0900 @@ -75,7 +75,7 @@ void schedule(void) void schedule(void) { struct thread *prev, *next, *thread; - struct list_head *iterator; + struct list_head *iterator, *next_iterator; unsigned long flags; prev = current; @@ -97,7 +97,7 @@ void schedule(void) s_time_t now = NOW(); s_time_t min_wakeup_time = now + SECONDS(10); next = NULL; - list_for_each(iterator, &idle_thread->thread_list) + list_for_each_safe(iterator, next_iterator, &idle_thread->thread_list) { thread = list_entry(iterator, struct thread, thread_list); if (!is_runnable(thread) && thread->wakeup_time != 0LL) @@ -128,7 +128,7 @@ void schedule(void) inturrupted at the return instruction. And therefore at safe point. */ if(prev != next) switch_threads(prev, next); - list_for_each(iterator, &exited_threads) + list_for_each_safe(iterator, next_iterator, &exited_threads) { thread = list_entry(iterator, struct thread, thread_list); if(thread != prev) diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/xenbus/xenbus.c --- a/extras/mini-os/xenbus/xenbus.c Tue Jul 08 11:41:43 2008 +0900 +++ b/extras/mini-os/xenbus/xenbus.c Fri Jul 18 12:12:41 2008 +0900 @@ -78,9 +78,9 @@ char **xenbus_wait_for_watch_return(xenb char **xenbus_wait_for_watch_return(xenbus_event_queue *queue) { struct xenbus_event *event; + DEFINE_WAIT(w); if (!queue) queue = &xenbus_events; - DEFINE_WAIT(w); while (!(event = *queue)) { add_waiter(w, xenbus_watch_queue); schedule(); @@ -382,6 +382,7 @@ xenbus_msg_reply(int type, static char *errmsg(struct xsd_sockmsg *rep) { + char *res; if (!rep) { char msg[] = "No reply"; size_t len = strlen(msg) + 1; @@ -389,7 +390,7 @@ static char *errmsg(struct xsd_sockmsg * } if (rep->type != XS_ERROR) return NULL; - char *res = malloc(rep->len + 1); + res = malloc(rep->len + 1); memcpy(res, rep + 1, rep->len); res[rep->len] = 0; free(rep); @@ -419,10 +420,10 @@ char *xenbus_ls(xenbus_transaction_t xbt struct xsd_sockmsg *reply, *repmsg; struct write_req req[] = { { pre, strlen(pre)+1 } }; int nr_elems, x, i; - char **res; + char **res, *msg; repmsg = xenbus_msg_reply(XS_DIRECTORY, xbt, req, ARRAY_SIZE(req)); - char *msg = errmsg(repmsg); + msg = errmsg(repmsg); if (msg) { *contents = NULL; return msg; @@ -447,9 +448,9 @@ char *xenbus_read(xenbus_transaction_t x { struct write_req req[] = { {path, strlen(path) + 1} }; struct xsd_sockmsg *rep; - char *res; + char *res, *msg; rep = xenbus_msg_reply(XS_READ, xbt, req, ARRAY_SIZE(req)); - char *msg = errmsg(rep); + msg = errmsg(rep); if (msg) { *value = NULL; return msg; @@ -469,8 +470,9 @@ char *xenbus_write(xenbus_transaction_t {value, strlen(value)}, }; struct xsd_sockmsg *rep; + char *msg; rep = xenbus_msg_reply(XS_WRITE, xbt, req, ARRAY_SIZE(req)); - char *msg = errmsg(rep); + msg = errmsg(rep); if (msg) return msg; free(rep); return NULL; @@ -487,6 +489,8 @@ char* xenbus_watch_path_token( xenbus_tr struct watch *watch = malloc(sizeof(*watch)); + char *msg; + if (!events) events = &xenbus_events; @@ -497,7 +501,7 @@ char* xenbus_watch_path_token( xenbus_tr rep = xenbus_msg_reply(XS_WATCH, xbt, req, ARRAY_SIZE(req)); - char *msg = errmsg(rep); + msg = errmsg(rep); if (msg) return msg; free(rep); @@ -515,9 +519,11 @@ char* xenbus_unwatch_path_token( xenbus_ struct watch *watch, **prev; + char *msg; + rep = xenbus_msg_reply(XS_UNWATCH, xbt, req, ARRAY_SIZE(req)); - char *msg = errmsg(rep); + msg = errmsg(rep); if (msg) return msg; free(rep); @@ -536,8 +542,9 @@ char *xenbus_rm(xenbus_transaction_t xbt { struct write_req req[] = { {path, strlen(path) + 1} }; struct xsd_sockmsg *rep; + char *msg; rep = xenbus_msg_reply(XS_RM, xbt, req, ARRAY_SIZE(req)); - char *msg = errmsg(rep); + msg = errmsg(rep); if (msg) return msg; free(rep); @@ -548,9 +555,9 @@ char *xenbus_get_perms(xenbus_transactio { struct write_req req[] = { {path, strlen(path) + 1} }; struct xsd_sockmsg *rep; - char *res; + char *res, *msg; rep = xenbus_msg_reply(XS_GET_PERMS, xbt, req, ARRAY_SIZE(req)); - char *msg = errmsg(rep); + msg = errmsg(rep); if (msg) { *value = NULL; return msg; @@ -567,14 +574,16 @@ char *xenbus_set_perms(xenbus_transactio char *xenbus_set_perms(xenbus_transaction_t xbt, const char *path, domid_t dom, char perm) { char value[PERM_MAX_SIZE]; - snprintf(value, PERM_MAX_SIZE, "%c%hu", perm, dom); struct write_req req[] = { {path, strlen(path) + 1}, - {value, strlen(value) + 1}, + {value, 0}, }; struct xsd_sockmsg *rep; + char *msg; + snprintf(value, PERM_MAX_SIZE, "%c%hu", perm, dom); + req[1].len = strlen(value) + 1; rep = xenbus_msg_reply(XS_SET_PERMS, xbt, req, ARRAY_SIZE(req)); - char *msg = errmsg(rep); + msg = errmsg(rep); if (msg) return msg; free(rep); @@ -659,11 +668,11 @@ char* xenbus_printf(xenbus_transaction_t static void do_ls_test(const char *pre) { - char **dirs; + char **dirs, *msg; int x; DEBUG("ls %s...\n", pre); - char *msg = xenbus_ls(XBT_NIL, pre, &dirs); + msg = xenbus_ls(XBT_NIL, pre, &dirs); if (msg) { DEBUG("Error in xenbus ls: %s\n", msg); free(msg); @@ -679,9 +688,9 @@ static void do_ls_test(const char *pre) static void do_read_test(const char *path) { - char *res; + char *res, *msg; DEBUG("Read %s...\n", path); - char *msg = xenbus_read(XBT_NIL, path, &res); + msg = xenbus_read(XBT_NIL, path, &res); if (msg) { DEBUG("Error in xenbus read: %s\n", msg); free(msg); @@ -693,8 +702,9 @@ static void do_read_test(const char *pat static void do_write_test(const char *path, const char *val) { + char *msg; DEBUG("Write %s to %s...\n", val, path); - char *msg = xenbus_write(XBT_NIL, path, val); + msg = xenbus_write(XBT_NIL, path, val); if (msg) { DEBUG("Result %s\n", msg); free(msg); @@ -705,8 +715,9 @@ static void do_write_test(const char *pa static void do_rm_test(const char *path) { + char *msg; DEBUG("rm %s...\n", path); - char *msg = xenbus_rm(XBT_NIL, path); + msg = xenbus_rm(XBT_NIL, path); if (msg) { DEBUG("Result %s\n", msg); free(msg); diff -r eb0fc71cfc72 -r 400e5d4877ca stubdom/Makefile --- a/stubdom/Makefile Tue Jul 08 11:41:43 2008 +0900 +++ b/stubdom/Makefile Fri Jul 18 12:12:41 2008 +0900 @@ -3,18 +3,18 @@ MINI_OS = $(XEN_ROOT)/extras/mini-os export XEN_OS=MiniOS -include $(XEN_ROOT)/Config.mk +CONFIG_QEMU=ioemu + export stubdom=y export debug=y - -IOEMU_OPTIONS=--disable-vnc-tls -BINUTILS_VERSION=2.18 -GCC_VERSION=4.2.2 +include $(XEN_ROOT)/Config.mk + +IOEMU_OPTIONS=--disable-sdl --disable-opengl --disable-gfx-check --disable-vnc-tls --disable-brlapi --disable-kqemu ZLIB_VERSION=1.2.3 LIBPCI_VERSION=2.2.9 -NEWLIB_DATE=2008-01-01 -LWIP_DATE=2008-06-01 -GRUB_DATE=2008-06-01 +NEWLIB_VERSION=1.16.0 +LWIP_VERSION=1.3.0 +GRUB_VERSION=0.97 WGET=wget -c @@ -26,10 +26,12 @@ ifeq ($(GNU_TARGET_ARCH), i686) ifeq ($(GNU_TARGET_ARCH), i686) TARGET_CFLAGS= NEWLIB_CFLAGS+=-D_I386MACH_ALLOW_HW_INTERRUPTS +STUBDOM_SUPPORTED=1 endif ifeq ($(GNU_TARGET_ARCH), x86_64) TARGET_CFLAGS=-mno-red-zone NEWLIB_CFLAGS+=-D_I386MACH_ALLOW_HW_INTERRUPTS +STUBDOM_SUPPORTED=1 endif ifeq ($(GNU_TARGET_ARCH), ia64) TARGET_CFLAGS=-mconstant-gp @@ -37,82 +39,65 @@ endif CROSS_ROOT=cross-root-$(GNU_TARGET_ARCH) CROSS_PREFIX=$(CURDIR)/$(CROSS_ROOT) -export CROSS_COMPILE=$(GNU_TARGET_ARCH)-xen-elf- -export PATH:=$(CROSS_PREFIX)/bin:$(PATH) + +# Disable PIE/SSP if GCC supports them. They can break us. +TARGET_CFLAGS += $(CFLAGS) +TARGET_CPPFLAGS += $(CPPFLAGS) +TARGET_CFLAGS += $(call cc-option,$(CC),-nopie,) +TARGET_CFLAGS += $(call cc-option,$(CC),-fno-stack-protector,) +TARGET_CFLAGS += $(call cc-option,$(CC),-fno-stack-protector-all,) + +# Do not use host headers and libs +GCC_INSTALL = $(shell gcc -print-search-dirs | sed -n -e 's/install: \(.*\)/\1/p') +TARGET_CPPFLAGS += -U __linux__ -U __FreeBSD__ -U __sun__ +TARGET_CPPFLAGS += -nostdinc +TARGET_CPPFLAGS += -isystem $(CURDIR)/$(MINI_OS)/include/posix +TARGET_CPPFLAGS += -isystem $(CROSS_PREFIX)/$(GNU_TARGET_ARCH)-xen-elf/include +TARGET_CPPFLAGS += -isystem $(GCC_INSTALL)include +TARGET_CPPFLAGS += -isystem $(CURDIR)/lwip/src/include +TARGET_CPPFLAGS += -isystem $(CURDIR)/lwip/src/include/ipv4 +TARGET_CPPFLAGS += -I$(CURDIR)/include + +TARGET_LDFLAGS += -nostdlib -L$(CROSS_PREFIX)/$(GNU_TARGET_ARCH)-xen-elf/lib TARGETS=ioemu c caml grub .PHONY: all -all: ioemu-stubdom c-stubdom pv-grub - -################ -# Cross-binutils -################ - -binutils-$(BINUTILS_VERSION).tar.bz2: - $(WGET) http://ftp.gnu.org/gnu/binutils/$@ -binutils-$(BINUTILS_VERSION): binutils-$(BINUTILS_VERSION).tar.bz2 - tar xjf $< - patch -d $@ -p1 < binutils.patch +all: build +ifeq ($(STUBDOM_SUPPORTED),1) +build: ioemu-stubdom c-stubdom pv-grub +else +build: +endif + +############## +# Cross-newlib +############## + +newlib-$(NEWLIB_VERSION).tar.gz: + $(WGET) ftp://sources.redhat.com/pub/newlib/$@ + +newlib-$(NEWLIB_VERSION): newlib-$(NEWLIB_VERSION).tar.gz + tar xzf $< + patch -d $@ -p0 < newlib.patch touch $@ - -BINUTILS_STAMPFILE=$(CROSS_ROOT)/bin/$(GNU_TARGET_ARCH)-xen-elf-ar -.PHONY: cross-binutils -cross-binutils: $(BINUTILS_STAMPFILE) -$(BINUTILS_STAMPFILE): binutils-$(BINUTILS_VERSION) - mkdir -p binutils-build - ( cd binutils-build && \ - ../binutils-$(BINUTILS_VERSION)/configure --prefix=$(CROSS_PREFIX) --verbose --target=$(GNU_TARGET_ARCH)-xen-elf && \ - $(MAKE) && \ - $(MAKE) check && \ - $(MAKE) install ) - -########### -# Cross-gcc -########### - -gcc-$(GCC_VERSION).tar.bz2: - $(WGET) http://ftp.gnu.org/gnu/gcc/gcc-$(GCC_VERSION)/gcc-$(GCC_VERSION).tar.bz2 -gcc-$(GCC_VERSION): gcc-$(GCC_VERSION).tar.bz2 - tar xjf $< - patch -d $@ -p1 < gcc.patch - touch $@ - -GCC_STAMPFILE=$(CROSS_ROOT)/bin/$(GNU_TARGET_ARCH)-xen-elf-gcc-$(GCC_VERSION) -.PHONY: cross-gcc -cross-gcc: $(GCC_STAMPFILE) -$(GCC_STAMPFILE): gcc-$(GCC_VERSION) $(BINUTILS_STAMPFILE) - mkdir -p gcc-build - ( cd gcc-build && \ - ../gcc-$(GCC_VERSION)/configure --prefix=$(CROSS_PREFIX) --verbose --target=$(GNU_TARGET_ARCH)-xen-elf --enable-languages=c --disable-libssp --with-gnu-as --with-gnu-ld && \ - $(MAKE) GCC_FOR_TARGET='$$$$r/gcc/xgcc -B$$$$r/gcc/ '"$(TARGET_CFLAGS)"' $$(FLAGS_FOR_TARGET)' && \ - $(MAKE) install ) - -############## -# Cross-newlib -############## - -newlib-cvs: - cvs -z 9 -d :pserver:anoncvs@xxxxxxxxxxxxxxxxxx:/cvs/src co -D $(NEWLIB_DATE) newlib - mv src newlib-cvs - patch -d $@ -p0 < newlib.patch NEWLIB_STAMPFILE=$(CROSS_ROOT)/$(GNU_TARGET_ARCH)-xen-elf/lib/libc.a .PHONY: cross-newlib cross-newlib: $(NEWLIB_STAMPFILE) -$(NEWLIB_STAMPFILE): newlib-cvs $(GCC_STAMPFILE) +$(NEWLIB_STAMPFILE): newlib-$(NEWLIB_VERSION) mkdir -p newlib-build ( cd newlib-build && \ - CC_FOR_TARGET="$(GNU_TARGET_ARCH)-xen-elf-gcc $(TARGET_CFLAGS) $(NEWLIB_CFLAGS)" ../newlib-cvs/configure --prefix=$(CROSS_PREFIX) --verbose --target=$(GNU_TARGET_ARCH)-xen-elf --enable-newlib-io-long-long && \ + CC_FOR_TARGET="$(CC) $(TARGET_CPPFLAGS) $(TARGET_CFLAGS) $(NEWLIB_CFLAGS)" AR_FOR_TARGET=$(AR) LD_FOR_TARGET=$(LD) RANLIB_FOR_TARGET=$(RANLIB) ../newlib-$(NEWLIB_VERSION)/configure --prefix=$(CROSS_PREFIX) --verbose --target=$(GNU_TARGET_ARCH)-xen-elf --enable-newlib-io-long-long --disable-multilib && \ $(MAKE) && \ - $(MAKE) install ) + DESTDIR= $(MAKE) install ) ############ # Cross-zlib ############ zlib-$(ZLIB_VERSION).tar.gz: - $(WGET) http://www.zlib.net/zlib-$(ZLIB_VERSION).tar.gz + $(WGET) http://www.zlib.net/$@ ZLIB_STAMPFILE=$(CROSS_ROOT)/$(GNU_TARGET_ARCH)-xen-elf/lib/libz.a .PHONY: cross-zlib @@ -120,7 +105,7 @@ cross-zlib: $(ZLIB_STAMPFILE) $(ZLIB_STAMPFILE): zlib-$(ZLIB_VERSION).tar.gz $(NEWLIB_STAMPFILE) tar xzf $< ( cd zlib-$(ZLIB_VERSION) && \ - CFLAGS="$(TARGET_CFLAGS)" CC=$(GNU_TARGET_ARCH)-xen-elf-gcc ./configure --prefix=$(CROSS_PREFIX)/$(GNU_TARGET_ARCH)-xen-elf && \ + CFLAGS="$(TARGET_CPPFLAGS) $(TARGET_CFLAGS)" CC=$(CC) ./configure --prefix=$(CROSS_PREFIX)/$(GNU_TARGET_ARCH)-xen-elf && \ $(MAKE) libz.a && \ $(MAKE) install ) @@ -129,18 +114,22 @@ cross-zlib: $(ZLIB_STAMPFILE) ############## pciutils-$(LIBPCI_VERSION).tar.bz2: - $(WGET) http://www.kernel.org/pub/software/utils/pciutils/pciutils-$(LIBPCI_VERSION).tar.bz2 + $(WGET) http://www.kernel.org/pub/software/utils/pciutils/$@ + +pciutils-$(LIBPCI_VERSION): pciutils-$(LIBPCI_VERSION).tar.bz2 + tar xjf $< + patch -d $@ -p1 < pciutils.patch + touch $@ LIBPCI_STAMPFILE=$(CROSS_ROOT)/$(GNU_TARGET_ARCH)-xen-elf/lib/libpci.a .PHONY: cross-libpci cross-libpci: $(LIBPCI_STAMPFILE) -$(LIBPCI_STAMPFILE): pciutils-$(LIBPCI_VERSION).tar.bz2 $(NEWLIB_STAMPFILE) $(ZLIB_STAMPFILE) - tar xjf $< +$(LIBPCI_STAMPFILE): pciutils-$(LIBPCI_VERSION) $(NEWLIB_STAMPFILE) $(ZLIB_STAMPFILE) ( cd pciutils-$(LIBPCI_VERSION) && \ cp ../libpci.config.h lib/config.h && \ echo '#define PCILIB_VERSION "$(LIBPCI_VERSION)"' >> lib/config.h && \ cp ../libpci.config.mak lib/config.mk && \ - $(MAKE) CC="$(GNU_TARGET_ARCH)-xen-elf-gcc $(TARGET_CFLAGS)" lib/libpci.a && \ + $(MAKE) CC="$(CC) $(TARGET_CPPFLAGS) $(TARGET_CFLAGS) -I$(realpath $(MINI_OS)/include)" lib/libpci.a && \ $(INSTALL_DATA) lib/libpci.a $(CROSS_PREFIX)/$(GNU_TARGET_ARCH)-xen-elf/lib/ && \ $(INSTALL_DIR) $(CROSS_PREFIX)/$(GNU_TARGET_ARCH)-xen-elf/include/pci && \ $(INSTALL_DATA) lib/{config,header,pci,types}.h $(CROSS_PREFIX)/$(GNU_TARGET_ARCH)-xen-elf/include/pci/ \ @@ -150,8 +139,13 @@ cross-libpci: $(LIBPCI_STAMPFILE) # lwIP ###### -lwip-cvs: - cvs -z 9 -d :pserver:anonymous@xxxxxxxxxxxxxxxxxxxxxxx:/sources/lwip co -D $(LWIP_DATE) -d $@ lwip +lwip-$(LWIP_VERSION).tar.gz: + $(WGET) http://download.savannah.gnu.org/releases/lwip/$@ + +lwip: lwip-$(LWIP_VERSION).tar.gz + tar xzf $< + patch -d $@ -p0 < lwip.patch-cvs + touch $@ ####### # Links @@ -160,9 +154,16 @@ lwip-cvs: .PHONY: $(CROSS_ROOT) $(CROSS_ROOT): cross-newlib cross-zlib cross-libpci -.PHONY: mk-symlinks -mk-symlinks: - [ -h include ] || ln -sf ../tools/include . +.PHONY: mk-headers +mk-headers: + mkdir -p include/xen && \ + ln -sf $(addprefix ../../,$(wildcard $(XEN_ROOT)/xen/include/public/*.h)) include/xen && \ + ln -sf $(addprefix ../../$(XEN_ROOT)/xen/include/public/,arch-ia64 arch-x86 hvm io xsm) include/xen && \ + ( [ -h include/xen/sys ] || ln -sf ../../$(XEN_ROOT)/tools/include/xen-sys/MiniOS include/xen/sys ) && \ + mkdir -p include/xen-foreign && \ + ln -sf $(addprefix ../../,$(wildcard $(XEN_ROOT)/tools/include/xen-foreign/*)) include/xen-foreign/ && \ + $(MAKE) -C include/xen-foreign/ && \ + ( [ -h include/xen/foreign ] || ln -sf ../xen-foreign include/xen/foreign ) mkdir -p libxc [ -h libxc/Makefile ] || ( cd libxc && \ ln -sf ../$(XEN_ROOT)/tools/libxc/*.h . && \ @@ -174,10 +175,21 @@ mk-symlinks: ln -sf ../$(XEN_ROOT)/tools/libxc/$(XEN_TARGET_ARCH)/*.h . && \ ln -sf ../$(XEN_ROOT)/tools/libxc/$(XEN_TARGET_ARCH)/Makefile . ) mkdir -p ioemu +ifeq ($(CONFIG_QEMU),ioemu) [ -h ioemu/Makefile ] || ( cd ioemu && \ - ln -sf ../$(XEN_ROOT)/tools/ioemu/* . && \ - ([ ! -h config-host.h ] || rm -f config-host.h) && \ - ([ ! -h config-host.mak ] || rm -f config-host.mak) ) + ln -sf ../$(XEN_ROOT)/tools/ioemu/* .) +else + [ -h ioemu/Makefile ] || ( cd ioemu && \ + ln -sf $(CONFIG_QEMU)/* . && \ + rm -fr i386-dm && \ + rm -fr i386-stubdom && \ + mkdir i386-dm && \ + mkdir i386-stubdom && \ + ln -sf $(CONFIG_QEMU)/i386-dm/* i386-dm/ && \ + ln -sf $(CONFIG_QEMU)/i386-stubdom/* i386-stubdom/ ) +endif + [ ! -h ioemu/config-host.h ] || rm -f ioemu/config-host.h + [ ! -h ioemu/config-host.mak ] || rm -f ioemu/config-host.mak $(MAKE) -C $(MINI_OS) links TARGETS_MINIOS=$(addprefix mini-os-,$(TARGETS)) @@ -193,82 +205,106 @@ TARGETS_MINIOS=$(addprefix mini-os-,$(TA .PHONY: libxc libxc: libxc/libxenctrl.a libxc/libxenguest.a -libxc/libxenctrl.a libxc/libxenguest.a: cross-zlib mk-symlinks - $(MAKE) -C libxc +libxc/libxenctrl.a libxc/libxenguest.a:: cross-zlib mk-headers + CPPFLAGS="$(TARGET_CPPFLAGS)" CFLAGS="$(TARGET_CFLAGS)" $(MAKE) -C libxc ####### # ioemu ####### .PHONY: ioemu -ioemu: cross-zlib cross-libpci mk-symlinks libxc +ioemu: cross-zlib cross-libpci mk-headers libxc +ifeq ($(CONFIG_QEMU),ioemu) [ -f ioemu/config-host.mak ] || \ - ( cd ioemu ; XEN_TARGET_ARCH=$(XEN_TARGET_ARCH) sh configure --prefix=/usr --enable-stubdom $(IOEMU_OPTIONS)) - $(MAKE) -C ioemu LWIPDIR=$(CURDIR)/lwip-cvs + ( cd ioemu ; \ + XEN_TARGET_ARCH=$(XEN_TARGET_ARCH) CFLAGS="$(TARGET_CFLAGS)" sh configure --prefix=/usr --enable-stubdom $(IOEMU_OPTIONS)) + CPPFLAGS="$(TARGET_CPPFLAGS)" $(MAKE) -C ioemu LWIPDIR=$(CURDIR)/lwip TOOLS= +else + [ -f ioemu/config-host.mak ] || \ + ( cd ioemu ; \ + CONFIG_STUBDOM=yes XEN_ROOT=$(abspath $(XEN_ROOT)) XEN_TARGET_ARCH=$(XEN_TARGET_ARCH) CFLAGS="$(TARGET_CFLAGS)" sh ./xen-setup --cc=$(CC) --disable-gcc-check $(IOEMU_OPTIONS)) + CPPFLAGS= TARGET_CPPFLAGS="$(TARGET_CPPFLAGS)" $(MAKE) -C ioemu LWIPDIR=$(CURDIR)/lwip TOOLS= CONFIG_STUBDOM=yes +endif ###### # caml ###### .PHONY: caml -caml: cross-newlib mk-symlinks - $(MAKE) -C $@ LWIPDIR=$(CURDIR)/lwip-cvs +caml: cross-newlib mk-headers + CPPFLAGS="$(TARGET_CPPFLAGS)" CFLAGS="$(TARGET_CFLAGS)" $(MAKE) -C $@ LWIPDIR=$(CURDIR)/lwip ### # C ### .PHONY: c -c: cross-newlib mk-symlinks - $(MAKE) -C $@ LWIPDIR=$(CURDIR)/lwip-cvs +c: cross-newlib mk-headers + CPPFLAGS="$(TARGET_CPPFLAGS)" CFLAGS="$(TARGET_CFLAGS)" $(MAKE) -C $@ LWIPDIR=$(CURDIR)/lwip ###### # Grub ###### -grub-cvs: - cvs -z 9 -d :pserver:anonymous@xxxxxxxxxxxxxx:/sources/grub co -D $(GRUB_DATE) -d $@ grub +grub-$(GRUB_VERSION).tar.gz: + $(WGET) ftp://alpha.gnu.org/gnu/grub/$@ + +grub-upstream: grub-$(GRUB_VERSION).tar.gz + tar xzf $< + mv grub-$(GRUB_VERSION) $@ for i in grub.patches/* ; do \ patch -d $@ -p1 < $$i ; \ done .PHONY: grub -grub: grub-cvs cross-newlib mk-symlinks - $(MAKE) -C $@ +grub: grub-upstream cross-newlib mk-headers + CPPFLAGS="$(TARGET_CPPFLAGS)" CFLAGS="$(TARGET_CFLAGS)" $(MAKE) -C $@ ######## # minios ######## .PHONY: ioemu-stubdom -ioemu-stubdom: mini-os-ioemu lwip-cvs libxc ioemu - DEF_CFLAGS=-DCONFIG_QEMU $(MAKE) -C $(MINI_OS) OBJ_DIR=$(CURDIR)/$< LWIPDIR=$(CURDIR)/lwip-cvs APP_OBJS="$(CURDIR)/ioemu/i386-dm-stubdom/qemu.a $(CURDIR)/ioemu/i386-dm-stubdom/libqemu.a" +ifeq ($(CONFIG_QEMU),ioemu) +ioemu-stubdom: APP_OBJS=$(CURDIR)/ioemu/i386-dm-stubdom/qemu.a $(CURDIR)/ioemu/i386-dm-stubdom/libqemu.a +else +ioemu-stubdom: APP_OBJS=$(CURDIR)/ioemu/i386-stubdom/qemu.a $(CURDIR)/ioemu/i386-stubdom/libqemu.a $(CURDIR)/ioemu/libqemu_common.a +endif +ioemu-stubdom: mini-os-ioemu lwip libxc ioemu + DEF_CPPFLAGS="$(TARGET_CPPFLAGS)" DEF_CFLAGS="-DCONFIG_QEMU $(TARGET_CFLAGS)" DEF_LDFLAGS="$(TARGET_LDFLAGS)" $(MAKE) -C $(MINI_OS) OBJ_DIR=$(CURDIR)/$< LWIPDIR=$(CURDIR)/lwip APP_OBJS="$(APP_OBJS)" CAMLLIB = $(shell ocamlc -where) .PHONY: caml-stubdom -caml-stubdom: mini-os-caml lwip-cvs libxc caml - DEF_CFLAGS=-DCONFIG_CAML $(MAKE) -C $(MINI_OS) OBJ_DIR=$(CURDIR)/$< LWIPDIR=$(CURDIR)/lwip-cvs APP_OBJS="$(CURDIR)/caml/main-caml.o $(CURDIR)/caml/caml.o $(CAMLLIB)/libasmrun.a" +caml-stubdom: mini-os-caml lwip libxc caml + DEF_CPPFLAGS="$(TARGET_CPPFLAGS)" DEF_CFLAGS="-DCONFIG_CAML $(TARGET_CFLAGS)" DEF_LDFLAGS="$(TARGET_LDFLAGS)" $(MAKE) -C $(MINI_OS) OBJ_DIR=$(CURDIR)/$< LWIPDIR=$(CURDIR)/lwip APP_OBJS="$(CURDIR)/caml/main-caml.o $(CURDIR)/caml/caml.o $(CAMLLIB)/libasmrun.a" .PHONY: c-stubdom -c-stubdom: mini-os-c lwip-cvs libxc c - DEF_CFLAGS=-DCONFIG_C $(MAKE) -C $(MINI_OS) OBJ_DIR=$(CURDIR)/$< LWIPDIR=$(CURDIR)/lwip-cvs APP_OBJS=$(CURDIR)/c/main.a +c-stubdom: mini-os-c lwip libxc c + DEF_CPPFLAGS="$(TARGET_CPPFLAGS)" DEF_CFLAGS="-DCONFIG_C $(TARGET_CFLAGS)" DEF_LDFLAGS="$(TARGET_LDFLAGS)" $(MAKE) -C $(MINI_OS) OBJ_DIR=$(CURDIR)/$< LWIPDIR=$(CURDIR)/lwip APP_OBJS=$(CURDIR)/c/main.a .PHONY: pv-grub pv-grub: mini-os-grub libxc grub - DEF_CFLAGS=-DCONFIG_GRUB $(MAKE) -C $(MINI_OS) OBJ_DIR=$(CURDIR)/$< APP_OBJS=$(CURDIR)/grub/main.a + DEF_CPPFLAGS="$(TARGET_CPPFLAGS)" DEF_CFLAGS="-DCONFIG_GRUB $(TARGET_CFLAGS)" DEF_LDFLAGS="$(TARGET_LDFLAGS)" $(MAKE) -C $(MINI_OS) OBJ_DIR=$(CURDIR)/$< APP_OBJS=$(CURDIR)/grub/main.a ######### # install ######### +ifeq ($(STUBDOM_SUPPORTED),1) install: install-ioemu install-grub - -install-ioemu: mini-os-ioemu/mini-os.gz +else +install: +endif + +install-ioemu: ioemu-stubdom + $(INSTALL_DIR) "$(DESTDIR)/usr/lib/xen/bin" $(INSTALL_PROG) stubdom-dm "$(DESTDIR)/usr/lib/xen/bin" - $(INSTALL_PROG) $< "$(DESTDIR)/usr/lib/xen/boot/ioemu-stubdom.gz" - -install-grub: mini-os-grub/mini-os.gz - $(INSTALL_PROG) $< "$(DESTDIR)/usr/lib/xen/boot/pv-grub.gz" + $(INSTALL_DIR) "$(DESTDIR)/usr/lib/xen/boot" + $(INSTALL_PROG) mini-os-ioemu/mini-os.gz "$(DESTDIR)/usr/lib/xen/boot/ioemu-stubdom.gz" + +install-grub: pv-grub + $(INSTALL_DIR) "$(DESTDIR)/usr/lib/xen/boot" + $(INSTALL_PROG) mini-os-grub/mini-os.gz "$(DESTDIR)/usr/lib/xen/boot/pv-grub.gz" ####### # clean @@ -290,25 +326,24 @@ clean: .PHONY: crossclean crossclean: clean rm -fr $(CROSS_ROOT) - rm -fr binutils-build gcc-build newlib-build + rm -fr newlib-build rm -fr zlib-$(ZLIB_VERSION) pciutils-$(LIBPCI_VERSION) # clean patched sources .PHONY: patchclean patchclean: crossclean - rm -fr binutils-$(BINUTILS_VERSION) - rm -fr gcc-$(GCC_VERSION) - rm -fr newlib-cvs - rm -fr lwip-cvs - rm -fr grub-cvs + rm -fr newlib-$(NEWLIB_VERSION) + rm -fr lwip + rm -fr grub-upstream # clean downloads .PHONY: downloadclean downloadclean: patchclean - rm -f binutils-$(BINUTILS_VERSION).tar.bz2 - rm -f gcc-$(GCC_VERSION).tar.bz2 + rm -f newlib-$(NEWLIB_VERSION).tar.gz rm -f zlib-$(ZLIB_VERSION).tar.gz rm -f pciutils-$(LIBPCI_VERSION).tar.bz2 + rm -f grub-$(GRUB_VERSION).tar.gz + rm -f lwip-$(LWIP_VERSION).tar.gz .PHONY: distclean distclean: downloadclean diff -r eb0fc71cfc72 -r 400e5d4877ca stubdom/binutils.patch --- a/stubdom/binutils.patch Tue Jul 08 11:41:43 2008 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ -It looks like binutils has troubles with makeinfo and the doc generation. -We don't need it anyway - ---- binutils-2.18/bfd/Makefile.inorig 2008-01-16 16:17:43.004484000 +0000 -+++ binutils-2.18/bfd/Makefile.in 2008-01-16 16:17:50.505526000 +0000 -@@ -271,7 +271,7 @@ - INCDIR = $(srcdir)/../include - CSEARCH = -I. -I$(srcdir) -I$(INCDIR) - MKDEP = gcc -MM --SUBDIRS = doc po -+SUBDIRS = po - bfddocdir = doc - bfdlib_LTLIBRARIES = libbfd.la - AM_CFLAGS = $(WARN_CFLAGS) diff -r eb0fc71cfc72 -r 400e5d4877ca stubdom/gcc.patch --- a/stubdom/gcc.patch Tue Jul 08 11:41:43 2008 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,31 +0,0 @@ -Backported from later versions - ---- gcc-4.2.2/gcc/config.gcc 2007-11-22 16:27:45.000000000 +0000 -+++ gcc-4.2.2/gcc/config.gcc 2007-11-22 16:23:00.000000000 +0000 -@@ -1033,6 +1033,11 @@ - tmake_file="i386/t-i386elf t-svr4" - use_fixproto=yes - ;; -+x86_64-*-elf*) -+ tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h i386/i386elf.h i386/x86-64.h" -+ tmake_file="i386/t-i386elf t-svr4" -+ use_fixproto=yes -+ ;; - i[34567]86-sequent-ptx4* | i[34567]86-sequent-sysv4*) - if test x$gas = xyes - then - -We don't have a libc yet at this stage. Unused anyway - ---- gcc-4.2.2/gcc/unwind-generic.h.orig 2008-01-11 18:54:40.000000000 +0100 -+++ gcc-4.2.2/gcc/unwind-generic.h 2008-01-11 18:54:31.000000000 +0100 -@@ -203,7 +203,6 @@ - compatible with the standard ABI for IA-64, we inline these. */ - - #ifdef __ia64__ --#include <stdlib.h> - - static inline _Unwind_Ptr - _Unwind_GetDataRelBase (struct _Unwind_Context *_C) -Backported from later versions - diff -r eb0fc71cfc72 -r 400e5d4877ca stubdom/grub.patches/00cvs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/stubdom/grub.patches/00cvs Fri Jul 18 12:12:41 2008 +0900 @@ -0,0 +1,1382 @@ +diff -uprN grub-0.97/acinclude.m4 grub/acinclude.m4 +--- grub-0.97/acinclude.m4 2004-04-27 21:48:06.000000000 +0100 ++++ grub/acinclude.m4 2007-11-05 01:29:46.000000000 +0000 +@@ -57,7 +57,7 @@ else + fi + grub_cv_prog_objcopy_absolute=yes + for link_addr in 2000 8000 7C00; do +- if AC_TRY_COMMAND([${CC-cc} ${CFLAGS} -nostdlib -Wl,-N -Wl,-Ttext -Wl,$link_addr conftest.o -o conftest.exec]); then : ++ if AC_TRY_COMMAND([${CC-cc} ${CFLAGS} ${LDFLAGS} -nostdlib -Wl,-N -Wl,-Ttext -Wl,$link_addr conftest.o -o conftest.exec]); then : + else + AC_MSG_ERROR([${CC-cc} cannot link at address $link_addr]) + fi +diff -uprN grub-0.97/ChangeLog grub/ChangeLog +--- grub-0.97/ChangeLog 2005-05-08 03:47:02.000000000 +0100 ++++ grub/ChangeLog 2008-05-20 12:04:18.000000000 +0100 +@@ -1,3 +1,127 @@ ++2008-05-20 Robert Millan <rmh@xxxxxxxxxxx> ++ ++ * netboot/cs89x0.c: Fix license violation. ++ * netboot/cs89x0.h: Likewise. ++ ++2008-04-10 Pavel Roskin <proski@xxxxxxx> ++ ++ * configure.ac: Always use "_cv_" in cache variables for ++ compatibility with Autoconf 2.62. ++ ++2008-03-28 Robert Millan <rmh@xxxxxxxxxxx> ++ ++ Surpass 1 TiB disk addressing limit. Note: there are no plans to handle ++ the 2 TiB disk limit in GRUB Legacy, since that would need considerable ++ rework. If you have >2TiB disks, use GRUB 2 instead. ++ ++ * grub/asmstub.c (biosdisk): Add unsigned qualifier to `sector'. ++ * stage2/bios.c (biosdisk): Likewise. ++ * stage2/disk_io.c (rawread, devread, rawwrite, devwrite): Likewise. ++ * stage2/shared.h (rawread, devread, rawwrite, devwrite): Likewise. ++ * lib/device.c (get_drive_geometry): Replace BLKGETSIZE with ++ BLKGETSIZE64. ++ ++2007-10-29 Pavel Roskin <proski@xxxxxxx> ++ ++ * configure.ac: Test if '--build-id=none' is supported by the ++ linker and add it to LDFLAGS if possible. Build ID causes ++ objcopy to generate huge binary files. ++ * aclocal.m4 (grub_PROG_OBJCOPY_ABSOLUTE): Use LDFLAGS when ++ linking, so that build ID doesn't break the test. ++ * stage1/Makefile.am: Preserve LDFLAGS, use stage1_exec_LDFLAGS. ++ ++2007-02-22 Pavel Roskin <proski@xxxxxxx> ++ ++ * stage2/iso9660.h: Remove unnecessary packed attributes. ++ ++2007-02-22 Robert Millan <rmh@xxxxxxxxxxx> ++ ++ * util/mkbimage: Update my email address, and remove my name from ++ some places where unnecessary credit is given. ++ ++2006-09-10 Pavel Roskin <proski@xxxxxxx> ++ ++ * netboot/natsemi.c: Fix compile error with gcc 4.1.1. Cast ++ cannot make a variable volatile - it should be declared as such. ++ * netboot/sis900.c: Likewise. ++ ++2006-09-08 Pavel Roskin <proski@xxxxxxx> ++ ++ * netboot/etherboot.h: Remove incorrect extern declarations of ++ the variables later declared static. Move BOOTP_DATA_ADDR ... ++ * netboot/main.c: ... here. Eliminate end_of_rfc1533 - it's ++ write-only. ++ ++2006-06-24 Yoshinori K. Okuji <okuji@xxxxxxxxx> ++ ++ * docs/grub.texi: Changed the license term to the GNU Free ++ Documentation License 1.2. ++ ++ * docs/multiboot.texi: Reformatted to show the license term ++ and the version number explicitly. ++ ++ * docs/fdl.texi: New file. ++ ++ * docs/Makefile.am (grub_TEXINFOS): Added fdl.texi. ++ ++2006-06-24 Robert Millan <robertmh@xxxxxxx> ++ ++ * lib/device.c (write_to_partition): /dev/ataraid/ and /dev/rd/ ++ partitions have a "p" prefix. Add it. ++ ++2006-06-24 Robert Millan <robertmh@xxxxxxx> ++ ++ * lib/device.c (get_i2o_disk_name): New function. ++ (init_device_map) [__linux__]: Add support for I2O devices. ++ ++2006-05-02 Pavel Roskin <proski@xxxxxxx> ++ ++ * stage2/stage2.c (run_menu): Fix "savedefault" to save only top ++ level menu positions. Remember current position when calling a ++ submenu. Don't recalculate it when booting from a submenu. ++ ++ * grub/main.c (main): Make sure the boot drive number doesn't ++ exceed 255. ++ ++2006-05-02 Vesa Jaaskelainen <chaac@xxxxxx> ++ ++ * stage2/shared.h (vbe_mode): Back ported aligment fix from GRUB 2 ++ to GRUB Legacy. Problem reported by Gerardo Richarte. ++ ++2006-04-23 Robert Millan <robertmh@xxxxxxx> ++ ++ * grub/asmstub.c (get_diskinfo): Optimize sysctl routine. ++ ++2006-04-20 Robert Millan <robertmh@xxxxxxx> ++ ++ Fixes for kernel of FreeBSD: ++ * grub/asmstub.c (get_diskinfo): Toggle "kern.geom.debugflags" sysctl ++ before opening a device for writing. ++ * util/grub-install.in: Devices don't have this "r" prefix anymore. ++ ++2006-04-16 Yoshinori K. Okuji <okuji@xxxxxxxxx> ++ ++ * docs/multiboot.texi: Correct the offset of address ++ fields. Reported by Jeroen Dekkers. ++ ++2006-03-21 Yoshinori K. Okuji <okuji@xxxxxxxxx> ++ ++ * stage2/builtins.c (setup_func): Specify the size of DEVICE to ++ grub_strncat instead of a strange number 256. Reported by Vitaly ++ Fertman <vitaly@xxxxxxxxxxx>. ++ ++2005-09-29 Yoshinori K. Okuji <okuji@xxxxxxxxx> ++ ++ * docs/multiboot.texi: Fix a bug in the byte order of ++ boot_device. I hope this won't affect any OS image. ++ Increased the version number to 0.6.94. ++ ++2005-09-28 Yoshinori K. Okuji <okuji@xxxxxxxxx> ++ ++ * stage2/boot.c (load_image): Even if an OS image is an ELF ++ object, use the a.out kludge if MULTIBOOT_AOUT_KLUDGE is ++ specified. ++ + 2005-05-08 Yoshinori K. Okuji <okuji@xxxxxxxxx> + + * configure.ac (AC_INIT): Upgraded to 0.97. +diff -uprN grub-0.97/configure grub/configure +--- grub-0.97/configure 2005-05-08 03:48:12.000000000 +0100 ++++ grub/configure 2007-11-05 01:29:46.000000000 +0000 +@@ -3694,6 +3694,64 @@ if test "x$undef_flag" = xyes; then + CPPFLAGS="$CPPFLAGS -Wundef" + fi + ++# Check if build ID can be disabled in the linker ++echo "$as_me:$LINENO: checking whether linker accepts \`--build-id=none'" >&5 ++echo $ECHO_N "checking whether linker accepts \`--build-id=none'... $ECHO_C" >&6 ++save_LDFLAGS="$LDFLAGS" ++LDFLAGS="$LDFLAGS -Wl,--build-id=none" ++cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++ ++int ++main () ++{ ++ ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ build_id_flag=yes ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++build_id_flag=no ++fi ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++echo "$as_me:$LINENO: result: $build_id_flag" >&5 ++echo "${ECHO_T}$build_id_flag" >&6 ++LDFLAGS="$save_LDFLAGS" ++if test "x$build_id_flag" = xyes; then ++ LDFLAGS="$LDFLAGS -Wl,--build-id=none" ++fi ++ + if test "x$with_binutils" != x; then + # Extract the first word of "objcopy", so it can be a program name with args. + set dummy objcopy; ac_word=$2 +@@ -3892,7 +3950,7 @@ echo "$as_me: error: ${CC-cc} cannot com + fi + grub_cv_prog_objcopy_absolute=yes + for link_addr in 2000 8000 7C00; do +- if { ac_try='${CC-cc} ${CFLAGS} -nostdlib -Wl,-N -Wl,-Ttext -Wl,$link_addr conftest.o -o conftest.exec' ++ if { ac_try='${CC-cc} ${CFLAGS} ${LDFLAGS} -nostdlib -Wl,-N -Wl,-Ttext -Wl,$link_addr conftest.o -o conftest.exec' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +diff -uprN grub-0.97/configure.ac grub/configure.ac +--- grub-0.97/configure.ac 2005-05-08 03:36:03.000000000 +0100 ++++ grub/configure.ac 2008-04-10 23:26:50.000000000 +0100 +@@ -86,13 +86,13 @@ if test "x$ac_cv_prog_gcc" = xyes; then + fi + STAGE1_CFLAGS="-O2" + GRUB_CFLAGS="-O2" +- AC_CACHE_CHECK([whether optimization for size works], size_flag, [ ++ AC_CACHE_CHECK([whether optimization for size works], grub_cv_cc_Os, [ + saved_CFLAGS=$CFLAGS + CFLAGS="-Os -g" +- AC_TRY_COMPILE(, , size_flag=yes, size_flag=no) ++ AC_TRY_COMPILE(, , grub_cv_cc_Os=yes, grub_cv_cc_Os=no) + CFLAGS=$saved_CFLAGS + ]) +- if test "x$size_flag" = xyes; then ++ if test "x$grub_cv_cc_Os" = xyes; then + STAGE2_CFLAGS="-Os" + else + STAGE2_CFLAGS="-O2 -fno-strength-reduce -fno-unroll-loops" +@@ -100,16 +100,16 @@ if test "x$ac_cv_prog_gcc" = xyes; then + # OpenBSD has a GCC extension for protecting applications from + # stack smashing attacks, but GRUB doesn't want this feature. + AC_CACHE_CHECK([whether gcc has -fno-stack-protector], +- no_stack_protector_flag, [ ++ grub_cv_cc_no_stack_protector, [ + saved_CFLAGS=$CFLAGS + CFLAGS="-fno-stack-protector" + AC_TRY_COMPILE(, + , +- no_stack_protector_flag=yes, +- no_stack_protector_flag=no) ++ grub_cv_cc_no_stack_protector=yes, ++ grub_cv_cc_no_stack_protector=no) + CFLAGS=$saved_CFLAGS + ]) +- if test "x$no_stack_protector_flag" = xyes; then ++ if test "x$grub_cv_cc_no_stack_protector" = xyes; then + STAGE2_CFLAGS="$STAGE2_CFLAGS -fno-stack-protector" + fi + fi +@@ -123,33 +123,44 @@ AC_SUBST(GRUB_CFLAGS) + CPPFLAGS="$CPPFLAGS -Wall -Wmissing-prototypes -Wunused -Wshadow" + CPPFLAGS="$CPPFLAGS -Wpointer-arith" + +-AC_CACHE_CHECK([whether -Wundef works], undef_flag, [ ++AC_CACHE_CHECK([whether -Wundef works], grub_cv_cc_Wundef, [ + saved_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="-Wundef" +- AC_TRY_COMPILE(, , undef_flag=yes, undef_flag=no) ++ AC_TRY_COMPILE(, , grub_cv_cc_Wundef=yes, grub_cv_cc_Wundef=no) + CPPFLAGS="$saved_CPPFLAGS" + ]) + + # The options `-falign-*' are supported by gcc 3.0 or later. + # Probably it is sufficient to only check for -falign-loops. +-AC_CACHE_CHECK([whether -falign-loops works], [falign_loop_flag], [ ++AC_CACHE_CHECK([whether -falign-loops works], [grub_cv_cc_falign_loop], [ + saved_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="-falign-loops=1" +- AC_TRY_COMPILE(, , [falign_loop_flag=yes], [falign_loop_flag=no]) ++ AC_TRY_COMPILE(, , [grub_cv_cc_falign_loop=yes], [grub_cv_cc_falign_loop=no]) + CPPFLAGS="$saved_CPPFLAGS" + ]) + + # Force no alignment to save space. +-if test "x$falign_loop_flag" = xyes; then ++if test "x$grub_cv_cc_falign_loop" = xyes; then + CPPFLAGS="$CPPFLAGS -falign-jumps=1 -falign-loops=1 -falign-functions=1" + else + CPPFLAGS="$CPPFLAGS -malign-jumps=1 -malign-loops=1 -malign-functions=1" + fi + +-if test "x$undef_flag" = xyes; then ++if test "x$grub_cv_cc_Wundef" = xyes; then + CPPFLAGS="$CPPFLAGS -Wundef" + fi + ++# Check if build ID can be disabled in the linker ++AC_MSG_CHECKING([whether linker accepts `--build-id=none']) ++save_LDFLAGS="$LDFLAGS" ++LDFLAGS="$LDFLAGS -Wl,--build-id=none" ++AC_TRY_LINK(, , build_id_flag=yes, build_id_flag=no) ++AC_MSG_RESULT([$build_id_flag]) ++LDFLAGS="$save_LDFLAGS" ++if test "x$build_id_flag" = xyes; then ++ LDFLAGS="$LDFLAGS -Wl,--build-id=none" ++fi ++ + if test "x$with_binutils" != x; then + dnl AC_PATH_TOOL(OBJCOPY, objcopy, , "$with_binutils:$PATH") + AC_PATH_PROG(OBJCOPY, objcopy, , "$with_binutils:$PATH") +diff -uprN grub-0.97/docs/grub.8 grub/docs/grub.8 +--- grub-0.97/docs/grub.8 2005-05-08 03:48:56.000000000 +0100 ++++ grub/docs/grub.8 2006-06-24 15:40:02.000000000 +0100 +@@ -1,5 +1,5 @@ + .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.23. +-.TH GRUB "8" "May 2005" "grub (GNU GRUB 0.97)" FSF ++.TH GRUB "8" "June 2006" "grub (GNU GRUB 0.97)" FSF + .SH NAME + grub \- the grub shell + .SH SYNOPSIS +diff -uprN grub-0.97/docs/grub-install.8 grub/docs/grub-install.8 +--- grub-0.97/docs/grub-install.8 2005-05-08 03:48:56.000000000 +0100 ++++ grub/docs/grub-install.8 2006-06-24 15:40:02.000000000 +0100 +@@ -1,5 +1,5 @@ + .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.23. +-.TH GRUB-INSTALL "8" "May 2005" "grub-install (GNU GRUB 0.97)" FSF ++.TH GRUB-INSTALL "8" "June 2006" "grub-install (GNU GRUB 0.97)" FSF + .SH NAME + grub-install \- install GRUB on your drive + .SH SYNOPSIS +diff -uprN grub-0.97/docs/grub-md5-crypt.8 grub/docs/grub-md5-crypt.8 +--- grub-0.97/docs/grub-md5-crypt.8 2005-05-08 03:48:56.000000000 +0100 ++++ grub/docs/grub-md5-crypt.8 2006-06-24 15:40:02.000000000 +0100 +@@ -1,5 +1,5 @@ + .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.23. +-.TH GRUB-MD5-CRYPT "8" "May 2005" "grub-md5-crypt (GNU GRUB )" FSF ++.TH GRUB-MD5-CRYPT "8" "June 2006" "grub-md5-crypt (GNU GRUB )" FSF + .SH NAME + grub-md5-crypt \- Encrypt a password in MD5 format + .SH SYNOPSIS +diff -uprN grub-0.97/docs/grub-terminfo.8 grub/docs/grub-terminfo.8 +--- grub-0.97/docs/grub-terminfo.8 2005-05-08 03:48:56.000000000 +0100 ++++ grub/docs/grub-terminfo.8 2006-06-24 15:40:02.000000000 +0100 +@@ -1,5 +1,5 @@ + .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.23. +-.TH GRUB-TERMINFO "8" "May 2005" "grub-terminfo (GNU GRUB 0.97)" FSF ++.TH GRUB-TERMINFO "8" "June 2006" "grub-terminfo (GNU GRUB 0.97)" FSF + .SH NAME + grub-terminfo \- Generate a terminfo command from a terminfo name + .SH SYNOPSIS +diff -uprN grub-0.97/docs/grub.texi grub/docs/grub.texi +--- grub-0.97/docs/grub.texi 2005-05-08 03:59:59.000000000 +0100 ++++ grub/docs/grub.texi 2006-06-24 15:40:02.000000000 +0100 +@@ -2,22 +2,41 @@ + @c -*-texinfo-*- + @c %**start of header + @setfilename grub.info +-@settitle GRUB Manual +-@c %**end of header +- + @include version.texi +- ++@settitle GNU GRUB Manual @value{VERSION} + @c Unify all our little indices for now. + @syncodeindex fn cp + @syncodeindex vr cp + @syncodeindex ky cp + @syncodeindex pg cp + @syncodeindex tp cp ++@c %**end of header + + @footnotestyle separate + @paragraphindent 3 + @finalout + ++@copying ++This manual is for GNU GRUB (version @value{VERSION}, ++@value{UPDATED}). ++ ++Copyright @copyright{} 1999,2000,2001,2002,2004,2006 Free Software Foundation, Inc. ++ ++@quotation ++Permission is granted to copy, distribute and/or modify this document ++under the terms of the GNU Free Documentation License, Version 1.2 or ++any later version published by the Free Software Foundation; with no ++Invariant Sections, with the Front-Cover Texts being ``A GNU Manual,'' ++and with the Back-Cover Texts as in (a) below. A copy of the ++license is included in the section entitled ``GNU Free Documentation ++License.'' ++ ++(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify ++this GNU Manual, like GNU software. Copies published by the Free ++Software Foundation raise funds for GNU development.'' ++@end quotation ++@end copying ++ + @dircategory Kernel + @direntry + * GRUB: (grub). The GRand Unified Bootloader +@@ -34,53 +53,16 @@ + + @setchapternewpage odd + +-@ifinfo +-Copyright @copyright{} 1999,2000,2001,2002,2004 Free Software Foundation, Inc. +- +-Permission is granted to make and distribute verbatim copies of +-this manual provided the copyright notice and this permission notice +-are preserved on all copies. +- +-@ignore +-Permission is granted to process this file through TeX and print the +-results, provided the printed document carries a copying permission +-notice identical to this one except for the removal of this paragraph +-(this paragraph not being relevant to the printed manual). +- +-@end ignore +- +-Permission is granted to copy and distribute modified versions of this +-manual under the conditions for verbatim copying, provided also that +-the entire resulting derived work is distributed under the terms of a +-permission notice identical to this one. +- +-Permission is granted to copy and distribute translations of this manual +-into another language, under the above conditions for modified versions. +-@end ifinfo +- + @titlepage + @sp 10 +-@title the GRUB manual ++@title the GNU GRUB manual + @subtitle The GRand Unified Bootloader, version @value{VERSION}, @value{UPDATED}. + @author Gordon Matzigkeit + @author Yoshinori K. Okuji + @c The following two commands start the copyright page. + @page + @vskip 0pt plus 1filll +-Copyright @copyright{} 1999,2000,2001,2002,2004 Free Software Foundation, Inc. +- +-Permission is granted to make and distribute verbatim copies of +-this manual provided the copyright notice and this permission notice +-are preserved on all copies. +-Permission is granted to copy and distribute modified versions of this +-manual under the conditions for verbatim copying, provided that the entire +-resulting derived work is distributed under the terms of a permission +-notice identical to this one. +- +-Permission is granted to copy and distribute translations of this manual +-into another language, under the above conditions for modified versions, +-except that this permission notice may be stated in a translation approved +-by Free Software Foundation. ++@insertcopying + @end titlepage + + @c Output the table of contents at the beginning. +@@ -91,12 +73,14 @@ by Free Software Foundation. + + @ifnottex + @node Top +-@top GRUB manual ++@top GNU GRUB manual + + This is the documentation of GNU GRUB, the GRand Unified Bootloader, + a flexible and powerful boot loader program for @sc{pc}s. + + This edition documents version @value{VERSION}. ++ ++@insertcopying + @end ifnottex + + @menu +@@ -124,6 +108,7 @@ This edition documents version @value{VE + * Reporting bugs:: Where you should send a bug report + * Future:: Some future plans on GRUB + * Internals:: Hacking GRUB ++* Copying This Manual:: Copying This Manual + * Index:: + @end menu + +@@ -3965,6 +3950,16 @@ homepage}. + @include internals.texi + + ++@node Copying This Manual ++@appendix Copying This Manual ++ ++@menu ++* GNU Free Documentation License:: License for copying this manual. ++@end menu ++ ++@include fdl.texi ++ ++ + @node Index + @unnumbered Index + +diff -uprN grub-0.97/docs/Makefile.am grub/docs/Makefile.am +--- grub-0.97/docs/Makefile.am 2003-07-09 12:45:35.000000000 +0100 ++++ grub/docs/Makefile.am 2006-06-24 15:40:02.000000000 +0100 +@@ -1,5 +1,5 @@ + info_TEXINFOS = grub.texi multiboot.texi +-grub_TEXINFOS = internals.texi ++grub_TEXINFOS = internals.texi fdl.texi + EXAMPLES = boot.S kernel.c multiboot.h + multiboot_TEXINFOS = boot.S.texi kernel.c.texi multiboot.h.texi + man_MANS = grub.8 mbchk.1 grub-install.8 grub-md5-crypt.8 grub-terminfo.8 +diff -uprN grub-0.97/docs/Makefile.in grub/docs/Makefile.in +--- grub-0.97/docs/Makefile.in 2005-05-08 03:42:34.000000000 +0100 ++++ grub/docs/Makefile.in 2006-06-24 15:40:02.000000000 +0100 +@@ -202,7 +202,7 @@ sharedstatedir = @sharedstatedir@ + sysconfdir = @sysconfdir@ + target_alias = @target_alias@ + info_TEXINFOS = grub.texi multiboot.texi +-grub_TEXINFOS = internals.texi ++grub_TEXINFOS = internals.texi fdl.texi + EXAMPLES = boot.S kernel.c multiboot.h + multiboot_TEXINFOS = boot.S.texi kernel.c.texi multiboot.h.texi + man_MANS = grub.8 mbchk.1 grub-install.8 grub-md5-crypt.8 grub-terminfo.8 +diff -uprN grub-0.97/docs/mbchk.1 grub/docs/mbchk.1 +--- grub-0.97/docs/mbchk.1 2005-05-08 03:48:56.000000000 +0100 ++++ grub/docs/mbchk.1 2006-06-24 15:40:02.000000000 +0100 +@@ -1,5 +1,5 @@ + .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.23. +-.TH MBCHK "1" "May 2005" "mbchk (GNU GRUB 0.97)" FSF ++.TH MBCHK "1" "June 2006" "mbchk (GNU GRUB 0.97)" FSF + .SH NAME + mbchk \- check the format of a Multiboot kernel + .SH SYNOPSIS +diff -uprN grub-0.97/docs/multiboot.texi grub/docs/multiboot.texi +--- grub-0.97/docs/multiboot.texi 2003-07-09 12:45:36.000000000 +0100 ++++ grub/docs/multiboot.texi 2006-06-24 15:40:02.000000000 +0100 +@@ -1,32 +1,28 @@ + \input texinfo @c -*-texinfo-*- +-@c -*-texinfo-*- + @c %**start of header + @setfilename multiboot.info +-@settitle Multiboot Specification +-@c %**end of header +- ++@set VERSION 0.6.95 ++@settitle Multiboot Specification version @value{VERSION} + @c Unify all our little indices for now. + @syncodeindex fn cp + @syncodeindex vr cp + @syncodeindex ky cp + @syncodeindex pg cp + @syncodeindex tp cp ++@c %**end of header + + @footnotestyle separate + @paragraphindent 3 + @finalout + ++@copying ++Copyright @copyright{} 1995,96 Bryan Ford <baford@@cs.utah.edu> + +-@dircategory Kernel +-@direntry +-* Multiboot Specification: (multiboot). Multiboot Specification. +-@end direntry ++Copyright @copyright{} 1995,96 Erich Stefan Boleyn <erich@@uruk.org> + +-@ifinfo +-Copyright @copyright{} 1995, 96 Bryan Ford <baford@@cs.utah.edu> +-Copyright @copyright{} 1995, 96 Erich Stefan Boleyn <erich@@uruk.org> +-Copyright @copyright{} 1999, 2000, 2001, 2002 Free Software Foundation, Inc. ++Copyright @copyright{} 1999,2000,2001,2002,2005,2006 Free Software Foundation, Inc. + ++@quotation + Permission is granted to make and distribute verbatim copies of + this manual provided the copyright notice and this permission notice + are preserved on all copies. +@@ -36,7 +32,6 @@ Permission is granted to process this fi + results, provided the printed document carries a copying permission + notice identical to this one except for the removal of this paragraph + (this paragraph not being relevant to the printed manual). +- + @end ignore + + Permission is granted to copy and distribute modified versions of this +@@ -45,31 +40,23 @@ the entire resulting derived work is dis + permission notice identical to this one. + + Permission is granted to copy and distribute translations of this manual +-into another language, under the above conditions for modified versions. +-@end ifinfo ++into another language, under the above conditions for modified ++versions. ++@end quotation ++@end copying ++ ++@dircategory Kernel ++@direntry ++* Multiboot Specification: (multiboot). Multiboot Specification. ++@end direntry + + @titlepage + @sp 10 +-@title The Multiboot Specification ++@title The Multiboot Specification version @value{VERSION} + @author Yoshinori K. Okuji, Bryan Ford, Erich Stefan Boleyn, Kunihiro Ishiguro + @page +- + @vskip 0pt plus 1filll +-Copyright @copyright{} 1995, 96 Bryan Ford <baford@@cs.utah.edu> +-Copyright @copyright{} 1995, 96 Erich Stefan Boleyn <erich@@uruk.org> +-Copyright @copyright{} 1999, 2000, 2001, 2002 Free Software Foundation, Inc. +- +-Permission is granted to make and distribute verbatim copies of +-this manual provided the copyright notice and this permission notice +-are preserved on all copies. +- +-Permission is granted to copy and distribute modified versions of this +-manual under the conditions for verbatim copying, provided also that +-the entire resulting derived work is distributed under the terms of a +-permission notice identical to this one. +- +-Permission is granted to copy and distribute translations of this manual +-into another language, under the above conditions for modified versions. ++@insertcopying + @end titlepage + + @finalout +@@ -80,7 +67,9 @@ into another language, under the above c + @top Multiboot Specification + + This file documents Multiboot Specification, the proposal for the boot +-sequence standard. This edition documents version 0.6.93. ++sequence standard. This edition documents version @value{VERSION}. ++ ++@insertcopying + @end ifnottex + + @menu +@@ -426,7 +415,7 @@ mode table (@pxref{Boot information form + kernel. + + If bit 16 in the @samp{flags} word is set, then the fields at offsets +-8-24 in the Multiboot header are valid, and the boot loader should use ++12-28 in the Multiboot header are valid, and the boot loader should use + them instead of the fields in the actual executable header to calculate + where to load the OS image. This information does not need to be + provided if the kernel image is in @sc{elf} format, but it @emph{must} +@@ -677,7 +666,7 @@ follows: + @example + @group + +-------+-------+-------+-------+ +-| drive | part1 | part2 | part3 | ++| part3 | part2 | part1 | drive | + +-------+-------+-------+-------+ + @end group + @end example +@@ -1197,6 +1186,17 @@ Rewritten, using more strict words. + @item + The maintainer changes to the GNU GRUB maintainer team + @email{bug-grub@@gnu.org}, from Bryan Ford and Erich Stefan Boleyn. ++ ++@item ++The byte order of the @samp{boot_device} in Multiboot information is ++reversed. This was a mistake. ++ ++@item ++The offset of the address fields were wrong. ++ ++@item ++The format is adapted to a newer Texinfo, and the version number is ++specified more explicitly in the title. + @end itemize + + @item 0.6 +diff -uprN grub-0.97/grub/asmstub.c grub/grub/asmstub.c +--- grub-0.97/grub/asmstub.c 2005-02-16 20:45:14.000000000 +0000 ++++ grub/grub/asmstub.c 2008-03-28 13:22:28.000000000 +0000 +@@ -55,6 +55,10 @@ int grub_stage2 (void); + # endif /* ! BLKFLSBUF */ + #endif /* __linux__ */ + ++#if defined(__FreeBSD_kernel__) || defined(__FreeBSD__) ++# include <sys/sysctl.h> ++#endif ++ + /* We want to prevent any circularararity in our stubs, as well as + libc name clashes. */ + #define WITHOUT_LIBC_STUBS 1 +@@ -777,7 +781,39 @@ get_diskinfo (int drive, struct geometry + + /* Open read/write, or read-only if that failed. */ + if (! read_only) +- disks[drive].flags = open (devname, O_RDWR); ++ { ++/* By default, kernel of FreeBSD does not allow overwriting MBR */ ++#if defined(__FreeBSD_kernel__) || defined(__FreeBSD__) ++#define GEOM_SYSCTL "kern.geom.debugflags" ++ int old_flags, flags; ++ size_t sizeof_int = sizeof (int); ++ ++ if (sysctlbyname (GEOM_SYSCTL, &old_flags, &sizeof_int, NULL, 0) != 0) ++ grub_printf ("failed to get " GEOM_SYSCTL "sysctl: %s\n", strerror (errno)); ++ ++ if ((old_flags & 0x10) == 0) ++ { ++ /* "allow foot shooting", see geom(4) */ ++ flags = old_flags | 0x10; ++ ++ if (sysctlbyname (GEOM_SYSCTL, NULL, NULL, &flags, sizeof (int)) != 0) ++ { ++ flags = old_flags; ++ grub_printf ("failed to set " GEOM_SYSCTL "sysctl: %s\n", strerror (errno)); ++ } ++ } ++ else ++ flags = old_flags; ++#endif ++ disks[drive].flags = open (devname, O_RDWR); ++#if defined(__FreeBSD_kernel__) || defined(__FreeBSD__) ++ if (flags != old_flags) ++ { ++ if (sysctlbyname (GEOM_SYSCTL, NULL, NULL, &old_flags, sizeof (int)) != 0) ++ grub_printf ("failed to set " GEOM_SYSCTL "sysctl: %s\n", strerror (errno)); ++ } ++#endif ++ } + + if (disks[drive].flags == -1) + { +@@ -926,7 +962,7 @@ hex_dump (void *buf, size_t size) + + int + biosdisk (int subfunc, int drive, struct geometry *geometry, +- int sector, int nsec, int segment) ++ unsigned int sector, int nsec, int segment) + { + char *buf; + int fd = geometry->flags; +diff -uprN grub-0.97/grub/main.c grub/grub/main.c +--- grub-0.97/grub/main.c 2003-07-09 12:45:36.000000000 +0100 ++++ grub/grub/main.c 2006-05-05 22:43:46.000000000 +0100 +@@ -32,6 +32,7 @@ int grub_stage2 (void); + #define WITHOUT_LIBC_STUBS 1 + #include <shared.h> + #include <term.h> ++#include <device.h> + + char *program_name = 0; + int use_config_file = 1; +@@ -192,6 +193,12 @@ main (int argc, char **argv) + perror ("strtoul"); + exit (1); + } ++ if (boot_drive >= NUM_DISKS) ++ { ++ fprintf (stderr, "boot_drive should be from 0 to %d\n", ++ NUM_DISKS - 1); ++ exit (1); ++ } + break; + + case OPT_NO_CONFIG_FILE: +diff -uprN grub-0.97/lib/device.c grub/lib/device.c +--- grub-0.97/lib/device.c 2005-03-28 00:14:25.000000000 +0100 ++++ grub/lib/device.c 2008-03-28 13:22:28.000000000 +0000 +@@ -69,9 +69,9 @@ struct hd_geometry + # ifndef CDROM_GET_CAPABILITY + # define CDROM_GET_CAPABILITY 0x5331 /* get capabilities */ + # endif /* ! CDROM_GET_CAPABILITY */ +-# ifndef BLKGETSIZE +-# define BLKGETSIZE _IO(0x12,96) /* return device size */ +-# endif /* ! BLKGETSIZE */ ++# ifndef BLKGETSIZE64 ++# define BLKGETSIZE64 _IOR(0x12,114,size_t) /* return device size */ ++# endif /* ! BLKGETSIZE64 */ + #endif /* __linux__ */ + + /* Use __FreeBSD_kernel__ instead of __FreeBSD__ for compatibility with +@@ -152,19 +152,19 @@ get_drive_geometry (struct geometry *geo + /* Linux */ + { + struct hd_geometry hdg; +- unsigned long nr; ++ unsigned long long nr; + + if (ioctl (fd, HDIO_GETGEO, &hdg)) + goto fail; + +- if (ioctl (fd, BLKGETSIZE, &nr)) ++ if (ioctl (fd, BLKGETSIZE64, &nr)) + goto fail; + + /* Got the geometry, so save it. */ + geom->cylinders = hdg.cylinders; + geom->heads = hdg.heads; + geom->sectors = hdg.sectors; +- geom->total_sectors = nr; ++ geom->total_sectors = nr / 512; + + goto success; + } +@@ -407,6 +407,12 @@ get_ataraid_disk_name (char *name, int u + { + sprintf (name, "/dev/ataraid/d%c", unit + '0'); + } ++ ++static void ++get_i2o_disk_name (char *name, char unit) ++{ ++ sprintf (name, "/dev/i2o/hd%c", unit); ++} + #endif + + /* Check if DEVICE can be read. If an error occurs, return zero, +@@ -801,6 +807,29 @@ init_device_map (char ***map, const char + } + } + } ++ ++ /* This is for I2O - we have /dev/i2o/hd<logical drive><partition> */ ++ { ++ int unit; ++ ++ for (unit = 'a'; unit < 'f'; unit++) ++ { ++ char name[24]; ++ ++ get_i2o_disk_name (name, unit); ++ if (check_device (name)) ++ { ++ (*map)[num_hd + 0x80] = strdup (name); ++ assert ((*map)[num_hd + 0x80]); ++ ++ /* If the device map file is opened, write the map. */ ++ if (fp) ++ fprintf (fp, "(hd%d)\t%s\n", num_hd, name); ++ ++ num_hd++; ++ } ++ } ++ } + #endif /* __linux__ */ + + /* OK, close the device map file if opened. */ +@@ -861,6 +890,12 @@ write_to_partition (char **map, int driv + if (strcmp (dev + strlen(dev) - 5, "/disc") == 0) + strcpy (dev + strlen(dev) - 5, "/part"); + } ++ else ++ { ++ if ((strncmp (dev, "/dev/ataraid/", 13) == 0) || ++ (strncmp (dev, "/dev/rd/", 8) == 0)) ++ strcpy (dev + strlen(dev), "p"); ++ } + sprintf (dev + strlen(dev), "%d", ((partition >> 16) & 0xFF) + 1); + + /* Open the partition. */ +diff -uprN grub-0.97/netboot/3c509.c grub/netboot/3c509.c +--- grub-0.97/netboot/3c509.c 2003-07-09 12:45:37.000000000 +0100 ++++ grub/netboot/3c509.c 2002-01-02 21:56:40.000000000 +0000 +@@ -18,7 +18,7 @@ Author: Martin Renters. + + 3c509 support added by Serge Babkin (babkin@xxxxxxxxxxxxxx) + +-$Id: 3c509.c,v 1.4 2002/01/02 21:56:40 okuji Exp $ ++$Id: 3c509.c 609 2002-01-02 21:56:40Z okuji $ + + ***************************************************************************/ + +diff -uprN grub-0.97/netboot/cs89x0.c grub/netboot/cs89x0.c +--- grub-0.97/netboot/cs89x0.c 2003-07-09 12:45:37.000000000 +0100 ++++ grub/netboot/cs89x0.c 2008-05-20 12:04:18.000000000 +0100 +@@ -1,3 +1,21 @@ ++/** ++ Per an email message from Russ Nelson <nelson@xxxxxxxxxx> on ++ 18 March 2008 this file is now licensed under GPL Version 2. ++ ++ From: Russ Nelson <nelson@xxxxxxxxxx> ++ Date: Tue, 18 Mar 2008 12:42:00 -0400 ++ Subject: Re: [Etherboot-developers] cs89x0 driver in etherboot ++ -- quote from email ++ As copyright holder, if I say it doesn't conflict with the GPL, ++ then it doesn't conflict with the GPL. ++ ++ However, there's no point in causing people's brains to overheat, ++ so yes, I grant permission for the code to be relicensed under the ++ GPLv2. Please make sure that this change in licensing makes its ++ way upstream. -russ ++ -- quote from email ++**/ ++ + /* cs89x0.c: A Crystal Semiconductor CS89[02]0 driver for etherboot. */ + /* + Permission is granted to distribute the enclosed cs89x0.[ch] driver +diff -uprN grub-0.97/netboot/cs89x0.h grub/netboot/cs89x0.h +--- grub-0.97/netboot/cs89x0.h 2003-07-09 12:45:37.000000000 +0100 ++++ grub/netboot/cs89x0.h 2008-05-20 12:04:18.000000000 +0100 +@@ -1,3 +1,21 @@ ++/** ++ Per an email message from Russ Nelson <nelson@xxxxxxxxxx> on ++ 18 March 2008 this file is now licensed under GPL Version 2. ++ ++ From: Russ Nelson <nelson@xxxxxxxxxx> ++ Date: Tue, 18 Mar 2008 12:42:00 -0400 ++ Subject: Re: [Etherboot-developers] cs89x0 driver in etherboot ++ -- quote from email ++ As copyright holder, if I say it doesn't conflict with the GPL, ++ then it doesn't conflict with the GPL. ++ ++ However, there's no point in causing people's brains to overheat, ++ so yes, I grant permission for the code to be relicensed under the ++ GPLv2. Please make sure that this change in licensing makes its ++ way upstream. -russ ++ -- quote from email ++**/ ++ + /* Copyright, 1988-1992, Russell Nelson, Crynwr Software + + This program is free software; you can redistribute it and/or modify +diff -uprN grub-0.97/netboot/etherboot.h grub/netboot/etherboot.h +--- grub-0.97/netboot/etherboot.h 2003-07-09 12:45:37.000000000 +0100 ++++ grub/netboot/etherboot.h 2006-09-08 13:56:22.000000000 +0100 +@@ -531,9 +531,6 @@ extern int ip_abort; + extern int network_ready; + extern struct rom_info rom; + extern struct arptable_t arptable[MAX_ARP]; +-extern struct bootpd_t bootp_data; +-#define BOOTP_DATA_ADDR (&bootp_data) +-extern unsigned char *end_of_rfc1533; + + /* config.c */ + extern struct nic nic; +diff -uprN grub-0.97/netboot/main.c grub/netboot/main.c +--- grub-0.97/netboot/main.c 2004-05-20 23:19:33.000000000 +0100 ++++ grub/netboot/main.c 2006-09-08 13:56:22.000000000 +0100 +@@ -56,7 +56,8 @@ static int vendorext_isvalid; + static unsigned long netmask; + static struct bootpd_t bootp_data; + static unsigned long xid; +-static unsigned char *end_of_rfc1533 = NULL; ++ ++#define BOOTP_DATA_ADDR (&bootp_data) + + #ifndef NO_DHCP_SUPPORT + #endif /* NO_DHCP_SUPPORT */ +@@ -967,7 +968,6 @@ decode_rfc1533 (unsigned char *p, int bl + + if (block == 0) + { +- end_of_rfc1533 = NULL; + vendorext_isvalid = 0; + + if (grub_memcmp (p, rfc1533_cookie, 4)) +@@ -1021,7 +1021,7 @@ decode_rfc1533 (unsigned char *p, int bl + } + else if (c == RFC1533_END) + { +- end_of_rfc1533 = endp = p; ++ endp = p; + continue; + } + else if (c == RFC1533_NETMASK) +diff -uprN grub-0.97/netboot/natsemi.c grub/netboot/natsemi.c +--- grub-0.97/netboot/natsemi.c 2003-07-09 12:45:38.000000000 +0100 ++++ grub/netboot/natsemi.c 2006-09-10 08:26:10.000000000 +0100 +@@ -608,7 +608,7 @@ natsemi_transmit(struct nic *nic, + const char *p) /* Packet */ + { + u32 status, to, nstype; +- u32 tx_status; ++ volatile u32 tx_status; + + /* Stop the transmitter */ + outl(TxOff, ioaddr + ChipCmd); +@@ -647,7 +647,7 @@ natsemi_transmit(struct nic *nic, + + to = currticks() + TX_TIMEOUT; + +- while ((((volatile u32) tx_status=txd.cmdsts) & OWN) && (currticks() < to)) ++ while (((tx_status=txd.cmdsts) & OWN) && (currticks() < to)) + /* wait */ ; + + if (currticks() >= to) { +diff -uprN grub-0.97/netboot/sis900.c grub/netboot/sis900.c +--- grub-0.97/netboot/sis900.c 2003-07-09 12:45:38.000000000 +0100 ++++ grub/netboot/sis900.c 2006-09-10 08:26:10.000000000 +0100 +@@ -901,7 +901,7 @@ sis900_transmit(struct nic *nic, + const char *p) /* Packet */ + { + u32 status, to, nstype; +- u32 tx_status; ++ volatile u32 tx_status; + + /* Stop the transmitter */ + outl(TxDIS, ioaddr + cr); +@@ -940,7 +940,7 @@ sis900_transmit(struct nic *nic, + + to = currticks() + TX_TIMEOUT; + +- while ((((volatile u32) tx_status=txd.cmdsts) & OWN) && (currticks() < to)) ++ while (((tx_status=txd.cmdsts) & OWN) && (currticks() < to)) + /* wait */ ; + + if (currticks() >= to) { +diff -uprN grub-0.97/netboot/sk_g16.c grub/netboot/sk_g16.c +--- grub-0.97/netboot/sk_g16.c 2003-07-09 12:45:38.000000000 +0100 ++++ grub/netboot/sk_g16.c 2002-01-02 21:56:40.000000000 +0000 +@@ -13,12 +13,12 @@ Changes to make it work with Etherboot b + * + * Module : sk_g16.c + * +- * Version : $Revision: 1.4 $ ++ * Version : $Revision: 609 $ + * + * Author : Patrick J.D. Weichmann + * + * Date Created : 94/05/26 +- * Last Updated : $Date: 2002/01/02 21:56:40 $ ++ * Last Updated : $Date: 2002-01-02 21:56:40 +0000 (mer 02 jan 2002) $ + * + * Description : Schneider & Koch G16 Ethernet Device Driver for + * Linux Kernel >= 1.1.22 +diff -uprN grub-0.97/netboot/sk_g16.h grub/netboot/sk_g16.h +--- grub-0.97/netboot/sk_g16.h 2003-07-09 12:45:38.000000000 +0100 ++++ grub/netboot/sk_g16.h 2000-07-29 20:22:54.000000000 +0100 +@@ -4,7 +4,7 @@ + * of the GNU Public License, incorporated herein by reference. + * + * Module : sk_g16.h +- * Version : $Revision: 1.3 $ ++ * Version : $Revision: 388 $ + * + * Author : M.Hipp (mhipp@xxxxxxxxxxxxxxxxxxxxxxxx) + * changes by : Patrick J.D. Weichmann +@@ -15,8 +15,8 @@ + * the am7990 (LANCE) chip used for writing a + * network device driver which uses this chip + * +- * $Log: sk_g16.h,v $ +- * Revision 1.3 2000/07/29 19:22:54 okuji ++ * $Log$ ++ * Revision 1.3 2000-07-29 19:22:54 okuji + * update the network support to etherboot-4.6.4. + * + -*/ +diff -uprN grub-0.97/stage1/Makefile.am grub/stage1/Makefile.am +--- grub-0.97/stage1/Makefile.am 2004-07-16 12:44:56.000000000 +0100 ++++ grub/stage1/Makefile.am 2007-11-05 01:29:46.000000000 +0000 +@@ -5,7 +5,7 @@ CLEANFILES = $(nodist_pkglib_DATA) + + # We can't use builtins or standard includes. + AM_CCASFLAGS = $(STAGE1_CFLAGS) -fno-builtin -nostdinc +-LDFLAGS = -nostdlib -Wl,-N,-Ttext,7C00 ++stage1_exec_LDFLAGS = -nostdlib -Wl,-N,-Ttext,7C00 + + noinst_PROGRAMS = stage1.exec + stage1_exec_SOURCES = stage1.S stage1.h +diff -uprN grub-0.97/stage1/Makefile.in grub/stage1/Makefile.in +--- grub-0.97/stage1/Makefile.in 2005-05-08 03:42:36.000000000 +0100 ++++ grub/stage1/Makefile.in 2007-11-05 01:29:46.000000000 +0000 +@@ -110,7 +110,7 @@ INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ + INSTALL_SCRIPT = @INSTALL_SCRIPT@ + INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +-LDFLAGS = -nostdlib -Wl,-N,-Ttext,7C00 ++LDFLAGS = @LDFLAGS@ + LIBOBJS = @LIBOBJS@ + LIBS = @LIBS@ + LTLIBOBJS = @LTLIBOBJS@ +@@ -188,6 +188,7 @@ CLEANFILES = $(nodist_pkglib_DATA) + + # We can't use builtins or standard includes. + AM_CCASFLAGS = $(STAGE1_CFLAGS) -fno-builtin -nostdinc ++stage1_exec_LDFLAGS = -nostdlib -Wl,-N,-Ttext,7C00 + stage1_exec_SOURCES = stage1.S stage1.h + SUFFIXES = .exec + all: all-am +diff -uprN grub-0.97/stage2/bios.c grub/stage2/bios.c +--- grub-0.97/stage2/bios.c 2004-03-27 16:34:04.000000000 +0000 ++++ grub/stage2/bios.c 2008-03-28 13:22:28.000000000 +0000 +@@ -47,7 +47,7 @@ extern int get_diskinfo_floppy (int driv + return the error number. Otherwise, return 0. */ + int + biosdisk (int read, int drive, struct geometry *geometry, +- int sector, int nsec, int segment) ++ unsigned int sector, int nsec, int segment) + { + int err; + +diff -uprN grub-0.97/stage2/boot.c grub/stage2/boot.c +--- grub-0.97/stage2/boot.c 2004-03-30 12:44:08.000000000 +0100 ++++ grub/stage2/boot.c 2005-09-28 22:47:55.000000000 +0100 +@@ -1,7 +1,7 @@ + /* boot.c - load and bootstrap a kernel */ + /* + * GRUB -- GRand Unified Bootloader +- * Copyright (C) 1999,2000,2001,2002,2003,2004 Free Software Foundation, Inc. ++ * Copyright (C) 1999,2000,2001,2002,2003,2004,2005 Free Software Foundation, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by +@@ -96,7 +96,7 @@ load_image (char *kernel, char *arg, ker + lh = (struct linux_kernel_header *) buffer; + + /* ELF loading supported if multiboot, FreeBSD and NetBSD. */ +- if ((type == KERNEL_TYPE_MULTIBOOT ++ if (((type == KERNEL_TYPE_MULTIBOOT && ! (flags & MULTIBOOT_AOUT_KLUDGE)) + || pu.elf->e_ident[EI_OSABI] == ELFOSABI_FREEBSD + || grub_strcmp (pu.elf->e_ident + EI_BRAND, "FreeBSD") == 0 + || suggested_type == KERNEL_TYPE_NETBSD) +diff -uprN grub-0.97/stage2/builtins.c grub/stage2/builtins.c +--- grub-0.97/stage2/builtins.c 2005-02-15 21:58:23.000000000 +0000 ++++ grub/stage2/builtins.c 2006-03-21 20:51:58.000000000 +0000 +@@ -3830,15 +3830,15 @@ setup_func (char *arg, int flags) + { + char tmp[16]; + grub_sprintf (tmp, ",%d", (partition >> 16) & 0xFF); +- grub_strncat (device, tmp, 256); ++ grub_strncat (device, tmp, sizeof (device)); + } + if ((partition & 0x00FF00) != 0x00FF00) + { + char tmp[16]; + grub_sprintf (tmp, ",%c", 'a' + ((partition >> 8) & 0xFF)); +- grub_strncat (device, tmp, 256); ++ grub_strncat (device, tmp, sizeof (device)); + } +- grub_strncat (device, ")", 256); ++ grub_strncat (device, ")", sizeof (device)); + } + + int embed_stage1_5 (char *stage1_5, int drive, int partition) +diff -uprN grub-0.97/stage2/disk_io.c grub/stage2/disk_io.c +--- grub-0.97/stage2/disk_io.c 2004-05-23 17:35:24.000000000 +0100 ++++ grub/stage2/disk_io.c 2008-03-28 13:22:28.000000000 +0000 +@@ -137,7 +137,7 @@ log2 (unsigned long word) + } + + int +-rawread (int drive, int sector, int byte_offset, int byte_len, char *buf) ++rawread (int drive, unsigned int sector, int byte_offset, int byte_len, char *buf) + { + int slen, sectors_per_vtrack; + int sector_size_bits = log2 (buf_geom.sector_size); +@@ -261,7 +261,7 @@ rawread (int drive, int sector, int byte + */ + if (disk_read_func) + { +- int sector_num = sector; ++ unsigned int sector_num = sector; + int length = buf_geom.sector_size - byte_offset; + if (length > size) + length = size; +@@ -291,7 +291,7 @@ rawread (int drive, int sector, int byte + + + int +-devread (int sector, int byte_offset, int byte_len, char *buf) ++devread (unsigned int sector, int byte_offset, int byte_len, char *buf) + { + /* + * Check partition boundaries +@@ -330,7 +330,7 @@ devread (int sector, int byte_offset, in + + #ifndef STAGE1_5 + int +-rawwrite (int drive, int sector, char *buf) ++rawwrite (int drive, unsigned int sector, char *buf) + { + if (sector == 0) + { +@@ -363,7 +363,7 @@ rawwrite (int drive, int sector, char *b + } + + int +-devwrite (int sector, int sector_count, char *buf) ++devwrite (unsigned int sector, int sector_count, char *buf) + { + #if defined(GRUB_UTIL) && defined(__linux__) + if (current_partition != 0xFFFFFF +diff -uprN grub-0.97/stage2/fsys_ffs.c grub/stage2/fsys_ffs.c +--- grub-0.97/stage2/fsys_ffs.c 2003-07-09 12:45:52.000000000 +0100 ++++ grub/stage2/fsys_ffs.c 2001-11-12 06:57:29.000000000 +0000 +@@ -50,7 +50,7 @@ + * the rights to redistribute these changes. + * + * from: Mach, Revision 2.2 92/04/04 11:35:49 rpd +- * $Id: fsys_ffs.c,v 1.10 2001/11/12 06:57:29 okuji Exp $ ++ * $Id: fsys_ffs.c 594 2001-11-12 06:57:29Z okuji $ + */ + + #ifdef FSYS_FFS +diff -uprN grub-0.97/stage2/fsys_ufs2.c grub/stage2/fsys_ufs2.c +--- grub-0.97/stage2/fsys_ufs2.c 2004-06-19 13:17:52.000000000 +0100 ++++ grub/stage2/fsys_ufs2.c 2004-06-19 13:17:52.000000000 +0100 +@@ -51,7 +51,7 @@ + * the rights to redistribute these changes. + * + * from: Mach, Revision 2.2 92/04/04 11:35:49 rpd +- * $Id: fsys_ufs2.c,v 1.2 2004/06/19 12:17:52 okuji Exp $ ++ * $Id: fsys_ufs2.c 841 2004-06-19 12:17:52Z okuji $ + */ + + #ifdef FSYS_UFS2 +diff -uprN grub-0.97/stage2/imgact_aout.h grub/stage2/imgact_aout.h +--- grub-0.97/stage2/imgact_aout.h 2003-07-09 12:45:53.000000000 +0100 ++++ grub/stage2/imgact_aout.h 1999-06-24 01:03:29.000000000 +0100 +@@ -32,7 +32,7 @@ + * SUCH DAMAGE. + * + * from: @(#)exec.h 8.1 (Berkeley) 6/11/93 +- * $Id: imgact_aout.h,v 1.1 1999/06/24 00:03:22 okuji Exp $ ++ * $Id: imgact_aout.h 98 1999-06-24 00:03:29Z okuji $ + */ + /* + * 11/23/95 - Kludge to get "ntohl" null macro added. -- ESB +diff -uprN grub-0.97/stage2/iso9660.h grub/stage2/iso9660.h +--- grub-0.97/stage2/iso9660.h 2004-03-27 16:02:38.000000000 +0000 ++++ grub/stage2/iso9660.h 2007-02-22 23:40:25.000000000 +0000 +@@ -73,11 +73,11 @@ typedef union { + + typedef struct __iso_16bit { + u_int16_t l, b; +-} iso_16bit_t __attribute__ ((packed)); ++} iso_16bit_t; + + typedef struct __iso_32bit { + u_int32_t l, b; +-} iso_32bit_t __attribute__ ((packed)); ++} iso_32bit_t; + + typedef u_int8_t iso_date_t[7]; + +diff -uprN grub-0.97/stage2/shared.h grub/stage2/shared.h +--- grub-0.97/stage2/shared.h 2004-06-19 17:40:09.000000000 +0100 ++++ grub/stage2/shared.h 2008-03-28 13:22:28.000000000 +0000 +@@ -499,7 +499,11 @@ struct vbe_mode + unsigned char linear_reserved_field_position; + unsigned long max_pixel_clock; + +- unsigned char reserved3[189]; ++ /* Reserved field to make structure to be 256 bytes long, VESA BIOS ++ Extension 3.0 Specification says to reserve 189 bytes here but ++ that doesn't make structure to be 256 bytes. So additional one is ++ added here. */ ++ unsigned char reserved3[189 + 1]; + } __attribute__ ((packed)); + + +@@ -807,7 +811,7 @@ int checkkey (void); + /* Low-level disk I/O */ + int get_diskinfo (int drive, struct geometry *geometry); + int biosdisk (int subfunc, int drive, struct geometry *geometry, +- int sector, int nsec, int segment); ++ unsigned int sector, int nsec, int segment); + void stop_floppy (void); + + /* Command-line interface functions. */ +@@ -920,10 +924,10 @@ int gunzip_test_header (void); + int gunzip_read (char *buf, int len); + #endif /* NO_DECOMPRESSION */ + +-int rawread (int drive, int sector, int byte_offset, int byte_len, char *buf); +-int devread (int sector, int byte_offset, int byte_len, char *buf); +-int rawwrite (int drive, int sector, char *buf); +-int devwrite (int sector, int sector_len, char *buf); ++int rawread (int drive, unsigned int sector, int byte_offset, int byte_len, char *buf); ++int devread (unsigned int sector, int byte_offset, int byte_len, char *buf); ++int rawwrite (int drive, unsigned int sector, char *buf); ++int devwrite (unsigned int sector, int sector_len, char *buf); + + /* Parse a device string and initialize the global parameters. */ + char *set_device (char *device); +diff -uprN grub-0.97/stage2/stage2.c grub/stage2/stage2.c +--- grub-0.97/stage2/stage2.c 2005-03-19 17:51:57.000000000 +0000 ++++ grub/stage2/stage2.c 2006-05-05 23:06:31.000000000 +0100 +@@ -651,7 +651,10 @@ restart: + *(new_heap++) = 0; + + if (config_entries) +- run_menu (heap, NULL, new_num_entries, new_heap, 0); ++ { ++ current_entryno = first_entry + entryno; ++ run_menu (heap, NULL, new_num_entries, new_heap, 0); ++ } + else + { + cls (); +@@ -727,7 +730,8 @@ restart: + cur_entry = get_entry (config_entries, first_entry + entryno, 1); + + /* Set CURRENT_ENTRYNO for the command "savedefault". */ +- current_entryno = first_entry + entryno; ++ if (config_entries) ++ current_entryno = first_entry + entryno; + + if (run_script (cur_entry, heap)) + { +diff -uprN grub-0.97/stage2/tparm.c grub/stage2/tparm.c +--- grub-0.97/stage2/tparm.c 2003-07-09 12:45:53.000000000 +0100 ++++ grub/stage2/tparm.c 2002-11-29 20:39:24.000000000 +0000 +@@ -63,7 +63,7 @@ typedef char grub_bool; + #define MAX_FORMAT_LEN 256 + #define max(a,b) ((a) > (b) ? (a) : (b)) + +-//MODULE_ID("$Id: tparm.c,v 1.1 2002/11/29 20:39:24 okuji Exp $") ++//MODULE_ID("$Id: tparm.c 708 2002-11-29 20:39:24Z okuji $") + + /* + * char * +diff -uprN grub-0.97/stamp-h.in grub/stamp-h.in +--- grub-0.97/stamp-h.in 1970-01-01 01:00:00.000000000 +0100 ++++ grub/stamp-h.in 1999-09-13 14:32:31.000000000 +0100 +@@ -0,0 +1 @@ ++timestamp +diff -uprN grub-0.97/THANKS grub/THANKS +--- grub-0.97/THANKS 2005-05-08 03:17:43.000000000 +0100 ++++ grub/THANKS 2006-03-21 20:51:58.000000000 +0000 +@@ -121,3 +121,4 @@ Vesa Jaaskelainen <jaaskela@tietomyrsky. + Yedidyah Bar-David <didi@xxxxxxxxxxxxxx> + Yury V. Umanets <umka@xxxxxxxxxxx> + Yuri Zaporogets <yuriz@xxxxxxx> ++Vitaly Fertman <vitaly@xxxxxxxxxxx> +diff -uprN grub-0.97/util/grub-install.in grub/util/grub-install.in +--- grub-0.97/util/grub-install.in 2004-07-24 19:57:31.000000000 +0100 ++++ grub/util/grub-install.in 2006-04-20 14:46:46.000000000 +0100 +@@ -112,8 +112,8 @@ convert () { + tmp_disk=`echo "$1" | sed 's%\([sh]d[0-9]*\).*%\1%'` + tmp_part=`echo "$1" | sed "s%$tmp_disk%%"` ;; + freebsd* | kfreebsd*-gnu) +- tmp_disk=`echo "$1" | sed 's%r\{0,1\}\([saw]d[0-9]*\).*$%r\1%' \ +- | sed 's%r\{0,1\}\(da[0-9]*\).*$%r\1%'` ++ tmp_disk=`echo "$1" | sed 's%r\{0,1\}\([saw]d[0-9]*\).*$%\1%' \ ++ | sed 's%r\{0,1\}\(da[0-9]*\).*$%\1%'` + tmp_part=`echo "$1" \ + | sed "s%.*/r\{0,1\}[saw]d[0-9]\(s[0-9]*[a-h]\)%\1%" \ + | sed "s%.*/r\{0,1\}da[0-9]\(s[0-9]*[a-h]\)%\1%"` +diff -uprN grub-0.97/util/mkbimage grub/util/mkbimage +--- grub-0.97/util/mkbimage 2004-07-24 19:57:31.000000000 +0100 ++++ grub/util/mkbimage 2007-02-22 16:01:03.000000000 +0000 +@@ -1,7 +1,7 @@ + #!/bin/sh + # MaKe a Bootable IMAGE --- 1.44, 2.88 and El Torito no-emulation mode + # C) 2001,2002,2003 Thierry Laronde <tlaronde@xxxxxxxxxxx> +-# C) 2001,2002,2003 Robert Millan <robertmh@xxxxxxx> ++# C) 2001,2002,2003 Robert Millan <rmh@xxxxxxxxxxx> + + + # This program is free software; you can redistribute it and/or modify +@@ -19,7 +19,7 @@ + # program's maintainer or write to: The Free Software Foundation, + # Inc.; 59 Temple Place, Suite 330; Boston, MA 02111-1307, USA. + +-# $Id: mkbimage,v 1.19 2004/07/21 14:43:04 robertmh Exp $ ++# $Id: mkbimage 1233 2007-02-22 16:01:03Z robertmh $ + + # Global variables + tarfile= +@@ -58,7 +58,7 @@ stage2_os_name= + + # Name by which this script was invoked. + program=`echo "$0" | sed -e 's/[^\/]*\///g'` +-version_number='$Revision: 1.19 $' ++version_number='$Revision: 1233 $' + + usage=" + Usage: $program [-hVF] [-t TYPE] [-d DIRECTORY] [-s FS_TYPE] -f TAR_FILE +@@ -94,15 +94,13 @@ Options: + display Version information and exit + + Copyright (c) 2001,2002,2003 Thierry Laronde <tlaronde@xxxxxxxxxxx>. +-Copyright (c) 2001,2002 Robert Millan <zeratul2@xxxxxxxxxx>. + GPLed." + + version="mkbimage $version_number + +-Written by Thierry Laronde and Robert Millan. ++Written by Thierry Laronde. + + Copyright (c) 2001,2002,2003 Thierry Laronde <tlaronde@xxxxxxxxxxx>. +-Copyright (c) 2001,2002,2003 Robert Millan <zeratul2@xxxxxxxxxx>. + + This is free software under the GPL version 2 or later; see the source for + copying conditions. There is NO warranty, not even for MERCHANTABILITY or diff -r eb0fc71cfc72 -r 400e5d4877ca stubdom/grub.patches/99minios --- a/stubdom/grub.patches/99minios Tue Jul 08 11:41:43 2008 +0900 +++ b/stubdom/grub.patches/99minios Fri Jul 18 12:12:41 2008 +0900 @@ -1465,3 +1465,31 @@ Index: grub/stage2/stage2.c # endif /* SUPPORT_DISKLESS */ static int preset_menu_offset; +Index: grub/stage2/fsys_xfs.c +=================================================================== +RCS file: /sources/grub/grub/stage2/fsys_xfs.c,v +retrieving revision 1.5 +diff -u -p -r1.5 fsys_xfs.c +--- grub/stage2/fsys_xfs.c 8 May 2005 02:18:14 -0000 1.5 ++++ grub/stage2/fsys_xfs.c 10 Jul 2008 13:09:50 -0000 +@@ -101,7 +101,7 @@ static inline __const__ xfs_uint16_t + le16 (xfs_uint16_t x) + { + __asm__("xchgb %b0,%h0" \ +- : "=q" (x) \ ++ : "=Q" (x) \ + : "0" (x)); \ + return x; + } +@@ -109,9 +109,9 @@ le16 (xfs_uint16_t x) + static inline __const__ xfs_uint32_t + le32 (xfs_uint32_t x) + { +-#if 0 ++#if 1 + /* 386 doesn't have bswap. */ +- __asm__("bswap %0" : "=r" (x) : "0" (x)); ++ __asm__("bswapl %k0" : "=r" (x) : "0" (x)); + #else + /* This is slower but this works on all x86 architectures. */ + __asm__("xchgb %b0, %h0" \ diff -r eb0fc71cfc72 -r 400e5d4877ca stubdom/grub/Makefile --- a/stubdom/grub/Makefile Tue Jul 08 11:41:43 2008 +0900 +++ b/stubdom/grub/Makefile Fri Jul 18 12:12:41 2008 +0900 @@ -1,14 +1,14 @@ XEN_ROOT = ../.. XEN_ROOT = ../.. include $(XEN_ROOT)/Config.mk -vpath %.c ../grub-cvs +vpath %.c ../grub-upstream BOOT=boot-$(XEN_TARGET_ARCH).o DEF_CPPFLAGS += -I$(XEN_ROOT)/tools/libxc -I$(XEN_ROOT)/tools/include -I. -DEF_CPPFLAGS += -I../grub-cvs/stage1 -DEF_CPPFLAGS += -I../grub-cvs/stage2 -DEF_CPPFLAGS += -I../grub-cvs/netboot +DEF_CPPFLAGS += -I../grub-upstream/stage1 +DEF_CPPFLAGS += -I../grub-upstream/stage2 +DEF_CPPFLAGS += -I../grub-upstream/netboot DEF_CPPFLAGS += -I$(XEN_ROOT)/tools/firmware/vgabios DEF_CPPFLAGS += -DWITHOUT_LIBC_STUBS DEF_CPPFLAGS += -DSUPPORT_NETBOOT @@ -51,10 +51,8 @@ STAGE2_SOURCES+=fsys_vstafs.c STAGE2_SOURCES+=fsys_vstafs.c CPPFLAGS += -DFSYS_VSTAFS=1 -ifeq (0,1) STAGE2_SOURCES+=fsys_xfs.c CPPFLAGS += -DFSYS_XFS=1 -endif STAGE2_SOURCES:=$(addprefix stage2/,$(STAGE2_SOURCES)) NETBOOT_SOURCES:=$(addprefix netboot/,$(NETBOOT_SOURCES)) diff -r eb0fc71cfc72 -r 400e5d4877ca stubdom/grub/mini-os.c --- a/stubdom/grub/mini-os.c Tue Jul 08 11:41:43 2008 +0900 +++ b/stubdom/grub/mini-os.c Fri Jul 18 12:12:41 2008 +0900 @@ -681,7 +681,9 @@ int main(int argc, char *argv[]) config_file[sizeof(config_file) - 1] = 0; if (!strncmp(config_file, "(nd)", 4)) preset_menu = "dhcp"; - } else + } else if (start_info.mod_len) + preset_menu = (void*) start_info.mod_start; + else preset_menu = "dhcp --with-configfile"; mbi.drives_addr = BOOTSEC_LOCATION + (60 * 1024); diff -r eb0fc71cfc72 -r 400e5d4877ca stubdom/libpci.config.h --- a/stubdom/libpci.config.h Tue Jul 08 11:41:43 2008 +0900 +++ b/stubdom/libpci.config.h Fri Jul 18 12:12:41 2008 +0900 @@ -1,4 +1,4 @@ -#define PCI_OS_STUBDOM +#define PCI_OS_MINIOS #define PCI_HAVE_STDINT_H #define PCI_PATH_IDS_DIR "." #define PCI_COMPRESSED_IDS diff -r eb0fc71cfc72 -r 400e5d4877ca stubdom/libpci.config.mak --- a/stubdom/libpci.config.mak Tue Jul 08 11:41:43 2008 +0900 +++ b/stubdom/libpci.config.mak Fri Jul 18 12:12:41 2008 +0900 @@ -1,2 +1,7 @@ LIBZ=-lz LIBZ=-lz LDLIBS+=$(LIBZ) +PCI_OS_MINIOS=1 +PCI_HAVE_STDINT_H=1 +PCI_PATH_IDS_DIR=. +PCI_COMPRESSED_IDS=1 +PCI_IDS=pci.ids.gz diff -r eb0fc71cfc72 -r 400e5d4877ca stubdom/lwip.patch-cvs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/stubdom/lwip.patch-cvs Fri Jul 18 12:12:41 2008 +0900 @@ -0,0 +1,2398 @@ +? .ChangeLog.swp +? ChangeLog +Index: CHANGELOG +=================================================================== +RCS file: /sources/lwip/lwip/CHANGELOG,v +retrieving revision 1.300 +retrieving revision 1.318 +diff -u -p -r1.300 -r1.318 +--- CHANGELOG 23 Mar 2008 13:49:39 -0000 1.300 ++++ CHANGELOG 14 Jul 2008 20:12:36 -0000 1.318 +@@ -19,9 +19,77 @@ HISTORY + + ++ New features: + ++ 2008-06-30 Simon Goldschmidt ++ * mem.c, opt.h, stats.h: fixed bug #21433: Calling mem_free/pbuf_free from ++ interrupt context isn't safe: LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT allows ++ mem_free to run between mem_malloc iterations. Added illegal counter for ++ mem stats. ++ ++ 2008-06-27 Simon Goldschmidt ++ * stats.h/.c, some other files: patch #6483: stats module improvement: ++ Added defines to display each module's statistic individually, added stats ++ defines for MEM, MEMP and SYS modules, removed (unused) rexmit counter. ++ ++ 2008-06-17 Simon Goldschmidt ++ * err.h: patch #6459: Made err_t overridable to use a more efficient type ++ (define LWIP_ERR_T in cc.h) ++ ++ 2008-06-17 Simon Goldschmidt ++ * slipif.c: patch #6480: Added a configuration option for slipif for symmetry ++ to loopif ++ ++ 2008-06-17 Simon Goldschmidt (patch by Luca Ceresoli) ++ * netif.c, loopif.c, ip.c, netif.h, loopif.h, opt.h: Checked in slightly ++ modified version of patch # 6370: Moved loopif code to netif.c so that ++ loopback traffic is supported on all netifs (all local IPs). ++ Added option to limit loopback packets for each netifs. ++ + + ++ Bugfixes: + ++ 2008-08-14 Simon Goldschmidt ++ * api_msg.c: fixed bug #23847: do_close_internal references freed memory (when ++ tcp_close returns != ERR_OK) ++ ++ 2008-07-08 Frédéric Bernon ++ * stats.h: Fix some build bugs introduced with patch #6483 (missing some parameters ++ in macros, mainly if MEM_STATS=0 and MEMP_STATS=0). ++ ++ 2008-06-24 Jonathan Larmour ++ * tcp_in.c: Fix for bug #23693 as suggested by Art R. Ensure cseg is unused ++ if tcp_seg_copy fails. ++ ++ 2008-06-17 Simon Goldschmidt ++ * inet_chksum.c: Checked in some ideas of patch #6460 (loop optimizations) ++ and created defines for swapping bytes and folding u32 to u16. ++ ++ 2008-05-30 Kieran Mansley ++ * tcp_in.c Remove redundant "if" statement, and use real rcv_wnd ++ rather than rcv_ann_wnd when deciding if packets are in-window. ++ Contributed by <arasmussen@xxxxxxxxxxxxxxxxxxxxxxxxxxx> ++ ++ 2008-05-30 Kieran Mansley ++ * mem.h: Fix BUG#23254. Change macro definition of mem_* to allow ++ passing as function pointers when MEM_LIBC_MALLOC is defined. ++ ++ 2008-05-09 Jonathan Larmour ++ * err.h, err.c, sockets.c: Fix bug #23119: Reorder timeout error code to ++ stop it being treated as a fatal error. ++ ++ 2008-04-15 Simon Goldschmidt ++ * dhcp.c: fixed bug #22804: dhcp_stop doesn't clear NETIF_FLAG_DHCP ++ (flag now cleared) ++ ++ 2008-03-27 Simon Goldschmidt ++ * mem.c, tcpip.c, tcpip.h, opt.h: fixed bug #21433 (Calling mem_free/pbuf_free ++ from interrupt context isn't safe): set LWIP_USE_HEAP_FROM_INTERRUPT to 1 ++ in lwipopts.h or use pbuf_free_callback(p)/mem_free_callback(m) to free pbufs ++ or heap memory from interrupt context ++ ++ 2008-03-26 Simon Goldschmidt ++ * tcp_in.c, tcp.c: fixed bug #22249: division by zero could occur if a remote ++ host sent a zero mss as TCP option. ++ + + (STABLE-1.3.0) + +Index: src/api/api_msg.c +=================================================================== +RCS file: /sources/lwip/lwip/src/api/api_msg.c,v +retrieving revision 1.102 +retrieving revision 1.104 +diff -u -p -r1.102 -r1.104 +--- src/api/api_msg.c 21 Mar 2008 16:23:14 -0000 1.102 ++++ src/api/api_msg.c 15 Jul 2008 11:18:58 -0000 1.104 +@@ -598,11 +598,16 @@ do_close_internal(struct netconn *conn) + LWIP_ASSERT("pcb already closed", (conn->pcb.tcp != NULL)); + + /* Set back some callback pointers */ ++ tcp_arg(conn->pcb.tcp, NULL); + if (conn->pcb.tcp->state == LISTEN) { +- tcp_arg(conn->pcb.tcp, NULL); + tcp_accept(conn->pcb.tcp, NULL); + } else { + tcp_recv(conn->pcb.tcp, NULL); ++ tcp_accept(conn->pcb.tcp, NULL); ++ /* some callbacks have to be reset if tcp_close is not successful */ ++ tcp_sent(conn->pcb.tcp, NULL); ++ tcp_poll(conn->pcb.tcp, NULL, 4); ++ tcp_err(conn->pcb.tcp, NULL); + } + /* Try to close the connection */ + err = tcp_close(conn->pcb.tcp); +@@ -610,11 +615,6 @@ do_close_internal(struct netconn *conn) + /* Closing succeeded */ + conn->state = NETCONN_NONE; + /* Set back some callback pointers as conn is going away */ +- tcp_err(conn->pcb.tcp, NULL); +- tcp_poll(conn->pcb.tcp, NULL, 4); +- tcp_sent(conn->pcb.tcp, NULL); +- tcp_recv(conn->pcb.tcp, NULL); +- tcp_arg(conn->pcb.tcp, NULL); + conn->pcb.tcp = NULL; + conn->err = ERR_OK; + /* Trigger select() in socket layer. This send should something else so the +@@ -623,6 +623,14 @@ do_close_internal(struct netconn *conn) + API_EVENT(conn, NETCONN_EVT_SENDPLUS, 0); + /* wake up the application task */ + sys_sem_signal(conn->op_completed); ++ } else { ++ /* Closing failed, restore some of the callbacks */ ++ /* Closing of listen pcb will never fail! */ ++ LWIP_ASSERT("Closing a listen pcb may not fail!", (conn->pcb.tcp->state != LISTEN)); ++ tcp_sent(conn->pcb.tcp, sent_tcp); ++ tcp_poll(conn->pcb.tcp, poll_tcp, 4); ++ tcp_err(conn->pcb.tcp, err_tcp); ++ tcp_arg(conn->pcb.tcp, conn); + } + /* If closing didn't succeed, we get called again either + from poll_tcp or from sent_tcp */ +Index: src/api/err.c +=================================================================== +RCS file: /sources/lwip/lwip/src/api/err.c,v +retrieving revision 1.11 +retrieving revision 1.12 +diff -u -p -r1.11 -r1.12 +--- src/api/err.c 13 Dec 2007 23:06:50 -0000 1.11 ++++ src/api/err.c 9 May 2008 12:14:23 -0000 1.12 +@@ -44,17 +44,17 @@ static const char *err_strerr[] = { + "Ok.", /* ERR_OK 0 */ + "Out of memory error.", /* ERR_MEM -1 */ + "Buffer error.", /* ERR_BUF -2 */ +- "Routing problem.", /* ERR_RTE -3 */ +- "Connection aborted.", /* ERR_ABRT -4 */ +- "Connection reset.", /* ERR_RST -5 */ +- "Connection closed.", /* ERR_CLSD -6 */ +- "Not connected.", /* ERR_CONN -7 */ +- "Illegal value.", /* ERR_VAL -8 */ +- "Illegal argument.", /* ERR_ARG -9 */ +- "Address in use.", /* ERR_USE -10 */ +- "Low-level netif error.", /* ERR_IF -11 */ +- "Already connected.", /* ERR_ISCONN -12 */ +- "Timeout.", /* ERR_TIMEOUT -13 */ ++ "Timeout.", /* ERR_TIMEOUT -3 */ ++ "Routing problem.", /* ERR_RTE -4 */ ++ "Connection aborted.", /* ERR_ABRT -5 */ ++ "Connection reset.", /* ERR_RST -6 */ ++ "Connection closed.", /* ERR_CLSD -7 */ ++ "Not connected.", /* ERR_CONN -8 */ ++ "Illegal value.", /* ERR_VAL -9 */ ++ "Illegal argument.", /* ERR_ARG -10 */ ++ "Address in use.", /* ERR_USE -11 */ ++ "Low-level netif error.", /* ERR_IF -12 */ ++ "Already connected.", /* ERR_ISCONN -13 */ + "Operation in progress." /* ERR_INPROGRESS -14 */ + }; + +Index: src/api/netdb.c +=================================================================== +RCS file: /sources/lwip/lwip/src/api/netdb.c,v +retrieving revision 1.4 +retrieving revision 1.5 +diff -u -p -r1.4 -r1.5 +--- src/api/netdb.c 26 Jan 2008 16:11:39 -0000 1.4 ++++ src/api/netdb.c 16 Jul 2008 20:36:12 -0000 1.5 +@@ -326,7 +326,8 @@ lwip_getaddrinfo(const char *nodename, c + if (nodename != NULL) { + /* copy nodename to canonname if specified */ + size_t namelen = strlen(nodename); +- ai->ai_canonname = mem_malloc(namelen + 1); ++ LWIP_ASSERT("namelen is too long", (namelen + 1) <= (mem_size_t)-1); ++ ai->ai_canonname = mem_malloc((mem_size_t)(namelen + 1)); + if (ai->ai_canonname == NULL) { + goto memerr; + } +Index: src/api/sockets.c +=================================================================== +RCS file: /sources/lwip/lwip/src/api/sockets.c,v +retrieving revision 1.116 +retrieving revision 1.117 +diff -u -p -r1.116 -r1.117 +--- src/api/sockets.c 13 Mar 2008 20:03:57 -0000 1.116 ++++ src/api/sockets.c 9 May 2008 12:14:24 -0000 1.117 +@@ -128,17 +128,17 @@ static const int err_to_errno_table[] = + 0, /* ERR_OK 0 No error, everything OK. */ + ENOMEM, /* ERR_MEM -1 Out of memory error. */ + ENOBUFS, /* ERR_BUF -2 Buffer error. */ +- EHOSTUNREACH, /* ERR_RTE -3 Routing problem. */ +- ECONNABORTED, /* ERR_ABRT -4 Connection aborted. */ +- ECONNRESET, /* ERR_RST -5 Connection reset. */ +- ESHUTDOWN, /* ERR_CLSD -6 Connection closed. */ +- ENOTCONN, /* ERR_CONN -7 Not connected. */ +- EINVAL, /* ERR_VAL -8 Illegal value. */ +- EIO, /* ERR_ARG -9 Illegal argument. */ +- EADDRINUSE, /* ERR_USE -10 Address in use. */ +- -1, /* ERR_IF -11 Low-level netif error */ +- -1, /* ERR_ISCONN -12 Already connected. */ +- ETIMEDOUT, /* ERR_TIMEOUT -13 Timeout */ ++ ETIMEDOUT, /* ERR_TIMEOUT -3 Timeout */ ++ EHOSTUNREACH, /* ERR_RTE -4 Routing problem. */ ++ ECONNABORTED, /* ERR_ABRT -5 Connection aborted. */ ++ ECONNRESET, /* ERR_RST -6 Connection reset. */ ++ ESHUTDOWN, /* ERR_CLSD -7 Connection closed. */ ++ ENOTCONN, /* ERR_CONN -8 Not connected. */ ++ EINVAL, /* ERR_VAL -9 Illegal value. */ ++ EIO, /* ERR_ARG -10 Illegal argument. */ ++ EADDRINUSE, /* ERR_USE -11 Address in use. */ ++ -1, /* ERR_IF -12 Low-level netif error */ ++ -1, /* ERR_ISCONN -13 Already connected. */ + EINPROGRESS /* ERR_INPROGRESS -14 Operation in progress */ + }; + +Index: src/api/tcpip.c +=================================================================== +RCS file: /sources/lwip/lwip/src/api/tcpip.c,v +retrieving revision 1.70 +retrieving revision 1.73 +diff -u -p -r1.70 -r1.73 +--- src/api/tcpip.c 12 Jan 2008 11:52:22 -0000 1.70 ++++ src/api/tcpip.c 27 Jun 2008 20:34:51 -0000 1.73 +@@ -518,4 +518,42 @@ tcpip_init(void (* initfunc)(void *), vo + sys_thread_new(TCPIP_THREAD_NAME, tcpip_thread, NULL, TCPIP_THREAD_STACKSIZE, TCPIP_THREAD_PRIO); + } + ++/** ++ * Simple callback function used with tcpip_callback to free a pbuf ++ * (pbuf_free has a wrong signature for tcpip_callback) ++ * ++ * @param p The pbuf (chain) to be dereferenced. ++ */ ++static void ++pbuf_free_int(void *p) ++{ ++ struct pbuf *q = p; ++ pbuf_free(q); ++} ++ ++/** ++ * A simple wrapper function that allows you to free a pbuf from interrupt context. ++ * ++ * @param p The pbuf (chain) to be dereferenced. ++ * @return ERR_OK if callback could be enqueued, an err_t if not ++ */ ++err_t ++pbuf_free_callback(struct pbuf *p) ++{ ++ return tcpip_callback_with_block(pbuf_free_int, p, 0); ++} ++ ++/** ++ * A simple wrapper function that allows you to free heap memory from ++ * interrupt context. ++ * ++ * @param m the heap memory to free ++ * @return ERR_OK if callback could be enqueued, an err_t if not ++ */ ++err_t ++mem_free_callback(void *m) ++{ ++ return tcpip_callback_with_block(mem_free, m, 0); ++} ++ + #endif /* !NO_SYS */ +Index: src/core/dhcp.c +=================================================================== +RCS file: /sources/lwip/lwip/src/core/dhcp.c,v +retrieving revision 1.86 +retrieving revision 1.87 +diff -u -p -r1.86 -r1.87 +--- src/core/dhcp.c 4 Mar 2008 14:25:58 -0000 1.86 ++++ src/core/dhcp.c 15 Apr 2008 17:24:55 -0000 1.87 +@@ -568,6 +568,8 @@ dhcp_start(struct netif *netif) + LWIP_ERROR("netif != NULL", (netif != NULL), return ERR_ARG;); + dhcp = netif->dhcp; + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_start(netif=%p) %c%c%"U16_F"\n", (void*)netif, netif->name[0], netif->name[1], (u16_t)netif->num)); ++ /* Remove the flag that says this netif is handled by DHCP, ++ it is set when we succeeded starting. */ + netif->flags &= ~NETIF_FLAG_DHCP; + + /* no DHCP client attached yet? */ +@@ -609,6 +611,7 @@ dhcp_start(struct netif *netif) + dhcp_stop(netif); + return ERR_MEM; + } ++ /* Set the flag that says this netif is handled by DHCP. */ + netif->flags |= NETIF_FLAG_DHCP; + return result; + } +@@ -1063,6 +1066,8 @@ dhcp_stop(struct netif *netif) + { + struct dhcp *dhcp = netif->dhcp; + LWIP_ERROR("dhcp_stop: netif != NULL", (netif != NULL), return;); ++ /* Remove the flag that says this netif is handled by DHCP. */ ++ netif->flags &= ~NETIF_FLAG_DHCP; + + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | 3, ("dhcp_stop()\n")); + /* netif is DHCP configured? */ +Index: src/core/mem.c +=================================================================== +RCS file: /sources/lwip/lwip/src/core/mem.c,v +retrieving revision 1.59 +retrieving revision 1.62 +diff -u -p -r1.59 -r1.62 +--- src/core/mem.c 4 Mar 2008 16:31:32 -0000 1.59 ++++ src/core/mem.c 30 Jun 2008 18:16:51 -0000 1.62 +@@ -177,9 +177,36 @@ static u8_t *ram; + static struct mem *ram_end; + /** pointer to the lowest free block, this is used for faster search */ + static struct mem *lfree; ++ + /** concurrent access protection */ + static sys_sem_t mem_sem; + ++#if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT ++ ++static volatile u8_t mem_free_count; ++ ++/* Allow mem_free from other (e.g. interrupt) context */ ++#define LWIP_MEM_FREE_DECL_PROTECT() SYS_ARCH_DECL_PROTECT(lev_free) ++#define LWIP_MEM_FREE_PROTECT() SYS_ARCH_PROTECT(lev_free) ++#define LWIP_MEM_FREE_UNPROTECT() SYS_ARCH_UNPROTECT(lev_free) ++#define LWIP_MEM_ALLOC_DECL_PROTECT() SYS_ARCH_DECL_PROTECT(lev_alloc) ++#define LWIP_MEM_ALLOC_PROTECT() SYS_ARCH_PROTECT(lev_alloc) ++#define LWIP_MEM_ALLOC_UNPROTECT() SYS_ARCH_UNPROTECT(lev_alloc) ++ ++#else /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */ ++ ++/* Protect the heap only by using a semaphore */ ++#define LWIP_MEM_FREE_DECL_PROTECT() ++#define LWIP_MEM_FREE_PROTECT() sys_arch_sem_wait(mem_sem, 0) ++#define LWIP_MEM_FREE_UNPROTECT() sys_sem_signal(mem_sem) ++/* mem_malloc is protected using semaphore AND LWIP_MEM_ALLOC_PROTECT */ ++#define LWIP_MEM_ALLOC_DECL_PROTECT() ++#define LWIP_MEM_ALLOC_PROTECT() ++#define LWIP_MEM_ALLOC_UNPROTECT() ++ ++#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */ ++ ++ + /** + * "Plug holes" by combining adjacent empty struct mems. + * After this function is through, there should not exist +@@ -255,9 +282,7 @@ mem_init(void) + /* initialize the lowest-free pointer to the start of the heap */ + lfree = (struct mem *)ram; + +-#if MEM_STATS +- lwip_stats.mem.avail = MEM_SIZE_ALIGNED; +-#endif /* MEM_STATS */ ++ MEM_STATS_AVAIL(avail, MEM_SIZE_ALIGNED); + } + + /** +@@ -270,6 +295,7 @@ void + mem_free(void *rmem) + { + struct mem *mem; ++ LWIP_MEM_FREE_DECL_PROTECT(); + + if (rmem == NULL) { + LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_TRACE | 2, ("mem_free(p == NULL) was called.\n")); +@@ -277,20 +303,20 @@ mem_free(void *rmem) + } + LWIP_ASSERT("mem_free: sanity check alignment", (((mem_ptr_t)rmem) & (MEM_ALIGNMENT-1)) == 0); + +- /* protect the heap from concurrent access */ +- sys_arch_sem_wait(mem_sem, 0); +- + LWIP_ASSERT("mem_free: legal memory", (u8_t *)rmem >= (u8_t *)ram && + (u8_t *)rmem < (u8_t *)ram_end); + + if ((u8_t *)rmem < (u8_t *)ram || (u8_t *)rmem >= (u8_t *)ram_end) { ++ SYS_ARCH_DECL_PROTECT(lev); + LWIP_DEBUGF(MEM_DEBUG | 3, ("mem_free: illegal memory\n")); +-#if MEM_STATS +- ++lwip_stats.mem.err; +-#endif /* MEM_STATS */ +- sys_sem_signal(mem_sem); ++ /* protect mem stats from concurrent access */ ++ SYS_ARCH_PROTECT(lev); ++ MEM_STATS_INC(illegal); ++ SYS_ARCH_UNPROTECT(lev); + return; + } ++ /* protect the heap from concurrent access */ ++ LWIP_MEM_FREE_PROTECT(); + /* Get the corresponding struct mem ... */ + mem = (struct mem *)((u8_t *)rmem - SIZEOF_STRUCT_MEM); + /* ... which has to be in a used state ... */ +@@ -303,13 +329,14 @@ mem_free(void *rmem) + lfree = mem; + } + +-#if MEM_STATS +- lwip_stats.mem.used -= mem->next - ((u8_t *)mem - ram); +-#endif /* MEM_STATS */ ++ MEM_STATS_DEC_USED(used, mem->next - ((u8_t *)mem - ram)); + + /* finally, see if prev or next are free also */ + plug_holes(mem); +- sys_sem_signal(mem_sem); ++#if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT ++ mem_free_count = 1; ++#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */ ++ LWIP_MEM_FREE_UNPROTECT(); + } + + /** +@@ -321,6 +348,8 @@ mem_free(void *rmem) + * @param newsize required size after shrinking (needs to be smaller than or + * equal to the previous size) + * @return for compatibility reasons: is always == rmem, at the moment ++ * or NULL if newsize is > old size, in which case rmem is NOT touched ++ * or freed! + */ + void * + mem_realloc(void *rmem, mem_size_t newsize) +@@ -328,6 +357,8 @@ mem_realloc(void *rmem, mem_size_t newsi + mem_size_t size; + mem_size_t ptr, ptr2; + struct mem *mem, *mem2; ++ /* use the FREE_PROTECT here: it protects with sem OR SYS_ARCH_PROTECT */ ++ LWIP_MEM_FREE_DECL_PROTECT(); + + /* Expand the size of the allocated memory region so that we can + adjust for alignment. */ +@@ -346,7 +377,12 @@ mem_realloc(void *rmem, mem_size_t newsi + (u8_t *)rmem < (u8_t *)ram_end); + + if ((u8_t *)rmem < (u8_t *)ram || (u8_t *)rmem >= (u8_t *)ram_end) { ++ SYS_ARCH_DECL_PROTECT(lev); + LWIP_DEBUGF(MEM_DEBUG | 3, ("mem_realloc: illegal memory\n")); ++ /* protect mem stats from concurrent access */ ++ SYS_ARCH_PROTECT(lev); ++ MEM_STATS_INC(illegal); ++ SYS_ARCH_UNPROTECT(lev); + return rmem; + } + /* Get the corresponding struct mem ... */ +@@ -366,11 +402,9 @@ mem_realloc(void *rmem, mem_size_t newsi + } + + /* protect the heap from concurrent access */ +- sys_arch_sem_wait(mem_sem, 0); ++ LWIP_MEM_FREE_PROTECT(); + +-#if MEM_STATS +- lwip_stats.mem.used -= (size - newsize); +-#endif /* MEM_STATS */ ++ MEM_STATS_DEC_USED(used, (size - newsize)); + + mem2 = (struct mem *)&ram[mem->next]; + if(mem2->used == 0) { +@@ -426,7 +460,10 @@ mem_realloc(void *rmem, mem_size_t newsi + -> don't do anyhting. + -> the remaining space stays unused since it is too small + } */ +- sys_sem_signal(mem_sem); ++#if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT ++ mem_free_count = 1; ++#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */ ++ LWIP_MEM_FREE_UNPROTECT(); + return rmem; + } + +@@ -444,6 +481,10 @@ mem_malloc(mem_size_t size) + { + mem_size_t ptr, ptr2; + struct mem *mem, *mem2; ++#if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT ++ u8_t local_mem_free_count = 0; ++#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */ ++ LWIP_MEM_ALLOC_DECL_PROTECT(); + + if (size == 0) { + return NULL; +@@ -464,88 +505,101 @@ mem_malloc(mem_size_t size) + + /* protect the heap from concurrent access */ + sys_arch_sem_wait(mem_sem, 0); ++ LWIP_MEM_ALLOC_PROTECT(); ++#if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT ++ /* run as long as a mem_free disturbed mem_malloc */ ++ do { ++ local_mem_free_count = 0; ++#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */ ++ ++ /* Scan through the heap searching for a free block that is big enough, ++ * beginning with the lowest free block. ++ */ ++ for (ptr = (u8_t *)lfree - ram; ptr < MEM_SIZE_ALIGNED - size; ++ ptr = ((struct mem *)&ram[ptr])->next) { ++ mem = (struct mem *)&ram[ptr]; ++#if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT ++ mem_free_count = 0; ++ LWIP_MEM_ALLOC_UNPROTECT(); ++ /* allow mem_free to run */ ++ LWIP_MEM_ALLOC_PROTECT(); ++ if (mem_free_count != 0) { ++ local_mem_free_count = mem_free_count; ++ } ++ mem_free_count = 0; ++#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */ + +- /* Scan through the heap searching for a free block that is big enough, +- * beginning with the lowest free block. +- */ +- for (ptr = (u8_t *)lfree - ram; ptr < MEM_SIZE_ALIGNED - size; +- ptr = ((struct mem *)&ram[ptr])->next) { +- mem = (struct mem *)&ram[ptr]; +- +- if ((!mem->used) && +- (mem->next - (ptr + SIZEOF_STRUCT_MEM)) >= size) { +- /* mem is not used and at least perfect fit is possible: +- * mem->next - (ptr + SIZEOF_STRUCT_MEM) gives us the 'user data size' of mem */ +- +- if (mem->next - (ptr + SIZEOF_STRUCT_MEM) >= (size + SIZEOF_STRUCT_MEM + MIN_SIZE_ALIGNED)) { +- /* (in addition to the above, we test if another struct mem (SIZEOF_STRUCT_MEM) containing +- * at least MIN_SIZE_ALIGNED of data also fits in the 'user data space' of 'mem') +- * -> split large block, create empty remainder, +- * remainder must be large enough to contain MIN_SIZE_ALIGNED data: if +- * mem->next - (ptr + (2*SIZEOF_STRUCT_MEM)) == size, +- * struct mem would fit in but no data between mem2 and mem2->next +- * @todo we could leave out MIN_SIZE_ALIGNED. We would create an empty +- * region that couldn't hold data, but when mem->next gets freed, +- * the 2 regions would be combined, resulting in more free memory +- */ +- ptr2 = ptr + SIZEOF_STRUCT_MEM + size; +- /* create mem2 struct */ +- mem2 = (struct mem *)&ram[ptr2]; +- mem2->used = 0; +- mem2->next = mem->next; +- mem2->prev = ptr; +- /* and insert it between mem and mem->next */ +- mem->next = ptr2; +- mem->used = 1; +- +- if (mem2->next != MEM_SIZE_ALIGNED) { +- ((struct mem *)&ram[mem2->next])->prev = ptr2; +- } +-#if MEM_STATS +- lwip_stats.mem.used += (size + SIZEOF_STRUCT_MEM); +- if (lwip_stats.mem.max < lwip_stats.mem.used) { +- lwip_stats.mem.max = lwip_stats.mem.used; ++ if ((!mem->used) && ++ (mem->next - (ptr + SIZEOF_STRUCT_MEM)) >= size) { ++ /* mem is not used and at least perfect fit is possible: ++ * mem->next - (ptr + SIZEOF_STRUCT_MEM) gives us the 'user data size' of mem */ ++ ++ if (mem->next - (ptr + SIZEOF_STRUCT_MEM) >= (size + SIZEOF_STRUCT_MEM + MIN_SIZE_ALIGNED)) { ++ /* (in addition to the above, we test if another struct mem (SIZEOF_STRUCT_MEM) containing ++ * at least MIN_SIZE_ALIGNED of data also fits in the 'user data space' of 'mem') ++ * -> split large block, create empty remainder, ++ * remainder must be large enough to contain MIN_SIZE_ALIGNED data: if ++ * mem->next - (ptr + (2*SIZEOF_STRUCT_MEM)) == size, ++ * struct mem would fit in but no data between mem2 and mem2->next ++ * @todo we could leave out MIN_SIZE_ALIGNED. We would create an empty ++ * region that couldn't hold data, but when mem->next gets freed, ++ * the 2 regions would be combined, resulting in more free memory ++ */ ++ ptr2 = ptr + SIZEOF_STRUCT_MEM + size; ++ /* create mem2 struct */ ++ mem2 = (struct mem *)&ram[ptr2]; ++ mem2->used = 0; ++ mem2->next = mem->next; ++ mem2->prev = ptr; ++ /* and insert it between mem and mem->next */ ++ mem->next = ptr2; ++ mem->used = 1; ++ ++ if (mem2->next != MEM_SIZE_ALIGNED) { ++ ((struct mem *)&ram[mem2->next])->prev = ptr2; ++ } ++ MEM_STATS_INC_USED(used, (size + SIZEOF_STRUCT_MEM)); ++ } else { ++ /* (a mem2 struct does no fit into the user data space of mem and mem->next will always ++ * be used at this point: if not we have 2 unused structs in a row, plug_holes should have ++ * take care of this). ++ * -> near fit or excact fit: do not split, no mem2 creation ++ * also can't move mem->next directly behind mem, since mem->next ++ * will always be used at this point! ++ */ ++ mem->used = 1; ++ MEM_STATS_INC_USED(used, mem->next - ((u8_t *)mem - ram)); + } +-#endif /* MEM_STATS */ +- } else { +- /* (a mem2 struct does no fit into the user data space of mem and mem->next will always +- * be used at this point: if not we have 2 unused structs in a row, plug_holes should have +- * take care of this). +- * -> near fit or excact fit: do not split, no mem2 creation +- * also can't move mem->next directly behind mem, since mem->next +- * will always be used at this point! +- */ +- mem->used = 1; +-#if MEM_STATS +- lwip_stats.mem.used += mem->next - ((u8_t *)mem - ram); +- if (lwip_stats.mem.max < lwip_stats.mem.used) { +- lwip_stats.mem.max = lwip_stats.mem.used; +- } +-#endif /* MEM_STATS */ +- } + +- if (mem == lfree) { +- /* Find next free block after mem and update lowest free pointer */ +- while (lfree->used && lfree != ram_end) { +- lfree = (struct mem *)&ram[lfree->next]; ++ if (mem == lfree) { ++ /* Find next free block after mem and update lowest free pointer */ ++ while (lfree->used && lfree != ram_end) { ++ LWIP_MEM_ALLOC_UNPROTECT(); ++ /* prevent high interrupt latency... */ ++ LWIP_MEM_ALLOC_PROTECT(); ++ lfree = (struct mem *)&ram[lfree->next]; ++ } ++ LWIP_ASSERT("mem_malloc: !lfree->used", ((lfree == ram_end) || (!lfree->used))); + } +- LWIP_ASSERT("mem_malloc: !lfree->used", ((lfree == ram_end) || (!lfree->used))); +- } +- sys_sem_signal(mem_sem); +- LWIP_ASSERT("mem_malloc: allocated memory not above ram_end.", +- (mem_ptr_t)mem + SIZEOF_STRUCT_MEM + size <= (mem_ptr_t)ram_end); +- LWIP_ASSERT("mem_malloc: allocated memory properly aligned.", +- (unsigned long)((u8_t *)mem + SIZEOF_STRUCT_MEM) % MEM_ALIGNMENT == 0); +- LWIP_ASSERT("mem_malloc: sanity check alignment", +- (((mem_ptr_t)mem) & (MEM_ALIGNMENT-1)) == 0); ++ LWIP_MEM_ALLOC_UNPROTECT(); ++ sys_sem_signal(mem_sem); ++ LWIP_ASSERT("mem_malloc: allocated memory not above ram_end.", ++ (mem_ptr_t)mem + SIZEOF_STRUCT_MEM + size <= (mem_ptr_t)ram_end); ++ LWIP_ASSERT("mem_malloc: allocated memory properly aligned.", ++ (unsigned long)((u8_t *)mem + SIZEOF_STRUCT_MEM) % MEM_ALIGNMENT == 0); ++ LWIP_ASSERT("mem_malloc: sanity check alignment", ++ (((mem_ptr_t)mem) & (MEM_ALIGNMENT-1)) == 0); + +- return (u8_t *)mem + SIZEOF_STRUCT_MEM; ++ return (u8_t *)mem + SIZEOF_STRUCT_MEM; ++ } + } +- } ++#if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT ++ /* if we got interrupted by a mem_free, try again */ ++ } while(local_mem_free_count != 0); ++#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */ + LWIP_DEBUGF(MEM_DEBUG | 2, ("mem_malloc: could not allocate %"S16_F" bytes\n", (s16_t)size)); +-#if MEM_STATS +- ++lwip_stats.mem.err; +-#endif /* MEM_STATS */ ++ MEM_STATS_INC(err); ++ LWIP_MEM_ALLOC_UNPROTECT(); + sys_sem_signal(mem_sem); + return NULL; + } +Index: src/core/memp.c +=================================================================== +RCS file: /sources/lwip/lwip/src/core/memp.c,v +retrieving revision 1.55 +retrieving revision 1.56 +diff -u -p -r1.55 -r1.56 +--- src/core/memp.c 25 Nov 2007 10:43:28 -0000 1.55 ++++ src/core/memp.c 27 Jun 2008 18:37:54 -0000 1.56 +@@ -252,13 +252,12 @@ memp_init(void) + struct memp *memp; + u16_t i, j; + +-#if MEMP_STATS + for (i = 0; i < MEMP_MAX; ++i) { +- lwip_stats.memp[i].used = lwip_stats.memp[i].max = +- lwip_stats.memp[i].err = 0; +- lwip_stats.memp[i].avail = memp_num[i]; ++ MEMP_STATS_AVAIL(used, i, 0); ++ MEMP_STATS_AVAIL(max, i, 0); ++ MEMP_STATS_AVAIL(err, i, 0); ++ MEMP_STATS_AVAIL(avail, i, memp_num[i]); + } +-#endif /* MEMP_STATS */ + + memp = LWIP_MEM_ALIGN(memp_memory); + /* for every pool: */ +@@ -315,20 +314,13 @@ memp_malloc_fn(memp_t type, const char* + memp->file = file; + memp->line = line; + #endif /* MEMP_OVERFLOW_CHECK */ +-#if MEMP_STATS +- ++lwip_stats.memp[type].used; +- if (lwip_stats.memp[type].used > lwip_stats.memp[type].max) { +- lwip_stats.memp[type].max = lwip_stats.memp[type].used; +- } +-#endif /* MEMP_STATS */ ++ MEMP_STATS_INC_USED(used, type); + LWIP_ASSERT("memp_malloc: memp properly aligned", + ((mem_ptr_t)memp % MEM_ALIGNMENT) == 0); + memp = (struct memp*)((u8_t*)memp + MEMP_SIZE); + } else { + LWIP_DEBUGF(MEMP_DEBUG | 2, ("memp_malloc: out of memory in pool %s\n", memp_desc[type])); +-#if MEMP_STATS +- ++lwip_stats.memp[type].err; +-#endif /* MEMP_STATS */ ++ MEMP_STATS_INC(err, type); + } + + SYS_ARCH_UNPROTECT(old_level); +@@ -365,9 +357,7 @@ memp_free(memp_t type, void *mem) + #endif /* MEMP_OVERFLOW_CHECK >= 2 */ + #endif /* MEMP_OVERFLOW_CHECK */ + +-#if MEMP_STATS +- lwip_stats.memp[type].used--; +-#endif /* MEMP_STATS */ ++ MEMP_STATS_DEC(used, type); + + memp->next = memp_tab[type]; + memp_tab[type] = memp; +Index: src/core/netif.c +=================================================================== +RCS file: /sources/lwip/lwip/src/core/netif.c,v +retrieving revision 1.65 +retrieving revision 1.68 +diff -u -p -r1.65 -r1.68 +--- src/core/netif.c 9 Oct 2007 20:00:55 -0000 1.65 ++++ src/core/netif.c 19 Jun 2008 16:27:18 -0000 1.68 +@@ -45,6 +45,12 @@ + #include "lwip/snmp.h" + #include "lwip/igmp.h" + #include "netif/etharp.h" ++#if ENABLE_LOOPBACK ++#include "lwip/sys.h" ++#if LWIP_NETIF_LOOPBACK_MULTITHREADING ++#include "lwip/tcpip.h" ++#endif /* LWIP_NETIF_LOOPBACK_MULTITHREADING */ ++#endif /* ENABLE_LOOPBACK */ + + #if LWIP_NETIF_STATUS_CALLBACK + #define NETIF_STATUS_CALLBACK(n) { if (n->status_callback) (n->status_callback)(n); } +@@ -106,6 +112,10 @@ netif_add(struct netif *netif, struct ip + #if LWIP_IGMP + netif->igmp_mac_filter = NULL; + #endif /* LWIP_IGMP */ ++#if ENABLE_LOOPBACK ++ netif->loop_first = NULL; ++ netif->loop_last = NULL; ++#endif /* ENABLE_LOOPBACK */ + + /* remember netif specific state information data */ + netif->state = state; +@@ -114,6 +124,9 @@ netif_add(struct netif *netif, struct ip + #if LWIP_NETIF_HWADDRHINT + netif->addr_hint = NULL; + #endif /* LWIP_NETIF_HWADDRHINT*/ ++#if ENABLE_LOOPBACK && LWIP_LOOPBACK_MAX_PBUFS ++ netif->loop_cnt_current = 0; ++#endif /* ENABLE_LOOPBACK && LWIP_LOOPBACK_MAX_PBUFS */ + + netif_set_addr(netif, ipaddr, netmask, gw); + +@@ -493,7 +506,158 @@ u8_t netif_is_link_up(struct netif *neti + */ + void netif_set_link_callback(struct netif *netif, void (* link_callback)(struct netif *netif )) + { +- if ( netif ) +- netif->link_callback = link_callback; ++ if (netif) { ++ netif->link_callback = link_callback; ++ } + } + #endif /* LWIP_NETIF_LINK_CALLBACK */ ++ ++#if ENABLE_LOOPBACK ++/** ++ * Send an IP packet to be received on the same netif (loopif-like). ++ * The pbuf is simply copied and handed back to netif->input. ++ * In multithreaded mode, this is done directly since netif->input must put ++ * the packet on a queue. ++ * In callback mode, the packet is put on an internal queue and is fed to ++ * netif->input by netif_poll(). ++ * ++ * @param netif the lwip network interface structure ++ * @param p the (IP) packet to 'send' ++ * @param ipaddr the ip address to send the packet to (not used) ++ * @return ERR_OK if the packet has been sent ++ * ERR_MEM if the pbuf used to copy the packet couldn't be allocated ++ */ ++err_t ++netif_loop_output(struct netif *netif, struct pbuf *p, ++ struct ip_addr *ipaddr) ++{ ++ struct pbuf *r; ++ err_t err; ++ struct pbuf *last; ++#if LWIP_LOOPBACK_MAX_PBUFS ++ u8_t clen = 0; ++#endif /* LWIP_LOOPBACK_MAX_PBUFS */ ++ SYS_ARCH_DECL_PROTECT(lev); ++ LWIP_UNUSED_ARG(ipaddr); ++ ++ /* Allocate a new pbuf */ ++ r = pbuf_alloc(PBUF_LINK, p->tot_len, PBUF_RAM); ++ if (r == NULL) { ++ return ERR_MEM; ++ } ++#if LWIP_LOOPBACK_MAX_PBUFS ++ clen = pbuf_clen(r); ++ /* check for overflow or too many pbuf on queue */ ++ if(((netif->loop_cnt_current + clen) < netif->loop_cnt_current) || ++ ((netif->loop_cnt_current + clen) > LWIP_LOOPBACK_MAX_PBUFS)) { ++ pbuf_free(r); ++ r = NULL; ++ return ERR_MEM; ++ } ++ netif->loop_cnt_current += clen; ++#endif /* LWIP_LOOPBACK_MAX_PBUFS */ ++ ++ /* Copy the whole pbuf queue p into the single pbuf r */ ++ if ((err = pbuf_copy(r, p)) != ERR_OK) { ++ pbuf_free(r); ++ r = NULL; ++ return err; ++ } ++ ++ /* Put the packet on a linked list which gets emptied through calling ++ netif_poll(). */ ++ ++ /* let last point to the last pbuf in chain r */ ++ for (last = r; last->next != NULL; last = last->next); ++ ++ SYS_ARCH_PROTECT(lev); ++ if(netif->loop_first != NULL) { ++ LWIP_ASSERT("if first != NULL, last must also be != NULL", netif->loop_last != NULL); ++ netif->loop_last->next = r; ++ netif->loop_last = last; ++ } else { ++ netif->loop_first = r; ++ netif->loop_last = last; ++ } ++ SYS_ARCH_UNPROTECT(lev); ++ ++#if LWIP_NETIF_LOOPBACK_MULTITHREADING ++ /* For multithreading environment, schedule a call to netif_poll */ ++ tcpip_callback(netif_poll, netif); ++#endif /* LWIP_NETIF_LOOPBACK_MULTITHREADING */ ++ ++ return ERR_OK; ++} ++ ++/** ++ * Call netif_poll() in the main loop of your application. This is to prevent ++ * reentering non-reentrant functions like tcp_input(). Packets passed to ++ * netif_loop_output() are put on a list that is passed to netif->input() by ++ * netif_poll(). ++ */ ++void ++netif_poll(struct netif *netif) ++{ ++ struct pbuf *in; ++ SYS_ARCH_DECL_PROTECT(lev); ++ ++ do { ++ /* Get a packet from the list. With SYS_LIGHTWEIGHT_PROT=1, this is protected */ ++ SYS_ARCH_PROTECT(lev); ++ in = netif->loop_first; ++ if(in != NULL) { ++ struct pbuf *in_end = in; ++#if LWIP_LOOPBACK_MAX_PBUFS ++ u8_t clen = pbuf_clen(in); ++ /* adjust the number of pbufs on queue */ ++ LWIP_ASSERT("netif->loop_cnt_current underflow", ++ ((netif->loop_cnt_current - clen) < netif->loop_cnt_current)); ++ netif->loop_cnt_current -= clen; ++#endif /* LWIP_LOOPBACK_MAX_PBUFS */ ++ while(in_end->len != in_end->tot_len) { ++ LWIP_ASSERT("bogus pbuf: len != tot_len but next == NULL!", in_end->next != NULL); ++ in_end = in_end->next; ++ } ++ /* 'in_end' now points to the last pbuf from 'in' */ ++ if(in_end == netif->loop_last) { ++ /* this was the last pbuf in the list */ ++ netif->loop_first = netif->loop_last = NULL; ++ } else { ++ /* pop the pbuf off the list */ ++ netif->loop_first = in_end->next; ++ LWIP_ASSERT("should not be null since first != last!", netif->loop_first != NULL); ++ } ++ /* De-queue the pbuf from its successors on the 'loop_' list. */ ++ in_end->next = NULL; ++ } ++ SYS_ARCH_UNPROTECT(lev); ++ ++ if(in != NULL) { ++ /* loopback packets are always IP packets! */ ++ if(ip_input(in, netif) != ERR_OK) { ++ pbuf_free(in); ++ } ++ /* Don't reference the packet any more! */ ++ in = NULL; ++ } ++ /* go on while there is a packet on the list */ ++ } while(netif->loop_first != NULL); ++} ++ ++#if !LWIP_NETIF_LOOPBACK_MULTITHREADING ++/** ++ * Calls netif_poll() for every netif on the netif_list. ++ */ ++void ++netif_poll_all(void) ++{ ++ struct netif *netif = netif_list; ++ /* loop through netifs */ ++ while (netif != NULL) { ++ netif_poll(netif); ++ /* proceed to next network interface */ ++ netif = netif->next; ++ } ++} ++#endif /* !LWIP_NETIF_LOOPBACK_MULTITHREADING */ ++#endif /* ENABLE_LOOPBACK */ +Index: src/core/pbuf.c +=================================================================== +RCS file: /sources/lwip/lwip/src/core/pbuf.c,v +retrieving revision 1.127 +retrieving revision 1.128 +diff -u -p -r1.127 -r1.128 +--- src/core/pbuf.c 4 Mar 2008 16:37:46 -0000 1.127 ++++ src/core/pbuf.c 1 Apr 2008 19:05:40 -0000 1.128 +@@ -667,8 +667,8 @@ pbuf_dechain(struct pbuf *p) + * + * @note Only one packet is copied, no packet queue! + * +- * @param p_to pbuf source of the copy +- * @param p_from pbuf destination of the copy ++ * @param p_to pbuf destination of the copy ++ * @param p_from pbuf source of the copy + * + * @return ERR_OK if pbuf was copied + * ERR_ARG if one of the pbufs is NULL or p_to is not big +Index: src/core/stats.c +=================================================================== +RCS file: /sources/lwip/lwip/src/core/stats.c,v +retrieving revision 1.27 +retrieving revision 1.28 +diff -u -p -r1.27 -r1.28 +--- src/core/stats.c 4 Mar 2008 16:31:32 -0000 1.27 ++++ src/core/stats.c 27 Jun 2008 18:37:54 -0000 1.28 +@@ -54,7 +54,6 @@ stats_display_proto(struct stats_proto * + { + LWIP_PLATFORM_DIAG(("\n%s\n\t", name)); + LWIP_PLATFORM_DIAG(("xmit: %"STAT_COUNTER_F"\n\t", proto->xmit)); +- LWIP_PLATFORM_DIAG(("rexmit: %"STAT_COUNTER_F"\n\t", proto->rexmit)); + LWIP_PLATFORM_DIAG(("recv: %"STAT_COUNTER_F"\n\t", proto->recv)); + LWIP_PLATFORM_DIAG(("fw: %"STAT_COUNTER_F"\n\t", proto->fw)); + LWIP_PLATFORM_DIAG(("drop: %"STAT_COUNTER_F"\n\t", proto->drop)); +@@ -68,6 +67,7 @@ stats_display_proto(struct stats_proto * + LWIP_PLATFORM_DIAG(("cachehit: %"STAT_COUNTER_F"\n", proto->cachehit)); + } + ++#if IGMP_STATS + void + stats_display_igmp(struct stats_igmp *igmp) + { +@@ -82,7 +82,9 @@ stats_display_igmp(struct stats_igmp *ig + LWIP_PLATFORM_DIAG(("report_rxed: %"STAT_COUNTER_F"\n\t", igmp->report_rxed)); + LWIP_PLATFORM_DIAG(("group_query_rxed: %"STAT_COUNTER_F"\n", igmp->group_query_rxed)); + } ++#endif /* IGMP_STATS */ + ++#if MEM_STATS || MEMP_STATS + void + stats_display_mem(struct stats_mem *mem, char *name) + { +@@ -93,48 +95,53 @@ stats_display_mem(struct stats_mem *mem, + LWIP_PLATFORM_DIAG(("err: %"U32_F"\n", (u32_t)mem->err)); + } + ++#if MEMP_STATS + void +-stats_display(void) ++stats_display_memp(struct stats_mem *mem, int index) + { +-#if MEMP_STATS +- s16_t i; + char * memp_names[] = { + #define LWIP_MEMPOOL(name,num,size,desc) desc, + #include "lwip/memp_std.h" + }; +-#endif +-#if LINK_STATS +- stats_display_proto(&lwip_stats.link, "LINK"); +-#endif +-#if ETHARP_STATS +- stats_display_proto(&lwip_stats.etharp, "ETHARP"); +-#endif +-#if IPFRAG_STATS +- stats_display_proto(&lwip_stats.ip_frag, "IP_FRAG"); +-#endif +-#if IP_STATS +- stats_display_proto(&lwip_stats.ip, "IP"); +-#endif +-#if ICMP_STATS +- stats_display_proto(&lwip_stats.icmp, "ICMP"); +-#endif +-#if IGMP_STATS +- stats_display_igmp(&lwip_stats.igmp); +-#endif +-#if UDP_STATS +- stats_display_proto(&lwip_stats.udp, "UDP"); +-#endif +-#if TCP_STATS +- stats_display_proto(&lwip_stats.tcp, "TCP"); +-#endif +-#if MEM_STATS +- stats_display_mem(&lwip_stats.mem, "HEAP"); +-#endif +-#if MEMP_STATS ++ if(index < MEMP_MAX) { ++ stats_display_mem(mem, memp_names[index]); ++ } ++} ++#endif /* MEMP_STATS */ ++#endif /* MEM_STATS || MEMP_STATS */ ++ ++#if SYS_STATS ++void ++stats_display_sys(struct stats_sys *sys) ++{ ++ LWIP_PLATFORM_DIAG(("\nSYS\n\t")); ++ LWIP_PLATFORM_DIAG(("sem.used: %"U32_F"\n\t", (u32_t)sys->sem.used)); ++ LWIP_PLATFORM_DIAG(("sem.max: %"U32_F"\n\t", (u32_t)sys->sem.max)); ++ LWIP_PLATFORM_DIAG(("sem.err: %"U32_F"\n\t", (u32_t)sys->sem.err)); ++ LWIP_PLATFORM_DIAG(("mbox.used: %"U32_F"\n\t", (u32_t)sys->mbox.used)); ++ LWIP_PLATFORM_DIAG(("mbox.max: %"U32_F"\n\t", (u32_t)sys->mbox.max)); ++ LWIP_PLATFORM_DIAG(("mbox.err: %"U32_F"\n\t", (u32_t)sys->mbox.err)); ++} ++#endif /* SYS_STATS */ ++ ++void ++stats_display(void) ++{ ++ s16_t i; ++ ++ LINK_STATS_DISPLAY(); ++ ETHARP_STATS_DISPLAY(); ++ IPFRAG_STATS_DISPLAY(); ++ IP_STATS_DISPLAY(); ++ IGMP_STATS_DISPLAY(); ++ ICMP_STATS_DISPLAY(); ++ UDP_STATS_DISPLAY(); ++ TCP_STATS_DISPLAY(); ++ MEM_STATS_DISPLAY(); + for (i = 0; i < MEMP_MAX; i++) { +- stats_display_mem(&lwip_stats.memp[i], memp_names[i]); ++ MEMP_STATS_DISPLAY(i); + } +-#endif ++ SYS_STATS_DISPLAY(); + } + #endif /* LWIP_STATS_DISPLAY */ + +Index: src/core/sys.c +=================================================================== +RCS file: /sources/lwip/lwip/src/core/sys.c,v +retrieving revision 1.32 +retrieving revision 1.33 +diff -u -p -r1.32 -r1.33 +--- src/core/sys.c 25 Nov 2007 13:57:05 -0000 1.32 ++++ src/core/sys.c 16 Jul 2008 20:36:12 -0000 1.33 +@@ -65,7 +65,7 @@ struct sswt_cb + void + sys_mbox_fetch(sys_mbox_t mbox, void **msg) + { +- u32_t time; ++ u32_t time_needed; + struct sys_timeouts *timeouts; + struct sys_timeo *tmptimeout; + sys_timeout_handler h; +@@ -76,18 +76,18 @@ sys_mbox_fetch(sys_mbox_t mbox, void **m + + if (!timeouts || !timeouts->next) { + UNLOCK_TCPIP_CORE(); +- time = sys_arch_mbox_fetch(mbox, msg, 0); ++ time_needed = sys_arch_mbox_fetch(mbox, msg, 0); + LOCK_TCPIP_CORE(); + } else { + if (timeouts->next->time > 0) { + UNLOCK_TCPIP_CORE(); +- time = sys_arch_mbox_fetch(mbox, msg, timeouts->next->time); ++ time_needed = sys_arch_mbox_fetch(mbox, msg, timeouts->next->time); + LOCK_TCPIP_CORE(); + } else { +- time = SYS_ARCH_TIMEOUT; ++ time_needed = SYS_ARCH_TIMEOUT; + } + +- if (time == SYS_ARCH_TIMEOUT) { ++ if (time_needed == SYS_ARCH_TIMEOUT) { + /* If time == SYS_ARCH_TIMEOUT, a timeout occured before a message + could be fetched. We should now call the timeout handler and + deallocate the memory allocated for the timeout. */ +@@ -107,8 +107,8 @@ sys_mbox_fetch(sys_mbox_t mbox, void **m + /* If time != SYS_ARCH_TIMEOUT, a message was received before the timeout + occured. The time variable is set to the number of + milliseconds we waited for the message. */ +- if (time < timeouts->next->time) { +- timeouts->next->time -= time; ++ if (time_needed < timeouts->next->time) { ++ timeouts->next->time -= time_needed; + } else { + timeouts->next->time = 0; + } +@@ -125,7 +125,7 @@ sys_mbox_fetch(sys_mbox_t mbox, void **m + void + sys_sem_wait(sys_sem_t sem) + { +- u32_t time; ++ u32_t time_needed; + struct sys_timeouts *timeouts; + struct sys_timeo *tmptimeout; + sys_timeout_handler h; +@@ -139,12 +139,12 @@ sys_sem_wait(sys_sem_t sem) + sys_arch_sem_wait(sem, 0); + } else { + if (timeouts->next->time > 0) { +- time = sys_arch_sem_wait(sem, timeouts->next->time); ++ time_needed = sys_arch_sem_wait(sem, timeouts->next->time); + } else { +- time = SYS_ARCH_TIMEOUT; ++ time_needed = SYS_ARCH_TIMEOUT; + } + +- if (time == SYS_ARCH_TIMEOUT) { ++ if (time_needed == SYS_ARCH_TIMEOUT) { + /* If time == SYS_ARCH_TIMEOUT, a timeout occured before a message + could be fetched. We should now call the timeout handler and + deallocate the memory allocated for the timeout. */ +@@ -164,8 +164,8 @@ sys_sem_wait(sys_sem_t sem) + /* If time != SYS_ARCH_TIMEOUT, a message was received before the timeout + occured. The time variable is set to the number of + milliseconds we waited for the message. */ +- if (time < timeouts->next->time) { +- timeouts->next->time -= time; ++ if (time_needed < timeouts->next->time) { ++ timeouts->next->time -= time_needed; + } else { + timeouts->next->time = 0; + } +Index: src/core/tcp.c +=================================================================== +RCS file: /sources/lwip/lwip/src/core/tcp.c,v +retrieving revision 1.85 +retrieving revision 1.86 +diff -u -p -r1.85 -r1.86 +--- src/core/tcp.c 22 Jan 2008 21:15:15 -0000 1.85 ++++ src/core/tcp.c 26 Mar 2008 11:57:13 -0000 1.86 +@@ -509,7 +509,8 @@ tcp_connect(struct tcp_pcb *pcb, struct + pcb->rcv_wnd = TCP_WND; + pcb->rcv_ann_wnd = TCP_WND; + pcb->snd_wnd = TCP_WND; +- /* The send MSS is updated when an MSS option is received. */ ++ /* As initial send MSS, we use TCP_MSS but limit it to 536. ++ The send MSS is updated when an MSS option is received. */ + pcb->mss = (TCP_MSS > 536) ? 536 : TCP_MSS; + #if TCP_CALCULATE_EFF_SEND_MSS + pcb->mss = tcp_eff_send_mss(pcb->mss, ipaddr); +@@ -991,7 +992,8 @@ tcp_alloc(u8_t prio) + pcb->rcv_ann_wnd = TCP_WND; + pcb->tos = 0; + pcb->ttl = TCP_TTL; +- /* The send MSS is updated when an MSS option is received. */ ++ /* As initial send MSS, we use TCP_MSS but limit it to 536. ++ The send MSS is updated when an MSS option is received. */ + pcb->mss = (TCP_MSS > 536) ? 536 : TCP_MSS; + pcb->rto = 3000 / TCP_SLOW_INTERVAL; + pcb->sa = 0; +Index: src/core/tcp_in.c +=================================================================== +RCS file: /sources/lwip/lwip/src/core/tcp_in.c,v +retrieving revision 1.97 +retrieving revision 1.100 +diff -u -p -r1.97 -r1.100 +--- src/core/tcp_in.c 22 Jan 2008 21:15:15 -0000 1.97 ++++ src/core/tcp_in.c 24 Jun 2008 15:46:39 -0000 1.100 +@@ -511,7 +511,7 @@ tcp_process(struct tcp_pcb *pcb) + } + } else { + if (TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt, +- pcb->rcv_nxt+pcb->rcv_ann_wnd)) { ++ pcb->rcv_nxt+pcb->rcv_wnd)) { + acceptable = 1; + } + } +@@ -1038,7 +1038,7 @@ tcp_receive(struct tcp_pcb *pcb) + and below rcv_nxt + rcv_wnd) in order to be further + processed. */ + if (TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt, +- pcb->rcv_nxt + pcb->rcv_ann_wnd - 1)){ ++ pcb->rcv_nxt + pcb->rcv_wnd - 1)){ + if (pcb->rcv_nxt == seqno) { + accepted_inseq = 1; + /* The incoming segment is the next in sequence. We check if +@@ -1195,14 +1195,14 @@ tcp_receive(struct tcp_pcb *pcb) + } else { + pcb->ooseq = cseg; + } +- } +- tcp_seg_free(next); +- if (cseg->next != NULL) { +- next = cseg->next; +- if (TCP_SEQ_GT(seqno + cseg->len, next->tcphdr->seqno)) { +- /* We need to trim the incoming segment. */ +- cseg->len = (u16_t)(next->tcphdr->seqno - seqno); +- pbuf_realloc(cseg->p, cseg->len); ++ tcp_seg_free(next); ++ if (cseg->next != NULL) { ++ next = cseg->next; ++ if (TCP_SEQ_GT(seqno + cseg->len, next->tcphdr->seqno)) { ++ /* We need to trim the incoming segment. */ ++ cseg->len = (u16_t)(next->tcphdr->seqno - seqno); ++ pbuf_realloc(cseg->p, cseg->len); ++ } + } + } + break; +@@ -1282,10 +1282,7 @@ tcp_receive(struct tcp_pcb *pcb) + + } + } else { +- if(!TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt, +- pcb->rcv_nxt + pcb->rcv_ann_wnd-1)){ +- tcp_ack_now(pcb); +- } ++ tcp_ack_now(pcb); + } + } else { + /* Segments with length 0 is taken care of here. Segments that +@@ -1331,7 +1328,8 @@ tcp_parseopt(struct tcp_pcb *pcb) + opts[c + 1] == 0x04) { + /* An MSS option with the right option length. */ + mss = (opts[c + 2] << 8) | opts[c + 3]; +- pcb->mss = mss > TCP_MSS? TCP_MSS: mss; ++ /* Limit the mss to the configured TCP_MSS and prevent division by zero */ ++ pcb->mss = ((mss > TCP_MSS) || (mss == 0)) ? TCP_MSS : mss; + + /* And we are done processing options. */ + break; +Index: src/core/ipv4/autoip.c +=================================================================== +RCS file: /sources/lwip/lwip/src/core/ipv4/autoip.c,v +retrieving revision 1.16 +retrieving revision 1.17 +diff -u -p -r1.16 -r1.17 +--- src/core/ipv4/autoip.c 26 Jan 2008 16:11:40 -0000 1.16 ++++ src/core/ipv4/autoip.c 17 Jun 2008 20:16:23 -0000 1.17 +@@ -395,8 +395,8 @@ autoip_arp_reply(struct netif *netif, st + /* Copy struct ip_addr2 to aligned ip_addr, to support compilers without + * structure packing (not using structure copy which breaks strict-aliasing rules). + */ +- MEMCPY(&sipaddr, &hdr->sipaddr, sizeof(sipaddr)); +- MEMCPY(&dipaddr, &hdr->dipaddr, sizeof(dipaddr)); ++ SMEMCPY(&sipaddr, &hdr->sipaddr, sizeof(sipaddr)); ++ SMEMCPY(&dipaddr, &hdr->dipaddr, sizeof(dipaddr)); + + if ((netif->autoip->state == AUTOIP_STATE_PROBING) || + ((netif->autoip->state == AUTOIP_STATE_ANNOUNCING) && +Index: src/core/ipv4/inet_chksum.c +=================================================================== +RCS file: /sources/lwip/lwip/src/core/ipv4/inet_chksum.c,v +retrieving revision 1.4 +retrieving revision 1.5 +diff -u -p -r1.4 -r1.5 +--- src/core/ipv4/inet_chksum.c 10 Mar 2008 16:12:31 -0000 1.4 ++++ src/core/ipv4/inet_chksum.c 17 Jun 2008 20:06:25 -0000 1.5 +@@ -41,8 +41,6 @@ + #include "lwip/inet_chksum.h" + #include "lwip/inet.h" + +-#include <string.h> +- + /* These are some reference implementations of the checksum algorithm, with the + * aim of being simple, correct and fully portable. Checksumming is the + * first thing you would want to optimize for your platform. If you create +@@ -65,6 +63,11 @@ + # define LWIP_CHKSUM_ALGORITHM 0 + #endif + ++/** Like the name says... */ ++#define SWAP_BYTES_IN_WORD(w) ((w & 0xff) << 8) | ((w & 0xff00) >> 8) ++/** Split an u32_t in two u16_ts and add them up */ ++#define FOLD_U32T(u) ((u >> 16) + (u & 0x0000ffffUL)) ++ + #if (LWIP_CHKSUM_ALGORITHM == 1) /* Version #1 */ + /** + * lwip checksum +@@ -86,8 +89,7 @@ lwip_standard_chksum(void *dataptr, u16_ + acc = 0; + /* dataptr may be at odd or even addresses */ + octetptr = (u8_t*)dataptr; +- while (len > 1) +- { ++ while (len > 1) { + /* declare first octet as most significant + thus assume network order, ignoring host order */ + src = (*octetptr) << 8; +@@ -98,8 +100,7 @@ lwip_standard_chksum(void *dataptr, u16_ + acc += src; + len -= 2; + } +- if (len > 0) +- { ++ if (len > 0) { + /* accumulate remaining octet */ + src = (*octetptr) << 8; + acc += src; +@@ -154,19 +155,22 @@ lwip_standard_chksum(void *dataptr, int + } + + /* Consume left-over byte, if any */ +- if (len > 0) ++ if (len > 0) { + ((u8_t *)&t)[0] = *(u8_t *)ps;; ++ } + + /* Add end bytes */ + sum += t; + +- /* Fold 32-bit sum to 16 bits */ +- while ((sum >> 16) != 0) +- sum = (sum & 0xffff) + (sum >> 16); ++ /* Fold 32-bit sum to 16 bits ++ calling this twice is propably faster than if statements... */ ++ sum = FOLD_U32T(sum); ++ sum = FOLD_U32T(sum); + + /* Swap if alignment was odd */ +- if (odd) +- sum = ((sum & 0xff) << 8) | ((sum & 0xff00) >> 8); ++ if (odd) { ++ sum = SWAP_BYTES_IN_WORD(sum); ++ } + + return sum; + } +@@ -211,18 +215,20 @@ lwip_standard_chksum(void *dataptr, int + + while (len > 7) { + tmp = sum + *pl++; /* ping */ +- if (tmp < sum) ++ if (tmp < sum) { + tmp++; /* add back carry */ ++ } + + sum = tmp + *pl++; /* pong */ +- if (sum < tmp) ++ if (sum < tmp) { + sum++; /* add back carry */ ++ } + + len -= 8; + } + + /* make room in upper bits */ +- sum = (sum >> 16) + (sum & 0xffff); ++ sum = FOLD_U32T(sum); + + ps = (u16_t *)pl; + +@@ -233,16 +239,20 @@ lwip_standard_chksum(void *dataptr, int + } + + /* dangling tail byte remaining? */ +- if (len > 0) /* include odd byte */ ++ if (len > 0) { /* include odd byte */ + ((u8_t *)&t)[0] = *(u8_t *)ps; ++ } + + sum += t; /* add end bytes */ + +- while ((sum >> 16) != 0) /* combine halves */ +- sum = (sum >> 16) + (sum & 0xffff); ++ /* Fold 32-bit sum to 16 bits ++ calling this twice is propably faster than if statements... */ ++ sum = FOLD_U32T(sum); ++ sum = FOLD_U32T(sum); + +- if (odd) +- sum = ((sum & 0xff) << 8) | ((sum & 0xff00) >> 8); ++ if (odd) { ++ sum = SWAP_BYTES_IN_WORD(sum); ++ } + + return sum; + } +@@ -277,18 +287,18 @@ inet_chksum_pseudo(struct pbuf *p, + (void *)q, (void *)q->next)); + acc += LWIP_CHKSUM(q->payload, q->len); + /*LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): unwrapped lwip_chksum()=%"X32_F" \n", acc));*/ +- while ((acc >> 16) != 0) { +- acc = (acc & 0xffffUL) + (acc >> 16); +- } ++ /* just executing this next line is probably faster that the if statement needed ++ to check whether we really need to execute it, and does no harm */ ++ acc = FOLD_U32T(acc); + if (q->len % 2 != 0) { + swapped = 1 - swapped; +- acc = ((acc & 0xff) << 8) | ((acc & 0xff00UL) >> 8); ++ acc = SWAP_BYTES_IN_WORD(acc); + } + /*LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): wrapped lwip_chksum()=%"X32_F" \n", acc));*/ + } + + if (swapped) { +- acc = ((acc & 0xff) << 8) | ((acc & 0xff00UL) >> 8); ++ acc = SWAP_BYTES_IN_WORD(acc); + } + acc += (src->addr & 0xffffUL); + acc += ((src->addr >> 16) & 0xffffUL); +@@ -297,9 +307,10 @@ inet_chksum_pseudo(struct pbuf *p, + acc += (u32_t)htons((u16_t)proto); + acc += (u32_t)htons(proto_len); + +- while ((acc >> 16) != 0) { +- acc = (acc & 0xffffUL) + (acc >> 16); +- } ++ /* Fold 32-bit sum to 16 bits ++ calling this twice is propably faster than if statements... */ ++ acc = FOLD_U32T(acc); ++ acc = FOLD_U32T(acc); + LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): pbuf chain lwip_chksum()=%"X32_F"\n", acc)); + return (u16_t)~(acc & 0xffffUL); + } +@@ -340,18 +351,17 @@ inet_chksum_pseudo_partial(struct pbuf * + chksum_len -= chklen; + LWIP_ASSERT("delete me", chksum_len < 0x7fff); + /*LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): unwrapped lwip_chksum()=%"X32_F" \n", acc));*/ +- while ((acc >> 16) != 0) { +- acc = (acc & 0xffffUL) + (acc >> 16); +- } ++ /* fold the upper bit down */ ++ acc = FOLD_U32T(acc); + if (q->len % 2 != 0) { + swapped = 1 - swapped; +- acc = ((acc & 0xff) << 8) | ((acc & 0xff00UL) >> 8); ++ acc = SWAP_BYTES_IN_WORD(acc); + } + /*LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): wrapped lwip_chksum()=%"X32_F" \n", acc));*/ + } + + if (swapped) { +- acc = ((acc & 0xff) << 8) | ((acc & 0xff00UL) >> 8); ++ acc = SWAP_BYTES_IN_WORD(acc); + } + acc += (src->addr & 0xffffUL); + acc += ((src->addr >> 16) & 0xffffUL); +@@ -360,9 +370,10 @@ inet_chksum_pseudo_partial(struct pbuf * + acc += (u32_t)htons((u16_t)proto); + acc += (u32_t)htons(proto_len); + +- while ((acc >> 16) != 0) { +- acc = (acc & 0xffffUL) + (acc >> 16); +- } ++ /* Fold 32-bit sum to 16 bits ++ calling this twice is propably faster than if statements... */ ++ acc = FOLD_U32T(acc); ++ acc = FOLD_U32T(acc); + LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): pbuf chain lwip_chksum()=%"X32_F"\n", acc)); + return (u16_t)~(acc & 0xffffUL); + } +@@ -380,13 +391,7 @@ inet_chksum_pseudo_partial(struct pbuf * + u16_t + inet_chksum(void *dataptr, u16_t len) + { +- u32_t acc; +- +- acc = LWIP_CHKSUM(dataptr, len); +- while ((acc >> 16) != 0) { +- acc = (acc & 0xffff) + (acc >> 16); +- } +- return (u16_t)~(acc & 0xffff); ++ return ~LWIP_CHKSUM(dataptr, len); + } + + /** +@@ -407,17 +412,15 @@ inet_chksum_pbuf(struct pbuf *p) + swapped = 0; + for(q = p; q != NULL; q = q->next) { + acc += LWIP_CHKSUM(q->payload, q->len); +- while ((acc >> 16) != 0) { +- acc = (acc & 0xffffUL) + (acc >> 16); +- } ++ acc = FOLD_U32T(acc); + if (q->len % 2 != 0) { + swapped = 1 - swapped; +- acc = (acc & 0x00ffUL << 8) | (acc & 0xff00UL >> 8); ++ acc = SWAP_BYTES_IN_WORD(acc); + } + } + + if (swapped) { +- acc = ((acc & 0x00ffUL) << 8) | ((acc & 0xff00UL) >> 8); ++ acc = SWAP_BYTES_IN_WORD(acc); + } + return (u16_t)~(acc & 0xffffUL); + } +Index: src/core/ipv4/ip.c +=================================================================== +RCS file: /sources/lwip/lwip/src/core/ipv4/ip.c,v +retrieving revision 1.66 +retrieving revision 1.68 +diff -u -p -r1.66 -r1.68 +--- src/core/ipv4/ip.c 14 Jan 2008 20:53:23 -0000 1.66 ++++ src/core/ipv4/ip.c 17 Jun 2008 19:39:22 -0000 1.68 +@@ -531,9 +531,19 @@ ip_output_if(struct pbuf *p, struct ip_a + LWIP_DEBUGF(IP_DEBUG, ("ip_output_if: %c%c%"U16_F"\n", netif->name[0], netif->name[1], netif->num)); + ip_debug_print(p); + +- LWIP_DEBUGF(IP_DEBUG, ("netif->output()")); ++#if (LWIP_NETIF_LOOPBACK || LWIP_HAVE_LOOPIF) ++ if (ip_addr_cmp(dest, &netif->ip_addr)) { ++ /* Packet to self, enqueue it for loopback */ ++ LWIP_DEBUGF(IP_DEBUG, ("netif_loop_output()")); ++ ++ return netif_loop_output(netif, p, dest); ++ } else ++#endif /* (LWIP_NETIF_LOOPBACK || LWIP_HAVE_LOOPIF) */ ++ { ++ LWIP_DEBUGF(IP_DEBUG, ("netif->output()")); + +- return netif->output(netif, p, dest); ++ return netif->output(netif, p, dest); ++ } + } + + /** +Index: src/include/lwip/debug.h +=================================================================== +RCS file: /sources/lwip/lwip/src/include/lwip/debug.h,v +retrieving revision 1.37 +retrieving revision 1.39 +diff -u -p -r1.37 -r1.39 +--- src/include/lwip/debug.h 22 Sep 2007 11:16:07 -0000 1.37 ++++ src/include/lwip/debug.h 16 Jul 2008 20:36:22 -0000 1.39 +@@ -61,26 +61,28 @@ + #define LWIP_DBG_HALT 0x08U + + #ifndef LWIP_NOASSERT +-#define LWIP_ASSERT(x,y) do { if(!(y)) LWIP_PLATFORM_ASSERT(x); } while(0) ++#define LWIP_ASSERT(message, assertion) do { if(!(assertion)) \ ++ LWIP_PLATFORM_ASSERT(message); } while(0) + #else /* LWIP_NOASSERT */ +-#define LWIP_ASSERT(x,y) ++#define LWIP_ASSERT(message, assertion) + #endif /* LWIP_NOASSERT */ + +-/** print "m" message only if "e" is true, and execute "h" expression */ ++/** if "expression" isn't true, then print "message" and execute "handler" expression */ + #ifndef LWIP_ERROR +-#define LWIP_ERROR(m,e,h) do { if (!(e)) { LWIP_PLATFORM_ASSERT(m); h;}} while(0) ++#define LWIP_ERROR(message, expression, handler) do { if (!(expression)) { \ ++ LWIP_PLATFORM_ASSERT(message); handler;}} while(0) + #endif /* LWIP_ERROR */ + + #ifdef LWIP_DEBUG + /** print debug message only if debug message type is enabled... + * AND is of correct type AND is at least LWIP_DBG_LEVEL + */ +-#define LWIP_DEBUGF(debug,x) do { \ ++#define LWIP_DEBUGF(debug, message) do { \ + if ( \ + ((debug) & LWIP_DBG_ON) && \ + ((debug) & LWIP_DBG_TYPES_ON) && \ + ((s16_t)((debug) & LWIP_DBG_MASK_LEVEL) >= LWIP_DBG_MIN_LEVEL)) { \ +- LWIP_PLATFORM_DIAG(x); \ ++ LWIP_PLATFORM_DIAG(message); \ + if ((debug) & LWIP_DBG_HALT) { \ + while(1); \ + } \ +@@ -88,7 +90,7 @@ + } while(0) + + #else /* LWIP_DEBUG */ +-#define LWIP_DEBUGF(debug,x) ++#define LWIP_DEBUGF(debug, message) + #endif /* LWIP_DEBUG */ + + #endif /* __LWIP_DEBUG_H__ */ +Index: src/include/lwip/err.h +=================================================================== +RCS file: /sources/lwip/lwip/src/include/lwip/err.h,v +retrieving revision 1.13 +retrieving revision 1.15 +diff -u -p -r1.13 -r1.15 +--- src/include/lwip/err.h 13 Dec 2007 23:06:50 -0000 1.13 ++++ src/include/lwip/err.h 17 Jun 2008 20:27:32 -0000 1.15 +@@ -33,37 +33,43 @@ + #define __LWIP_ERR_H__ + + #include "lwip/opt.h" ++#include "lwip/arch.h" + + #ifdef __cplusplus + extern "C" { + #endif + +-typedef s8_t err_t; ++/** Define LWIP_ERR_T in cc.h if you want to use ++ * a different type for your platform (must be signed). */ ++#ifdef LWIP_ERR_T ++typedef LWIP_ERR_T err_t; ++#else /* LWIP_ERR_T */ ++ typedef s8_t err_t; ++#endif /* LWIP_ERR_T*/ + + /* Definitions for error constants. */ + + #define ERR_OK 0 /* No error, everything OK. */ + #define ERR_MEM -1 /* Out of memory error. */ + #define ERR_BUF -2 /* Buffer error. */ +-#define ERR_RTE -3 /* Routing problem. */ ++#define ERR_TIMEOUT -3 /* Timeout. */ ++#define ERR_RTE -4 /* Routing problem. */ + + #define ERR_IS_FATAL(e) ((e) < ERR_RTE) + +-#define ERR_ABRT -4 /* Connection aborted. */ +-#define ERR_RST -5 /* Connection reset. */ +-#define ERR_CLSD -6 /* Connection closed. */ +-#define ERR_CONN -7 /* Not connected. */ ++#define ERR_ABRT -5 /* Connection aborted. */ ++#define ERR_RST -6 /* Connection reset. */ ++#define ERR_CLSD -7 /* Connection closed. */ ++#define ERR_CONN -8 /* Not connected. */ + +-#define ERR_VAL -8 /* Illegal value. */ ++#define ERR_VAL -9 /* Illegal value. */ + +-#define ERR_ARG -9 /* Illegal argument. */ ++#define ERR_ARG -10 /* Illegal argument. */ + +-#define ERR_USE -10 /* Address in use. */ ++#define ERR_USE -11 /* Address in use. */ + +-#define ERR_IF -11 /* Low-level netif error */ +-#define ERR_ISCONN -12 /* Already connected. */ +- +-#define ERR_TIMEOUT -13 /* Timeout. */ ++#define ERR_IF -12 /* Low-level netif error */ ++#define ERR_ISCONN -13 /* Already connected. */ + + #define ERR_INPROGRESS -14 /* Operation in progress */ + +Index: src/include/lwip/mem.h +=================================================================== +RCS file: /sources/lwip/lwip/src/include/lwip/mem.h,v +retrieving revision 1.21 +retrieving revision 1.22 +diff -u -p -r1.21 -r1.22 +--- src/include/lwip/mem.h 4 Mar 2008 16:31:32 -0000 1.21 ++++ src/include/lwip/mem.h 30 May 2008 11:37:15 -0000 1.22 +@@ -50,16 +50,16 @@ typedef size_t mem_size_t; + * allow these defines to be overridden. + */ + #ifndef mem_free +-#define mem_free(x) free(x) ++#define mem_free free + #endif + #ifndef mem_malloc +-#define mem_malloc(x) malloc(x) ++#define mem_malloc malloc + #endif + #ifndef mem_calloc +-#define mem_calloc(x, y) calloc(x, y) ++#define mem_calloc calloc + #endif + #ifndef mem_realloc +-#define mem_realloc(x, size) (x) ++#define mem_realloc realloc + #endif + #else /* MEM_LIBC_MALLOC */ + +Index: src/include/lwip/netif.h +=================================================================== +RCS file: /sources/lwip/lwip/src/include/lwip/netif.h,v +retrieving revision 1.43 +retrieving revision 1.46 +diff -u -p -r1.43 -r1.46 +--- src/include/lwip/netif.h 9 Oct 2007 19:59:59 -0000 1.43 ++++ src/include/lwip/netif.h 19 Jun 2008 16:27:23 -0000 1.46 +@@ -34,6 +34,8 @@ + + #include "lwip/opt.h" + ++#define ENABLE_LOOPBACK (LWIP_NETIF_LOOPBACK || LWIP_HAVE_LOOPIF) ++ + #include "lwip/err.h" + + #include "lwip/ip_addr.h" +@@ -165,6 +167,14 @@ struct netif { + #if LWIP_NETIF_HWADDRHINT + u8_t *addr_hint; + #endif /* LWIP_NETIF_HWADDRHINT */ ++#if ENABLE_LOOPBACK ++ /* List of packets to be queued for ourselves. */ ++ struct pbuf *loop_first; ++ struct pbuf *loop_last; ++#if LWIP_LOOPBACK_MAX_PBUFS ++ u16_t loop_cnt_current; ++#endif /* LWIP_LOOPBACK_MAX_PBUFS */ ++#endif /* ENABLE_LOOPBACK */ + }; + + #if LWIP_SNMP +@@ -242,4 +252,12 @@ void netif_set_link_callback(struct neti + } + #endif + ++#if ENABLE_LOOPBACK ++err_t netif_loop_output(struct netif *netif, struct pbuf *p, struct ip_addr *dest_ip); ++void netif_poll(struct netif *netif); ++#if !LWIP_NETIF_LOOPBACK_MULTITHREADING ++void netif_poll_all(void); ++#endif /* !LWIP_NETIF_LOOPBACK_MULTITHREADING */ ++#endif /* ENABLE_LOOPBACK */ ++ + #endif /* __LWIP_NETIF_H__ */ +Index: src/include/lwip/opt.h +=================================================================== +RCS file: /sources/lwip/lwip/src/include/lwip/opt.h,v +retrieving revision 1.116 +retrieving revision 1.122 +diff -u -p -r1.116 -r1.122 +--- src/include/lwip/opt.h 31 Jan 2008 18:19:29 -0000 1.116 ++++ src/include/lwip/opt.h 30 Jun 2008 18:16:52 -0000 1.122 +@@ -155,6 +155,27 @@ + #define MEMP_USE_CUSTOM_POOLS 0 + #endif + ++/** ++ * Set this to 1 if you want to free PBUF_RAM pbufs (or call mem_free()) from ++ * interrupt context (or another context that doesn't allow waiting for a ++ * semaphore). ++ * If set to 1, mem_malloc will be protected by a semaphore and SYS_ARCH_PROTECT, ++ * while mem_free will only use SYS_ARCH_PROTECT. mem_malloc SYS_ARCH_UNPROTECTs ++ * with each loop so that mem_free can run. ++ * ++ * ATTENTION: As you can see from the above description, this leads to dis-/ ++ * enabling interrupts often, which can be slow! Also, on low memory, mem_malloc ++ * can need longer. ++ * ++ * If you don't want that, at least for NO_SYS=0, you can still use the following ++ * functions to enqueue a deallocation call which then runs in the tcpip_thread ++ * context: ++ * - pbuf_free_callback(p); ++ * - mem_free_callback(m); ++ */ ++#ifndef LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT ++#define LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT 0 ++#endif + + /* + ------------------------------------------------ +@@ -815,6 +836,39 @@ + #define LWIP_NETIF_HWADDRHINT 0 + #endif + ++/** ++ * LWIP_NETIF_LOOPBACK==1: Support sending packets with a destination IP ++ * address equal to the netif IP address, looping them back up the stack. ++ */ ++#ifndef LWIP_NETIF_LOOPBACK ++#define LWIP_NETIF_LOOPBACK 0 ++#endif ++ ++/** ++ * LWIP_LOOPBACK_MAX_PBUFS: Maximum number of pbufs on queue for loopback ++ * sending for each netif (0 = disabled) ++ */ ++#ifndef LWIP_LOOPBACK_MAX_PBUFS ++#define LWIP_LOOPBACK_MAX_PBUFS 0 ++#endif ++ ++/** ++ * LWIP_NETIF_LOOPBACK_MULTITHREADING: Indicates whether threading is enabled in ++ * the system, as netifs must change how they behave depending on this setting ++ * for the LWIP_NETIF_LOOPBACK option to work. ++ * Setting this is needed to avoid reentering non-reentrant functions like ++ * tcp_input(). ++ * LWIP_NETIF_LOOPBACK_MULTITHREADING==1: Indicates that the user is using a ++ * multithreaded environment like tcpip.c. In this case, netif->input() ++ * is called directly. ++ * LWIP_NETIF_LOOPBACK_MULTITHREADING==0: Indicates a polling (or NO_SYS) setup. ++ * The packets are put on a list and netif_poll() must be called in ++ * the main application loop. ++ */ ++#ifndef LWIP_NETIF_LOOPBACK_MULTITHREADING ++#define LWIP_NETIF_LOOPBACK_MULTITHREADING (!NO_SYS) ++#endif ++ + /* + ------------------------------------ + ---------- LOOPIF options ---------- +@@ -827,20 +881,16 @@ + #define LWIP_HAVE_LOOPIF 0 + #endif + ++/* ++ ------------------------------------ ++ ---------- SLIPIF options ---------- ++ ------------------------------------ ++*/ + /** +- * LWIP_LOOPIF_MULTITHREADING: Indicates whether threading is enabled in +- * the system, as LOOPIF must change how it behaves depending on this setting. +- * Setting this is needed to avoid reentering non-reentrant functions like +- * tcp_input(). +- * LWIP_LOOPIF_MULTITHREADING==1: Indicates that the user is using a +- * multithreaded environment like tcpip.c. In this case, netif->input() +- * is called directly. +- * LWIP_LOOPIF_MULTITHREADING==0: Indicates a polling (or NO_SYS) setup. +- * The packets are put on a list and loopif_poll() must be called in +- * the main application loop. ++ * LWIP_HAVE_SLIPIF==1: Support slip interface and slipif.c + */ +-#ifndef LWIP_LOOPIF_MULTITHREADING +-#define LWIP_LOOPIF_MULTITHREADING 1 ++#ifndef LWIP_HAVE_SLIPIF ++#define LWIP_HAVE_SLIPIF 0 + #endif + + /* +Index: src/include/lwip/sio.h +=================================================================== +RCS file: /sources/lwip/lwip/src/include/lwip/sio.h,v +retrieving revision 1.7 +retrieving revision 1.8 +diff -u -p -r1.7 -r1.8 +--- src/include/lwip/sio.h 6 Sep 2007 16:43:44 -0000 1.7 ++++ src/include/lwip/sio.h 27 Mar 2008 18:06:02 -0000 1.8 +@@ -32,16 +32,24 @@ + * It needs to be implemented by those platforms which need SLIP or PPP + */ + ++#ifndef __SIO_H__ ++#define __SIO_H__ ++ + #include "lwip/arch.h" + + #ifdef __cplusplus + extern "C" { + #endif + ++/* If you want to define sio_fd_t elsewhere or differently, ++ define this in your cc.h file. */ + #ifndef __sio_fd_t_defined + typedef void * sio_fd_t; + #endif + ++/* The following functions can be defined to something else in your cc.h file ++ or be implemented in your custom sio.c file. */ ++ + #ifndef sio_open + sio_fd_t sio_open(u8_t); + #endif +@@ -69,3 +77,5 @@ void sio_read_abort(sio_fd_t); + #ifdef __cplusplus + } + #endif ++ ++#endif /* __SIO_H__ */ +Index: src/include/lwip/sockets.h +=================================================================== +RCS file: /sources/lwip/lwip/src/include/lwip/sockets.h,v +retrieving revision 1.38 +retrieving revision 1.39 +diff -u -p -r1.38 -r1.39 +--- src/include/lwip/sockets.h 2 Dec 2007 15:24:02 -0000 1.38 ++++ src/include/lwip/sockets.h 26 Apr 2008 10:46:23 -0000 1.39 +@@ -177,7 +177,22 @@ typedef struct ip_mreq { + } ip_mreq; + #endif /* LWIP_IGMP */ + +-/* Unimplemented for now... */ ++/* ++ * The Type of Service provides an indication of the abstract ++ * parameters of the quality of service desired. These parameters are ++ * to be used to guide the selection of the actual service parameters ++ * when transmitting a datagram through a particular network. Several ++ * networks offer service precedence, which somehow treats high ++ * precedence traffic as more important than other traffic (generally ++ * by accepting only traffic above a certain precedence at time of high ++ * load). The major choice is a three way tradeoff between low-delay, ++ * high-reliability, and high-throughput. ++ * The use of the Delay, Throughput, and Reliability indications may ++ * increase the cost (in some sense) of the service. In many networks ++ * better performance for one of these parameters is coupled with worse ++ * performance on another. Except for very unusual cases at most two ++ * of these three indications should be set. ++ */ + #define IPTOS_TOS_MASK 0x1E + #define IPTOS_TOS(tos) ((tos) & IPTOS_TOS_MASK) + #define IPTOS_LOWDELAY 0x10 +@@ -187,7 +202,13 @@ typedef struct ip_mreq { + #define IPTOS_MINCOST IPTOS_LOWCOST + + /* +- * Definitions for IP precedence (also in ip_tos) (Unimplemented) ++ * The Network Control precedence designation is intended to be used ++ * within a network only. The actual use and control of that ++ * designation is up to each network. The Internetwork Control ++ * designation is intended for use by gateway control originators only. ++ * If the actual use of these precedence designations is of concern to ++ * a particular network, it is the responsibility of that network to ++ * control the access to, and use of, those precedence designations. + */ + #define IPTOS_PREC_MASK 0xe0 + #define IPTOS_PREC(tos) ((tos) & IPTOS_PREC_MASK) +Index: src/include/lwip/stats.h +=================================================================== +RCS file: /sources/lwip/lwip/src/include/lwip/stats.h,v +retrieving revision 1.19 +retrieving revision 1.23 +diff -u -p -r1.19 -r1.23 +--- src/include/lwip/stats.h 28 Nov 2007 21:25:07 -0000 1.19 ++++ src/include/lwip/stats.h 8 Jul 2008 09:15:57 -0000 1.23 +@@ -57,7 +57,6 @@ extern "C" { + + struct stats_proto { + STAT_COUNTER xmit; /* Transmitted packets. */ +- STAT_COUNTER rexmit; /* Retransmitted packets. */ + STAT_COUNTER recv; /* Received packets. */ + STAT_COUNTER fw; /* Forwarded packets. */ + STAT_COUNTER drop; /* Dropped packets. */ +@@ -87,7 +86,8 @@ struct stats_mem { + mem_size_t avail; + mem_size_t used; + mem_size_t max; +- mem_size_t err; ++ STAT_COUNTER err; ++ STAT_COUNTER illegal; + }; + + struct stats_syselem { +@@ -142,64 +142,138 @@ extern struct stats_ lwip_stats; + #define stats_init() /* Compatibility define, not init needed. */ + + #define STATS_INC(x) ++lwip_stats.x ++#define STATS_DEC(x) --lwip_stats.x + #else + #define stats_init() + #define STATS_INC(x) ++#define STATS_DEC(x) + #endif /* LWIP_STATS */ + + #if TCP_STATS + #define TCP_STATS_INC(x) STATS_INC(x) ++#define TCP_STATS_DISPLAY() stats_display_proto(&lwip_stats.tcp, "TCP") + #else + #define TCP_STATS_INC(x) ++#define TCP_STATS_DISPLAY() + #endif + + #if UDP_STATS + #define UDP_STATS_INC(x) STATS_INC(x) ++#define UDP_STATS_DISPLAY() stats_display_proto(&lwip_stats.udp, "UDP") + #else + #define UDP_STATS_INC(x) ++#define UDP_STATS_DISPLAY() + #endif + + #if ICMP_STATS + #define ICMP_STATS_INC(x) STATS_INC(x) ++#define ICMP_STATS_DISPLAY() stats_display_proto(&lwip_stats.icmp, "ICMP") + #else + #define ICMP_STATS_INC(x) ++#define ICMP_STATS_DISPLAY() + #endif + + #if IGMP_STATS + #define IGMP_STATS_INC(x) STATS_INC(x) ++#define IGMP_STATS_DISPLAY() stats_display_igmp(&lwip_stats.igmp) + #else + #define IGMP_STATS_INC(x) ++#define IGMP_STATS_DISPLAY() + #endif + + #if IP_STATS + #define IP_STATS_INC(x) STATS_INC(x) ++#define IP_STATS_DISPLAY() stats_display_proto(&lwip_stats.ip, "IP") + #else + #define IP_STATS_INC(x) ++#define IP_STATS_DISPLAY() + #endif + + #if IPFRAG_STATS + #define IPFRAG_STATS_INC(x) STATS_INC(x) ++#define IPFRAG_STATS_DISPLAY() stats_display_proto(&lwip_stats.ip_frag, "IP_FRAG") + #else + #define IPFRAG_STATS_INC(x) ++#define IPFRAG_STATS_DISPLAY() + #endif + + #if ETHARP_STATS + #define ETHARP_STATS_INC(x) STATS_INC(x) ++#define ETHARP_STATS_DISPLAY() stats_display_proto(&lwip_stats.etharp, "ETHARP") + #else + #define ETHARP_STATS_INC(x) ++#define ETHARP_STATS_DISPLAY() + #endif + + #if LINK_STATS + #define LINK_STATS_INC(x) STATS_INC(x) ++#define LINK_STATS_DISPLAY() stats_display_proto(&lwip_stats.link, "LINK") + #else + #define LINK_STATS_INC(x) ++#define LINK_STATS_DISPLAY() ++#endif ++ ++#if MEM_STATS ++#define MEM_STATS_AVAIL(x, y) lwip_stats.mem.x = y ++#define MEM_STATS_INC(x) STATS_INC(mem.x) ++#define MEM_STATS_INC_USED(x, y) do { lwip_stats.mem.used += y; \ ++ if (lwip_stats.mem.max < lwip_stats.mem.used) { \ ++ lwip_stats.mem.max = lwip_stats.mem.used; \ ++ } \ ++ } while(0) ++#define MEM_STATS_DEC_USED(x, y) lwip_stats.mem.x -= y ++#define MEM_STATS_DISPLAY() stats_display_mem(&lwip_stats.mem, "HEAP") ++#else ++#define MEM_STATS_AVAIL(x, y) ++#define MEM_STATS_INC(x) ++#define MEM_STATS_INC_USED(x, y) ++#define MEM_STATS_DEC_USED(x, y) ++#define MEM_STATS_DISPLAY() ++#endif ++ ++#if MEMP_STATS ++#define MEMP_STATS_AVAIL(x, i, y) lwip_stats.memp[i].x = y ++#define MEMP_STATS_INC(x, i) STATS_INC(memp[i].x) ++#define MEMP_STATS_DEC(x, i) STATS_DEC(memp[i].x) ++#define MEMP_STATS_INC_USED(x, i) do { ++lwip_stats.memp[i].used; \ ++ if (lwip_stats.memp[i].max < lwip_stats.memp[i].used) { \ ++ lwip_stats.memp[i].max = lwip_stats.memp[i].used; \ ++ } \ ++ } while(0) ++#define MEMP_STATS_DISPLAY(i) stats_display_memp(&lwip_stats.memp[i], i) ++#else ++#define MEMP_STATS_AVAIL(x, i, y) ++#define MEMP_STATS_INC(x, i) ++#define MEMP_STATS_DEC(x, i) ++#define MEMP_STATS_INC_USED(x, i) ++#define MEMP_STATS_DISPLAY(i) ++#endif ++ ++#if SYS_STATS ++#define SYS_STATS_INC(x) STATS_INC(sys.x) ++#define SYS_STATS_DEC(x) STATS_DEC(sys.x) ++#define SYS_STATS_DISPLAY() stats_display_sys(&lwip_stats.sys) ++#else ++#define SYS_STATS_INC(x) ++#define SYS_STATS_DEC(x) ++#define SYS_STATS_DISPLAY() + #endif + + /* Display of statistics */ + #if LWIP_STATS_DISPLAY + void stats_display(void); ++void stats_display_proto(struct stats_proto *proto, char *name); ++void stats_display_igmp(struct stats_igmp *igmp); ++void stats_display_mem(struct stats_mem *mem, char *name); ++void stats_display_memp(struct stats_mem *mem, int index); ++void stats_display_sys(struct stats_sys *sys); + #else + #define stats_display() ++#define stats_display_proto(proto, name) ++#define stats_display_igmp(igmp) ++#define stats_display_mem(mem, name) ++#define stats_display_memp(mem, index) ++#define stats_display_sys(sys) + #endif /* LWIP_STATS_DISPLAY */ + + #ifdef __cplusplus +Index: src/include/lwip/tcpip.h +=================================================================== +RCS file: /sources/lwip/lwip/src/include/lwip/tcpip.h,v +retrieving revision 1.24 +retrieving revision 1.27 +diff -u -p -r1.24 -r1.27 +--- src/include/lwip/tcpip.h 12 Jan 2008 11:52:22 -0000 1.24 ++++ src/include/lwip/tcpip.h 27 Jun 2008 20:34:55 -0000 1.27 +@@ -83,7 +83,11 @@ err_t tcpip_netifapi_lock(struct netifap + #endif /* LWIP_NETIF_API */ + + err_t tcpip_callback_with_block(void (*f)(void *ctx), void *ctx, u8_t block); +-#define tcpip_callback(f,ctx) tcpip_callback_with_block(f,ctx,1) ++#define tcpip_callback(f, ctx) tcpip_callback_with_block(f, ctx, 1) ++ ++/* free pbufs or heap memory from another context without blocking */ ++err_t pbuf_free_callback(struct pbuf *p); ++err_t mem_free_callback(void *m); + + err_t tcpip_timeout(u32_t msecs, sys_timeout_handler h, void *arg); + #define tcpip_untimeout(h, arg) tcpip_timeout(0xffffffff, h, arg) +Index: src/include/netif/loopif.h +=================================================================== +RCS file: /sources/lwip/lwip/src/include/netif/loopif.h,v +retrieving revision 1.7 +retrieving revision 1.9 +diff -u -p -r1.7 -r1.9 +--- src/include/netif/loopif.h 10 May 2007 10:59:20 -0000 1.7 ++++ src/include/netif/loopif.h 17 Jun 2008 20:12:22 -0000 1.9 +@@ -32,6 +32,7 @@ + #ifndef __NETIF_LOOPIF_H__ + #define __NETIF_LOOPIF_H__ + ++#include "lwip/opt.h" + #include "lwip/netif.h" + #include "lwip/err.h" + +@@ -39,9 +40,9 @@ + extern "C" { + #endif + +-#if !LWIP_LOOPIF_MULTITHREADING +-void loopif_poll(struct netif *netif); +-#endif ++#if !LWIP_NETIF_LOOPBACK_MULTITHREADING ++#define loopif_poll netif_poll ++#endif /* !LWIP_NETIF_LOOPBACK_MULTITHREADING */ + + err_t loopif_init(struct netif *netif); + +Index: src/netif/etharp.c +=================================================================== +RCS file: /sources/lwip/lwip/src/netif/etharp.c,v +retrieving revision 1.145 +retrieving revision 1.148 +diff -u -p -r1.145 -r1.148 +--- src/netif/etharp.c 4 Mar 2008 13:41:24 -0000 1.145 ++++ src/netif/etharp.c 19 Jun 2008 16:40:59 -0000 1.148 +@@ -353,7 +353,7 @@ find_entry(struct ip_addr *ipaddr, u8_t + * 1) empty entry + * 2) oldest stable entry + * 3) oldest pending entry without queued packets +- * 4) oldest pending entry without queued packets ++ * 4) oldest pending entry with queued packets + * + * { ETHARP_TRY_HARD is set at this point } + */ +@@ -1130,7 +1130,14 @@ ethernet_input(struct pbuf *p, struct ne + + /* points to packet payload, which starts with an Ethernet header */ + ethhdr = p->payload; +- ++ LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ++ ("ethernet_input: dest:%02x:%02x:%02x:%02x:%02x:%02x, src:%02x:%02x:%02x:%02x:%02x:%02x, type:%2hx\n", ++ (unsigned)ethhdr->dest.addr[0], (unsigned)ethhdr->dest.addr[1], (unsigned)ethhdr->dest.addr[2], ++ (unsigned)ethhdr->dest.addr[3], (unsigned)ethhdr->dest.addr[4], (unsigned)ethhdr->dest.addr[5], ++ (unsigned)ethhdr->src.addr[0], (unsigned)ethhdr->src.addr[1], (unsigned)ethhdr->src.addr[2], ++ (unsigned)ethhdr->src.addr[3], (unsigned)ethhdr->src.addr[4], (unsigned)ethhdr->src.addr[5], ++ (unsigned)htons(ethhdr->type))); ++ + switch (htons(ethhdr->type)) { + /* IP packet? */ + case ETHTYPE_IP: +@@ -1165,6 +1172,8 @@ ethernet_input(struct pbuf *p, struct ne + #endif /* PPPOE_SUPPORT */ + + default: ++ ETHARP_STATS_INC(etharp.proterr); ++ ETHARP_STATS_INC(etharp.drop); + pbuf_free(p); + p = NULL; + break; +Index: src/netif/loopif.c +=================================================================== +RCS file: /sources/lwip/lwip/src/netif/loopif.c,v +retrieving revision 1.26 +retrieving revision 1.27 +diff -u -p -r1.26 -r1.27 +--- src/netif/loopif.c 31 Aug 2007 10:14:09 -0000 1.26 ++++ src/netif/loopif.c 12 Jun 2008 20:10:10 -0000 1.27 +@@ -40,149 +40,8 @@ + #if LWIP_HAVE_LOOPIF + + #include "netif/loopif.h" +-#include "lwip/pbuf.h" + #include "lwip/snmp.h" + +-#include <string.h> +- +-#if !LWIP_LOOPIF_MULTITHREADING +- +-#include "lwip/sys.h" +-#include "lwip/mem.h" +- +-/* helper struct for the linked list of pbufs */ +-struct loopif_private { +- struct pbuf *first; +- struct pbuf *last; +-}; +- +-/** +- * Call loopif_poll() in the main loop of your application. This is to prevent +- * reentering non-reentrant functions like tcp_input(). Packets passed to +- * loopif_output() are put on a list that is passed to netif->input() by +- * loopif_poll(). +- * +- * @param netif the lwip network interface structure for this loopif +- */ +-void +-loopif_poll(struct netif *netif) +-{ +- SYS_ARCH_DECL_PROTECT(lev); +- struct pbuf *in, *in_end; +- struct loopif_private *priv = (struct loopif_private*)netif->state; +- +- LWIP_ERROR("priv != NULL", (priv != NULL), return;); +- +- do { +- /* Get a packet from the list. With SYS_LIGHTWEIGHT_PROT=1, this is protected */ +- SYS_ARCH_PROTECT(lev); +- in = priv->first; +- if(in) { +- in_end = in; +- while(in_end->len != in_end->tot_len) { +- LWIP_ASSERT("bogus pbuf: len != tot_len but next == NULL!", in_end->next != NULL); +- in_end = in_end->next; +- } +- /* 'in_end' now points to the last pbuf from 'in' */ +- if(in_end == priv->last) { +- /* this was the last pbuf in the list */ +- priv->first = priv->last = NULL; +- } else { +- /* pop the pbuf off the list */ +- priv->first = in_end->next; +- LWIP_ASSERT("should not be null since first != last!", priv->first != NULL); +- } +- } +- SYS_ARCH_UNPROTECT(lev); +- +- if(in != NULL) { +- if(in_end->next != NULL) { +- /* De-queue the pbuf from its successors on the 'priv' list. */ +- in_end->next = NULL; +- } +- if(netif->input(in, netif) != ERR_OK) { +- pbuf_free(in); +- } +- /* Don't reference the packet any more! */ +- in = NULL; +- in_end = NULL; +- } +- /* go on while there is a packet on the list */ +- } while(priv->first != NULL); +-} +-#endif /* LWIP_LOOPIF_MULTITHREADING */ +- +-/** +- * Send an IP packet over the loopback interface. +- * The pbuf is simply copied and handed back to netif->input. +- * In multithreaded mode, this is done directly since netif->input must put +- * the packet on a queue. +- * In callback mode, the packet is put on an internal queue and is fed to +- * netif->input by loopif_poll(). +- * +- * @param netif the lwip network interface structure for this loopif +- * @param p the (IP) packet to 'send' +- * @param ipaddr the ip address to send the packet to (not used for loopif) +- * @return ERR_OK if the packet has been sent +- * ERR_MEM if the pbuf used to copy the packet couldn't be allocated +- */ +-static err_t +-loopif_output(struct netif *netif, struct pbuf *p, +- struct ip_addr *ipaddr) +-{ +-#if !LWIP_LOOPIF_MULTITHREADING +- SYS_ARCH_DECL_PROTECT(lev); +- struct loopif_private *priv; +- struct pbuf *last; +-#endif /* LWIP_LOOPIF_MULTITHREADING */ +- struct pbuf *r; +- err_t err; +- +- LWIP_UNUSED_ARG(ipaddr); +- +- /* Allocate a new pbuf */ +- r = pbuf_alloc(PBUF_RAW, p->tot_len, PBUF_RAM); +- if (r == NULL) { +- return ERR_MEM; +- } +- +- /* Copy the whole pbuf queue p into the single pbuf r */ +- if ((err = pbuf_copy(r, p)) != ERR_OK) { +- pbuf_free(r); +- r = NULL; +- return err; +- } +- +-#if LWIP_LOOPIF_MULTITHREADING +- /* Multithreading environment, netif->input() is supposed to put the packet +- into a mailbox, so we can safely call it here without risking to re-enter +- functions that are not reentrant (TCP!!!) */ +- if(netif->input(r, netif) != ERR_OK) { +- pbuf_free(r); +- r = NULL; +- } +-#else /* LWIP_LOOPIF_MULTITHREADING */ +- /* Raw API without threads: put the packet on a linked list which gets emptied +- through calling loopif_poll(). */ +- priv = (struct loopif_private*)netif->state; +- +- /* let last point to the last pbuf in chain r */ +- for (last = r; last->next != NULL; last = last->next); +- SYS_ARCH_PROTECT(lev); +- if(priv->first != NULL) { +- LWIP_ASSERT("if first != NULL, last must also be != NULL", priv->last != NULL); +- priv->last->next = r; +- priv->last = last; +- } else { +- priv->first = r; +- priv->last = last; +- } +- SYS_ARCH_UNPROTECT(lev); +-#endif /* LWIP_LOOPIF_MULTITHREADING */ +- +- return ERR_OK; +-} +- + /** + * Initialize a lwip network interface structure for a loopback interface + * +@@ -193,16 +52,6 @@ loopif_output(struct netif *netif, struc + err_t + loopif_init(struct netif *netif) + { +-#if !LWIP_LOOPIF_MULTITHREADING +- struct loopif_private *priv; +- +- priv = (struct loopif_private*)mem_malloc(sizeof(struct loopif_private)); +- if(priv == NULL) +- return ERR_MEM; +- priv->first = priv->last = NULL; +- netif->state = priv; +-#endif /* LWIP_LOOPIF_MULTITHREADING */ +- + /* initialize the snmp variables and counters inside the struct netif + * ifSpeed: no assumption can be made! + */ +@@ -210,7 +59,7 @@ loopif_init(struct netif *netif) + + netif->name[0] = 'l'; + netif->name[1] = 'o'; +- netif->output = loopif_output; ++ netif->output = netif_loop_output; + return ERR_OK; + } + +Index: src/netif/slipif.c +=================================================================== +RCS file: /sources/lwip/lwip/src/netif/slipif.c,v +retrieving revision 1.29 +retrieving revision 1.30 +diff -u -p -r1.29 -r1.30 +--- src/netif/slipif.c 30 Nov 2007 17:22:21 -0000 1.29 ++++ src/netif/slipif.c 17 Jun 2008 20:14:05 -0000 1.30 +@@ -44,6 +44,9 @@ + + #include "netif/slipif.h" + #include "lwip/opt.h" ++ ++#if LWIP_HAVE_SLIPIF ++ + #include "lwip/def.h" + #include "lwip/pbuf.h" + #include "lwip/sys.h" +@@ -273,3 +276,4 @@ slipif_init(struct netif *netif) + sys_thread_new(SLIPIF_THREAD_NAME, slipif_loop, netif, SLIPIF_THREAD_STACKSIZE, SLIPIF_THREAD_PRIO); + return ERR_OK; + } ++#endif /* LWIP_HAVE_SLIPIF */ diff -r eb0fc71cfc72 -r 400e5d4877ca stubdom/newlib.patch --- a/stubdom/newlib.patch Tue Jul 08 11:41:43 2008 +0900 +++ b/stubdom/newlib.patch Fri Jul 18 12:12:41 2008 +0900 @@ -201,3 +201,429 @@ diff -u -p -r1.1 memcpy.S ret +--- newlib/libc/machine/x86_64/x86_64mach.h.orig 2008-07-11 14:57:23.062269000 +0100 ++++ newlib/libc/machine/x86_64/x86_64mach.h 2008-07-11 14:58:01.262503000 +0100 +@@ -22,81 +22,81 @@ + + #define REG(x) CONCAT1(__REG_PREFIX__, x) + +-#define rax REG(rax) +-#define rbx REG(rbx) +-#define rcx REG(rcx) +-#define rdx REG(rdx) +-#define rsi REG(rsi) +-#define rdi REG(rdi) +-#define rbp REG(rbp) +-#define rsp REG(rsp) +- +-#define r8 REG(r8) +-#define r9 REG(r9) +-#define r10 REG(r10) +-#define r11 REG(r11) +-#define r12 REG(r12) +-#define r13 REG(r13) +-#define r14 REG(r14) +-#define r15 REG(r15) +- +-#define eax REG(eax) +-#define ebx REG(ebx) +-#define ecx REG(ecx) +-#define edx REG(edx) +-#define esi REG(esi) +-#define edi REG(edi) +-#define ebp REG(ebp) +-#define esp REG(esp) +- +-#define st0 REG(st) +-#define st1 REG(st(1)) +-#define st2 REG(st(2)) +-#define st3 REG(st(3)) +-#define st4 REG(st(4)) +-#define st5 REG(st(5)) +-#define st6 REG(st(6)) +-#define st7 REG(st(7)) +- +-#define ax REG(ax) +-#define bx REG(bx) +-#define cx REG(cx) +-#define dx REG(dx) +- +-#define ah REG(ah) +-#define bh REG(bh) +-#define ch REG(ch) +-#define dh REG(dh) +- +-#define al REG(al) +-#define bl REG(bl) +-#define cl REG(cl) +-#define dl REG(dl) +- +-#define sil REG(sil) +- +-#define mm1 REG(mm1) +-#define mm2 REG(mm2) +-#define mm3 REG(mm3) +-#define mm4 REG(mm4) +-#define mm5 REG(mm5) +-#define mm6 REG(mm6) +-#define mm7 REG(mm7) +- +-#define xmm0 REG(xmm0) +-#define xmm1 REG(xmm1) +-#define xmm2 REG(xmm2) +-#define xmm3 REG(xmm3) +-#define xmm4 REG(xmm4) +-#define xmm5 REG(xmm5) +-#define xmm6 REG(xmm6) +-#define xmm7 REG(xmm7) +- +-#define cr0 REG(cr0) +-#define cr1 REG(cr1) +-#define cr2 REG(cr2) +-#define cr3 REG(cr3) +-#define cr4 REG(cr4) ++#define rax %rax ++#define rbx %rbx ++#define rcx %rcx ++#define rdx %rdx ++#define rsi %rsi ++#define rdi %rdi ++#define rbp %rbp ++#define rsp %rsp ++ ++#define r8 %r8 ++#define r9 %r9 ++#define r10 %r10 ++#define r11 %r11 ++#define r12 %r12 ++#define r13 %r13 ++#define r14 %r14 ++#define r15 %r15 ++ ++#define eax %eax ++#define ebx %ebx ++#define ecx %ecx ++#define edx %edx ++#define esi %esi ++#define edi %edi ++#define ebp %ebp ++#define esp %esp ++ ++#define st0 %st ++#define st1 %st(1) ++#define st2 %st(2) ++#define st3 %st(3) ++#define st4 %st(4) ++#define st5 %st(5) ++#define st6 %st(6) ++#define st7 %st(7) ++ ++#define ax %ax ++#define bx %bx ++#define cx %cx ++#define dx %dx ++ ++#define ah %ah ++#define bh %bh ++#define ch %ch ++#define dh %dh ++ ++#define al %al ++#define bl %bl ++#define cl %cl ++#define dl %dl ++ ++#define sil %sil ++ ++#define mm1 %mm1 ++#define mm2 %mm2 ++#define mm3 %mm3 ++#define mm4 %mm4 ++#define mm5 %mm5 ++#define mm6 %mm6 ++#define mm7 %mm7 ++ ++#define xmm0 %xmm0 ++#define xmm1 %xmm1 ++#define xmm2 %xmm2 ++#define xmm3 %xmm3 ++#define xmm4 %xmm4 ++#define xmm5 %xmm5 ++#define xmm6 %xmm6 ++#define xmm7 %xmm7 ++ ++#define cr0 %cr0 ++#define cr1 %cr1 ++#define cr2 %cr2 ++#define cr3 %cr3 ++#define cr4 %cr4 + + #ifdef _I386MACH_NEED_SOTYPE_FUNCTION + #define SOTYPE_FUNCTION(sym) .type SYM(sym),@function +--- newlib/libc/machine/x86_64/memcpy.S.orig 2008-07-11 15:12:27.494693000 +0100 ++++ newlib/libc/machine/x86_64/memcpy.S 2008-07-11 15:12:29.448706000 +0100 +@@ -60,14 +60,14 @@ + movq 48 (rsi), r13 + movq 56 (rsi), r14 + +- movntiq rax, (rdi) +- movntiq r8 , 8 (rdi) +- movntiq r9 , 16 (rdi) +- movntiq r10, 24 (rdi) +- movntiq r11, 32 (rdi) +- movntiq r12, 40 (rdi) +- movntiq r13, 48 (rdi) +- movntiq r14, 56 (rdi) ++ movnti rax, (rdi) ++ movnti r8 , 8 (rdi) ++ movnti r9 , 16 (rdi) ++ movnti r10, 24 (rdi) ++ movnti r11, 32 (rdi) ++ movnti r12, 40 (rdi) ++ movnti r13, 48 (rdi) ++ movnti r14, 56 (rdi) + + movq 64 (rsi), rax + movq 72 (rsi), r8 +@@ -78,14 +78,14 @@ + movq 112 (rsi), r13 + movq 120 (rsi), r14 + +- movntiq rax, 64 (rdi) +- movntiq r8 , 72 (rdi) +- movntiq r9 , 80 (rdi) +- movntiq r10, 88 (rdi) +- movntiq r11, 96 (rdi) +- movntiq r12, 104 (rdi) +- movntiq r13, 112 (rdi) +- movntiq r14, 120 (rdi) ++ movnti rax, 64 (rdi) ++ movnti r8 , 72 (rdi) ++ movnti r9 , 80 (rdi) ++ movnti r10, 88 (rdi) ++ movnti r11, 96 (rdi) ++ movnti r12, 104 (rdi) ++ movnti r13, 112 (rdi) ++ movnti r14, 120 (rdi) + + leaq 128 (rsi), rsi + leaq 128 (rdi), rdi +--- newlib/libc/machine/i386/i386mach.h 2000-08-28 18:50:06.000000000 +0100 ++++ newlib/libc/machine/i386/i386mach.h 2008-07-11 15:17:13.874409000 +0100 +@@ -27,46 +27,46 @@ + + #define REG(x) CONCAT1(__REG_PREFIX__, x) + +-#define eax REG(eax) +-#define ebx REG(ebx) +-#define ecx REG(ecx) +-#define edx REG(edx) +-#define esi REG(esi) +-#define edi REG(edi) +-#define ebp REG(ebp) +-#define esp REG(esp) +- +-#define st0 REG(st) +-#define st1 REG(st(1)) +-#define st2 REG(st(2)) +-#define st3 REG(st(3)) +-#define st4 REG(st(4)) +-#define st5 REG(st(5)) +-#define st6 REG(st(6)) +-#define st7 REG(st(7)) +- +-#define ax REG(ax) +-#define bx REG(bx) +-#define cx REG(cx) +-#define dx REG(dx) +- +-#define ah REG(ah) +-#define bh REG(bh) +-#define ch REG(ch) +-#define dh REG(dh) +- +-#define al REG(al) +-#define bl REG(bl) +-#define cl REG(cl) +-#define dl REG(dl) +- +-#define mm1 REG(mm1) +-#define mm2 REG(mm2) +-#define mm3 REG(mm3) +-#define mm4 REG(mm4) +-#define mm5 REG(mm5) +-#define mm6 REG(mm6) +-#define mm7 REG(mm7) ++#define eax %eax ++#define ebx %ebx ++#define ecx %ecx ++#define edx %edx ++#define esi %esi ++#define edi %edi ++#define ebp %ebp ++#define esp %esp ++ ++#define st0 %st ++#define st1 %st(1) ++#define st2 %st(2) ++#define st3 %st(3) ++#define st4 %st(4) ++#define st5 %st(5) ++#define st6 %st(6) ++#define st7 %st(7) ++ ++#define ax %ax ++#define bx %bx ++#define cx %cx ++#define dx %dx ++ ++#define ah %ah ++#define bh %bh ++#define ch %ch ++#define dh %dh ++ ++#define al %al ++#define bl %bl ++#define cl %cl ++#define dl %dl ++ ++#define mm1 %mm1 ++#define mm2 %mm2 ++#define mm3 %mm3 ++#define mm4 %mm4 ++#define mm5 %mm5 ++#define mm6 %mm6 ++#define mm7 %mm7 + + #ifdef _I386MACH_NEED_SOTYPE_FUNCTION + #define SOTYPE_FUNCTION(sym) .type SYM(sym),@function +--- newlib/libc/machine/x86_64/memset.S 2007-08-28 22:56:49.000000000 +0100 ++++ newlib/libc/machine/x86_64/memset.S 2008-07-11 15:16:59.098320000 +0100 +@@ -40,22 +40,22 @@ + + .p2align 4 + loop: +- movntiq rax, (rdi) +- movntiq rax, 8 (rdi) +- movntiq rax, 16 (rdi) +- movntiq rax, 24 (rdi) +- movntiq rax, 32 (rdi) +- movntiq rax, 40 (rdi) +- movntiq rax, 48 (rdi) +- movntiq rax, 56 (rdi) +- movntiq rax, 64 (rdi) +- movntiq rax, 72 (rdi) +- movntiq rax, 80 (rdi) +- movntiq rax, 88 (rdi) +- movntiq rax, 96 (rdi) +- movntiq rax, 104 (rdi) +- movntiq rax, 112 (rdi) +- movntiq rax, 120 (rdi) ++ movnti rax, (rdi) ++ movnti rax, 8 (rdi) ++ movnti rax, 16 (rdi) ++ movnti rax, 24 (rdi) ++ movnti rax, 32 (rdi) ++ movnti rax, 40 (rdi) ++ movnti rax, 48 (rdi) ++ movnti rax, 56 (rdi) ++ movnti rax, 64 (rdi) ++ movnti rax, 72 (rdi) ++ movnti rax, 80 (rdi) ++ movnti rax, 88 (rdi) ++ movnti rax, 96 (rdi) ++ movnti rax, 104 (rdi) ++ movnti rax, 112 (rdi) ++ movnti rax, 120 (rdi) + + leaq 128 (rdi), rdi + +--- newlib/libm/machine/i386/i386mach.h.orig 2008-07-11 15:30:37.367227000 +0100 ++++ newlib/libm/machine/i386/i386mach.h 2008-07-11 15:30:55.232337000 +0100 +@@ -27,46 +27,46 @@ + + #define REG(x) CONCAT1(__REG_PREFIX__, x) + +-#define eax REG(eax) +-#define ebx REG(ebx) +-#define ecx REG(ecx) +-#define edx REG(edx) +-#define esi REG(esi) +-#define edi REG(edi) +-#define ebp REG(ebp) +-#define esp REG(esp) +- +-#define st0 REG(st) +-#define st1 REG(st(1)) +-#define st2 REG(st(2)) +-#define st3 REG(st(3)) +-#define st4 REG(st(4)) +-#define st5 REG(st(5)) +-#define st6 REG(st(6)) +-#define st7 REG(st(7)) +- +-#define ax REG(ax) +-#define bx REG(bx) +-#define cx REG(cx) +-#define dx REG(dx) +- +-#define ah REG(ah) +-#define bh REG(bh) +-#define ch REG(ch) +-#define dh REG(dh) +- +-#define al REG(al) +-#define bl REG(bl) +-#define cl REG(cl) +-#define dl REG(dl) +- +-#define mm1 REG(mm1) +-#define mm2 REG(mm2) +-#define mm3 REG(mm3) +-#define mm4 REG(mm4) +-#define mm5 REG(mm5) +-#define mm6 REG(mm6) +-#define mm7 REG(mm7) ++#define eax %eax ++#define ebx %ebx ++#define ecx %ecx ++#define edx %edx ++#define esi %esi ++#define edi %edi ++#define ebp %ebp ++#define esp %esp ++ ++#define st0 %st ++#define st1 %st(1) ++#define st2 %st(2) ++#define st3 %st(3) ++#define st4 %st(4) ++#define st5 %st(5) ++#define st6 %st(6) ++#define st7 %st(7) ++ ++#define ax %ax ++#define bx %bx ++#define cx %cx ++#define dx %dx ++ ++#define ah %ah ++#define bh %bh ++#define ch %ch ++#define dh %dh ++ ++#define al %al ++#define bl %bl ++#define cl %cl ++#define dl %dl ++ ++#define mm1 %mm1 ++#define mm2 %mm2 ++#define mm3 %mm3 ++#define mm4 %mm4 ++#define mm5 %mm5 ++#define mm6 %mm6 ++#define mm7 %mm7 + + #ifdef _I386MACH_NEED_SOTYPE_FUNCTION + #define SOTYPE_FUNCTION(sym) .type SYM(sym),@function diff -r eb0fc71cfc72 -r 400e5d4877ca stubdom/pciutils.patch --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/stubdom/pciutils.patch Fri Jul 18 12:12:41 2008 +0900 @@ -0,0 +1,299 @@ +diff -urN pciutils-2.2.9.orig/lib/access.c pciutils-2.2.9/lib/access.c +--- pciutils-2.2.9.orig/lib/access.c 2007-02-06 11:59:43.000000000 +0000 ++++ pciutils-2.2.9/lib/access.c 2008-06-30 19:07:09.713187000 +0100 +@@ -57,6 +57,11 @@ + #else + NULL, + #endif ++#ifdef PCI_OS_MINIOS ++ &pm_minios, ++#else ++ NULL, ++#endif + }; + + struct pci_access * +--- pciutils-2.2.9.orig/lib/pci.h 2006-09-09 13:46:06.000000000 +0100 ++++ pciutils-2.2.9/lib/pci.h 2008-06-30 18:56:15.350111000 +0100 +@@ -33,6 +33,7 @@ + PCI_ACCESS_NBSD_LIBPCI, /* NetBSD libpci */ + PCI_ACCESS_OBSD_DEVICE, /* OpenBSD /dev/pci */ + PCI_ACCESS_DUMP, /* Dump file (params: filename) */ ++ PCI_ACCESS_MINIOS, /* MiniOS */ + PCI_ACCESS_MAX + }; + +@@ -63,6 +64,7 @@ + int fd_rw; /* proc: fd opened read-write */ + struct pci_dev *cached_dev; /* proc: device the fd is for */ + int fd_pos; /* proc: current position */ ++ void *minios; + }; + + /* Initialize PCI access */ +--- pciutils-2.2.9.orig/lib/internal.h 2006-09-09 11:52:47.000000000 +0100 ++++ pciutils-2.2.9/lib/internal.h 2008-07-01 10:46:24.968202000 +0100 +@@ -37,4 +37,4 @@ + + extern struct pci_methods pm_intel_conf1, pm_intel_conf2, pm_linux_proc, + pm_fbsd_device, pm_aix_device, pm_nbsd_libpci, pm_obsd_device, +- pm_dump, pm_linux_sysfs; ++ pm_dump, pm_linux_sysfs, pm_minios; +--- pciutils-2.2.9.orig/lib/Makefile 2007-10-19 13:41:34.000000000 +0100 ++++ pciutils-2.2.9/lib/Makefile 2008-07-01 12:13:14.400525000 +0100 +@@ -46,6 +46,12 @@ + PCILIB=libpciutils.a + endif + ++ifdef PCI_OS_MINIOS ++XEN_ROOT=../../.. ++include $(XEN_ROOT)/Config.mk ++OBJS += minios.o ++endif ++ + all: $(PCILIB) $(PCILIBPC) + + $(PCILIB): $(OBJS) +--- pciutils-2.2.9.orig/lib/types.h 2007-09-03 09:44:15.000000000 +0100 ++++ pciutils-2.2.9/lib/types.h 2008-07-01 12:17:08.396156000 +0100 +@@ -17,9 +17,13 @@ + typedef DWORD u32; + #elif defined(PCI_HAVE_STDINT_H) + #include <stdint.h> ++#ifdef PCI_OS_MINIOS ++#include <types.h> ++#else + typedef uint8_t u8; + typedef uint16_t u16; + typedef uint32_t u32; ++#endif + #else + typedef u_int8_t u8; + typedef u_int16_t u16; +--- pciutils-2.2.9.orig/lib/minios.c 1970-01-01 01:00:00.000000000 +0100 ++++ pciutils-2.2.9/lib/minios.c 2008-07-01 12:31:40.554260000 +0100 +@@ -0,0 +1,113 @@ ++/* ++ * The PCI Library -- MiniOS PCI frontend access ++ * ++ * Samuel Thibault <samuel.thibault@xxxxxxxxxxxxx>, 2008 ++ * ++ * Can be freely distributed and used under the terms of the GNU GPL. ++ */ ++ ++#include <os.h> ++#include <pcifront.h> ++#include <xenbus.h> ++#include "internal.h" ++ ++static int ++minios_detect(struct pci_access *a) ++{ ++ return 1; ++} ++ ++static void ++minios_init(struct pci_access *a) ++{ ++ a->minios = init_pcifront(NULL); ++ if (!a->minios) ++ a->warning("minios_init open failed"); ++} ++ ++static void ++minios_cleanup(struct pci_access *a) ++{ ++ if (a->minios) ++ shutdown_pcifront(a->minios); ++} ++ ++static void ++minios_scan(struct pci_access *a) ++{ ++ if (!a->minios) ++ return; ++ ++ void func(unsigned int domain, unsigned int bus, unsigned int slot, unsigned int fun) ++ { ++ struct pci_dev *d = pci_alloc_dev(a); ++ ++ d->domain = domain; ++ d->bus = bus; ++ d->dev = slot; ++ d->func = fun; ++ ++ pci_link_dev(a, d); ++ } ++ ++ pcifront_scan(a->minios, func); ++} ++ ++static int ++minios_read(struct pci_dev *d, int pos, byte *buf, int len) ++{ ++ unsigned int val; ++ switch (len) { ++ case 1: ++ if (pcifront_conf_read(d->access->minios, d->domain, d->bus, d->dev, d->func, pos, len, &val)) ++ return 0; ++ * buf = val; ++ return 1; ++ case 2: ++ if (pcifront_conf_read(d->access->minios, d->domain, d->bus, d->dev, d->func, pos, len, &val)) ++ return 0; ++ *(u16 *) buf = cpu_to_le16((u16) val); ++ return 1; ++ case 4: ++ if (pcifront_conf_read(d->access->minios, d->domain, d->bus, d->dev, d->func, pos, len, &val)) ++ return 0; ++ *(u32 *) buf = cpu_to_le32((u32) val); ++ return 1; ++ default: ++ return pci_generic_block_read(d, pos, buf, len); ++ } ++} ++ ++static int ++minios_write(struct pci_dev *d, int pos, byte *buf, int len) ++{ ++ unsigned int val; ++ switch (len) { ++ case 1: ++ val = * buf; ++ break; ++ case 2: ++ val = le16_to_cpu(*(u16 *) buf); ++ break; ++ case 4: ++ val = le32_to_cpu(*(u32 *) buf); ++ break; ++ default: ++ return pci_generic_block_write(d, pos, buf, len); ++ } ++ return !pcifront_conf_write(d->access->minios, d->domain, d->bus, d->dev, d->func, pos, len, val); ++} ++ ++struct pci_methods pm_minios = { ++ "MiniOS-device", ++ NULL, /* config */ ++ minios_detect, ++ minios_init, ++ minios_cleanup, ++ minios_scan, ++ pci_generic_fill_info, ++ minios_read, ++ minios_write, ++ NULL, /* dev_init */ ++ NULL /* dev_cleanup */ ++}; +--- pciutils-2.2.9/lib/generic.c 2007-02-06 12:00:05.000000000 +0000 ++++ pciutils-2.2.9-mine/lib/generic.c 2008-07-01 19:13:52.289949000 +0100 +@@ -74,6 +74,19 @@ + pci_generic_scan_bus(a, busmap, 0); + } + ++static u32 pci_size(u32 base, u32 maxbase, u32 mask) ++{ ++ u32 size = mask & maxbase; ++ if (!size) ++ return 0; ++ size = (size & ~(size-1)) - 1; ++ ++ if (base == maxbase && ((base | size) & mask) != mask) ++ return 0; ++ ++ return size + 1; ++} ++ + int + pci_generic_fill_info(struct pci_dev *d, int flags) + { +@@ -114,23 +127,61 @@ + if (!x || x == (u32) ~0) + continue; + if ((x & PCI_BASE_ADDRESS_SPACE) == PCI_BASE_ADDRESS_SPACE_IO) +- d->base_addr[i] = x; +- else ++ { ++ d->base_addr[i] = x & PCI_BASE_ADDRESS_IO_MASK; ++ if (flags & PCI_FILL_SIZES) ++ { ++ u32 size; ++ pci_write_long(d, PCI_BASE_ADDRESS_0 + i*4, ~0); ++ d->size[i] = pci_size(x, pci_read_long(d, PCI_BASE_ADDRESS_0 + i*4), PCI_BASE_ADDRESS_IO_MASK); ++ pci_write_long(d, PCI_BASE_ADDRESS_0 + i*4, x); ++ } ++ } ++ else + { + if ((x & PCI_BASE_ADDRESS_MEM_TYPE_MASK) != PCI_BASE_ADDRESS_MEM_TYPE_64) +- d->base_addr[i] = x; ++ { ++ d->base_addr[i] = x & PCI_BASE_ADDRESS_MEM_MASK; ++ if (flags & PCI_FILL_SIZES) ++ { ++ u32 size; ++ pci_write_long(d, PCI_BASE_ADDRESS_0 + i*4, ~0); ++ d->size[i] = pci_read_long(d, PCI_BASE_ADDRESS_0 + i*4); ++ d->size[i] = pci_size(x, pci_read_long(d, PCI_BASE_ADDRESS_0 + i*4), PCI_BASE_ADDRESS_MEM_MASK); ++ pci_write_long(d, PCI_BASE_ADDRESS_0 + i*4, x); ++ } ++ } + else if (i >= cnt-1) + a->warning("%04x:%02x:%02x.%d: Invalid 64-bit address seen for BAR %d.", d->domain, d->bus, d->dev, d->func, i); + else + { + u32 y = pci_read_long(d, PCI_BASE_ADDRESS_0 + (++i)*4); + #ifdef PCI_HAVE_64BIT_ADDRESS +- d->base_addr[i-1] = x | (((pciaddr_t) y) << 32); ++ d->base_addr[i-1] = (x | (((pciaddr_t) y) << 32)) & PCI_BASE_ADDRESS_MEM_MASK; ++ if (flags & PCI_FILL_SIZES) ++ { ++ u32 size; ++ pci_write_long(d, PCI_BASE_ADDRESS_0 + (i-1)*4, ~0); ++ pci_write_long(d, PCI_BASE_ADDRESS_0 + i*4, ~0); ++ d->size[i-1] = pci_size(y, pci_read_long(d, PCI_BASE_ADDRESS_0 + (i-1)*4) | ++ pci_read_long(d, PCI_BASE_ADDRESS_0 + i*4), 0xffffffff ); ++ pci_write_long(d, PCI_BASE_ADDRESS_0 + (i-1)*4, x); ++ pci_write_long(d, PCI_BASE_ADDRESS_0 + i*4, y); ++ } + #else + if (y) + a->warning("%04x:%02x:%02x.%d 64-bit device address ignored.", d->domain, d->bus, d->dev, d->func); + else +- d->base_addr[i-1] = x; ++ { ++ d->base_addr[i-1] = x & PCI_BASE_ADDRESS_MEM_MASK; ++ if (flags & PCI_FILL_SIZES) ++ { ++ u32 size; ++ pci_write_long(d, PCI_BASE_ADDRESS_0 + (i-1)*4, ~0); ++ d->size[i-1] = pci_size(x, pci_read_long(d, PCI_BASE_ADDRESS_0 + (i-1)*4), PCI_BASE_ADDRESS_MEM_MASK); ++ pci_write_long(d, PCI_BASE_ADDRESS_0 + (i-1)*4, x); ++ } ++ } + #endif + } + } +@@ -154,10 +205,19 @@ + { + u32 u = pci_read_long(d, reg); + if (u != 0xffffffff) +- d->rom_base_addr = u; ++ { ++ d->rom_base_addr = u; ++ if (flags & PCI_FILL_SIZES) ++ { ++ u32 size; ++ pci_write_long(d, reg, ~0); ++ d->rom_size = pci_read_long(d, reg); ++ pci_write_long(d, reg, u); ++ } ++ } + } + } +- return flags & ~PCI_FILL_SIZES; ++ return flags; + } + + static int diff -r eb0fc71cfc72 -r 400e5d4877ca tools/Makefile --- a/tools/Makefile Tue Jul 08 11:41:43 2008 +0900 +++ b/tools/Makefile Fri Jul 18 12:12:41 2008 +0900 @@ -22,7 +22,12 @@ SUBDIRS-y += blktap SUBDIRS-y += blktap SUBDIRS-y += libfsimage SUBDIRS-$(LIBXENAPI_BINDINGS) += libxen + +ifeq (ioemu,$(CONFIG_QEMU)) SUBDIRS-$(CONFIG_IOEMU) += ioemu +else +SUBDIRS-$(CONFIG_IOEMU) += ioemu-dir +endif # These don't cross-compile ifeq ($(XEN_COMPILE_ARCH),$(XEN_TARGET_ARCH)) @@ -62,3 +67,33 @@ subdir-clean-ioemu: subdir-clean-ioemu: $(MAKE) -C ioemu distclean +ioemu-dir-find: + set -ex; \ + if test -d $(CONFIG_QEMU); then \ + rm -f ioemu-dir; \ + ln -sf $(CONFIG_QEMU) ioemu-dir; \ + else \ + if [ ! -d ioemu-remote ]; then \ + rm -rf ioemu-remote ioemu-remote.tmp; \ + mkdir ioemu-remote.tmp; rmdir ioemu-remote.tmp; \ + $(GIT) clone $(CONFIG_QEMU) ioemu-remote.tmp; \ + mv ioemu-remote.tmp ioemu-remote; \ + fi; \ + rm -f ioemu-dir; \ + ln -sf ioemu-remote ioemu-dir; \ + fi + set -e; \ + case "$(XEN_ROOT)" in \ + /*) XEN_ROOT=$(XEN_ROOT) ;; \ + *) XEN_ROOT=`pwd`/$(XEN_ROOT) ;; \ + esac; \ + export XEN_ROOT; \ + cd ioemu-dir; \ + ./xen-setup + +subdir-all-ioemu-dir subdir-install-ioemu-dir: ioemu-dir-find + +subdir-clean-ioemu-dir: + if test -d ioemu-dir/.; then \ + $(MAKE) -C ioemu-dir clean; \ + fi diff -r eb0fc71cfc72 -r 400e5d4877ca tools/blktap/drivers/Makefile --- a/tools/blktap/drivers/Makefile Tue Jul 08 11:41:43 2008 +0900 +++ b/tools/blktap/drivers/Makefile Fri Jul 18 12:12:41 2008 +0900 @@ -36,11 +36,14 @@ BLK-OBJS-y += block-qcow2.o BLK-OBJS-y += block-qcow2.o BLK-OBJS-y += aes.o BLK-OBJS-y += tapaio.o -BLK-OBJS-$(CONFIG_Linux) += blk_linux.c +BLK-OBJS-$(CONFIG_Linux) += blk_linux.o + +BLKTAB-OBJS-y := blktapctrl.o +BLKTAB-OBJS-$(CONFIG_Linux) += blktapctrl_linux.o all: $(IBIN) qcow-util -blktapctrl: blktapctrl.o +blktapctrl: $(BLKTAB-OBJS-y) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) $(LDFLAGS_blktapctrl) tapdisk: tapdisk.o $(BLK-OBJS-y) diff -r eb0fc71cfc72 -r 400e5d4877ca tools/blktap/drivers/blktapctrl.c --- a/tools/blktap/drivers/blktapctrl.c Tue Jul 08 11:41:43 2008 +0900 +++ b/tools/blktap/drivers/blktapctrl.c Fri Jul 18 12:12:41 2008 +0900 @@ -37,7 +37,6 @@ #include <stdio.h> #include <stdlib.h> #include <sys/mman.h> -#include <sys/stat.h> #include <err.h> #include <errno.h> #include <sys/types.h> @@ -55,6 +54,8 @@ #include "blktaplib.h" #include "blktapctrl.h" #include "tapdisk.h" +#include "list.h" +#include "xs_api.h" /* for xs_fire_next_watch() */ #define PIDFILE "/var/run/blktapctrl.pid" @@ -75,6 +76,32 @@ static int read_msg(int fd, int msgtype, static int read_msg(int fd, int msgtype, void *ptr); static driver_list_entry_t *active_disks[MAX_DISK_TYPES]; + +static unsigned long long tapdisk_get_size(blkif_t *blkif) +{ + image_t *img = (image_t *)blkif->prv; + return img->size; +} + +static unsigned long tapdisk_get_secsize(blkif_t *blkif) +{ + image_t *img = (image_t *)blkif->prv; + return img->secsize; +} + +static unsigned int tapdisk_get_info(blkif_t *blkif) +{ + image_t *img = (image_t *)blkif->prv; + return img->info; +} + +struct blkif_ops tapdisk_ops = { + .get_size = tapdisk_get_size, + .get_secsize = tapdisk_get_secsize, + .get_info = tapdisk_get_info, +}; + + static void init_driver_list(void) { int i; @@ -93,62 +120,6 @@ static void init_rng(void) seed = tv.tv_usec; srand48(seed); return; -} - -static void make_blktap_dev(char *devname, int major, int minor) -{ - struct stat st; - - if (lstat(devname, &st) != 0) { - /*Need to create device*/ - if (mkdir(BLKTAP_DEV_DIR, 0755) == 0) - DPRINTF("Created %s directory\n",BLKTAP_DEV_DIR); - if (mknod(devname, S_IFCHR|0600, - makedev(major, minor)) == 0) - DPRINTF("Created %s device\n",devname); - } else { - DPRINTF("%s device already exists\n",devname); - /* it already exists, but is it the same major number */ - if (((st.st_rdev>>8) & 0xff) != major) { - DPRINTF("%s has old major %d\n", - devname, - (unsigned int)((st.st_rdev >> 8) & 0xff)); - /* only try again if we succed in deleting it */ - if (!unlink(devname)) - make_blktap_dev(devname, major, minor); - } - } -} - -static int get_new_dev(int *major, int *minor, blkif_t *blkif) -{ - domid_translate_t tr; - int ret; - char *devname; - - tr.domid = blkif->domid; - tr.busid = blkif->be_id; - ret = ioctl(ctlfd, BLKTAP_IOCTL_NEWINTF, tr ); - - if ( (ret <= 0)||(ret > MAX_TAP_DEV) ) { - DPRINTF("Incorrect Dev ID [%d]\n",ret); - return -1; - } - - *minor = ret; - *major = ioctl(ctlfd, BLKTAP_IOCTL_MAJOR, ret ); - if (*major < 0) { - DPRINTF("Incorrect Major ID [%d]\n",*major); - return -1; - } - - if (asprintf(&devname,"%s/%s%d",BLKTAP_DEV_DIR, BLKTAP_DEV_NAME, *minor) == -1) - return -1; - make_blktap_dev(devname,*major,*minor); - DPRINTF("Received device id %d and major %d, " - "sent domid %d and be_id %d\n", - *minor, *major, tr.domid, tr.busid); - return 0; } static int get_tapdisk_pid(blkif_t *blkif) @@ -626,7 +597,7 @@ fail: return ret; } -int blktapctrl_new_blkif(blkif_t *blkif) +static int blktapctrl_new_blkif(blkif_t *blkif) { blkif_info_t *blk; int major, minor, fd_read, fd_write, type, new; @@ -637,7 +608,7 @@ int blktapctrl_new_blkif(blkif_t *blkif) DPRINTF("Received a poll for a new vbd\n"); if ( ((blk=blkif->info) != NULL) && (blk->params != NULL) ) { - if (get_new_dev(&major, &minor, blkif)<0) + if (blktap_interface_create(ctlfd, &major, &minor, blkif) < 0) return -1; if (test_path(blk->params, &ptr, &type, &exist) != 0) { @@ -698,7 +669,7 @@ fail: return -EINVAL; } -int map_new_blktapctrl(blkif_t *blkif) +static int map_new_blktapctrl(blkif_t *blkif) { DPRINTF("Received a poll for a new devmap\n"); if (write_msg(blkif->fds[WRITE], CTLMSG_NEWDEV, blkif, NULL) <= 0) { @@ -715,7 +686,7 @@ int map_new_blktapctrl(blkif_t *blkif) return blkif->minor - 1; } -int unmap_blktapctrl(blkif_t *blkif) +static int unmap_blktapctrl(blkif_t *blkif) { DPRINTF("Unmapping vbd\n"); @@ -829,21 +800,11 @@ int main(int argc, char *argv[]) register_new_devmap_hook(map_new_blktapctrl); register_new_unmap_hook(unmap_blktapctrl); - /* Attach to blktap0 */ - if (asprintf(&devname,"%s/%s0", BLKTAP_DEV_DIR, BLKTAP_DEV_NAME) == -1) - goto open_failed; - if ((ret = xc_find_device_number("blktap0")) < 0) { - DPRINTF("couldn't find device number for 'blktap0'\n"); + ctlfd = blktap_interface_open(); + if (ctlfd < 0) { + DPRINTF("couldn't open blktap interface\n"); goto open_failed; } - blktap_major = major(ret); - make_blktap_dev(devname,blktap_major,0); - ctlfd = open(devname, O_RDWR); - if (ctlfd == -1) { - DPRINTF("blktap0 open failed\n"); - goto open_failed; - } - retry: /* Set up store connection and watch. */ diff -r eb0fc71cfc72 -r 400e5d4877ca tools/blktap/drivers/blktapctrl.h --- a/tools/blktap/drivers/blktapctrl.h Tue Jul 08 11:41:43 2008 +0900 +++ b/tools/blktap/drivers/blktapctrl.h Fri Jul 18 12:12:41 2008 +0900 @@ -30,26 +30,7 @@ */ -static inline unsigned long long tapdisk_get_size(blkif_t *blkif) -{ - image_t *img = (image_t *)blkif->prv; - return img->size; -} +int blktap_interface_open(void); -static inline unsigned long tapdisk_get_secsize(blkif_t *blkif) -{ - image_t *img = (image_t *)blkif->prv; - return img->secsize; -} +int blktap_interface_create(int ctlfd, int *major, int *minor, blkif_t *blkif); -static inline unsigned int tapdisk_get_info(blkif_t *blkif) -{ - image_t *img = (image_t *)blkif->prv; - return img->info; -} - -struct blkif_ops tapdisk_ops = { - .get_size = tapdisk_get_size, - .get_secsize = tapdisk_get_secsize, - .get_info = tapdisk_get_info, -}; diff -r eb0fc71cfc72 -r 400e5d4877ca tools/blktap/drivers/blktapctrl_linux.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tools/blktap/drivers/blktapctrl_linux.c Fri Jul 18 12:12:41 2008 +0900 @@ -0,0 +1,109 @@ + +#include <stdio.h> +#include <fcntl.h> +#include <sys/stat.h> +#include <sys/ioctl.h> + +#include "tapdisk.h" +#include "blktaplib.h" +#include "blktapctrl.h" + +static void make_blktap_dev(char *devname, int major, int minor) +{ + struct stat st; + + if (lstat(devname, &st) != 0) { + /*Need to create device*/ + if (mkdir(BLKTAP_DEV_DIR, 0755) == 0) + DPRINTF("Created %s directory\n",BLKTAP_DEV_DIR); + if (mknod(devname, S_IFCHR|0600, + makedev(major, minor)) == 0) + DPRINTF("Created %s device\n",devname); + } else { + DPRINTF("%s device already exists\n",devname); + /* it already exists, but is it the same major number */ + if (((st.st_rdev>>8) & 0xff) != major) { + DPRINTF("%s has old major %d\n", + devname, + (unsigned int)((st.st_rdev >> 8) & 0xff)); + /* only try again if we succed in deleting it */ + if (!unlink(devname)) + make_blktap_dev(devname, major, minor); + } + } +} + +int blktap_interface_create(int ctlfd, int *major, int *minor, blkif_t *blkif) +{ + domid_translate_t tr; + domid_translate_ext_t tr_ext; + int ret; + char *devname; + + if (blkif->be_id >= (1<<28)) { + /* new-style backend-id, so use the extended structure */ + tr_ext.domid = blkif->domid; + tr_ext.busid = blkif->be_id; + ret = ioctl(ctlfd, BLKTAP_IOCTL_NEWINTF_EXT, &tr_ext); + DPRINTF("Sent domid %d and be_id %d\n", tr_ext.domid, + tr_ext.busid); + } + else { + /* old-style backend-id; use the old structure */ + tr.domid = blkif->domid; + tr.busid = (unsigned short)blkif->be_id; + ret = ioctl(ctlfd, BLKTAP_IOCTL_NEWINTF, tr); + DPRINTF("Sent domid %d and be_id %d\n", tr.domid, tr.busid); + } + + if ( (ret <= 0)||(ret > MAX_TAP_DEV) ) { + DPRINTF("Incorrect Dev ID [%d]\n",ret); + return -1; + } + + *minor = ret; + *major = ioctl(ctlfd, BLKTAP_IOCTL_MAJOR, ret ); + if (*major < 0) { + DPRINTF("Incorrect Major ID [%d]\n",*major); + return -1; + } + + if (asprintf(&devname,"%s/%s%d",BLKTAP_DEV_DIR, BLKTAP_DEV_NAME, *minor) == -1) + return -1; + make_blktap_dev(devname,*major,*minor); + DPRINTF("Received device id %d and major %d\n", + *minor, *major); + return 0; +} + + +int blktap_interface_open(void) +{ + char *devname; + int ret; + int ctlfd; + + /* Attach to blktap0 */ + if (asprintf(&devname,"%s/%s0", BLKTAP_DEV_DIR, BLKTAP_DEV_NAME) == -1) + goto open_failed; + + ret = xc_find_device_number("blktap0"); + if (ret < 0) { + DPRINTF("couldn't find device number for 'blktap0'\n"); + goto open_failed; + } + + blktap_major = major(ret); + make_blktap_dev(devname,blktap_major, 0); + + ctlfd = open(devname, O_RDWR); + if (ctlfd == -1) { + DPRINTF("blktap0 open failed\n"); + goto open_failed; + } + + return ctlfd; + +open_failed: + return -1; +} diff -r eb0fc71cfc72 -r 400e5d4877ca tools/blktap/drivers/block-aio.c --- a/tools/blktap/drivers/block-aio.c Tue Jul 08 11:41:43 2008 +0900 +++ b/tools/blktap/drivers/block-aio.c Fri Jul 18 12:12:41 2008 +0900 @@ -118,7 +118,7 @@ static inline void init_fds(struct disk_ } /* Open the disk file and initialize aio state. */ -int tdaio_open (struct disk_driver *dd, const char *name, td_flag_t flags) +static int tdaio_open (struct disk_driver *dd, const char *name, td_flag_t flags) { int i, fd, ret = 0, o_flags; struct td_state *s = dd->td_state; @@ -161,7 +161,7 @@ done: return ret; } -int tdaio_queue_read(struct disk_driver *dd, uint64_t sector, +static int tdaio_queue_read(struct disk_driver *dd, uint64_t sector, int nb_sectors, char *buf, td_callback_t cb, int id, void *private) { @@ -174,7 +174,7 @@ int tdaio_queue_read(struct disk_driver cb, id, sector, private); } -int tdaio_queue_write(struct disk_driver *dd, uint64_t sector, +static int tdaio_queue_write(struct disk_driver *dd, uint64_t sector, int nb_sectors, char *buf, td_callback_t cb, int id, void *private) { @@ -187,14 +187,14 @@ int tdaio_queue_write(struct disk_driver cb, id, sector, private); } -int tdaio_submit(struct disk_driver *dd) +static int tdaio_submit(struct disk_driver *dd) { struct tdaio_state *prv = (struct tdaio_state *)dd->private; return tap_aio_submit(&prv->aio); } -int tdaio_close(struct disk_driver *dd) +static int tdaio_close(struct disk_driver *dd) { struct tdaio_state *prv = (struct tdaio_state *)dd->private; @@ -204,7 +204,7 @@ int tdaio_close(struct disk_driver *dd) return 0; } -int tdaio_do_callbacks(struct disk_driver *dd, int sid) +static int tdaio_do_callbacks(struct disk_driver *dd, int sid) { int i, nr_events, rsp = 0; struct io_event *ep; @@ -234,12 +234,12 @@ repeat: return rsp; } -int tdaio_get_parent_id(struct disk_driver *dd, struct disk_id *id) +static int tdaio_get_parent_id(struct disk_driver *dd, struct disk_id *id) { return TD_NO_PARENT; } -int tdaio_validate_parent(struct disk_driver *dd, +static int tdaio_validate_parent(struct disk_driver *dd, struct disk_driver *parent, td_flag_t flags) { return -EINVAL; diff -r eb0fc71cfc72 -r 400e5d4877ca tools/blktap/drivers/block-qcow.c --- a/tools/blktap/drivers/block-qcow.c Tue Jul 08 11:41:43 2008 +0900 +++ b/tools/blktap/drivers/block-qcow.c Fri Jul 18 12:12:41 2008 +0900 @@ -720,7 +720,7 @@ static inline void init_fds(struct disk_ } /* Open the disk file and initialize qcow state. */ -int tdqcow_open (struct disk_driver *dd, const char *name, td_flag_t flags) +static int tdqcow_open (struct disk_driver *dd, const char *name, td_flag_t flags) { int fd, len, i, shift, ret, size, l1_table_size, o_flags; int max_aio_reqs; @@ -937,7 +937,7 @@ fail: return -1; } -int tdqcow_queue_read(struct disk_driver *dd, uint64_t sector, +static int tdqcow_queue_read(struct disk_driver *dd, uint64_t sector, int nb_sectors, char *buf, td_callback_t cb, int id, void *private) { @@ -999,7 +999,7 @@ done: return rsp; } -int tdqcow_queue_write(struct disk_driver *dd, uint64_t sector, +static int tdqcow_queue_write(struct disk_driver *dd, uint64_t sector, int nb_sectors, char *buf, td_callback_t cb, int id, void *private) { @@ -1057,14 +1057,14 @@ int tdqcow_queue_write(struct disk_drive return 0; } -int tdqcow_submit(struct disk_driver *dd) +static int tdqcow_submit(struct disk_driver *dd) { struct tdqcow_state *prv = (struct tdqcow_state *)dd->private; return tap_aio_submit(&prv->aio); } -int tdqcow_close(struct disk_driver *dd) +static int tdqcow_close(struct disk_driver *dd) { struct tdqcow_state *s = (struct tdqcow_state *)dd->private; uint32_t cksum, out; @@ -1092,7 +1092,7 @@ int tdqcow_close(struct disk_driver *dd) return 0; } -int tdqcow_do_callbacks(struct disk_driver *dd, int sid) +static int tdqcow_do_callbacks(struct disk_driver *dd, int sid) { int ret, i, nr_events, rsp = 0,*ptr; struct io_event *ep; @@ -1276,7 +1276,7 @@ int qcow_create(const char *filename, ui return 0; } -int qcow_make_empty(struct tdqcow_state *s) +static int qcow_make_empty(struct tdqcow_state *s) { uint32_t l1_length = s->l1_size * sizeof(uint64_t); @@ -1296,14 +1296,14 @@ int qcow_make_empty(struct tdqcow_state return 0; } -int qcow_get_cluster_size(struct tdqcow_state *s) +static int qcow_get_cluster_size(struct tdqcow_state *s) { return s->cluster_size; } /* XXX: put compressed sectors first, then all the cluster aligned tables to avoid losing bytes in alignment */ -int qcow_compress_cluster(struct tdqcow_state *s, int64_t sector_num, +static int qcow_compress_cluster(struct tdqcow_state *s, int64_t sector_num, const uint8_t *buf) { z_stream strm; @@ -1358,7 +1358,7 @@ int qcow_compress_cluster(struct tdqcow_ return 0; } -int tdqcow_get_parent_id(struct disk_driver *dd, struct disk_id *id) +static int tdqcow_get_parent_id(struct disk_driver *dd, struct disk_id *id) { off_t off; char *buf, *filename; @@ -1392,7 +1392,7 @@ int tdqcow_get_parent_id(struct disk_dri return err; } -int tdqcow_validate_parent(struct disk_driver *child, +static int tdqcow_validate_parent(struct disk_driver *child, struct disk_driver *parent, td_flag_t flags) { struct stat stats; diff -r eb0fc71cfc72 -r 400e5d4877ca tools/blktap/drivers/block-ram.c --- a/tools/blktap/drivers/block-ram.c Tue Jul 08 11:41:43 2008 +0900 +++ b/tools/blktap/drivers/block-ram.c Fri Jul 18 12:12:41 2008 +0900 @@ -127,7 +127,7 @@ static inline void init_fds(struct disk_ } /* Open the disk file and initialize ram state. */ -int tdram_open (struct disk_driver *dd, const char *name, td_flag_t flags) +static int tdram_open (struct disk_driver *dd, const char *name, td_flag_t flags) { char *p; uint64_t size; @@ -220,7 +220,7 @@ done: return ret; } - int tdram_queue_read(struct disk_driver *dd, uint64_t sector, +static int tdram_queue_read(struct disk_driver *dd, uint64_t sector, int nb_sectors, char *buf, td_callback_t cb, int id, void *private) { @@ -234,7 +234,7 @@ done: return cb(dd, 0, sector, nb_sectors, id, private); } -int tdram_queue_write(struct disk_driver *dd, uint64_t sector, +static int tdram_queue_write(struct disk_driver *dd, uint64_t sector, int nb_sectors, char *buf, td_callback_t cb, int id, void *private) { @@ -250,12 +250,12 @@ int tdram_queue_write(struct disk_driver return cb(dd, 0, sector, nb_sectors, id, private); } -int tdram_submit(struct disk_driver *dd) +static int tdram_submit(struct disk_driver *dd) { return 0; } -int tdram_close(struct disk_driver *dd) +static int tdram_close(struct disk_driver *dd) { struct tdram_state *prv = (struct tdram_state *)dd->private; @@ -264,18 +264,18 @@ int tdram_close(struct disk_driver *dd) return 0; } -int tdram_do_callbacks(struct disk_driver *dd, int sid) +static int tdram_do_callbacks(struct disk_driver *dd, int sid) { /* always ask for a kick */ return 1; } -int tdram_get_parent_id(struct disk_driver *dd, struct disk_id *id) +static int tdram_get_parent_id(struct disk_driver *dd, struct disk_id *id) { return TD_NO_PARENT; } -int tdram_validate_parent(struct disk_driver *dd, +static int tdram_validate_parent(struct disk_driver *dd, struct disk_driver *parent, td_flag_t flags) { return -EINVAL; diff -r eb0fc71cfc72 -r 400e5d4877ca tools/blktap/drivers/block-sync.c --- a/tools/blktap/drivers/block-sync.c Tue Jul 08 11:41:43 2008 +0900 +++ b/tools/blktap/drivers/block-sync.c Fri Jul 18 12:12:41 2008 +0900 @@ -109,7 +109,7 @@ static inline void init_fds(struct disk_ } /* Open the disk file and initialize aio state. */ -int tdsync_open (struct disk_driver *dd, const char *name, td_flag_t flags) +static int tdsync_open (struct disk_driver *dd, const char *name, td_flag_t flags) { int i, fd, ret = 0, o_flags; struct td_state *s = dd->td_state; @@ -129,7 +129,7 @@ int tdsync_open (struct disk_driver *dd, /* Maybe O_DIRECT isn't supported. */ o_flags &= ~O_DIRECT; - fd = open(name, O_RDWR | O_LARGEFILE); + fd = open(name, o_flags); if (fd != -1) DPRINTF("WARNING: Accessing image without" "O_DIRECT! (%s)\n", name); @@ -149,7 +149,7 @@ done: return ret; } - int tdsync_queue_read(struct disk_driver *dd, uint64_t sector, +static int tdsync_queue_read(struct disk_driver *dd, uint64_t sector, int nb_sectors, char *buf, td_callback_t cb, int id, void *private) { @@ -172,7 +172,7 @@ done: return cb(dd, (ret < 0) ? ret: 0, sector, nb_sectors, id, private); } - int tdsync_queue_write(struct disk_driver *dd, uint64_t sector, +static int tdsync_queue_write(struct disk_driver *dd, uint64_t sector, int nb_sectors, char *buf, td_callback_t cb, int id, void *private) { @@ -195,12 +195,12 @@ done: return cb(dd, (ret < 0) ? ret : 0, sector, nb_sectors, id, private); } -int tdsync_submit(struct disk_driver *dd) +static int tdsync_submit(struct disk_driver *dd) { return 0; } -int tdsync_close(struct disk_driver *dd) +static int tdsync_close(struct disk_driver *dd) { struct tdsync_state *prv = (struct tdsync_state *)dd->private; @@ -211,18 +211,18 @@ int tdsync_close(struct disk_driver *dd) return 0; } -int tdsync_do_callbacks(struct disk_driver *dd, int sid) +static int tdsync_do_callbacks(struct disk_driver *dd, int sid) { /* always ask for a kick */ return 1; } -int tdsync_get_parent_id(struct disk_driver *dd, struct disk_id *id) +static int tdsync_get_parent_id(struct disk_driver *dd, struct disk_id *id) { return TD_NO_PARENT; } -int tdsync_validate_parent(struct disk_driver *dd, +static int tdsync_validate_parent(struct disk_driver *dd, struct disk_driver *parent, td_flag_t flags) { return -EINVAL; diff -r eb0fc71cfc72 -r 400e5d4877ca tools/blktap/drivers/img2qcow.c --- a/tools/blktap/drivers/img2qcow.c Tue Jul 08 11:41:43 2008 +0900 +++ b/tools/blktap/drivers/img2qcow.c Fri Jul 18 12:12:41 2008 +0900 @@ -61,8 +61,8 @@ static uint64_t prev = 0; static uint64_t prev = 0; static char output[25]; -void print_bytes(void *ptr, int length) { - +static void print_bytes(void *ptr, int length) +{ int i,k; unsigned char *p = ptr; @@ -77,7 +77,7 @@ void print_bytes(void *ptr, int length) return; } -void debug_output(uint64_t progress, uint64_t size) +static void debug_output(uint64_t progress, uint64_t size) { uint64_t blocks = size/20; diff -r eb0fc71cfc72 -r 400e5d4877ca tools/blktap/drivers/qcow-create.c --- a/tools/blktap/drivers/qcow-create.c Tue Jul 08 11:41:43 2008 +0900 +++ b/tools/blktap/drivers/qcow-create.c Fri Jul 18 12:12:41 2008 +0900 @@ -48,7 +48,7 @@ #define MAX_NAME_LEN 1000 -void help(void) +static void help(void) { fprintf(stderr, "Qcow-utils: v1.0.0\n"); fprintf(stderr, diff -r eb0fc71cfc72 -r 400e5d4877ca tools/blktap/drivers/qcow2raw.c --- a/tools/blktap/drivers/qcow2raw.c Tue Jul 08 11:41:43 2008 +0900 +++ b/tools/blktap/drivers/qcow2raw.c Fri Jul 18 12:12:41 2008 +0900 @@ -65,8 +65,8 @@ static uint64_t prev = 0, written = 0; static uint64_t prev = 0, written = 0; static char output[25]; -void print_bytes(void *ptr, int length) { - +static void print_bytes(void *ptr, int length) +{ int i,k; unsigned char *p = ptr; @@ -81,7 +81,7 @@ void print_bytes(void *ptr, int length) return; } -void debug_output(uint64_t progress, uint64_t size) +static void debug_output(uint64_t progress, uint64_t size) { /*Output progress every 5% */ uint64_t blocks = size/20; diff -r eb0fc71cfc72 -r 400e5d4877ca tools/blktap/drivers/tapdisk.c --- a/tools/blktap/drivers/tapdisk.c Tue Jul 08 11:41:43 2008 +0900 +++ b/tools/blktap/drivers/tapdisk.c Fri Jul 18 12:12:41 2008 +0900 @@ -53,14 +53,14 @@ int do_cow_read(struct disk_driver *dd, #define td_for_each_disk(tds, drv) \ for (drv = tds->disks; drv != NULL; drv = drv->next) -void usage(void) +static void usage(void) { fprintf(stderr, "blktap-utils: v1.0.0\n"); fprintf(stderr, "usage: tapdisk <READ fifo> <WRITE fifo>\n"); exit(-1); } -void daemonize(void) +static void daemonize(void) { int i; @@ -121,7 +121,7 @@ static void unmap_disk(struct td_state * return; } -void sig_handler(int sig) +static void sig_handler(int sig) { /*Received signal to close. If no disks are active, we close app.*/ @@ -512,7 +512,7 @@ static inline void kick_responses(struct } } -void io_done(struct disk_driver *dd, int sid) +static void io_done(struct disk_driver *dd, int sid) { struct tap_disk *drv = dd->drv; @@ -537,7 +537,7 @@ segment_start(blkif_request_t *req, int } uint64_t sends, responds; -int send_responses(struct disk_driver *dd, int res, +static int send_responses(struct disk_driver *dd, int res, uint64_t sector, int nr_secs, int idx, void *private) { pending_req_t *preq; diff -r eb0fc71cfc72 -r 400e5d4877ca tools/blktap/lib/blktaplib.h --- a/tools/blktap/lib/blktaplib.h Tue Jul 08 11:41:43 2008 +0900 +++ b/tools/blktap/lib/blktaplib.h Fri Jul 18 12:12:41 2008 +0900 @@ -57,6 +57,7 @@ #define BLKTAP_IOCTL_MAJOR 7 #define BLKTAP_QUERY_ALLOC_REQS 8 #define BLKTAP_IOCTL_FREEINTF 9 +#define BLKTAP_IOCTL_NEWINTF_EXT 50 #define BLKTAP_IOCTL_PRINT_IDXS 100 /* blktap switching modes: (Set with BLKTAP_IOCTL_SETMODE) */ @@ -161,8 +162,13 @@ typedef struct tapdev_info { typedef struct domid_translate { unsigned short domid; + unsigned short busid; +} domid_translate_t ; + +typedef struct domid_translate_ext { + unsigned short domid; uint32_t busid; -} domid_translate_t ; +} domid_translate_ext_t ; typedef struct image { unsigned long long size; @@ -207,7 +213,6 @@ typedef struct msg_pid { /* xenstore/xenbus: */ #define DOMNAME "Domain-0" int setup_probe_watch(struct xs_handle *h); -int xs_fire_next_watch(struct xs_handle *h); /* Abitrary values, must match the underlying driver... */ diff -r eb0fc71cfc72 -r 400e5d4877ca tools/blktap/lib/xenbus.c --- a/tools/blktap/lib/xenbus.c Tue Jul 08 11:41:43 2008 +0900 +++ b/tools/blktap/lib/xenbus.c Fri Jul 18 12:12:41 2008 +0900 @@ -354,7 +354,7 @@ static void ueblktap_probe(struct xs_han *are created, we initalise the state and attach a disk. */ -int add_blockdevice_probe_watch(struct xs_handle *h, const char *domid) +static int add_blockdevice_probe_watch(struct xs_handle *h, const char *domid) { char *path; struct xenbus_watch *vbd_watch; @@ -377,7 +377,7 @@ int add_blockdevice_probe_watch(struct x } /* Asynch callback to check for /local/domain/<DOMID>/name */ -void check_dom(struct xs_handle *h, struct xenbus_watch *w, +static void check_dom(struct xs_handle *h, struct xenbus_watch *w, const char *bepath_im) { char *domid; @@ -392,7 +392,7 @@ void check_dom(struct xs_handle *h, stru } /* We must wait for xend to register /local/domain/<DOMID> */ -int watch_for_domid(struct xs_handle *h) +static int watch_for_domid(struct xs_handle *h) { struct xenbus_watch *domid_watch; char *path = NULL; diff -r eb0fc71cfc72 -r 400e5d4877ca tools/console/daemon/io.c --- a/tools/console/daemon/io.c Tue Jul 08 11:41:43 2008 +0900 +++ b/tools/console/daemon/io.c Fri Jul 18 12:12:41 2008 +0900 @@ -471,7 +471,7 @@ out: } /* Takes tuples of names, scanf-style args, and void **, NULL terminated. */ -int xs_gather(struct xs_handle *xs, const char *dir, ...) +static int xs_gather(struct xs_handle *xs, const char *dir, ...) { va_list ap; const char *name; diff -r eb0fc71cfc72 -r 400e5d4877ca tools/examples/network-bridge --- a/tools/examples/network-bridge Tue Jul 08 11:41:43 2008 +0900 +++ b/tools/examples/network-bridge Fri Jul 18 12:12:41 2008 +0900 @@ -60,7 +60,18 @@ is_network_root () { local rootfs=$(awk '{ if ($1 !~ /^[ \t]*#/ && $2 == "/") { print $3; }}' /etc/mtab) local rootopts=$(awk '{ if ($1 !~ /^[ \t]*#/ && $2 == "/") { print $4; }}' /etc/mtab) - [[ "$rootfs" =~ "^nfs" ]] || [[ "$rootopts" =~ "_netdev" ]] && return 0 || return 1 + [[ "$rootfs" =~ "^nfs" ]] || [[ "$rootopts" =~ "_netdev" ]] && has_nfsroot=1 || has_nfsroot=0 + if [ $has_nfsroot -eq 1 ]; then + local bparms=$(cat /proc/cmdline) + for p in $bparms; do + local ipaddr=$(echo $p | awk /nfsroot=/'{ print substr($1,9,index($1,":")-9) }') + if [ "$ipaddr" != "" ]; then + local nfsdev=$(ip route get $ipaddr | awk /$ipaddr/'{ print $3 }') + [[ "$nfsdev" == "$netdev" ]] && return 0 || return 1 + fi + done + fi + return 1 } find_alt_device () { diff -r eb0fc71cfc72 -r 400e5d4877ca tools/examples/vscsi --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tools/examples/vscsi Fri Jul 18 12:12:41 2008 +0900 @@ -0,0 +1,22 @@ +#!/bin/sh +# +# Copyright (c) 2007, FUJITSU Limited +# Based on the block scripts code. +# + +dir=$(dirname "$0") +. "$dir/xen-hotplug-common.sh" + +findCommand "$@" + +case "$command" in + add) + success + ;; + remove) + # TODO + exit 0 + ;; +esac + +exit 0 diff -r eb0fc71cfc72 -r 400e5d4877ca tools/examples/vtpm-common.sh --- a/tools/examples/vtpm-common.sh Tue Jul 08 11:41:43 2008 +0900 +++ b/tools/examples/vtpm-common.sh Fri Jul 18 12:12:41 2008 +0900 @@ -310,11 +310,11 @@ function vtpm_remove_instance () { instance="0" - if [ "$uuid != "" ]; then + if [ "$uuid" != "" ]; then instance=$(vtpmdb_find_instance $uuid) fi - if [ "$instance == "0" ]; then + if [ "$instance" == "0" ]; then domname=$(xenstore_read "$XENBUS_PATH"/domain) instance=$(vtpmdb_find_instance $domname) fi diff -r eb0fc71cfc72 -r 400e5d4877ca tools/examples/xen-backend.agent --- a/tools/examples/xen-backend.agent Tue Jul 08 11:41:43 2008 +0900 +++ b/tools/examples/xen-backend.agent Fri Jul 18 12:12:41 2008 +0900 @@ -19,6 +19,9 @@ case "$XENBUS_TYPE" in vif) [ -n "$script" ] && $script "$ACTION" ;; + vscsi) + /etc/xen/scripts/vscsi "$ACTION" + ;; esac case "$ACTION" in diff -r eb0fc71cfc72 -r 400e5d4877ca tools/examples/xen-backend.rules --- a/tools/examples/xen-backend.rules Tue Jul 08 11:41:43 2008 +0900 +++ b/tools/examples/xen-backend.rules Fri Jul 18 12:12:41 2008 +0900 @@ -3,6 +3,7 @@ SUBSYSTEM=="xen-backend", KERNEL=="vtpm* SUBSYSTEM=="xen-backend", KERNEL=="vtpm*", RUN+="/etc/xen/scripts/vtpm $env{ACTION}" SUBSYSTEM=="xen-backend", KERNEL=="vif*", ACTION=="online", RUN+="$env{script} online" SUBSYSTEM=="xen-backend", KERNEL=="vif*", ACTION=="offline", RUN+="$env{script} offline" +SUBSYSTEM=="xen-backend", KERNEL=="vscsi*", RUN+="/etc/xen/scripts/vscsi $env{ACTION}" SUBSYSTEM=="xen-backend", ACTION=="remove", RUN+="/etc/xen/scripts/xen-hotplug-cleanup" KERNEL=="evtchn", NAME="xen/%k" KERNEL=="blktap[0-9]*", NAME="xen/%k" diff -r eb0fc71cfc72 -r 400e5d4877ca tools/examples/xmexample.hvm --- a/tools/examples/xmexample.hvm Tue Jul 08 11:41:43 2008 +0900 +++ b/tools/examples/xmexample.hvm Fri Jul 18 12:12:41 2008 +0900 @@ -282,3 +282,26 @@ serial='pty' # '0' -> the bit must be '0' # 'x' -> we don't care (do not check) # 's' -> the bit must be the same as on the host that started this VM + + +#----------------------------------------------------------------------------- +# Configure PVSCSI devices: +# +#vscsi=[ 'PDEV, VDEV' ] +# +# PDEV gives physical SCSI device to be attached to specified guest +# domain by one of the following identifier format. +# - XX:XX:XX:XX (4-tuples with decimal notation which shows +# "host:channel:target:lun") +# - /dev/sdxx or sdx +# - /dev/stxx or stx +# - /dev/sgxx or sgx +# - result of 'scsi_id -gu -s'. +# ex. # scsi_id -gu -s /block/sdb +# 36000b5d0006a0000006a0257004c0000 +# +# VDEV gives virtual SCSI device by 4-tuples (XX:XX:XX:XX) as +# which the specified guest domain recognize. +# + +#vscsi = [ '/dev/sdx, 0:0:0:0' ] diff -r eb0fc71cfc72 -r 400e5d4877ca tools/examples/xmexample.vti --- a/tools/examples/xmexample.vti Tue Jul 08 11:41:43 2008 +0900 +++ b/tools/examples/xmexample.vti Fri Jul 18 12:12:41 2008 +0900 @@ -161,3 +161,25 @@ serial='pty' # 'windows' - All Windows variants (Windows Server 2003/2008) # #guest_os_type='default' + +#----------------------------------------------------------------------------- +# Configure PVSCSI devices: +# +#vscsi=[ 'PDEV, VDEV' ] +# +# PDEV gives physical SCSI device to be attached to specified guest +# domain by one of the following identifier format. +# - XX:XX:XX:XX (4-tuples with decimal notation which shows +# "host:channel:target:lun") +# - /dev/sdxx or sdx +# - /dev/stxx or stx +# - /dev/sgxx or sgx +# - result of 'scsi_id -gu -s'. +# ex. # scsi_id -gu -s /block/sdb +# 36000b5d0006a0000006a0257004c0000 +# +# VDEV gives virtual SCSI device by 4-tuples (XX:XX:XX:XX) as +# which the specified guest domain recognize. +# + +#vscsi = [ '/dev/sdx, 0:0:0:0' ] diff -r eb0fc71cfc72 -r 400e5d4877ca tools/examples/xmexample1 --- a/tools/examples/xmexample1 Tue Jul 08 11:41:43 2008 +0900 +++ b/tools/examples/xmexample1 Fri Jul 18 12:12:41 2008 +0900 @@ -185,4 +185,27 @@ extra = "4" #on_reboot = 'restart' #on_crash = 'restart' -#============================================================================ +#----------------------------------------------------------------------------- +# Configure PVSCSI devices: +# +#vscsi=[ 'PDEV, VDEV' ] +# +# PDEV gives physical SCSI device to be attached to specified guest +# domain by one of the following identifier format. +# - XX:XX:XX:XX (4-tuples with decimal notation which shows +# "host:channel:target:lun") +# - /dev/sdxx or sdx +# - /dev/stxx or stx +# - /dev/sgxx or sgx +# - result of 'scsi_id -gu -s'. +# ex. # scsi_id -gu -s /block/sdb +# 36000b5d0006a0000006a0257004c0000 +# +# VDEV gives virtual SCSI device by 4-tuples (XX:XX:XX:XX) as +# which the specified guest domain recognize. +# + +#vscsi = [ '/dev/sdx, 0:0:0:0' ] + +#============================================================================ + diff -r eb0fc71cfc72 -r 400e5d4877ca tools/examples/xmexample2 --- a/tools/examples/xmexample2 Tue Jul 08 11:41:43 2008 +0900 +++ b/tools/examples/xmexample2 Fri Jul 18 12:12:41 2008 +0900 @@ -221,4 +221,26 @@ extra = "4 VMID=%d usr=/dev/sda6" % vmid #on_reboot = 'restart' #on_crash = 'restart' -#============================================================================ +#----------------------------------------------------------------------------- +# Configure PVSCSI devices: +# +#vscsi=[ 'PDEV, VDEV' ] +# +# PDEV gives physical SCSI device to be attached to specified guest +# domain by one of the following identifier format. +# - XX:XX:XX:XX (4-tuples with decimal notation which shows +# "host:channel:target:lun") +# - /dev/sdxx or sdx +# - /dev/stxx or stx +# - /dev/sgxx or sgx +# - result of 'scsi_id -gu -s'. +# ex. # scsi_id -gu -s /block/sdb +# 36000b5d0006a0000006a0257004c0000 +# +# VDEV gives virtual SCSI device by 4-tuples (XX:XX:XX:XX) as +# which the specified guest domain recognize. +# + +#vscsi = [ '/dev/sdx, 0:0:0:0' ] + +#============================================================================ diff -r eb0fc71cfc72 -r 400e5d4877ca tools/firmware/hvmloader/acpi/build.c --- a/tools/firmware/hvmloader/acpi/build.c Tue Jul 08 11:41:43 2008 +0900 +++ b/tools/firmware/hvmloader/acpi/build.c Fri Jul 18 12:12:41 2008 +0900 @@ -70,12 +70,7 @@ static int hpet_exists(unsigned long hpe static int construct_bios_info_table(uint8_t *buf) { - struct bios_info { - uint8_t com1_present:1; - uint8_t com2_present:1; - uint8_t hpet_present:1; - uint32_t pci_min, pci_len; - } *bios_info = (struct bios_info *)buf; + struct bios_info *bios_info = (struct bios_info *)buf; memset(bios_info, 0, sizeof(*bios_info)); @@ -86,6 +81,7 @@ static int construct_bios_info_table(uin bios_info->pci_min = PCI_MEMBASE; bios_info->pci_len = PCI_MEMSIZE; + bios_info->xen_pfiob = 0xdead; return align16(sizeof(*bios_info)); } diff -r eb0fc71cfc72 -r 400e5d4877ca tools/firmware/hvmloader/config.h --- a/tools/firmware/hvmloader/config.h Tue Jul 08 11:41:43 2008 +0900 +++ b/tools/firmware/hvmloader/config.h Fri Jul 18 12:12:41 2008 +0900 @@ -31,4 +31,15 @@ #define ROMBIOS_PHYSICAL_ADDRESS 0x000F0000 #define SCRATCH_PHYSICAL_ADDRESS 0x00010000 +/* Xen Platform Device */ +#define PFFLAG_ROM_LOCK 1 /* Sets whether ROM memory area is RW or RO */ + +struct bios_info { + uint8_t com1_present:1; + uint8_t com2_present:1; + uint8_t hpet_present:1; + uint32_t pci_min, pci_len; + uint16_t xen_pfiob; +}; + #endif /* __HVMLOADER_CONFIG_H__ */ diff -r eb0fc71cfc72 -r 400e5d4877ca tools/firmware/hvmloader/hvmloader.c --- a/tools/firmware/hvmloader/hvmloader.c Tue Jul 08 11:41:43 2008 +0900 +++ b/tools/firmware/hvmloader/hvmloader.c Fri Jul 18 12:12:41 2008 +0900 @@ -99,10 +99,6 @@ asm ( " .text \n" ); -void smp_initialise(void); -void create_mp_tables(void); -int hvm_write_smbios_tables(void); - static enum { VGA_none, VGA_std, VGA_cirrus } virtual_vga = VGA_none; static void @@ -432,6 +428,23 @@ static void cmos_write_memory_size(void) /* Some BIOSes: alternative extended memory (64kB chunks above 16MB). */ cmos_outb(0x34, (uint8_t)( alt_mem >> 0)); cmos_outb(0x35, (uint8_t)( alt_mem >> 8)); +} + +static void init_xen_platform_io_base(void) +{ + struct bios_info *bios_info = (struct bios_info *)ACPI_PHYSICAL_ADDRESS; + uint32_t devfn, bar_data; + uint16_t vendor_id, device_id; + + for ( devfn = 0; devfn < 128; devfn++ ) + { + vendor_id = pci_readw(devfn, PCI_VENDOR_ID); + device_id = pci_readw(devfn, PCI_DEVICE_ID); + if ( (vendor_id != 0x5853) || (device_id != 0x0001) ) + continue; + bar_data = pci_readl(devfn, PCI_BASE_ADDRESS_0); + bios_info->xen_pfiob = bar_data & PCI_BASE_ADDRESS_IO_MASK; + } } int main(void) @@ -527,6 +540,8 @@ int main(void) ROMBIOS_PHYSICAL_ADDRESS, ROMBIOS_PHYSICAL_ADDRESS + rombios_sz - 1); + init_xen_platform_io_base(); + printf("Invoking ROMBIOS ...\n"); return 0; } diff -r eb0fc71cfc72 -r 400e5d4877ca tools/firmware/hvmloader/mp_tables.c --- a/tools/firmware/hvmloader/mp_tables.c Tue Jul 08 11:41:43 2008 +0900 +++ b/tools/firmware/hvmloader/mp_tables.c Fri Jul 18 12:12:41 2008 +0900 @@ -69,8 +69,6 @@ #include "util.h" -extern int get_vcpu_nr(void); /* for the guest's VCPU count */ - /* * The following structures are defined in the MuliProcessor Specifiation v1.4 */ @@ -152,7 +150,7 @@ struct mp_local_intr_entry { }; -void fill_mp_config_table(struct mp_config_table *mpct, int length) +static void fill_mp_config_table(struct mp_config_table *mpct, int length) { int vcpu_nr, i; uint8_t checksum; @@ -199,7 +197,7 @@ void fill_mp_config_table(struct mp_conf } /* fills in an MP processor entry for VCPU 'vcpu_id' */ -void fill_mp_proc_entry(struct mp_proc_entry *mppe, int vcpu_id) +static void fill_mp_proc_entry(struct mp_proc_entry *mppe, int vcpu_id) { mppe->type = ENTRY_TYPE_PROCESSOR; mppe->lapic_id = LAPIC_ID(vcpu_id); @@ -213,7 +211,7 @@ void fill_mp_proc_entry(struct mp_proc_e /* fills in an MP bus entry of type 'type' and bus ID 'bus_id' */ -void fill_mp_bus_entry(struct mp_bus_entry *mpbe, int bus_id, const char *type) +static void fill_mp_bus_entry(struct mp_bus_entry *mpbe, int bus_id, const char *type) { int i; @@ -225,7 +223,7 @@ void fill_mp_bus_entry(struct mp_bus_ent /* fills in an MP IOAPIC entry for IOAPIC 'ioapic_id' */ -void fill_mp_ioapic_entry(struct mp_ioapic_entry *mpie) +static void fill_mp_ioapic_entry(struct mp_ioapic_entry *mpie) { mpie->type = ENTRY_TYPE_IOAPIC; mpie->ioapic_id = IOAPIC_ID; @@ -236,7 +234,7 @@ void fill_mp_ioapic_entry(struct mp_ioap /* fills in an IO interrupt entry for IOAPIC 'ioapic_id' */ -void fill_mp_io_intr_entry( +static void fill_mp_io_intr_entry( struct mp_io_intr_entry *mpiie, int src_bus_id, int src_bus_irq, int ioapic_id, int dst_ioapic_intin) { @@ -251,7 +249,7 @@ void fill_mp_io_intr_entry( /* fill in the mp floating processor structure */ -void fill_mpfps(struct mp_floating_pointer_struct *mpfps, uint32_t mpct) +static void fill_mpfps(struct mp_floating_pointer_struct *mpfps, uint32_t mpct) { int i; uint8_t checksum; @@ -283,7 +281,7 @@ void fill_mpfps(struct mp_floating_point * The '___HVMMP' signature is created by the ROMBIOS and designates a chunk * of space inside the ROMBIOS that is safe for us to write our MP table info */ -void* get_mp_table_start(void) +static void *get_mp_table_start(void) { char *bios_mem; @@ -300,7 +298,7 @@ void* get_mp_table_start(void) /* recalculate the new ROMBIOS checksum after adding MP tables */ -void reset_bios_checksum(void) +static void reset_bios_checksum(void) { uint32_t i; uint8_t checksum; @@ -311,7 +309,6 @@ void reset_bios_checksum(void) *((uint8_t *)(ROMBIOS_BEGIN + ROMBIOS_MAXOFFSET)) = -checksum; } - /* create_mp_tables - creates MP tables for the guest based upon config data */ void create_mp_tables(void) diff -r eb0fc71cfc72 -r 400e5d4877ca tools/firmware/hvmloader/smp.c --- a/tools/firmware/hvmloader/smp.c Tue Jul 08 11:41:43 2008 +0900 +++ b/tools/firmware/hvmloader/smp.c Fri Jul 18 12:12:41 2008 +0900 @@ -69,8 +69,7 @@ asm ( " .text \n" ); -extern void cacheattr_init(void); - +void ap_start(void); /* non-static avoids unused-function compiler warning */ /*static*/ void ap_start(void) { printf(" - CPU%d ... ", ap_cpuid); diff -r eb0fc71cfc72 -r 400e5d4877ca tools/firmware/hvmloader/util.h --- a/tools/firmware/hvmloader/util.h Tue Jul 08 11:41:43 2008 +0900 +++ b/tools/firmware/hvmloader/util.h Fri Jul 18 12:12:41 2008 +0900 @@ -137,6 +137,12 @@ uint32_t e820_malloc(uint32_t size); /* Prepare the 32bit BIOS */ void highbios_setup(void); +/* Miscellaneous. */ +void cacheattr_init(void); +void create_mp_tables(void); +int hvm_write_smbios_tables(void); +void smp_initialise(void); + #define isdigit(c) ((c) >= '0' && (c) <= '9') #endif /* __HVMLOADER_UTIL_H__ */ diff -r eb0fc71cfc72 -r 400e5d4877ca tools/firmware/rombios/32bit/tcgbios/tcgbios.c --- a/tools/firmware/rombios/32bit/tcgbios/tcgbios.c Tue Jul 08 11:41:43 2008 +0900 +++ b/tools/firmware/rombios/32bit/tcgbios/tcgbios.c Fri Jul 18 12:12:41 2008 +0900 @@ -581,7 +581,7 @@ static char wake_event_1[] = "Wake Ev * data : additional parameter; used as parameter for 10.4.3 * 'action index' */ -void tcpa_add_measurement(uint32_t pcrIndex, +static void tcpa_add_measurement(uint32_t pcrIndex, uint16_t event_type, uint32_t data) { @@ -863,7 +863,7 @@ uint32_t tcpa_initialize_tpm(uint32_t ph } -uint16_t TCG_IsShutdownPreBootInterface(void) +static uint16_t TCG_IsShutdownPreBootInterface(void) { return tcpa_acpi.flags & STATUS_FLAG_SHUTDOWN; } diff -r eb0fc71cfc72 -r 400e5d4877ca tools/firmware/rombios/32bit/tcgbios/tpm_drivers.c --- a/tools/firmware/rombios/32bit/tcgbios/tpm_drivers.c Tue Jul 08 11:41:43 2008 +0900 +++ b/tools/firmware/rombios/32bit/tcgbios/tpm_drivers.c Fri Jul 18 12:12:41 2008 +0900 @@ -75,7 +75,7 @@ static uint32_t tis_activate(uint32_t ba return rc; } -uint32_t tis_ready(uint32_t baseaddr) +static uint32_t tis_ready(uint32_t baseaddr) { uint32_t rc = 0; uint8_t *tis_addr = (uint8_t*)baseaddr; @@ -86,7 +86,7 @@ uint32_t tis_ready(uint32_t baseaddr) return rc; } -uint32_t tis_senddata(uint32_t baseaddr, unsigned char *data, uint32_t len) +static uint32_t tis_senddata(uint32_t baseaddr, unsigned char *data, uint32_t len) { uint32_t rc = 0; uint8_t *tis_addr = (uint8_t*)baseaddr; @@ -127,7 +127,7 @@ uint32_t tis_senddata(uint32_t baseaddr, return rc; } -uint32_t tis_readresp(uint32_t baseaddr, unsigned char *buffer, uint32_t len) +static uint32_t tis_readresp(uint32_t baseaddr, unsigned char *buffer, uint32_t len) { uint32_t rc = 0; uint32_t offset = 0; @@ -147,7 +147,7 @@ uint32_t tis_readresp(uint32_t baseaddr, } -uint32_t tis_waitdatavalid(uint32_t baseaddr) +static uint32_t tis_waitdatavalid(uint32_t baseaddr) { uint8_t *tis_addr = (uint8_t*)baseaddr; uint32_t rc = 0; @@ -157,7 +157,7 @@ uint32_t tis_waitdatavalid(uint32_t base return rc; } -uint32_t tis_waitrespready(uint32_t baseaddr, uint32_t timeout) +static uint32_t tis_waitrespready(uint32_t baseaddr, uint32_t timeout) { uint32_t rc = 0; uint8_t *tis_addr = (uint8_t*)baseaddr; @@ -170,7 +170,7 @@ uint32_t tis_waitrespready(uint32_t base } /* if device is not there, return '0', '1' otherwise */ -uint32_t tis_probe(uint32_t baseaddr) +static uint32_t tis_probe(uint32_t baseaddr) { uint32_t rc = 0; uint8_t *tis_addr = (uint8_t*)baseaddr; diff -r eb0fc71cfc72 -r 400e5d4877ca tools/firmware/rombios/32bit/util.c --- a/tools/firmware/rombios/32bit/util.c Tue Jul 08 11:41:43 2008 +0900 +++ b/tools/firmware/rombios/32bit/util.c Fri Jul 18 12:12:41 2008 +0900 @@ -388,12 +388,6 @@ int printf(const char *fmt, ...) return 0; } -int vprintf(const char *fmt, va_list ap) -{ - _doprint(putchar, fmt, ap); - return 0; -} - void mssleep(uint32_t waittime) { uint32_t i; diff -r eb0fc71cfc72 -r 400e5d4877ca tools/firmware/rombios/rombios.c --- a/tools/firmware/rombios/rombios.c Tue Jul 08 11:41:43 2008 +0900 +++ b/tools/firmware/rombios/rombios.c Fri Jul 18 12:12:41 2008 +0900 @@ -26,6 +26,9 @@ // ROM BIOS for use with Bochs/Plex x86 emulation environment +#define uint8_t unsigned char +#define uint16_t unsigned short +#define uint32_t unsigned long #include "../hvmloader/config.h" #define HVMASSIST @@ -1459,6 +1462,23 @@ copy_e820_table() base_mem = read_dword(0x9000, 0x2d0 + 8); write_word(0x40, 0x13, base_mem >> 10); } + +void +disable_rom_write_access() +{ + Bit16u off = (Bit16u)&((struct bios_info *)0)->xen_pfiob; +ASM_START + mov si,.disable_rom_write_access.off[bp] + push ds + mov ax,#(ACPI_PHYSICAL_ADDRESS >> 4) + mov ds,ax + mov dx,[si] + pop ds + mov ax,#PFFLAG_ROM_LOCK + out dx,al +ASM_END +} + #endif /* HVMASSIST */ #if BX_DEBUG_SERIAL @@ -10154,6 +10174,10 @@ post_default_ints: #if BX_TCGBIOS call tcpa_post_part2 #endif + +#ifdef HVMASSIST + call _disable_rom_write_access +#endif ;; Start the boot sequence. See the comments in int19_relocated ;; for why we use INT 18h instead of INT 19h here. diff -r eb0fc71cfc72 -r 400e5d4877ca tools/firmware/vgabios/ChangeLog --- a/tools/firmware/vgabios/ChangeLog Tue Jul 08 11:41:43 2008 +0900 +++ b/tools/firmware/vgabios/ChangeLog Fri Jul 18 12:12:41 2008 +0900 @@ -1,3 +1,207 @@ 2005-05-24 16:50 vruppert +2008-05-11 08:40 vruppert + + * biossums.c (1.6): + + - fixed a warning + +2008-03-02 08:47 vruppert + + * vbe.c (1.60): + + - added debug message for unsupported VBE modes + +2008-02-24 09:18 vruppert + + * vbe.c (1.59): + + - in LFB modes the number of banks must be set to 1 + +2008-01-27 10:44 vruppert + + * Makefile (1.21), biossums.c (1.5), vgabios.c (1.67): + + - added PCI data structure for the Cirrus VGABIOS images + - added support for the PCI data structure in biossums + - updated year in copyright + +2008-01-26 11:46 vruppert + + * BUGS (1.4), Makefile (1.20), README (1.14), TODO (1.13), vbe_display_api.txt (1.14): + + - whitespace cleanup + +2006-11-26 10:43 vruppert + + * Makefile (1.19): + + - disable the generation of linemarkers by the preprocessor, since the latest + versions of bcc don't like them + +2006-09-02 13:15 vruppert + + * biossums.c (1.4): + + - the biossums utility no longer modifies VGABIOS images with proper checksum + and size + +2006-08-19 14:28 vruppert + + * Changelog (1.26), README (1.13), TODO (1.12): + + - updates for 0.6a release + +2006-08-19 09:39 vruppert + + * vbe.c (1.58): + + - improved VGA compatible setup for VBE modes (disable CGA and Hercules + compatible memory layout) + +2006-08-18 20:39 vruppert + + * vbe.c (1.57): + + - improved VGA compatible setup for >=8bpp VBE modes (CRTC doubleword mode and + GRDC shift register setting added) + - now using symbolic name for CRTC address register + +2006-08-15 20:42 vruppert + + * vbe.c (1.56), vbetables-gen.c (1.4): + + - init 4bpp VBE modes by a temporary switch to VGA mode 0x6A + - all 4bpp VBE modes now enabled + +2006-08-14 20:24 vruppert + + * vbe.c (1.55): + + - VGA compatible setup for VBE modes improved (Bochs hack can be removed now) + +2006-08-12 07:51 vruppert + + * .cvsignore (1.1): + + - .cvsignore added for auto-generated file + +2006-08-12 07:47 vruppert + + * vbe.c (1.54), vbe.h (1.27), vbe_display_api.txt (1.13), vbetables-gen.c (1.3): + + - cleaned up VBE memory size definitions (removed duplicate defines, main + definition now in vbetables-gen.c) + +2006-08-09 21:28 vruppert + + * vbetables.h (1.30): + + - removed auto-generated file + +2006-08-09 21:26 vruppert + + * vbe.c (1.53), vbe.h (1.26), vbe_display_api.txt (1.12), vbetables-gen.c (1.2), + vbetables.h (1.29): + + - VBE video memory increased to 8 MB + - VBE dispi ID changed to B0C4 + - documentation update + +2006-07-11 08:03 vruppert + + * Makefile (1.18), vbetables-gen.c (1.1), vbetables.h (1.28): + + - generate vbetables.h dynamicly + * initial patch from the qemu project by Fabrice Bellard + * only add modes that fit in video memory (still 4 MB) + * several other fixes (e.g. 4 bpp specific stuff, number of pages) + +2006-07-10 07:47 vruppert + + * vgabios.c (1.66): + + - biosfn_scroll(): check variable 'i' for underflowing when scrolling downwards + to avoid screen corruption + +2006-07-10 07:47 vruppert + + * vbe.c (1.52): + + - VBE set bank functions failure handling added + - VBE get/set logical scan line length fixes for the 4bpp mode + +2006-07-08 13:27 vruppert + + * vbe.c (1.51), vbetables.h (1.27): + + - added special case for the 4 bpp when setting VBE display start + - VBE mode table fixes + +2006-07-07 13:30 vruppert + + * clext.c (1.12): + + - bank pointer must be set to 0 after a mode set + +2006-06-21 16:58 vruppert + + * vbe.c (1.50), vbetables.h (1.26): + + - improved VBE display capabilities check (X resulution checked now) + - removed obsolete defines (LFB always available, always generate dynamic list) + - CR/LF to LF fixes + +2006-06-18 15:22 vruppert + + * clext.c (1.11), vbe.c (1.49), vbe.h (1.25), vbetables.h (1.25), vgabios.c + (1.65): + + - applied patch from the qemu project (Fabrice Bellard) + * Cirrus SVGA now supports the "no clear" bit when switching to Cirrus or + VESA mode + * Bochs VBE protected mode interface improved + * save/restore video state support for Bochs VBE and standard VGA added + * Bochs VBE prepared for more modi + +2006-03-25 10:19 vruppert + + * clext.c (1.10), vgabios.c (1.64), vgatables.h (1.10): + + - applied patch from Fabrice Bellard + * added minimal support for the video parameter table (VPT) + * added Cirrus SVGA mode 0x7b (1600x1200x8) + +2005-12-26 19:50 vruppert + + * vbe.c (1.48), vgabios.c (1.63): + + - Bochs VBE protected mode interface added (based on a patch by malc@xxxxxxxxxxxxx) + +2005-12-26 19:50 vruppert + + * biossums.c (1.3): + + - biossums utility now supports VGABIOS sizes up to 64 kBytes + +2005-09-21 18:45 vruppert + + * vgatables.h (1.9): + + - mode 0x11: all color planes must be enabled in this 2-color VGA mode + +2005-08-30 18:41 vruppert + + * biossums.c (1.2): + + - missing license text added in biossums.c + +2005-07-02 18:39 vruppert + + * vgabios.c (1.62): + + - BIOS configuration word usually reports initial mode 80x25 color text + - vgabios function 0x0e (write teletype): linefeed (0x0a) only increments the + cursor row value + 2005-05-24 16:50 vruppert * vbe.c (1.47), vgabios.c (1.61): diff -r eb0fc71cfc72 -r 400e5d4877ca tools/firmware/vgabios/Makefile --- a/tools/firmware/vgabios/Makefile Tue Jul 08 11:41:43 2008 +0900 +++ b/tools/firmware/vgabios/Makefile Fri Jul 18 12:12:41 2008 +0900 @@ -21,7 +21,7 @@ cirrus-bios: vgabios-cirrus.bin vgabios- .PHONY: clean clean: - rm -f biossums *.o *.s *.ld86 \ + rm -f biossums vbetables-gen vbetables.h *.o *.s *.ld86 \ temp.awk.* vgabios*.orig _vgabios_* _vgabios-debug_* core vgabios*.bin vgabios*.txt $(RELEASE).bin *.bak rm -f VGABIOS-lgpl-latest*.bin @@ -37,7 +37,7 @@ release: tar czvf ../$(RELEASE).tgz --exclude CVS -C .. $(RELEASE)/ vgabios.bin: biossums vgabios.c vgabios.h vgafonts.h vgatables.h vbe.h vbe.c vbetables.h - $(GCC) -E -P vgabios.c $(VGABIOS_VERS) $(VGABIOS_DATE) > _vgabios_.c + $(GCC) -E -P vgabios.c $(VGABIOS_VERS) -DVBE $(VGABIOS_DATE) > _vgabios_.c $(BCC) -o vgabios.s -C-c -D__i86__ -S -0 _vgabios_.c sed -e 's/^\.text//' -e 's/^\.data//' vgabios.s > _vgabios_.s $(AS86) _vgabios_.s -b vgabios.bin -u -w- -g -0 -j -O -l vgabios.txt @@ -47,7 +47,7 @@ vgabios.bin: biossums vgabios.c vgabios. ls -l VGABIOS-lgpl-latest.bin vgabios.debug.bin: biossums vgabios.c vgabios.h vgafonts.h vgatables.h vbe.h vbe.c vbetables.h - $(GCC) -E -P vgabios.c $(VGABIOS_VERS) -DDEBUG $(VGABIOS_DATE) > _vgabios-debug_.c + $(GCC) -E -P vgabios.c $(VGABIOS_VERS) -DVBE -DDEBUG $(VGABIOS_DATE) > _vgabios-debug_.c $(BCC) -o vgabios-debug.s -C-c -D__i86__ -S -0 _vgabios-debug_.c sed -e 's/^\.text//' -e 's/^\.data//' vgabios-debug.s > _vgabios-debug_.s $(AS86) _vgabios-debug_.s -b vgabios.debug.bin -u -w- -g -0 -j -O -l vgabios.debug.txt @@ -57,7 +57,7 @@ vgabios.debug.bin: biossums vgabios.c vg ls -l VGABIOS-lgpl-latest.debug.bin vgabios-cirrus.bin: biossums vgabios.c vgabios.h vgafonts.h vgatables.h clext.c - $(GCC) -E -P vgabios.c $(VGABIOS_VERS) -DCIRRUS $(VGABIOS_DATE) > _vgabios-cirrus_.c + $(GCC) -E -P vgabios.c $(VGABIOS_VERS) -DCIRRUS -DPCIBIOS $(VGABIOS_DATE) > _vgabios-cirrus_.c $(BCC) -o vgabios-cirrus.s -C-c -D__i86__ -S -0 _vgabios-cirrus_.c sed -e 's/^\.text//' -e 's/^\.data//' vgabios-cirrus.s > _vgabios-cirrus_.s $(AS86) _vgabios-cirrus_.s -b vgabios-cirrus.bin -u -w- -g -0 -j -O -l vgabios-cirrus.txt @@ -67,7 +67,7 @@ vgabios-cirrus.bin: biossums vgabios.c v ls -l VGABIOS-lgpl-latest.cirrus.bin vgabios-cirrus.debug.bin: biossums vgabios.c vgabios.h vgafonts.h vgatables.h clext.c - $(GCC) -E -P vgabios.c $(VGABIOS_VERS) -DCIRRUS -DCIRRUS_DEBUG $(VGABIOS_DATE) > _vgabios-cirrus-debug_.c + $(GCC) -E -P vgabios.c $(VGABIOS_VERS) -DCIRRUS -DCIRRUS_DEBUG -DPCIBIOS $(VGABIOS_DATE) > _vgabios-cirrus-debug_.c $(BCC) -o vgabios-cirrus-debug.s -C-c -D__i86__ -S -0 _vgabios-cirrus-debug_.c sed -e 's/^\.text//' -e 's/^\.data//' vgabios-cirrus-debug.s > _vgabios-cirrus-debug_.s $(AS86) _vgabios-cirrus-debug_.s -b vgabios-cirrus.debug.bin -u -w- -g -0 -j -O -l vgabios-cirrus.debug.txt @@ -78,3 +78,9 @@ vgabios-cirrus.debug.bin: biossums vgabi biossums: biossums.c $(CC) -o biossums biossums.c + +vbetables-gen: vbetables-gen.c + $(CC) -o vbetables-gen vbetables-gen.c + +vbetables.h: vbetables-gen + ./vbetables-gen > $@ diff -r eb0fc71cfc72 -r 400e5d4877ca tools/firmware/vgabios/README --- a/tools/firmware/vgabios/README Tue Jul 08 11:41:43 2008 +0900 +++ b/tools/firmware/vgabios/README Fri Jul 18 12:12:41 2008 +0900 @@ -90,6 +90,34 @@ For any information on qemu, visit the w History ------- +vgabios-0.6b : May 30 2008 + - Volker + . added PCI data structure for the Cirrus VGABIOS images + . minor bugfixes in biossums utility, VBE support and makefile + +vgabios-0.6a : Aug 19 2006 + - Volker + . added minimal support for the video parameter table (VPT) + . Cirrus SVGA now supports the "no clear" bit in Cirrus and VESA mode + . Bochs VBE protected mode interface improved + . save/restore video state support for Bochs VBE and standard VGA added + . generate vbetables.h dynamicly + . VBE video memory increased to 8 MB (VBE dispi ID changed to B0C4) + . lots of 4bpp VBE fixes (all 4bpp VBE modes now enabled) + . VGA compatible setup for VBE modes added + +vgabios-0.5d : Dec 29 2005 + - Volker + . Bochs VBE protected mode interface added (based on a patch by malc@xxxxxxxxxxxxx) + . biossums utility now supports VGABIOS sizes up to 64 kBytes + . VGA mode 0x11: all color planes must be enabled in this 2-color VGA mode + +vgabios-0.5c : Jul 07 2005 + - Volker + . BIOS configuration word usually reports initial mode 80x25 color text + . vgabios function 0x0e (write teletype): linefeed (0x0a) only increments the + cursor row value + vgabios-0.5b : May 24 2005 - Volker . fixed return value for the default case in the VBE section (non-debug mode) diff -r eb0fc71cfc72 -r 400e5d4877ca tools/firmware/vgabios/TODO --- a/tools/firmware/vgabios/TODO Tue Jul 08 11:41:43 2008 +0900 +++ b/tools/firmware/vgabios/TODO Fri Jul 18 12:12:41 2008 +0900 @@ -6,13 +6,11 @@ General - Add new functionalities and modify static functionality table - Performance : 16 bits IO -v0.6 - - Reimplement the tables so it is compatible with the video save pointer table +v0.7 - Implement the remaining functions (don't know if all are needed): - chargen ax=1120, ax=1121, ax=1122, ax=1123, ax=1124 - display switch interface ah=12 bl=35 - video refresh control ah=12 bl=36 - - save/restore state ah=1c - Graphic modes v1.0 diff -r eb0fc71cfc72 -r 400e5d4877ca tools/firmware/vgabios/biossums.c --- a/tools/firmware/vgabios/biossums.c Tue Jul 08 11:41:43 2008 +0900 +++ b/tools/firmware/vgabios/biossums.c Fri Jul 18 12:12:41 2008 +0900 @@ -1,25 +1,35 @@ /* biossums.c --- written by Eike W. for the Bochs BIOS */ /* adapted for the LGPL'd VGABIOS by vruppert */ +/* This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ #include <stdlib.h> #include <stdio.h> +#include <string.h> typedef unsigned char byte; void check( int value, char* message ); -#define LEN_BIOS_DATA 0x8000 -#define MAX_OFFSET (LEN_BIOS_DATA - 1) - - -#define BIOS_OFFSET 0x7FFF +#define MAX_BIOS_DATA 0x10000 long chksum_bios_get_offset( byte* data, long offset ); byte chksum_bios_calc_value( byte* data, long offset ); byte chksum_bios_get_value( byte* data, long offset ); void chksum_bios_set_value( byte* data, long offset, byte value ); - #define PMID_LEN 20 #define PMID_CHKSUM 19 @@ -28,33 +38,55 @@ byte chksum_pmid_get_value( byte* data, byte chksum_pmid_get_value( byte* data, long offset ); void chksum_pmid_set_value( byte* data, long offset, byte value ); - -byte bios_data[LEN_BIOS_DATA]; - - -int main( int argc, char* argv[] ) { - +#define PCIR_LEN 24 + +long chksum_pcir_get_offset( byte* data, long offset ); + + +byte bios_data[MAX_BIOS_DATA]; +long bios_len; + + +int main(int argc, char* argv[]) +{ FILE* stream; - long offset, tmp_offset; - byte cur_val = 0, new_val = 0; - int hits; - - - if( argc != 2 ) { + long offset, tmp_offset, pcir_offset; + byte bios_len_byte, cur_val = 0, new_val = 0; + int hits, modified; + + if (argc != 2) { printf( "Error. Need a file-name as an argument.\n" ); exit( EXIT_FAILURE ); } - if(( stream = fopen( argv[1], "rb" )) == NULL ) { - printf( "Error opening %s for reading.\n", argv[1] ); - exit( EXIT_FAILURE ); - } - if( fread( bios_data, 1, LEN_BIOS_DATA, stream ) >= LEN_BIOS_DATA ) { - printf( "Error reading max. 32767 Bytes from %s.\n", argv[1] ); - fclose( stream ); - exit( EXIT_FAILURE ); - } - fclose( stream ); + if ((stream = fopen(argv[1], "rb")) == NULL) { + printf("Error opening %s for reading.\n", argv[1]); + exit(EXIT_FAILURE); + } + memset(bios_data, 0, MAX_BIOS_DATA); + bios_len = fread(bios_data, 1, MAX_BIOS_DATA, stream); + if (bios_len > MAX_BIOS_DATA) { + printf("Error reading max. 65536 Bytes from %s.\n", argv[1]); + fclose(stream); + exit(EXIT_FAILURE); + } + fclose(stream); + modified = 0; + if (bios_len < 0x8000) { + bios_len = 0x8000; + modified = 1; + } else if ((bios_len & 0x1FF) != 0) { + bios_len = (bios_len + 0x200) & ~0x1FF; + modified = 1; + } + bios_len_byte = (byte)(bios_len / 512); + if (bios_len_byte != bios_data[2]) { + if (modified == 0) { + bios_len += 0x200; + } + bios_data[2] = (byte)(bios_len / 512); + modified = 1; + } hits = 0; offset = 0L; @@ -67,44 +99,76 @@ int main( int argc, char* argv[] ) { printf( "Calculated checksum: 0x%02X ", new_val ); hits++; } - if( hits == 1 && cur_val != new_val ) { - printf( "Setting checksum." ); + if ((hits == 1) && (cur_val != new_val)) { + printf("Setting checksum."); chksum_pmid_set_value( bios_data, offset, new_val ); - } - if( hits >= 2 ) { + if (modified == 0) { + bios_len += 0x200; + bios_data[2]++; + } + modified = 1; + } + if (hits >= 2) { printf( "Multiple PMID entries! No checksum set." ); } - if( hits ) { - printf( "\n" ); - } - + if (hits) { + printf("\n"); + } + + offset = 0L; + pcir_offset = chksum_pcir_get_offset( bios_data, offset ); + if (pcir_offset != -1L) { + if (bios_data[pcir_offset + 16] != bios_data[2]) { + bios_data[pcir_offset + 16] = bios_data[2]; + if (modified == 0) { + bios_len += 0x200; + bios_data[2]++; + bios_data[pcir_offset + 16]++; + } + modified = 1; + } + } offset = 0L; - offset = chksum_bios_get_offset( bios_data, offset ); - cur_val = chksum_bios_get_value( bios_data, offset ); - new_val = chksum_bios_calc_value( bios_data, offset ); - printf( "\nBios checksum at: 0x%4lX\n", offset ); - printf( "Current checksum: 0x%02X\n", cur_val ); - printf( "Calculated checksum: 0x%02X ", new_val ); - if( cur_val != new_val ) { - printf( "Setting checksum." ); - chksum_bios_set_value( bios_data, offset, new_val ); - } - printf( "\n" ); - - - if(( stream = fopen( argv[1], "wb" )) == NULL ) { - printf( "Error opening %s for writing.\n", argv[1] ); - exit( EXIT_FAILURE ); - } - if( fwrite( bios_data, 1, LEN_BIOS_DATA, stream ) < LEN_BIOS_DATA ) { - printf( "Error writing 32KBytes to %s.\n", argv[1] ); - fclose( stream ); - exit( EXIT_FAILURE ); - } - fclose( stream ); - - return( EXIT_SUCCESS ); + do { + offset = chksum_bios_get_offset(bios_data, offset); + cur_val = chksum_bios_get_value(bios_data, offset); + new_val = chksum_bios_calc_value(bios_data, offset); + if ((cur_val != new_val) && (modified == 0)) { + bios_len += 0x200; + bios_data[2]++; + if (pcir_offset != -1L) { + bios_data[pcir_offset + 16]++; + } + modified = 1; + } else { + printf("\nBios checksum at: 0x%4lX\n", offset); + printf("Current checksum: 0x%02X\n", cur_val); + printf("Calculated checksum: 0x%02X ", new_val); + if (cur_val != new_val) { + printf("Setting checksum."); + chksum_bios_set_value(bios_data, offset, new_val); + cur_val = new_val; + modified = 1; + } + printf( "\n" ); + } + } while (cur_val != new_val); + + if (modified == 1) { + if ((stream = fopen( argv[1], "wb")) == NULL) { + printf("Error opening %s for writing.\n", argv[1]); + exit(EXIT_FAILURE); + } + if (fwrite(bios_data, 1, bios_len, stream) < bios_len) { + printf("Error writing %d KBytes to %s.\n", bios_len / 1024, argv[1]); + fclose(stream); + exit(EXIT_FAILURE); + } + fclose(stream); + } + + return (EXIT_SUCCESS); } @@ -119,7 +183,7 @@ void check( int okay, char* message ) { long chksum_bios_get_offset( byte* data, long offset ) { - return( BIOS_OFFSET ); + return (bios_len - 1); } @@ -129,7 +193,7 @@ byte chksum_bios_calc_value( byte* data, byte sum; sum = 0; - for( i = 0; i < MAX_OFFSET; i++ ) { + for( i = 0; i < offset; i++ ) { sum = sum + *( data + i ); } sum = -sum; /* iso ensures -s + s == 0 on unsigned types */ @@ -139,13 +203,13 @@ byte chksum_bios_calc_value( byte* data, byte chksum_bios_get_value( byte* data, long offset ) { - return( *( data + BIOS_OFFSET ) ); + return( *( data + offset ) ); } void chksum_bios_set_value( byte* data, long offset, byte value ) { - *( data + BIOS_OFFSET ) = value; + *( data + offset ) = value; } @@ -156,7 +220,7 @@ byte chksum_pmid_calc_value( byte* data, byte sum; len = PMID_LEN; - check( offset + len <= MAX_OFFSET, "PMID entry length out of bounds" ); + check((offset + len) <= (bios_len - 1), "PMID entry length out of bounds" ); sum = 0; for( i = 0; i < len; i++ ) { if( i != PMID_CHKSUM ) { @@ -172,7 +236,7 @@ long chksum_pmid_get_offset( byte* data, long result = -1L; - while( offset + PMID_LEN < MAX_OFFSET ) { + while ((offset + PMID_LEN) < (bios_len - 1)) { offset = offset + 1; if( *( data + offset + 0 ) == 'P' && \ *( data + offset + 1 ) == 'M' && \ @@ -188,13 +252,31 @@ long chksum_pmid_get_offset( byte* data, byte chksum_pmid_get_value( byte* data, long offset ) { - check( offset + PMID_CHKSUM <= MAX_OFFSET, "PMID checksum out of bounds" ); + check((offset + PMID_CHKSUM) <= (bios_len - 1), "PMID checksum out of bounds" ); return( *( data + offset + PMID_CHKSUM ) ); } void chksum_pmid_set_value( byte* data, long offset, byte value ) { - check( offset + PMID_CHKSUM <= MAX_OFFSET, "PMID checksum out of bounds" ); + check((offset + PMID_CHKSUM) <= (bios_len - 1), "PMID checksum out of bounds" ); *( data + offset + PMID_CHKSUM ) = value; } + + +long chksum_pcir_get_offset( byte* data, long offset ) { + + long result = -1L; + + while ((offset + PCIR_LEN) < (bios_len - 1)) { + offset = offset + 1; + if( *( data + offset + 0 ) == 'P' && \ + *( data + offset + 1 ) == 'C' && \ + *( data + offset + 2 ) == 'I' && \ + *( data + offset + 3 ) == 'R' ) { + result = offset; + break; + } + } + return( result ); +} diff -r eb0fc71cfc72 -r 400e5d4877ca tools/firmware/vgabios/clext.c --- a/tools/firmware/vgabios/clext.c Tue Jul 08 11:41:43 2008 +0900 +++ b/tools/firmware/vgabios/clext.c Fri Jul 18 12:12:41 2008 +0900 @@ -239,6 +239,21 @@ 0xffff 0xffff }; +/* 1600x1200x8 */ +unsigned short cseq_1600x1200x8[] = { +0x0300,0x2101,0x0f02,0x0003,0x0e04,0x1107, +0x760b,0x760c,0x760d,0x760e, +0x0412,0x0013,0x2017, +0x341b,0x341c,0x341d,0x341e, +0xffff +}; +unsigned short ccrtc_1600x1200x8[] = { +0x2911,0xc300,0x9f01,0x9f02,0x8603,0x8304,0x9405,0x2406,0xf707, +0x6009,0x000c,0x000d, +0x0310,0xff12,0xa013,0x4014,0xff15,0x2416,0xc317,0xff18, +0x001a,0x221b,0x001d, +0xffff +}; cirrus_mode_t cirrus_modes[] = { @@ -291,6 +306,10 @@ cirrus_mode_t cirrus_modes[] = {0x75,1280,1024,16,0xe1, cseq_1280x1024x16,cgraph_svgacolor,ccrtc_1280x1024x16,16, 6,5,11,6,5,5,0,0,0}, + + {0x7b,1600,1200,8,0x00, + cseq_1600x1200x8,cgraph_svgacolor,ccrtc_1600x1200x8,8, + 4,0,0,0,0,0,0,0,0}, {0xfe,0,0,0,0,cseq_vga,cgraph_vga,ccrtc_vga,0, 0xff,0,0,0,0,0,0,0,0}, _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |